Bugfixes (Minion Mobcap)
This commit is contained in:
+2
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-11
@@ -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
|
||||||
|
|||||||
+9
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user