From 3d1a9f58d19a768e58a370b42743e033b7ea3d29 Mon Sep 17 00:00:00 2001 From: viyrs <2991883280@qq.com> Date: Tue, 24 Feb 2026 14:58:14 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat(command):=20=E6=B7=BB=E5=8A=A0Y?= =?UTF-8?q?=E8=BD=B4=E5=81=8F=E7=A7=BB=E5=8F=82=E6=95=B0=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加IntegerArgumentType导入用于处理数值参数 修改box3import命令结构,新增offsetY参数支持: - /box3import 现在可以接受可选的参数 - 支持在原有基础上进行Y轴偏移放置 - 保留原有的ignoreBarrier和ignoreWater布尔参数 更新executeBox3Import方法签名,添加offsetY参数, 使用该参数计算放置位置偏移 删除不再使用的VoxelSpecFluid类文件 添加新的世界生成器语言本地化文本 --- Fabric-1.21.11/gradle.properties | 2 +- .../java/com/box3lab/command/ModCommands.java | 64 ++++++-- .../com/box3lab/fluid/VoxelSpecFluid.java | 137 ------------------ .../resources/assets/box3/lang/en_us.json | 3 +- .../resources/assets/box3/lang/zh_cn.json | 3 +- .../world_preset/box3_plains_world.json | 20 +++ .../tags/worldgen/world_preset/normal.json | 4 + 7 files changed, 80 insertions(+), 153 deletions(-) delete mode 100644 Fabric-1.21.11/src/main/java/com/box3lab/fluid/VoxelSpecFluid.java create mode 100644 Fabric-1.21.11/src/main/resources/data/box3/worldgen/world_preset/box3_plains_world.json create mode 100644 Fabric-1.21.11/src/main/resources/data/minecraft/tags/worldgen/world_preset/normal.json diff --git a/Fabric-1.21.11/gradle.properties b/Fabric-1.21.11/gradle.properties index ac8df9a..8b57103 100644 --- a/Fabric-1.21.11/gradle.properties +++ b/Fabric-1.21.11/gradle.properties @@ -12,7 +12,7 @@ loader_version=0.18.4 loom_version=1.15-SNAPSHOT # Mod Properties -mod_version=1.4.0-mc1.21.11 +mod_version=1.4.1-mc1.21.11 maven_group=com.box3lab archives_base_name=box3 diff --git a/Fabric-1.21.11/src/main/java/com/box3lab/command/ModCommands.java b/Fabric-1.21.11/src/main/java/com/box3lab/command/ModCommands.java index 2483f36..bb43fb7 100644 --- a/Fabric-1.21.11/src/main/java/com/box3lab/command/ModCommands.java +++ b/Fabric-1.21.11/src/main/java/com/box3lab/command/ModCommands.java @@ -8,6 +8,7 @@ import com.box3lab.util.Box3ImportFiles; import com.mojang.brigadier.arguments.BoolArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.suggestion.SuggestionProvider; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; @@ -46,37 +47,71 @@ public static void register() { .executes(context -> listBox3ImportFiles(context.getSource())) .then(argument("fileName", StringArgumentType.word()) .suggests(BOX3_FILE_SUGGESTIONS) + // /box3import .executes(context -> executeBox3Import( context.getSource(), StringArgumentType.getString( context, "fileName"), + 0, false, false)) - .then(argument("ignoreBarrier", - BoolArgumentType.bool()) + // /box3import + .then(argument("offsetY", + IntegerArgumentType.integer()) .executes(context -> executeBox3Import( context.getSource(), StringArgumentType - .getString(context, + .getString( + context, "fileName"), - BoolArgumentType.getBool( - context, - "ignoreBarrier"), + IntegerArgumentType + .getInteger( + context, + "offsetY"), + false, false)) - .then(argument("ignoreWater", + // /box3import + // + .then(argument("ignoreBarrier", BoolArgumentType.bool()) .executes(context -> executeBox3Import( context.getSource(), StringArgumentType - .getString(context, + .getString( + context, "fileName"), + IntegerArgumentType + .getInteger( + context, + "offsetY"), BoolArgumentType.getBool( context, "ignoreBarrier"), - BoolArgumentType.getBool( - context, - "ignoreWater"))))))); + false)) + // /box3import + // + // + // + // + .then(argument("ignoreWater", + BoolArgumentType.bool()) + .executes(context -> executeBox3Import( + context.getSource(), + StringArgumentType + .getString( + context, + "fileName"), + IntegerArgumentType + .getInteger( + context, + "offsetY"), + BoolArgumentType.getBool( + context, + "ignoreBarrier"), + BoolArgumentType.getBool( + context, + "ignoreWater")))))))); dispatcher.register( literal("box3barrier") @@ -134,13 +169,16 @@ private static String resolveMapName(String fileName) { } private static int executeBox3Import(CommandSourceStack source, String fileName, - boolean ignoreBarrier, boolean useVanillaWater) { + int offsetY, boolean ignoreBarrier, boolean useVanillaWater) { ServerLevel level = source.getServer().overworld(); try { ServerPlayer player = source.getPlayer(); String mapName = resolveMapName(fileName); + var basePos = player != null ? player.position() : new BlockPos(0, 0, 0).getCenter(); + var offsetPos = basePos.add(0, offsetY, 0); + VoxelImport.apply(null, level, mapName, - player != null ? player.position() : new BlockPos(0, 0, 0).getCenter(), + offsetPos, player, ignoreBarrier, useVanillaWater); diff --git a/Fabric-1.21.11/src/main/java/com/box3lab/fluid/VoxelSpecFluid.java b/Fabric-1.21.11/src/main/java/com/box3lab/fluid/VoxelSpecFluid.java deleted file mode 100644 index ab35188..0000000 --- a/Fabric-1.21.11/src/main/java/com/box3lab/fluid/VoxelSpecFluid.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.box3lab.fluid; - -import java.util.function.Supplier; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.material.FlowingFluid; -import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.level.material.FluidState; - -public abstract class VoxelSpecFluid extends FlowingFluid { - private final Supplier still; - private final Supplier flowing; - private final Supplier bucket; - private final Supplier block; - - protected VoxelSpecFluid(Supplier still, Supplier flowing, - Supplier bucket, Supplier block) { - this.still = still; - this.flowing = flowing; - this.bucket = bucket; - this.block = block; - } - - @Override - public Fluid getFlowing() { - return flowing.get(); - } - - @Override - public Fluid getSource() { - return still.get(); - } - - @Override - public Item getBucket() { - return bucket.get(); - } - - @Override - protected BlockState createLegacyBlock(FluidState state) { - return block.get().defaultBlockState().setValue(net.minecraft.world.level.block.LiquidBlock.LEVEL, - getLegacyLevel(state)); - } - - @Override - public boolean isSame(Fluid fluid) { - return fluid == still.get() || fluid == flowing.get(); - } - - @Override - public int getDropOff(LevelReader level) { - return 1; - } - - @Override - public int getSlopeFindDistance(LevelReader level) { - return 4; - } - - @Override - public int getTickDelay(LevelReader level) { - return 5; - } - - @Override - protected float getExplosionResistance() { - return 100.0F; - } - - @Override - public boolean canConvertToSource(ServerLevel level) { - return false; - } - - @Override - protected void beforeDestroyingBlock(LevelAccessor level, BlockPos pos, BlockState state) { - if (level instanceof Level l) { - Block.dropResources(state, l, pos); - } - } - - @Override - public boolean canBeReplacedWith(FluidState state, BlockGetter level, BlockPos pos, Fluid fluid, - Direction direction) { - return false; - } - - @Override - protected void createFluidStateDefinition(StateDefinition.Builder builder) { - super.createFluidStateDefinition(builder); - builder.add(LEVEL); - } - - public static final class Flowing extends VoxelSpecFluid { - public Flowing(Supplier still, Supplier flowing, - Supplier bucket, Supplier block) { - super(still, flowing, bucket, block); - } - - @Override - public boolean isSource(FluidState state) { - return false; - } - - @Override - public int getAmount(FluidState state) { - return state.getValue(LEVEL); - } - } - - public static final class Still extends VoxelSpecFluid { - public Still(Supplier still, Supplier flowing, - Supplier bucket, Supplier block) { - super(still, flowing, bucket, block); - } - - @Override - public boolean isSource(FluidState state) { - return true; - } - - @Override - public int getAmount(FluidState state) { - return 8; - } - } -} diff --git a/Fabric-1.21.11/src/main/resources/assets/box3/lang/en_us.json b/Fabric-1.21.11/src/main/resources/assets/box3/lang/en_us.json index 20cdb13..9f6f298 100644 --- a/Fabric-1.21.11/src/main/resources/assets/box3/lang/en_us.json +++ b/Fabric-1.21.11/src/main/resources/assets/box3/lang/en_us.json @@ -411,5 +411,6 @@ "command.box3.box3barrier.status": "Barrier visible: %s", "command.box3.box3barrier.set": "Barrier visibility set to: %s", "command.box3.box3barrier.toggled": "Barrier visibility toggled to: %s (re-enter the world to fully apply)", - "item.box3.model_destroyer": "Model destruction bucket" + "item.box3.model_destroyer": "Model destruction bucket", + "generator.box3.box3_plains_world": "Box3 Plains" } diff --git a/Fabric-1.21.11/src/main/resources/assets/box3/lang/zh_cn.json b/Fabric-1.21.11/src/main/resources/assets/box3/lang/zh_cn.json index 2bd3f32..7c96cde 100644 --- a/Fabric-1.21.11/src/main/resources/assets/box3/lang/zh_cn.json +++ b/Fabric-1.21.11/src/main/resources/assets/box3/lang/zh_cn.json @@ -399,5 +399,6 @@ "command.box3.box3barrier.status": "屏障可见状态:%s", "command.box3.box3barrier.set": "屏障可见状态已设置为:%s", "command.box3.box3barrier.toggled": "屏障可见状态已切换为:%s(重新进入世界以完全生效)", - "item.box3.model_destroyer": "模型销毁桶" + "item.box3.model_destroyer": "模型销毁桶", + "generator.box3.box3_plains_world": "神岛平原" } diff --git a/Fabric-1.21.11/src/main/resources/data/box3/worldgen/world_preset/box3_plains_world.json b/Fabric-1.21.11/src/main/resources/data/box3/worldgen/world_preset/box3_plains_world.json new file mode 100644 index 0000000..16dd79d --- /dev/null +++ b/Fabric-1.21.11/src/main/resources/data/box3/worldgen/world_preset/box3_plains_world.json @@ -0,0 +1,20 @@ +{ + "dimensions": { + "minecraft:overworld": { + "type": "minecraft:overworld", + "generator": { + "type": "minecraft:flat", + "settings": { + "biome": "minecraft:plains", + "lakes": false, + "features": false, + "layers": [ + { "block": "box3:stone", "height": 1 }, + { "block": "box3:dirt", "height": 6 }, + { "block": "box3:grass", "height": 1 } + ] + } + } + } + } +} diff --git a/Fabric-1.21.11/src/main/resources/data/minecraft/tags/worldgen/world_preset/normal.json b/Fabric-1.21.11/src/main/resources/data/minecraft/tags/worldgen/world_preset/normal.json new file mode 100644 index 0000000..3fa8ad8 --- /dev/null +++ b/Fabric-1.21.11/src/main/resources/data/minecraft/tags/worldgen/world_preset/normal.json @@ -0,0 +1,4 @@ +{ + "replace": false, + "values": ["box3:box3_plains_world"] +} From 04f0f2e4c5d3d76ce79cda1d61c865e28ff6932d Mon Sep 17 00:00:00 2001 From: viyrs <2991883280@qq.com> Date: Tue, 24 Feb 2026 15:41:31 +0800 Subject: [PATCH 2/4] =?UTF-8?q?feat(box3):=20=E6=9B=B4=E6=94=B9=E5=B9=B3?= =?UTF-8?q?=E4=B8=96=E7=95=8C=E9=A2=84=E8=AE=BE=E7=9A=84=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E9=94=AE=E5=90=8D=E5=B9=B6=E7=A7=BB=E9=99=A4=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将语言文件中的 "generator.box3.box3_plains_world" 键名更改为 "flat_world_preset.box3.box3_plains_world",同时删除了平世界预设的 JSON配置文件以及在正常世界预设标签中的引用 --- .../resources/assets/box3/lang/en_us.json | 2 +- .../resources/assets/box3/lang/zh_cn.json | 2 +- .../box3_plains_world.json | 13 ++++++++++++ .../world_preset/box3_plains_world.json | 20 ------------------- .../flat_level_generator_preset/visible.json | 6 ++++++ .../tags/worldgen/world_preset/normal.json | 4 ---- 6 files changed, 21 insertions(+), 26 deletions(-) create mode 100644 Fabric-1.21.11/src/main/resources/data/box3/worldgen/flat_level_generator_preset/box3_plains_world.json delete mode 100644 Fabric-1.21.11/src/main/resources/data/box3/worldgen/world_preset/box3_plains_world.json create mode 100644 Fabric-1.21.11/src/main/resources/data/minecraft/tags/worldgen/flat_level_generator_preset/visible.json delete mode 100644 Fabric-1.21.11/src/main/resources/data/minecraft/tags/worldgen/world_preset/normal.json diff --git a/Fabric-1.21.11/src/main/resources/assets/box3/lang/en_us.json b/Fabric-1.21.11/src/main/resources/assets/box3/lang/en_us.json index 9f6f298..9b34656 100644 --- a/Fabric-1.21.11/src/main/resources/assets/box3/lang/en_us.json +++ b/Fabric-1.21.11/src/main/resources/assets/box3/lang/en_us.json @@ -412,5 +412,5 @@ "command.box3.box3barrier.set": "Barrier visibility set to: %s", "command.box3.box3barrier.toggled": "Barrier visibility toggled to: %s (re-enter the world to fully apply)", "item.box3.model_destroyer": "Model destruction bucket", - "generator.box3.box3_plains_world": "Box3 Plains" + "flat_world_preset.box3.box3_plains_world": "Box3 Plains" } diff --git a/Fabric-1.21.11/src/main/resources/assets/box3/lang/zh_cn.json b/Fabric-1.21.11/src/main/resources/assets/box3/lang/zh_cn.json index 7c96cde..29bebcc 100644 --- a/Fabric-1.21.11/src/main/resources/assets/box3/lang/zh_cn.json +++ b/Fabric-1.21.11/src/main/resources/assets/box3/lang/zh_cn.json @@ -400,5 +400,5 @@ "command.box3.box3barrier.set": "屏障可见状态已设置为:%s", "command.box3.box3barrier.toggled": "屏障可见状态已切换为:%s(重新进入世界以完全生效)", "item.box3.model_destroyer": "模型销毁桶", - "generator.box3.box3_plains_world": "神岛平原" + "flat_world_preset.box3.box3_plains_world": "神岛平原" } diff --git a/Fabric-1.21.11/src/main/resources/data/box3/worldgen/flat_level_generator_preset/box3_plains_world.json b/Fabric-1.21.11/src/main/resources/data/box3/worldgen/flat_level_generator_preset/box3_plains_world.json new file mode 100644 index 0000000..f0a387b --- /dev/null +++ b/Fabric-1.21.11/src/main/resources/data/box3/worldgen/flat_level_generator_preset/box3_plains_world.json @@ -0,0 +1,13 @@ +{ + "display": "box3:grass", + "settings": { + "biome": "minecraft:plains", + "lakes": false, + "features": false, + "layers": [ + { "block": "box3:stone", "height": 1 }, + { "block": "box3:dirt", "height": 6 }, + { "block": "box3:grass", "height": 1 } + ] + } +} diff --git a/Fabric-1.21.11/src/main/resources/data/box3/worldgen/world_preset/box3_plains_world.json b/Fabric-1.21.11/src/main/resources/data/box3/worldgen/world_preset/box3_plains_world.json deleted file mode 100644 index 16dd79d..0000000 --- a/Fabric-1.21.11/src/main/resources/data/box3/worldgen/world_preset/box3_plains_world.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "dimensions": { - "minecraft:overworld": { - "type": "minecraft:overworld", - "generator": { - "type": "minecraft:flat", - "settings": { - "biome": "minecraft:plains", - "lakes": false, - "features": false, - "layers": [ - { "block": "box3:stone", "height": 1 }, - { "block": "box3:dirt", "height": 6 }, - { "block": "box3:grass", "height": 1 } - ] - } - } - } - } -} diff --git a/Fabric-1.21.11/src/main/resources/data/minecraft/tags/worldgen/flat_level_generator_preset/visible.json b/Fabric-1.21.11/src/main/resources/data/minecraft/tags/worldgen/flat_level_generator_preset/visible.json new file mode 100644 index 0000000..5fcd620 --- /dev/null +++ b/Fabric-1.21.11/src/main/resources/data/minecraft/tags/worldgen/flat_level_generator_preset/visible.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "box3:box3_plains_world" + ] +} diff --git a/Fabric-1.21.11/src/main/resources/data/minecraft/tags/worldgen/world_preset/normal.json b/Fabric-1.21.11/src/main/resources/data/minecraft/tags/worldgen/world_preset/normal.json deleted file mode 100644 index 3fa8ad8..0000000 --- a/Fabric-1.21.11/src/main/resources/data/minecraft/tags/worldgen/world_preset/normal.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "replace": false, - "values": ["box3:box3_plains_world"] -} From 48af07ee5b81d9ffc6cd54f4661c806995944378 Mon Sep 17 00:00:00 2001 From: viyrs <2991883280@qq.com> Date: Tue, 24 Feb 2026 17:16:45 +0800 Subject: [PATCH 3/4] =?UTF-8?q?feat(command):=20=E6=B7=BB=E5=8A=A0Y?= =?UTF-8?q?=E8=BD=B4=E5=81=8F=E7=A7=BB=E9=87=8F=E5=8F=82=E6=95=B0=E5=88=B0?= =?UTF-8?q?box3import=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加了offsetY参数,允许用户在导入box3文件时指定Y轴偏移量, 使建筑可以精确放置在所需高度。 fix(lang): 添加新的世界预设语言翻译 添加了"Box3 Plains"世界预设的中英文翻译。 chore(release): 更新版本号至1.4.1 更新Fabric 1.20.1和1.21.1分支的mod版本号从1.4.0升级到1.4.1。 --- Fabric-1.20.1/gradle.properties | 2 +- .../java/com/box3lab/command/ModCommands.java | 64 +++++++++++++++---- .../resources/assets/box3/lang/en_us.json | 3 +- .../resources/assets/box3/lang/zh_cn.json | 3 +- .../box3_plains_world.json | 13 ++++ .../flat_level_generator_preset/visible.json | 4 ++ Fabric-1.21.1/gradle.properties | 2 +- .../java/com/box3lab/command/ModCommands.java | 64 +++++++++++++++---- .../resources/assets/box3/lang/en_us.json | 3 +- .../resources/assets/box3/lang/zh_cn.json | 3 +- .../box3_plains_world.json | 13 ++++ .../flat_level_generator_preset/visible.json | 6 ++ 12 files changed, 148 insertions(+), 32 deletions(-) create mode 100644 Fabric-1.20.1/src/main/resources/data/box3/worldgen/flat_level_generator_preset/box3_plains_world.json create mode 100644 Fabric-1.20.1/src/main/resources/data/minecraft/tags/worldgen/flat_level_generator_preset/visible.json create mode 100644 Fabric-1.21.1/src/main/resources/data/box3/worldgen/flat_level_generator_preset/box3_plains_world.json create mode 100644 Fabric-1.21.1/src/main/resources/data/minecraft/tags/worldgen/flat_level_generator_preset/visible.json diff --git a/Fabric-1.20.1/gradle.properties b/Fabric-1.20.1/gradle.properties index 57c3a31..4411101 100644 --- a/Fabric-1.20.1/gradle.properties +++ b/Fabric-1.20.1/gradle.properties @@ -12,7 +12,7 @@ loader_version=0.18.4 loom_version=1.15-SNAPSHOT # Mod Properties -mod_version=1.4.0-mc1.20.1 +mod_version=1.4.1-mc1.20.1 maven_group=com.box3lab archives_base_name=box3 diff --git a/Fabric-1.20.1/src/main/java/com/box3lab/command/ModCommands.java b/Fabric-1.20.1/src/main/java/com/box3lab/command/ModCommands.java index 2483f36..bb43fb7 100644 --- a/Fabric-1.20.1/src/main/java/com/box3lab/command/ModCommands.java +++ b/Fabric-1.20.1/src/main/java/com/box3lab/command/ModCommands.java @@ -8,6 +8,7 @@ import com.box3lab.util.Box3ImportFiles; import com.mojang.brigadier.arguments.BoolArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.suggestion.SuggestionProvider; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; @@ -46,37 +47,71 @@ public static void register() { .executes(context -> listBox3ImportFiles(context.getSource())) .then(argument("fileName", StringArgumentType.word()) .suggests(BOX3_FILE_SUGGESTIONS) + // /box3import .executes(context -> executeBox3Import( context.getSource(), StringArgumentType.getString( context, "fileName"), + 0, false, false)) - .then(argument("ignoreBarrier", - BoolArgumentType.bool()) + // /box3import + .then(argument("offsetY", + IntegerArgumentType.integer()) .executes(context -> executeBox3Import( context.getSource(), StringArgumentType - .getString(context, + .getString( + context, "fileName"), - BoolArgumentType.getBool( - context, - "ignoreBarrier"), + IntegerArgumentType + .getInteger( + context, + "offsetY"), + false, false)) - .then(argument("ignoreWater", + // /box3import + // + .then(argument("ignoreBarrier", BoolArgumentType.bool()) .executes(context -> executeBox3Import( context.getSource(), StringArgumentType - .getString(context, + .getString( + context, "fileName"), + IntegerArgumentType + .getInteger( + context, + "offsetY"), BoolArgumentType.getBool( context, "ignoreBarrier"), - BoolArgumentType.getBool( - context, - "ignoreWater"))))))); + false)) + // /box3import + // + // + // + // + .then(argument("ignoreWater", + BoolArgumentType.bool()) + .executes(context -> executeBox3Import( + context.getSource(), + StringArgumentType + .getString( + context, + "fileName"), + IntegerArgumentType + .getInteger( + context, + "offsetY"), + BoolArgumentType.getBool( + context, + "ignoreBarrier"), + BoolArgumentType.getBool( + context, + "ignoreWater")))))))); dispatcher.register( literal("box3barrier") @@ -134,13 +169,16 @@ private static String resolveMapName(String fileName) { } private static int executeBox3Import(CommandSourceStack source, String fileName, - boolean ignoreBarrier, boolean useVanillaWater) { + int offsetY, boolean ignoreBarrier, boolean useVanillaWater) { ServerLevel level = source.getServer().overworld(); try { ServerPlayer player = source.getPlayer(); String mapName = resolveMapName(fileName); + var basePos = player != null ? player.position() : new BlockPos(0, 0, 0).getCenter(); + var offsetPos = basePos.add(0, offsetY, 0); + VoxelImport.apply(null, level, mapName, - player != null ? player.position() : new BlockPos(0, 0, 0).getCenter(), + offsetPos, player, ignoreBarrier, useVanillaWater); diff --git a/Fabric-1.20.1/src/main/resources/assets/box3/lang/en_us.json b/Fabric-1.20.1/src/main/resources/assets/box3/lang/en_us.json index 20cdb13..9b34656 100644 --- a/Fabric-1.20.1/src/main/resources/assets/box3/lang/en_us.json +++ b/Fabric-1.20.1/src/main/resources/assets/box3/lang/en_us.json @@ -411,5 +411,6 @@ "command.box3.box3barrier.status": "Barrier visible: %s", "command.box3.box3barrier.set": "Barrier visibility set to: %s", "command.box3.box3barrier.toggled": "Barrier visibility toggled to: %s (re-enter the world to fully apply)", - "item.box3.model_destroyer": "Model destruction bucket" + "item.box3.model_destroyer": "Model destruction bucket", + "flat_world_preset.box3.box3_plains_world": "Box3 Plains" } diff --git a/Fabric-1.20.1/src/main/resources/assets/box3/lang/zh_cn.json b/Fabric-1.20.1/src/main/resources/assets/box3/lang/zh_cn.json index 2bd3f32..29bebcc 100644 --- a/Fabric-1.20.1/src/main/resources/assets/box3/lang/zh_cn.json +++ b/Fabric-1.20.1/src/main/resources/assets/box3/lang/zh_cn.json @@ -399,5 +399,6 @@ "command.box3.box3barrier.status": "屏障可见状态:%s", "command.box3.box3barrier.set": "屏障可见状态已设置为:%s", "command.box3.box3barrier.toggled": "屏障可见状态已切换为:%s(重新进入世界以完全生效)", - "item.box3.model_destroyer": "模型销毁桶" + "item.box3.model_destroyer": "模型销毁桶", + "flat_world_preset.box3.box3_plains_world": "神岛平原" } diff --git a/Fabric-1.20.1/src/main/resources/data/box3/worldgen/flat_level_generator_preset/box3_plains_world.json b/Fabric-1.20.1/src/main/resources/data/box3/worldgen/flat_level_generator_preset/box3_plains_world.json new file mode 100644 index 0000000..f0a387b --- /dev/null +++ b/Fabric-1.20.1/src/main/resources/data/box3/worldgen/flat_level_generator_preset/box3_plains_world.json @@ -0,0 +1,13 @@ +{ + "display": "box3:grass", + "settings": { + "biome": "minecraft:plains", + "lakes": false, + "features": false, + "layers": [ + { "block": "box3:stone", "height": 1 }, + { "block": "box3:dirt", "height": 6 }, + { "block": "box3:grass", "height": 1 } + ] + } +} diff --git a/Fabric-1.20.1/src/main/resources/data/minecraft/tags/worldgen/flat_level_generator_preset/visible.json b/Fabric-1.20.1/src/main/resources/data/minecraft/tags/worldgen/flat_level_generator_preset/visible.json new file mode 100644 index 0000000..7809017 --- /dev/null +++ b/Fabric-1.20.1/src/main/resources/data/minecraft/tags/worldgen/flat_level_generator_preset/visible.json @@ -0,0 +1,4 @@ +{ + "replace": false, + "values": ["box3:box3_plains_world", "box3:box3_custom_noise"] +} diff --git a/Fabric-1.21.1/gradle.properties b/Fabric-1.21.1/gradle.properties index 6a6e012..4d1d24b 100644 --- a/Fabric-1.21.1/gradle.properties +++ b/Fabric-1.21.1/gradle.properties @@ -12,7 +12,7 @@ loader_version=0.18.4 loom_version=1.15-SNAPSHOT # Mod Properties -mod_version=1.4.0-mc1.21.1 +mod_version=1.4.1-mc1.21.1 maven_group=com.box3lab archives_base_name=box3 diff --git a/Fabric-1.21.1/src/main/java/com/box3lab/command/ModCommands.java b/Fabric-1.21.1/src/main/java/com/box3lab/command/ModCommands.java index 2483f36..bb43fb7 100644 --- a/Fabric-1.21.1/src/main/java/com/box3lab/command/ModCommands.java +++ b/Fabric-1.21.1/src/main/java/com/box3lab/command/ModCommands.java @@ -8,6 +8,7 @@ import com.box3lab.util.Box3ImportFiles; import com.mojang.brigadier.arguments.BoolArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.suggestion.SuggestionProvider; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; @@ -46,37 +47,71 @@ public static void register() { .executes(context -> listBox3ImportFiles(context.getSource())) .then(argument("fileName", StringArgumentType.word()) .suggests(BOX3_FILE_SUGGESTIONS) + // /box3import .executes(context -> executeBox3Import( context.getSource(), StringArgumentType.getString( context, "fileName"), + 0, false, false)) - .then(argument("ignoreBarrier", - BoolArgumentType.bool()) + // /box3import + .then(argument("offsetY", + IntegerArgumentType.integer()) .executes(context -> executeBox3Import( context.getSource(), StringArgumentType - .getString(context, + .getString( + context, "fileName"), - BoolArgumentType.getBool( - context, - "ignoreBarrier"), + IntegerArgumentType + .getInteger( + context, + "offsetY"), + false, false)) - .then(argument("ignoreWater", + // /box3import + // + .then(argument("ignoreBarrier", BoolArgumentType.bool()) .executes(context -> executeBox3Import( context.getSource(), StringArgumentType - .getString(context, + .getString( + context, "fileName"), + IntegerArgumentType + .getInteger( + context, + "offsetY"), BoolArgumentType.getBool( context, "ignoreBarrier"), - BoolArgumentType.getBool( - context, - "ignoreWater"))))))); + false)) + // /box3import + // + // + // + // + .then(argument("ignoreWater", + BoolArgumentType.bool()) + .executes(context -> executeBox3Import( + context.getSource(), + StringArgumentType + .getString( + context, + "fileName"), + IntegerArgumentType + .getInteger( + context, + "offsetY"), + BoolArgumentType.getBool( + context, + "ignoreBarrier"), + BoolArgumentType.getBool( + context, + "ignoreWater")))))))); dispatcher.register( literal("box3barrier") @@ -134,13 +169,16 @@ private static String resolveMapName(String fileName) { } private static int executeBox3Import(CommandSourceStack source, String fileName, - boolean ignoreBarrier, boolean useVanillaWater) { + int offsetY, boolean ignoreBarrier, boolean useVanillaWater) { ServerLevel level = source.getServer().overworld(); try { ServerPlayer player = source.getPlayer(); String mapName = resolveMapName(fileName); + var basePos = player != null ? player.position() : new BlockPos(0, 0, 0).getCenter(); + var offsetPos = basePos.add(0, offsetY, 0); + VoxelImport.apply(null, level, mapName, - player != null ? player.position() : new BlockPos(0, 0, 0).getCenter(), + offsetPos, player, ignoreBarrier, useVanillaWater); diff --git a/Fabric-1.21.1/src/main/resources/assets/box3/lang/en_us.json b/Fabric-1.21.1/src/main/resources/assets/box3/lang/en_us.json index 20cdb13..9b34656 100644 --- a/Fabric-1.21.1/src/main/resources/assets/box3/lang/en_us.json +++ b/Fabric-1.21.1/src/main/resources/assets/box3/lang/en_us.json @@ -411,5 +411,6 @@ "command.box3.box3barrier.status": "Barrier visible: %s", "command.box3.box3barrier.set": "Barrier visibility set to: %s", "command.box3.box3barrier.toggled": "Barrier visibility toggled to: %s (re-enter the world to fully apply)", - "item.box3.model_destroyer": "Model destruction bucket" + "item.box3.model_destroyer": "Model destruction bucket", + "flat_world_preset.box3.box3_plains_world": "Box3 Plains" } diff --git a/Fabric-1.21.1/src/main/resources/assets/box3/lang/zh_cn.json b/Fabric-1.21.1/src/main/resources/assets/box3/lang/zh_cn.json index 2bd3f32..29bebcc 100644 --- a/Fabric-1.21.1/src/main/resources/assets/box3/lang/zh_cn.json +++ b/Fabric-1.21.1/src/main/resources/assets/box3/lang/zh_cn.json @@ -399,5 +399,6 @@ "command.box3.box3barrier.status": "屏障可见状态:%s", "command.box3.box3barrier.set": "屏障可见状态已设置为:%s", "command.box3.box3barrier.toggled": "屏障可见状态已切换为:%s(重新进入世界以完全生效)", - "item.box3.model_destroyer": "模型销毁桶" + "item.box3.model_destroyer": "模型销毁桶", + "flat_world_preset.box3.box3_plains_world": "神岛平原" } diff --git a/Fabric-1.21.1/src/main/resources/data/box3/worldgen/flat_level_generator_preset/box3_plains_world.json b/Fabric-1.21.1/src/main/resources/data/box3/worldgen/flat_level_generator_preset/box3_plains_world.json new file mode 100644 index 0000000..f0a387b --- /dev/null +++ b/Fabric-1.21.1/src/main/resources/data/box3/worldgen/flat_level_generator_preset/box3_plains_world.json @@ -0,0 +1,13 @@ +{ + "display": "box3:grass", + "settings": { + "biome": "minecraft:plains", + "lakes": false, + "features": false, + "layers": [ + { "block": "box3:stone", "height": 1 }, + { "block": "box3:dirt", "height": 6 }, + { "block": "box3:grass", "height": 1 } + ] + } +} diff --git a/Fabric-1.21.1/src/main/resources/data/minecraft/tags/worldgen/flat_level_generator_preset/visible.json b/Fabric-1.21.1/src/main/resources/data/minecraft/tags/worldgen/flat_level_generator_preset/visible.json new file mode 100644 index 0000000..5fcd620 --- /dev/null +++ b/Fabric-1.21.1/src/main/resources/data/minecraft/tags/worldgen/flat_level_generator_preset/visible.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "box3:box3_plains_world" + ] +} From b3c5db0a31b5e7cab9b43e0b2235acf387257ab8 Mon Sep 17 00:00:00 2001 From: viyrs <2991883280@qq.com> Date: Tue, 24 Feb 2026 17:40:15 +0800 Subject: [PATCH 4/4] =?UTF-8?q?feat(block):=20=E6=B7=BB=E5=8A=A0BouncePadB?= =?UTF-8?q?lock=E7=9A=84fallOn=E6=96=B9=E6=B3=95=E9=87=8D=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为BouncePadBlock添加fallOn方法的重写实现,处理实体掉落时的反弹逻辑。 当实体抑制反弹时调用父类方法,否则重置掉落距离以防止伤害计算。 --- .../main/java/com/box3lab/block/BouncePadBlock.java | 10 ++++++++++ .../main/java/com/box3lab/block/BouncePadBlock.java | 10 ++++++++++ .../main/java/com/box3lab/block/BouncePadBlock.java | 10 ++++++++++ 3 files changed, 30 insertions(+) diff --git a/Fabric-1.20.1/src/main/java/com/box3lab/block/BouncePadBlock.java b/Fabric-1.20.1/src/main/java/com/box3lab/block/BouncePadBlock.java index 40ab246..4017ecb 100644 --- a/Fabric-1.20.1/src/main/java/com/box3lab/block/BouncePadBlock.java +++ b/Fabric-1.20.1/src/main/java/com/box3lab/block/BouncePadBlock.java @@ -31,4 +31,14 @@ public void stepOn(Level level, BlockPos pos, BlockState state, Entity entity) { entity.setDeltaMovement(vel); } + + @Override + public void fallOn(Level level, BlockState state, BlockPos pos, Entity entity, float fallDistance) { + + if (entity.isSuppressingBounce()) { + super.fallOn(level, state, pos, entity, fallDistance); + } else { + entity.resetFallDistance(); + } + } } diff --git a/Fabric-1.21.1/src/main/java/com/box3lab/block/BouncePadBlock.java b/Fabric-1.21.1/src/main/java/com/box3lab/block/BouncePadBlock.java index 40ab246..4017ecb 100644 --- a/Fabric-1.21.1/src/main/java/com/box3lab/block/BouncePadBlock.java +++ b/Fabric-1.21.1/src/main/java/com/box3lab/block/BouncePadBlock.java @@ -31,4 +31,14 @@ public void stepOn(Level level, BlockPos pos, BlockState state, Entity entity) { entity.setDeltaMovement(vel); } + + @Override + public void fallOn(Level level, BlockState state, BlockPos pos, Entity entity, float fallDistance) { + + if (entity.isSuppressingBounce()) { + super.fallOn(level, state, pos, entity, fallDistance); + } else { + entity.resetFallDistance(); + } + } } diff --git a/Fabric-1.21.11/src/main/java/com/box3lab/block/BouncePadBlock.java b/Fabric-1.21.11/src/main/java/com/box3lab/block/BouncePadBlock.java index 40ab246..49ceabe 100644 --- a/Fabric-1.21.11/src/main/java/com/box3lab/block/BouncePadBlock.java +++ b/Fabric-1.21.11/src/main/java/com/box3lab/block/BouncePadBlock.java @@ -31,4 +31,14 @@ public void stepOn(Level level, BlockPos pos, BlockState state, Entity entity) { entity.setDeltaMovement(vel); } + + @Override + public void fallOn(Level level, BlockState state, BlockPos pos, Entity entity, double fallDistance) { + + if (entity.isSuppressingBounce()) { + super.fallOn(level, state, pos, entity, fallDistance); + } else { + entity.resetFallDistance(); + } + } }