diff --git a/bukkit/loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml index ac1084288..54e0eaa93 100644 --- a/bukkit/loader/src/main/resources/translations/en.yml +++ b/bukkit/loader/src/main/resources/translations/en.yml @@ -310,4 +310,6 @@ warning.config.function.actionbar.missing_actionbar: "Issue found in fil warning.config.function.message.missing_message: "Issue found in file - The config '' is missing the required 'message' argument for 'message' function." warning.config.selector.missing_type: "Issue found in file - The config '' is missing the required 'type' argument for selector." warning.config.selector.invalid_type: "Issue found in file - The config '' is using an invalid selector type ''." -warning.config.selector.invalid_target: "Issue found in file - The config '' is using an invalid selector target ''." \ No newline at end of file +warning.config.selector.invalid_target: "Issue found in file - The config '' is using an invalid selector target ''." +warning.config.resource_pack.item_model.conflict: "Failed to generate item model for '' because this item model has been occupied by a vanilla item." +warning.config.resource_pack.item_model.v1_21_2.conflict: "Failed to generate item model(v1.21.2) for ''." \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java index 070c400b4..31b16f093 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java @@ -132,18 +132,17 @@ public class BlockEventListener implements Listener { if (itemInHand != null) { Optional> optionalCustomItem = itemInHand.getCustomItem(); if (optionalCustomItem.isPresent()) { - Cancellable dummy = Cancellable.dummy(); + Cancellable cancellable = Cancellable.of(event::isCancelled, event::setCancelled); optionalCustomItem.get().execute( PlayerOptionalContext.of(serverPlayer, ContextHolder.builder() .withParameter(DirectContextParameters.BLOCK, new BukkitBlockInWorld(block)) .withParameter(DirectContextParameters.POSITION, position) .withParameter(DirectContextParameters.PLAYER, serverPlayer) - .withParameter(DirectContextParameters.EVENT, dummy) + .withParameter(DirectContextParameters.EVENT, cancellable) .withOptionalParameter(DirectContextParameters.ITEM_IN_HAND, itemInHand) ), EventTrigger.BREAK ); - if (dummy.isCancelled()) { - event.setCancelled(true); + if (cancellable.isCancelled()) { return; } } @@ -166,7 +165,7 @@ public class BlockEventListener implements Listener { } // execute functions - Cancellable cancellable = Cancellable.dummy(); + Cancellable cancellable = Cancellable.of(event::isCancelled, event::setCancelled); PlayerOptionalContext context = PlayerOptionalContext.of(serverPlayer, ContextHolder.builder() .withParameter(DirectContextParameters.BLOCK, new BukkitBlockInWorld(block)) .withParameter(DirectContextParameters.BLOCK_STATE, state) @@ -176,7 +175,6 @@ public class BlockEventListener implements Listener { ); state.owner().value().execute(context, EventTrigger.BREAK); if (cancellable.isCancelled()) { - event.setCancelled(true); return; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/InteractionEntityData.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/InteractionEntityData.java index 250f58909..c571504aa 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/InteractionEntityData.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/InteractionEntityData.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.bukkit.entity.data; import net.momirealms.craftengine.core.util.VersionHelper; public class InteractionEntityData extends BaseEntityData { - // Interaction only public static final InteractionEntityData Width = of(8, EntityDataValue.Serializers$FLOAT, 1F); public static final InteractionEntityData Height = of(9, EntityDataValue.Serializers$FLOAT, 1F); public static final InteractionEntityData Responsive = of(10, EntityDataValue.Serializers$BOOLEAN, false); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/TextDisplayEntityData.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/TextDisplayEntityData.java index 403fbb075..cc3324f6d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/TextDisplayEntityData.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/TextDisplayEntityData.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.bukkit.entity.data; import net.momirealms.craftengine.bukkit.util.Reflections; public class TextDisplayEntityData extends DisplayEntityData { - // Text display only public static final DisplayEntityData Text = of(23, EntityDataValue.Serializers$COMPONENT, Reflections.instance$Component$empty); public static final DisplayEntityData LineWidth = of(24, EntityDataValue.Serializers$INT, 200); public static final DisplayEntityData BackgroundColor = of(25, EntityDataValue.Serializers$INT, 0x40000000); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/ThrowableItemProjectileData.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/ThrowableItemProjectileData.java index 6e40923dc..4575d61aa 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/ThrowableItemProjectileData.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/ThrowableItemProjectileData.java @@ -5,7 +5,6 @@ import net.momirealms.craftengine.bukkit.util.Reflections; public class ThrowableItemProjectileData extends BaseEntityData { public static final ThrowableItemProjectileData ItemStack = new ThrowableItemProjectileData<>(8, EntityDataValue.Serializers$ITEM_STACK, Reflections.instance$ItemStack$Air); - public ThrowableItemProjectileData(int id, Object serializer, T defaultValue) { super(id, serializer, defaultValue); } 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 34ead8527..04dc87cdc 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 @@ -560,13 +560,13 @@ public abstract class AbstractPackManager implements PackManager { } this.generateFonts(generatedPackPath); + this.generateItemModels(generatedPackPath, this.plugin.itemManager()); + this.generateItemModels(generatedPackPath, this.plugin.blockManager()); + this.generateBlockOverrides(generatedPackPath); this.generateLegacyItemOverrides(generatedPackPath); this.generateModernItemOverrides(generatedPackPath); this.generateModernItemModels1_21_2(generatedPackPath); this.generateModernItemModels1_21_4(generatedPackPath); - this.generateBlockOverrides(generatedPackPath); - this.generateItemModels(generatedPackPath, this.plugin.itemManager()); - this.generateItemModels(generatedPackPath, this.plugin.blockManager()); this.generateOverrideSounds(generatedPackPath); this.generateCustomSounds(generatedPackPath); this.generateClientLang(generatedPackPath); @@ -911,60 +911,67 @@ public abstract class AbstractPackManager implements PackManager { if (Config.packMaxVersion() < 21.19f) return; if (Config.packMinVersion() > 21.39f) return; - boolean has = false; - for (Map.Entry> entry : plugin.itemManager().modernItemModels1_21_2().entrySet()) { - has = true; - Key key = entry.getKey(); + // 此段代码生成1.21.2专用的item model文件,情况非常复杂! + for (Map.Entry> entry : this.plugin.itemManager().modernItemModels1_21_2().entrySet()) { + Key itemModelPath = entry.getKey(); List legacyOverridesModels = entry.getValue(); - boolean first = true; - JsonObject jsonObject = new JsonObject(); - JsonArray overrides = new JsonArray(); - for (LegacyOverridesModel model : legacyOverridesModels) { - if (first) { - jsonObject.addProperty("parent", model.model()); - if (model.hasPredicate()) { - overrides.add(model.toLegacyPredicateElement()); - } - first = false; - } else { - overrides.add(model.toLegacyPredicateElement()); - } - } - if (!overrides.isEmpty()) { - jsonObject.add("overrides", overrides); + + // 检测item model合法性 + if (PRESET_MODERN_MODELS_ITEM.containsKey(itemModelPath) || PRESET_LEGACY_MODELS_ITEM.containsKey(itemModelPath)) { + TranslationManager.instance().log("warning.config.resource_pack.item_model.conflict", itemModelPath.asString()); + continue; } + // 要检查目标生成路径是否已经存在模型,如果存在模型,应该只为其生成overrides Path itemPath = generatedPackPath .resolve("assets") - .resolve(key.namespace()) + .resolve(itemModelPath.namespace()) .resolve("models") .resolve("item") - .resolve(key.value() + ".json"); - if (Files.exists(itemPath)) { - plugin.logger().warn("Failed to generate item model for [" + key + "] because " + itemPath.toAbsolutePath() + " already exists"); - } else { - if (PRESET_MODERN_MODELS_ITEM.containsKey(key) || PRESET_LEGACY_MODELS_ITEM.containsKey(key)) { - plugin.logger().warn("Failed to generate item model for [" + key + "] because it conflicts with vanilla item"); + .resolve(itemModelPath.value() + ".json"); + + boolean modelExists = Files.exists(itemPath); + JsonObject itemJson; + if (modelExists) { + // 路径已经存在了,那么就应该把模型读入 + try { + itemJson = GsonHelper.readJsonFile(itemPath).getAsJsonObject(); + // 野心真大,已经自己写了overrides,那么不管你了 + if (itemJson.has("overrides")) { + continue; + } + JsonArray overrides = new JsonArray(); + for (LegacyOverridesModel legacyOverridesModel : legacyOverridesModels) { + overrides.add(legacyOverridesModel.toLegacyPredicateElement()); + } + itemJson.add("overrides", overrides); + } catch (IOException e) { + this.plugin.logger().warn("Failed to read item json " + itemPath.toAbsolutePath()); continue; } + } else { + // 如果路径不存在,则需要我们创建一个json对象,并对接model的路径 + itemJson = new JsonObject(); + LegacyOverridesModel firstModel = legacyOverridesModels.getFirst(); + itemJson.addProperty("parent", firstModel.model()); + JsonArray overrides = new JsonArray(); + for (LegacyOverridesModel legacyOverridesModel : legacyOverridesModels) { + overrides.add(legacyOverridesModel.toLegacyPredicateElement()); + } + itemJson.add("overrides", overrides); } try { Files.createDirectories(itemPath.getParent()); } catch (IOException e) { - plugin.logger().severe("Error creating " + itemPath.toAbsolutePath()); + plugin.logger().severe("Error creating " + itemPath.toAbsolutePath(), e); continue; } try (BufferedWriter writer = Files.newBufferedWriter(itemPath)) { - GsonHelper.get().toJson(jsonObject, writer); + GsonHelper.get().toJson(itemJson, writer); } catch (IOException e) { - plugin.logger().warn("Failed to save item model for [" + key + "]"); + plugin.logger().warn("Failed to save item model for " + itemModelPath, e); } } - - // TODO it later -// if (Config.packMinVersion() < 21.19f && has) { -// plugin.logger().warn("You are using 'item-model' component for some models which requires 1.21.2+ client. But the min-supported-version set in 'config.yml' is " + "1." + Config.packMinVersion()); -// } } private void generateModernItemModels1_21_4(Path generatedPackPath) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Cancellable.java b/core/src/main/java/net/momirealms/craftengine/core/util/Cancellable.java index 314ad9ce3..91452fc33 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/Cancellable.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Cancellable.java @@ -1,5 +1,8 @@ package net.momirealms.craftengine.core.util; +import java.util.function.Consumer; +import java.util.function.Supplier; + public interface Cancellable { boolean isCancelled(); @@ -10,6 +13,10 @@ public interface Cancellable { return new Dummy(); } + static Cancellable of(Supplier isCancelled, Consumer setCancelled) { + return new Simple(isCancelled, setCancelled); + } + class Dummy implements Cancellable { private boolean cancelled; @@ -23,4 +30,24 @@ public interface Cancellable { this.cancelled = cancel; } } + + class Simple implements Cancellable { + private final Supplier isCancelled; + private final Consumer setCancelled; + + public Simple(Supplier isCancelled, Consumer setCancelled) { + this.isCancelled = isCancelled; + this.setCancelled = setCancelled; + } + + @Override + public boolean isCancelled() { + return this.isCancelled.get(); + } + + @Override + public void setCancelled(boolean cancel) { + this.setCancelled.accept(cancel); + } + } }