9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-29 03:49:15 +00:00

添加盔甲贴图验证

This commit is contained in:
XiaoMoMi
2025-10-19 00:31:31 +08:00
parent a81774b01e
commit 2fdaeb37a6
6 changed files with 55 additions and 7 deletions

View File

@@ -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.skript.SkriptHook;
import net.momirealms.craftengine.bukkit.compatibility.slimeworld.SlimeFormatStorageAdaptor; import net.momirealms.craftengine.bukkit.compatibility.slimeworld.SlimeFormatStorageAdaptor;
import net.momirealms.craftengine.bukkit.compatibility.tag.CustomNameplateProviders; 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.viaversion.ViaVersionUtils;
import net.momirealms.craftengine.bukkit.compatibility.worldedit.WorldEditBlockRegister; import net.momirealms.craftengine.bukkit.compatibility.worldedit.WorldEditBlockRegister;
import net.momirealms.craftengine.bukkit.font.BukkitFontManager; 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.CompatibilityManager;
import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider; import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider;
import net.momirealms.craftengine.core.plugin.compatibility.ModelProvider; 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.config.Config;
import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.context.Context;
import net.momirealms.craftengine.core.plugin.context.condition.AlwaysFalseCondition; import net.momirealms.craftengine.core.plugin.context.condition.AlwaysFalseCondition;

View File

@@ -9,7 +9,6 @@ import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.context.PlayerContext; import net.momirealms.craftengine.core.plugin.context.PlayerContext;
import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.craftengine.core.util.AdventureHelper;
import net.momirealms.customnameplates.api.CustomNameplatesAPI; import net.momirealms.customnameplates.api.CustomNameplatesAPI;
import net.momirealms.customnameplates.api.feature.background.Background;
import net.momirealms.customnameplates.api.feature.nameplate.Nameplate; import net.momirealms.customnameplates.api.feature.nameplate.Nameplate;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;

View File

@@ -2,7 +2,6 @@ package net.momirealms.craftengine.bukkit.plugin;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.mojang.brigadier.exceptions.CommandSyntaxException; 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.api.BukkitAdaptors;
import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistryOps; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistryOps;

View File

@@ -864,6 +864,7 @@ public abstract class AbstractPackManager implements PackManager {
Multimap<Key, Key> modelToItems = ArrayListMultimap.create(); // 模型到物品的映射 Multimap<Key, Key> modelToItems = ArrayListMultimap.create(); // 模型到物品的映射
Multimap<Key, String> modelToBlocks = ArrayListMultimap.create(); // 模型到方块的映射 Multimap<Key, String> modelToBlocks = ArrayListMultimap.create(); // 模型到方块的映射
Multimap<Key, Key> imageToModels = ArrayListMultimap.create(); // 纹理到模型的映射 Multimap<Key, Key> imageToModels = ArrayListMultimap.create(); // 纹理到模型的映射
Multimap<Key, Key> imageToEquipments = ArrayListMultimap.create(); // 纹理到盔甲的映射
Set<Key> collectedModels = new HashSet<>(); Set<Key> collectedModels = new HashSet<>();
Set<Key> texturesInAtlas = new HashSet<>(); Set<Key> texturesInAtlas = new HashSet<>();
@@ -896,6 +897,7 @@ public abstract class AbstractPackManager implements PackManager {
} }
for (Path namespacePath : namespaces) { for (Path namespacePath : namespaces) {
String namespace = namespacePath.getFileName().toString();
Path fontPath = namespacePath.resolve("font"); Path fontPath = namespacePath.resolve("font");
if (Files.isDirectory(fontPath)) { if (Files.isDirectory(fontPath)) {
try { try {
@@ -912,7 +914,7 @@ public abstract class AbstractPackManager implements PackManager {
} }
JsonArray providers = fontJson.getAsJsonArray("providers"); JsonArray providers = fontJson.getAsJsonArray("providers");
if (providers != null) { 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) { for (JsonElement provider : providers) {
if (provider instanceof JsonObject providerJO && providerJO.has("type")) { if (provider instanceof JsonObject providerJO && providerJO.has("type")) {
String type = providerJO.get("type").getAsString(); 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()); TranslationManager.instance().log("warning.config.resource_pack.generation.malformatted_json", file.toAbsolutePath().toString());
return FileVisitResult.CONTINUE; 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)); collectItemModelsDeeply(itemJson, (resourceLocation) -> modelToItems.put(resourceLocation, item));
return FileVisitResult.CONTINUE; return FileVisitResult.CONTINUE;
} }
@@ -983,6 +985,43 @@ public abstract class AbstractPackManager implements PackManager {
plugin.logger().warn("Failed to validate blockstates", e); 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<String, JsonElement> 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); TranslationManager.instance().log("warning.config.resource_pack.generation.missing_font_texture", entry.getValue().stream().distinct().toList().toString(), imagePath);
} }
// 验证equipment的贴图是否存在
label: for (Map.Entry<Key, Collection<Key>> 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<Key, Collection<Key>> entry : modelToItems.asMap().entrySet()) { label: for (Map.Entry<Key, Collection<Key>> entry : modelToItems.asMap().entrySet()) {
Key modelResourceLocation = entry.getKey(); Key modelResourceLocation = entry.getKey();

View File

@@ -1,7 +1,6 @@
package net.momirealms.craftengine.core.plugin; package net.momirealms.craftengine.core.plugin;
import com.google.gson.JsonElement; 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.util.Key;
import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.World;
import net.momirealms.craftengine.core.world.particle.ParticleType; import net.momirealms.craftengine.core.world.particle.ParticleType;

View File

@@ -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.JSONOptions;
import net.kyori.adventure.text.serializer.json.legacyimpl.NBTLegacyHoverEventSerializer; import net.kyori.adventure.text.serializer.json.legacyimpl.NBTLegacyHoverEventSerializer;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; 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.context.Context;
import net.momirealms.craftengine.core.plugin.text.component.ComponentProvider; import net.momirealms.craftengine.core.plugin.text.component.ComponentProvider;
import net.momirealms.sparrow.nbt.Tag; import net.momirealms.sparrow.nbt.Tag;