Bugfixes (Minion Mobcap)
This commit is contained in:
+2
@@ -4,4 +4,6 @@ public interface ChunkTicketManager$DistanceFromNearestPlayerTrackerAccessor {
|
||||
void minions$markAsMinionless();
|
||||
void minions$markAsTarget();
|
||||
int minions$getTickedChunkCount();
|
||||
|
||||
boolean minions$isRealPlayerInChunk(long chunkPos);
|
||||
}
|
||||
|
||||
+11
-11
@@ -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<Boolean> cir) {
|
||||
if (minionless) {
|
||||
cir.setReturnValue(isRealPlayerInChunk(chunkPos));
|
||||
public void minions$filterMinions(long chunkPos, CallbackInfoReturnable<Boolean> cir) {
|
||||
if (minions$minionless) {
|
||||
cir.setReturnValue(minions$isRealPlayerInChunk(chunkPos));
|
||||
}
|
||||
}
|
||||
|
||||
@Unique
|
||||
public boolean isRealPlayerInChunk(long chunkPos) {
|
||||
@Override
|
||||
public boolean minions$isRealPlayerInChunk(long chunkPos) {
|
||||
ObjectSet<ServerPlayerEntity> 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
|
||||
|
||||
+9
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user