feat: add core deletion

refactor: remove some duplications
This commit is contained in:
Chayapak Supasakul 2026-01-07 19:02:29 +07:00
parent 490be4431c
commit 590b954c30
Signed by: ChomeNS
SSH key fingerprint: SHA256:0YoxhdyXsgbc0nfeB2N6FYE60mxMU7DS4uCUMaw2mvA
3 changed files with 60 additions and 77 deletions

View file

@ -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();

View file

@ -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());
}
}

View file

@ -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<BlockPos, String> pendingSetBlockCommands = Collections.synchronizedMap(new Object2ObjectArrayMap<>());
private final ObjectArrayList<String> 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<BlockPos, String> 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;