From 76e1e6630873dcc976b4be177ac6553f377403c8 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Sun, 7 Sep 2025 08:08:11 +0800 Subject: [PATCH 01/18] =?UTF-8?q?feat(bukkit):=20=E6=94=B9=E8=BF=9B=20Lamp?= =?UTF-8?q?BlockBehavior?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../block/behavior/LampBlockBehavior.java | 76 +++++++++++++++++-- .../behavior/VerticalCropBlockBehavior.java | 2 +- .../main/resources/additional-real-blocks.yml | 3 +- .../default/configuration/blocks.yml | 15 +++- .../src/main/resources/translations/de.yml | 2 +- .../src/main/resources/translations/en.yml | 3 +- .../src/main/resources/translations/es.yml | 2 +- .../src/main/resources/translations/ru_ru.yml | 2 +- .../src/main/resources/translations/tr.yml | 2 +- .../src/main/resources/translations/zh_cn.yml | 3 +- 10 files changed, 94 insertions(+), 16 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java index 432837793..ebea5c631 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java @@ -1,6 +1,7 @@ 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.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.core.block.BlockBehavior; @@ -8,7 +9,9 @@ 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.Property; +import net.momirealms.craftengine.core.entity.player.InteractionResult; import net.momirealms.craftengine.core.item.context.BlockPlaceContext; +import net.momirealms.craftengine.core.item.context.UseOnContext; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; @@ -19,44 +22,89 @@ import java.util.concurrent.Callable; public class LampBlockBehavior extends BukkitBlockBehavior { public static final Factory FACTORY = new Factory(); private final Property litProperty; + private final Property poweredProperty; + private final boolean canOpenWithHand; + private final boolean redstoneToggleMode; - public LampBlockBehavior(CustomBlock block, Property litProperty) { + public LampBlockBehavior(CustomBlock block, Property litProperty, Property poweredProperty, boolean canOpenWithHand, boolean redstoneToggleMode) { super(block); this.litProperty = litProperty; + this.poweredProperty = poweredProperty; + this.canOpenWithHand = canOpenWithHand; + this.redstoneToggleMode = redstoneToggleMode; + } + + @Override + public InteractionResult useWithoutItem(UseOnContext context, ImmutableBlockState state) { + if (!this.canOpenWithHand) { + return InteractionResult.PASS; + } + LampBlockBehavior behavior = state.behavior().getAs(LampBlockBehavior.class).orElse(null); + if (behavior == null) return InteractionResult.PASS; + FastNMS.INSTANCE.method$LevelWriter$setBlock( + context.getLevel().serverWorld(), + LocationUtils.toBlockPos(context.getClickedPos()), + state.cycle(behavior.litProperty).cycle(behavior.poweredProperty).customBlockState().literalObject(), + 2 + ); + Optional.ofNullable(context.getPlayer()).ifPresent(p -> p.swingHand(context.getHand())); + return InteractionResult.SUCCESS_AND_CANCEL; } @Override public ImmutableBlockState updateStateForPlacement(BlockPlaceContext context, ImmutableBlockState state) { + if (this.canOpenWithHand || this.redstoneToggleMode) return state; Object level = context.getLevel().serverWorld(); state = state.with(this.litProperty, FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(level, LocationUtils.toBlockPos(context.getClickedPos()))); + state = state.with(this.poweredProperty, FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(level, LocationUtils.toBlockPos(context.getClickedPos()))); return state; } @Override public void tick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { Object blockState = args[0]; + Object world = args[1]; + if (this.canOpenWithHand || this.redstoneToggleMode || !CoreReflections.clazz$ServerLevel.isInstance(world)) return; Optional optionalCustomState = BlockStateUtils.getOptionalCustomBlockState(blockState); if (optionalCustomState.isEmpty()) return; - Object world = args[1]; Object blockPos = args[2]; ImmutableBlockState customState = optionalCustomState.get(); if (customState.get(this.litProperty) && !FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(world, blockPos)) { if (FastNMS.INSTANCE.method$CraftEventFactory$callRedstoneChange(world, blockPos, 0, 15).getNewCurrent() != 15) { return; } - FastNMS.INSTANCE.method$LevelWriter$setBlock(world, blockPos, customState.cycle(this.litProperty).customBlockState().literalObject(), 2); + FastNMS.INSTANCE.method$LevelWriter$setBlock(world, blockPos, customState.cycle(this.litProperty).cycle(this.poweredProperty).customBlockState().literalObject(), 2); + } + } + + @Override + public void onPlace(Object thisBlock, Object[] args, Callable superMethod) { + if (this.canOpenWithHand || !this.redstoneToggleMode) return; + Object state = args[0]; + Object level = args[1]; + Object pos = args[2]; + Object oldState = args[3]; + if (FastNMS.INSTANCE.method$BlockState$getBlock(oldState) != FastNMS.INSTANCE.method$BlockState$getBlock(state) && CoreReflections.clazz$ServerLevel.isInstance(level)) { + Optional optionalCustomState = BlockStateUtils.getOptionalCustomBlockState(state); + if (optionalCustomState.isEmpty()) return; + checkAndFlip(optionalCustomState.get(), level, pos); } } @Override public void neighborChanged(Object thisBlock, Object[] args, Callable superMethod) { Object blockState = args[0]; + Object world = args[1]; + if (this.canOpenWithHand || !CoreReflections.clazz$ServerLevel.isInstance(world)) return; Optional optionalCustomState = BlockStateUtils.getOptionalCustomBlockState(blockState); if (optionalCustomState.isEmpty()) return; - Object world = args[1]; Object blockPos = args[2]; ImmutableBlockState customState = optionalCustomState.get(); boolean lit = customState.get(this.litProperty); + if (this.redstoneToggleMode) { + checkAndFlip(customState, world, blockPos); + return; + } if (lit != FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(world, blockPos)) { if (lit) { FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(world, blockPos, thisBlock, 4); @@ -64,17 +112,33 @@ public class LampBlockBehavior extends BukkitBlockBehavior { if (FastNMS.INSTANCE.method$CraftEventFactory$callRedstoneChange(world, blockPos, 0, 15).getNewCurrent() != 15) { return; } - FastNMS.INSTANCE.method$LevelWriter$setBlock(world, blockPos, customState.cycle(this.litProperty).customBlockState().literalObject(), 2); + FastNMS.INSTANCE.method$LevelWriter$setBlock(world, blockPos, customState.cycle(this.litProperty).cycle(this.poweredProperty).customBlockState().literalObject(), 2); } } } + private void checkAndFlip(ImmutableBlockState customState, Object level, Object pos) { + boolean hasNeighborSignal = FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(level, pos); + boolean isPowered = customState.get(this.poweredProperty); + if (hasNeighborSignal != isPowered) { + ImmutableBlockState blockState = customState; + if (!isPowered) { + blockState = blockState.cycle(this.litProperty); + } + FastNMS.INSTANCE.method$LevelWriter$setBlock(level, pos, blockState.with(this.poweredProperty, hasNeighborSignal).customBlockState().literalObject(), 3); + } + + } + @SuppressWarnings("unchecked") public static class Factory implements BlockBehaviorFactory { @Override public BlockBehavior create(CustomBlock block, Map arguments) { Property lit = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("lit"), "warning.config.block.behavior.lamp.missing_lit"); - return new LampBlockBehavior(block, lit); + Property powered = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("powered"), "warning.config.block.behavior.lamp.missing_powered"); + boolean canOpenWithHand = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("can-open-with-hand", false), "can-open-with-hand"); + boolean redstoneToggleMode = !canOpenWithHand && ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("redstone-toggle-mode", false), "redstone-toggle-mode"); + return new LampBlockBehavior(block, lit, powered, canOpenWithHand, redstoneToggleMode); } } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/VerticalCropBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/VerticalCropBlockBehavior.java index 8e416ac4f..c42f10337 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/VerticalCropBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/VerticalCropBlockBehavior.java @@ -83,7 +83,7 @@ public class VerticalCropBlockBehavior extends BukkitBlockBehavior { @SuppressWarnings("unchecked") @Override public BlockBehavior create(CustomBlock block, Map arguments) { - Property ageProperty = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("age"), "warning.config.block.behavior.sugar_cane.missing_age"); + Property ageProperty = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("age"), "warning.config.block.behavior.vertical_crop.missing_age"); int maxHeight = ResourceConfigUtils.getAsInt(arguments.getOrDefault("max-height", 3), "max-height"); boolean direction = arguments.getOrDefault("direction", "up").toString().equalsIgnoreCase("up"); return new VerticalCropBlockBehavior(block, ageProperty, maxHeight, diff --git a/common-files/src/main/resources/additional-real-blocks.yml b/common-files/src/main/resources/additional-real-blocks.yml index 58279f8a7..3f92d92f0 100644 --- a/common-files/src/main/resources/additional-real-blocks.yml +++ b/common-files/src/main/resources/additional-real-blocks.yml @@ -80,4 +80,5 @@ minecraft:mangrove_fence_gate: 16 minecraft:cherry_fence_gate: 16 minecraft:bamboo_fence_gate: 16 minecraft:crimson_fence_gate: 16 -minecraft:warped_fence_gate: 16 \ No newline at end of file +minecraft:warped_fence_gate: 16 +minecraft:cactus: 15 \ No newline at end of file diff --git a/common-files/src/main/resources/resources/default/configuration/blocks.yml b/common-files/src/main/resources/resources/default/configuration/blocks.yml index 573ed098d..5495ed843 100644 --- a/common-files/src/main/resources/resources/default/configuration/blocks.yml +++ b/common-files/src/main/resources/resources/default/configuration/blocks.yml @@ -221,6 +221,9 @@ items#misc: lit: type: boolean default: false + powered: + type: boolean + default: false appearances: off: state: cactus:0 @@ -245,14 +248,22 @@ items#misc: top: minecraft:block/custom/copper_coil_on side: minecraft:block/custom/copper_coil_on_side variants: - lit=false: + lit=false,powered=false: appearance: 'off' id: 0 - lit=true: + lit=true,powered=false: appearance: 'on' id: 1 settings: luminance: 8 + lit=false,powered=true: + appearance: 'off' + id: 2 + lit=true,powered=true: + appearance: 'on' + id: 3 + settings: + luminance: 8 default:pebble: material: nether_brick custom-model-data: 3005 diff --git a/common-files/src/main/resources/translations/de.yml b/common-files/src/main/resources/translations/de.yml index 3e3ffe8b1..f22dc1863 100644 --- a/common-files/src/main/resources/translations/de.yml +++ b/common-files/src/main/resources/translations/de.yml @@ -273,7 +273,7 @@ warning.config.block.behavior.missing_type: "Problem in Datei ge warning.config.block.behavior.invalid_type: "Problem in Datei gefunden - Der Block '' verwendet einen ungültigen Block-Behavior-Typ ''." warning.config.block.behavior.concrete.missing_solid: "Problem in Datei gefunden - Beim Block '' fehlt die erforderliche 'solid-block'-Option für das 'concrete_block'-Behavior." warning.config.block.behavior.crop.missing_age: "Problem in Datei gefunden - Beim Block '' fehlt die erforderliche 'age'-Property für das 'crop_block'-Behavior." -warning.config.block.behavior.sugar_cane.missing_age: "Problem in Datei gefunden - Beim Block '' fehlt die erforderliche 'age'-Property für das 'sugar_cane_block'-Behavior." +warning.config.block.behavior.vertical_crop.missing_age: "Problem in Datei gefunden - Beim Block '' fehlt die erforderliche 'age'-Property für das 'vertical_crop_block'-Behavior." warning.config.block.behavior.leaves.missing_persistent: "Problem in Datei gefunden - Beim Block '' fehlt die erforderliche 'persistent'-Property für das 'leaves_block'-Behavior." warning.config.block.behavior.leaves.missing_distance: "Problem in Datei gefunden - Beim Block '' fehlt die erforderliche 'distance'-Property für das 'leaves_block'-Behavior." warning.config.block.behavior.lamp.missing_lit: "Problem in Datei gefunden - Beim Block '' fehlt die erforderliche 'lit'-Property für das 'lamp_block'-Behavior." diff --git a/common-files/src/main/resources/translations/en.yml b/common-files/src/main/resources/translations/en.yml index efd506c7d..5dbb40cfc 100644 --- a/common-files/src/main/resources/translations/en.yml +++ b/common-files/src/main/resources/translations/en.yml @@ -277,10 +277,11 @@ warning.config.block.behavior.missing_type: "Issue found in file warning.config.block.behavior.invalid_type: "Issue found in file - The block '' is using an invalid block behavior type ''." warning.config.block.behavior.concrete.missing_solid: "Issue found in file - The block '' is missing the required 'solid-block' option for 'concrete_block' behavior." warning.config.block.behavior.crop.missing_age: "Issue found in file - The block '' is missing the required 'age' property for 'crop_block' behavior." -warning.config.block.behavior.sugar_cane.missing_age: "Issue found in file - The block '' is missing the required 'age' property for 'sugar_cane_block' behavior." +warning.config.block.behavior.vertical_crop.missing_age: "Issue found in file - The block '' is missing the required 'age' property for 'vertical_crop_block' behavior." warning.config.block.behavior.leaves.missing_persistent: "Issue found in file - The block '' is missing the required 'persistent' property for 'leaves_block' behavior." warning.config.block.behavior.leaves.missing_distance: "Issue found in file - The block '' is missing the required 'distance' property for 'leaves_block' behavior." warning.config.block.behavior.lamp.missing_lit: "Issue found in file - The block '' is missing the required 'lit' property for 'lamp_block' behavior." +warning.config.block.behavior.lamp.missing_powered: "Issue found in file - The block '' is missing the required 'powered' property for 'lamp_block' behavior." warning.config.block.behavior.sapling.missing_stage: "Issue found in file - The block '' is missing the required 'stage' property for 'sapling_block' behavior." warning.config.block.behavior.sapling.missing_feature: "Issue found in file - The block '' is missing the required 'feature' argument for 'sapling_block' behavior." warning.config.block.behavior.strippable.missing_stripped: "Issue found in file - The block '' is missing the required 'stripped' argument for 'strippable_block' behavior." diff --git a/common-files/src/main/resources/translations/es.yml b/common-files/src/main/resources/translations/es.yml index b26e3f80d..77b0cc709 100644 --- a/common-files/src/main/resources/translations/es.yml +++ b/common-files/src/main/resources/translations/es.yml @@ -195,7 +195,7 @@ warning.config.block.behavior.missing_type: "Problema encontrado en el a warning.config.block.behavior.invalid_type: "Problema encontrado en el archivo - El bloque '' está usando un tipo de comportamiento de bloque inválido ''." warning.config.block.behavior.concrete.missing_solid: "Problema encontrado en el archivo - El bloque '' carece de la opción requerida 'solid-block' para el comportamiento 'concrete_block'." warning.config.block.behavior.crop.missing_age: "Problema encontrado en el archivo - El bloque '' carece de la propiedad requerida 'age' para el comportamiento 'crop_block'." -warning.config.block.behavior.sugar_cane.missing_age: "Problema encontrado en el archivo - El bloque '' carece de la propiedad requerida 'age' para el comportamiento 'sugar_cane_block'." +warning.config.block.behavior.vertical_crop.missing_age: "Problema encontrado en el archivo - El bloque '' carece de la propiedad requerida 'age' para el comportamiento 'vertical_crop_block'." warning.config.block.behavior.leaves.missing_persistent: "Problema encontrado en el archivo - El bloque '' carece de la propiedad requerida 'persistent' para el comportamiento 'leaves_block'." warning.config.block.behavior.leaves.missing_distance: "Problema encontrado en el archivo - El bloque '' carece de la propiedad requerida 'distance' para el comportamiento 'leaves_block'." warning.config.block.behavior.sapling.missing_stage: "Problema encontrado en el archivo - El bloque '' carece de la propiedad requerida 'stage' para el comportamiento 'sapling_block'." diff --git a/common-files/src/main/resources/translations/ru_ru.yml b/common-files/src/main/resources/translations/ru_ru.yml index 60036cb99..209c6cf28 100644 --- a/common-files/src/main/resources/translations/ru_ru.yml +++ b/common-files/src/main/resources/translations/ru_ru.yml @@ -245,7 +245,7 @@ warning.config.block.behavior.missing_type: "Проблема найде warning.config.block.behavior.invalid_type: "Проблема найдена в файле - Блок '' имеет недействительный блочный behavior тип ''." warning.config.block.behavior.concrete.missing_solid: "Проблема найдена в файле - В блоке '' отсутствует необходимый 'solid-block' вариант для 'concrete_block' behavior." warning.config.block.behavior.crop.missing_age: "Проблема найдена в файле - В блоке '' отсутствует необходимый 'age' свойство для 'crop_block' behavior." -warning.config.block.behavior.sugar_cane.missing_age: "Проблема найдена в файле - В блоке '' отсутствует необходимый 'age' свойство для 'sugar_cane_block' behavior." +warning.config.block.behavior.vertical_crop.missing_age: "Проблема найдена в файле - В блоке '' отсутствует необходимый 'age' свойство для 'vertical_crop_block' behavior." warning.config.block.behavior.leaves.missing_persistent: "Проблема найдена в файле - В блоке '' отсутствует необходимый 'persistent' свойство для 'leaves_block' behavior." warning.config.block.behavior.leaves.missing_distance: "Проблема найдена в файле - В блоке '' отсутствует необходимый 'distance' свойство для 'leaves_block' behavior." warning.config.block.behavior.lamp.missing_lit: "Проблема найдена в файле - В блоке '' отсутствует необходимый 'lit' свойство для 'lamp_block' behavior." diff --git a/common-files/src/main/resources/translations/tr.yml b/common-files/src/main/resources/translations/tr.yml index 0704fb7f2..d1cff3a7c 100644 --- a/common-files/src/main/resources/translations/tr.yml +++ b/common-files/src/main/resources/translations/tr.yml @@ -193,7 +193,7 @@ warning.config.block.behavior.missing_type: " dosyasında sorun b warning.config.block.behavior.invalid_type: " dosyasında sorun bulundu - '' bloğu geçersiz bir blok davranış türü '' kullanıyor." warning.config.block.behavior.concrete.missing_solid: " dosyasında sorun bulundu - '' bloğu, 'concrete_block' davranışı için gerekli 'solid-block' seçeneği eksik." warning.config.block.behavior.crop.missing_age: " dosyasında sorun bulundu - '' bloğu, 'crop_block' davranışı için gerekli 'age' özelliği eksik." -warning.config.block.behavior.sugar_cane.missing_age: " dosyasında sorun bulundu - '' bloğu, 'sugar_cane_block' davranışı için gerekli 'age' özelliği eksik." +warning.config.block.behavior.vertical_crop.missing_age: " dosyasında sorun bulundu - '' bloğu, 'vertical_crop_block' davranışı için gerekli 'age' özelliği eksik." warning.config.block.behavior.leaves.missing_persistent: " dosyasında sorun bulundu - '' bloğu, 'leaves_block' davranışı için gerekli 'persistent' özelliği eksik." warning.config.block.behavior.leaves.missing_distance: " dosyasında sorun bulundu - '' bloğu, 'leaves_block' davranışı için gerekli 'distance' özelliği eksik." warning.config.block.behavior.sapling.missing_stage: " dosyasında sorun bulundu - '' bloğu, 'sapling_block' davranışı için gerekli 'stage' özelliği eksik." diff --git a/common-files/src/main/resources/translations/zh_cn.yml b/common-files/src/main/resources/translations/zh_cn.yml index 239100483..df83c94fe 100644 --- a/common-files/src/main/resources/translations/zh_cn.yml +++ b/common-files/src/main/resources/translations/zh_cn.yml @@ -277,10 +277,11 @@ warning.config.block.behavior.missing_type: "在文件 发现问 warning.config.block.behavior.invalid_type: "在文件 发现问题 - 方块 '' 使用了无效的行为类型 ''" warning.config.block.behavior.concrete.missing_solid: "在文件 发现问题 - 方块 '' 的 'concrete_block' 行为缺少必需的 'solid-block' 选项" warning.config.block.behavior.crop.missing_age: "在文件 发现问题 - 方块 '' 的 'crop_block' 行为缺少必需的 'age' 属性" -warning.config.block.behavior.sugar_cane.missing_age: "在文件 发现问题 - 方块 '' 的 'sugar_cane_block' 行为缺少必需的 'age' 属性" +warning.config.block.behavior.vertical_crop.missing_age: "在文件 发现问题 - 方块 '' 的 'vertical_crop_block' 行为缺少必需的 'age' 属性" warning.config.block.behavior.leaves.missing_persistent: "在文件 发现问题 - 方块 '' 的 'leaves_block' 行为缺少必需的 'persistent' 属性" warning.config.block.behavior.leaves.missing_distance: "在文件 发现问题 - 方块 '' 的 'leaves_block' 行为缺少必需的 'distance' 属性" warning.config.block.behavior.lamp.missing_lit: "在文件 发现问题 - 方块 '' 的 'lamp_block' 行为缺少必需的 'lit' 属性" +warning.config.block.behavior.lamp.missing_powered: "在文件 发现问题 - 方块 '' 的 'lamp_block' 行为缺少必需的 'powered' 属性" warning.config.block.behavior.sapling.missing_stage: "在文件 发现问题 - 方块 '' 的 'sapling_block' 行为缺少必需的 'stage' 属性" warning.config.block.behavior.sapling.missing_feature: "在文件 发现问题 - 方块 '' 的 'sapling_block' 行为缺少必需的 'feature' 参数" warning.config.block.behavior.strippable.missing_stripped: "在文件 发现问题 - 方块 '' 的 'strippable_block' 行为缺少必需的 'stripped' 参数" From d51404e8df9353234305b19447e7230847747309 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Sun, 7 Sep 2025 08:39:29 +0800 Subject: [PATCH 02/18] =?UTF-8?q?feat(bukkit):=20=E5=89=A5=E7=A6=BB=20reds?= =?UTF-8?q?tone-toggle-mode=20=E6=88=90=20ToggleableLampBlockBehavior?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../block/behavior/BukkitBlockBehaviors.java | 2 + .../block/behavior/LampBlockBehavior.java | 42 +---------- .../behavior/ToggleableLampBlockBehavior.java | 75 +++++++++++++++++++ .../default/configuration/blocks.yml | 15 +--- .../src/main/resources/translations/en.yml | 3 +- .../src/main/resources/translations/zh_cn.yml | 3 +- 6 files changed, 87 insertions(+), 53 deletions(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ToggleableLampBlockBehavior.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 0705b6c10..4a622ed7a 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 @@ -29,6 +29,7 @@ public class BukkitBlockBehaviors extends BlockBehaviors { public static final Key DOUBLE_HIGH_BLOCK = Key.from("craftengine:double_high_block"); public static final Key CHANGE_OVER_TIME_BLOCK = Key.from("craftengine:change_over_time_block"); public static final Key SIMPLE_STORAGE_BLOCK = Key.from("craftengine:simple_storage_block"); + public static final Key TOGGLEABLE_LAMP_BLOCK = Key.from("craftengine:toggleable_lamp_block"); public static void init() { register(EMPTY, (block, args) -> EmptyBlockBehavior.INSTANCE); @@ -56,5 +57,6 @@ public class BukkitBlockBehaviors extends BlockBehaviors { register(DOUBLE_HIGH_BLOCK, DoubleHighBlockBehavior.FACTORY); register(CHANGE_OVER_TIME_BLOCK, ChangeOverTimeBlockBehavior.FACTORY); register(SIMPLE_STORAGE_BLOCK, SimpleStorageBlockBehavior.FACTORY); + register(TOGGLEABLE_LAMP_BLOCK, ToggleableLampBlockBehavior.FACTORY); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java index ebea5c631..55efd700d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java @@ -24,14 +24,12 @@ public class LampBlockBehavior extends BukkitBlockBehavior { private final Property litProperty; private final Property poweredProperty; private final boolean canOpenWithHand; - private final boolean redstoneToggleMode; - public LampBlockBehavior(CustomBlock block, Property litProperty, Property poweredProperty, boolean canOpenWithHand, boolean redstoneToggleMode) { + public LampBlockBehavior(CustomBlock block, Property litProperty, Property poweredProperty, boolean canOpenWithHand) { super(block); this.litProperty = litProperty; this.poweredProperty = poweredProperty; this.canOpenWithHand = canOpenWithHand; - this.redstoneToggleMode = redstoneToggleMode; } @Override @@ -53,7 +51,7 @@ public class LampBlockBehavior extends BukkitBlockBehavior { @Override public ImmutableBlockState updateStateForPlacement(BlockPlaceContext context, ImmutableBlockState state) { - if (this.canOpenWithHand || this.redstoneToggleMode) return state; + if (this.canOpenWithHand) return state; Object level = context.getLevel().serverWorld(); state = state.with(this.litProperty, FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(level, LocationUtils.toBlockPos(context.getClickedPos()))); state = state.with(this.poweredProperty, FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(level, LocationUtils.toBlockPos(context.getClickedPos()))); @@ -64,7 +62,7 @@ public class LampBlockBehavior extends BukkitBlockBehavior { public void tick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { Object blockState = args[0]; Object world = args[1]; - if (this.canOpenWithHand || this.redstoneToggleMode || !CoreReflections.clazz$ServerLevel.isInstance(world)) return; + if (this.canOpenWithHand || !CoreReflections.clazz$ServerLevel.isInstance(world)) return; Optional optionalCustomState = BlockStateUtils.getOptionalCustomBlockState(blockState); if (optionalCustomState.isEmpty()) return; Object blockPos = args[2]; @@ -77,20 +75,6 @@ public class LampBlockBehavior extends BukkitBlockBehavior { } } - @Override - public void onPlace(Object thisBlock, Object[] args, Callable superMethod) { - if (this.canOpenWithHand || !this.redstoneToggleMode) return; - Object state = args[0]; - Object level = args[1]; - Object pos = args[2]; - Object oldState = args[3]; - if (FastNMS.INSTANCE.method$BlockState$getBlock(oldState) != FastNMS.INSTANCE.method$BlockState$getBlock(state) && CoreReflections.clazz$ServerLevel.isInstance(level)) { - Optional optionalCustomState = BlockStateUtils.getOptionalCustomBlockState(state); - if (optionalCustomState.isEmpty()) return; - checkAndFlip(optionalCustomState.get(), level, pos); - } - } - @Override public void neighborChanged(Object thisBlock, Object[] args, Callable superMethod) { Object blockState = args[0]; @@ -101,10 +85,6 @@ public class LampBlockBehavior extends BukkitBlockBehavior { Object blockPos = args[2]; ImmutableBlockState customState = optionalCustomState.get(); boolean lit = customState.get(this.litProperty); - if (this.redstoneToggleMode) { - checkAndFlip(customState, world, blockPos); - return; - } if (lit != FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(world, blockPos)) { if (lit) { FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(world, blockPos, thisBlock, 4); @@ -117,19 +97,6 @@ public class LampBlockBehavior extends BukkitBlockBehavior { } } - private void checkAndFlip(ImmutableBlockState customState, Object level, Object pos) { - boolean hasNeighborSignal = FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(level, pos); - boolean isPowered = customState.get(this.poweredProperty); - if (hasNeighborSignal != isPowered) { - ImmutableBlockState blockState = customState; - if (!isPowered) { - blockState = blockState.cycle(this.litProperty); - } - FastNMS.INSTANCE.method$LevelWriter$setBlock(level, pos, blockState.with(this.poweredProperty, hasNeighborSignal).customBlockState().literalObject(), 3); - } - - } - @SuppressWarnings("unchecked") public static class Factory implements BlockBehaviorFactory { @Override @@ -137,8 +104,7 @@ public class LampBlockBehavior extends BukkitBlockBehavior { Property lit = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("lit"), "warning.config.block.behavior.lamp.missing_lit"); Property powered = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("powered"), "warning.config.block.behavior.lamp.missing_powered"); boolean canOpenWithHand = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("can-open-with-hand", false), "can-open-with-hand"); - boolean redstoneToggleMode = !canOpenWithHand && ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("redstone-toggle-mode", false), "redstone-toggle-mode"); - return new LampBlockBehavior(block, lit, powered, canOpenWithHand, redstoneToggleMode); + return new LampBlockBehavior(block, lit, powered, canOpenWithHand); } } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ToggleableLampBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ToggleableLampBlockBehavior.java new file mode 100644 index 000000000..f47417c55 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ToggleableLampBlockBehavior.java @@ -0,0 +1,75 @@ +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.BlockStateUtils; +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.Property; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; + +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.Callable; + +public class ToggleableLampBlockBehavior extends BukkitBlockBehavior { + public static final Factory FACTORY = new Factory(); + private final Property litProperty; + private final Property poweredProperty; + + public ToggleableLampBlockBehavior(CustomBlock block, Property litProperty, Property poweredProperty) { + super(block); + this.litProperty = litProperty; + this.poweredProperty = poweredProperty; + } + + @Override + public void onPlace(Object thisBlock, Object[] args, Callable superMethod) { + Object state = args[0]; + Object level = args[1]; + Object pos = args[2]; + Object oldState = args[3]; + if (FastNMS.INSTANCE.method$BlockState$getBlock(oldState) != FastNMS.INSTANCE.method$BlockState$getBlock(state) && CoreReflections.clazz$ServerLevel.isInstance(level)) { + Optional optionalCustomState = BlockStateUtils.getOptionalCustomBlockState(state); + if (optionalCustomState.isEmpty()) return; + checkAndFlip(optionalCustomState.get(), level, pos); + } + } + + @Override + public void neighborChanged(Object thisBlock, Object[] args, Callable superMethod) { + Object blockState = args[0]; + Object world = args[1]; + if (!CoreReflections.clazz$ServerLevel.isInstance(world)) return; + Optional optionalCustomState = BlockStateUtils.getOptionalCustomBlockState(blockState); + if (optionalCustomState.isEmpty()) return; + Object blockPos = args[2]; + ImmutableBlockState customState = optionalCustomState.get(); + checkAndFlip(customState, world, blockPos); + } + + private void checkAndFlip(ImmutableBlockState customState, Object level, Object pos) { + boolean hasNeighborSignal = FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(level, pos); + boolean isPowered = customState.get(this.poweredProperty); + if (hasNeighborSignal != isPowered) { + ImmutableBlockState blockState = customState; + if (!isPowered) { + blockState = blockState.cycle(this.litProperty); + } + FastNMS.INSTANCE.method$LevelWriter$setBlock(level, pos, blockState.with(this.poweredProperty, hasNeighborSignal).customBlockState().literalObject(), 3); + } + + } + + @SuppressWarnings("unchecked") + public static class Factory implements BlockBehaviorFactory { + @Override + public BlockBehavior create(CustomBlock block, Map arguments) { + Property lit = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("lit"), "warning.config.block.behavior.toggleable_lamp.missing_lit"); + Property powered = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("powered"), "warning.config.block.behavior.toggleable_lamp.missing_powered"); + return new ToggleableLampBlockBehavior(block, lit, powered); + } + } +} diff --git a/common-files/src/main/resources/resources/default/configuration/blocks.yml b/common-files/src/main/resources/resources/default/configuration/blocks.yml index 5495ed843..573ed098d 100644 --- a/common-files/src/main/resources/resources/default/configuration/blocks.yml +++ b/common-files/src/main/resources/resources/default/configuration/blocks.yml @@ -221,9 +221,6 @@ items#misc: lit: type: boolean default: false - powered: - type: boolean - default: false appearances: off: state: cactus:0 @@ -248,22 +245,14 @@ items#misc: top: minecraft:block/custom/copper_coil_on side: minecraft:block/custom/copper_coil_on_side variants: - lit=false,powered=false: + lit=false: appearance: 'off' id: 0 - lit=true,powered=false: + lit=true: appearance: 'on' id: 1 settings: luminance: 8 - lit=false,powered=true: - appearance: 'off' - id: 2 - lit=true,powered=true: - appearance: 'on' - id: 3 - settings: - luminance: 8 default:pebble: material: nether_brick custom-model-data: 3005 diff --git a/common-files/src/main/resources/translations/en.yml b/common-files/src/main/resources/translations/en.yml index 5dbb40cfc..2b7c873da 100644 --- a/common-files/src/main/resources/translations/en.yml +++ b/common-files/src/main/resources/translations/en.yml @@ -281,7 +281,8 @@ warning.config.block.behavior.vertical_crop.missing_age: "Issue found in warning.config.block.behavior.leaves.missing_persistent: "Issue found in file - The block '' is missing the required 'persistent' property for 'leaves_block' behavior." warning.config.block.behavior.leaves.missing_distance: "Issue found in file - The block '' is missing the required 'distance' property for 'leaves_block' behavior." warning.config.block.behavior.lamp.missing_lit: "Issue found in file - The block '' is missing the required 'lit' property for 'lamp_block' behavior." -warning.config.block.behavior.lamp.missing_powered: "Issue found in file - The block '' is missing the required 'powered' property for 'lamp_block' behavior." +warning.config.block.behavior.toggleable_lamp.missing_lit: "Issue found in file - The block '' is missing the required 'lit' property for 'toggleable_lamp_block' behavior." +warning.config.block.behavior.toggleable_lamp.missing_powered: "Issue found in file - The block '' is missing the required 'powered' property for 'toggleable_lamp_block' behavior." warning.config.block.behavior.sapling.missing_stage: "Issue found in file - The block '' is missing the required 'stage' property for 'sapling_block' behavior." warning.config.block.behavior.sapling.missing_feature: "Issue found in file - The block '' is missing the required 'feature' argument for 'sapling_block' behavior." warning.config.block.behavior.strippable.missing_stripped: "Issue found in file - The block '' is missing the required 'stripped' argument for 'strippable_block' behavior." diff --git a/common-files/src/main/resources/translations/zh_cn.yml b/common-files/src/main/resources/translations/zh_cn.yml index df83c94fe..fe5b6fb32 100644 --- a/common-files/src/main/resources/translations/zh_cn.yml +++ b/common-files/src/main/resources/translations/zh_cn.yml @@ -281,7 +281,8 @@ warning.config.block.behavior.vertical_crop.missing_age: "在文件 在文件 发现问题 - 方块 '' 的 'leaves_block' 行为缺少必需的 'persistent' 属性" warning.config.block.behavior.leaves.missing_distance: "在文件 发现问题 - 方块 '' 的 'leaves_block' 行为缺少必需的 'distance' 属性" warning.config.block.behavior.lamp.missing_lit: "在文件 发现问题 - 方块 '' 的 'lamp_block' 行为缺少必需的 'lit' 属性" -warning.config.block.behavior.lamp.missing_powered: "在文件 发现问题 - 方块 '' 的 'lamp_block' 行为缺少必需的 'powered' 属性" +warning.config.block.behavior.toggleable_lamp.missing_lit: "在文件 发现问题 - 方块 '' 的 'toggleable_lamp_block' 行为缺少必需的 'lit' 属性" +warning.config.block.behavior.toggleable_lamp.missing_powered: "在文件 发现问题 - 方块 '' 的 'toggleable_lamp_block' 行为缺少必需的 'powered' 属性" warning.config.block.behavior.sapling.missing_stage: "在文件 发现问题 - 方块 '' 的 'sapling_block' 行为缺少必需的 'stage' 属性" warning.config.block.behavior.sapling.missing_feature: "在文件 发现问题 - 方块 '' 的 'sapling_block' 行为缺少必需的 'feature' 参数" warning.config.block.behavior.strippable.missing_stripped: "在文件 发现问题 - 方块 '' 的 'strippable_block' 行为缺少必需的 'stripped' 参数" From 039d616af2fa95c55c13a6e4489eb301087c9783 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Sun, 7 Sep 2025 08:44:24 +0800 Subject: [PATCH 03/18] =?UTF-8?q?refactor(bukkit):=20=E7=A7=BB=E9=99=A4=20?= =?UTF-8?q?LampBlockBehavior=20=E4=B8=AD=E6=9C=AA=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E7=9A=84=20powered=20=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/block/behavior/LampBlockBehavior.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java index 55efd700d..cd46e8ff8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java @@ -22,13 +22,11 @@ import java.util.concurrent.Callable; public class LampBlockBehavior extends BukkitBlockBehavior { public static final Factory FACTORY = new Factory(); private final Property litProperty; - private final Property poweredProperty; private final boolean canOpenWithHand; - public LampBlockBehavior(CustomBlock block, Property litProperty, Property poweredProperty, boolean canOpenWithHand) { + public LampBlockBehavior(CustomBlock block, Property litProperty, boolean canOpenWithHand) { super(block); this.litProperty = litProperty; - this.poweredProperty = poweredProperty; this.canOpenWithHand = canOpenWithHand; } @@ -42,7 +40,7 @@ public class LampBlockBehavior extends BukkitBlockBehavior { FastNMS.INSTANCE.method$LevelWriter$setBlock( context.getLevel().serverWorld(), LocationUtils.toBlockPos(context.getClickedPos()), - state.cycle(behavior.litProperty).cycle(behavior.poweredProperty).customBlockState().literalObject(), + state.cycle(behavior.litProperty).customBlockState().literalObject(), 2 ); Optional.ofNullable(context.getPlayer()).ifPresent(p -> p.swingHand(context.getHand())); @@ -54,7 +52,6 @@ public class LampBlockBehavior extends BukkitBlockBehavior { if (this.canOpenWithHand) return state; Object level = context.getLevel().serverWorld(); state = state.with(this.litProperty, FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(level, LocationUtils.toBlockPos(context.getClickedPos()))); - state = state.with(this.poweredProperty, FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(level, LocationUtils.toBlockPos(context.getClickedPos()))); return state; } @@ -71,7 +68,7 @@ public class LampBlockBehavior extends BukkitBlockBehavior { if (FastNMS.INSTANCE.method$CraftEventFactory$callRedstoneChange(world, blockPos, 0, 15).getNewCurrent() != 15) { return; } - FastNMS.INSTANCE.method$LevelWriter$setBlock(world, blockPos, customState.cycle(this.litProperty).cycle(this.poweredProperty).customBlockState().literalObject(), 2); + FastNMS.INSTANCE.method$LevelWriter$setBlock(world, blockPos, customState.cycle(this.litProperty).customBlockState().literalObject(), 2); } } @@ -92,7 +89,7 @@ public class LampBlockBehavior extends BukkitBlockBehavior { if (FastNMS.INSTANCE.method$CraftEventFactory$callRedstoneChange(world, blockPos, 0, 15).getNewCurrent() != 15) { return; } - FastNMS.INSTANCE.method$LevelWriter$setBlock(world, blockPos, customState.cycle(this.litProperty).cycle(this.poweredProperty).customBlockState().literalObject(), 2); + FastNMS.INSTANCE.method$LevelWriter$setBlock(world, blockPos, customState.cycle(this.litProperty).customBlockState().literalObject(), 2); } } } @@ -102,9 +99,8 @@ public class LampBlockBehavior extends BukkitBlockBehavior { @Override public BlockBehavior create(CustomBlock block, Map arguments) { Property lit = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("lit"), "warning.config.block.behavior.lamp.missing_lit"); - Property powered = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("powered"), "warning.config.block.behavior.lamp.missing_powered"); boolean canOpenWithHand = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("can-open-with-hand", false), "can-open-with-hand"); - return new LampBlockBehavior(block, lit, powered, canOpenWithHand); + return new LampBlockBehavior(block, lit, canOpenWithHand); } } } From 22d5bb7162e600c35ec80e8800d0d5840378bf5f Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Sun, 7 Sep 2025 09:00:23 +0800 Subject: [PATCH 04/18] =?UTF-8?q?feat(bukkit):=20=E6=B7=BB=E5=8A=A0=20Bott?= =?UTF-8?q?omHalfStairsBlockBehavior?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BottomHalfStairsBlockBehavior.java | 128 ++++++++++++++++++ .../block/behavior/BukkitBlockBehaviors.java | 2 + .../src/main/resources/translations/en.yml | 2 + .../src/main/resources/translations/zh_cn.yml | 2 + gradle.properties | 2 +- 5 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BottomHalfStairsBlockBehavior.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BottomHalfStairsBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BottomHalfStairsBlockBehavior.java new file mode 100644 index 000000000..ad4a00690 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BottomHalfStairsBlockBehavior.java @@ -0,0 +1,128 @@ +package net.momirealms.craftengine.bukkit.block.behavior; + +import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MFluids; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.DirectionUtils; +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.Property; +import net.momirealms.craftengine.core.block.state.properties.StairsShape; +import net.momirealms.craftengine.core.item.context.BlockPlaceContext; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.HorizontalDirection; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.world.BlockPos; + +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.Callable; + +public class BottomHalfStairsBlockBehavior extends BukkitBlockBehavior { + public static final Factory FACTORY = new Factory(); + private final Property facingProperty; + private final Property shapeProperty; + + public BottomHalfStairsBlockBehavior(CustomBlock block, Property facing, Property shape) { + super(block); + this.facingProperty = facing; + this.shapeProperty = shape; + } + + @Override + public ImmutableBlockState updateStateForPlacement(BlockPlaceContext context, ImmutableBlockState state) { + BlockPos clickedPos = context.getClickedPos(); + ImmutableBlockState blockState = state.owner().value().defaultState() + .with(this.facingProperty, context.getHorizontalDirection().toHorizontalDirection()); + if (super.waterloggedProperty != null) { + Object fluidState = FastNMS.INSTANCE.method$BlockGetter$getFluidState(context.getLevel().serverWorld(), LocationUtils.toBlockPos(clickedPos)); + blockState = blockState.with(this.waterloggedProperty, FastNMS.INSTANCE.method$FluidState$getType(fluidState) == MFluids.WATER); + } + return blockState.with(this.shapeProperty, getStairsShape(blockState, context.getLevel().serverWorld(), clickedPos)); + } + + @Override + public Object updateShape(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object level = args[updateShape$level]; + Object blockPos = args[updateShape$blockPos]; + Object blockState = args[0]; + Optional optionalCustomState = BlockStateUtils.getOptionalCustomBlockState(blockState); + if (optionalCustomState.isEmpty()) return blockState; + ImmutableBlockState customState = optionalCustomState.get(); + if (super.waterloggedProperty != null && customState.get(this.waterloggedProperty)) { + FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleFluidTick(args[updateShape$level], args[updateShape$blockPos], MFluids.WATER, 5); + } + Direction direction = DirectionUtils.fromNMSDirection(VersionHelper.isOrAbove1_21_2() ? args[4] : args[1]); + StairsShape stairsShape = getStairsShape(customState, level, LocationUtils.fromBlockPos(blockPos)); + return direction.axis().isHorizontal() + ? customState.with(this.shapeProperty, stairsShape).customBlockState().literalObject() + : superMethod.call(); + } + + private StairsShape getStairsShape(ImmutableBlockState state, Object level, BlockPos pos) { + Direction direction = state.get(this.facingProperty).toDirection(); + Object relativeBlockState1 = FastNMS.INSTANCE.method$BlockGetter$getBlockState(level, LocationUtils.toBlockPos(pos.relative(direction))); + Optional optionalCustomState1 = BlockStateUtils.getOptionalCustomBlockState(relativeBlockState1); + if (optionalCustomState1.isPresent()) { + ImmutableBlockState customState1 = optionalCustomState1.get(); + Optional optionalStairsBlockBehavior = customState1.behavior().getAs(BottomHalfStairsBlockBehavior.class); + if (optionalStairsBlockBehavior.isPresent()) { + BottomHalfStairsBlockBehavior stairsBlockBehavior = optionalStairsBlockBehavior.get(); + Direction direction1 = customState1.get(stairsBlockBehavior.facingProperty).toDirection(); + if (direction1.axis() != state.get(this.facingProperty).toDirection().axis() && canTakeShape(state, level, pos, direction1.opposite())) { + if (direction1 == direction.counterClockWise()) { + return StairsShape.OUTER_LEFT; + } + return StairsShape.OUTER_RIGHT; + } + } + } + Object relativeBlockState2 = FastNMS.INSTANCE.method$BlockGetter$getBlockState(level, LocationUtils.toBlockPos(pos.relative(direction.opposite()))); + Optional optionalCustomState2 = BlockStateUtils.getOptionalCustomBlockState(relativeBlockState2); + if (optionalCustomState2.isPresent()) { + ImmutableBlockState customState2 = optionalCustomState2.get(); + Optional optionalStairsBlockBehavior = customState2.behavior().getAs(BottomHalfStairsBlockBehavior.class); + if (optionalStairsBlockBehavior.isPresent()) { + BottomHalfStairsBlockBehavior stairsBlockBehavior = optionalStairsBlockBehavior.get(); + Direction direction2 = customState2.get(stairsBlockBehavior.facingProperty).toDirection(); + if (direction2.axis() != state.get(this.facingProperty).toDirection().axis() && canTakeShape(state, level, pos, direction2)) { + if (direction2 == direction.counterClockWise()) { + return StairsShape.INNER_LEFT; + } + return StairsShape.INNER_RIGHT; + } + } + } + return StairsShape.STRAIGHT; + } + + private boolean canTakeShape(ImmutableBlockState state, Object level, BlockPos pos, Direction face) { + Object blockState = FastNMS.INSTANCE.method$BlockGetter$getBlockState(level, LocationUtils.toBlockPos(pos.relative(face))); + Optional optionalAnotherState = BlockStateUtils.getOptionalCustomBlockState(blockState); + if (optionalAnotherState.isEmpty()) { + return true; + } + ImmutableBlockState anotherState = optionalAnotherState.get(); + Optional optionalBehavior = anotherState.behavior().getAs(BottomHalfStairsBlockBehavior.class); + if (optionalBehavior.isEmpty()) { + return true; + } + BottomHalfStairsBlockBehavior anotherBehavior = optionalBehavior.get(); + return anotherState.get(anotherBehavior.facingProperty) != state.get(this.facingProperty); + } + + public static class Factory implements BlockBehaviorFactory { + + @Override + @SuppressWarnings("unchecked") + public BlockBehavior create(CustomBlock block, Map arguments) { + Property facing = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("facing"), "warning.config.block.behavior.bottom_half_stairs.missing_facing"); + Property shape = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("shape"), "warning.config.block.behavior.bottom_half_stairs.missing_shape"); + return new BottomHalfStairsBlockBehavior(block, facing, shape); + } + } +} 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 4a622ed7a..5062787f0 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 @@ -30,6 +30,7 @@ public class BukkitBlockBehaviors extends BlockBehaviors { public static final Key CHANGE_OVER_TIME_BLOCK = Key.from("craftengine:change_over_time_block"); public static final Key SIMPLE_STORAGE_BLOCK = Key.from("craftengine:simple_storage_block"); public static final Key TOGGLEABLE_LAMP_BLOCK = Key.from("craftengine:toggleable_lamp_block"); + public static final Key BOTTOM_HALF_STAIRS_BLOCK = Key.from("craftengine:bottom_half_stairs_block"); public static void init() { register(EMPTY, (block, args) -> EmptyBlockBehavior.INSTANCE); @@ -58,5 +59,6 @@ public class BukkitBlockBehaviors extends BlockBehaviors { register(CHANGE_OVER_TIME_BLOCK, ChangeOverTimeBlockBehavior.FACTORY); register(SIMPLE_STORAGE_BLOCK, SimpleStorageBlockBehavior.FACTORY); register(TOGGLEABLE_LAMP_BLOCK, ToggleableLampBlockBehavior.FACTORY); + register(BOTTOM_HALF_STAIRS_BLOCK, BottomHalfStairsBlockBehavior.FACTORY); } } diff --git a/common-files/src/main/resources/translations/en.yml b/common-files/src/main/resources/translations/en.yml index 2b7c873da..79ee371ca 100644 --- a/common-files/src/main/resources/translations/en.yml +++ b/common-files/src/main/resources/translations/en.yml @@ -305,6 +305,8 @@ warning.config.block.behavior.slab.missing_type: "Issue found in file Issue found in file - The block '' is missing the required 'facing' property for 'stairs_block' behavior." warning.config.block.behavior.stairs.missing_half: "Issue found in file - The block '' is missing the required 'half' property for 'stairs_block' behavior." warning.config.block.behavior.stairs.missing_shape: "Issue found in file - The block '' is missing the required 'shape' property for 'stairs_block' behavior." +warning.config.block.behavior.bottom_half_stairs.missing_facing: "Issue found in file - The block '' is missing the required 'facing' property for 'bottom_half_stairs_block' behavior." +warning.config.block.behavior.bottom_half_stairs.missing_shape: "Issue found in file - The block '' is missing the required 'shape' property for 'bottom_half_stairs_block' behavior." warning.config.block.behavior.pressure_plate.missing_powered: "Issue found in file - The block '' is missing the required 'powered' property for 'pressure_plate_block' behavior." warning.config.block.behavior.grass.missing_feature: "Issue found in file - The block '' is missing the required 'feature' argument for 'grass_block' behavior." warning.config.block.behavior.double_high.missing_half: "Issue found in file - The block '' is missing the required 'half' property for 'double_block' behavior." diff --git a/common-files/src/main/resources/translations/zh_cn.yml b/common-files/src/main/resources/translations/zh_cn.yml index fe5b6fb32..1df5b5430 100644 --- a/common-files/src/main/resources/translations/zh_cn.yml +++ b/common-files/src/main/resources/translations/zh_cn.yml @@ -305,6 +305,8 @@ warning.config.block.behavior.slab.missing_type: "在文件 发 warning.config.block.behavior.stairs.missing_facing: "在文件 发现问题 - 方块 '' 的 'stairs_block' 行为缺少必需的 'facing' 属性" warning.config.block.behavior.stairs.missing_half: "在文件 发现问题 - 方块 '' 的 'stairs_block' 行为缺少必需的 'half' 属性" warning.config.block.behavior.stairs.missing_shape: "在文件 发现问题 - 方块 '' 的 'stairs_block' 行为缺少必需的 'shape' 属性" +warning.config.block.behavior.bottom_half_stairs.missing_facing: "在文件 发现问题 - 方块 '' 的 'bottom_half_stairs_block' 行为缺少必需的 'facing' 属性" +warning.config.block.behavior.bottom_half_stairs.missing_shape: "在文件 发现问题 - 方块 '' 的 'bottom_half_stairs_block' 行为缺少必需的 'shape' 属性" warning.config.block.behavior.pressure_plate.missing_powered: "在文件 发现问题 - 方块 '' 的 'pressure_plate_block' 行为缺少必需的 'powered' 属性" warning.config.block.behavior.grass.missing_feature: "在文件 发现问题 - 方块 '' 的 'grass_block' 行为缺少必需的 'feature' 参数" warning.config.block.behavior.double_high.missing_half: "在文件 发现问题 - 方块 '' 的 'double_block' 行为缺少必需的 'half' 属性" diff --git a/gradle.properties b/gradle.properties index 7f34bd693..bd5f82cca 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.jvmargs=-Xmx1G # Rule: [major update].[feature update].[bug fix] project_version=0.0.62.15 config_version=45 -lang_version=25 +lang_version=26 project_group=net.momirealms latest_supported_version=1.21.8 From ea6148cef09d0d1abd1b0eecff19ecc9ff1fc95c Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Sun, 7 Sep 2025 13:19:57 +0800 Subject: [PATCH 05/18] =?UTF-8?q?fix(build):=20=E8=A1=A5=E5=85=85=E6=BC=8F?= =?UTF-8?q?=E6=8E=89=E7=9A=84=E8=BD=AF=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/paper-loader/build.gradle.kts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bukkit/paper-loader/build.gradle.kts b/bukkit/paper-loader/build.gradle.kts index 94abf7189..0e848216c 100644 --- a/bukkit/paper-loader/build.gradle.kts +++ b/bukkit/paper-loader/build.gradle.kts @@ -86,6 +86,9 @@ paper { register("MythicMobs") { required = false } register("CustomFishing") { required = false } register("Zaphkiel") { required = false } + register("HeadDatabase") { required = false } + register("SX-Item") { required = false } + register("Slimefun") { required = false } // leveler register("AuraSkills") { required = false } From a4a812d14f69c1aee88c7405fe065ad97154aaf4 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 8 Sep 2025 19:49:18 +0800 Subject: [PATCH 06/18] =?UTF-8?q?feat(bukkit):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=B2=99=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../block/behavior/BukkitBlockBehaviors.java | 4 +- .../block/behavior/LampBlockBehavior.java | 34 +- ...ckBehavior.java => SofaBlockBehavior.java} | 64 ++-- .../behavior/ToggleableLampBlockBehavior.java | 29 +- .../main/resources/additional-real-blocks.yml | 2 +- .../default/configuration/blocks.yml | 347 ++++++++++++++++++ .../default/configuration/categories.yml | 7 +- .../resources/default/configuration/i18n.yml | 2 + .../minecraft/models/block/custom/sofa.json | 118 ++++++ .../models/item/custom/sofa_inner.json | 144 ++++++++ .../models/item/custom/sofa_straight.json | 132 +++++++ .../minecraft/textures/item/custom/sofa.png | Bin 0 -> 1663 bytes .../src/main/resources/translations/en.yml | 4 +- .../src/main/resources/translations/zh_cn.yml | 4 +- .../core/block/properties/Properties.java | 3 + .../block/state/properties/SofaShape.java | 7 + .../core/pack/AbstractPackManager.java | 4 + 17 files changed, 823 insertions(+), 82 deletions(-) rename bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/{BottomHalfStairsBlockBehavior.java => SofaBlockBehavior.java} (56%) create mode 100644 common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/sofa.json create mode 100644 common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_inner.json create mode 100644 common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_straight.json create mode 100644 common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/sofa.png create mode 100644 core/src/main/java/net/momirealms/craftengine/core/block/state/properties/SofaShape.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 5062787f0..71f3de6ed 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 @@ -30,7 +30,7 @@ public class BukkitBlockBehaviors extends BlockBehaviors { public static final Key CHANGE_OVER_TIME_BLOCK = Key.from("craftengine:change_over_time_block"); public static final Key SIMPLE_STORAGE_BLOCK = Key.from("craftengine:simple_storage_block"); public static final Key TOGGLEABLE_LAMP_BLOCK = Key.from("craftengine:toggleable_lamp_block"); - public static final Key BOTTOM_HALF_STAIRS_BLOCK = Key.from("craftengine:bottom_half_stairs_block"); + public static final Key SOFA_BLOCK = Key.from("craftengine:sofa_block"); public static void init() { register(EMPTY, (block, args) -> EmptyBlockBehavior.INSTANCE); @@ -59,6 +59,6 @@ public class BukkitBlockBehaviors extends BlockBehaviors { register(CHANGE_OVER_TIME_BLOCK, ChangeOverTimeBlockBehavior.FACTORY); register(SIMPLE_STORAGE_BLOCK, SimpleStorageBlockBehavior.FACTORY); register(TOGGLEABLE_LAMP_BLOCK, ToggleableLampBlockBehavior.FACTORY); - register(BOTTOM_HALF_STAIRS_BLOCK, BottomHalfStairsBlockBehavior.FACTORY); + register(SOFA_BLOCK, SofaBlockBehavior.FACTORY); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java index cd46e8ff8..432837793 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java @@ -1,7 +1,6 @@ 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.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.core.block.BlockBehavior; @@ -9,9 +8,7 @@ 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.Property; -import net.momirealms.craftengine.core.entity.player.InteractionResult; import net.momirealms.craftengine.core.item.context.BlockPlaceContext; -import net.momirealms.craftengine.core.item.context.UseOnContext; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; @@ -22,34 +19,14 @@ import java.util.concurrent.Callable; public class LampBlockBehavior extends BukkitBlockBehavior { public static final Factory FACTORY = new Factory(); private final Property litProperty; - private final boolean canOpenWithHand; - public LampBlockBehavior(CustomBlock block, Property litProperty, boolean canOpenWithHand) { + public LampBlockBehavior(CustomBlock block, Property litProperty) { super(block); this.litProperty = litProperty; - this.canOpenWithHand = canOpenWithHand; - } - - @Override - public InteractionResult useWithoutItem(UseOnContext context, ImmutableBlockState state) { - if (!this.canOpenWithHand) { - return InteractionResult.PASS; - } - LampBlockBehavior behavior = state.behavior().getAs(LampBlockBehavior.class).orElse(null); - if (behavior == null) return InteractionResult.PASS; - FastNMS.INSTANCE.method$LevelWriter$setBlock( - context.getLevel().serverWorld(), - LocationUtils.toBlockPos(context.getClickedPos()), - state.cycle(behavior.litProperty).customBlockState().literalObject(), - 2 - ); - Optional.ofNullable(context.getPlayer()).ifPresent(p -> p.swingHand(context.getHand())); - return InteractionResult.SUCCESS_AND_CANCEL; } @Override public ImmutableBlockState updateStateForPlacement(BlockPlaceContext context, ImmutableBlockState state) { - if (this.canOpenWithHand) return state; Object level = context.getLevel().serverWorld(); state = state.with(this.litProperty, FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(level, LocationUtils.toBlockPos(context.getClickedPos()))); return state; @@ -58,10 +35,9 @@ public class LampBlockBehavior extends BukkitBlockBehavior { @Override public void tick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { Object blockState = args[0]; - Object world = args[1]; - if (this.canOpenWithHand || !CoreReflections.clazz$ServerLevel.isInstance(world)) return; Optional optionalCustomState = BlockStateUtils.getOptionalCustomBlockState(blockState); if (optionalCustomState.isEmpty()) return; + Object world = args[1]; Object blockPos = args[2]; ImmutableBlockState customState = optionalCustomState.get(); if (customState.get(this.litProperty) && !FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(world, blockPos)) { @@ -75,10 +51,9 @@ public class LampBlockBehavior extends BukkitBlockBehavior { @Override public void neighborChanged(Object thisBlock, Object[] args, Callable superMethod) { Object blockState = args[0]; - Object world = args[1]; - if (this.canOpenWithHand || !CoreReflections.clazz$ServerLevel.isInstance(world)) return; Optional optionalCustomState = BlockStateUtils.getOptionalCustomBlockState(blockState); if (optionalCustomState.isEmpty()) return; + Object world = args[1]; Object blockPos = args[2]; ImmutableBlockState customState = optionalCustomState.get(); boolean lit = customState.get(this.litProperty); @@ -99,8 +74,7 @@ public class LampBlockBehavior extends BukkitBlockBehavior { @Override public BlockBehavior create(CustomBlock block, Map arguments) { Property lit = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("lit"), "warning.config.block.behavior.lamp.missing_lit"); - boolean canOpenWithHand = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("can-open-with-hand", false), "can-open-with-hand"); - return new LampBlockBehavior(block, lit, canOpenWithHand); + return new LampBlockBehavior(block, lit); } } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BottomHalfStairsBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SofaBlockBehavior.java similarity index 56% rename from bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BottomHalfStairsBlockBehavior.java rename to bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SofaBlockBehavior.java index ad4a00690..7d7498c36 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BottomHalfStairsBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SofaBlockBehavior.java @@ -10,7 +10,7 @@ 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.Property; -import net.momirealms.craftengine.core.block.state.properties.StairsShape; +import net.momirealms.craftengine.core.block.state.properties.SofaShape; import net.momirealms.craftengine.core.item.context.BlockPlaceContext; import net.momirealms.craftengine.core.util.Direction; import net.momirealms.craftengine.core.util.HorizontalDirection; @@ -22,12 +22,12 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.Callable; -public class BottomHalfStairsBlockBehavior extends BukkitBlockBehavior { +public class SofaBlockBehavior extends BukkitBlockBehavior { public static final Factory FACTORY = new Factory(); private final Property facingProperty; - private final Property shapeProperty; + private final Property shapeProperty; - public BottomHalfStairsBlockBehavior(CustomBlock block, Property facing, Property shape) { + public SofaBlockBehavior(CustomBlock block, Property facing, Property shape) { super(block); this.facingProperty = facing; this.shapeProperty = shape; @@ -42,7 +42,7 @@ public class BottomHalfStairsBlockBehavior extends BukkitBlockBehavior { Object fluidState = FastNMS.INSTANCE.method$BlockGetter$getFluidState(context.getLevel().serverWorld(), LocationUtils.toBlockPos(clickedPos)); blockState = blockState.with(this.waterloggedProperty, FastNMS.INSTANCE.method$FluidState$getType(fluidState) == MFluids.WATER); } - return blockState.with(this.shapeProperty, getStairsShape(blockState, context.getLevel().serverWorld(), clickedPos)); + return blockState.with(this.shapeProperty, getSofaShape(blockState, context.getLevel().serverWorld(), clickedPos)); } @Override @@ -57,47 +57,31 @@ public class BottomHalfStairsBlockBehavior extends BukkitBlockBehavior { FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleFluidTick(args[updateShape$level], args[updateShape$blockPos], MFluids.WATER, 5); } Direction direction = DirectionUtils.fromNMSDirection(VersionHelper.isOrAbove1_21_2() ? args[4] : args[1]); - StairsShape stairsShape = getStairsShape(customState, level, LocationUtils.fromBlockPos(blockPos)); + SofaShape sofaShape = getSofaShape(customState, level, LocationUtils.fromBlockPos(blockPos)); return direction.axis().isHorizontal() - ? customState.with(this.shapeProperty, stairsShape).customBlockState().literalObject() + ? customState.with(this.shapeProperty, sofaShape).customBlockState().literalObject() : superMethod.call(); } - private StairsShape getStairsShape(ImmutableBlockState state, Object level, BlockPos pos) { + private SofaShape getSofaShape(ImmutableBlockState state, Object level, BlockPos pos) { Direction direction = state.get(this.facingProperty).toDirection(); - Object relativeBlockState1 = FastNMS.INSTANCE.method$BlockGetter$getBlockState(level, LocationUtils.toBlockPos(pos.relative(direction))); - Optional optionalCustomState1 = BlockStateUtils.getOptionalCustomBlockState(relativeBlockState1); - if (optionalCustomState1.isPresent()) { - ImmutableBlockState customState1 = optionalCustomState1.get(); - Optional optionalStairsBlockBehavior = customState1.behavior().getAs(BottomHalfStairsBlockBehavior.class); + Object relativeBlockState = FastNMS.INSTANCE.method$BlockGetter$getBlockState(level, LocationUtils.toBlockPos(pos.relative(direction.opposite()))); + Optional optionalCustomState = BlockStateUtils.getOptionalCustomBlockState(relativeBlockState); + if (optionalCustomState.isPresent()) { + ImmutableBlockState customState = optionalCustomState.get(); + Optional optionalStairsBlockBehavior = customState.behavior().getAs(SofaBlockBehavior.class); if (optionalStairsBlockBehavior.isPresent()) { - BottomHalfStairsBlockBehavior stairsBlockBehavior = optionalStairsBlockBehavior.get(); - Direction direction1 = customState1.get(stairsBlockBehavior.facingProperty).toDirection(); - if (direction1.axis() != state.get(this.facingProperty).toDirection().axis() && canTakeShape(state, level, pos, direction1.opposite())) { + SofaBlockBehavior stairsBlockBehavior = optionalStairsBlockBehavior.get(); + Direction direction1 = customState.get(stairsBlockBehavior.facingProperty).toDirection(); + if (direction1.axis() != state.get(this.facingProperty).toDirection().axis() && canTakeShape(state, level, pos, direction1)) { if (direction1 == direction.counterClockWise()) { - return StairsShape.OUTER_LEFT; + return SofaShape.INNER_LEFT; } - return StairsShape.OUTER_RIGHT; + return SofaShape.INNER_RIGHT; } } } - Object relativeBlockState2 = FastNMS.INSTANCE.method$BlockGetter$getBlockState(level, LocationUtils.toBlockPos(pos.relative(direction.opposite()))); - Optional optionalCustomState2 = BlockStateUtils.getOptionalCustomBlockState(relativeBlockState2); - if (optionalCustomState2.isPresent()) { - ImmutableBlockState customState2 = optionalCustomState2.get(); - Optional optionalStairsBlockBehavior = customState2.behavior().getAs(BottomHalfStairsBlockBehavior.class); - if (optionalStairsBlockBehavior.isPresent()) { - BottomHalfStairsBlockBehavior stairsBlockBehavior = optionalStairsBlockBehavior.get(); - Direction direction2 = customState2.get(stairsBlockBehavior.facingProperty).toDirection(); - if (direction2.axis() != state.get(this.facingProperty).toDirection().axis() && canTakeShape(state, level, pos, direction2)) { - if (direction2 == direction.counterClockWise()) { - return StairsShape.INNER_LEFT; - } - return StairsShape.INNER_RIGHT; - } - } - } - return StairsShape.STRAIGHT; + return SofaShape.STRAIGHT; } private boolean canTakeShape(ImmutableBlockState state, Object level, BlockPos pos, Direction face) { @@ -107,11 +91,11 @@ public class BottomHalfStairsBlockBehavior extends BukkitBlockBehavior { return true; } ImmutableBlockState anotherState = optionalAnotherState.get(); - Optional optionalBehavior = anotherState.behavior().getAs(BottomHalfStairsBlockBehavior.class); + Optional optionalBehavior = anotherState.behavior().getAs(SofaBlockBehavior.class); if (optionalBehavior.isEmpty()) { return true; } - BottomHalfStairsBlockBehavior anotherBehavior = optionalBehavior.get(); + SofaBlockBehavior anotherBehavior = optionalBehavior.get(); return anotherState.get(anotherBehavior.facingProperty) != state.get(this.facingProperty); } @@ -120,9 +104,9 @@ public class BottomHalfStairsBlockBehavior extends BukkitBlockBehavior { @Override @SuppressWarnings("unchecked") public BlockBehavior create(CustomBlock block, Map arguments) { - Property facing = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("facing"), "warning.config.block.behavior.bottom_half_stairs.missing_facing"); - Property shape = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("shape"), "warning.config.block.behavior.bottom_half_stairs.missing_shape"); - return new BottomHalfStairsBlockBehavior(block, facing, shape); + Property facing = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("facing"), "warning.config.block.behavior.sofa.missing_facing"); + Property shape = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("shape"), "warning.config.block.behavior.sofa.missing_shape"); + return new SofaBlockBehavior(block, facing, shape); } } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ToggleableLampBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ToggleableLampBlockBehavior.java index f47417c55..92894f798 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ToggleableLampBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ToggleableLampBlockBehavior.java @@ -3,11 +3,14 @@ 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.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.Property; +import net.momirealms.craftengine.core.entity.player.InteractionResult; +import net.momirealms.craftengine.core.item.context.UseOnContext; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; @@ -18,15 +21,35 @@ public class ToggleableLampBlockBehavior extends BukkitBlockBehavior { public static final Factory FACTORY = new Factory(); private final Property litProperty; private final Property poweredProperty; + private final boolean canOpenWithHand; - public ToggleableLampBlockBehavior(CustomBlock block, Property litProperty, Property poweredProperty) { + public ToggleableLampBlockBehavior(CustomBlock block, Property litProperty, Property poweredProperty, boolean canOpenWithHand) { super(block); this.litProperty = litProperty; this.poweredProperty = poweredProperty; + this.canOpenWithHand = canOpenWithHand; + } + + @Override + public InteractionResult useWithoutItem(UseOnContext context, ImmutableBlockState state) { + if (!this.canOpenWithHand) { + return InteractionResult.PASS; + } + ToggleableLampBlockBehavior behavior = state.behavior().getAs(ToggleableLampBlockBehavior.class).orElse(null); + if (behavior == null) return InteractionResult.PASS; + FastNMS.INSTANCE.method$LevelWriter$setBlock( + context.getLevel().serverWorld(), + LocationUtils.toBlockPos(context.getClickedPos()), + state.cycle(behavior.litProperty).customBlockState().literalObject(), + 2 + ); + Optional.ofNullable(context.getPlayer()).ifPresent(p -> p.swingHand(context.getHand())); + return InteractionResult.SUCCESS_AND_CANCEL; } @Override public void onPlace(Object thisBlock, Object[] args, Callable superMethod) { + if (this.canOpenWithHand) return; Object state = args[0]; Object level = args[1]; Object pos = args[2]; @@ -40,6 +63,7 @@ public class ToggleableLampBlockBehavior extends BukkitBlockBehavior { @Override public void neighborChanged(Object thisBlock, Object[] args, Callable superMethod) { + if (this.canOpenWithHand) return; Object blockState = args[0]; Object world = args[1]; if (!CoreReflections.clazz$ServerLevel.isInstance(world)) return; @@ -69,7 +93,8 @@ public class ToggleableLampBlockBehavior extends BukkitBlockBehavior { public BlockBehavior create(CustomBlock block, Map arguments) { Property lit = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("lit"), "warning.config.block.behavior.toggleable_lamp.missing_lit"); Property powered = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("powered"), "warning.config.block.behavior.toggleable_lamp.missing_powered"); - return new ToggleableLampBlockBehavior(block, lit, powered); + boolean canOpenWithHand = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("can-open-with-hand", false), "can-open-with-hand"); + return new ToggleableLampBlockBehavior(block, lit, powered, canOpenWithHand); } } } diff --git a/common-files/src/main/resources/additional-real-blocks.yml b/common-files/src/main/resources/additional-real-blocks.yml index 3f92d92f0..afdf2f7ea 100644 --- a/common-files/src/main/resources/additional-real-blocks.yml +++ b/common-files/src/main/resources/additional-real-blocks.yml @@ -81,4 +81,4 @@ minecraft:cherry_fence_gate: 16 minecraft:bamboo_fence_gate: 16 minecraft:crimson_fence_gate: 16 minecraft:warped_fence_gate: 16 -minecraft:cactus: 15 \ No newline at end of file +minecraft:barrier: 24 \ No newline at end of file diff --git a/common-files/src/main/resources/resources/default/configuration/blocks.yml b/common-files/src/main/resources/resources/default/configuration/blocks.yml index 573ed098d..d1fa2dbd4 100644 --- a/common-files/src/main/resources/resources/default/configuration/blocks.yml +++ b/common-files/src/main/resources/resources/default/configuration/blocks.yml @@ -555,6 +555,353 @@ items#misc: facing=west,open=true: appearance: west_open id: 29 + default:sofa: + material: nether_brick + custom-model-data: 3008 + data: + item-name: + model: + type: minecraft:model + path: minecraft:item/custom/sofa + generation: + parent: minecraft:block/custom/sofa + behavior: + type: block_item + block: + loot: + template: default:loot_table/self + settings: + hardness: 2 + resistance: 3 + map-color: 56 + burn-chance: 5 + fire-spread-chance: 20 + burnable: true + is-suffocating: false + is-redstone-conductor: false + push-reaction: BLOCK + instrument: BASS + sounds: + break: minecraft:block.wood.break + fall: minecraft:block.wood.fall + hit: minecraft:block.wood.hit + place: minecraft:block.wood.place + step: minecraft:block.wood.step + states: + properties: + waterlogged: + type: boolean + default: false + appearances: + waterlogged=false: + state: sculk_sensor[power=1,sculk_sensor_phase=inactive,waterlogged=false] + model: + path: minecraft:block/custom/sofa + waterlogged=true: + state: sculk_sensor[power=1,sculk_sensor_phase=inactive,waterlogged=true] + model: + path: minecraft:block/custom/sofa + variants: + waterlogged=false: + appearance: waterlogged=false + id: 0 + waterlogged=true: + appearance: waterlogged=true + id: 1 + + default:connectable_sofa_straight: + material: nether_brick + custom-model-data: 3009 + data: + item-name: + model: + type: minecraft:model + path: minecraft:item/custom/sofa_straight + default:connectable_sofa_inner: + material: nether_brick + custom-model-data: 3010 + data: + item-name: + model: + type: minecraft:model + path: minecraft:item/custom/sofa_inner + default:connectable_sofa: + material: nether_brick + custom-model-data: 3011 + data: + item-name: + model: + type: minecraft:model + path: minecraft:item/custom/sofa_straight + behavior: + type: block_item + block: + loot: + template: default:loot_table/self + settings: + hardness: 2 + resistance: 3 + map-color: 56 + burn-chance: 5 + fire-spread-chance: 20 + burnable: true + is-suffocating: false + is-redstone-conductor: false + push-reaction: BLOCK + instrument: BASS + sounds: + break: minecraft:block.wood.break + fall: minecraft:block.wood.fall + hit: minecraft:block.wood.hit + place: minecraft:block.wood.place + step: minecraft:block.wood.step + behavior: + type: sofa_block + states: + properties: + facing: + type: horizontal_direction + shape: + type: sofa_shape + waterlogged: + type: boolean + default: false + appearances: + facing=east,shape=straight,waterlogged=false: + state: barrier[waterlogged=false] + entity-renderer: + item: default:connectable_sofa_straight + yaw: 90 + facing=north,shape=straight,waterlogged=false: + state: barrier[waterlogged=false] + entity-renderer: + item: default:connectable_sofa_straight + facing=south,shape=straight,waterlogged=false: + state: barrier[waterlogged=false] + entity-renderer: + item: default:connectable_sofa_straight + yaw: 180 + facing=west,shape=straight,waterlogged=false: + state: barrier[waterlogged=false] + entity-renderer: + item: default:connectable_sofa_straight + yaw: 270 + facing=east,shape=straight,waterlogged=true: + state: barrier[waterlogged=true] + entity-renderer: + item: default:connectable_sofa_straight + yaw: 90 + facing=north,shape=straight,waterlogged=true: + state: barrier[waterlogged=true] + entity-renderer: + item: default:connectable_sofa_straight + facing=south,shape=straight,waterlogged=true: + state: barrier[waterlogged=true] + entity-renderer: + item: default:connectable_sofa_straight + yaw: 180 + facing=west,shape=straight,waterlogged=true: + state: barrier[waterlogged=true] + entity-renderer: + item: default:connectable_sofa_straight + yaw: 270 + facing=east,shape=inner_left,waterlogged=false: + state: barrier[waterlogged=false] + entity-renderer: + item: default:connectable_sofa_inner + facing=north,shape=inner_left,waterlogged=false: + state: barrier[waterlogged=false] + entity-renderer: + item: default:connectable_sofa_inner + yaw: 270 + facing=south,shape=inner_left,waterlogged=false: + state: barrier[waterlogged=false] + entity-renderer: + item: default:connectable_sofa_inner + yaw: 90 + facing=west,shape=inner_left,waterlogged=false: + state: barrier[waterlogged=false] + entity-renderer: + item: default:connectable_sofa_inner + yaw: 180 + facing=east,shape=inner_left,waterlogged=true: + state: barrier[waterlogged=true] + entity-renderer: + item: default:connectable_sofa_inner + facing=north,shape=inner_left,waterlogged=true: + state: barrier[waterlogged=true] + entity-renderer: + item: default:connectable_sofa_inner + yaw: 270 + facing=south,shape=inner_left,waterlogged=true: + state: barrier[waterlogged=true] + entity-renderer: + item: default:connectable_sofa_inner + yaw: 90 + facing=west,shape=inner_left,waterlogged=true: + state: barrier[waterlogged=true] + entity-renderer: + item: default:connectable_sofa_inner + yaw: 180 + facing=east,shape=inner_right,waterlogged=false: + state: barrier[waterlogged=false] + entity-renderer: + item: default:connectable_sofa_inner + yaw: 90 + facing=north,shape=inner_right,waterlogged=false: + state: barrier[waterlogged=false] + entity-renderer: + item: default:connectable_sofa_inner + facing=south,shape=inner_right,waterlogged=false: + state: barrier[waterlogged=false] + entity-renderer: + item: default:connectable_sofa_inner + yaw: 180 + facing=west,shape=inner_right,waterlogged=false: + state: barrier[waterlogged=false] + entity-renderer: + item: default:connectable_sofa_inner + yaw: 270 + facing=east,shape=inner_right,waterlogged=true: + state: barrier[waterlogged=true] + entity-renderer: + item: default:connectable_sofa_inner + yaw: 90 + facing=north,shape=inner_right,waterlogged=true: + state: barrier[waterlogged=true] + entity-renderer: + item: default:connectable_sofa_inner + facing=south,shape=inner_right,waterlogged=true: + state: barrier[waterlogged=true] + entity-renderer: + item: default:connectable_sofa_inner + yaw: 180 + facing=west,shape=inner_right,waterlogged=true: + state: barrier[waterlogged=true] + entity-renderer: + item: default:connectable_sofa_inner + yaw: 270 + variants: + facing=east,shape=inner_left,waterlogged=false: + appearance: facing=east,shape=inner_left,waterlogged=false + id: 0 + facing=east,shape=inner_right,waterlogged=false: + appearance: facing=east,shape=inner_right,waterlogged=false + id: 1 + facing=east,shape=straight,waterlogged=false: + appearance: facing=east,shape=straight,waterlogged=false + id: 2 + facing=north,shape=inner_left,waterlogged=false: + appearance: facing=north,shape=inner_left,waterlogged=false + id: 3 + facing=north,shape=inner_right,waterlogged=false: + appearance: facing=north,shape=inner_right,waterlogged=false + id: 4 + facing=north,shape=straight,waterlogged=false: + appearance: facing=north,shape=straight,waterlogged=false + id: 5 + facing=south,shape=inner_left,waterlogged=false: + appearance: facing=south,shape=inner_left,waterlogged=false + id: 6 + facing=south,shape=inner_right,waterlogged=false: + appearance: facing=south,shape=inner_right,waterlogged=false + id: 7 + facing=south,shape=straight,waterlogged=false: + appearance: facing=south,shape=straight,waterlogged=false + id: 8 + facing=west,shape=inner_left,waterlogged=false: + appearance: facing=west,shape=inner_left,waterlogged=false + id: 9 + facing=west,shape=inner_right,waterlogged=false: + appearance: facing=west,shape=inner_right,waterlogged=false + id: 10 + facing=west,shape=straight,waterlogged=false: + appearance: facing=west,shape=straight,waterlogged=false + id: 11 + facing=east,shape=inner_left,waterlogged=true: + appearance: facing=east,shape=inner_left,waterlogged=true + id: 12 + settings: + resistance: 1200.0 + burnable: false + fluid-state: water + facing=east,shape=inner_right,waterlogged=true: + appearance: facing=east,shape=inner_right,waterlogged=true + id: 13 + settings: + resistance: 1200.0 + burnable: false + fluid-state: water + facing=east,shape=straight,waterlogged=true: + appearance: facing=east,shape=straight,waterlogged=true + id: 14 + settings: + resistance: 1200.0 + burnable: false + fluid-state: water + facing=north,shape=inner_left,waterlogged=true: + appearance: facing=north,shape=inner_left,waterlogged=true + id: 15 + settings: + resistance: 1200.0 + burnable: false + fluid-state: water + facing=north,shape=inner_right,waterlogged=true: + appearance: facing=north,shape=inner_right,waterlogged=true + id: 16 + settings: + resistance: 1200.0 + burnable: false + fluid-state: water + facing=north,shape=straight,waterlogged=true: + appearance: facing=north,shape=straight,waterlogged=true + id: 17 + settings: + resistance: 1200.0 + burnable: false + fluid-state: water + facing=south,shape=inner_left,waterlogged=true: + appearance: facing=south,shape=inner_left,waterlogged=true + id: 18 + settings: + resistance: 1200.0 + burnable: false + fluid-state: water + facing=south,shape=inner_right,waterlogged=true: + appearance: facing=south,shape=inner_right,waterlogged=true + id: 19 + settings: + resistance: 1200.0 + burnable: false + fluid-state: water + facing=south,shape=straight,waterlogged=true: + appearance: facing=south,shape=straight,waterlogged=true + id: 20 + settings: + resistance: 1200.0 + burnable: false + fluid-state: water + facing=west,shape=inner_left,waterlogged=true: + appearance: facing=west,shape=inner_left,waterlogged=true + id: 21 + settings: + resistance: 1200.0 + burnable: false + fluid-state: water + facing=west,shape=inner_right,waterlogged=true: + appearance: facing=west,shape=inner_right,waterlogged=true + id: 22 + settings: + resistance: 1200.0 + burnable: false + fluid-state: water + facing=west,shape=straight,waterlogged=true: + appearance: facing=west,shape=straight,waterlogged=true + id: 23 + settings: + resistance: 1200.0 + burnable: false + fluid-state: water recipes#misc: default:chinese_lantern: type: shaped diff --git a/common-files/src/main/resources/resources/default/configuration/categories.yml b/common-files/src/main/resources/resources/default/configuration/categories.yml index abe2f99fd..8614b02f7 100644 --- a/common-files/src/main/resources/resources/default/configuration/categories.yml +++ b/common-files/src/main/resources/resources/default/configuration/categories.yml @@ -72,11 +72,12 @@ categories: - default:solid_gunpowder_block - default:ender_pearl_flower_seeds - default:gui_head_size_1 - - default:gui_head_size_4 - - minecraft:air - default:copper_coil - default:flame_elytra - default:cap - default:pebble - default:chessboard_block - - default:safe_block \ No newline at end of file + - default:safe_block + - default:sofa + - default:connectable_sofa + - default:gui_head_size_4 \ No newline at end of file diff --git a/common-files/src/main/resources/resources/default/configuration/i18n.yml b/common-files/src/main/resources/resources/default/configuration/i18n.yml index cf3e1cb2e..6af2e7556 100644 --- a/common-files/src/main/resources/resources/default/configuration/i18n.yml +++ b/common-files/src/main/resources/resources/default/configuration/i18n.yml @@ -47,6 +47,7 @@ i18n: item.flower_basket: Flower Basket item.chessboard_block: Chessboard Block item.safe_block: Safe Block + item.sofa: Sofa category.default.name: Default Assets category.default.lore: Contains the default configuration of CraftEngine category.palm_tree: Palm Tree @@ -104,6 +105,7 @@ i18n: item.flower_basket: 花篮 item.chessboard_block: 棋盘方块 item.safe_block: 保险柜 + item.sofa: 沙发 category.default.name: 默认资产 category.default.lore: 包含了CraftEngine的默认配置 category.palm_tree: 棕榈树 diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/sofa.json b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/sofa.json new file mode 100644 index 000000000..07bbf9eaa --- /dev/null +++ b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/sofa.json @@ -0,0 +1,118 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "item/custom/sofa", + "particle": "item/custom/sofa" + }, + "elements": [ + { + "from": [1, 0, 1], + "to": [3, 3, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 0, 1]}, + "faces": { + "north": {"uv": [14.5, 15.25, 15, 16], "texture": "#0"}, + "east": {"uv": [15, 15.25, 15.5, 16], "texture": "#0"}, + "south": {"uv": [15, 15.25, 15.5, 16], "texture": "#0"}, + "west": {"uv": [15, 15.25, 14.5, 16], "texture": "#0"}, + "up": {"uv": [16, 15.5, 15.5, 15], "texture": "#0"}, + "down": {"uv": [16, 15.5, 15.5, 16], "texture": "#0"} + } + }, + { + "from": [13, 0, 1], + "to": [15, 3, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 0, 1]}, + "faces": { + "north": {"uv": [15, 15.25, 14.5, 16], "texture": "#0"}, + "east": {"uv": [14.5, 15.25, 15, 16], "texture": "#0"}, + "south": {"uv": [15.5, 15.25, 15, 16], "texture": "#0"}, + "west": {"uv": [15.5, 15.25, 15, 16], "texture": "#0"}, + "up": {"uv": [15.5, 15.5, 16, 15], "texture": "#0"}, + "down": {"uv": [15.5, 15.5, 16, 16], "texture": "#0"} + } + }, + { + "from": [13, 0, 13], + "to": [15, 3, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 0, 15]}, + "faces": { + "north": {"uv": [15, 15.25, 15.5, 16], "texture": "#0"}, + "east": {"uv": [15, 15.25, 14.5, 16], "texture": "#0"}, + "south": {"uv": [14.5, 15.25, 15, 16], "texture": "#0"}, + "west": {"uv": [15, 15.25, 15.5, 16], "texture": "#0"}, + "up": {"uv": [15.5, 15, 16, 15.5], "texture": "#0"}, + "down": {"uv": [15.5, 16, 16, 15.5], "texture": "#0"} + } + }, + { + "from": [1, 0, 13], + "to": [3, 3, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 0, 15]}, + "faces": { + "north": {"uv": [15.5, 15.25, 15, 16], "texture": "#0"}, + "east": {"uv": [15.5, 15.25, 15, 16], "texture": "#0"}, + "south": {"uv": [15, 15.25, 14.5, 16], "texture": "#0"}, + "west": {"uv": [14.5, 15.25, 15, 16], "texture": "#0"}, + "up": {"uv": [16, 15, 15.5, 15.5], "texture": "#0"}, + "down": {"uv": [16, 16, 15.5, 15.5], "texture": "#0"} + } + }, + { + "from": [0.01, 2.51, 0.01], + "to": [15.99, 8.49, 15.99], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, + "faces": { + "north": {"uv": [4, 11.5, 8, 13], "texture": "#0"}, + "east": {"uv": [8, 11.5, 4, 13], "texture": "#0"}, + "south": {"uv": [4, 11.5, 8, 13], "texture": "#0"}, + "west": {"uv": [4, 11.5, 8, 13], "texture": "#0"}, + "up": {"uv": [4, 4, 0, 0], "texture": "#0"}, + "down": {"uv": [4, 12, 0, 16], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [60, -34, 0], + "translation": [-0.5, 3, 0.25], + "scale": [0.25, 0.25, 0.25] + }, + "thirdperson_lefthand": { + "rotation": [60, -34, 0], + "translation": [-0.5, 3, 0.25], + "scale": [0.25, 0.25, 0.25] + }, + "firstperson_righthand": { + "rotation": [0, 180, 0], + "translation": [0.5, 0.5, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "rotation": [0, 180, 0], + "translation": [0.5, 0.5, 0], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "translation": [0, 2.75, 0], + "scale": [0.35, 0.35, 0.35] + }, + "gui": { + "rotation": [25, -135, 0], + "translation": [0.25, -1, 0], + "scale": [0.5, 0.5, 0.5] + }, + "fixed": { + "rotation": [-90, 0, 0], + "translation": [0, 0, -16], + "scale": [2, 2, 2] + } + }, + "groups": [ + { + "name": "group", + "origin": [0, 0, 0], + "color": 0, + "children": [0, 1, 2, 3, 4] + } + ] +} \ No newline at end of file diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_inner.json b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_inner.json new file mode 100644 index 000000000..595bdfb4f --- /dev/null +++ b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_inner.json @@ -0,0 +1,144 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "item/custom/sofa", + "particle": "item/custom/sofa" + }, + "elements": [ + { + "from": [1, 0, 1], + "to": [3, 3, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 0, 1]}, + "faces": { + "north": {"uv": [14.5, 15.25, 15, 16], "texture": "#0"}, + "east": {"uv": [15, 15.25, 15.5, 16], "texture": "#0"}, + "south": {"uv": [15, 15.25, 15.5, 16], "texture": "#0"}, + "west": {"uv": [15, 15.25, 14.5, 16], "texture": "#0"}, + "up": {"uv": [16, 15.5, 15.5, 15], "texture": "#0"}, + "down": {"uv": [16, 15.5, 15.5, 16], "texture": "#0"} + } + }, + { + "from": [13, 0, 1], + "to": [15, 3, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 0, 1]}, + "faces": { + "north": {"uv": [15, 15.25, 14.5, 16], "texture": "#0"}, + "east": {"uv": [14.5, 15.25, 15, 16], "texture": "#0"}, + "south": {"uv": [15.5, 15.25, 15, 16], "texture": "#0"}, + "west": {"uv": [15.5, 15.25, 15, 16], "texture": "#0"}, + "up": {"uv": [15.5, 15.5, 16, 15], "texture": "#0"}, + "down": {"uv": [15.5, 15.5, 16, 16], "texture": "#0"} + } + }, + { + "from": [13, 0, 13], + "to": [15, 3, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 0, 15]}, + "faces": { + "north": {"uv": [15, 15.25, 15.5, 16], "texture": "#0"}, + "east": {"uv": [15, 15.25, 14.5, 16], "texture": "#0"}, + "south": {"uv": [14.5, 15.25, 15, 16], "texture": "#0"}, + "west": {"uv": [15, 15.25, 15.5, 16], "texture": "#0"}, + "up": {"uv": [15.5, 15, 16, 15.5], "texture": "#0"}, + "down": {"uv": [15.5, 16, 16, 15.5], "texture": "#0"} + } + }, + { + "from": [1, 0, 13], + "to": [3, 3, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 0, 15]}, + "faces": { + "north": {"uv": [15.5, 15.25, 15, 16], "texture": "#0"}, + "east": {"uv": [15.5, 15.25, 15, 16], "texture": "#0"}, + "south": {"uv": [15, 15.25, 14.5, 16], "texture": "#0"}, + "west": {"uv": [14.5, 15.25, 15, 16], "texture": "#0"}, + "up": {"uv": [16, 15, 15.5, 15.5], "texture": "#0"}, + "down": {"uv": [16, 16, 15.5, 15.5], "texture": "#0"} + } + }, + { + "from": [0.01, 2.51, 0.01], + "to": [15.99, 8.49, 15.99], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, + "faces": { + "north": {"uv": [4, 11.5, 8, 13], "texture": "#0"}, + "east": {"uv": [8, 14.5, 4, 16], "texture": "#0"}, + "south": {"uv": [4, 13, 8, 14.5], "texture": "#0"}, + "west": {"uv": [4, 14.5, 8, 16], "texture": "#0"}, + "up": {"uv": [4, 8, 0, 4], "texture": "#0"}, + "down": {"uv": [4, 12, 0, 16], "texture": "#0"} + } + }, + { + "from": [0.02, 6.02, 12.02], + "to": [15.98, 19.98, 15.98], + "rotation": {"angle": 22.5, "axis": "x", "origin": [7, 8, 14]}, + "faces": { + "north": {"uv": [13, 8.5, 9, 12], "texture": "#0"}, + "east": {"uv": [8, 12.5, 9, 16], "texture": "#0"}, + "south": {"uv": [9, 12.5, 13, 16], "texture": "#0"}, + "west": {"uv": [9, 12.5, 8, 16], "texture": "#0"}, + "up": {"uv": [9, 12, 8, 8.5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [7.75, 10.5, 4.25, 11.5], "texture": "#0"} + } + }, + { + "from": [0.02, 6.02, 0.02], + "to": [3.98, 19.98, 15.98], + "rotation": {"angle": 22.5, "axis": "z", "origin": [2, 8, 8]}, + "faces": { + "north": {"uv": [9, 8.5, 8, 12], "texture": "#0"}, + "east": {"uv": [9, 8.5, 13, 12], "texture": "#0"}, + "south": {"uv": [8, 12.5, 9, 16], "texture": "#0"}, + "west": {"uv": [13, 12.5, 9, 16], "texture": "#0"}, + "up": {"uv": [8, 12, 9, 8.5], "texture": "#0"}, + "down": {"uv": [4.25, 11.5, 7.75, 10.5], "rotation": 90, "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [60, 180, 0], + "translation": [-0.5, 3, 0.25], + "scale": [0.25, 0.25, 0.25] + }, + "thirdperson_lefthand": { + "rotation": [60, 0, 0], + "translation": [-0.5, 3, 0.25], + "scale": [0.25, 0.25, 0.25] + }, + "firstperson_righthand": { + "rotation": [0, 180, 0], + "translation": [0.5, 0.5, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "rotation": [0, 90, 0], + "translation": [0.5, 0.5, 0], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "translation": [0, 2.75, 0], + "scale": [0.35, 0.35, 0.35] + }, + "gui": { + "rotation": [25, -135, 0], + "translation": [0.25, -1, 0], + "scale": [0.5, 0.5, 0.5] + }, + "fixed": { + "rotation": [-90, 0, 0], + "translation": [0, 0, -16], + "scale": [2, 2, 2] + } + }, + "groups": [ + { + "name": "group", + "origin": [0, 0, 0], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6] + } + ] +} \ No newline at end of file diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_straight.json b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_straight.json new file mode 100644 index 000000000..4c5174513 --- /dev/null +++ b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_straight.json @@ -0,0 +1,132 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "0": "item/custom/sofa", + "particle": "item/custom/sofa" + }, + "elements": [ + { + "from": [1, 0, 1], + "to": [3, 3, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 0, 1]}, + "faces": { + "north": {"uv": [14.5, 15.25, 15, 16], "texture": "#0"}, + "east": {"uv": [15, 15.25, 15.5, 16], "texture": "#0"}, + "south": {"uv": [15, 15.25, 15.5, 16], "texture": "#0"}, + "west": {"uv": [15, 15.25, 14.5, 16], "texture": "#0"}, + "up": {"uv": [16, 15.5, 15.5, 15], "texture": "#0"}, + "down": {"uv": [16, 15.5, 15.5, 16], "texture": "#0"} + } + }, + { + "from": [13, 0, 1], + "to": [15, 3, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 0, 1]}, + "faces": { + "north": {"uv": [15, 15.25, 14.5, 16], "texture": "#0"}, + "east": {"uv": [14.5, 15.25, 15, 16], "texture": "#0"}, + "south": {"uv": [15.5, 15.25, 15, 16], "texture": "#0"}, + "west": {"uv": [15.5, 15.25, 15, 16], "texture": "#0"}, + "up": {"uv": [15.5, 15.5, 16, 15], "texture": "#0"}, + "down": {"uv": [15.5, 15.5, 16, 16], "texture": "#0"} + } + }, + { + "from": [13, 0, 13], + "to": [15, 3, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 0, 15]}, + "faces": { + "north": {"uv": [15, 15.25, 15.5, 16], "texture": "#0"}, + "east": {"uv": [15, 15.25, 14.5, 16], "texture": "#0"}, + "south": {"uv": [14.5, 15.25, 15, 16], "texture": "#0"}, + "west": {"uv": [15, 15.25, 15.5, 16], "texture": "#0"}, + "up": {"uv": [15.5, 15, 16, 15.5], "texture": "#0"}, + "down": {"uv": [15.5, 16, 16, 15.5], "texture": "#0"} + } + }, + { + "from": [1, 0, 13], + "to": [3, 3, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 0, 15]}, + "faces": { + "north": {"uv": [15.5, 15.25, 15, 16], "texture": "#0"}, + "east": {"uv": [15.5, 15.25, 15, 16], "texture": "#0"}, + "south": {"uv": [15, 15.25, 14.5, 16], "texture": "#0"}, + "west": {"uv": [14.5, 15.25, 15, 16], "texture": "#0"}, + "up": {"uv": [16, 15, 15.5, 15.5], "texture": "#0"}, + "down": {"uv": [16, 16, 15.5, 15.5], "texture": "#0"} + } + }, + { + "from": [0.01, 2.51, 0.01], + "to": [15.99, 8.49, 15.99], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, + "faces": { + "north": {"uv": [4, 11.5, 8, 13], "texture": "#0"}, + "east": {"uv": [8, 14.5, 4, 16], "texture": "#0"}, + "south": {"uv": [4, 13, 8, 14.5], "texture": "#0"}, + "west": {"uv": [4, 14.5, 8, 16], "texture": "#0"}, + "up": {"uv": [4, 12, 0, 8], "texture": "#0"}, + "down": {"uv": [4, 12, 0, 16], "texture": "#0"} + } + }, + { + "from": [0.02, 6.02, 12.02], + "to": [15.98, 19.98, 15.98], + "rotation": {"angle": 22.5, "axis": "x", "origin": [7, 8, 14]}, + "faces": { + "north": {"uv": [9, 8.5, 13, 12], "texture": "#0"}, + "east": {"uv": [8, 12.5, 9, 16], "texture": "#0"}, + "south": {"uv": [9, 12.5, 13, 16], "texture": "#0"}, + "west": {"uv": [9, 12.5, 8, 16], "texture": "#0"}, + "up": {"uv": [9, 12, 8, 8.5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [7.75, 10.5, 4.25, 11.5], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [60, -34, 0], + "translation": [-0.5, 3, 0.25], + "scale": [0.25, 0.25, 0.25] + }, + "thirdperson_lefthand": { + "rotation": [60, -34, 0], + "translation": [-0.5, 3, 0.25], + "scale": [0.25, 0.25, 0.25] + }, + "firstperson_righthand": { + "rotation": [0, 180, 0], + "translation": [0.5, 0.5, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "rotation": [0, 180, 0], + "translation": [0.5, 0.5, 0], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "translation": [0, 2.75, 0], + "scale": [0.35, 0.35, 0.35] + }, + "gui": { + "rotation": [25, -135, 0], + "translation": [0.5, -1, 0], + "scale": [0.5, 0.5, 0.5] + }, + "fixed": { + "rotation": [-90, 0, 0], + "translation": [0, 0, -16], + "scale": [2, 2, 2] + } + }, + "groups": [ + { + "name": "group", + "origin": [0, 0, 0], + "color": 0, + "children": [0, 1, 2, 3, 4, 5] + } + ] +} \ No newline at end of file diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/sofa.png b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/sofa.png new file mode 100644 index 0000000000000000000000000000000000000000..25e76651cb36bacfd271de2676ea8a4967f2b1a0 GIT binary patch literal 1663 zcmV-_27vjAP)Px*IY~r8RCt`_TRm^vMi_ofQkD==GC>Il-~!ZOBxvKwaaWI7IyG~CLYAUGr09~L z&^cR|4jr<#@f5d6;Xxh(6tDFKiBZ2$n;W(zV1SO@@^PUiUe$Bze6lRi@z&29r9FXKRTYh-G|H1=+!QGx){`Mxayc6aIPA7Bto(2HuSo}NLE%P}; zqX)9SJJQiMTe*MsaVK{FX17tfP4)>IqCMX>Tj*GKIJ-!!O2LkBcF{uL(Q9FOf+l_- zFCf%O&@yNeV``0+3J6%3+X{7plm|>F^WCrHfv{2mlmQ5JQ-+2p^#v@%?acz0?}}YM zU?DEwh44MCR$C%wg50ti?A`*?$sMMXc`7SRCv(_6Eq-=K4GbP;&0B>bTC?wPqEkeL z+hz;RZkSR`9XuiS0OIy`Z-H9`xq(R$RF4{fU`!|TxT>onKBBvew=m zXW>!B14M5?MoD!-P62hO@KlgffVc&+UQm~_01>eQzBJ1dQXQdez!M3PJEF8$FE20x z7N(k>BJAVjxzFhQuwHD?c>nthzzn8!C^>~Ipe{9mW?F|S;orXbP=Z9wpDyj*0)0o18?Nh~NxGkWJw6p7D14@G5{i(&G|+Rgk`X7Xnv7JYNL{X;yVV zGjFyvdhB~z?zi|o1-Y$ocG1dtj4X_1w*k{yhvglj*Xyb-e{XG*u5YYx+(>U zFW~oz)Ps%;+>wsHle|x6O*BUpu?J*dBD!31J&tb;`?#~lDUupw4`Gw~WxW<&E(Xxc z#K_#S?xMx){)QMAs1YfBo?D9uK1R#TRYR^NMn6QCAQ911RWZ8Cemw-8<-5cX3qbf-X|Rm8EF-4D<1XlX?&4+`RuTPg%za=xK3I{JnObb?FlkP|d^Je(%mwz7g z{~H((g#VApxzZ!^5W$$CePkjSGX!I<5a!9hI2e!DT=I5dh?ak3sue`RnBkk}N2%{t zWru`L^LdX4_L44W2Q0+LOYTXkS%$|YePu%@3j>kmRfVTHR7$VAg-*}!FudZwF?iO- z;Kav=KlzrHEw}j^7C1duPt7?ZMB6}CAvEfK+(q3_sIzw_7oaVjRM zK)NGTrkG9c3~>IgV|bk?pxJG}Iax>x4*(b6+tKm;7CfNH@>Ri+c{4C?y@m=uV`kq*zO8;TwYOo4b@!;_wan;p4fJgr9 zwju5>5~=&Tjd=01PT20orrov6@OfK=beGgxUFu(si1${|{P2Issue found in file Issue found in file - The block '' is missing the required 'facing' property for 'stairs_block' behavior." warning.config.block.behavior.stairs.missing_half: "Issue found in file - The block '' is missing the required 'half' property for 'stairs_block' behavior." warning.config.block.behavior.stairs.missing_shape: "Issue found in file - The block '' is missing the required 'shape' property for 'stairs_block' behavior." -warning.config.block.behavior.bottom_half_stairs.missing_facing: "Issue found in file - The block '' is missing the required 'facing' property for 'bottom_half_stairs_block' behavior." -warning.config.block.behavior.bottom_half_stairs.missing_shape: "Issue found in file - The block '' is missing the required 'shape' property for 'bottom_half_stairs_block' behavior." +warning.config.block.behavior.sofa.missing_facing: "Issue found in file - The block '' is missing the required 'facing' property for 'sofa_block' behavior." +warning.config.block.behavior.sofa.missing_shape: "Issue found in file - The block '' is missing the required 'shape' property for 'sofa_block' behavior." warning.config.block.behavior.pressure_plate.missing_powered: "Issue found in file - The block '' is missing the required 'powered' property for 'pressure_plate_block' behavior." warning.config.block.behavior.grass.missing_feature: "Issue found in file - The block '' is missing the required 'feature' argument for 'grass_block' behavior." warning.config.block.behavior.double_high.missing_half: "Issue found in file - The block '' is missing the required 'half' property for 'double_block' behavior." diff --git a/common-files/src/main/resources/translations/zh_cn.yml b/common-files/src/main/resources/translations/zh_cn.yml index 1df5b5430..d78d52562 100644 --- a/common-files/src/main/resources/translations/zh_cn.yml +++ b/common-files/src/main/resources/translations/zh_cn.yml @@ -305,8 +305,8 @@ warning.config.block.behavior.slab.missing_type: "在文件 发 warning.config.block.behavior.stairs.missing_facing: "在文件 发现问题 - 方块 '' 的 'stairs_block' 行为缺少必需的 'facing' 属性" warning.config.block.behavior.stairs.missing_half: "在文件 发现问题 - 方块 '' 的 'stairs_block' 行为缺少必需的 'half' 属性" warning.config.block.behavior.stairs.missing_shape: "在文件 发现问题 - 方块 '' 的 'stairs_block' 行为缺少必需的 'shape' 属性" -warning.config.block.behavior.bottom_half_stairs.missing_facing: "在文件 发现问题 - 方块 '' 的 'bottom_half_stairs_block' 行为缺少必需的 'facing' 属性" -warning.config.block.behavior.bottom_half_stairs.missing_shape: "在文件 发现问题 - 方块 '' 的 'bottom_half_stairs_block' 行为缺少必需的 'shape' 属性" +warning.config.block.behavior.sofa.missing_facing: "在文件 发现问题 - 方块 '' 的 'sofa_block' 行为缺少必需的 'facing' 属性" +warning.config.block.behavior.sofa.missing_shape: "在文件 发现问题 - 方块 '' 的 'sofa_block' 行为缺少必需的 'shape' 属性" warning.config.block.behavior.pressure_plate.missing_powered: "在文件 发现问题 - 方块 '' 的 'pressure_plate_block' 行为缺少必需的 'powered' 属性" warning.config.block.behavior.grass.missing_feature: "在文件 发现问题 - 方块 '' 的 'grass_block' 行为缺少必需的 'feature' 参数" warning.config.block.behavior.double_high.missing_half: "在文件 发现问题 - 方块 '' 的 'double_block' 行为缺少必需的 'half' 属性" diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java index a54c56afa..e5a143264 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java @@ -21,6 +21,7 @@ public final class Properties { public static final Key HINGE = Key.of("craftengine:hinge"); public static final Key STAIRS_SHAPE = Key.of("craftengine:stairs_shape"); public static final Key SLAB_TYPE = Key.of("craftengine:slab_type"); + public static final Key SOFA_SHAPE = Key.of("craftengine:sofa_shape"); static { register(BOOLEAN, BooleanProperty.FACTORY); @@ -36,6 +37,8 @@ public final class Properties { register(HINGE, new EnumProperty.Factory<>(DoorHinge.class)); register(STAIRS_SHAPE, new EnumProperty.Factory<>(StairsShape.class)); register(SLAB_TYPE, new EnumProperty.Factory<>(SlabType.class)); + register(SOFA_SHAPE, new EnumProperty.Factory<>(SofaShape.class)); + } public static void register(Key key, PropertyFactory factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/state/properties/SofaShape.java b/core/src/main/java/net/momirealms/craftengine/core/block/state/properties/SofaShape.java new file mode 100644 index 000000000..a9d717dcb --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/state/properties/SofaShape.java @@ -0,0 +1,7 @@ +package net.momirealms.craftengine.core.block.state.properties; + +public enum SofaShape { + STRAIGHT, + INNER_LEFT, + INNER_RIGHT, +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index c4dab03ce..81fcf2e9a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -463,6 +463,10 @@ public abstract class AbstractPackManager implements PackManager { plugin.saveResource("resources/default/resourcepack/assets/minecraft/models/block/custom/pebble_1.json"); plugin.saveResource("resources/default/resourcepack/assets/minecraft/models/block/custom/pebble_2.json"); plugin.saveResource("resources/default/resourcepack/assets/minecraft/models/block/custom/pebble_3.json"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_straight.json"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_inner.json"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/models/block/custom/sofa.json"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/sofa.png"); // ores plugin.saveResource("resources/default/configuration/ores.yml"); From 3fb7efee6edbcba24cca9fddfe3a6bccda801d89 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 8 Sep 2025 20:09:09 +0800 Subject: [PATCH 07/18] =?UTF-8?q?feat(bukkit):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=B2=99=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/additional-real-blocks.yml | 3 +- .../default/configuration/blocks.yml | 29 +++------------ .../models/{block => item}/custom/sofa.json | 35 ++++++++++--------- .../core/pack/AbstractPackManager.java | 2 +- 4 files changed, 26 insertions(+), 43 deletions(-) rename common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/{block => item}/custom/sofa.json (78%) diff --git a/common-files/src/main/resources/additional-real-blocks.yml b/common-files/src/main/resources/additional-real-blocks.yml index afdf2f7ea..c425a70f3 100644 --- a/common-files/src/main/resources/additional-real-blocks.yml +++ b/common-files/src/main/resources/additional-real-blocks.yml @@ -81,4 +81,5 @@ minecraft:cherry_fence_gate: 16 minecraft:bamboo_fence_gate: 16 minecraft:crimson_fence_gate: 16 minecraft:warped_fence_gate: 16 -minecraft:barrier: 24 \ No newline at end of file +minecraft:barrier: 24 +minecraft:white_bed: 1 \ No newline at end of file diff --git a/common-files/src/main/resources/resources/default/configuration/blocks.yml b/common-files/src/main/resources/resources/default/configuration/blocks.yml index d1fa2dbd4..1aca0f06c 100644 --- a/common-files/src/main/resources/resources/default/configuration/blocks.yml +++ b/common-files/src/main/resources/resources/default/configuration/blocks.yml @@ -563,8 +563,6 @@ items#misc: model: type: minecraft:model path: minecraft:item/custom/sofa - generation: - parent: minecraft:block/custom/sofa behavior: type: block_item block: @@ -587,28 +585,11 @@ items#misc: hit: minecraft:block.wood.hit place: minecraft:block.wood.place step: minecraft:block.wood.step - states: - properties: - waterlogged: - type: boolean - default: false - appearances: - waterlogged=false: - state: sculk_sensor[power=1,sculk_sensor_phase=inactive,waterlogged=false] - model: - path: minecraft:block/custom/sofa - waterlogged=true: - state: sculk_sensor[power=1,sculk_sensor_phase=inactive,waterlogged=true] - model: - path: minecraft:block/custom/sofa - variants: - waterlogged=false: - appearance: waterlogged=false - id: 0 - waterlogged=true: - appearance: waterlogged=true - id: 1 - + state: + id: 0 + state: white_bed[facing=west,occupied=false,part=foot] + entity-renderer: + item: default:sofa default:connectable_sofa_straight: material: nether_brick custom-model-data: 3009 diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/sofa.json b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa.json similarity index 78% rename from common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/sofa.json rename to common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa.json index 07bbf9eaa..165259dc3 100644 --- a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/sofa.json +++ b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa.json @@ -1,4 +1,5 @@ { + "format_version": "1.21.6", "credit": "Made with Blockbench", "textures": { "0": "item/custom/sofa", @@ -6,9 +7,9 @@ }, "elements": [ { - "from": [1, 0, 1], - "to": [3, 3, 3], - "rotation": {"angle": 0, "axis": "y", "origin": [1, 0, 1]}, + "from": [-0.07, -0.035, -0.07], + "to": [2.95, 2.495, 2.95], + "rotation": {"angle": 0, "axis": "y", "origin": [-0.07, -0.035, -0.07]}, "faces": { "north": {"uv": [14.5, 15.25, 15, 16], "texture": "#0"}, "east": {"uv": [15, 15.25, 15.5, 16], "texture": "#0"}, @@ -19,9 +20,9 @@ } }, { - "from": [13, 0, 1], - "to": [15, 3, 3], - "rotation": {"angle": 0, "axis": "y", "origin": [15, 0, 1]}, + "from": [13.05, -0.035, -0.07], + "to": [16.07, 2.495, 2.95], + "rotation": {"angle": 0, "axis": "y", "origin": [16.07, -0.035, -0.07]}, "faces": { "north": {"uv": [15, 15.25, 14.5, 16], "texture": "#0"}, "east": {"uv": [14.5, 15.25, 15, 16], "texture": "#0"}, @@ -32,9 +33,9 @@ } }, { - "from": [13, 0, 13], - "to": [15, 3, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [15, 0, 15]}, + "from": [13.05, -0.035, 13.05], + "to": [16.07, 2.495, 16.07], + "rotation": {"angle": 0, "axis": "y", "origin": [16.07, -0.035, 16.07]}, "faces": { "north": {"uv": [15, 15.25, 15.5, 16], "texture": "#0"}, "east": {"uv": [15, 15.25, 14.5, 16], "texture": "#0"}, @@ -45,9 +46,9 @@ } }, { - "from": [1, 0, 13], - "to": [3, 3, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [1, 0, 15]}, + "from": [-0.07, -0.035, 13.05], + "to": [2.95, 2.495, 16.07], + "rotation": {"angle": 0, "axis": "y", "origin": [-0.07, -0.035, 16.07]}, "faces": { "north": {"uv": [15.5, 15.25, 15, 16], "texture": "#0"}, "east": {"uv": [15.5, 15.25, 15, 16], "texture": "#0"}, @@ -58,9 +59,9 @@ } }, { - "from": [0.01, 2.51, 0.01], - "to": [15.99, 8.49, 15.99], - "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, + "from": [-0.0699, 2.5001, -0.0699], + "to": [16.0699, 9.0399, 16.0699], + "rotation": {"angle": 0, "axis": "y", "origin": [-0.08, 1.985, -0.08]}, "faces": { "north": {"uv": [4, 11.5, 8, 13], "texture": "#0"}, "east": {"uv": [8, 11.5, 4, 13], "texture": "#0"}, @@ -83,12 +84,12 @@ "scale": [0.25, 0.25, 0.25] }, "firstperson_righthand": { - "rotation": [0, 180, 0], + "rotation": [0, -180, 0], "translation": [0.5, 0.5, 0], "scale": [0.5, 0.5, 0.5] }, "firstperson_lefthand": { - "rotation": [0, 180, 0], + "rotation": [0, -180, 0], "translation": [0.5, 0.5, 0], "scale": [0.5, 0.5, 0.5] }, diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index 81fcf2e9a..bc7e28b0d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -465,7 +465,7 @@ public abstract class AbstractPackManager implements PackManager { plugin.saveResource("resources/default/resourcepack/assets/minecraft/models/block/custom/pebble_3.json"); plugin.saveResource("resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_straight.json"); plugin.saveResource("resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_inner.json"); - plugin.saveResource("resources/default/resourcepack/assets/minecraft/models/block/custom/sofa.json"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/models/item/custom/sofa.json"); plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/sofa.png"); // ores From c9d7723881ebcf15925899e0b9067f175d3e235a Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 8 Sep 2025 21:29:25 +0800 Subject: [PATCH 08/18] =?UTF-8?q?feat(bukkit):=20=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E5=BC=B9=E8=B7=B3=E6=96=B9=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/BouncingBlockBehavior.java | 68 +++++++++++++++++++ .../block/behavior/BukkitBlockBehaviors.java | 2 + .../UnsafeCompositeBlockBehavior.java | 14 ++++ .../plugin/injector/BlockGenerator.java | 37 +++++++++- .../reflection/minecraft/CoreReflections.java | 8 +++ .../default/configuration/blocks.yml | 3 + .../craftengine/core/block/BlockBehavior.java | 9 +++ gradle.properties | 2 +- 8 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java new file mode 100644 index 000000000..9e167957d --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java @@ -0,0 +1,68 @@ +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.core.block.BlockBehavior; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import net.momirealms.craftengine.core.util.VersionHelper; + +import java.util.Map; +import java.util.concurrent.Callable; + +public class BouncingBlockBehavior extends BukkitBlockBehavior { + public static final Factory FACTORY = new Factory(); + private final double bounceHeight; + + public BouncingBlockBehavior(CustomBlock customBlock, double bounceHeight) { + super(customBlock); + this.bounceHeight = bounceHeight; + } + + @Override + public void fallOn(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object entity = args[3]; + Object finalFallDistance; + if (VersionHelper.isOrAbove1_21_5()) { + double fallDistance = (double) args[4]; + finalFallDistance = fallDistance * 0.5; + } else { + finalFallDistance = (float) args[4] * 0.5F; + } + FastNMS.INSTANCE.method$Entity$causeFallDamage( + entity, finalFallDistance, 1.0F, + FastNMS.INSTANCE.method$DamageSources$fall(FastNMS.INSTANCE.method$Entity$damageSources(entity)) + ); + } + + @Override + public void updateEntityMovementAfterFallOn(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object entity = args[1]; + if (FastNMS.INSTANCE.method$Entity$getSharedFlag(entity, 1)) { + bounceUp(entity); + } + } + + private void bounceUp(Object entity) { + Object deltaMovement = FastNMS.INSTANCE.method$Entity$getDeltaMovement(entity); + if (FastNMS.INSTANCE.field$Vec3$y(deltaMovement) < 0.0) { + double d = CoreReflections.clazz$LivingEntity.isInstance(entity) ? 1.0 : 0.8; + FastNMS.INSTANCE.method$Entity$setDeltaMovement( + entity, + FastNMS.INSTANCE.field$Vec3$x(deltaMovement), + -FastNMS.INSTANCE.field$Vec3$y(deltaMovement) * this.bounceHeight * d, + FastNMS.INSTANCE.field$Vec3$z(deltaMovement) + ); + } + } + + public static class Factory implements BlockBehaviorFactory { + + @Override + public BlockBehavior create(CustomBlock block, Map arguments) { + double bounceHeight = ResourceConfigUtils.getAsDouble(arguments.getOrDefault("bounce-height", 0.66), "bounce-height"); + return new BouncingBlockBehavior(block, bounceHeight); + } + } +} 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 71f3de6ed..34435ad14 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 @@ -31,6 +31,7 @@ public class BukkitBlockBehaviors extends BlockBehaviors { public static final Key SIMPLE_STORAGE_BLOCK = Key.from("craftengine:simple_storage_block"); public static final Key TOGGLEABLE_LAMP_BLOCK = Key.from("craftengine:toggleable_lamp_block"); public static final Key SOFA_BLOCK = Key.from("craftengine:sofa_block"); + public static final Key BOUNCING_BLOCK = Key.from("craftengine:bouncing_block"); public static void init() { register(EMPTY, (block, args) -> EmptyBlockBehavior.INSTANCE); @@ -60,5 +61,6 @@ public class BukkitBlockBehaviors extends BlockBehaviors { register(SIMPLE_STORAGE_BLOCK, SimpleStorageBlockBehavior.FACTORY); register(TOGGLEABLE_LAMP_BLOCK, ToggleableLampBlockBehavior.FACTORY); register(SOFA_BLOCK, SofaBlockBehavior.FACTORY); + register(BOUNCING_BLOCK, BouncingBlockBehavior.FACTORY); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/UnsafeCompositeBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/UnsafeCompositeBlockBehavior.java index 81f40cbd8..7d3449e77 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/UnsafeCompositeBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/UnsafeCompositeBlockBehavior.java @@ -336,4 +336,18 @@ public class UnsafeCompositeBlockBehavior extends BukkitBlockBehavior { behavior.spawnAfterBreak(thisBlock, args, superMethod); } } + + @Override + public void fallOn(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + for (AbstractBlockBehavior behavior : this.behaviors) { + behavior.fallOn(thisBlock, args, superMethod); + } + } + + @Override + public void updateEntityMovementAfterFallOn(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + for (AbstractBlockBehavior behavior : this.behaviors) { + behavior.updateEntityMovementAfterFallOn(thisBlock, args, superMethod); + } + } } \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java index b4d14745b..8ad88d92e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java @@ -159,7 +159,14 @@ public final class BlockGenerator { .intercept(MethodDelegation.to(PlayerWillDestroyInterceptor.INSTANCE)) // spawnAfterBreak .method(ElementMatchers.is(CoreReflections.method$BlockBehaviour$spawnAfterBreak)) - .intercept(MethodDelegation.to(SpawnAfterBreakInterceptor.INSTANCE)); + .intercept(MethodDelegation.to(SpawnAfterBreakInterceptor.INSTANCE)) + // fallOn + .method(ElementMatchers.is(CoreReflections.method$Block$fallOn)) + .intercept(MethodDelegation.to(FallOnInterceptor.INSTANCE)) + // updateEntityMovementAfterFallOn + .method(ElementMatchers.is(CoreReflections.method$Block$updateEntityMovementAfterFallOn)) + .intercept(MethodDelegation.to(UpdateEntityMovementAfterFallOnInterceptor.INSTANCE)) + ; // 1.21.5+ if (CoreReflections.method$BlockBehaviour$affectNeighborsAfterRemoval != null) { builder = builder.method(ElementMatchers.is(CoreReflections.method$BlockBehaviour$affectNeighborsAfterRemoval)) @@ -699,4 +706,32 @@ public final class BlockGenerator { } } } + + public static class FallOnInterceptor { + public static final FallOnInterceptor INSTANCE = new FallOnInterceptor(); + + @RuntimeType + public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) { + ObjectHolder holder = ((DelegatingBlock) thisObj).behaviorDelegate(); + try { + holder.value().fallOn(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run fallOn", e); + } + } + } + + public static class UpdateEntityMovementAfterFallOnInterceptor { + public static final UpdateEntityMovementAfterFallOnInterceptor INSTANCE = new UpdateEntityMovementAfterFallOnInterceptor(); + + @RuntimeType + public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) { + ObjectHolder holder = ((DelegatingBlock) thisObj).behaviorDelegate(); + try { + holder.value().updateEntityMovementAfterFallOn(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run updateEntityMovementAfterFallOn", e); + } + } + } } \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java index 8cce0ed83..124263ed2 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java @@ -4209,4 +4209,12 @@ public final class CoreReflections { public static final Method method$BlockAndTintGetter$getLightEngine = requireNonNull( ReflectionUtils.getDeclaredMethod(clazz$BlockAndTintGetter, clazz$LevelLightEngine) ); + + public static final Method method$Block$fallOn = requireNonNull( + ReflectionUtils.getDeclaredMethod(clazz$Block, void.class, clazz$Level, clazz$BlockState, clazz$BlockPos, clazz$Entity, VersionHelper.isOrAbove1_21_5() ? double.class : float.class) + ); + + public static final Method method$Block$updateEntityMovementAfterFallOn = requireNonNull( + ReflectionUtils.getDeclaredMethod(clazz$Block, void.class, clazz$BlockGetter, clazz$Entity) + ); } diff --git a/common-files/src/main/resources/resources/default/configuration/blocks.yml b/common-files/src/main/resources/resources/default/configuration/blocks.yml index 1aca0f06c..4a197f8df 100644 --- a/common-files/src/main/resources/resources/default/configuration/blocks.yml +++ b/common-files/src/main/resources/resources/default/configuration/blocks.yml @@ -585,6 +585,9 @@ items#misc: hit: minecraft:block.wood.hit place: minecraft:block.wood.place step: minecraft:block.wood.step + behavior: + type: bouncing_block + bounce-height: 0.66 state: id: 0 state: white_bed[facing=west,occupied=false,part=foot] diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java index 5536e4322..32b164635 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java @@ -178,6 +178,15 @@ public abstract class BlockBehavior { public void spawnAfterBreak(Object thisBlock, Object[] args, Callable superMethod) throws Exception { } + // 1.20.1~1.21.4 Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance + // 1.21.5+ Level level, BlockState state, BlockPos pos, Entity entity, double fallDistance + public void fallOn(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + } + + // BlockGetter level, Entity entity + public void updateEntityMovementAfterFallOn(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + } + public ImmutableBlockState updateStateForPlacement(BlockPlaceContext context, ImmutableBlockState state) { return state; } diff --git a/gradle.properties b/gradle.properties index eb5d80f1d..f39e0afa6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.5 anti_grief_version=0.20 -nms_helper_version=1.0.80 +nms_helper_version=1.0.81 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.33.1 From 837ac974823fd894225e64bc92bca9b662deb348 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Wed, 10 Sep 2025 09:55:03 +0800 Subject: [PATCH 09/18] =?UTF-8?q?refactor(block):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=96=B9=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/block/behavior/BouncingBlockBehavior.java | 2 ++ .../block/behavior/ToggleableLampBlockBehavior.java | 8 ++++---- .../assets/minecraft/models/item/custom/cap.json | 2 -- .../models/item/custom/flower_basket_ceiling.json | 1 - .../models/item/custom/flower_basket_ground.json | 1 - .../minecraft/models/item/custom/flower_basket_wall.json | 2 -- .../assets/minecraft/models/item/custom/sofa.json | 2 -- .../assets/minecraft/models/item/custom/sofa_inner.json | 1 - .../minecraft/models/item/custom/sofa_straight.json | 1 - .../models/item/custom/topaz_trident_in_hand.json | 1 - .../models/item/custom/topaz_trident_throwing.json | 1 - 11 files changed, 6 insertions(+), 16 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java index 9e167957d..551c1c0b4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java @@ -7,6 +7,8 @@ import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.VersionHelper; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; import java.util.Map; import java.util.concurrent.Callable; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ToggleableLampBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ToggleableLampBlockBehavior.java index 92894f798..577c167c0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ToggleableLampBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ToggleableLampBlockBehavior.java @@ -49,7 +49,7 @@ public class ToggleableLampBlockBehavior extends BukkitBlockBehavior { @Override public void onPlace(Object thisBlock, Object[] args, Callable superMethod) { - if (this.canOpenWithHand) return; + if (this.poweredProperty == null) return; Object state = args[0]; Object level = args[1]; Object pos = args[2]; @@ -63,7 +63,7 @@ public class ToggleableLampBlockBehavior extends BukkitBlockBehavior { @Override public void neighborChanged(Object thisBlock, Object[] args, Callable superMethod) { - if (this.canOpenWithHand) return; + if (this.poweredProperty == null) return; Object blockState = args[0]; Object world = args[1]; if (!CoreReflections.clazz$ServerLevel.isInstance(world)) return; @@ -91,9 +91,9 @@ public class ToggleableLampBlockBehavior extends BukkitBlockBehavior { public static class Factory implements BlockBehaviorFactory { @Override public BlockBehavior create(CustomBlock block, Map arguments) { - Property lit = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("lit"), "warning.config.block.behavior.toggleable_lamp.missing_lit"); - Property powered = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("powered"), "warning.config.block.behavior.toggleable_lamp.missing_powered"); boolean canOpenWithHand = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("can-open-with-hand", false), "can-open-with-hand"); + Property lit = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("lit"), "warning.config.block.behavior.toggleable_lamp.missing_lit"); + Property powered = (Property) (canOpenWithHand ? block.getProperty("powered") : ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("powered"), "warning.config.block.behavior.toggleable_lamp.missing_powered")); return new ToggleableLampBlockBehavior(block, lit, powered, canOpenWithHand); } } diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/cap.json b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/cap.json index 40cfcc334..2ab8bff7a 100644 --- a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/cap.json +++ b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/cap.json @@ -1,6 +1,4 @@ { - "format_version": "1.21.6", - "credit": "Made with Blockbench", "texture_size": [32, 32], "textures": { "0": "item/custom/cap", diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/flower_basket_ceiling.json b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/flower_basket_ceiling.json index 31e1ef903..0066e3414 100644 --- a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/flower_basket_ceiling.json +++ b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/flower_basket_ceiling.json @@ -1,5 +1,4 @@ { - "credit": "Made with Blockbench", "textures": { "1": "item/custom/flower_basket", "particle": "item/custom/flower_basket" diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/flower_basket_ground.json b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/flower_basket_ground.json index 38d9eba22..7c8c9c386 100644 --- a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/flower_basket_ground.json +++ b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/flower_basket_ground.json @@ -1,5 +1,4 @@ { - "credit": "Made with Blockbench", "textures": { "0": "item/custom/flower_basket" }, diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/flower_basket_wall.json b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/flower_basket_wall.json index 1fbe404cf..b7801a8cb 100644 --- a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/flower_basket_wall.json +++ b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/flower_basket_wall.json @@ -1,6 +1,4 @@ { - "format_version": "1.21.6", - "credit": "Made with Blockbench", "textures": { "0": "item/custom/flower_basket" }, diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa.json b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa.json index 165259dc3..6793fcf75 100644 --- a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa.json +++ b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa.json @@ -1,6 +1,4 @@ { - "format_version": "1.21.6", - "credit": "Made with Blockbench", "textures": { "0": "item/custom/sofa", "particle": "item/custom/sofa" diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_inner.json b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_inner.json index 595bdfb4f..e9c3a7bf3 100644 --- a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_inner.json +++ b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_inner.json @@ -1,5 +1,4 @@ { - "credit": "Made with Blockbench", "textures": { "0": "item/custom/sofa", "particle": "item/custom/sofa" diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_straight.json b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_straight.json index 4c5174513..822eaf59a 100644 --- a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_straight.json +++ b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/sofa_straight.json @@ -1,5 +1,4 @@ { - "credit": "Made with Blockbench", "texture_size": [64, 64], "textures": { "0": "item/custom/sofa", diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/topaz_trident_in_hand.json b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/topaz_trident_in_hand.json index a56ed9681..984b06ef5 100644 --- a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/topaz_trident_in_hand.json +++ b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/topaz_trident_in_hand.json @@ -1,5 +1,4 @@ { - "credit": "Made with Blockbench", "textures": { "0": "item/custom/topaz_trident_3d", "particle": "item/custom/topaz_trident_3d" diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/topaz_trident_throwing.json b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/topaz_trident_throwing.json index 90b814746..6e8a181f3 100644 --- a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/topaz_trident_throwing.json +++ b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/topaz_trident_throwing.json @@ -1,5 +1,4 @@ { - "credit": "Made with Blockbench", "textures": { "0": "item/custom/topaz_trident_3d", "particle": "item/custom/topaz_trident_3d" From b936b4853ab02dced3c105f11c7301cae04e0ba3 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Wed, 10 Sep 2025 10:19:43 +0800 Subject: [PATCH 10/18] =?UTF-8?q?refactor(block):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=96=B9=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../block/behavior/BouncingBlockBehavior.java | 8 +- .../main/resources/additional-real-blocks.yml | 2 +- .../default/configuration/blocks.yml | 226 ++++-------------- gradle.properties | 2 +- 4 files changed, 51 insertions(+), 187 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java index 551c1c0b4..6a68455aa 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java @@ -7,8 +7,7 @@ import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.VersionHelper; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; +import org.bukkit.util.Vector; import java.util.Map; import java.util.concurrent.Callable; @@ -23,7 +22,7 @@ public class BouncingBlockBehavior extends BukkitBlockBehavior { } @Override - public void fallOn(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + public void fallOn(Object thisBlock, Object[] args, Callable superMethod) { Object entity = args[3]; Object finalFallDistance; if (VersionHelper.isOrAbove1_21_5()) { @@ -42,6 +41,8 @@ public class BouncingBlockBehavior extends BukkitBlockBehavior { public void updateEntityMovementAfterFallOn(Object thisBlock, Object[] args, Callable superMethod) throws Exception { Object entity = args[1]; if (FastNMS.INSTANCE.method$Entity$getSharedFlag(entity, 1)) { + superMethod.call(); + } else { bounceUp(entity); } } @@ -56,6 +57,7 @@ public class BouncingBlockBehavior extends BukkitBlockBehavior { -FastNMS.INSTANCE.field$Vec3$y(deltaMovement) * this.bounceHeight * d, FastNMS.INSTANCE.field$Vec3$z(deltaMovement) ); + FastNMS.INSTANCE.field$Entity$hurtMarked(entity, true); } } diff --git a/common-files/src/main/resources/additional-real-blocks.yml b/common-files/src/main/resources/additional-real-blocks.yml index c425a70f3..8de88617e 100644 --- a/common-files/src/main/resources/additional-real-blocks.yml +++ b/common-files/src/main/resources/additional-real-blocks.yml @@ -81,5 +81,5 @@ minecraft:cherry_fence_gate: 16 minecraft:bamboo_fence_gate: 16 minecraft:crimson_fence_gate: 16 minecraft:warped_fence_gate: 16 -minecraft:barrier: 24 +minecraft:barrier: 128 minecraft:white_bed: 1 \ No newline at end of file diff --git a/common-files/src/main/resources/resources/default/configuration/blocks.yml b/common-files/src/main/resources/resources/default/configuration/blocks.yml index 4a197f8df..71db60034 100644 --- a/common-files/src/main/resources/resources/default/configuration/blocks.yml +++ b/common-files/src/main/resources/resources/default/configuration/blocks.yml @@ -585,6 +585,8 @@ items#misc: hit: minecraft:block.wood.hit place: minecraft:block.wood.place step: minecraft:block.wood.step + tags: + - minecraft:mineable/axe behavior: type: bouncing_block bounce-height: 0.66 @@ -639,253 +641,113 @@ items#misc: hit: minecraft:block.wood.hit place: minecraft:block.wood.place step: minecraft:block.wood.step - behavior: - type: sofa_block + tags: + - minecraft:mineable/axe + behaviors: + - type: sofa_block + - type: bouncing_block + bounce-height: 0.66 states: properties: facing: type: horizontal_direction shape: type: sofa_shape - waterlogged: - type: boolean - default: false appearances: - facing=east,shape=straight,waterlogged=false: + facing=east,shape=straight: state: barrier[waterlogged=false] entity-renderer: item: default:connectable_sofa_straight yaw: 90 - facing=north,shape=straight,waterlogged=false: + facing=north,shape=straight: state: barrier[waterlogged=false] entity-renderer: item: default:connectable_sofa_straight - facing=south,shape=straight,waterlogged=false: + facing=south,shape=straight: state: barrier[waterlogged=false] entity-renderer: item: default:connectable_sofa_straight yaw: 180 - facing=west,shape=straight,waterlogged=false: + facing=west,shape=straight: state: barrier[waterlogged=false] entity-renderer: item: default:connectable_sofa_straight yaw: 270 - facing=east,shape=straight,waterlogged=true: - state: barrier[waterlogged=true] - entity-renderer: - item: default:connectable_sofa_straight - yaw: 90 - facing=north,shape=straight,waterlogged=true: - state: barrier[waterlogged=true] - entity-renderer: - item: default:connectable_sofa_straight - facing=south,shape=straight,waterlogged=true: - state: barrier[waterlogged=true] - entity-renderer: - item: default:connectable_sofa_straight - yaw: 180 - facing=west,shape=straight,waterlogged=true: - state: barrier[waterlogged=true] - entity-renderer: - item: default:connectable_sofa_straight - yaw: 270 - facing=east,shape=inner_left,waterlogged=false: + facing=east,shape=inner_left: state: barrier[waterlogged=false] entity-renderer: item: default:connectable_sofa_inner - facing=north,shape=inner_left,waterlogged=false: + facing=north,shape=inner_left: state: barrier[waterlogged=false] entity-renderer: item: default:connectable_sofa_inner yaw: 270 - facing=south,shape=inner_left,waterlogged=false: + facing=south,shape=inner_left: state: barrier[waterlogged=false] entity-renderer: item: default:connectable_sofa_inner yaw: 90 - facing=west,shape=inner_left,waterlogged=false: + facing=west,shape=inner_left: state: barrier[waterlogged=false] entity-renderer: item: default:connectable_sofa_inner yaw: 180 - facing=east,shape=inner_left,waterlogged=true: - state: barrier[waterlogged=true] - entity-renderer: - item: default:connectable_sofa_inner - facing=north,shape=inner_left,waterlogged=true: - state: barrier[waterlogged=true] - entity-renderer: - item: default:connectable_sofa_inner - yaw: 270 - facing=south,shape=inner_left,waterlogged=true: - state: barrier[waterlogged=true] - entity-renderer: - item: default:connectable_sofa_inner - yaw: 90 - facing=west,shape=inner_left,waterlogged=true: - state: barrier[waterlogged=true] - entity-renderer: - item: default:connectable_sofa_inner - yaw: 180 - facing=east,shape=inner_right,waterlogged=false: + facing=east,shape=inner_right: state: barrier[waterlogged=false] entity-renderer: item: default:connectable_sofa_inner yaw: 90 - facing=north,shape=inner_right,waterlogged=false: + facing=north,shape=inner_right: state: barrier[waterlogged=false] entity-renderer: item: default:connectable_sofa_inner - facing=south,shape=inner_right,waterlogged=false: + facing=south,shape=inner_right: state: barrier[waterlogged=false] entity-renderer: item: default:connectable_sofa_inner yaw: 180 - facing=west,shape=inner_right,waterlogged=false: + facing=west,shape=inner_right: state: barrier[waterlogged=false] entity-renderer: item: default:connectable_sofa_inner yaw: 270 - facing=east,shape=inner_right,waterlogged=true: - state: barrier[waterlogged=true] - entity-renderer: - item: default:connectable_sofa_inner - yaw: 90 - facing=north,shape=inner_right,waterlogged=true: - state: barrier[waterlogged=true] - entity-renderer: - item: default:connectable_sofa_inner - facing=south,shape=inner_right,waterlogged=true: - state: barrier[waterlogged=true] - entity-renderer: - item: default:connectable_sofa_inner - yaw: 180 - facing=west,shape=inner_right,waterlogged=true: - state: barrier[waterlogged=true] - entity-renderer: - item: default:connectable_sofa_inner - yaw: 270 variants: - facing=east,shape=inner_left,waterlogged=false: - appearance: facing=east,shape=inner_left,waterlogged=false + facing=east,shape=inner_left: + appearance: facing=east,shape=inner_left id: 0 - facing=east,shape=inner_right,waterlogged=false: - appearance: facing=east,shape=inner_right,waterlogged=false + facing=east,shape=inner_right: + appearance: facing=east,shape=inner_right id: 1 - facing=east,shape=straight,waterlogged=false: - appearance: facing=east,shape=straight,waterlogged=false + facing=east,shape=straight: + appearance: facing=east,shape=straight id: 2 - facing=north,shape=inner_left,waterlogged=false: - appearance: facing=north,shape=inner_left,waterlogged=false + facing=north,shape=inner_left: + appearance: facing=north,shape=inner_left id: 3 - facing=north,shape=inner_right,waterlogged=false: - appearance: facing=north,shape=inner_right,waterlogged=false + facing=north,shape=inner_right: + appearance: facing=north,shape=inner_right id: 4 - facing=north,shape=straight,waterlogged=false: - appearance: facing=north,shape=straight,waterlogged=false + facing=north,shape=straight: + appearance: facing=north,shape=straight id: 5 - facing=south,shape=inner_left,waterlogged=false: - appearance: facing=south,shape=inner_left,waterlogged=false + facing=south,shape=inner_left: + appearance: facing=south,shape=inner_left id: 6 - facing=south,shape=inner_right,waterlogged=false: - appearance: facing=south,shape=inner_right,waterlogged=false + facing=south,shape=inner_right: + appearance: facing=south,shape=inner_right id: 7 - facing=south,shape=straight,waterlogged=false: - appearance: facing=south,shape=straight,waterlogged=false + facing=south,shape=straight: + appearance: facing=south,shape=straight id: 8 - facing=west,shape=inner_left,waterlogged=false: - appearance: facing=west,shape=inner_left,waterlogged=false + facing=west,shape=inner_left: + appearance: facing=west,shape=inner_left id: 9 - facing=west,shape=inner_right,waterlogged=false: - appearance: facing=west,shape=inner_right,waterlogged=false + facing=west,shape=inner_right: + appearance: facing=west,shape=inner_right id: 10 - facing=west,shape=straight,waterlogged=false: - appearance: facing=west,shape=straight,waterlogged=false + facing=west,shape=straight: + appearance: facing=west,shape=straight id: 11 - facing=east,shape=inner_left,waterlogged=true: - appearance: facing=east,shape=inner_left,waterlogged=true - id: 12 - settings: - resistance: 1200.0 - burnable: false - fluid-state: water - facing=east,shape=inner_right,waterlogged=true: - appearance: facing=east,shape=inner_right,waterlogged=true - id: 13 - settings: - resistance: 1200.0 - burnable: false - fluid-state: water - facing=east,shape=straight,waterlogged=true: - appearance: facing=east,shape=straight,waterlogged=true - id: 14 - settings: - resistance: 1200.0 - burnable: false - fluid-state: water - facing=north,shape=inner_left,waterlogged=true: - appearance: facing=north,shape=inner_left,waterlogged=true - id: 15 - settings: - resistance: 1200.0 - burnable: false - fluid-state: water - facing=north,shape=inner_right,waterlogged=true: - appearance: facing=north,shape=inner_right,waterlogged=true - id: 16 - settings: - resistance: 1200.0 - burnable: false - fluid-state: water - facing=north,shape=straight,waterlogged=true: - appearance: facing=north,shape=straight,waterlogged=true - id: 17 - settings: - resistance: 1200.0 - burnable: false - fluid-state: water - facing=south,shape=inner_left,waterlogged=true: - appearance: facing=south,shape=inner_left,waterlogged=true - id: 18 - settings: - resistance: 1200.0 - burnable: false - fluid-state: water - facing=south,shape=inner_right,waterlogged=true: - appearance: facing=south,shape=inner_right,waterlogged=true - id: 19 - settings: - resistance: 1200.0 - burnable: false - fluid-state: water - facing=south,shape=straight,waterlogged=true: - appearance: facing=south,shape=straight,waterlogged=true - id: 20 - settings: - resistance: 1200.0 - burnable: false - fluid-state: water - facing=west,shape=inner_left,waterlogged=true: - appearance: facing=west,shape=inner_left,waterlogged=true - id: 21 - settings: - resistance: 1200.0 - burnable: false - fluid-state: water - facing=west,shape=inner_right,waterlogged=true: - appearance: facing=west,shape=inner_right,waterlogged=true - id: 22 - settings: - resistance: 1200.0 - burnable: false - fluid-state: water - facing=west,shape=straight,waterlogged=true: - appearance: facing=west,shape=straight,waterlogged=true - id: 23 - settings: - resistance: 1200.0 - burnable: false - fluid-state: water recipes#misc: default:chinese_lantern: type: shaped diff --git a/gradle.properties b/gradle.properties index 4b1e6f2a5..63049c23f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.5 anti_grief_version=0.20 -nms_helper_version=1.0.81 +nms_helper_version=1.0.82 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.33.1 From 10a35e379836ba9fdaf98e7b4b3a3019cbc6f8f6 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Wed, 10 Sep 2025 10:31:48 +0800 Subject: [PATCH 11/18] =?UTF-8?q?refactor(block):=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E7=91=95=E7=96=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/block/behavior/BouncingBlockBehavior.java | 12 ++++++++---- .../resources/default/configuration/blocks.yml | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java index 6a68455aa..d94e9f95a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java @@ -7,7 +7,6 @@ import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.VersionHelper; -import org.bukkit.util.Vector; import java.util.Map; import java.util.concurrent.Callable; @@ -15,10 +14,12 @@ import java.util.concurrent.Callable; public class BouncingBlockBehavior extends BukkitBlockBehavior { public static final Factory FACTORY = new Factory(); private final double bounceHeight; + private final boolean syncPlayerSelf; - public BouncingBlockBehavior(CustomBlock customBlock, double bounceHeight) { + public BouncingBlockBehavior(CustomBlock customBlock, double bounceHeight, boolean syncPlayerSelf) { super(customBlock); this.bounceHeight = bounceHeight; + this.syncPlayerSelf = syncPlayerSelf; } @Override @@ -57,7 +58,9 @@ public class BouncingBlockBehavior extends BukkitBlockBehavior { -FastNMS.INSTANCE.field$Vec3$y(deltaMovement) * this.bounceHeight * d, FastNMS.INSTANCE.field$Vec3$z(deltaMovement) ); - FastNMS.INSTANCE.field$Entity$hurtMarked(entity, true); + if (this.syncPlayerSelf) { + FastNMS.INSTANCE.field$Entity$hurtMarked(entity, true); + } } } @@ -66,7 +69,8 @@ public class BouncingBlockBehavior extends BukkitBlockBehavior { @Override public BlockBehavior create(CustomBlock block, Map arguments) { double bounceHeight = ResourceConfigUtils.getAsDouble(arguments.getOrDefault("bounce-height", 0.66), "bounce-height"); - return new BouncingBlockBehavior(block, bounceHeight); + boolean syncPlayerSelf = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("sync-player-self", true), "sync-player-self"); + return new BouncingBlockBehavior(block, bounceHeight, syncPlayerSelf); } } } diff --git a/common-files/src/main/resources/resources/default/configuration/blocks.yml b/common-files/src/main/resources/resources/default/configuration/blocks.yml index 71db60034..32d9d92d4 100644 --- a/common-files/src/main/resources/resources/default/configuration/blocks.yml +++ b/common-files/src/main/resources/resources/default/configuration/blocks.yml @@ -590,6 +590,7 @@ items#misc: behavior: type: bouncing_block bounce-height: 0.66 + sync-player-self: false state: id: 0 state: white_bed[facing=west,occupied=false,part=foot] From 0274bc062f6e04d9d894cf2aa9b82568c581f301 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Wed, 10 Sep 2025 10:52:11 +0800 Subject: [PATCH 12/18] =?UTF-8?q?fix:=20=E8=A1=A5=E5=85=85=E6=BC=8F?= =?UTF-8?q?=E6=8E=89=E7=9A=84=E6=96=B9=E5=9D=97=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/default/configuration/block_name.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/common-files/src/main/resources/resources/default/configuration/block_name.yml b/common-files/src/main/resources/resources/default/configuration/block_name.yml index f097abe8a..4c750da5a 100644 --- a/common-files/src/main/resources/resources/default/configuration/block_name.yml +++ b/common-files/src/main/resources/resources/default/configuration/block_name.yml @@ -28,6 +28,8 @@ lang: block_name:default:copper_coil: Copper Coil block_name:default:chessboard_block: Chessboard Block block_name:default:safe_block: Safe Block + block_name:default:sofa: Sofa + block_name:default:connectable_sofa: Sofa zh_cn: block_name:default:chinese_lantern: 灯笼 block_name:default:netherite_anvil: 下界合金砧 @@ -53,4 +55,6 @@ lang: block_name:default:solid_gunpowder_block: 凝固火药块 block_name:default:copper_coil: 铜线圈 block_name:default:chessboard_block: 棋盘方块 - block_name:default:safe_block: 保险柜 \ No newline at end of file + block_name:default:safe_block: 保险柜 + block_name:default:sofa: 沙发 + block_name:default:connectable_sofa: 沙发 \ No newline at end of file From dd5749758da20564e86a23d186df5e534ecf562b Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Wed, 10 Sep 2025 11:23:33 +0800 Subject: [PATCH 13/18] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E5=BC=B9=E8=B7=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/block/behavior/BouncingBlockBehavior.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java index d94e9f95a..08ba200ba 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java @@ -52,13 +52,15 @@ public class BouncingBlockBehavior extends BukkitBlockBehavior { Object deltaMovement = FastNMS.INSTANCE.method$Entity$getDeltaMovement(entity); if (FastNMS.INSTANCE.field$Vec3$y(deltaMovement) < 0.0) { double d = CoreReflections.clazz$LivingEntity.isInstance(entity) ? 1.0 : 0.8; + double y = -FastNMS.INSTANCE.field$Vec3$y(deltaMovement) * this.bounceHeight * d; + System.out.println("deltaMovement=" + deltaMovement + ", d=" + d + ", y=" + y); FastNMS.INSTANCE.method$Entity$setDeltaMovement( entity, FastNMS.INSTANCE.field$Vec3$x(deltaMovement), - -FastNMS.INSTANCE.field$Vec3$y(deltaMovement) * this.bounceHeight * d, + y, FastNMS.INSTANCE.field$Vec3$z(deltaMovement) ); - if (this.syncPlayerSelf) { + if (this.syncPlayerSelf && y > 0.06271) { // 不知道为什么会抖 FastNMS.INSTANCE.field$Entity$hurtMarked(entity, true); } } From fb332584c04b8769b0035fc1c1d4a63f91644918 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Wed, 10 Sep 2025 11:23:54 +0800 Subject: [PATCH 14/18] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E5=BC=B9=E8=B7=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftengine/bukkit/block/behavior/BouncingBlockBehavior.java | 1 - 1 file changed, 1 deletion(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java index 08ba200ba..e602f15fb 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java @@ -53,7 +53,6 @@ public class BouncingBlockBehavior extends BukkitBlockBehavior { if (FastNMS.INSTANCE.field$Vec3$y(deltaMovement) < 0.0) { double d = CoreReflections.clazz$LivingEntity.isInstance(entity) ? 1.0 : 0.8; double y = -FastNMS.INSTANCE.field$Vec3$y(deltaMovement) * this.bounceHeight * d; - System.out.println("deltaMovement=" + deltaMovement + ", d=" + d + ", y=" + y); FastNMS.INSTANCE.method$Entity$setDeltaMovement( entity, FastNMS.INSTANCE.field$Vec3$x(deltaMovement), From bcb5c0f554d50c867b2c819f948fd323521b60cc Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Wed, 10 Sep 2025 11:32:44 +0800 Subject: [PATCH 15/18] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/block/behavior/BouncingBlockBehavior.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java index e602f15fb..82e6d5634 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java @@ -59,7 +59,7 @@ public class BouncingBlockBehavior extends BukkitBlockBehavior { y, FastNMS.INSTANCE.field$Vec3$z(deltaMovement) ); - if (this.syncPlayerSelf && y > 0.06271) { // 不知道为什么会抖 + if (this.syncPlayerSelf && y > 0.0315) { // 不知道为什么会抖 FastNMS.INSTANCE.field$Entity$hurtMarked(entity, true); } } From 647e585c86bb4d68ce347a3a9e56b9bce24c9c8c Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Wed, 10 Sep 2025 14:40:27 +0800 Subject: [PATCH 16/18] =?UTF-8?q?fix:=20=E4=B8=8D=E6=98=AF=E5=93=A5?= =?UTF-8?q?=E4=BB=AC=E8=BF=99=E5=8E=9F=E7=89=88=E5=BA=8A=E9=83=BD=E6=9C=89?= =?UTF-8?q?=E8=BF=99=E4=B8=AA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/block/behavior/BouncingBlockBehavior.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java index 82e6d5634..d94e9f95a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java @@ -52,14 +52,13 @@ public class BouncingBlockBehavior extends BukkitBlockBehavior { Object deltaMovement = FastNMS.INSTANCE.method$Entity$getDeltaMovement(entity); if (FastNMS.INSTANCE.field$Vec3$y(deltaMovement) < 0.0) { double d = CoreReflections.clazz$LivingEntity.isInstance(entity) ? 1.0 : 0.8; - double y = -FastNMS.INSTANCE.field$Vec3$y(deltaMovement) * this.bounceHeight * d; FastNMS.INSTANCE.method$Entity$setDeltaMovement( entity, FastNMS.INSTANCE.field$Vec3$x(deltaMovement), - y, + -FastNMS.INSTANCE.field$Vec3$y(deltaMovement) * this.bounceHeight * d, FastNMS.INSTANCE.field$Vec3$z(deltaMovement) ); - if (this.syncPlayerSelf && y > 0.0315) { // 不知道为什么会抖 + if (this.syncPlayerSelf) { FastNMS.INSTANCE.field$Entity$hurtMarked(entity, true); } } From c99f693f91f697198ab9450bc9e0087320053cf7 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Wed, 10 Sep 2025 16:09:16 +0800 Subject: [PATCH 17/18] =?UTF-8?q?refactor(block):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=BC=B9=E8=B7=B3=E6=96=B9=E5=9D=97=E8=A1=8C=E4=B8=BA=E5=B9=B6?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=9B=B8=E5=85=B3=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../block/behavior/BouncingBlockBehavior.java | 24 +++++++------------ .../UnsafeCompositeBlockBehavior.java | 6 ++++- .../bukkit/util/LocationUtils.java | 2 +- .../craftengine/core/block/BlockBehavior.java | 3 +++ 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java index d94e9f95a..60974d53c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BouncingBlockBehavior.java @@ -2,11 +2,13 @@ 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.LocationUtils; 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.ResourceConfigUtils; import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.world.Vec3d; import java.util.Map; import java.util.concurrent.Callable; @@ -25,13 +27,7 @@ public class BouncingBlockBehavior extends BukkitBlockBehavior { @Override public void fallOn(Object thisBlock, Object[] args, Callable superMethod) { Object entity = args[3]; - Object finalFallDistance; - if (VersionHelper.isOrAbove1_21_5()) { - double fallDistance = (double) args[4]; - finalFallDistance = fallDistance * 0.5; - } else { - finalFallDistance = (float) args[4] * 0.5F; - } + Object finalFallDistance = VersionHelper.isOrAbove1_21_5() ? (double) args[4] * 0.5 : (float) args[4] * 0.5F; FastNMS.INSTANCE.method$Entity$causeFallDamage( entity, finalFallDistance, 1.0F, FastNMS.INSTANCE.method$DamageSources$fall(FastNMS.INSTANCE.method$Entity$damageSources(entity)) @@ -49,16 +45,12 @@ public class BouncingBlockBehavior extends BukkitBlockBehavior { } private void bounceUp(Object entity) { - Object deltaMovement = FastNMS.INSTANCE.method$Entity$getDeltaMovement(entity); - if (FastNMS.INSTANCE.field$Vec3$y(deltaMovement) < 0.0) { + Vec3d deltaMovement = LocationUtils.fromVec(FastNMS.INSTANCE.method$Entity$getDeltaMovement(entity)); + if (deltaMovement.y < 0.0) { double d = CoreReflections.clazz$LivingEntity.isInstance(entity) ? 1.0 : 0.8; - FastNMS.INSTANCE.method$Entity$setDeltaMovement( - entity, - FastNMS.INSTANCE.field$Vec3$x(deltaMovement), - -FastNMS.INSTANCE.field$Vec3$y(deltaMovement) * this.bounceHeight * d, - FastNMS.INSTANCE.field$Vec3$z(deltaMovement) - ); - if (this.syncPlayerSelf) { + double y = -deltaMovement.y * this.bounceHeight * d; + FastNMS.INSTANCE.method$Entity$setDeltaMovement(entity, deltaMovement.x, y, deltaMovement.z); + if (CoreReflections.clazz$Player.isInstance(entity) && this.syncPlayerSelf && y > 0.032) { // 防抖 FastNMS.INSTANCE.field$Entity$hurtMarked(entity, true); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/UnsafeCompositeBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/UnsafeCompositeBlockBehavior.java index 7d3449e77..413bbd092 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/UnsafeCompositeBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/UnsafeCompositeBlockBehavior.java @@ -347,7 +347,11 @@ public class UnsafeCompositeBlockBehavior extends BukkitBlockBehavior { @Override public void updateEntityMovementAfterFallOn(Object thisBlock, Object[] args, Callable superMethod) throws Exception { for (AbstractBlockBehavior behavior : this.behaviors) { - behavior.updateEntityMovementAfterFallOn(thisBlock, args, superMethod); + if (behavior instanceof BouncingBlockBehavior bouncingBlockBehavior) { + bouncingBlockBehavior.updateEntityMovementAfterFallOn(thisBlock, args, superMethod); + return; + } } + super.updateEntityMovementAfterFallOn(thisBlock, args, superMethod); } } \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LocationUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LocationUtils.java index 0d0688e1c..9b572b357 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LocationUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LocationUtils.java @@ -29,7 +29,7 @@ public final class LocationUtils { return new Vec3d( FastNMS.INSTANCE.field$Vec3$x(vec), FastNMS.INSTANCE.field$Vec3$y(vec), - FastNMS.INSTANCE.field$Vec3$y(vec) + FastNMS.INSTANCE.field$Vec3$z(vec) ); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java index 32b164635..e620be27a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java @@ -121,6 +121,7 @@ public abstract class BlockBehavior { // 1.21+ BlockState state, ServerLevel level, BlockPos pos, Explosion explosion, BiConsumer dropConsumer public void onExplosionHit(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + superMethod.call(); } // LevelAccessor level, BlockPos pos, BlockState state, FluidState fluidState @@ -181,10 +182,12 @@ public abstract class BlockBehavior { // 1.20.1~1.21.4 Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance // 1.21.5+ Level level, BlockState state, BlockPos pos, Entity entity, double fallDistance public void fallOn(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + superMethod.call(); } // BlockGetter level, Entity entity public void updateEntityMovementAfterFallOn(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + superMethod.call(); } public ImmutableBlockState updateStateForPlacement(BlockPlaceContext context, ImmutableBlockState state) { From f85c9bb8dc33cb9c822977f70ad145b85e727ee0 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Wed, 10 Sep 2025 16:43:15 +0800 Subject: [PATCH 18/18] =?UTF-8?q?refactor(core):=20=E5=9B=9E=E9=80=80?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../net/momirealms/craftengine/core/block/BlockBehavior.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java index e620be27a..a70227fa5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java @@ -121,7 +121,6 @@ public abstract class BlockBehavior { // 1.21+ BlockState state, ServerLevel level, BlockPos pos, Explosion explosion, BiConsumer dropConsumer public void onExplosionHit(Object thisBlock, Object[] args, Callable superMethod) throws Exception { - superMethod.call(); } // LevelAccessor level, BlockPos pos, BlockState state, FluidState fluidState