Move to more effective inject point

This commit is contained in:
Altiami
2024-04-03 00:50:52 -07:00
parent e9e2aae388
commit 9a783e9d5d
3 changed files with 50 additions and 21 deletions

View File

@@ -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;
}
}

View File

@@ -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"))

View File

@@ -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());
}
}