From 590b954c306283edaf2649f5a72eff4fea82c8bf Mon Sep 17 00:00:00 2001 From: ChomeNS <95471003+chomens@users.noreply.github.com> Date: Wed, 7 Jan 2026 19:02:29 +0700 Subject: [PATCH] feat: add core deletion refactor: remove some duplications --- .../mixin/ClientPacketListenerMixin.java | 30 ------- .../chipmunkmod/mixin/LocalPlayerMixin.java | 23 +---- .../chipmunkmod/modules/CommandCore.java | 84 +++++++++++++------ 3 files changed, 60 insertions(+), 77 deletions(-) diff --git a/src/main/java/land/chipmunk/chipmunkmod/mixin/ClientPacketListenerMixin.java b/src/main/java/land/chipmunk/chipmunkmod/mixin/ClientPacketListenerMixin.java index 5e0fed1..fef0319 100644 --- a/src/main/java/land/chipmunk/chipmunkmod/mixin/ClientPacketListenerMixin.java +++ b/src/main/java/land/chipmunk/chipmunkmod/mixin/ClientPacketListenerMixin.java @@ -9,27 +9,21 @@ import land.chipmunk.chipmunkmod.listeners.Listener; import land.chipmunk.chipmunkmod.listeners.ListenerManager; import land.chipmunk.chipmunkmod.modules.*; import land.chipmunk.chipmunkmod.modules.custom_chat.CustomChat; -import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.components.DebugScreenOverlay; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientPacketListener; -import net.minecraft.client.player.LocalPlayer; import net.minecraft.commands.CommandBuildContext; import net.minecraft.commands.SharedSuggestionProvider; -import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.contents.PlainTextContents; import net.minecraft.network.chat.contents.TranslatableContents; import net.minecraft.network.protocol.game.ClientboundCommandsPacket; import net.minecraft.network.protocol.game.ClientboundLoginPacket; -import net.minecraft.network.protocol.game.ClientboundPlayerPositionPacket; import net.minecraft.network.protocol.game.ClientboundSetTimePacket; import net.minecraft.network.protocol.game.ClientboundSystemChatPacket; import net.minecraft.world.flag.FeatureFlagSet; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -141,30 +135,6 @@ public abstract class ClientPacketListenerMixin { ci.cancel(); } - @Inject(method = "handleMovePlayer", at = @At("TAIL")) - private void handleMovePlayer (final ClientboundPlayerPositionPacket packet, final CallbackInfo ci) { - final Vec3 position = packet.change().position(); - - final BlockPos origin = CommandCore.INSTANCE.origin; - if (origin == null) { - CommandCore.INSTANCE.move(position); - return; - } - - final Minecraft client = Minecraft.getInstance(); - final LocalPlayer player = client.player; - - if (player == null) return; - - final int distanceSquared = player.chunkPosition().distanceSquared(new ChunkPos(origin)); - final int distance = (int) Math.sqrt(distanceSquared); - - if (distance > getLevel().getServerSimulationDistance()) { - CommandCore.INSTANCE.alreadyFilled = true; - CommandCore.INSTANCE.move(position); - } - } - @Inject(method = "handleSetTime", at = @At("TAIL")) private void handleSetTime (final ClientboundSetTimePacket packet, final CallbackInfo ci) { for (final Listener listener : ListenerManager.listeners) listener.timeUpdate(); diff --git a/src/main/java/land/chipmunk/chipmunkmod/mixin/LocalPlayerMixin.java b/src/main/java/land/chipmunk/chipmunkmod/mixin/LocalPlayerMixin.java index 826f72a..830c010 100644 --- a/src/main/java/land/chipmunk/chipmunkmod/mixin/LocalPlayerMixin.java +++ b/src/main/java/land/chipmunk/chipmunkmod/mixin/LocalPlayerMixin.java @@ -1,44 +1,23 @@ package land.chipmunk.chipmunkmod.mixin; import land.chipmunk.chipmunkmod.modules.CommandCore; -import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(LocalPlayer.class) public abstract class LocalPlayerMixin extends Entity { - @Shadow - @Final - public ClientPacketListener connection; - public LocalPlayerMixin (final EntityType type, final Level world) { super(type, world); } @Inject(at = @At("TAIL"), method = "move") public void move (final CallbackInfo ci) { - final BlockPos origin = CommandCore.INSTANCE.origin; - if (origin == null) { - CommandCore.INSTANCE.move(this.getEyePosition()); - return; - } - - final int distanceSquared = this.chunkPosition().distanceSquared(new ChunkPos(origin)); - final int distance = (int) Math.sqrt(distanceSquared); - - if (distance > connection.getLevel().getServerSimulationDistance()) { - CommandCore.INSTANCE.alreadyFilled = true; - CommandCore.INSTANCE.move(this.getEyePosition()); - } + CommandCore.INSTANCE.resetIfNeeded(this.position()); } } diff --git a/src/main/java/land/chipmunk/chipmunkmod/modules/CommandCore.java b/src/main/java/land/chipmunk/chipmunkmod/modules/CommandCore.java index 6fc012b..86ed3a7 100644 --- a/src/main/java/land/chipmunk/chipmunkmod/modules/CommandCore.java +++ b/src/main/java/land/chipmunk/chipmunkmod/modules/CommandCore.java @@ -1,11 +1,11 @@ package land.chipmunk.chipmunkmod.modules; -import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; import land.chipmunk.chipmunkmod.ChipmunkMod; import land.chipmunk.chipmunkmod.listeners.Listener; import land.chipmunk.chipmunkmod.listeners.ListenerManager; -import land.chipmunk.chipmunkmod.mixin.ClientLevelAccessor; import land.chipmunk.chipmunkmod.mixin.AbstractDebugChartAccessor; +import land.chipmunk.chipmunkmod.mixin.ClientLevelAccessor; import land.chipmunk.chipmunkmod.mixin.DebugScreenOverlayAccessor; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.debugchart.PingDebugChart; @@ -32,6 +32,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.component.CustomData; import net.minecraft.world.item.component.TypedEntityData; +import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.CommandBlock; @@ -48,8 +49,6 @@ import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; import java.io.IOException; -import java.util.Collections; -import java.util.Map; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.CompletableFuture; @@ -68,7 +67,7 @@ public class CommandCore implements Listener { public boolean isSingleBlock = false; public boolean alreadyFilled = false; - private final Map pendingSetBlockCommands = Collections.synchronizedMap(new Object2ObjectArrayMap<>()); + private final ObjectArrayList pendingCommands = new ObjectArrayList<>(); private Timer timer; private boolean shouldRefill = false; private int refillTriesUsingPlaceBlock = 0; @@ -125,25 +124,12 @@ public class CommandCore implements Listener { if (!shouldRefill) { refillTriesUsingPlaceBlock = 0; - synchronized (pendingSetBlockCommands) { - if (pendingSetBlockCommands.isEmpty()) return; - for (final Map.Entry entry : pendingSetBlockCommands.entrySet()) { - final BlockPos blockPos = entry.getKey(); - final String block = entry.getValue(); - - run( - String.format( - "setblock %d %d %d %s", - - blockPos.getX(), - blockPos.getY(), - blockPos.getZ(), - - block - ) - ); + synchronized (pendingCommands) { + if (pendingCommands.isEmpty()) return; + for (final String command : pendingCommands) { + run(command); } - pendingSetBlockCommands.clear(); + pendingCommands.clear(); } return; } @@ -194,6 +180,23 @@ public class CommandCore implements Listener { final ClientLevel world = client.level; if (world == null || noPos == null) return; + // also delete the old core + if (withPos != null) { + pendingCommands.add( + String.format( + "fill %d %d %d %d %d %d air", + + withPos.minX(), + withPos.minY(), + withPos.minZ(), + + withPos.maxX(), + withPos.maxY(), + withPos.maxZ() + ) + ); + } + final DimensionType dimension = world.dimensionType(); final int dimMinY = dimension.minY(); @@ -232,6 +235,27 @@ public class CommandCore implements Listener { timer.schedule(task, 75); } + public void resetIfNeeded (final Vec3 currentPosition) { + if (origin == null) { + move(currentPosition); + return; + } + + final LocalPlayer player = client.player; + final ClientPacketListener connection = client.getConnection(); + if (player == null || connection == null) return; + + final int distanceSquared = player.chunkPosition().distanceSquared(new ChunkPos(origin)); + final int distance = (int) Math.sqrt(distanceSquared); + + final int simulationDistance = connection.getLevel().getServerSimulationDistance(); + + if (distance >= simulationDistance) { + alreadyFilled = true; + move(currentPosition); + } + } + public void refill () { final ClientPacketListener networkHandler = client.getConnection(); final LocalPlayer player = client.player; @@ -247,7 +271,7 @@ public class CommandCore implements Listener { ) return; final String command = String.format( - "fill %s %s %s %s %s %s command_block", + "fill %d %d %d %d %d %d command_block", withPos.minX(), withPos.minY(), @@ -551,7 +575,17 @@ public class CommandCore implements Listener { oldBlockString.append(']'); } - pendingSetBlockCommands.put(position, oldBlockString.toString()); + pendingCommands.add( + String.format( + "setblock %d %d %d %s", + + position.getX(), + position.getY(), + position.getZ(), + + oldBlockString + ) + ); } return position;