From be0982431bd2b75799fe5faf7f0c9dc1508e2ede Mon Sep 17 00:00:00 2001 From: amyavi <144570677+amyavi@users.noreply.github.com> Date: Sat, 28 Dec 2024 13:24:11 -0300 Subject: [PATCH] refactor: use BlockBox for core --- .../chipmunk/chipmunkmod/ChipmunkMod.java | 3 + .../chipmunk/chipmunkmod/Configuration.java | 4 +- .../chipmunk/chipmunkmod/data/BlockArea.java | 14 ---- .../chipmunkmod/modules/CommandCore.java | 75 ++++++++----------- .../util/gson/BlockBoxTypeAdapter.java | 46 ++++++++++++ .../util/gson/BlockPosTypeAdapter.java | 11 +-- 6 files changed, 89 insertions(+), 64 deletions(-) delete mode 100644 src/main/java/land/chipmunk/chipmunkmod/data/BlockArea.java create mode 100644 src/main/java/land/chipmunk/chipmunkmod/util/gson/BlockBoxTypeAdapter.java diff --git a/src/main/java/land/chipmunk/chipmunkmod/ChipmunkMod.java b/src/main/java/land/chipmunk/chipmunkmod/ChipmunkMod.java index f62f0b2..8f5ed3b 100644 --- a/src/main/java/land/chipmunk/chipmunkmod/ChipmunkMod.java +++ b/src/main/java/land/chipmunk/chipmunkmod/ChipmunkMod.java @@ -3,6 +3,7 @@ package land.chipmunk.chipmunkmod; import com.google.gson.GsonBuilder; import land.chipmunk.chipmunkmod.modules.KaboomCheck; import land.chipmunk.chipmunkmod.modules.SelfCare; +import land.chipmunk.chipmunkmod.util.gson.BlockBoxTypeAdapter; import land.chipmunk.chipmunkmod.util.gson.BlockPosTypeAdapter; import net.fabricmc.api.ModInitializer; import java.io.InputStream; @@ -16,6 +17,7 @@ import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import net.minecraft.util.math.BlockBox; import net.minecraft.util.math.BlockPos; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,6 +57,7 @@ public class ChipmunkMod implements ModInitializer { final Gson gson = new GsonBuilder() .registerTypeAdapter(BlockPos.class, new BlockPosTypeAdapter()) + .registerTypeAdapter(BlockBox.class, new BlockBoxTypeAdapter()) .create(); final File file = CONFIG_FILE; diff --git a/src/main/java/land/chipmunk/chipmunkmod/Configuration.java b/src/main/java/land/chipmunk/chipmunkmod/Configuration.java index 8acf323..cfea049 100644 --- a/src/main/java/land/chipmunk/chipmunkmod/Configuration.java +++ b/src/main/java/land/chipmunk/chipmunkmod/Configuration.java @@ -1,7 +1,7 @@ package land.chipmunk.chipmunkmod; import com.google.gson.JsonObject; -import land.chipmunk.chipmunkmod.data.BlockArea; +import net.minecraft.util.math.BlockBox; import net.minecraft.util.math.BlockPos; @@ -18,7 +18,7 @@ public class Configuration { } public static class CommandCore { - public BlockArea relativeArea = new BlockArea(new BlockPos(0, 0, 0), new BlockPos(15, 0, 15)); + public BlockBox relativeArea = BlockBox.create(new BlockPos(0, 0, 0), new BlockPos(15, 0, 15)); } public static class Bots { diff --git a/src/main/java/land/chipmunk/chipmunkmod/data/BlockArea.java b/src/main/java/land/chipmunk/chipmunkmod/data/BlockArea.java deleted file mode 100644 index f671ac9..0000000 --- a/src/main/java/land/chipmunk/chipmunkmod/data/BlockArea.java +++ /dev/null @@ -1,14 +0,0 @@ -package land.chipmunk.chipmunkmod.data; - -import net.minecraft.util.math.BlockPos; - -// ? Am I reinventing the wheel here? -public class BlockArea { - public BlockPos start; - public BlockPos end; - - public BlockArea (BlockPos start, BlockPos end) { - this.start = start; - this.end = end; - } -} diff --git a/src/main/java/land/chipmunk/chipmunkmod/modules/CommandCore.java b/src/main/java/land/chipmunk/chipmunkmod/modules/CommandCore.java index c4caf2e..54d63a7 100644 --- a/src/main/java/land/chipmunk/chipmunkmod/modules/CommandCore.java +++ b/src/main/java/land/chipmunk/chipmunkmod/modules/CommandCore.java @@ -1,10 +1,8 @@ package land.chipmunk.chipmunkmod.modules; import land.chipmunk.chipmunkmod.ChipmunkMod; -import land.chipmunk.chipmunkmod.data.BlockArea; import land.chipmunk.chipmunkmod.listeners.Listener; import land.chipmunk.chipmunkmod.listeners.ListenerManager; -import land.chipmunk.chipmunkmod.util.MathUtilities; import net.minecraft.block.Block; import net.minecraft.block.CommandBlock; import net.minecraft.block.entity.CommandBlockBlockEntity; @@ -14,6 +12,7 @@ import net.minecraft.client.world.ClientWorld; import net.minecraft.nbt.NbtCompound; import net.minecraft.network.ClientConnection; import net.minecraft.network.packet.c2s.play.UpdateCommandBlockC2SPacket; +import net.minecraft.util.math.BlockBox; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.dimension.DimensionType; @@ -26,9 +25,9 @@ public class CommandCore { private final MinecraftClient client; public boolean ready = false; public BlockPos origin; - public BlockArea noPos; + public BlockBox noPos; public BlockPos block; - public BlockArea withPos; + public BlockBox withPos; private Timer timer; @@ -103,9 +102,9 @@ public class CommandCore { if (networkHandler == null || withPos == null || !ready) return; try { - for (int x = withPos.start.getX(); x <= withPos.end.getX(); x++) { - for (int y = withPos.start.getY(); y <= withPos.end.getY(); y++) { - for (int z = withPos.start.getZ(); z <= withPos.end.getZ(); z++) { + for (int x = withPos.getMinX(); x <= withPos.getMaxX(); x++) { + for (int y = withPos.getMinY(); y <= withPos.getMaxY(); y++) { + for (int z = withPos.getMaxZ(); z <= withPos.getMaxZ(); z++) { final BlockPos pos = new BlockPos(x, y, z); final ClientWorld world = client.world; @@ -129,31 +128,27 @@ public class CommandCore { public void move (Vec3d position) { final ClientWorld world = client.world; - if (world == null || noPos == null) return; final DimensionType dimension = world.getDimension(); + final int dimMinY = dimension.minY(); + final int dimMaxY = dimension.height() + dimMinY - 1; // -1 accounts for block at Y=0 + int yOffset = 0; + if (noPos.getMinY() < dimMinY) { + yOffset = dimMinY - noPos.getMinY(); + } else if (noPos.getMaxY() > dimMaxY) { + yOffset = dimMaxY - noPos.getMaxY(); + } + origin = new BlockPos( ((int) position.getX() / 16) * 16, - (int) MathUtilities.clamp(noPos.start.getY(), dimension.minY(), dimension.height()), + noPos.getMinY() + yOffset, ((int) position.getZ() / 16) * 16 ); - withPos = new BlockArea( - new BlockPos( - noPos.start.getX() + origin.getX(), - (int) MathUtilities.clamp(noPos.start.getY(), dimension.minY(), dimension.height()), - noPos.start.getZ() + origin.getZ() - ), - new BlockPos( - noPos.end.getX() + origin.getX(), - (int) MathUtilities.clamp(noPos.end.getY(), dimension.minY(), dimension.height()), - noPos.end.getZ() + origin.getZ() - ) - ); - - block = new BlockPos(withPos.start); + withPos = noPos.offset(origin.getX(), yOffset, origin.getZ()); + block = new BlockPos(withPos.getMinX(), withPos.getMinY(), withPos.getMinZ()); refill(); for (Listener listener : ListenerManager.listeners) listener.coreMoved(); @@ -171,13 +166,13 @@ public class CommandCore { KaboomCheck.INSTANCE.isKaboom ? "fill %s %s %s %s %s %s repeating_command_block replace" : "fill %s %s %s %s %s %s command_block", - withPos.start.getX(), - withPos.start.getY(), - withPos.start.getZ(), + withPos.getMinX(), + withPos.getMinY(), + withPos.getMinZ(), - withPos.end.getX(), - withPos.end.getY(), - withPos.end.getZ() + withPos.getMaxX(), + withPos.getMaxY(), + withPos.getMaxZ() ); client.getNetworkHandler().sendChatCommand(command); @@ -185,32 +180,26 @@ public class CommandCore { public void incrementCurrentBlock () { if (withPos == null) return; - - final BlockPos start = withPos.start; - final BlockPos end = withPos.end; - - if (start == null || end == null) return; - int x = block.getX(); int y = block.getY(); int z = block.getZ(); x++; - if (x > end.getX()) { - x = start.getX(); + if (x > withPos.getMaxX()) { + x = withPos.getMinX(); z++; } - if (z > end.getZ()) { - z = start.getZ(); + if (z > withPos.getMaxZ()) { + z = withPos.getMinZ(); y++; } - if (y > end.getY()) { - x = start.getX(); - y = start.getY(); - z = start.getZ(); + if (y > withPos.getMaxY()) { + x = withPos.getMinX(); + y = withPos.getMinY(); + z = withPos.getMinZ(); } block = new BlockPos(x, y, z); diff --git a/src/main/java/land/chipmunk/chipmunkmod/util/gson/BlockBoxTypeAdapter.java b/src/main/java/land/chipmunk/chipmunkmod/util/gson/BlockBoxTypeAdapter.java new file mode 100644 index 0000000..3f94f65 --- /dev/null +++ b/src/main/java/land/chipmunk/chipmunkmod/util/gson/BlockBoxTypeAdapter.java @@ -0,0 +1,46 @@ +package land.chipmunk.chipmunkmod.util.gson; + +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; +import com.google.gson.stream.JsonWriter; +import net.minecraft.util.math.BlockBox; +import net.minecraft.util.math.BlockPos; + +import java.io.IOException; + +public class BlockBoxTypeAdapter extends TypeAdapter { + private final BlockPosTypeAdapter blockPosAdapter = new BlockPosTypeAdapter(); + + @Override + public BlockBox read(JsonReader reader) throws IOException { + BlockPos start = null; + BlockPos end = null; + + reader.beginObject(); + + + while (!reader.peek().equals(JsonToken.END_OBJECT)) { + if (reader.peek().equals(JsonToken.NAME)) { + String name = reader.nextName(); + + switch (name) { + case "start" -> start = blockPosAdapter.read(reader); + case "end" -> end = blockPosAdapter.read(reader); + default -> reader.skipValue(); + } + } + } + + reader.endObject(); + + if (start == null || end == null) return null; + return BlockBox.create(start, end); + } + + @Override + public void write(JsonWriter writer, BlockBox box) { + // TODO + } + +} diff --git a/src/main/java/land/chipmunk/chipmunkmod/util/gson/BlockPosTypeAdapter.java b/src/main/java/land/chipmunk/chipmunkmod/util/gson/BlockPosTypeAdapter.java index b6dc460..461c6af 100644 --- a/src/main/java/land/chipmunk/chipmunkmod/util/gson/BlockPosTypeAdapter.java +++ b/src/main/java/land/chipmunk/chipmunkmod/util/gson/BlockPosTypeAdapter.java @@ -20,11 +20,12 @@ public class BlockPosTypeAdapter extends TypeAdapter { if (reader.peek().equals(JsonToken.NAME)) { String name = reader.nextName(); - // ? Is there a better way to do this? - if (name.equals("x")) x = reader.nextInt(); - else if (name.equals("y")) y = reader.nextInt(); - else if (name.equals("z")) z = reader.nextInt(); - else reader.skipValue(); + switch (name) { + case "x" -> x = reader.nextInt(); + case "y" -> y = reader.nextInt(); + case "z" -> z = reader.nextInt(); + default -> reader.skipValue(); + } } }