Move to more effective inject point
This commit is contained in:
@@ -14,6 +14,41 @@
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
package net.gensokyoreimagined.nitori.access;
|
||||
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public interface IMixinChunkMapAccess {
|
||||
void gensouHacks$runOnTrackerMainThread(final Runnable runnable);
|
||||
|
||||
@Nullable
|
||||
Class<?> gensouHacks$citizensPluginTrackedEntityClass = initCitizensPluginTrackedEntityClass();
|
||||
@Nullable
|
||||
Class<?> gensouHacks$citizensPluginHumanNPCEntityClass = initCitizensPluginHumanNPCEntityClass();
|
||||
|
||||
@Nullable
|
||||
private static Class<?> initCitizensPluginTrackedEntityClass() {
|
||||
try {
|
||||
return Class.forName("net.citizensnpcs.nms.v1_20_R3.util.CitizensEntityTracker", false, ClassLoader.getSystemClassLoader());
|
||||
} catch (ClassNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@Nullable
|
||||
private static Class<?> initCitizensPluginHumanNPCEntityClass() {
|
||||
try {
|
||||
return Class.forName("net.citizensnpcs.nms.v1_20_R3.entity.EntityHumanNPC", false, ClassLoader.getSystemClassLoader());
|
||||
} catch (ClassNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
static Class<?> getGensouHacks$citizensPluginTrackedEntityClass() {
|
||||
return gensouHacks$citizensPluginTrackedEntityClass;
|
||||
}
|
||||
@Nullable
|
||||
static Class<?> getGensouHacks$citizensPluginHumanNPCEntityClass() {
|
||||
return gensouHacks$citizensPluginHumanNPCEntityClass;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,6 +116,8 @@ public class ChunkMapMixin implements IMixinChunkMapAccess {
|
||||
@Shadow
|
||||
public Set<ServerPlayerConnection> seenBy;
|
||||
|
||||
@Shadow public abstract void updatePlayer(ServerPlayer player);
|
||||
|
||||
@Inject(method = "<init>", at = @At("RETURN"))
|
||||
private void reassignSeenBy(CallbackInfo ci) {
|
||||
// Implementation of 0107-Multithreaded-Tracker.patch
|
||||
@@ -128,6 +130,18 @@ public class ChunkMapMixin implements IMixinChunkMapAccess {
|
||||
@Invoker
|
||||
public abstract void callUpdatePlayers(PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<ServerPlayer> newTrackerCandidates); // Mirai -> public
|
||||
|
||||
@Redirect(method = "updatePlayers(Lcom/destroystokyo/paper/util/misc/PooledLinkedHashSets$PooledObjectLinkedOpenHashSet;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ChunkMap$TrackedEntity;updatePlayer(Lnet/minecraft/server/level/ServerPlayer;)V"))
|
||||
private void handleCitizensPluginTracking(ChunkMap.TrackedEntity self, ServerPlayer serverPlayer) {
|
||||
// Nitori - Citizens tracker must run on the main thread to avoid cyclic wait
|
||||
if (IMixinChunkMapAccess.gensouHacks$citizensPluginTrackedEntityClass != null && IMixinChunkMapAccess.gensouHacks$citizensPluginHumanNPCEntityClass != null && ChunkMapMixin.gensouHacks$citizensPluginTrackedEntityClass.isInstance(this) && ChunkMapMixin.gensouHacks$citizensPluginHumanNPCEntityClass.isInstance(serverPlayer)) {
|
||||
((IMixinChunkMapAccess) (Object) ((ServerLevel) serverPlayer.level()).chunkSource.chunkMap).gensouHacks$runOnTrackerMainThread(() ->
|
||||
this.updatePlayer(serverPlayer)
|
||||
);
|
||||
} else {
|
||||
this.updatePlayer(serverPlayer);
|
||||
}
|
||||
}
|
||||
|
||||
// Implementation of 0107-Multithreaded-Tracker.patch
|
||||
@SuppressWarnings("EmptyMethod")
|
||||
@Redirect(method = "removePlayer", at = @At(value = "INVOKE", target = "Lorg/spigotmc/AsyncCatcher;catchOp(Ljava/lang/String;)V"))
|
||||
|
||||
@@ -53,9 +53,6 @@ public class MultithreadedTracker {
|
||||
private final ConcurrentLinkedQueue<Runnable> mainThreadTasks;
|
||||
private final AtomicInteger finishedTasks = new AtomicInteger();
|
||||
|
||||
private static boolean searchedForCitizensPlugin = false;
|
||||
private static Class<?> citizensTrackedEtntityClass;
|
||||
|
||||
public MultithreadedTracker(IteratorSafeOrderedReferenceSet<LevelChunk> entityTickingChunks, ConcurrentLinkedQueue<Runnable> mainThreadTasks) {
|
||||
this.entityTickingChunks = entityTickingChunks;
|
||||
this.mainThreadTasks = mainThreadTasks;
|
||||
@@ -168,28 +165,11 @@ public class MultithreadedTracker {
|
||||
if (trackerStage == TrackerStage.SEND_CHANGES) {
|
||||
entityTracker.serverEntity.sendChanges();
|
||||
} else if (trackerStage == TrackerStage.UPDATE_PLAYERS) {
|
||||
// Nitori - Citizens tracker must run on the main thread to avoid cyclic wait
|
||||
if (!searchedForCitizensPlugin) {
|
||||
try {
|
||||
citizensTrackedEtntityClass = Class.forName("net.citizensnpcs.nms.v1_20_R3.util.CitizensEntityTracker", false, ClassLoader.getSystemClassLoader());
|
||||
} catch (ClassNotFoundException ignored) {}
|
||||
searchedForCitizensPlugin = true;
|
||||
}
|
||||
if (citizensTrackedEtntityClass != null && citizensTrackedEtntityClass.isInstance(entityTracker)) {
|
||||
this.mainThreadTasks.add(() ->
|
||||
invokeUpdatePlayersForCitizensTracker(entityTracker)
|
||||
);
|
||||
} else {
|
||||
invokeUpdatePlayersForCitizensTracker(entityTracker);
|
||||
}
|
||||
((IMixinChunkMap_TrackedEntityAccess) (Object) entityTracker).callUpdatePlayers(((IMixinChunkMap_TrackedEntityAccess) (Object) entityTracker).getEntity().getPlayersInTrackRange());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void invokeUpdatePlayersForCitizensTracker(ChunkMap.TrackedEntity entityTracker) {
|
||||
((IMixinChunkMap_TrackedEntityAccess) (Object) entityTracker).callUpdatePlayers(((IMixinChunkMap_TrackedEntityAccess) (Object) entityTracker).getEntity().getPlayersInTrackRange());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user