From 3c5aa186dc7d1652bfb40207031b27f93b264700 Mon Sep 17 00:00:00 2001 From: jhqwqmc Date: Mon, 17 Nov 2025 20:43:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/behavior/BukkitItemBehaviors.java | 2 + .../behavior/CeilingBlockItemBehavior.java | 8 ++- .../behavior/GroundBlockItemBehavior.java | 51 +++++++++++++++++++ .../item/behavior/WallBlockItemBehavior.java | 27 ++++++++-- .../src/main/resources/translations/en.yml | 1 + .../src/main/resources/translations/zh_cn.yml | 1 + 6 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/GroundBlockItemBehavior.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BukkitItemBehaviors.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BukkitItemBehaviors.java index a8b326de9..23fde9447 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BukkitItemBehaviors.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BukkitItemBehaviors.java @@ -14,6 +14,7 @@ public class BukkitItemBehaviors extends ItemBehaviors { public static final Key DOUBLE_HIGH_BLOCK_ITEM = Key.from("craftengine:double_high_block_item"); public static final Key WALL_BLOCK_ITEM = Key.from("craftengine:wall_block_item"); public static final Key CEILING_BLOCK_ITEM = Key.from("craftengine:ceiling_block_item"); + public static final Key GROUND_BLOCK_ITEM = Key.from("craftengine:ground_block_item"); public static void init() { register(EMPTY, EmptyItemBehavior.FACTORY); @@ -26,5 +27,6 @@ public class BukkitItemBehaviors extends ItemBehaviors { register(DOUBLE_HIGH_BLOCK_ITEM, DoubleHighBlockItemBehavior.FACTORY); register(WALL_BLOCK_ITEM, WallBlockItemBehavior.FACTORY); register(CEILING_BLOCK_ITEM, CeilingBlockItemBehavior.FACTORY); + register(GROUND_BLOCK_ITEM, GroundBlockItemBehavior.FACTORY); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/CeilingBlockItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/CeilingBlockItemBehavior.java index 49b0db4c4..2a38e53a6 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/CeilingBlockItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/CeilingBlockItemBehavior.java @@ -27,12 +27,10 @@ public class CeilingBlockItemBehavior extends BlockItemBehavior { @Override public InteractionResult place(BlockPlaceContext context) { - for (Direction direction : context.getNearestLookingDirections()) { - if (direction.axis() != Direction.Axis.Y) continue; - if (direction == Direction.DOWN) break; // 如果最后只能放到地面就直接不放置 - super.place(context); + if (context.getClickedFace() != Direction.DOWN) { + return InteractionResult.PASS; } - return InteractionResult.PASS; + return super.place(context); } public static class Factory implements ItemBehaviorFactory { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/GroundBlockItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/GroundBlockItemBehavior.java new file mode 100644 index 000000000..05956b049 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/GroundBlockItemBehavior.java @@ -0,0 +1,51 @@ +package net.momirealms.craftengine.bukkit.item.behavior; + +import net.momirealms.craftengine.core.entity.player.InteractionResult; +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; +import net.momirealms.craftengine.core.item.context.BlockPlaceContext; +import net.momirealms.craftengine.core.item.context.UseOnContext; +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.Key; + +import java.nio.file.Path; +import java.util.Map; + +public class GroundBlockItemBehavior extends BlockItemBehavior { + public static final Factory FACTORY = new Factory(); + + public GroundBlockItemBehavior(Key ceilingBlockId) { + super(ceilingBlockId); + } + + @Override + public InteractionResult useOnBlock(UseOnContext context) { + return this.place(new BlockPlaceContext(context)); + } + + @Override + public InteractionResult place(BlockPlaceContext context) { + if (context.getClickedFace() != Direction.UP) { + return InteractionResult.PASS; + } + return super.place(context); + } + + public static class Factory implements ItemBehaviorFactory { + @Override + public ItemBehavior create(Pack pack, Path path, String node, Key key, Map arguments) { + Object id = arguments.get("block"); + if (id == null) { + throw new LocalizedResourceConfigException("warning.config.item.behavior.ground_block.missing_block", new IllegalArgumentException("Missing required parameter 'block' for ground_block_item behavior")); + } + if (id instanceof Map map) { + addPendingSection(pack, path, node, key, map); + return new GroundBlockItemBehavior(key); + } else { + return new GroundBlockItemBehavior(Key.of(id.toString())); + } + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/WallBlockItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/WallBlockItemBehavior.java index 58d597fa8..56613e46b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/WallBlockItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/WallBlockItemBehavior.java @@ -7,16 +7,21 @@ import net.momirealms.craftengine.core.item.context.BlockPlaceContext; import net.momirealms.craftengine.core.item.context.UseOnContext; import net.momirealms.craftengine.core.pack.Pack; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.util.Direction; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import net.momirealms.craftengine.core.util.Tristate; import java.nio.file.Path; import java.util.Map; public class WallBlockItemBehavior extends BlockItemBehavior { public static final Factory FACTORY = new Factory(); + private final Tristate hanging; - public WallBlockItemBehavior(Key wallBlockId) { + public WallBlockItemBehavior(Key wallBlockId, Tristate hanging) { super(wallBlockId); + this.hanging = hanging; } @Override @@ -29,7 +34,20 @@ public class WallBlockItemBehavior extends BlockItemBehavior { if (context.getClickedFace().stepY() != 0) { return InteractionResult.PASS; } - return super.place(context); + if (this.hanging == Tristate.UNDEFINED) { + return super.place(context); + } + for (Direction direction : context.getNearestLookingDirections()) { + if (direction.axis() != Direction.Axis.Y) continue; + if (this.hanging == Tristate.FALSE) { + if (direction == Direction.DOWN) return super.place(context); + if (direction == Direction.UP) break; + } else if (this.hanging == Tristate.TRUE) { + if (direction == Direction.UP) return super.place(context); + if (direction == Direction.DOWN) break; + } + } + return InteractionResult.PASS; } public static class Factory implements ItemBehaviorFactory { @@ -39,11 +57,12 @@ public class WallBlockItemBehavior extends BlockItemBehavior { if (id == null) { throw new LocalizedResourceConfigException("warning.config.item.behavior.wall_block.missing_block", new IllegalArgumentException("Missing required parameter 'block' for wall_block_item behavior")); } + Tristate hanging = arguments.containsKey("hanging") ? Tristate.of(ResourceConfigUtils.getAsBoolean(arguments.get("hanging"), "hanging")) : Tristate.UNDEFINED; if (id instanceof Map map) { addPendingSection(pack, path, node, key, map); - return new WallBlockItemBehavior(key); + return new WallBlockItemBehavior(key, hanging); } else { - return new WallBlockItemBehavior(Key.of(id.toString())); + return new WallBlockItemBehavior(Key.of(id.toString()), hanging); } } } diff --git a/common-files/src/main/resources/translations/en.yml b/common-files/src/main/resources/translations/en.yml index 47bcaea32..0594bda79 100644 --- a/common-files/src/main/resources/translations/en.yml +++ b/common-files/src/main/resources/translations/en.yml @@ -214,6 +214,7 @@ warning.config.item.behavior.invalid_type: "Issue found in file warning.config.item.behavior.block.missing_block: "Issue found in file - The item '' is missing the required 'block' argument for 'block_item' behavior." warning.config.item.behavior.wall_block.missing_block: "Issue found in file - The item '' is missing the required 'block' argument for 'wall_block_item' behavior." warning.config.item.behavior.ceiling_block.missing_block: "Issue found in file - The item '' is missing the required 'block' argument for 'ceiling_block_item' behavior." +warning.config.item.behavior.ground_block.missing_block: "Issue found in file - The item '' is missing the required 'block' argument for 'ground_block_item' behavior." warning.config.item.behavior.furniture.missing_furniture: "Issue found in file - The item '' is missing the required 'furniture' argument for 'furniture_item' behavior." warning.config.item.behavior.liquid_collision.missing_block: "Issue found in file - The item '' is missing the required 'block' argument for 'liquid_collision_block_item' behavior." warning.config.item.behavior.double_high.missing_block: "Issue found in file - The item '' is missing the required 'block' argument for 'double_high_block_item' behavior." diff --git a/common-files/src/main/resources/translations/zh_cn.yml b/common-files/src/main/resources/translations/zh_cn.yml index 92d78c68f..101473e72 100644 --- a/common-files/src/main/resources/translations/zh_cn.yml +++ b/common-files/src/main/resources/translations/zh_cn.yml @@ -214,6 +214,7 @@ warning.config.item.behavior.invalid_type: "在文件 发现问 warning.config.item.behavior.block.missing_block: "在文件 发现问题 - 物品 '' 的 'block_item' 行为缺少必需的 'block' 参数" warning.config.item.behavior.wall_block.missing_block: "在文件 发现问题 - 物品 '' 缺少 'wall_block_item' 行为所需的 'block' 参数" warning.config.item.behavior.ceiling_block.missing_block: "在文件 发现问题 - 物品 '' 缺少 'ceiling_block_item' 行为所需的 'block' 参数" +warning.config.item.behavior.ground_block.missing_block: "在文件 发现问题 - 物品 '' 缺少 'ground_block_item' 行为所需的 'block' 参数" warning.config.item.behavior.furniture.missing_furniture: "在文件 发现问题 - 物品 '' 的 'furniture_item' 行为缺少必需的 'furniture' 参数" warning.config.item.behavior.liquid_collision.missing_block: "在文件 发现问题 - 物品 '' 的 'liquid_collision_block_item' 行为缺少必需的 'block' 参数" warning.config.item.behavior.double_high.missing_block: "在文件 发现问题 - 物品 '' 的 'double_high_block_item' 行为缺少必需的 'block' 参数"