mirror of
https://code.chipmunk.land/ChomeNS/chipmunkmod.git
synced 2026-03-30 22:51:58 +00:00
feat: add core deletion
refactor: remove some duplications
This commit is contained in:
parent
490be4431c
commit
590b954c30
3 changed files with 60 additions and 77 deletions
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue