From a22a8b6d2ea7a8981eeb2da0a6712365b80a9cf6 Mon Sep 17 00:00:00 2001 From: jhqwqmc Date: Sun, 9 Nov 2025 15:43:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A6=86=E9=9B=AA=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 | 2 + .../block/behavior/SnowyBlockBehavior.java | 54 +++++++++++++++++++ .../behavior/SpreadingBlockBehavior.java | 25 ++------- .../src/main/resources/translations/en.yml | 1 + .../src/main/resources/translations/zh_cn.yml | 1 + 5 files changed, 61 insertions(+), 22 deletions(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SnowyBlockBehavior.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 dbd0533c1..6a0760815 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 @@ -45,6 +45,7 @@ public class BukkitBlockBehaviors extends BlockBehaviors { public static final Key BUDDING_BLOCK = Key.from("craftengine:budding_block"); public static final Key SEAT_BLOCK = Key.from("craftengine:seat_block"); public static final Key SPREADING_BLOCK = Key.from("craftengine:spreading_block"); + public static final Key SNOWY_BLOCK = Key.from("craftengine:snowy_block"); public static void init() { register(EMPTY, (block, args) -> EmptyBlockBehavior.INSTANCE); @@ -88,5 +89,6 @@ public class BukkitBlockBehaviors extends BlockBehaviors { register(BUDDING_BLOCK, BuddingBlockBehavior.FACTORY); register(SEAT_BLOCK, SeatBlockBehavior.FACTORY); register(SPREADING_BLOCK, SpreadingBlockBehavior.FACTORY); + register(SNOWY_BLOCK, SnowyBlockBehavior.FACTORY); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SnowyBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SnowyBlockBehavior.java new file mode 100644 index 000000000..6540c9727 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SnowyBlockBehavior.java @@ -0,0 +1,54 @@ +package net.momirealms.craftengine.bukkit.block.behavior; + +import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MTagKeys; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.LocationUtils; +import net.momirealms.craftengine.core.block.BlockBehavior; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; +import net.momirealms.craftengine.core.block.properties.BooleanProperty; +import net.momirealms.craftengine.core.item.context.BlockPlaceContext; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; + +import java.util.Map; +import java.util.concurrent.Callable; + +public class SnowyBlockBehavior extends BukkitBlockBehavior { + public static final Factory FACTORY = new Factory(); + private final BooleanProperty snowyProperty; + + public SnowyBlockBehavior(CustomBlock customBlock, BooleanProperty snowyProperty) { + super(customBlock); + this.snowyProperty = snowyProperty; + } + + @Override + public Object updateShape(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + if (args[updateShape$direction] != CoreReflections.instance$Direction$UP) return superMethod.call(); + ImmutableBlockState state = BlockStateUtils.getOptionalCustomBlockState(args[0]).orElse(null); + if (state == null || state.isEmpty()) return superMethod.call(); + return state.with(this.snowyProperty, isSnowySetting(args[updateShape$neighborState])); + } + + @Override + public ImmutableBlockState updateStateForPlacement(BlockPlaceContext context, ImmutableBlockState state) { + Object blockState = FastNMS.INSTANCE.method$BlockGetter$getBlockState(context.getLevel().serverWorld(), LocationUtils.toBlockPos(context.getClickedPos().above())); + return state.with(this.snowyProperty, isSnowySetting(blockState)); + } + + private static boolean isSnowySetting(Object state) { + return FastNMS.INSTANCE.method$BlockStateBase$is(state, MTagKeys.Block$SNOW); + } + + public static class Factory implements BlockBehaviorFactory { + + @Override + public BlockBehavior create(CustomBlock block, Map arguments) { + BooleanProperty snowyProperty = (BooleanProperty) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("snowy"), "warning.config.block.behavior.snowy.missing_snowy"); + return new SnowyBlockBehavior(block, snowyProperty); + } + } +} 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 index faa138120..00b0da334 100644 --- 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 @@ -5,12 +5,11 @@ import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBlocks; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MTagKeys; -import net.momirealms.craftengine.bukkit.util.BlockStateUtils; -import net.momirealms.craftengine.bukkit.util.LocationUtils; -import net.momirealms.craftengine.core.block.*; +import net.momirealms.craftengine.core.block.BlockBehavior; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.block.properties.BooleanProperty; -import net.momirealms.craftengine.core.item.context.BlockPlaceContext; import net.momirealms.craftengine.core.util.LazyReference; import net.momirealms.craftengine.core.util.RandomUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -31,20 +30,6 @@ public class SpreadingBlockBehavior extends BukkitBlockBehavior { this.spreadBlock = LazyReference.lazyReference(() -> Objects.requireNonNull(BukkitBlockManager.instance().createBlockState(spreadBlock)).literalObject()); } - @Override - public Object updateShape(Object thisBlock, Object[] args, Callable superMethod) throws Exception { - if (args[updateShape$direction] != CoreReflections.instance$Direction$UP) return superMethod.call(); - return BlockStateUtils.toBlockStateWrapper(args[0]).withProperty("snowy", String.valueOf(isSnowySetting(args[updateShape$neighborState]))).literalObject(); - } - - @Override - public ImmutableBlockState updateStateForPlacement(BlockPlaceContext context, ImmutableBlockState state) { - BooleanProperty snowy = (BooleanProperty) this.block().getProperty("snowy"); - if (snowy == null) return state; - Object blockState = FastNMS.INSTANCE.method$BlockGetter$getBlockState(context.getLevel().serverWorld(), LocationUtils.toBlockPos(context.getClickedPos().above())); - return state.with(snowy, isSnowySetting(blockState)); - } - @Override public void randomTick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { Object state = args[0]; @@ -88,10 +73,6 @@ public class SpreadingBlockBehavior extends BukkitBlockBehavior { } } - private static boolean isSnowySetting(Object state) { - return FastNMS.INSTANCE.method$BlockStateBase$is(state, MTagKeys.Block$SNOW); - } - private static boolean canPropagate(Object state, Object level, Object pos) { Object blockPos = FastNMS.INSTANCE.method$BlockPos$relative(pos, CoreReflections.instance$Direction$UP); return canBeGrass(state, level, pos) && !FastNMS.INSTANCE.method$FluidState$is(FastNMS.INSTANCE.method$BlockGetter$getFluidState(level, blockPos), MTagKeys.Fluid$WATER); diff --git a/common-files/src/main/resources/translations/en.yml b/common-files/src/main/resources/translations/en.yml index b77e3c8dc..16b5f5962 100644 --- a/common-files/src/main/resources/translations/en.yml +++ b/common-files/src/main/resources/translations/en.yml @@ -354,6 +354,7 @@ warning.config.block.behavior.attached_stem.missing_fruit: "Issue found warning.config.block.behavior.attached_stem.missing_stem: "Issue found in file - The block '' is missing the required 'stem' argument for 'attached_stem_block' behavior." warning.config.block.behavior.chime.missing_sounds_projectile_hit: "Issue found in file - The block '' is missing the required 'sounds.projectile-hit' argument for 'chime_block' behavior." warning.config.block.behavior.spreading.missing_spread_block: "Issue found in file - The block '' is missing the required 'spread-block' argument for 'spreading_block' behavior." +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.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 7312dce1b..441a24513 100644 --- a/common-files/src/main/resources/translations/zh_cn.yml +++ b/common-files/src/main/resources/translations/zh_cn.yml @@ -354,6 +354,7 @@ warning.config.block.behavior.attached_stem.missing_fruit: "在文件 在文件 发现问题 - 方块 '' 的 'attached_stem_block' 行为缺少必需的 'stem' 选项" warning.config.block.behavior.chime.missing_sounds_projectile_hit: "在文件 发现问题 - 方块 '' 的 'chime_block' 行为缺少必需的 'sounds.projectile-hit' 选项" warning.config.block.behavior.spreading.missing_spread_block: "在文件 发现问题 - 方块 '' 的 'spreading_block' 行为缺少必需的 'spread-block' 选项" +warning.config.block.behavior.snowy.missing_snowy: "在文件 发现问题 - 方块 '' 的 'snowy_block' 行为缺少必需的 'snowy' 属性" warning.config.model.generation.missing_parent: "在文件 发现问题 - 配置项 '' 的 'generation' 段落缺少必需的 'parent' 参数" warning.config.model.generation.conflict: "在文件 发现问题 - 无法为 '' 生成模型 存在多个配置尝试使用相同路径 '' 生成不同的 JSON 模型" warning.config.model.generation.invalid_display_position: "在文件 发现问题 - 配置项 '' 在 'generation.display' 区域使用了无效的 display 位置类型 ''. 可用展示类型: []"