diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts index 55e3702..7f6a8ee 100755 --- a/build-logic/build.gradle.kts +++ b/build-logic/build.gradle.kts @@ -13,7 +13,6 @@ dependencies { dependencies { compileOnly(files(libs.javaClass.superclass.protectionDomain.codeSource.location)) - compileOnly("Citizens2:Citizens:2.0.33:3367@jar") } java { diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts index 24c0ffd..db3dd3b 100755 --- a/build-logic/settings.gradle.kts +++ b/build-logic/settings.gradle.kts @@ -4,22 +4,6 @@ dependencyResolutionManagement { repositories { gradlePluginPortal() maven("https://repo.papermc.io/repository/maven-public/") - val citizensJenkins = ivy { - name = "citizensRepo" - url = uri("https://ci.citizensnpcs.co/job") - patternLayout { - artifact("/[organisation]/[classifier]/artifact/dist/target/[module]-[revision]-b[classifier].[ext]") - } - metadataSources { - artifact() - } - } - exclusiveContent { - forRepositories(citizensJenkins) - filter { - includeGroup("Citizens2") - } - } } versionCatalogs { diff --git a/settings.gradle.kts b/settings.gradle.kts index a2a7ceb..ee8fe86 100755 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,7 +2,6 @@ pluginManagement { includeBuild("build-logic") repositories { gradlePluginPortal() - maven("https://repo.papermc.io/repository/maven-public/") } } diff --git a/src/main/java/net/gensokyoreimagined/nitori/core/ChunkMapMixin.java b/src/main/java/net/gensokyoreimagined/nitori/core/ChunkMapMixin.java index df2f41f..fc0ecfc 100755 --- a/src/main/java/net/gensokyoreimagined/nitori/core/ChunkMapMixin.java +++ b/src/main/java/net/gensokyoreimagined/nitori/core/ChunkMapMixin.java @@ -19,8 +19,6 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; import it.unimi.dsi.fastutil.objects.ReferenceSets; -import net.citizensnpcs.nms.v1_20_R3.util.CitizensEntityTracker; -import net.citizensnpcs.nms.v1_20_R3.entity.EntityHumanNPC; //import net.gensokyoreimagined.nitori.plugins.NitoriConfig; import net.gensokyoreimagined.nitori.access.IMixinChunkMapAccess; import net.gensokyoreimagined.nitori.access.IMixinChunkMap_TrackedEntityAccess; @@ -118,7 +116,35 @@ public static abstract class TrackedEntity implements IMixinChunkMap_TrackedEnti @Shadow public Set seenBy; - @Shadow public abstract void updatePlayer(ServerPlayer player); + @Shadow + public abstract void updatePlayer(ServerPlayer player); + + @Nullable + @Unique + private static Class gensouHacks$citizensPluginCitizensEntityTrackerClass = null; + @Nullable + @Unique + private static Class gensouHacks$citizensPluginEntityHumanNPCClass = null; + @Unique + private static boolean gensouHacks$attemptedCitizenssearch = false; + + @Unique + private static void gensouHacks$findCitizensClassesIfNeeded() { + if (!gensouHacks$attemptedCitizenssearch) { + try { + var systemClassLoader = ClassLoader.getSystemClassLoader(); + gensouHacks$citizensPluginCitizensEntityTrackerClass = Class.forName("net.citizensnpcs.nms.v1_20_R3.util.CitizensEntityTracker", false, systemClassLoader); + gensouHacks$citizensPluginEntityHumanNPCClass = Class.forName("net.citizensnpcs.nms.v1_20_R3.entity.EntityHumanNPC", false, systemClassLoader); + } catch (ClassNotFoundException ignored) {} + gensouHacks$attemptedCitizenssearch = true; + } + } + + @Unique + private static boolean gensouHacks$areCitizensClassesPresent() { + gensouHacks$findCitizensClassesIfNeeded(); + return gensouHacks$citizensPluginCitizensEntityTrackerClass != null && gensouHacks$citizensPluginEntityHumanNPCClass != null; + } @Inject(method = "", at = @At("RETURN")) private void reassignSeenBy(CallbackInfo ci) { @@ -135,7 +161,7 @@ private void reassignSeenBy(CallbackInfo ci) { @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 (this instanceof CitizensEntityTracker && !(serverPlayer instanceof EntityHumanNPC)) { + if (gensouHacks$areCitizensClassesPresent() && gensouHacks$citizensPluginCitizensEntityTrackerClass.isInstance(this) && !gensouHacks$citizensPluginEntityHumanNPCClass.isInstance(serverPlayer)) { ((IMixinChunkMapAccess) (Object) ((ServerLevel) serverPlayer.level()).chunkSource.chunkMap).gensouHacks$runOnTrackerMainThread(() -> this.updatePlayer(serverPlayer) );