diff --git a/bukkit/loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml index 760faf424..92771ab58 100644 --- a/bukkit/loader/src/main/resources/translations/en.yml +++ b/bukkit/loader/src/main/resources/translations/en.yml @@ -63,7 +63,7 @@ warning.config.image.invalid_font_name: "Issue found in file - T warning.config.image.lack_char: "Issue found in file - The image '' is missing the required 'char' argument." warning.config.image.codepoint_in_use: "Issue found in file - The image '' is using a character[()] in font that has been used by another image ''." warning.config.image.invalid_codepoint_grid: "Issue found in file - Image '' has an invalid 'chars' codepoint grind." -warning.config.image.file_not_exist: "Issue found in file - PNG file not found for image ''." +warning.config.image.file_not_exist: "Issue found in file - PNG file '' not found for image ''." warning.config.recipe.duplicated: "Issue found in file - Duplicated recipe ''." warning.config.i18n.unknown_locale: "Issue found in file - Unknown locale ''." warning.config.template.duplicated: "Issue found in file - Duplicated template ''." @@ -93,8 +93,12 @@ warning.config.block.state.invalid_state: "Issue found in file - warning.config.block.state.unavailable_state: "Issue found in file - The block '' is using an unavailable vanilla block state ''." warning.config.block.state.invalid_vanilla_state_id: "Issue found in file - The block '' is using a vanilla block state '' that exceeds the available slot range '0~'." warning.config.block.state.conflict: "Issue found in file - The block '' is using a vanilla block state '' that has been occupied by ''." -warning.config.block.bind_real_state: "Issue found in file - The block '' failed to bind real block state for '' as the state has been occupied by ''." +warning.config.block.state.bind_real_state: "Issue found in file - The block '' failed to bind real block state for '' as the state has been occupied by ''." warning.config.block.state.invalid_property_structure: "Issue found in file - The block '' has an invalid property structure ''." warning.config.block.state.invalid_property: "Issue found in file - Failed to create property '' for block '': ." warning.config.block.state.no_model_set: "Issue found in file - The block '' is missing the required 'model' or 'models' argument." -warning.config.block.state.invalid_real_state_id: "Issue found in file - The block '' is using a real block state '' that exceeds the available slot range '0~'. Consider adding more real states in 'additional-real-blocks.yml' if the slots are used up." \ No newline at end of file +warning.config.block.state.invalid_real_state_id: "Issue found in file - The block '' is using a real block state '' that exceeds the available slot range '0~'. Consider adding more real states in 'additional-real-blocks.yml' if the slots are used up." +warning.config.block.state.model.lack_path: "Issue found in file - The block '' is missing the required 'path' option for 'model'." +warning.config.block.state.model.invalid_resource_location: "Issue found in file - The block '' has a 'path' argument [] that contains legal characters. Please read https://minecraft.wiki/w/Resource_location#Legal_characters" +warning.config.model.generation.conflict: "Issue found in file - Failed to generate model for '' as two or more configurations attempt to generate different json models with the same path: ''" +warning.config.model.generation.texture.invalid_resource_location: "Issue found in file - The config '' has a '' texture argument [] that contains legal characters. Please read https://minecraft.wiki/w/Resource_location#Legal_characters" \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java index c62766b00..a326b0678 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java @@ -21,6 +21,7 @@ import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.loot.LootTable; import net.momirealms.craftengine.core.pack.LoadingSequence; import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.pack.ResourceLocation; import net.momirealms.craftengine.core.pack.model.generation.ModelGeneration; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; @@ -367,7 +368,7 @@ public class BukkitBlockManager extends AbstractBlockManager { return; } - Pair pair = parseAppearanceSection(path, id, stateSection); + Pair pair = parseAppearanceSection(pack, path, id, stateSection); if (pair == null) return; appearances = Map.of("default", pair.right()); @@ -407,7 +408,7 @@ public class BukkitBlockManager extends AbstractBlockManager { Map tempTypeMap = new HashMap<>(); for (Map.Entry appearanceEntry : appearancesSection.entrySet()) { if (appearanceEntry.getValue() instanceof Map appearanceSection) { - Pair pair = parseAppearanceSection(path, id, MiscUtils.castToMap(appearanceSection, false)); + Pair pair = parseAppearanceSection(pack, path, id, MiscUtils.castToMap(appearanceSection, false)); if (pair == null) return; appearances.put(appearanceEntry.getKey(), pair.right()); tempTypeMap.put(appearanceEntry.getKey(), pair.left()); @@ -463,7 +464,7 @@ public class BukkitBlockManager extends AbstractBlockManager { for (ImmutableBlockState state : block.variantProvider().states()) { ImmutableBlockState previous = stateId2ImmutableBlockStates[state.customBlockState().registryId() - BlockStateUtils.vanillaStateSize()]; if (previous != null && !previous.isEmpty()) { - TranslationManager.instance().log("warning.config.block.bind_real_state", path.toString(), id.toString(), state.toString(), previous.toString()); + TranslationManager.instance().log("warning.config.block.state.bind_real_state", path.toString(), id.toString(), state.toString(), previous.toString()); continue; } stateId2ImmutableBlockStates[state.customBlockState().registryId() - BlockStateUtils.vanillaStateSize()] = state; @@ -500,7 +501,7 @@ public class BukkitBlockManager extends AbstractBlockManager { } @Nullable - private Pair parseAppearanceSection(Path path, Key id, Map section) { + private Pair parseAppearanceSection(Pack pack, Path path, Key id, Map section) { // require state non null String vanillaStateString = (String) section.get("state"); if (vanillaStateString == null) { @@ -538,11 +539,11 @@ public class BukkitBlockManager extends AbstractBlockManager { List variants = new ArrayList<>(); if (models instanceof Map singleModelSection) { - loadVariantModel(variants, MiscUtils.castToMap(singleModelSection, false)); + loadVariantModel(pack, path, id, variants, MiscUtils.castToMap(singleModelSection, false)); } else if (models instanceof List modelList) { for (Object model : modelList) { if (model instanceof Map singleModelMap) { - loadVariantModel(variants, MiscUtils.castToMap(singleModelMap, false)); + loadVariantModel(pack, path, id, variants, MiscUtils.castToMap(singleModelMap, false)); } } } @@ -567,9 +568,17 @@ public class BukkitBlockManager extends AbstractBlockManager { return Pair.of(block, vanillaStateRegistryId); } - private void loadVariantModel(List variants, Map singleModelMap) { + private void loadVariantModel(Pack pack, Path path, Key id, List variants, Map singleModelMap) { JsonObject json = new JsonObject(); String modelPath = (String) singleModelMap.get("path"); + if (modelPath == null) { + TranslationManager.instance().log("warning.config.block.state.model.lack_path", path.toString(), id.toString()); + return; + } + if (!ResourceLocation.isValid(modelPath)) { + TranslationManager.instance().log("warning.config.block.state.model.invalid_resource_location", path.toString(), id.toString(), modelPath); + return; + } json.addProperty("model", modelPath); if (singleModelMap.containsKey("x")) json.addProperty("x", MiscUtils.getAsInt(singleModelMap.get("x"))); if (singleModelMap.containsKey("y")) json.addProperty("y", MiscUtils.getAsInt(singleModelMap.get("y"))); @@ -577,7 +586,7 @@ public class BukkitBlockManager extends AbstractBlockManager { if (singleModelMap.containsKey("weight")) json.addProperty("weight", MiscUtils.getAsInt(singleModelMap.get("weight"))); Map generationMap = MiscUtils.castToMap(singleModelMap.get("generation"), true); if (generationMap != null) { - prepareModelGeneration(new ModelGeneration(Key.of(modelPath), generationMap)); + prepareModelGeneration(path, id, new ModelGeneration(Key.of(modelPath), generationMap)); } variants.add(json); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java index ee8bdb884..2e8905231 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java @@ -349,7 +349,7 @@ public class BukkitItemManager extends AbstractItemManager { // Parse models ItemModel model = ItemModels.fromMap(modelSection); for (ModelGeneration generation : model.modelsToGenerate()) { - prepareModelGeneration(generation); + prepareModelGeneration(path, id, generation); } if (Config.packMaxVersion() > 21.39f) { @@ -369,7 +369,7 @@ public class BukkitItemManager extends AbstractItemManager { // use components ItemModel model = ItemModels.fromMap(modelSection); for (ModelGeneration generation : model.modelsToGenerate()) { - prepareModelGeneration(generation); + prepareModelGeneration(path, id, generation); } if (Config.packMaxVersion() > 21.39f) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/generation/AbstractModelGenerator.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/generation/AbstractModelGenerator.java index d4c5dd264..8a5a435f7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/generation/AbstractModelGenerator.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/generation/AbstractModelGenerator.java @@ -1,8 +1,11 @@ package net.momirealms.craftengine.core.pack.model.generation; +import net.momirealms.craftengine.core.pack.ResourceLocation; import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.util.Key; +import java.nio.file.Path; import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -25,16 +28,20 @@ public abstract class AbstractModelGenerator implements ModelGenerator { this.modelsToGenerate.clear(); } - @Override - public void prepareModelGeneration(ModelGeneration model) { - ModelGeneration generation = this.modelsToGenerate.get(model.path()); - if (generation != null) { - if (generation.equals(model)) { + public void prepareModelGeneration(Path path, Key id, ModelGeneration model) { + ModelGeneration conflict = this.modelsToGenerate.get(model.path()); + if (conflict != null) { + if (conflict.equals(model)) { return; } - this.plugin.logger().severe("Two or more configurations attempt to generate different json models with the same path: " + model.path()); + TranslationManager.instance().log("warning.config.model.generation.conflict", path.toString(), id.toString(), model.path().toString()); return; } + for (Map.Entry texture : model.texturesOverride().entrySet()) { + if (!ResourceLocation.isValid(texture.getValue())) { + TranslationManager.instance().log("warning.config.model.generation.texture.invalid_resource_location", path.toString(), id.toString(), texture.getKey(), texture.getValue()); + } + } this.modelsToGenerate.put(model.path(), model); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/generation/ModelGenerator.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/generation/ModelGenerator.java index fd6383595..2b57fd304 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/generation/ModelGenerator.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/generation/ModelGenerator.java @@ -6,6 +6,4 @@ public interface ModelGenerator { Collection modelsToGenerate(); void clearModelsToGenerate(); - - void prepareModelGeneration(ModelGeneration model); }