Bugfixes (Minion Mobcap)

This commit is contained in:
2025-04-16 15:29:16 +02:00
parent 08e7952e34
commit d2d96b3f67
3 changed files with 22 additions and 11 deletions
@@ -4,4 +4,6 @@ public interface ChunkTicketManager$DistanceFromNearestPlayerTrackerAccessor {
void minions$markAsMinionless(); void minions$markAsMinionless();
void minions$markAsTarget(); void minions$markAsTarget();
int minions$getTickedChunkCount(); int minions$getTickedChunkCount();
boolean minions$isRealPlayerInChunk(long chunkPos);
} }
@@ -30,17 +30,17 @@ public abstract class ChunkTicketManager$DistanceFromNearestPlayerTrackerMixin e
@Shadow protected abstract boolean isPlayerInChunk(long chunkPos); @Shadow protected abstract boolean isPlayerInChunk(long chunkPos);
@Unique @Unique
boolean minionless, target; boolean minions$minionless, minions$target;
@Inject(method = "isPlayerInChunk", at = @At("RETURN"), cancellable = true) @Inject(method = "isPlayerInChunk", at = @At("RETURN"), cancellable = true)
public void filterMinions(long chunkPos, CallbackInfoReturnable<Boolean> cir) { public void minions$filterMinions(long chunkPos, CallbackInfoReturnable<Boolean> cir) {
if (minionless) { if (minions$minionless) {
cir.setReturnValue(isRealPlayerInChunk(chunkPos)); cir.setReturnValue(minions$isRealPlayerInChunk(chunkPos));
} }
} }
@Unique @Override
public boolean isRealPlayerInChunk(long chunkPos) { public boolean minions$isRealPlayerInChunk(long chunkPos) {
ObjectSet<ServerPlayerEntity> players = ((ChunkTicketManagerAccessor)field_17462).getPlayers(chunkPos); ObjectSet<ServerPlayerEntity> players = ((ChunkTicketManagerAccessor)field_17462).getPlayers(chunkPos);
boolean contains = false; boolean contains = false;
if(players != null) { if(players != null) {
@@ -55,27 +55,27 @@ public abstract class ChunkTicketManager$DistanceFromNearestPlayerTrackerMixin e
} }
@Inject(method = "updateLevels", at = @At("HEAD")) @Inject(method = "updateLevels", at = @At("HEAD"))
public void sync(CallbackInfo info) { public void minions$sync(CallbackInfo info) {
if (target) { if (minions$target) {
((ChunkTicketManagerAccessor)field_17462).getMinionless().updateLevels(); ((ChunkTicketManagerAccessor)field_17462).getMinionless().updateLevels();
} }
} }
@Override @Override
public void minions$updateLevel(long chunkPos, int distance, boolean decrease, CallbackInfo info) { 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); ((ChunkTicketManagerAccessor)field_17462).getMinionless().updateLevel(chunkPos, distance, decrease);
} }
} }
@Override @Override
public void minions$markAsMinionless() { public void minions$markAsMinionless() {
minionless = true; minions$minionless = true;
} }
@Override @Override
public void minions$markAsTarget() { public void minions$markAsTarget() {
target = true; minions$target = true;
} }
@Override @Override
@@ -1,11 +1,13 @@
package io.github.skippyall.minions.mixins.antimobcap; 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.ChunkTicketManager$DistanceFromNearestPlayerTrackerAccessor;
import io.github.skippyall.minions.mixinhelper.ChunkTicketManagerAccessor; import io.github.skippyall.minions.mixinhelper.ChunkTicketManagerAccessor;
import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
import it.unimi.dsi.fastutil.objects.ObjectSet; import it.unimi.dsi.fastutil.objects.ObjectSet;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.ChunkTicketManager; import net.minecraft.server.world.ChunkTicketManager;
import net.minecraft.util.math.ChunkSectionPos;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
@@ -37,4 +39,11 @@ public class ChunkTicketManagerMixin implements ChunkTicketManagerAccessor {
public ChunkTicketManager.DistanceFromNearestPlayerTracker getMinionless() { public ChunkTicketManager.DistanceFromNearestPlayerTracker getMinionless() {
return minionless; 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);
}
}
} }