From e26773d5ee7df2af83f88323833974506db6913e Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 16 Apr 2025 16:10:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AE=B6=E5=85=B7=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/loader/src/main/resources/config.yml | 13 ++++---- .../furniture/BukkitFurnitureManager.java | 21 ++++++++----- .../core/plugin/config/Config.java | 31 ++++++++++++++----- gradle.properties | 4 +-- 4 files changed, 46 insertions(+), 23 deletions(-) diff --git a/bukkit/loader/src/main/resources/config.yml b/bukkit/loader/src/main/resources/config.yml index 28d44c613..252604a20 100644 --- a/bukkit/loader/src/main/resources/config.yml +++ b/bukkit/loader/src/main/resources/config.yml @@ -159,15 +159,16 @@ block: furniture: # Automatically remove outdated furniture entities when a chunk is loaded. - remove-invalid-furniture-on-chunk-load: + handle-invalid-furniture-on-chunk-load: # Enable/disable the cleanup system enable: false - # - When EMPTY: Remove ALL invalid furniture entities - # - When POPULATED: Only remove specified furniture types - # Example for targeted removal: - # list: [ "xxx:invalid_furniture", "yyy:broken_sofa" ] - list: + # Removes the specified invalid furniture + remove: - "xxx:invalid_furniture" + # Converts the invalid furniture to a valid one + convert: + "xxx:invalid_furniture": "xxx:valid_furniture" + # Hide technical entities used for storing furniture metadata. # NOTE: # - These are INVISIBLE entities used internally for tracking furniture states diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java index 25d4bd735..7b8941a43 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java @@ -349,6 +349,20 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager { public void handleBaseEntityLoadEarly(ItemDisplay display) { String id = display.getPersistentDataContainer().get(FURNITURE_KEY, PersistentDataType.STRING); if (id == null) return; + // Remove the entity if it's not a valid furniture + if (Config.handleInvalidFurniture()) { + String mapped = Config.furnitureMappings().get(id); + if (mapped != null) { + if (mapped.isEmpty()) { + display.remove(); + return; + } else { + id = mapped; + display.getPersistentDataContainer().set(FURNITURE_KEY, PersistentDataType.STRING, id); + } + } + } + Key key = Key.of(id); Optional optionalFurniture = furnitureById(key); if (optionalFurniture.isPresent()) { @@ -357,13 +371,6 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager { if (previous != null) return; LoadedFurniture furniture = addNewFurniture(display, customFurniture, getAnchorType(display, customFurniture)); furniture.initializeColliders(); // safely do it here - return; - } - // Remove the entity if it's not a valid furniture - if (Config.removeInvalidFurniture()) { - if (Config.furnitureToRemove().isEmpty() || Config.furnitureToRemove().contains(id)) { - display.remove(); - } } } 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 df095afe5..777cae1d3 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 @@ -1,6 +1,8 @@ package net.momirealms.craftengine.core.plugin.config; +import com.google.common.collect.ImmutableMap; import dev.dejvokep.boostedyaml.YamlDocument; +import dev.dejvokep.boostedyaml.block.implementation.Section; import dev.dejvokep.boostedyaml.dvs.versioning.BasicVersioning; import dev.dejvokep.boostedyaml.libs.org.snakeyaml.engine.v2.common.ScalarStyle; import dev.dejvokep.boostedyaml.libs.org.snakeyaml.engine.v2.nodes.Tag; @@ -106,8 +108,8 @@ public class Config { protected boolean chunk_system$restore_custom_blocks_on_chunk_load; protected boolean chunk_system$sync_custom_blocks_on_chunk_load; - protected boolean furniture$remove_invalid_furniture_on_chunk_load$enable; - protected Set furniture$remove_invalid_furniture_on_chunk_load$list; + protected boolean furniture$handle_invalid_furniture_on_chunk_load$enable; + protected Map furniture$handle_invalid_furniture_on_chunk_load$mapping; protected boolean furniture$hide_base_entity; protected boolean block$sound_system$enable; @@ -280,8 +282,21 @@ public class Config { chunk_system$sync_custom_blocks_on_chunk_load = config.getBoolean("chunk-system.sync-custom-blocks-on-chunk-load", false); // furniture - furniture$remove_invalid_furniture_on_chunk_load$enable = config.getBoolean("furniture.remove-invalid-furniture-on-chunk-load.enable", false); - furniture$remove_invalid_furniture_on_chunk_load$list = new HashSet<>(config.getStringList("furniture.remove-invalid-furniture-on-chunk-load.list")); + furniture$handle_invalid_furniture_on_chunk_load$enable = config.getBoolean("furniture.handle-invalid-furniture-on-chunk-load.enable", false); + ImmutableMap.Builder builder = ImmutableMap.builder(); + for (String furniture : config.getStringList("furniture.handle-invalid-furniture-on-chunk-load.remove")) { + builder.put(furniture, ""); + } + if (config.contains("furniture.handle-invalid-furniture-on-chunk-load.convert")) { + Section section = config.getSection("furniture.handle-invalid-furniture-on-chunk-load.convert"); + if (section != null) { + for (Map.Entry entry : section.getStringRouteMappedValues(false).entrySet()) { + builder.put(entry.getKey(), entry.getValue().toString()); + } + } + } + this.furniture$handle_invalid_furniture_on_chunk_load$mapping = builder.build(); + furniture$hide_base_entity = config.getBoolean("furniture.hide-base-entity", true); // block @@ -372,12 +387,12 @@ public class Config { return instance.performance$max_emojis_per_parse; } - public static boolean removeInvalidFurniture() { - return instance.furniture$remove_invalid_furniture_on_chunk_load$enable; + public static boolean handleInvalidFurniture() { + return instance.furniture$handle_invalid_furniture_on_chunk_load$enable; } - public static Set furnitureToRemove() { - return instance.furniture$remove_invalid_furniture_on_chunk_load$list; + public static Map furnitureMappings() { + return instance.furniture$handle_invalid_furniture_on_chunk_load$mapping; } public static boolean forceUpdateLight() { diff --git a/gradle.properties b/gradle.properties index eab4ffe19..72593c134 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,8 +2,8 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.48 -config_version=26 +project_version=0.0.48.1 +config_version=27 lang_version=4 project_group=net.momirealms latest_supported_version=1.21.5