From ea2c2635bd2d5e90a4313dc91254d3ee940177ab Mon Sep 17 00:00:00 2001 From: jhqwqmc Date: Sat, 27 Dec 2025 04:41:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=94=93=E5=BB=B6=E6=96=B9?= =?UTF-8?q?=E5=9D=97=E8=A1=8C=E4=B8=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../block/behavior/BukkitBlockBehaviors.java | 1 + .../behavior/SpreadingBlockBehavior.java | 46 +++++++++++++++++++ .../src/main/resources/translations/en.yml | 1 + .../src/main/resources/translations/zh_cn.yml | 1 + 4 files changed, 49 insertions(+) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SpreadingBlockBehavior.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BukkitBlockBehaviors.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BukkitBlockBehaviors.java index 500e8219b..91152db16 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BukkitBlockBehaviors.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BukkitBlockBehaviors.java @@ -52,6 +52,7 @@ public class BukkitBlockBehaviors extends BlockBehaviors { public static final BlockBehaviorType DROP_EXPERIENCE_BLOCK = register(DropExperienceBlockBehavior.ID, DropExperienceBlockBehavior.FACTORY); public static final BlockBehaviorType DROP_EXP_BLOCK = register(Key.from("craftengine:drop_exp_block"), DropExperienceBlockBehavior.FACTORY); public static final BlockBehaviorType MULTI_HIGH_BLOCK = register(MultiHighBlockBehavior.ID, MultiHighBlockBehavior.FACTORY); + public static final BlockBehaviorType SPREADING_BLOCK = register(SpreadingBlockBehavior.ID, SpreadingBlockBehavior.FACTORY); public static void init() { } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SpreadingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SpreadingBlockBehavior.java new file mode 100644 index 000000000..a503edad3 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SpreadingBlockBehavior.java @@ -0,0 +1,46 @@ +package net.momirealms.craftengine.bukkit.block.behavior; + +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.UpdateOption; +import net.momirealms.craftengine.core.block.behavior.BlockBehavior; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.LazyReference; +import net.momirealms.craftengine.core.util.RandomUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; + +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.Callable; + +public class SpreadingBlockBehavior extends BukkitBlockBehavior { + public static final Key ID = Key.from("minecraft:spreading_block"); + public static final BlockBehaviorFactory FACTORY = new Factory(); + private final LazyReference targetBlock; + + public SpreadingBlockBehavior(CustomBlock customBlock, String targetBlock) { + super(customBlock); + this.targetBlock = LazyReference.lazyReference(() -> Objects.requireNonNull(BukkitBlockManager.instance().createBlockState(targetBlock)).literalObject()); + } + + @Override + public void randomTick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object level = args[1]; + Object pos = args[2]; + Object blockPos = FastNMS.INSTANCE.method$BlockPos$offset(pos, RandomUtils.generateRandomInt(-1, 2), RandomUtils.generateRandomInt(-3, 2), RandomUtils.generateRandomInt(-1, 2)); + if (FastNMS.INSTANCE.method$BlockStateBase$isBlock(FastNMS.INSTANCE.method$BlockGetter$getBlockState(level, blockPos), FastNMS.INSTANCE.method$BlockState$getBlock(this.targetBlock.get()))) { + FastNMS.INSTANCE.method$LevelWriter$setBlock(level, blockPos, this.block().defaultState().customBlockState().literalObject(), UpdateOption.UPDATE_ALL.flags()); + } + } + + public static class Factory implements BlockBehaviorFactory { + + @Override + public BlockBehavior create(CustomBlock block, Map arguments) { + String targetBlock = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("target-block"), "warning.config.block.behavior.spreading.missing_target_block"); + return new SpreadingBlockBehavior(block, targetBlock); + } + } +} diff --git a/common-files/src/main/resources/translations/en.yml b/common-files/src/main/resources/translations/en.yml index f543e69db..9d9bfdc04 100644 --- a/common-files/src/main/resources/translations/en.yml +++ b/common-files/src/main/resources/translations/en.yml @@ -435,6 +435,7 @@ warning.config.block.behavior.surface_spreading.missing_base_block: "Iss warning.config.block.behavior.snowy.missing_snowy: "Issue found in file - The block '' is missing the required 'snowy' property for 'snowy_block' behavior." warning.config.block.behavior.hangable.missing_hanging: "Issue found in file - The block '' is missing the required 'hanging' property for 'hangable_block' behavior." warning.config.block.behavior.multi_high.missing_high: "Issue found in file - The block '' is missing the required 'high' property for 'multi_high_block' behavior." +warning.config.block.behavior.spreading.missing_target_block: "Issue found in file - The block '' is missing the required 'target-block' argument for 'spreading_block' behavior." warning.config.model.generation.missing_parent: "Issue found in file - The config '' is missing the required 'parent' argument in 'generation' section." warning.config.model.generation.conflict: "Issue found in file - Failed to generate model for '' as two or more configurations attempt to generate different json models with the same path: ''." warning.config.model.generation.invalid_display_position: "Issue found in file - The config '' is using an invalid display position '' in 'generation.display' section. Allowed display positions: []" diff --git a/common-files/src/main/resources/translations/zh_cn.yml b/common-files/src/main/resources/translations/zh_cn.yml index 6367c9c05..db2d8a29e 100644 --- a/common-files/src/main/resources/translations/zh_cn.yml +++ b/common-files/src/main/resources/translations/zh_cn.yml @@ -435,6 +435,7 @@ warning.config.block.behavior.surface_spreading.missing_base_block: "在 warning.config.block.behavior.snowy.missing_snowy: "在文件 发现问题 - 方块 '' 的 'snowy_block' 行为缺少必需的 'snowy' 属性" warning.config.block.behavior.hangable.missing_hanging: "在文件 发现问题 - 方块 '' 的 'hangable_block' 行为缺少必需的 'hanging' 属性" warning.config.block.behavior.multi_high.missing_high: "在文件 发现问题 - 方块 '' 的 'multi_high_block' 行为缺少必需的 'high' 属性" +warning.config.block.behavior.spreading.missing_target_block: "在文件 发现问题 - 方块 '' 的 'spreading_block' 行为缺少必需的 'target-block' 选项" warning.config.model.generation.missing_parent: "在文件 发现问题 - 配置项 '' 的 'generation' 段落缺少必需的 'parent' 参数" warning.config.model.generation.conflict: "在文件 发现问题 - 无法为 '' 生成模型 存在多个配置尝试使用相同路径 '' 生成不同的 JSON 模型" warning.config.model.generation.invalid_display_position: "在文件 发现问题 - 配置项 '' 在 'generation.display' 区域使用了无效的 display 位置类型 ''. 可用展示类型: []"