From c0c21dc83b01878cc8c3b7f2b3220831f844c47b Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Wed, 18 Jun 2025 04:57:57 +0800 Subject: [PATCH] =?UTF-8?q?feat(bukkit):=20=E5=AE=9E=E7=8E=B0SturdyBaseBlo?= =?UTF-8?q?ck=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 + .../behavior/SturdyBaseBlockBehavior.java | 46 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SturdyBaseBlockBehavior.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 a162e4d28..35ac36449 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 @@ -22,6 +22,7 @@ public class BukkitBlockBehaviors extends BlockBehaviors { public static final Key TRAPDOOR_BLOCK = Key.from("craftengine:trapdoor_block"); public static final Key DOOR_BLOCK = Key.from("craftengine:door_block"); public static final Key STACKABLE_BLOCK = Key.from("craftengine:stackable_block"); + public static final Key STURDY_BASE_BLOCK = Key.from("craftengine:sturdy_base_block"); public static void init() { register(EMPTY, (block, args) -> EmptyBlockBehavior.INSTANCE); @@ -42,5 +43,6 @@ public class BukkitBlockBehaviors extends BlockBehaviors { register(TRAPDOOR_BLOCK, TrapDoorBlockBehavior.FACTORY); register(DOOR_BLOCK, DoorBlockBehavior.FACTORY); register(STACKABLE_BLOCK, StackableBlockBehavior.FACTORY); + register(STURDY_BASE_BLOCK, SturdyBaseBlockBehavior.FACTORY); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SturdyBaseBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SturdyBaseBlockBehavior.java new file mode 100644 index 000000000..4916e7a2e --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SturdyBaseBlockBehavior.java @@ -0,0 +1,46 @@ +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.util.DirectionUtils; +import net.momirealms.craftengine.core.block.BlockBehavior; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; + +import java.util.Locale; +import java.util.Map; + +public class SturdyBaseBlockBehavior extends AbstractCanSurviveBlockBehavior { + public static final Factory FACTORY = new Factory(); + private final Direction direction; + + public SturdyBaseBlockBehavior(CustomBlock block, int delay, Direction direction) { + super(block, delay); + this.direction = direction; + } + + @Override + protected boolean canSurvive(Object thisBlock, Object state, Object world, Object blockPos) throws Exception { + int x = FastNMS.INSTANCE.field$Vec3i$x(blockPos) + this.direction.stepX(); + int y = FastNMS.INSTANCE.field$Vec3i$y(blockPos) + this.direction.stepY(); + int z = FastNMS.INSTANCE.field$Vec3i$z(blockPos) + this.direction.stepZ(); + Object targetPos = FastNMS.INSTANCE.constructor$BlockPos(x, y, z); + Object blockState = FastNMS.INSTANCE.method$BlockGetter$getBlockState(world, targetPos); + return (boolean) CoreReflections.method$BlockStateBase$isFaceSturdy.invoke( + blockState, world, blockPos, DirectionUtils.toNMSDirection(this.direction.opposite()), + CoreReflections.instance$SupportType$FULL + ); + } + + public static class Factory implements BlockBehaviorFactory { + + @Override + public BlockBehavior create(CustomBlock block, Map arguments) { + int delay = ResourceConfigUtils.getAsInt(arguments.getOrDefault("delay", 0), "delay"); + Direction direction = Direction.valueOf(arguments.getOrDefault("direction", "down").toString().toUpperCase(Locale.ROOT)); + return new SturdyBaseBlockBehavior(block, delay, direction); + } + } +}