diff --git a/src/main/java/io/github/skippyall/minions/mixinhelper/ChunkTicketManager$DistanceFromNearestPlayerTrackerAccessor.java b/src/main/java/io/github/skippyall/minions/mixinhelper/ChunkTicketManager$DistanceFromNearestPlayerTrackerAccessor.java index 8ca9405..b4fbb8c 100644 --- a/src/main/java/io/github/skippyall/minions/mixinhelper/ChunkTicketManager$DistanceFromNearestPlayerTrackerAccessor.java +++ b/src/main/java/io/github/skippyall/minions/mixinhelper/ChunkTicketManager$DistanceFromNearestPlayerTrackerAccessor.java @@ -4,4 +4,6 @@ public interface ChunkTicketManager$DistanceFromNearestPlayerTrackerAccessor { void minions$markAsMinionless(); void minions$markAsTarget(); int minions$getTickedChunkCount(); + + boolean minions$isRealPlayerInChunk(long chunkPos); } diff --git a/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkTicketManager$DistanceFromNearestPlayerTrackerMixin.java b/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkTicketManager$DistanceFromNearestPlayerTrackerMixin.java index 184ab00..d540e27 100644 --- a/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkTicketManager$DistanceFromNearestPlayerTrackerMixin.java +++ b/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkTicketManager$DistanceFromNearestPlayerTrackerMixin.java @@ -30,17 +30,17 @@ public abstract class ChunkTicketManager$DistanceFromNearestPlayerTrackerMixin e @Shadow protected abstract boolean isPlayerInChunk(long chunkPos); @Unique - boolean minionless, target; + boolean minions$minionless, minions$target; @Inject(method = "isPlayerInChunk", at = @At("RETURN"), cancellable = true) - public void filterMinions(long chunkPos, CallbackInfoReturnable cir) { - if (minionless) { - cir.setReturnValue(isRealPlayerInChunk(chunkPos)); + public void minions$filterMinions(long chunkPos, CallbackInfoReturnable cir) { + if (minions$minionless) { + cir.setReturnValue(minions$isRealPlayerInChunk(chunkPos)); } } - @Unique - public boolean isRealPlayerInChunk(long chunkPos) { + @Override + public boolean minions$isRealPlayerInChunk(long chunkPos) { ObjectSet players = ((ChunkTicketManagerAccessor)field_17462).getPlayers(chunkPos); boolean contains = false; if(players != null) { @@ -55,27 +55,27 @@ public abstract class ChunkTicketManager$DistanceFromNearestPlayerTrackerMixin e } @Inject(method = "updateLevels", at = @At("HEAD")) - public void sync(CallbackInfo info) { - if (target) { + public void minions$sync(CallbackInfo info) { + if (minions$target) { ((ChunkTicketManagerAccessor)field_17462).getMinionless().updateLevels(); } } @Override public void minions$updateLevel(long chunkPos, int distance, boolean decrease, CallbackInfo info) { - if (target && (distance != 0 || isRealPlayerInChunk(chunkPos))) { + if (minions$target && (distance == Integer.MAX_VALUE || minions$isRealPlayerInChunk(chunkPos))) { ((ChunkTicketManagerAccessor)field_17462).getMinionless().updateLevel(chunkPos, distance, decrease); } } @Override public void minions$markAsMinionless() { - minionless = true; + minions$minionless = true; } @Override public void minions$markAsTarget() { - target = true; + minions$target = true; } @Override diff --git a/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkTicketManagerMixin.java b/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkTicketManagerMixin.java index 2512a22..6ca5362 100644 --- a/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkTicketManagerMixin.java +++ b/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkTicketManagerMixin.java @@ -1,11 +1,13 @@ package io.github.skippyall.minions.mixins.antimobcap; +import com.llamalad7.mixinextras.sugar.Local; import io.github.skippyall.minions.mixinhelper.ChunkTicketManager$DistanceFromNearestPlayerTrackerAccessor; import io.github.skippyall.minions.mixinhelper.ChunkTicketManagerAccessor; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.objects.ObjectSet; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ChunkTicketManager; +import net.minecraft.util.math.ChunkSectionPos; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -37,4 +39,11 @@ public class ChunkTicketManagerMixin implements ChunkTicketManagerAccessor { public ChunkTicketManager.DistanceFromNearestPlayerTracker getMinionless() { return minionless; } + + @Inject(method = "handleChunkLeave", at = @At(value = "INVOKE", target = "Lit/unimi/dsi/fastutil/objects/ObjectSet;remove(Ljava/lang/Object;)Z", shift = At.Shift.AFTER, remap = false)) + public void minion$updateMinionlessIfNoMinionInChunk(ChunkSectionPos pos, ServerPlayerEntity player, CallbackInfo ci, @Local long chunk) { + if (!((ChunkTicketManager$DistanceFromNearestPlayerTrackerAccessor)minionless).minions$isRealPlayerInChunk(chunk)) { + minionless.updateLevel(chunk, Integer.MAX_VALUE, false); + } + } }