From 4073f40c080f143ba8e90875409ef8b07556b62f Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Sun, 22 Jun 2025 19:58:03 +0800 Subject: [PATCH] =?UTF-8?q?feat(block):=20=E6=B7=BB=E5=8A=A0=E9=95=90?= =?UTF-8?q?=E6=96=B9=E5=9D=97=E5=92=8C=E6=94=BE=E7=BD=AE=E6=96=B9=E5=9D=97?= =?UTF-8?q?=E8=A1=8C=E4=B8=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../block/behavior/BukkitBlockBehaviors.java | 4 + .../FacingTriggerableBlockBehavior.java | 49 +++++ .../block/behavior/PickaxeBlockBehavior.java | 54 ++++++ .../block/behavior/PlaceBlockBehavior.java | 176 ++++++++++++++++++ .../reflection/minecraft/CoreReflections.java | 69 +++++++ .../src/main/resources/translations/en.yml | 4 + .../src/main/resources/translations/zh_cn.yml | 4 + gradle.properties | 4 +- 8 files changed, 362 insertions(+), 2 deletions(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FacingTriggerableBlockBehavior.java create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PickaxeBlockBehavior.java create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PlaceBlockBehavior.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 02a5d1541..360ff87c6 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 @@ -26,6 +26,8 @@ public class BukkitBlockBehaviors extends BlockBehaviors { public static final Key SLAB_BLOCK = Key.from("craftengine:slab_block"); public static final Key STAIRS_BLOCK = Key.from("craftengine:stairs_block"); public static final Key PRESSURE_PLATE_BLOCK = Key.from("craftengine:pressure_plate_block"); + public static final Key PICKAXE_BLOCK = Key.from("craftengine:pickaxe_block"); + public static final Key PLACE_BLOCK = Key.from("craftengine:place_block"); public static void init() { register(EMPTY, (block, args) -> EmptyBlockBehavior.INSTANCE); @@ -50,5 +52,7 @@ public class BukkitBlockBehaviors extends BlockBehaviors { register(SLAB_BLOCK, SlabBlockBehavior.FACTORY); register(STAIRS_BLOCK, StairsBlockBehavior.FACTORY); register(PRESSURE_PLATE_BLOCK, PressurePlateBlockBehavior.FACTORY); + register(PICKAXE_BLOCK, PickaxeBlockBehavior.FACTORY); + register(PLACE_BLOCK, PlaceBlockBehavior.FACTORY); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FacingTriggerableBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FacingTriggerableBlockBehavior.java new file mode 100644 index 000000000..dc7f98d1a --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FacingTriggerableBlockBehavior.java @@ -0,0 +1,49 @@ +package net.momirealms.craftengine.bukkit.block.behavior; + +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.item.context.BlockPlaceContext; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Direction; + +import java.util.concurrent.Callable; + +public abstract class FacingTriggerableBlockBehavior extends BukkitBlockBehavior { + protected final Property facingProperty; + protected final Property triggeredProperty; + + public FacingTriggerableBlockBehavior(CustomBlock customBlock, Property facing, Property triggered) { + super(customBlock); + this.facingProperty = facing; + this.triggeredProperty = triggered; + } + + @Override + public void neighborChanged(Object thisBlock, Object[] args, Callable superMethod) { + CraftEngine.instance().logger().warn("FacingTriggerableBlockBehavior.neighborChanged"); + Object state = args[0]; + Object level = args[1]; + Object pos = args[2]; + boolean hasNeighborSignal = FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(level, pos); + ImmutableBlockState blockState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(state)); + if (blockState == null || blockState.isEmpty()) return; + boolean triggeredValue = blockState.get(this.triggeredProperty); + if (hasNeighborSignal && !triggeredValue) { + FastNMS.INSTANCE.method$LevelAccessor$scheduleBlockTick(level, pos, thisBlock, 1, this.getTickPriority()); + FastNMS.INSTANCE.method$LevelWriter$setBlock(level, pos, blockState.with(this.triggeredProperty, true).customBlockState().handle(), 2); + } else if (!hasNeighborSignal && triggeredValue) { + FastNMS.INSTANCE.method$LevelWriter$setBlock(level, pos, blockState.with(this.triggeredProperty, false).customBlockState().handle(), 2); + } + } + + @Override + public ImmutableBlockState updateStateForPlacement(BlockPlaceContext context, ImmutableBlockState state) { + return state.owner().value().defaultState().with(this.facingProperty, context.getNearestLookingDirection().opposite()); + } + + protected abstract Object getTickPriority(); +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PickaxeBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PickaxeBlockBehavior.java new file mode 100644 index 000000000..8e40c8025 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PickaxeBlockBehavior.java @@ -0,0 +1,54 @@ +package net.momirealms.craftengine.bukkit.block.behavior; + +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.DirectionUtils; +import net.momirealms.craftengine.core.block.BlockBehavior; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; + +import java.util.Map; +import java.util.concurrent.Callable; + +public class PickaxeBlockBehavior extends FacingTriggerableBlockBehavior { + public static final Factory FACTORY = new Factory(); + + public PickaxeBlockBehavior(CustomBlock customBlock, Property facing, Property triggered) { + super(customBlock, facing, triggered); + } + + @Override + protected Object getTickPriority() { + return CoreReflections.instance$TickPriority$EXTREMELY_HIGH; + } + + @Override + public void tick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object state = args[0]; + Object level = args[1]; + Object pos = args[2]; + ImmutableBlockState blockState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(state)); + if (blockState == null || blockState.isEmpty()) return; + Object blockPos = FastNMS.INSTANCE.method$BlockPos$relative(pos, DirectionUtils.toNMSDirection(blockState.get(this.facingProperty))); + if (!FastNMS.INSTANCE.method$BlockStateBase$isAir(FastNMS.INSTANCE.method$BlockGetter$getBlockState(level, blockPos))) { + FastNMS.INSTANCE.method$LevelWriter$destroyBlock(level, blockPos, true, null, 512); + } + } + + 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.pickaxe.missing_facing"); + Property triggered = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("triggered"), "warning.config.block.behavior.pickaxe.missing_triggered"); + return new PickaxeBlockBehavior(block, facing, triggered); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PlaceBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PlaceBlockBehavior.java new file mode 100644 index 000000000..0f2944a7c --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PlaceBlockBehavior.java @@ -0,0 +1,176 @@ +package net.momirealms.craftengine.bukkit.block.behavior; + +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MEntityTypes; +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.util.Direction; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import net.momirealms.craftengine.core.world.BlockPos; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.function.Function; + +public class PlaceBlockBehavior extends FacingTriggerableBlockBehavior { + public static final Factory FACTORY = new Factory(); + + public PlaceBlockBehavior(CustomBlock customBlock, Property facing, Property triggered) { + super(customBlock, facing, triggered); + } + + @Override + protected Object getTickPriority() { + return CoreReflections.instance$TickPriority$EXTREMELY_LOW; + } + + @Override + public void tick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object state = args[0]; + Object level = args[1]; + BlockPos pos = LocationUtils.fromBlockPos(args[2]); + ImmutableBlockState blockState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(state)); + if (blockState == null || blockState.isEmpty()) return; + Direction direction = blockState.get(this.facingProperty); + Direction opposite = direction.opposite(); + BlockPos blockPos = pos.relative(opposite); + BlockPos blockPos1 = pos.relative(direction); + getItemAndDoThings(level, blockPos, opposite, itemStack -> { + if (FastNMS.INSTANCE.method$ItemStack$isEmpty(itemStack)) { + return false; + } else { + Object itemStack1 = FastNMS.INSTANCE.method$ItemEntity$getItem(itemStack); + boolean flag = CoreReflections.clazz$BlockItem.isInstance(itemStack1) + && FastNMS.INSTANCE.method$InteractionResult$consumesAction(FastNMS.INSTANCE.method$BlockItem$place( + itemStack1, FastNMS.INSTANCE.constructor$PlaceBlockBlockPlaceContext( + level, CoreReflections.instance$InteractionHand$MAIN_HAND, itemStack, + FastNMS.INSTANCE.constructor$BlockHitResult( + FastNMS.INSTANCE.method$BlockPos$getCenter(LocationUtils.toBlockPos(blockPos1)), + DirectionUtils.toNMSDirection(opposite), + LocationUtils.toBlockPos(blockPos1), + false + ) + ))); + + if (!flag) { + double d = FastNMS.INSTANCE.method$EntityType$getHeight(MEntityTypes.ITEM) / 2.0; + double d1 = blockPos1.x() + 0.5; + double d2 = blockPos1.y() + 0.5 - d; + double d3 = blockPos1.z() + 0.5; + Object itemEntity = FastNMS.INSTANCE.constructor$ItemEntity(level, d1, d2, d3, itemStack); + FastNMS.INSTANCE.method$ItemEntity$setDefaultPickUpDelay(itemEntity); + FastNMS.INSTANCE.method$LevelWriter$addFreshEntity(level, itemEntity); + } + return true; + } + }); + } + + private static boolean getItemAndDoThings(Object level, BlockPos blockPos, Direction direction, Function function) { + for (Object container : getContainersAt(level, blockPos)) { + boolean flag = FastNMS.INSTANCE.method$HopperBlockEntity$getSlots(container, direction).anyMatch(i -> { + Object itemStack = FastNMS.INSTANCE.method$Container$removeItem(container, i, 1); + if (!FastNMS.INSTANCE.method$ItemStack$isEmpty(itemStack)) { + boolean flag1 = function.apply(FastNMS.INSTANCE.method$ItemStack$copy(itemStack)); + if (flag1) { + FastNMS.INSTANCE.method$Container$setChanged(container); + } else { + FastNMS.INSTANCE.method$Container$setItem(container, i, itemStack); + } + + return true; + } else { + return false; + } + }); + if (flag) { + return true; + } + } + Object itemAt = getItemAt(level, blockPos); + if (itemAt != null) { + Object item = FastNMS.INSTANCE.method$ItemEntity$getItem(itemAt); + if (!FastNMS.INSTANCE.method$ItemStack$isEmpty(item)) { + boolean flag = function.apply(FastNMS.INSTANCE.method$ItemStack$copyWithCount(item, 1)); + if (flag) { + FastNMS.INSTANCE.method$ItemStack$shrink(item, 1); + if (FastNMS.INSTANCE.method$ItemStack$getCount(item) <= 0) { + FastNMS.INSTANCE.method$Entity$discard(itemAt); + } + } + + return true; + } + } + return false; + } + + @SuppressWarnings("unchecked") + public static List getContainersAt(Object level, BlockPos blockPos) { + Object nmsBlockPos = LocationUtils.toBlockPos(blockPos); + Object blockState = FastNMS.INSTANCE.method$BlockGetter$getBlockState(level, nmsBlockPos); + Object block = FastNMS.INSTANCE.method$BlockState$getBlock(blockState); + if (CoreReflections.clazz$WorldlyContainerHolder.isInstance(block)) { + Object container = FastNMS.INSTANCE.method$WorldlyContainerHolder$getContainer(block, blockState, level, nmsBlockPos); + if (container != null) { + return List.of(container); + } + } else if (FastNMS.INSTANCE.method$BlockStateBase$hasBlockEntity(blockState)) { + Object blockEntity = FastNMS.INSTANCE.method$BlockGetter$getBlockEntity(level, nmsBlockPos); + if (CoreReflections.clazz$Container.isInstance(blockEntity)) { + if (!(CoreReflections.clazz$ChestBlockEntity.isInstance(blockEntity)) || !(CoreReflections.clazz$ChestBlock.isInstance(block))) { + return List.of(blockEntity); + } + Object container = FastNMS.INSTANCE.method$ChestBlock$getContainer(block, blockState, level, nmsBlockPos, true); + if (container != null) { + return List.of(container); + } + } + } + List list = new ArrayList<>(); + for (Object entity : (List) FastNMS.INSTANCE.method$EntityGetter$getEntities( + level, null, blockAABB(nmsBlockPos), + entity -> CoreReflections.clazz$Container.isInstance(entity) && FastNMS.INSTANCE.method$Entity$isAlive(entity)) + ) { + if (CoreReflections.clazz$Container.isInstance(entity)) { + list.add(entity); + } + } + return list; + } + + @Nullable + @SuppressWarnings("unchecked") + public static Object getItemAt(Object level, Object blockPos) { + List entitiesOfClass = (List) FastNMS.INSTANCE.method$EntityGetter$getEntitiesOfClass( + level, CoreReflections.clazz$ItemEntity, blockAABB(blockPos), FastNMS.INSTANCE::method$Entity$isAlive + ); + return entitiesOfClass.isEmpty() ? null : entitiesOfClass.getFirst(); + } + + private static Object blockAABB(Object blockPos) { + return FastNMS.INSTANCE.method$AABB$ofSize(FastNMS.INSTANCE.method$BlockPos$getCenter(blockPos), 0.9999999, 0.9999999, 0.9999999); + } + + 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.place_block.missing_facing"); + Property triggered = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("triggered"), "warning.config.block.behavior.place_block.missing_triggered"); + return new PlaceBlockBehavior(block, facing, triggered); + } + } +} 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 5dfce3f3b..ac04131f7 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 @@ -3509,4 +3509,73 @@ public final class CoreReflections { clazz$Level, boolean.class, clazz$BlockPos, boolean.class, clazz$Entity, int.class ) ); + + public static final Class clazz$TickPriority = requireNonNull( + BukkitReflectionUtils.findReobfOrMojmapClass( + "world.ticks.TickListPriority", + "world.ticks.TickPriority" + ) + ); + + public static final Method method$TickPriority$values = requireNonNull( + ReflectionUtils.getStaticMethod(clazz$TickPriority, clazz$TickPriority.arrayType()) + ); + + public static final Object instance$TickPriority$EXTREMELY_HIGH; + public static final Object instance$TickPriority$VERY_HIGH; + public static final Object instance$TickPriority$HIGH; + public static final Object instance$TickPriority$NORMAL; + public static final Object instance$TickPriority$LOW; + public static final Object instance$TickPriority$VERY_LOW; + public static final Object instance$TickPriority$EXTREMELY_LOW; + + static { + try { + Object[] values = (Object[]) method$TickPriority$values.invoke(null); + instance$TickPriority$EXTREMELY_HIGH = values[0]; + instance$TickPriority$VERY_HIGH = values[1]; + instance$TickPriority$HIGH = values[2]; + instance$TickPriority$NORMAL = values[3]; + instance$TickPriority$LOW = values[4]; + instance$TickPriority$VERY_LOW = values[5]; + instance$TickPriority$EXTREMELY_LOW = values[6]; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static final Class clazz$WorldlyContainerHolder = requireNonNull( + BukkitReflectionUtils.findReobfOrMojmapClass( + "world.IInventoryHolder", + "world.WorldlyContainerHolder" + ) + ); + + public static final Class clazz$ChestBlockEntity = requireNonNull( + BukkitReflectionUtils.findReobfOrMojmapClass( + "world.level.block.entity.TileEntityChest", + "world.level.block.entity.ChestBlockEntity" + ) + ); + + public static final Class clazz$ChestBlock = requireNonNull( + BukkitReflectionUtils.findReobfOrMojmapClass( + "world.level.block.BlockChest", + "world.level.block.ChestBlock" + ) + ); + + public static final Class clazz$ItemEntity = requireNonNull( + BukkitReflectionUtils.findReobfOrMojmapClass( + "world.entity.item.EntityItem", + "world.entity.item.ItemEntity" + ) + ); + + public static final Class clazz$BlockItem = requireNonNull( + BukkitReflectionUtils.findReobfOrMojmapClass( + "world.item.ItemBlock", + "world.item.BlockItem" + ) + ); } diff --git a/common-files/src/main/resources/translations/en.yml b/common-files/src/main/resources/translations/en.yml index 9be5a8c1d..1e8b1f48a 100644 --- a/common-files/src/main/resources/translations/en.yml +++ b/common-files/src/main/resources/translations/en.yml @@ -267,6 +267,10 @@ warning.config.block.behavior.stairs.missing_facing: "Issue found in fil 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.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.pickaxe.missing_facing: "Issue found in file - The block '' is missing the required 'facing' property for 'pickaxe_block' behavior." +warning.config.block.behavior.pickaxe.missing_triggered: "Issue found in file - The block '' is missing the required 'triggered' property for 'pickaxe_block' behavior." +warning.config.block.behavior.place_block.missing_facing: "Issue found in file - The block '' is missing the required 'facing' property for 'place_block' behavior." +warning.config.block.behavior.place_block.missing_triggered: "Issue found in file - The block '' is missing the required 'triggered' property for 'place_block' behavior." warning.config.model.generation.missing_parent: "Issue found in file - The config '' is missing the required 'parent' argument in 'generation' section." warning.config.model.generation.invalid_display_position: "Issue found in file - The config '' is using an invalid display position '' in 'generation.display' section. Allowed display positions: []" warning.config.model.generation.invalid_gui_light: "Issue found in file - The config '' is using an invalid gui-light option '' in 'generation' section. Allowed gui light options: []" diff --git a/common-files/src/main/resources/translations/zh_cn.yml b/common-files/src/main/resources/translations/zh_cn.yml index 43384290d..3aaaf1d52 100644 --- a/common-files/src/main/resources/translations/zh_cn.yml +++ b/common-files/src/main/resources/translations/zh_cn.yml @@ -267,6 +267,10 @@ warning.config.block.behavior.stairs.missing_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.pressure_plate.missing_powered: "在文件 发现问题 - 方块 '' 的 'pressure_plate_block' 行为缺少必需的 'powered' 属性" +warning.config.block.behavior.pickaxe.missing_facing: "在文件 发现问题 - 方块 '' 的 'pickaxe_block' 行为缺少必需的 'facing' 属性" +warning.config.block.behavior.pickaxe.missing_triggered: "在文件 发现问题 - 方块 '' 的 'pickaxe_block' 行为缺少必需的 'triggered' 属性" +warning.config.block.behavior.place_block.missing_facing: "在文件 发现问题 - 方块 '' 的 'place_block' 行为缺少必需的 'facing' 属性" +warning.config.block.behavior.place_block.missing_triggered: "在文件 发现问题 - 方块 '' 的 'place_block' 行为缺少必需的 'triggered' 属性" warning.config.model.generation.missing_parent: "在文件 发现问题 - 配置项 '' 的 'generation' 段落缺少必需的 'parent' 参数" warning.config.model.generation.conflict: "在文件 发现问题 - 无法为 '' 生成模型 存在多个配置尝试使用相同路径 '' 生成不同的 JSON 模型" warning.config.model.generation.invalid_display_position: "在文件 发现问题 - 配置项 '' 在 'generation.display' 区域使用了无效的 display 位置类型 ''. 可用展示类型: []" diff --git a/gradle.properties b/gradle.properties index 7f01a5cd2..b75d9d182 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.58 +project_version=0.0.58.1 config_version=38 lang_version=19 project_group=net.momirealms @@ -51,7 +51,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.17 -nms_helper_version=0.67.31 +nms_helper_version=0.67.35 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23