diff --git a/src/main/java/net/Chipperfluff/chipi/ChipiMod.java b/src/main/java/net/Chipperfluff/chipi/ChipiMod.java index 5c2901d..c316572 100644 --- a/src/main/java/net/Chipperfluff/chipi/ChipiMod.java +++ b/src/main/java/net/Chipperfluff/chipi/ChipiMod.java @@ -32,6 +32,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.GameRules; import net.minecraft.world.World; import net.minecraft.world.gen.GenerationStep; +import net.Chipperfluff.chipi.command.CommandHandler; public class ChipiMod implements ModInitializer { @@ -54,6 +55,7 @@ public class ChipiMod implements ModInitializer { ModEffects.register(); ChipiBlessingEvents.register(); ChipiHungerHandler.register(); + CommandHandler.register(); FabricDefaultAttributeRegistry.register(ModEntities.MEP, MepEntity.createMepAttributes()); @@ -63,10 +65,6 @@ public class ChipiMod implements ModInitializer { RegistryKey.of(RegistryKeys.PLACED_FEATURE, new Identifier("chipi", "chipper_ore")) ); - CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { - ChpCommand.register(dispatcher); - }); - ServerLifecycleEvents.SERVER_STARTED.register(server -> { SERVER = server; }); diff --git a/src/main/java/net/Chipperfluff/chipi/command/CommandHandler.java b/src/main/java/net/Chipperfluff/chipi/command/CommandHandler.java new file mode 100644 index 0000000..a059710 --- /dev/null +++ b/src/main/java/net/Chipperfluff/chipi/command/CommandHandler.java @@ -0,0 +1,18 @@ +package net.Chipperfluff.chipi.command; + +import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; +import net.minecraft.server.command.ServerCommandSource; + +public final class CommandHandler { + + private CommandHandler() {} + + public static void register() { + CommandRegistrationCallback.EVENT.register( + (dispatcher, registryAccess, environment) -> { + ChpCommand.register(dispatcher); + CspCommand.register(dispatcher); + } + ); + } +} diff --git a/src/main/java/net/Chipperfluff/chipi/command/CspCommand.java b/src/main/java/net/Chipperfluff/chipi/command/CspCommand.java new file mode 100644 index 0000000..a88861f --- /dev/null +++ b/src/main/java/net/Chipperfluff/chipi/command/CspCommand.java @@ -0,0 +1,65 @@ +package net.Chipperfluff.chipi.command; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.context.CommandContext; + +import net.Chipperfluff.chipi.world.gen.struct.ChipiStructures; +import net.minecraft.command.CommandSource; +import net.minecraft.command.argument.BlockPosArgumentType; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.text.Text; +import net.minecraft.util.math.BlockPos; + +public class CspCommand { + + public static void register(CommandDispatcher dispatcher) { + dispatcher.register( + CommandManager.literal("csp") + .then( + CommandManager.argument("name", StringArgumentType.word()) + .suggests((ctx, builder) -> + CommandSource.suggestMatching(ChipiStructures.getNames(), builder)) + .then( + CommandManager.argument("center", BlockPosArgumentType.blockPos()) + .then( + CommandManager.argument("worldPos", BlockPosArgumentType.blockPos()) + .executes(ctx -> execute(ctx)) + ) + ) + ) + ); + } + + private static int execute(CommandContext ctx) { + ServerCommandSource source = ctx.getSource(); + ServerWorld world = source.getWorld(); + + String name = StringArgumentType.getString(ctx, "name"); + BlockPos center = BlockPosArgumentType.getBlockPos(ctx, "center"); + BlockPos worldPos = BlockPosArgumentType.getBlockPos(ctx, "worldPos"); + + var structure = ChipiStructures.get(name); + + if (structure == null) { + source.sendError(Text.literal("Unknown structure: " + name)); + return 0; + } + + BlockPos local = structure.worldToLocal(center, worldPos); + + source.sendFeedback( + () -> Text.literal( + "localPos = (" + + local.getX() + ", " + + local.getY() + ", " + + local.getZ() + ")" + ), + false + ); + + return 1; + } +} diff --git a/src/main/java/net/Chipperfluff/chipi/world/gen/ChipiStructure.java b/src/main/java/net/Chipperfluff/chipi/world/gen/ChipiStructure.java index 2600010..0d3a840 100644 --- a/src/main/java/net/Chipperfluff/chipi/world/gen/ChipiStructure.java +++ b/src/main/java/net/Chipperfluff/chipi/world/gen/ChipiStructure.java @@ -62,6 +62,18 @@ public abstract class ChipiStructure { } public BlockPos localToWorld(BlockPos structureOrigin, BlockPos localPos) { - return structureOrigin.add(deltaX + localPos.getX(), deltaY + localPos.getY(), deltaZ + localPos.getZ()); + return structureOrigin.add( + deltaX + localPos.getX(), + deltaY + localPos.getY(), + deltaZ + localPos.getZ() + ); + } + + public BlockPos worldToLocal(BlockPos structureOrigin, BlockPos worldPos) { + return new BlockPos( + worldPos.getX() - structureOrigin.getX() - deltaX, + worldPos.getY() - structureOrigin.getY() - deltaY, + worldPos.getZ() - structureOrigin.getZ() - deltaZ + ); } } diff --git a/src/main/java/net/Chipperfluff/chipi/world/gen/DungeonContext.java b/src/main/java/net/Chipperfluff/chipi/world/gen/DungeonContext.java index abf5bba..ce35219 100644 --- a/src/main/java/net/Chipperfluff/chipi/world/gen/DungeonContext.java +++ b/src/main/java/net/Chipperfluff/chipi/world/gen/DungeonContext.java @@ -10,7 +10,7 @@ public final class DungeonContext { private Integer grid_x; private Integer grid_y; - private BlockPos structure_origin; + private BlockPos structure_origin; // logical center private ChipiStructure structure; private ServerWorld world; @@ -44,6 +44,10 @@ public final class DungeonContext { return structure; } + public BlockPos getStructureOrigin() { + return structure_origin; + } + public void setBlock(BlockPos localPos, BlockState state) { BlockPos worldPos = structure.localToWorld(structure_origin, localPos); System.out.println("[CHIPI] setBlock grid=(" + grid_x + "," + grid_y + ") worldPos=" + worldPos); diff --git a/src/main/java/net/Chipperfluff/chipi/world/gen/WorldMaster.java b/src/main/java/net/Chipperfluff/chipi/world/gen/WorldMaster.java index a1e2d79..408de35 100644 --- a/src/main/java/net/Chipperfluff/chipi/world/gen/WorldMaster.java +++ b/src/main/java/net/Chipperfluff/chipi/world/gen/WorldMaster.java @@ -35,11 +35,9 @@ public final class WorldMaster { } public static RoomBaseStructure afterPlaceRoom(DungeonContext ctx) { - if (ctx.getGridX() == 1 && ctx.getGridY() == 1) { - ctx.setBlock(new BlockPos(0, 0, 0), Blocks.REDSTONE_BLOCK.getDefaultState()); + ctx.setBlock(new BlockPos(9, 1, 8), Blocks.REDSTONE_BLOCK.getDefaultState()); } - return getDefaultRoom(); }