From f08544f82e30e9b5fdd6362dc71075309dbd996e Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 26 May 2025 22:56:55 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=BC=E5=90=88=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/loader/src/main/resources/config.yml | 2 -- .../default/configuration/blocks.yml | 16 +++------ .../default/configuration/palm_tree.yml | 2 +- .../default/configuration/templates.yml | 3 ++ .../bukkit/block/BukkitCustomBlock.java | 10 +++++- .../block/behavior/BushBlockBehavior.java | 34 ++++++++----------- .../block/behavior/HangingBlockBehavior.java | 7 ++-- .../behavior/VerticalCropBlockBehavior.java | 7 ---- .../item/listener/DebugStickListener.java | 10 +++--- .../plugin/injector/BukkitInjector.java | 29 +++++++--------- .../bukkit/util/BlockStateUtils.java | 6 +++- .../craftengine/bukkit/util/Reflections.java | 6 ++++ .../craftengine/core/block/BlockSettings.java | 25 +++++++++++--- .../core/plugin/config/Config.java | 6 ++-- gradle.properties | 4 +-- 15 files changed, 91 insertions(+), 76 deletions(-) diff --git a/bukkit/loader/src/main/resources/config.yml b/bukkit/loader/src/main/resources/config.yml index 48742ce2d..b0133160f 100644 --- a/bukkit/loader/src/main/resources/config.yml +++ b/bukkit/loader/src/main/resources/config.yml @@ -342,8 +342,6 @@ performance: light-system: # Required for custom light-emitting blocks enable: true - # Turning this option on will reduce lighting system issues to some extent, but will increase server bandwidth consumption. - force-update-light: false chunk-system: # With cache system, those frequently load/unload chunks would consume fewer resources on serialization diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml b/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml index 1f59683ba..db308dcbc 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml @@ -21,11 +21,9 @@ items#misc: - default:hardness/wool - default:burn_data/planks - default:sound/wood + - default:settings/solid_1x1x1 overrides: push-reaction: NORMAL - replaceable: false - is-redstone-conductor: true - is-suffocating: false instrument: HARP luminance: 15 map-color: 36 @@ -145,12 +143,10 @@ items#misc: settings: template: - default:sound/sand + - default:settings/solid_1x1x1 overrides: hardness: 0.5 resistance: 0.5 - replaceable: false - is-redstone-conductor: true - is-suffocating: true instrument: SNARE map-color: 45 item: default:gunpowder_block @@ -184,12 +180,10 @@ items#misc: template: - default:sound/sand - default:pickaxe_power/level_1 + - default:settings/solid_1x1x1 overrides: hardness: 1.8 resistance: 1.8 - replaceable: false - is-redstone-conductor: true - is-suffocating: true instrument: BASEDRUM map-color: 45 item: default:solid_gunpowder_block @@ -232,8 +226,8 @@ items#misc: instrument: BASEDRUM map-color: 15 item: default:copper_coil - behaviors: - - type: lamp_block + behavior: + type: lamp_block states: properties: lit: diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/palm_tree.yml b/bukkit/loader/src/main/resources/resources/default/configuration/palm_tree.yml index c9644b233..de1ec717e 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/palm_tree.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/palm_tree.yml @@ -229,7 +229,7 @@ items: template: "default:settings/sapling" overrides: item: default:palm_sapling - behavior: + behaviors: - type: bush_block bottom-block-tags: - minecraft:dirt diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/templates.yml b/bukkit/loader/src/main/resources/resources/default/configuration/templates.yml index a281f7e41..ae9b65d76 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/templates.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/templates.yml @@ -583,10 +583,13 @@ templates#settings#break_level: templates#settings#blocks: default:settings/solid_1x1x1: is-suffocating: true + replaceable: false is-view-blocking: true + is-redstone-conductor: true can-occlude: true default:settings/transparent_1x1x1: is-suffocating: false + replaceable: false is-view-blocking: false can-occlude: false # sapling diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlock.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlock.java index 7cadd52e3..b69cc2ece 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlock.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlock.java @@ -73,7 +73,13 @@ public class BukkitCustomBlock extends AbstractCustomBlock { BlockStateUtils.setHardness(mcBlockState, settings.hardness()); BlockStateUtils.setPushReaction(mcBlockState, settings.pushReaction()); BlockStateUtils.setReplaceable(mcBlockState, settings.replaceable()); - BlockStateUtils.setCanOcclude(mcBlockState, settings.canOcclude()); + if (settings.canOcclude() == Tristate.TRUE) { + BlockStateUtils.setCanOcclude(mcBlockState, true); + } else if (settings.canOcclude() == Tristate.FALSE) { + BlockStateUtils.setCanOcclude(mcBlockState, false); + } else { + BlockStateUtils.setCanOcclude(mcBlockState, BlockStateUtils.isOcclude(state.vanillaBlockState().handle())); + } if (settings.isRedstoneConductor() == Tristate.TRUE) { BlockStateUtils.setIsRedstoneConductor(mcBlockState, StatePredicate.alwaysTrue()); } else if (settings.isRedstoneConductor() == Tristate.FALSE) { @@ -138,6 +144,8 @@ public class BukkitCustomBlock extends AbstractCustomBlock { } // set random tick later BlockStateUtils.setIsRandomlyTicking(mcBlockState, settings.isRandomlyTicking()); + // set propagates skylight + BlockStateUtils.setPropagatesSkylightDown(mcBlockState, settings.propagatesSkylightDown()); // bind tags Object holder = BukkitCraftEngine.instance().blockManager().getMinecraftBlockHolder(state.customBlockState().registryId()); Set tags = new HashSet<>(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java index 819173ed1..db5beb2ba 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java @@ -23,18 +23,18 @@ import java.util.*; public class BushBlockBehavior extends AbstractCanSurviveBlockBehavior { public static final Factory FACTORY = new Factory(); protected final List tagsCanSurviveOn; - protected final Set blocksCansSurviveOn; + protected final Set blockStatesCanSurviveOn; protected final Set customBlocksCansSurviveOn; - protected final boolean any; + protected final boolean blacklistMode; protected final boolean stackable; - public BushBlockBehavior(CustomBlock block, int delay, boolean stackable, List tagsCanSurviveOn, Set blocksCansSurviveOn, Set customBlocksCansSurviveOn) { + public BushBlockBehavior(CustomBlock block, int delay, boolean blacklist, boolean stackable, List tagsCanSurviveOn, Set blockStatesCanSurviveOn, Set customBlocksCansSurviveOn) { super(block, delay); + this.blacklistMode = blacklist; this.stackable = stackable; this.tagsCanSurviveOn = tagsCanSurviveOn; - this.blocksCansSurviveOn = blocksCansSurviveOn; + this.blockStatesCanSurviveOn = blockStatesCanSurviveOn; this.customBlocksCansSurviveOn = customBlocksCansSurviveOn; - this.any = this.tagsCanSurviveOn.isEmpty() && this.blocksCansSurviveOn.isEmpty() && this.customBlocksCansSurviveOn.isEmpty(); } public static class Factory implements BlockBehaviorFactory { @@ -44,7 +44,8 @@ public class BushBlockBehavior extends AbstractCanSurviveBlockBehavior { Tuple, Set, Set> tuple = readTagsAndState(arguments, false); boolean stackable = (boolean) arguments.getOrDefault("stackable", false); int delay = ResourceConfigUtils.getAsInt(arguments.getOrDefault("delay", 0), "delay"); - return new BushBlockBehavior(block, delay, stackable, tuple.left(), tuple.mid(), tuple.right()); + boolean blacklistMode = (boolean) arguments.getOrDefault("blacklist", false); + return new BushBlockBehavior(block, delay, blacklistMode, stackable, tuple.left(), tuple.mid(), tuple.right()); } } @@ -85,35 +86,30 @@ public class BushBlockBehavior extends AbstractCanSurviveBlockBehavior { } protected boolean mayPlaceOn(Object belowState, Object world, Object belowPos) throws ReflectiveOperationException { - if (this.any) { - return belowState != Reflections.instance$Blocks$AIR$defaultState; - } for (Object tag : this.tagsCanSurviveOn) { if ((boolean) Reflections.method$BlockStateBase$hasTag.invoke(belowState, tag)) { - return true; + return !this.blacklistMode; } } int id = BlockStateUtils.blockStateToId(belowState); if (BlockStateUtils.isVanillaBlock(id)) { - if (!this.blocksCansSurviveOn.isEmpty() && this.blocksCansSurviveOn.contains(belowState)) { - return true; + if (!this.blockStatesCanSurviveOn.isEmpty() && this.blockStatesCanSurviveOn.contains(belowState)) { + return !this.blacklistMode; } } else { ImmutableBlockState belowCustomState = BukkitBlockManager.instance().getImmutableBlockState(id); if (belowCustomState != null && !belowCustomState.isEmpty()) { - if (stackable) { - if (belowCustomState.owner().value() == super.customBlock) { - return true; - } + if (belowCustomState.owner().value() == super.customBlock) { + return this.stackable; } if (this.customBlocksCansSurviveOn.contains(belowCustomState.owner().value().id().toString())) { - return true; + return !this.blacklistMode; } if (this.customBlocksCansSurviveOn.contains(belowCustomState.toString())) { - return true; + return !this.blacklistMode; } } } - return false; + return this.blacklistMode; } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/HangingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/HangingBlockBehavior.java index 3e061a22f..39ff98d0b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/HangingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/HangingBlockBehavior.java @@ -14,8 +14,8 @@ import java.util.Set; public class HangingBlockBehavior extends BushBlockBehavior { public static final Factory FACTORY = new Factory(); - public HangingBlockBehavior(CustomBlock block, int delay, boolean stackable, List tagsCanSurviveOn, Set blocksCansSurviveOn, Set customBlocksCansSurviveOn) { - super(block, delay, stackable, tagsCanSurviveOn, blocksCansSurviveOn, customBlocksCansSurviveOn); + public HangingBlockBehavior(CustomBlock block, int delay, boolean blacklist, boolean stackable, List tagsCanSurviveOn, Set blocksCansSurviveOn, Set customBlocksCansSurviveOn) { + super(block, delay, blacklist, stackable, tagsCanSurviveOn, blocksCansSurviveOn, customBlocksCansSurviveOn); } @Override @@ -35,7 +35,8 @@ public class HangingBlockBehavior extends BushBlockBehavior { Tuple, Set, Set> tuple = readTagsAndState(arguments, true); boolean stackable = (boolean) arguments.getOrDefault("stackable", false); int delay = ResourceConfigUtils.getAsInt(arguments.getOrDefault("delay", 0), "delay"); - return new HangingBlockBehavior(block, delay, stackable, tuple.left(), tuple.mid(), tuple.right()); + boolean blacklistMode = (boolean) arguments.getOrDefault("blacklist", false); + return new HangingBlockBehavior(block, delay, blacklistMode, stackable, tuple.left(), tuple.mid(), tuple.right()); } } } 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 cc180490c..3c36cce5d 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 @@ -5,23 +5,16 @@ import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.bukkit.util.Reflections; -import net.momirealms.craftengine.bukkit.world.BukkitWorld; import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.block.UpdateOption; import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.block.properties.IntegerProperty; import net.momirealms.craftengine.core.block.properties.Property; -import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.plugin.context.ContextHolder; -import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; import net.momirealms.craftengine.core.util.RandomUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.world.BlockPos; -import net.momirealms.craftengine.core.world.Vec3d; -import net.momirealms.craftengine.core.world.WorldEvents; -import net.momirealms.craftengine.core.world.WorldPosition; import net.momirealms.craftengine.shared.block.BlockBehavior; import java.util.Map; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/DebugStickListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/DebugStickListener.java index 59ef9e2dd..19a70df37 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/DebugStickListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/DebugStickListener.java @@ -1,9 +1,10 @@ package net.momirealms.craftengine.bukkit.item.listener; +import com.saicone.rtag.RtagItem; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; -import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.item.LegacyItemWrapper; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; @@ -13,7 +14,6 @@ import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.block.UpdateOption; import net.momirealms.craftengine.core.block.properties.Property; -import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.util.MCUtils; import net.momirealms.craftengine.core.util.MiscUtils; import org.bukkit.Material; @@ -73,8 +73,8 @@ public class DebugStickListener implements Listener { ComponentUtils.adventureToMinecraft(Component.translatable("item.minecraft.debug_stick.empty").arguments(Component.text(blockId))), true); player.sendPacket(systemChatPacket, false); } else { - Item wrapped = BukkitItemManager.instance().wrap(itemInHand); - Object storedData = wrapped.getTag("craftengine:debug_stick_state"); + LegacyItemWrapper wrapped = new LegacyItemWrapper(new RtagItem(itemInHand), itemInHand.getAmount()); + Object storedData = wrapped.get("craftengine:debug_stick_state"); if (storedData == null) storedData = new HashMap<>(); if (storedData instanceof Map map) { Map data = MiscUtils.castToMap(map, false); @@ -96,7 +96,7 @@ public class DebugStickListener implements Listener { } else { currentProperty = getRelative(properties, currentProperty, player.isSecondaryUseActive()); data.put(blockId, currentProperty.name()); - wrapped.setTag(data, "craftengine:debug_stick_state"); + wrapped.set(data, "craftengine:debug_stick_state"); wrapped.load(); Object systemChatPacket = Reflections.constructor$ClientboundSystemChatPacket.newInstance( ComponentUtils.adventureToMinecraft(Component.translatable("item.minecraft.debug_stick.select") diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java index ad535cb48..f3bd26abd 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java @@ -29,6 +29,7 @@ import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.item.recipe.BukkitRecipeManager; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.bukkit.util.NoteBlockChainUpdateUtils; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.block.BlockKeys; @@ -56,7 +57,6 @@ import net.momirealms.craftengine.core.world.chunk.InjectedHolder; import net.momirealms.craftengine.shared.ObjectHolder; import net.momirealms.craftengine.shared.block.*; import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.Nullable; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; @@ -809,19 +809,18 @@ public class BukkitInjector { // 如果先前不是空气则标记 if (!previous.isEmpty()) { holder.ceChunk().setDirty(true); - } - if (Config.enableLightSystem() && Config.forceUpdateLight()) { - updateLightIfChanged(holder, previousState, newState, null, y, z, x); + if (Config.enableLightSystem()) { + updateLightIfChanged(holder, previous.vanillaBlockState().handle(), newState, y, z, x); + } } } else { ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockStateUnsafe(stateId); ImmutableBlockState previousImmutableBlockState = section.setBlockState(x, y, z, immutableBlockState); - // 如果之前的自定义块(空气)和当前自定义块不同 - if (previousImmutableBlockState != immutableBlockState) { - holder.ceChunk().setDirty(true); - if (Config.enableLightSystem() && !immutableBlockState.isEmpty()) { - updateLightIfChanged(holder, previousState, newState, immutableBlockState.vanillaBlockState().handle(), y, z, x); - } + if (previousImmutableBlockState == immutableBlockState) return; + holder.ceChunk().setDirty(true); + // 如果新方块的光照属性和客户端认为的不同 + if (Config.enableLightSystem() && !immutableBlockState.isEmpty()) { + updateLightIfChanged(holder, immutableBlockState.vanillaBlockState().handle(), newState, y, z, x); } } } catch (Exception e) { @@ -829,13 +828,11 @@ public class BukkitInjector { } } - protected static void updateLightIfChanged(@This InjectedHolder thisObj, Object previousBlockState, Object newState, @Nullable Object clientSideNewState, int y, int z, int x) throws ReflectiveOperationException { - int previousLight = BlockStateUtils.getLightEmission(previousBlockState); - int newLight = BlockStateUtils.getLightEmission(newState); - if (previousLight != newLight || (clientSideNewState != null && (BlockStateUtils.isOcclude(newState) != BlockStateUtils.isOcclude(clientSideNewState)))) { - CEWorld world = thisObj.ceChunk().world(); + protected static void updateLightIfChanged(@This InjectedHolder thisObj, Object oldState, Object newState, int y, int z, int x) { + CEWorld world = thisObj.ceChunk().world(); + if (FastNMS.INSTANCE.method$LightEngine$hasDifferentLightProperties(oldState, newState, world.world().serverWorld(), LocationUtils.toBlockPos(x, y, z))) { SectionPos sectionPos = thisObj.cePos(); - List pos = SectionPosUtils.calculateAffectedRegions((sectionPos.x() << 4) + x, (sectionPos.y() << 4) + y, (sectionPos.z() << 4) + z, Math.max(newLight, previousLight)); + List pos = SectionPosUtils.calculateAffectedRegions((sectionPos.x() << 4) + x, (sectionPos.y() << 4) + y, (sectionPos.z() << 4) + z, 15); world.sectionLightUpdated(pos); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java index 253fadb01..49ab01ffe 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java @@ -189,6 +189,10 @@ public class BlockStateUtils { Reflections.field$BlockStateBase$isRandomlyTicking.set(state, randomlyTicking); } + public static void setPropagatesSkylightDown(Object state, boolean propagatesSkylightDown) throws ReflectiveOperationException { + Reflections.field$BlockStateBase$propagatesSkylightDown.set(state, propagatesSkylightDown); + } + public static void setReplaceable(Object state, boolean replaceable) throws ReflectiveOperationException { Reflections.field$BlockStateBase$replaceable.set(state, replaceable); } @@ -205,7 +209,7 @@ public class BlockStateUtils { Reflections.field$BlockStateBase$canOcclude.set(state, canOcclude); } - public static boolean isOcclude(Object state) throws ReflectiveOperationException { + public static boolean isOcclude(Object state) { return FastNMS.INSTANCE.method$BlockStateBase$canOcclude(state); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index 5b3f765a4..e8c3f2fa4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -2423,6 +2423,12 @@ public class Reflections { ) ); + public static final Field field$BlockStateBase$propagatesSkylightDown = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, boolean.class, 11 + ) + ); + public static final Field field$BlockStateBase$requiresCorrectToolForDrops = requireNonNull( ReflectionUtils.getDeclaredField( clazz$BlockStateBase, boolean.class, 5 diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockSettings.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockSettings.java index 71ea2b52f..aefe694fb 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/BlockSettings.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockSettings.java @@ -12,11 +12,11 @@ public class BlockSettings { boolean burnable; int burnChance; int fireSpreadChance; - int blockLight = -1; // TODO investigate how starlight works + int blockLight = -1; boolean replaceable; float hardness = 2f; float resistance = 2f; - boolean canOcclude; + Tristate canOcclude = Tristate.UNDEFINED; boolean fluidState; boolean requireCorrectTools; boolean respectToolComponent; @@ -35,6 +35,7 @@ public class BlockSettings { Set correctTools = Set.of(); String name; String supportShapeBlockState; + boolean propagatesSkylightDown; private BlockSettings() {} @@ -91,6 +92,7 @@ public class BlockSettings { newSettings.name = settings.name; newSettings.incorrectToolSpeed = settings.incorrectToolSpeed; newSettings.supportShapeBlockState = settings.supportShapeBlockState; + newSettings.propagatesSkylightDown = settings.propagatesSkylightDown; return newSettings; } @@ -130,7 +132,7 @@ public class BlockSettings { return hardness; } - public boolean canOcclude() { + public Tristate canOcclude() { return canOcclude; } @@ -198,6 +200,10 @@ public class BlockSettings { return supportShapeBlockState; } + public boolean propagatesSkylightDown() { + return propagatesSkylightDown; + } + public BlockSettings correctTools(Set correctTools) { this.correctTools = correctTools; return this; @@ -263,7 +269,7 @@ public class BlockSettings { return this; } - public BlockSettings canOcclude(boolean canOcclude) { + public BlockSettings canOcclude(Tristate canOcclude) { this.canOcclude = canOcclude; return this; } @@ -293,6 +299,11 @@ public class BlockSettings { return this; } + public BlockSettings propagatesSkylightDown(boolean propagatesSkylightDown) { + this.propagatesSkylightDown = propagatesSkylightDown; + return this; + } + public BlockSettings blockLight(int intValue) { this.blockLight = intValue; return this; @@ -362,6 +373,10 @@ public class BlockSettings { boolean booleanValue = (boolean) value; return settings -> settings.isRandomlyTicking(booleanValue); })); + registerFactory("propagate-skylight", (value -> { + boolean booleanValue = (boolean) value; + return settings -> settings.propagatesSkylightDown(booleanValue); + })); registerFactory("push-reaction", (value -> { PushReaction reaction = PushReaction.valueOf(value.toString().toUpperCase(Locale.ENGLISH)); return settings -> settings.pushReaction(reaction); @@ -420,7 +435,7 @@ public class BlockSettings { })); registerFactory("can-occlude", (value -> { boolean booleanValue = (boolean) value; - return settings -> settings.canOcclude(booleanValue); + return settings -> settings.canOcclude(booleanValue ? Tristate.FALSE : Tristate.TRUE); })); registerFactory("correct-tools", (value -> { List tools = MiscUtils.getAsStringList(value); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java index d081b5e87..ba0a8dc36 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java @@ -404,9 +404,9 @@ public class Config { return instance.furniture$handle_invalid_furniture_on_chunk_load$mapping; } - public static boolean forceUpdateLight() { - return instance.light_system$force_update_light; - } +// public static boolean forceUpdateLight() { +// return instance.light_system$force_update_light; +// } public static boolean enableLightSystem() { return instance.light_system$enable; diff --git a/gradle.properties b/gradle.properties index a771bb053..eefd53031 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.54.11 +project_version=0.0.54.12 config_version=34 lang_version=14 project_group=net.momirealms @@ -50,7 +50,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.65.32 +nms_helper_version=0.65.33 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23