From 2fdaeb37a6e188f75fa4ffc76729eb9c35601ca2 Mon Sep 17 00:00:00 2001 From: XiaoMoMi <972454774@qq.com> Date: Sun, 19 Oct 2025 00:31:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9B=94=E7=94=B2=E8=B4=B4?= =?UTF-8?q?=E5=9B=BE=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BukkitCompatibilityManager.java | 2 +- .../compatibility/tag/NameplateTag.java | 1 - .../bukkit/plugin/BukkitPlatform.java | 1 - .../core/pack/AbstractPackManager.java | 56 ++++++++++++++++++- .../craftengine/core/plugin/Platform.java | 1 - .../core/util/AdventureHelper.java | 1 - 6 files changed, 55 insertions(+), 7 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java index f75d58c5b..104b9a01f 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java @@ -18,7 +18,6 @@ import net.momirealms.craftengine.bukkit.compatibility.region.WorldGuardRegionCo import net.momirealms.craftengine.bukkit.compatibility.skript.SkriptHook; import net.momirealms.craftengine.bukkit.compatibility.slimeworld.SlimeFormatStorageAdaptor; import net.momirealms.craftengine.bukkit.compatibility.tag.CustomNameplateProviders; -import net.momirealms.craftengine.core.plugin.compatibility.TagResolverProvider; import net.momirealms.craftengine.bukkit.compatibility.viaversion.ViaVersionUtils; import net.momirealms.craftengine.bukkit.compatibility.worldedit.WorldEditBlockRegister; import net.momirealms.craftengine.bukkit.font.BukkitFontManager; @@ -31,6 +30,7 @@ import net.momirealms.craftengine.core.loot.LootConditions; import net.momirealms.craftengine.core.plugin.compatibility.CompatibilityManager; import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider; import net.momirealms.craftengine.core.plugin.compatibility.ModelProvider; +import net.momirealms.craftengine.core.plugin.compatibility.TagResolverProvider; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.context.condition.AlwaysFalseCondition; diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/NameplateTag.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/NameplateTag.java index 58214a7c9..aefdf0e5b 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/NameplateTag.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/NameplateTag.java @@ -9,7 +9,6 @@ import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.context.PlayerContext; import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.customnameplates.api.CustomNameplatesAPI; -import net.momirealms.customnameplates.api.feature.background.Background; import net.momirealms.customnameplates.api.feature.nameplate.Nameplate; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java index 35c4dfa70..9a6729b0a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.bukkit.plugin; import com.google.gson.JsonElement; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistryOps; 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 9cb976810..21cd01da1 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 @@ -864,6 +864,7 @@ public abstract class AbstractPackManager implements PackManager { Multimap modelToItems = ArrayListMultimap.create(); // 模型到物品的映射 Multimap modelToBlocks = ArrayListMultimap.create(); // 模型到方块的映射 Multimap imageToModels = ArrayListMultimap.create(); // 纹理到模型的映射 + Multimap imageToEquipments = ArrayListMultimap.create(); // 纹理到盔甲的映射 Set collectedModels = new HashSet<>(); Set texturesInAtlas = new HashSet<>(); @@ -896,6 +897,7 @@ public abstract class AbstractPackManager implements PackManager { } for (Path namespacePath : namespaces) { + String namespace = namespacePath.getFileName().toString(); Path fontPath = namespacePath.resolve("font"); if (Files.isDirectory(fontPath)) { try { @@ -912,7 +914,7 @@ public abstract class AbstractPackManager implements PackManager { } JsonArray providers = fontJson.getAsJsonArray("providers"); if (providers != null) { - Key fontName = Key.of(namespacePath.getFileName().toString(), FileUtils.pathWithoutExtension(file.getFileName().toString())); + Key fontName = Key.of(namespace, FileUtils.pathWithoutExtension(file.getFileName().toString())); for (JsonElement provider : providers) { if (provider instanceof JsonObject providerJO && providerJO.has("type")) { String type = providerJO.get("type").getAsString(); @@ -946,7 +948,7 @@ public abstract class AbstractPackManager implements PackManager { TranslationManager.instance().log("warning.config.resource_pack.generation.malformatted_json", file.toAbsolutePath().toString()); return FileVisitResult.CONTINUE; } - Key item = Key.of(namespacePath.getFileName().toString(), FileUtils.pathWithoutExtension(file.getFileName().toString())); + Key item = Key.of(namespace, FileUtils.pathWithoutExtension(file.getFileName().toString())); collectItemModelsDeeply(itemJson, (resourceLocation) -> modelToItems.put(resourceLocation, item)); return FileVisitResult.CONTINUE; } @@ -983,6 +985,43 @@ public abstract class AbstractPackManager implements PackManager { plugin.logger().warn("Failed to validate blockstates", e); } } + + Path equipmentPath = namespacePath.resolve("equipment"); + if (Files.isDirectory(equipmentPath)) { + try { + Files.walkFileTree(equipmentPath, EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE, new SimpleFileVisitor<>() { + @Override + public @NotNull FileVisitResult visitFile(@NotNull Path file, @NotNull BasicFileAttributes attrs) { + if (!isJsonFile(file)) return FileVisitResult.CONTINUE; + String equipmentId = FileUtils.pathWithoutExtension(file.getFileName().toString()); + JsonObject equipmentJson; + try { + equipmentJson = GsonHelper.readJsonFile(file).getAsJsonObject(); + } catch (IOException | JsonParseException e) { + TranslationManager.instance().log("warning.config.resource_pack.generation.malformatted_json", file.toAbsolutePath().toString()); + return FileVisitResult.CONTINUE; + } + if (equipmentJson.has("layers")) { + for (Map.Entry layer : equipmentJson.getAsJsonObject("layers").entrySet()) { + String type = layer.getKey(); + if (layer.getValue() instanceof JsonArray equipmentLayer) { + for (JsonElement lay : equipmentLayer) { + if (lay instanceof JsonObject layObj) { + Key rawTexture = Key.of(layObj.get("texture").getAsString()); + Key fullPath = Key.of(rawTexture.namespace(), "entity/equipment/" + type + "/" + rawTexture.value()); + imageToEquipments.put(fullPath, Key.of(namespace, equipmentId)); + } + } + } + } + } + return FileVisitResult.CONTINUE; + } + }); + } catch (IOException e) { + plugin.logger().warn("Failed to validate equipments", e); + } + } } } @@ -999,6 +1038,19 @@ public abstract class AbstractPackManager implements PackManager { TranslationManager.instance().log("warning.config.resource_pack.generation.missing_font_texture", entry.getValue().stream().distinct().toList().toString(), imagePath); } + // 验证equipment的贴图是否存在 + label: for (Map.Entry> entry : imageToEquipments.asMap().entrySet()) { + Key key = entry.getKey(); + if (VANILLA_TEXTURES.contains(key)) continue; + String imagePath = "assets/" + key.namespace() + "/textures/" + key.value() + ".png"; + for (Path rootPath : rootPaths) { + if (Files.exists(rootPath.resolve(imagePath))) { + continue label; + } + } + TranslationManager.instance().log("warning.config.resource_pack.generation.missing_equipment_texture", entry.getValue().stream().distinct().toList().toString(), imagePath); + } + // 验证物品模型是否存在,验证的同时去收集贴图 label: for (Map.Entry> entry : modelToItems.asMap().entrySet()) { Key modelResourceLocation = entry.getKey(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java index 72507ab32..6a8ec531b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java @@ -1,7 +1,6 @@ package net.momirealms.craftengine.core.plugin; import com.google.gson.JsonElement; -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.particle.ParticleType; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java index 513b3853e..6b9b9c720 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java @@ -12,7 +12,6 @@ import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.kyori.adventure.text.serializer.json.JSONOptions; import net.kyori.adventure.text.serializer.json.legacyimpl.NBTLegacyHoverEventSerializer; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; -import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.text.component.ComponentProvider; import net.momirealms.sparrow.nbt.Tag;