mirror of
https://code.chipmunk.land/ChomeNS/chipmunkmod.git
synced 2026-03-31 01:02:03 +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.listeners.ListenerManager;
|
||||||
import land.chipmunk.chipmunkmod.modules.*;
|
import land.chipmunk.chipmunkmod.modules.*;
|
||||||
import land.chipmunk.chipmunkmod.modules.custom_chat.CustomChat;
|
import land.chipmunk.chipmunkmod.modules.custom_chat.CustomChat;
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
import net.minecraft.client.gui.Gui;
|
import net.minecraft.client.gui.Gui;
|
||||||
import net.minecraft.client.gui.components.DebugScreenOverlay;
|
import net.minecraft.client.gui.components.DebugScreenOverlay;
|
||||||
import net.minecraft.client.multiplayer.ClientLevel;
|
import net.minecraft.client.multiplayer.ClientLevel;
|
||||||
import net.minecraft.client.multiplayer.ClientPacketListener;
|
import net.minecraft.client.multiplayer.ClientPacketListener;
|
||||||
import net.minecraft.client.player.LocalPlayer;
|
|
||||||
import net.minecraft.commands.CommandBuildContext;
|
import net.minecraft.commands.CommandBuildContext;
|
||||||
import net.minecraft.commands.SharedSuggestionProvider;
|
import net.minecraft.commands.SharedSuggestionProvider;
|
||||||
import net.minecraft.core.BlockPos;
|
|
||||||
import net.minecraft.core.RegistryAccess;
|
import net.minecraft.core.RegistryAccess;
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.network.chat.contents.PlainTextContents;
|
import net.minecraft.network.chat.contents.PlainTextContents;
|
||||||
import net.minecraft.network.chat.contents.TranslatableContents;
|
import net.minecraft.network.chat.contents.TranslatableContents;
|
||||||
import net.minecraft.network.protocol.game.ClientboundCommandsPacket;
|
import net.minecraft.network.protocol.game.ClientboundCommandsPacket;
|
||||||
import net.minecraft.network.protocol.game.ClientboundLoginPacket;
|
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.ClientboundSetTimePacket;
|
||||||
import net.minecraft.network.protocol.game.ClientboundSystemChatPacket;
|
import net.minecraft.network.protocol.game.ClientboundSystemChatPacket;
|
||||||
import net.minecraft.world.flag.FeatureFlagSet;
|
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.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;
|
||||||
|
|
@ -141,30 +135,6 @@ public abstract class ClientPacketListenerMixin {
|
||||||
ci.cancel();
|
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"))
|
@Inject(method = "handleSetTime", at = @At("TAIL"))
|
||||||
private void handleSetTime (final ClientboundSetTimePacket packet, final CallbackInfo ci) {
|
private void handleSetTime (final ClientboundSetTimePacket packet, final CallbackInfo ci) {
|
||||||
for (final Listener listener : ListenerManager.listeners) listener.timeUpdate();
|
for (final Listener listener : ListenerManager.listeners) listener.timeUpdate();
|
||||||
|
|
|
||||||
|
|
@ -1,44 +1,23 @@
|
||||||
package land.chipmunk.chipmunkmod.mixin;
|
package land.chipmunk.chipmunkmod.mixin;
|
||||||
|
|
||||||
import land.chipmunk.chipmunkmod.modules.CommandCore;
|
import land.chipmunk.chipmunkmod.modules.CommandCore;
|
||||||
import net.minecraft.client.multiplayer.ClientPacketListener;
|
|
||||||
import net.minecraft.client.player.LocalPlayer;
|
import net.minecraft.client.player.LocalPlayer;
|
||||||
import net.minecraft.core.BlockPos;
|
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.world.entity.EntityType;
|
import net.minecraft.world.entity.EntityType;
|
||||||
import net.minecraft.world.level.ChunkPos;
|
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
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.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
@Mixin(LocalPlayer.class)
|
@Mixin(LocalPlayer.class)
|
||||||
public abstract class LocalPlayerMixin extends Entity {
|
public abstract class LocalPlayerMixin extends Entity {
|
||||||
@Shadow
|
|
||||||
@Final
|
|
||||||
public ClientPacketListener connection;
|
|
||||||
|
|
||||||
public LocalPlayerMixin (final EntityType<?> type, final Level world) {
|
public LocalPlayerMixin (final EntityType<?> type, final Level world) {
|
||||||
super(type, world);
|
super(type, world);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(at = @At("TAIL"), method = "move")
|
@Inject(at = @At("TAIL"), method = "move")
|
||||||
public void move (final CallbackInfo ci) {
|
public void move (final CallbackInfo ci) {
|
||||||
final BlockPos origin = CommandCore.INSTANCE.origin;
|
CommandCore.INSTANCE.resetIfNeeded(this.position());
|
||||||
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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
package land.chipmunk.chipmunkmod.modules;
|
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.ChipmunkMod;
|
||||||
import land.chipmunk.chipmunkmod.listeners.Listener;
|
import land.chipmunk.chipmunkmod.listeners.Listener;
|
||||||
import land.chipmunk.chipmunkmod.listeners.ListenerManager;
|
import land.chipmunk.chipmunkmod.listeners.ListenerManager;
|
||||||
import land.chipmunk.chipmunkmod.mixin.ClientLevelAccessor;
|
|
||||||
import land.chipmunk.chipmunkmod.mixin.AbstractDebugChartAccessor;
|
import land.chipmunk.chipmunkmod.mixin.AbstractDebugChartAccessor;
|
||||||
|
import land.chipmunk.chipmunkmod.mixin.ClientLevelAccessor;
|
||||||
import land.chipmunk.chipmunkmod.mixin.DebugScreenOverlayAccessor;
|
import land.chipmunk.chipmunkmod.mixin.DebugScreenOverlayAccessor;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.gui.components.debugchart.PingDebugChart;
|
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.Items;
|
||||||
import net.minecraft.world.item.component.CustomData;
|
import net.minecraft.world.item.component.CustomData;
|
||||||
import net.minecraft.world.item.component.TypedEntityData;
|
import net.minecraft.world.item.component.TypedEntityData;
|
||||||
|
import net.minecraft.world.level.ChunkPos;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.world.level.block.CommandBlock;
|
import net.minecraft.world.level.block.CommandBlock;
|
||||||
|
|
@ -48,8 +49,6 @@ import net.minecraft.world.phys.Vec3;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Timer;
|
import java.util.Timer;
|
||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
@ -68,7 +67,7 @@ public class CommandCore implements Listener {
|
||||||
public boolean isSingleBlock = false;
|
public boolean isSingleBlock = false;
|
||||||
public boolean alreadyFilled = 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 Timer timer;
|
||||||
private boolean shouldRefill = false;
|
private boolean shouldRefill = false;
|
||||||
private int refillTriesUsingPlaceBlock = 0;
|
private int refillTriesUsingPlaceBlock = 0;
|
||||||
|
|
@ -125,25 +124,12 @@ public class CommandCore implements Listener {
|
||||||
|
|
||||||
if (!shouldRefill) {
|
if (!shouldRefill) {
|
||||||
refillTriesUsingPlaceBlock = 0;
|
refillTriesUsingPlaceBlock = 0;
|
||||||
synchronized (pendingSetBlockCommands) {
|
synchronized (pendingCommands) {
|
||||||
if (pendingSetBlockCommands.isEmpty()) return;
|
if (pendingCommands.isEmpty()) return;
|
||||||
for (final Map.Entry<BlockPos, String> entry : pendingSetBlockCommands.entrySet()) {
|
for (final String command : pendingCommands) {
|
||||||
final BlockPos blockPos = entry.getKey();
|
run(command);
|
||||||
final String block = entry.getValue();
|
|
||||||
|
|
||||||
run(
|
|
||||||
String.format(
|
|
||||||
"setblock %d %d %d %s",
|
|
||||||
|
|
||||||
blockPos.getX(),
|
|
||||||
blockPos.getY(),
|
|
||||||
blockPos.getZ(),
|
|
||||||
|
|
||||||
block
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
pendingSetBlockCommands.clear();
|
pendingCommands.clear();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -194,6 +180,23 @@ public class CommandCore implements Listener {
|
||||||
final ClientLevel world = client.level;
|
final ClientLevel world = client.level;
|
||||||
if (world == null || noPos == null) return;
|
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 DimensionType dimension = world.dimensionType();
|
||||||
|
|
||||||
final int dimMinY = dimension.minY();
|
final int dimMinY = dimension.minY();
|
||||||
|
|
@ -232,6 +235,27 @@ public class CommandCore implements Listener {
|
||||||
timer.schedule(task, 75);
|
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 () {
|
public void refill () {
|
||||||
final ClientPacketListener networkHandler = client.getConnection();
|
final ClientPacketListener networkHandler = client.getConnection();
|
||||||
final LocalPlayer player = client.player;
|
final LocalPlayer player = client.player;
|
||||||
|
|
@ -247,7 +271,7 @@ public class CommandCore implements Listener {
|
||||||
) return;
|
) return;
|
||||||
|
|
||||||
final String command = String.format(
|
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.minX(),
|
||||||
withPos.minY(),
|
withPos.minY(),
|
||||||
|
|
@ -551,7 +575,17 @@ public class CommandCore implements Listener {
|
||||||
oldBlockString.append(']');
|
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;
|
return position;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue