From 2e871eeef304e5fa06ddc7cd59325646fc10e12c Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 30 Apr 2025 00:28:56 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A9=E4=BA=8B=E6=83=85=E5=8F=98=E5=BE=97?= =?UTF-8?q?=E6=9B=B4=E5=8A=A0=E7=BE=8E=E5=A5=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/translations/en.yml | 2 ++ .../src/main/resources/translations/zh_cn.yml | 2 ++ .../bukkit/block/BukkitBlockManager.java | 26 ++++++-------- .../behavior/ConcretePowderBlockBehavior.java | 6 +--- .../block/behavior/CropBlockBehavior.java | 6 +--- .../block/behavior/LeavesBlockBehavior.java | 12 ++----- .../block/behavior/SaplingBlockBehavior.java | 11 ++---- .../behavior/StrippableBlockBehavior.java | 7 ++-- .../behavior/SugarCaneBlockBehavior.java | 6 +--- .../bukkit/item/BukkitItemManager.java | 18 +++++----- .../bukkit/loot/BukkitVanillaLootManager.java | 10 ++---- .../craftengine/core/block/CustomBlock.java | 6 ++-- .../core/block/behavior/BlockBehaviors.java | 8 ++--- .../core/block/properties/Properties.java | 12 ++----- .../core/entity/furniture/HitBoxTypes.java | 2 +- .../craftengine/core/font/BitmapImage.java | 4 ++- .../craftengine/core/font/FontProvider.java | 8 ----- .../core/item/behavior/ItemBehaviors.java | 8 ++--- .../item/recipe/AbstractRecipeFactory.java | 6 ++-- .../core/item/recipe/RecipeFactory.java | 5 +-- .../core/item/recipe/RecipeTypes.java | 6 ++-- .../craftengine/core/loot/LootTable.java | 6 ++-- .../loot/entry/ExpLootEntryContainer.java | 7 ++-- .../core/loot/entry/LootEntryContainers.java | 6 ++-- .../entry/SingleItemLootEntryContainer.java | 13 +++---- .../function/ApplyBonusCountFunction.java | 5 +-- .../core/loot/function/DropExpFunction.java | 7 ++-- .../core/loot/function/LootFunctions.java | 6 ++-- .../core/loot/function/SetCountFunction.java | 7 ++-- .../core/loot/number/NumberProviders.java | 6 ++-- .../conflict/matcher/AllOfPathMatcher.java | 4 +-- .../conflict/matcher/AnyOfPathMatcher.java | 4 +-- .../conflict/matcher/ExactPathMatcher.java | 10 +++--- .../conflict/matcher/FilenameMatcher.java | 10 +++--- .../conflict/matcher/InvertedPathMatcher.java | 8 ++--- .../matcher/ParentPathPrefixMatcher.java | 10 +++--- .../matcher/ParentPathSuffixMatcher.java | 10 +++--- .../conflict/matcher/PathContainsMatcher.java | 10 +++--- .../pack/conflict/matcher/PathMatchers.java | 10 +++--- .../conflict/matcher/PathPatternMatcher.java | 23 ++++++++----- .../resolution/MergePackMcMetaResolution.java | 2 +- .../pack/conflict/resolution/Resolutions.java | 10 +++--- .../core/pack/host/impl/AlistHost.java | 10 ++---- .../core/pack/host/impl/DropboxHost.java | 10 ++---- .../core/pack/host/impl/S3Host.java | 10 ++---- .../core/pack/host/impl/SelfHost.java | 8 ++--- .../core/pack/model/BaseItemModel.java | 7 ++-- .../core/pack/model/ItemModels.java | 2 +- .../core/pack/model/SelectItemModel.java | 1 - .../model/condition/ConditionProperties.java | 6 ++-- .../HasComponentConditionProperty.java | 10 ++---- .../KeyBindDownConditionProperty.java | 10 ++---- .../CompassRangeDispatchProperty.java | 10 ++---- .../RangeDispatchProperties.java | 6 ++-- .../TimeRangeDispatchProperty.java | 10 ++---- .../select/BlockStateSelectProperty.java | 10 ++---- .../model/select/LocalTimeSelectProperty.java | 7 ++-- .../pack/model/select/SelectProperties.java | 6 ++-- .../model/special/BannerSpecialModel.java | 9 ++--- .../pack/model/special/BedSpecialModel.java | 4 +-- .../pack/model/special/ChestSpecialModel.java | 7 ++-- .../pack/model/special/HeadSpecialModel.java | 13 ++----- .../model/special/ShulkerBoxSpecialModel.java | 7 ++-- .../pack/model/special/SignSpecialModel.java | 6 ++-- .../pack/model/special/SpecialModels.java | 6 ++-- .../core/pack/model/tint/ConstantTint.java | 7 ++-- .../core/pack/model/tint/Tints.java | 6 ++-- .../core/sound/AbstractSoundManager.java | 16 +++------ .../core/util/ResourceConfigUtils.java | 34 +++++++++++++++++++ 69 files changed, 220 insertions(+), 363 deletions(-) delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/font/FontProvider.java diff --git a/bukkit/loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml index 258eea889..7b9afee86 100644 --- a/bukkit/loader/src/main/resources/translations/en.yml +++ b/bukkit/loader/src/main/resources/translations/en.yml @@ -160,6 +160,7 @@ warning.config.item.model.select.local_time.missing_pattern: "Issue foun warning.config.item.model.special.missing_type: "Issue found in file - The item '' is missing the required 'type' argument for model 'minecraft:special'." warning.config.item.model.special.invalid_type: "Issue found in file - The item '' is using an invalid type '' for model 'minecraft:special'." warning.config.item.model.special.banner.missing_color: "Issue found in file - The item '' is missing the required 'color' argument for special model 'minecraft:banner'." +warning.config.item.model.special.bed.missing_texture: "Issue found in file - The item '' is missing the required 'texture' argument for special model 'minecraft:bed'." warning.config.item.model.special.sign.missing_wood_type: "Issue found in file - The item '' is missing the required 'wood-type' argument for special model 'minecraft:hanging_sign'/'minecraft:standing_sign'." warning.config.item.model.special.sign.missing_texture: "Issue found in file - The item '' is missing the required 'texture' argument for special model 'minecraft:hanging_sign'/'minecraft:standing_sign'." warning.config.item.model.special.chest.missing_texture: "Issue found in file - The item '' is missing the required 'texture' argument for special model 'minecraft:chest'." @@ -173,6 +174,7 @@ warning.config.block.missing_state: "Issue found in file - The b warning.config.block.state.property.missing_type: "Issue found in file - The block '' is missing the required 'type' argument for property ''." warning.config.block.state.property.invalid_type: "Issue found in file - The block '' is using the invalid type argument '' for property ''." warning.config.block.state.property.integer.invalid_range: "Issue found in file - The block '' is using the invalid 'range' argument '' for integer property ''. Correct syntax: 1~2." +warning.config.block.state.property.invalid_format: "Issue found in file - The block '' is using an invalid block state property format ''." warning.config.block.state.missing_real_id: "Issue found in file - The block '' is missing the required 'id' argument for 'state'. 'id' is the serverside block id which is unique for each type of block state. If you create a serverside side block with 'note_block' and id 30, then the real block id would be 'craftengine:note_block_30'." warning.config.block.state.missing_state: "Issue found in file - The block '' is missing the required 'state' argument for 'state'." warning.config.block.state.missing_properties: "Issue found in file - The block '' is missing the required 'properties' section for 'states'." diff --git a/bukkit/loader/src/main/resources/translations/zh_cn.yml b/bukkit/loader/src/main/resources/translations/zh_cn.yml index 7720bcbc0..860a110af 100644 --- a/bukkit/loader/src/main/resources/translations/zh_cn.yml +++ b/bukkit/loader/src/main/resources/translations/zh_cn.yml @@ -160,6 +160,7 @@ warning.config.item.model.select.local_time.missing_pattern: "在文件 warning.config.item.model.special.missing_type: "在文件 发现问题 - 物品 '' 的 'minecraft:special' 模型缺少必需的 'type' 参数" warning.config.item.model.special.invalid_type: "在文件 发现问题 - 物品 '' 的 'minecraft:special' 模型使用了无效类型 ''" warning.config.item.model.special.banner.missing_color: "在文件 发现问题 - 物品 '' 的 'minecraft:banner' 特殊模型缺少必需的 'color' 参数" +warning.config.item.model.special.bed.missing_texture: "在文件 发现问题 - 物品 '' 的 'minecraft:bed' 特殊模型缺少必需的 'texture' 参数" warning.config.item.model.special.sign.missing_wood_type: "在文件 发现问题 - 物品 '' 的 'minecraft:hanging_sign'/'minecraft:standing_sign' 特殊模型缺少必需的 'wood-type' 参数" warning.config.item.model.special.sign.missing_texture: "在文件 发现问题 - 物品 '' 的 'minecraft:hanging_sign'/'minecraft:standing_sign' 特殊模型缺少必需的 'texture' 参数" warning.config.item.model.special.chest.missing_texture: "在文件 发现问题 - 物品 '' 的 'minecraft:chest' 特殊模型缺少必需的 'texture' 参数" @@ -173,6 +174,7 @@ warning.config.block.missing_state: "在文件 发现问题 - warning.config.block.state.property.missing_type: "在文件 发现问题 - 方块 '' 的属性 '' 缺少必需的 'type' 参数" warning.config.block.state.property.invalid_type: "在文件 发现问题 - 方块 '' 的属性 '' 使用了无效的类型参数 ''" warning.config.block.state.property.integer.invalid_range: "在文件 发现问题 - 方块 '' 的整数属性 '' 使用了无效的范围参数 '' 正确语法: 1~2" +warning.config.block.state.property.invalid_format: "在文件 发现问题 - 方块 '' 使用了无效的方块状态属性格式 ''." warning.config.block.state.missing_real_id: "在文件 发现问题 - 方块 '' 的 'state' 缺少必需的 'id' 参数 该 ID 是服务端方块 ID 用于唯一标识每种方块状态类型" warning.config.block.state.missing_state: "在文件 发现问题 - 方块 '' 的 'state' 缺少必需的 'state' 参数" warning.config.block.state.missing_properties: "在文件 发现问题 - 方块 '' 的 'states' 缺少必需的 'properties' 段落" 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 05e035db4..74e9e5019 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 @@ -331,7 +331,7 @@ public class BukkitBlockManager extends AbstractBlockManager { public void parseSection(Pack pack, Path path, Key id, Map section) { // check duplicated config if (byId.containsKey(id)) { - throw new LocalizedResourceConfigException("warning.config.block.duplicate", path, id); + throw new LocalizedResourceConfigException("warning.config.block.duplicate"); } // read block settings BlockSettings settings = BlockSettings.fromMap(MiscUtils.castToMap(section.getOrDefault("settings", Map.of()), false)); @@ -343,13 +343,7 @@ public class BukkitBlockManager extends AbstractBlockManager { Map> properties; Map appearances; Map variants; - Object stateObj = section.get("state"); - if (stateObj == null) { - stateObj = section.get("states"); - } - if (stateObj == null) { - throw new LocalizedResourceConfigException("warning.config.block.missing_state", path, id); - } + Object stateObj = ResourceConfigUtils.requireNonNullOrThrow(ResourceConfigUtils.get(section, "state", "states"), "warning.config.block.missing_state"); Map stateSection = MiscUtils.castToMap(stateObj, true); // single state @@ -357,7 +351,7 @@ public class BukkitBlockManager extends AbstractBlockManager { properties = Map.of(); int internalId = ResourceConfigUtils.getAsInt(stateSection.getOrDefault("id", -1), "id"); if (internalId < 0) { - throw new LocalizedResourceConfigException("warning.config.block.state.missing_real_id", path, id); + throw new LocalizedResourceConfigException("warning.config.block.state.missing_real_id"); } Pair pair = parseAppearanceSection(id, stateSection); @@ -368,7 +362,7 @@ public class BukkitBlockManager extends AbstractBlockManager { Key internalBlockId = Key.of(CraftEngine.NAMESPACE, internalBlock); int internalBlockRegistryId = Optional.ofNullable(internalId2StateId.get(internalBlockId)).orElse(-1); if (internalBlockRegistryId == -1) { - throw new LocalizedResourceConfigException("warning.config.block.state.invalid_real_id", path, id, + throw new LocalizedResourceConfigException("warning.config.block.state.invalid_real_id", internalBlock, String.valueOf(registeredRealBlockSlots.get(pair.left()) - 1)); } @@ -377,13 +371,13 @@ public class BukkitBlockManager extends AbstractBlockManager { // properties Map propertySection = MiscUtils.castToMap(stateSection.get("properties"), true); if (propertySection == null) { - throw new LocalizedResourceConfigException("warning.config.block.state.missing_properties", path, id); + throw new LocalizedResourceConfigException("warning.config.block.state.missing_properties"); } properties = parseProperties(propertySection); // appearance Map appearancesSection = MiscUtils.castToMap(stateSection.get("appearances"), true); if (appearancesSection == null) { - throw new LocalizedResourceConfigException("warning.config.block.state.missing_appearances", path, id); + throw new LocalizedResourceConfigException("warning.config.block.state.missing_appearances"); } appearances = new HashMap<>(); Map tempTypeMap = new HashMap<>(); @@ -398,7 +392,7 @@ public class BukkitBlockManager extends AbstractBlockManager { // variants Map variantsSection = MiscUtils.castToMap(stateSection.get("variants"), true); if (variantsSection == null) { - throw new LocalizedResourceConfigException("warning.config.block.state.missing_variants", path, id); + throw new LocalizedResourceConfigException("warning.config.block.state.missing_variants"); } variants = new HashMap<>(); for (Map.Entry variantEntry : variantsSection.entrySet()) { @@ -407,17 +401,17 @@ public class BukkitBlockManager extends AbstractBlockManager { String variantName = variantEntry.getKey(); String appearance = (String) variantSection.get("appearance"); if (appearance == null) { - throw new LocalizedResourceConfigException("warning.config.block.state.variant.missing_appearance", path, id, variantName); + throw new LocalizedResourceConfigException("warning.config.block.state.variant.missing_appearance", variantName); } if (!appearances.containsKey(appearance)) { - throw new LocalizedResourceConfigException("warning.config.block.state.variant.invalid_appearance", path, id, variantName, appearance); + throw new LocalizedResourceConfigException("warning.config.block.state.variant.invalid_appearance", variantName, appearance); } int internalId = ResourceConfigUtils.getAsInt(variantSection.getOrDefault("id", -1), "id"); Key baseBlock = tempTypeMap.get(appearance); Key internalBlockId = Key.of(CraftEngine.NAMESPACE, baseBlock.value() + "_" + internalId); int internalBlockRegistryId = Optional.ofNullable(internalId2StateId.get(internalBlockId)).orElse(-1); if (internalBlockRegistryId == -1) { - throw new LocalizedResourceConfigException("warning.config.block.state.invalid_real_id", path, id, + throw new LocalizedResourceConfigException("warning.config.block.state.invalid_real_id", internalBlockId.toString(), String.valueOf(registeredRealBlockSlots.getOrDefault(baseBlock, 1) - 1)); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ConcretePowderBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ConcretePowderBlockBehavior.java index f13cef635..e15ae9e6f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ConcretePowderBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ConcretePowderBlockBehavior.java @@ -13,7 +13,6 @@ import net.momirealms.craftengine.core.block.UpdateOption; import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.item.context.BlockPlaceContext; import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Direction; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -158,10 +157,7 @@ public class ConcretePowderBlockBehavior extends FallingBlockBehavior { public BlockBehavior create(CustomBlock block, Map arguments) { float hurtAmount = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("hurt-amount", -1f), "hurt-amount"); int hurtMax = ResourceConfigUtils.getAsInt(arguments.getOrDefault("max-hurt", -1), "max-hurt"); - String solidBlock = (String) arguments.get("solid-block"); - if (solidBlock == null) { - throw new LocalizedResourceConfigException("warning.config.block.behavior.concrete.missing_solid", new NullPointerException("No `solid-block` specified for concrete powder block behavior")); - } + String solidBlock = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("solid-block"), "warning.config.block.behavior.concrete.missing_solid"); return new ConcretePowderBlockBehavior(block, hurtAmount, hurtMax, Key.of(solidBlock)); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java index 7d687ae26..6e18976af 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java @@ -16,7 +16,6 @@ import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.loot.number.NumberProvider; import net.momirealms.craftengine.core.loot.number.NumberProviders; import net.momirealms.craftengine.core.loot.parameter.LootParameters; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.RandomUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.Tuple; @@ -169,10 +168,7 @@ public class CropBlockBehavior extends BushBlockBehavior { @Override public BlockBehavior create(CustomBlock block, Map arguments) { Tuple, Set, Set> tuple = readTagsAndState(arguments, false); - Property ageProperty = (Property) block.getProperty("age"); - if (ageProperty == null) { - throw new LocalizedResourceConfigException("warning.config.block.behavior.crop.missing_age", new IllegalArgumentException("age property not set for crop")); - } + Property ageProperty = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("age"), "warning.config.block.behavior.crop.missing_age"); int minGrowLight = ResourceConfigUtils.getAsInt(arguments.getOrDefault("light-requirement", 9), "light-requirement"); float growSpeed = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("grow-speed", 0.125f), "grow-speed"); boolean isBoneMealTarget = (boolean) arguments.getOrDefault("is-bone-meal-target", true); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java index 2166e4bf8..4686b022c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java @@ -14,9 +14,9 @@ import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.parameter.LootParameters; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Direction; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.world.BlockPos; @@ -173,14 +173,8 @@ public class LeavesBlockBehavior extends WaterLoggedBlockBehavior { public static class Factory implements BlockBehaviorFactory { @Override public BlockBehavior create(CustomBlock block, Map arguments) { - Property persistent = (Property) block.getProperty("persistent"); - if (persistent == null) { - throw new LocalizedResourceConfigException("warning.config.block.behavior.leaves.missing_persistent", new NullPointerException("persistent property not set for block " + block.id())); - } - Property distance = (Property) block.getProperty("distance"); - if (distance == null) { - throw new LocalizedResourceConfigException("warning.config.block.behavior.leaves.missing_distance", new NullPointerException("distance property not set for block " + block.id())); - } + Property persistent = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("persistent"), "warning.config.block.behavior.leaves.missing_persistent"); + Property distance = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("distance"), "warning.config.block.behavior.leaves.missing_distance"); Property waterlogged = (Property) block.getProperty("waterlogged"); int actual = distance.possibleValues().get(distance.possibleValues().size() - 1); return new LeavesBlockBehavior(block, actual, distance, persistent, waterlogged); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SaplingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SaplingBlockBehavior.java index 6dae49a43..06d41970e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SaplingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SaplingBlockBehavior.java @@ -10,7 +10,6 @@ import net.momirealms.craftengine.core.block.UpdateOption; import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.RandomUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -141,14 +140,8 @@ public class SaplingBlockBehavior extends BushBlockBehavior { @SuppressWarnings("unchecked") @Override public BlockBehavior create(CustomBlock block, Map arguments) { - String feature = (String) arguments.get("feature"); - if (feature == null) { - throw new LocalizedResourceConfigException("warning.config.block.behavior.sapling.missing_feature", new IllegalArgumentException("'feature' is required for sapling block behavior")); - } - Property stageProperty = (Property) block.getProperty("stage"); - if (stageProperty == null) { - throw new LocalizedResourceConfigException("warning.config.block.behavior.sapling.missing_stage", new IllegalArgumentException("stage property not set for sapling")); - } + String feature = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("feature"), "warning.config.block.behavior.sapling.missing_feature"); + Property stageProperty = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("stage"), "warning.config.block.behavior.sapling.missing_stage"); double boneMealSuccessChance = ResourceConfigUtils.getAsDouble(arguments.getOrDefault("bone-meal-success-chance", 0.45), "bone-meal-success-chance"); Tuple, Set, Set> tuple = readTagsAndState(arguments, false); return new SaplingBlockBehavior(block, Key.of(feature), stageProperty, tuple.left(), tuple.mid(), tuple.right(), boneMealSuccessChance, diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/StrippableBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/StrippableBlockBehavior.java index c9353a1af..f1a2478fe 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/StrippableBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/StrippableBlockBehavior.java @@ -2,8 +2,8 @@ package net.momirealms.craftengine.bukkit.block.behavior; import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.shared.block.BlockBehavior; import java.util.Map; @@ -25,10 +25,7 @@ public class StrippableBlockBehavior extends BukkitBlockBehavior { @Override public BlockBehavior create(CustomBlock block, Map arguments) { - String stripped = (String) arguments.get("stripped"); - if (stripped == null) { - throw new LocalizedResourceConfigException("warning.config.block.behavior.strippable.missing_stripped", new IllegalArgumentException("'stripped' is required for strippable block behavior")); - } + String stripped = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("stripped"), "warning.config.block.behavior.strippable.missing_stripped"); return new StrippableBlockBehavior(block, Key.of(stripped)); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java index 567ae07a0..cf1b77194 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java @@ -14,7 +14,6 @@ import net.momirealms.craftengine.core.block.properties.IntegerProperty; import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.parameter.LootParameters; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.*; import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.world.BlockPos; @@ -199,10 +198,7 @@ public class SugarCaneBlockBehavior extends BushBlockBehavior { @Override public BlockBehavior create(CustomBlock block, Map arguments) { Tuple, Set, Set> tuple = readTagsAndState(arguments, false); - Property ageProperty = (Property) block.getProperty("age"); - if (ageProperty == null) { - throw new LocalizedResourceConfigException("warning.config.block.behavior.sugar_cane.missing_age", new IllegalArgumentException("'age' property not set for sugar cane block behavior")); - } + Property ageProperty = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("age"), "warning.config.block.behavior.sugar_cane.missing_age"); int maxHeight = ResourceConfigUtils.getAsInt(arguments.getOrDefault("max-height", 3), "max-height"); List nearbyLiquids = MiscUtils.getAsStringList(arguments.getOrDefault("required-adjacent-liquids", List.of())); boolean nearWater = nearbyLiquids.contains("water"); 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 da7f89f50..6dc5566af 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 @@ -240,7 +240,7 @@ public class BukkitItemManager extends AbstractItemManager { @Override public void parseSection(Pack pack, Path path, Key id, Map section) { if (customItems.containsKey(id)) { - throw new LocalizedResourceConfigException("warning.config.item.duplicate", path, id); + throw new LocalizedResourceConfigException("warning.config.item.duplicate"); } // register for recipes @@ -249,16 +249,16 @@ public class BukkitItemManager extends AbstractItemManager { .register(new ResourceKey<>(BuiltInRegistries.OPTIMIZED_ITEM_ID.key().location(), id), id)); boolean isVanillaItem = id.namespace().equals("minecraft") && Registry.MATERIAL.get(new NamespacedKey(id.namespace(), id.value())) != null; - String materialStringId = (String) section.get("material"); - if (isVanillaItem) + String materialStringId; + if (isVanillaItem) { materialStringId = id.value(); - if (materialStringId == null) { - throw new LocalizedResourceConfigException("warning.config.item.missing_material", path, id); + } else { + materialStringId = ResourceConfigUtils.requireNonEmptyStringOrThrow(section.get("material"), "warning.config.item.missing_material"); } Material material = MaterialUtils.getMaterial(materialStringId); if (material == null) { - throw new LocalizedResourceConfigException("warning.config.item.invalid_material", path, id); + throw new LocalizedResourceConfigException("warning.config.item.invalid_material", materialStringId); } Key materialId = Key.of(material.getKey().namespace(), material.getKey().value()); @@ -391,11 +391,11 @@ public class BukkitItemManager extends AbstractItemManager { // check conflict Map conflict = cmdConflictChecker.computeIfAbsent(materialId, k -> new HashMap<>()); if (conflict.containsKey(customModelData)) { - throw new LocalizedResourceConfigException("warning.config.item.custom_model_data_conflict", path, id, String.valueOf(customModelData), conflict.get(customModelData).toString()); + throw new LocalizedResourceConfigException("warning.config.item.custom_model_data_conflict", String.valueOf(customModelData), conflict.get(customModelData).toString()); } if (customModelData > 16_777_216) { - throw new LocalizedResourceConfigException("warning.config.item.bad_custom_model_data", path, id, String.valueOf(customModelData)); + throw new LocalizedResourceConfigException("warning.config.item.bad_custom_model_data", String.valueOf(customModelData)); } conflict.put(customModelData, id); @@ -439,7 +439,7 @@ public class BukkitItemManager extends AbstractItemManager { } } if (!hasModel) { - throw new LocalizedResourceConfigException("warning.config.item.missing_model_id", path, id); + throw new LocalizedResourceConfigException("warning.config.item.missing_model_id"); } } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java index ab266b204..1bfb8cd09 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java @@ -16,10 +16,7 @@ import net.momirealms.craftengine.core.pack.LoadingSequence; import net.momirealms.craftengine.core.pack.Pack; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; -import net.momirealms.craftengine.core.util.EnumUtils; -import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.MiscUtils; -import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.util.*; import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.world.Vec3d; import org.bukkit.Bukkit; @@ -109,10 +106,7 @@ public class BukkitVanillaLootManager extends AbstractVanillaLootManager impleme @Override public void parseSection(Pack pack, Path path, Key id, Map section) { - String type = (String) section.get("type"); - if (type == null) { - throw new LocalizedResourceConfigException("warning.config.vanilla_loot.missing_type"); - } + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(section.get("type"), "warning.config.vanilla_loot.missing_type"); VanillaLoot.Type typeEnum; try { typeEnum = VanillaLoot.Type.valueOf(type.toUpperCase(Locale.ENGLISH)); diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java b/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java index d1aae38fd..ced0f7f7e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java @@ -6,6 +6,7 @@ import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.item.context.BlockPlaceContext; import net.momirealms.craftengine.core.loot.LootTable; import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.shared.block.BlockBehavior; @@ -54,13 +55,12 @@ public abstract class CustomBlock { String nbtString = entry.getKey(); CompoundTag tag = BlockNbtParser.deserialize(this, nbtString); if (tag == null) { - CraftEngine.instance().logger().warn("Illegal block state: " + nbtString); - continue; + throw new LocalizedResourceConfigException("warning.config.block.state.property.invalid_format", nbtString); } VariantState variantState = entry.getValue(); int vanillaStateRegistryId = appearances.getOrDefault(variantState.appearance(), -1); + // This should never happen if (vanillaStateRegistryId == -1) { - CraftEngine.instance().logger().warn("Could not find appearance " + variantState.appearance() + " for block " + id); vanillaStateRegistryId = appearances.values().iterator().next(); } // Late init states diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviors.java b/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviors.java index 79f189e9c..e67a96dc1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviors.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviors.java @@ -7,6 +7,7 @@ import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; import net.momirealms.craftengine.shared.block.BlockBehavior; import net.momirealms.craftengine.shared.block.EmptyBlockBehavior; @@ -25,11 +26,8 @@ public class BlockBehaviors { public static BlockBehavior fromMap(CustomBlock block, @Nullable Map map) { if (map == null || map.isEmpty()) return EmptyBlockBehavior.INSTANCE; - Object type = map.get("type"); - if (type == null) { - throw new LocalizedResourceConfigException("warning.config.block.behavior.missing_type"); - } - Key key = Key.withDefaultNamespace(type.toString(), "craftengine"); + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.block.behavior.missing_type"); + Key key = Key.withDefaultNamespace(type, "craftengine"); BlockBehaviorFactory factory = BuiltInRegistries.BLOCK_BEHAVIOR_FACTORY.getValue(key); if (factory == null) { throw new LocalizedResourceConfigException("warning.config.block.behavior.invalid_type", type.toString()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java index 8659819b7..bf1b1c0a5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java @@ -5,10 +5,7 @@ import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; -import net.momirealms.craftengine.core.util.Direction; -import net.momirealms.craftengine.core.util.HorizontalDirection; -import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.ResourceKey; +import net.momirealms.craftengine.core.util.*; import java.util.Map; @@ -35,11 +32,8 @@ public class Properties { } public static Property fromMap(String name, Map map) { - Object type = map.get("type"); - if (type == null) { - throw new LocalizedResourceConfigException("warning.config.block.state.property.missing_type", name); - } - Key key = Key.withDefaultNamespace(type.toString(), "craftengine"); + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.block.state.property.missing_type"); + Key key = Key.withDefaultNamespace(type, "craftengine"); PropertyFactory factory = BuiltInRegistries.PROPERTY_FACTORY.getValue(key); if (factory == null) { throw new LocalizedResourceConfigException("warning.config.block.state.property.invalid_type", key.toString(), name); diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBoxTypes.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBoxTypes.java index 05b03bebb..f77435813 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBoxTypes.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBoxTypes.java @@ -24,7 +24,7 @@ public class HitBoxTypes { } public static HitBox fromMap(Map arguments) { - Key type = Optional.ofNullable((String) arguments.get("type")).map(Key::of).orElse(HitBoxTypes.INTERACTION); + Key type = Optional.ofNullable(arguments.get("type")).map(String::valueOf).map(Key::of).orElse(HitBoxTypes.INTERACTION); HitBoxFactory factory = BuiltInRegistries.HITBOX_FACTORY.getValue(type); if (factory == null) { throw new LocalizedResourceConfigException("warning.config.furniture.hitbox.invalid_type", type.toString()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/BitmapImage.java b/core/src/main/java/net/momirealms/craftengine/core/font/BitmapImage.java index 859165162..8272d7419 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/BitmapImage.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/BitmapImage.java @@ -7,7 +7,9 @@ import net.momirealms.craftengine.core.util.CharacterUtils; import net.momirealms.craftengine.core.util.FormatUtils; import net.momirealms.craftengine.core.util.Key; -public class BitmapImage implements FontProvider { +import java.util.function.Supplier; + +public class BitmapImage implements Supplier { private final Key id; private final Key font; private final int height; diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/FontProvider.java b/core/src/main/java/net/momirealms/craftengine/core/font/FontProvider.java deleted file mode 100644 index 7055a82b4..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/font/FontProvider.java +++ /dev/null @@ -1,8 +0,0 @@ -package net.momirealms.craftengine.core.font; - -import com.google.gson.JsonObject; - -import java.util.function.Supplier; - -public interface FontProvider extends Supplier { -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java index d31aef35c..c2217ec6a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java @@ -7,6 +7,7 @@ import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; import java.nio.file.Path; @@ -23,11 +24,8 @@ public class ItemBehaviors { public static ItemBehavior fromMap(Pack pack, Path path, Key id, Map map) { if (map == null || map.isEmpty()) return EmptyItemBehavior.INSTANCE; - Object type = map.get("type"); - if (type == null) { - throw new LocalizedResourceConfigException("warning.config.item.behavior.missing_type"); - } - Key key = Key.withDefaultNamespace(type.toString(), "craftengine"); + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.item.behavior.missing_type"); + Key key = Key.withDefaultNamespace(type, "craftengine"); ItemBehaviorFactory factory = BuiltInRegistries.ITEM_BEHAVIOR_FACTORY.getValue(key); if (factory == null) { throw new LocalizedResourceConfigException("warning.config.item.behavior.invalid_type", type.toString()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeFactory.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeFactory.java index e8ed1c12f..4ecd81f55 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeFactory.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeFactory.java @@ -7,6 +7,7 @@ import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.EnumUtils; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.*; @@ -34,10 +35,7 @@ public abstract class AbstractRecipeFactory implements RecipeFactory { } protected Object getIngredientOrThrow(Map arguments) { - Object ingredient = arguments.get("ingredient"); - if (ingredient == null) { - ingredient = arguments.get("ingredients"); - } + Object ingredient = ResourceConfigUtils.get(arguments, "ingredient", "ingredients"); if (ingredient == null) { throw new LocalizedResourceConfigException("warning.config.recipe.missing_ingredient"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFactory.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFactory.java index 744b10971..63c75b959 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFactory.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFactory.java @@ -18,10 +18,7 @@ public interface RecipeFactory { if (resultMap == null) { throw new LocalizedResourceConfigException("warning.config.recipe.missing_result"); } - String id = (String) resultMap.get("id"); - if (id == null) { - throw new LocalizedResourceConfigException("warning.config.recipe.result.missing_id"); - } + String id = ResourceConfigUtils.requireNonEmptyStringOrThrow(resultMap.get("id"), "warning.config.recipe.result.missing_id"); int count = ResourceConfigUtils.getAsInt(resultMap.getOrDefault("count", 1), "count"); return new CustomRecipeResult( CraftEngine.instance().itemManager().getBuildableItem(Key.of(id)).orElseThrow( diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeTypes.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeTypes.java index 6b29dc7e2..8d716b772 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeTypes.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeTypes.java @@ -6,6 +6,7 @@ import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; import java.util.Map; @@ -40,10 +41,7 @@ public class RecipeTypes { @SuppressWarnings("unchecked") public static Recipe fromMap(Key id, Map map) { - String type = (String) map.get("type"); - if (type == null) { - throw new LocalizedResourceConfigException("warning.config.recipe.missing_type"); - } + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.recipe.missing_type"); Key key = Key.withDefaultNamespace(type, "minecraft"); RecipeFactory factory = (RecipeFactory) BuiltInRegistries.RECIPE_FACTORY.getValue(key); if (factory == null) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java index 9fc0a76a9..e8b2176ff 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java @@ -12,6 +12,7 @@ import net.momirealms.craftengine.core.loot.number.NumberProvider; import net.momirealms.craftengine.core.loot.number.NumberProviders; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.world.World; import org.jetbrains.annotations.Nullable; @@ -40,10 +41,7 @@ public class LootTable { @SuppressWarnings("unchecked") public static LootTable fromMap(Map map) { if (map == null || map.isEmpty()) return null; - Object pools = map.get("pools"); - if (pools == null) { - throw new LocalizedResourceConfigException("warning.config.loot_table.missing_pools"); - } + Object pools = ResourceConfigUtils.requireNonNullOrThrow(map.get("pools"), "warning.config.loot_table.missing_pools"); if (!(pools instanceof List list) || list.isEmpty()) { throw new LocalizedResourceConfigException("warning.config.loot_table.invalid_pools_type", pools.getClass().getSimpleName()); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java index ff4d74262..41d0d5de8 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java @@ -6,8 +6,8 @@ import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.loot.number.NumberProvider; import net.momirealms.craftengine.core.loot.number.NumberProviders; import net.momirealms.craftengine.core.loot.parameter.LootParameters; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Collections; import java.util.List; @@ -44,10 +44,7 @@ public class ExpLootEntryContainer extends AbstractLootEntryContainer { @SuppressWarnings("unchecked") @Override public LootEntryContainer create(Map arguments) { - Object value = arguments.get("count"); - if (value == null) { - throw new LocalizedResourceConfigException("warning.config.loot_table.entry.exp.missing_count"); - } + Object value = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("count"), "warning.config.loot_table.entry.exp.missing_count"); List conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainers.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainers.java index b4f7dbcd6..b9f9ce3e0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainers.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainers.java @@ -6,6 +6,7 @@ import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; import java.util.ArrayList; @@ -40,10 +41,7 @@ public class LootEntryContainers { @SuppressWarnings("unchecked") public static LootEntryContainer fromMap(Map map) { - String type = (String) map.get("type"); - if (type == null) { - throw new LocalizedResourceConfigException("warning.config.loot_table.entry.missing_type"); - } + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.loot_table.entry.missing_type"); Key key = Key.withDefaultNamespace(type, "craftengine"); LootEntryContainerFactory factory = (LootEntryContainerFactory) BuiltInRegistries.LOOT_ENTRY_CONTAINER_FACTORY.getValue(key); if (factory == null) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java index 161d0e04e..28830b557 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java @@ -8,8 +8,8 @@ import net.momirealms.craftengine.core.loot.function.LootFunction; import net.momirealms.craftengine.core.loot.function.LootFunctions; import net.momirealms.craftengine.core.loot.parameter.LootParameters; import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.*; import java.util.function.Consumer; @@ -43,13 +43,10 @@ public class SingleItemLootEntryContainer extends AbstractSingleLootEntryCont @SuppressWarnings("unchecked") @Override public LootEntryContainer create(Map arguments) { - Object itemObj = arguments.get("item"); - if (itemObj == null) { - throw new LocalizedResourceConfigException("warning.config.loot_table.entry.item.missing_item"); - } - Key item = Key.from(itemObj.toString()); - int weight = (int) arguments.getOrDefault("weight", 1); - int quality = (int) arguments.getOrDefault("quality", 0); + String itemObj = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("item"), "warning.config.loot_table.entry.item.missing_item"); + Key item = Key.from(itemObj); + int weight = ResourceConfigUtils.getAsInt(arguments.getOrDefault("weight", 1), "weight"); + int quality = ResourceConfigUtils.getAsInt(arguments.getOrDefault("quality", 0), "quality"); List conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java index 319e09a00..3e55a198f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java @@ -49,10 +49,7 @@ public class ApplyBonusCountFunction extends AbstractLootConditionalFunction< @SuppressWarnings("unchecked") @Override public LootFunction create(Map arguments) { - String enchantment = (String) arguments.get("enchantment"); - if (enchantment == null || enchantment.isEmpty()) { - throw new LocalizedResourceConfigException("warning.config.loot_table.function.apply_bonus.missing_enchantment"); - } + String enchantment = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("enchantment"), "warning.config.loot_table.function.apply_bonus.missing_enchantment"); Map formulaMap = MiscUtils.castToMap(arguments.get("formula"), true); if (formulaMap == null) { throw new LocalizedResourceConfigException("warning.config.loot_table.function.apply_bonus.missing_formula"); diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java index 439d30649..cecd00e2e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java @@ -7,8 +7,8 @@ import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.loot.number.NumberProvider; import net.momirealms.craftengine.core.loot.number.NumberProviders; import net.momirealms.craftengine.core.loot.parameter.LootParameters; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Collections; import java.util.List; @@ -40,10 +40,7 @@ public class DropExpFunction extends AbstractLootConditionalFunction { @SuppressWarnings("unchecked") @Override public LootFunction create(Map arguments) { - Object value = arguments.get("count"); - if (value == null) { - throw new LocalizedResourceConfigException("warning.config.loot_table.function.drop_exp.missing_count"); - } + Object value = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("count"), "warning.config.loot_table.function.drop_exp.missing_count"); List conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java index 02ae938a4..17a88c0c7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java @@ -8,6 +8,7 @@ import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; import java.util.ArrayList; @@ -68,10 +69,7 @@ public class LootFunctions { @SuppressWarnings("unchecked") public static LootFunction fromMap(Map map) { - String type = (String) map.get("type"); - if (type == null) { - throw new LocalizedResourceConfigException("warning.config.loot_table.function.missing_type"); - } + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.loot_table.function.missing_type"); Key key = Key.withDefaultNamespace(type, "craftengine"); LootFunctionFactory factory = (LootFunctionFactory) BuiltInRegistries.LOOT_FUNCTION_FACTORY.getValue(key); if (factory == null) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/SetCountFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/SetCountFunction.java index 4e3fab7bd..969c778f9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/SetCountFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/SetCountFunction.java @@ -6,8 +6,8 @@ import net.momirealms.craftengine.core.loot.condition.LootCondition; import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.loot.number.NumberProvider; import net.momirealms.craftengine.core.loot.number.NumberProviders; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Collections; import java.util.List; @@ -42,10 +42,7 @@ public class SetCountFunction extends AbstractLootConditionalFunction { @SuppressWarnings("unchecked") @Override public LootFunction create(Map arguments) { - Object value = arguments.get("count"); - if (value == null) { - throw new LocalizedResourceConfigException("warning.config.loot_table.function.set_count.missing_count"); - } + Object value = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("count"), "warning.config.loot_table.function.set_count.missing_count"); boolean add = (boolean) arguments.getOrDefault("add", false); List conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProviders.java b/core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProviders.java index 693d598b9..32af65b44 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProviders.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProviders.java @@ -6,6 +6,7 @@ import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; import java.util.ArrayList; @@ -37,10 +38,7 @@ public class NumberProviders { } public static NumberProvider fromMap(Map map) { - String type = (String) map.get("type"); - if (type == null) { - throw new LocalizedResourceConfigException("warning.config.loot_table.number.missing_type"); - } + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.loot_table.number.missing_type"); Key key = Key.withDefaultNamespace(type, "craftengine"); NumberProviderFactory factory = BuiltInRegistries.NUMBER_PROVIDER_FACTORY.getValue(key); if (factory == null) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AllOfPathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AllOfPathMatcher.java index bb476f97a..a353f7591 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AllOfPathMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AllOfPathMatcher.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; @@ -44,7 +44,7 @@ public class AllOfPathMatcher implements PathMatcher { Map terms = MiscUtils.castToMap(termsObj, false); return new AllOfPathMatcher(PathMatchers.fromMapList(List.of(terms))); } else { - throw new LocalizedResourceConfigException("warning.config.conflict_matcher.all_of.missing_terms"); + throw new LocalizedException("warning.config.conflict_matcher.all_of.missing_terms"); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AnyOfPathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AnyOfPathMatcher.java index 6b15f9764..ad0632b19 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AnyOfPathMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AnyOfPathMatcher.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; @@ -44,7 +44,7 @@ public class AnyOfPathMatcher implements PathMatcher { Map terms = MiscUtils.castToMap(termsObj, false); return new AnyOfPathMatcher(PathMatchers.fromMapList(List.of(terms))); } else { - throw new LocalizedResourceConfigException("warning.config.conflict_matcher.any_of.missing_terms"); + throw new LocalizedException("warning.config.conflict_matcher.any_of.missing_terms"); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ExactPathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ExactPathMatcher.java index efc39ea59..0fbdedb4b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ExactPathMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ExactPathMatcher.java @@ -1,7 +1,8 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.nio.file.Path; import java.util.Map; @@ -29,11 +30,8 @@ public class ExactPathMatcher implements PathMatcher { @Override public PathMatcher create(Map arguments) { - Object path = arguments.get("path"); - if (path == null) { - throw new LocalizedResourceConfigException("warning.config.conflict_matcher.exact.missing_path"); - } - return new ExactPathMatcher(path.toString()); + String path = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("path"), () -> new LocalizedException("warning.config.conflict_matcher.exact.missing_path")); + return new ExactPathMatcher(path); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/FilenameMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/FilenameMatcher.java index 193c30b27..9bfac4789 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/FilenameMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/FilenameMatcher.java @@ -1,7 +1,8 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.nio.file.Path; import java.util.Map; @@ -29,11 +30,8 @@ public class FilenameMatcher implements PathMatcher { @Override public PathMatcher create(Map arguments) { - Object name = arguments.get("name"); - if (name == null) { - throw new LocalizedResourceConfigException("warning.config.conflict_matcher.filename.missing_name"); - } - return new FilenameMatcher(name.toString()); + String name = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("name"), () -> new LocalizedException("warning.config.conflict_matcher.filename.missing_name")); + return new FilenameMatcher(name); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/InvertedPathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/InvertedPathMatcher.java index 8a6b731c6..f95c47da9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/InvertedPathMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/InvertedPathMatcher.java @@ -1,8 +1,9 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.nio.file.Path; import java.util.Map; @@ -29,10 +30,7 @@ public class InvertedPathMatcher implements PathMatcher { @Override public PathMatcher create(Map arguments) { - Object inverted = arguments.get("term"); - if (inverted == null) { - throw new LocalizedResourceConfigException("warning.config.conflict_matcher.inverted.missing_term"); - } + Object inverted = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("term"), () -> new LocalizedException("warning.config.conflict_matcher.inverted.missing_term")); Map term = MiscUtils.castToMap(inverted, false); return new InvertedPathMatcher(PathMatchers.fromMap(term)); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathPrefixMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathPrefixMatcher.java index 4d4678900..706010712 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathPrefixMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathPrefixMatcher.java @@ -1,7 +1,8 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.nio.file.Path; import java.util.Map; @@ -31,11 +32,8 @@ public class ParentPathPrefixMatcher implements PathMatcher { @Override public PathMatcher create(Map arguments) { - Object prefix = arguments.get("prefix"); - if (prefix == null) { - throw new LocalizedResourceConfigException("warning.config.conflict_matcher.parent_prefix.missing_prefix"); - } - return new ParentPathPrefixMatcher(prefix.toString()); + String prefix = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("prefix"), () -> new LocalizedException("warning.config.conflict_matcher.parent_prefix.missing_prefix")); + return new ParentPathPrefixMatcher(prefix); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathSuffixMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathSuffixMatcher.java index 47f914a57..f31a62c83 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathSuffixMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathSuffixMatcher.java @@ -1,7 +1,8 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.nio.file.Path; import java.util.Map; @@ -31,11 +32,8 @@ public class ParentPathSuffixMatcher implements PathMatcher { @Override public PathMatcher create(Map arguments) { - Object suffix = arguments.get("suffix"); - if (suffix == null) { - throw new LocalizedResourceConfigException("warning.config.conflict_matcher.parent_suffix.missing_suffix"); - } - return new ParentPathSuffixMatcher(suffix.toString()); + String suffix = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("suffix"), () -> new LocalizedException("warning.config.conflict_matcher.parent_suffix.missing_suffix")); + return new ParentPathSuffixMatcher(suffix); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathContainsMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathContainsMatcher.java index 8ead5c22d..c8225f57e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathContainsMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathContainsMatcher.java @@ -1,7 +1,8 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.nio.file.Path; import java.util.Map; @@ -29,11 +30,8 @@ public class PathContainsMatcher implements PathMatcher { @Override public PathMatcher create(Map arguments) { - Object path = arguments.get("path"); - if (path == null) { - throw new LocalizedResourceConfigException("warning.config.conflict_matcher.contains.missing_path"); - } - return new PathContainsMatcher(path.toString()); + String path = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("path"), () -> new LocalizedException("warning.config.conflict_matcher.contains.missing_path")); + return new PathContainsMatcher(path); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java index fb2353e50..a9de55bfd 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java @@ -1,11 +1,12 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; import java.util.ArrayList; @@ -49,14 +50,11 @@ public class PathMatchers { } public static PathMatcher fromMap(Map map) { - String type = (String) map.getOrDefault("type", "empty"); - if (type == null) { - throw new LocalizedResourceConfigException("warning.config.conflict_matcher.missing_type"); - } + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), () -> new LocalizedException("warning.config.conflict_matcher.missing_type")); Key key = Key.withDefaultNamespace(type, "craftengine"); PathMatcherFactory factory = BuiltInRegistries.PATH_MATCHER_FACTORY.getValue(key); if (factory == null) { - throw new LocalizedResourceConfigException("warning.config.conflict_matcher.invalid_type", type); + throw new LocalizedException("warning.config.conflict_matcher.invalid_type", type); } return factory.create(map); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java index 78a5860ab..e469c7a6e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java @@ -1,23 +1,29 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.nio.file.Path; import java.util.Map; +import java.util.regex.Pattern; public class PathPatternMatcher implements PathMatcher { public static final Factory FACTORY = new Factory(); - private final String pattern; + private final Pattern pattern; public PathPatternMatcher(String pattern) { + this.pattern = Pattern.compile(pattern); + } + + public PathPatternMatcher(Pattern pattern) { this.pattern = pattern; } @Override public boolean test(Path path) { String pathStr = path.toString().replace("\\", "/"); - return pathStr.matches(pattern); + return this.pattern.matcher(pathStr).matches(); } @Override @@ -25,15 +31,16 @@ public class PathPatternMatcher implements PathMatcher { return PathMatchers.PATTERN; } + public Pattern pattern() { + return pattern; + } + public static class Factory implements PathMatcherFactory { @Override public PathMatcher create(Map arguments) { - Object pattern = arguments.get("pattern"); - if (pattern == null) { - throw new LocalizedResourceConfigException("warning.config.conflict_matcher.pattern.missing_pattern"); - } - return new PathPatternMatcher(pattern.toString()); + String pattern = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("pattern"), () -> new LocalizedException("warning.config.conflict_matcher.pattern.missing_pattern")); + return new PathPatternMatcher(pattern); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergePackMcMetaResolution.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergePackMcMetaResolution.java index a03ed528e..799466cc3 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergePackMcMetaResolution.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergePackMcMetaResolution.java @@ -207,7 +207,7 @@ public class MergePackMcMetaResolution implements Resolution { public static class Factory implements ResolutionFactory { @Override public Resolution create(Map arguments) { - String description = (String) arguments.getOrDefault("description", "CraftEngine ResourcePack"); + String description = arguments.getOrDefault("description", "CraftEngine ResourcePack").toString(); return new MergePackMcMetaResolution(description); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolutions.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolutions.java index fe696661c..38f7754ca 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolutions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolutions.java @@ -1,11 +1,12 @@ package net.momirealms.craftengine.core.pack.conflict.resolution; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; import java.util.Map; @@ -31,14 +32,11 @@ public class Resolutions { } public static Resolution fromMap(Map map) { - String type = (String) map.getOrDefault("type", "empty"); - if (type == null) { - throw new LocalizedResourceConfigException("warning.config.conflict_resolution.missing_type"); - } + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), () -> new LocalizedException("warning.config.conflict_resolution.missing_type")); Key key = Key.withDefaultNamespace(type, "craftengine"); ResolutionFactory factory = BuiltInRegistries.RESOLUTION_FACTORY.getValue(key); if (factory == null) { - throw new LocalizedResourceConfigException("warning.config.conflict_resolution.invalid_type", type); + throw new LocalizedException("warning.config.conflict_resolution.invalid_type", type); } return factory.create(map); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java index 55278dc62..2ae5335c1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java @@ -292,10 +292,7 @@ public class AlistHost implements ResourcePackHost { @Override public ResourcePackHost create(Map arguments) { boolean useEnv = (boolean) arguments.getOrDefault("use-environment-variables", false); - String apiUrl = Optional.ofNullable(arguments.get("api-url")).map(String::valueOf).orElse(null); - if (apiUrl == null || apiUrl.isEmpty()) { - throw new LocalizedException("warning.config.host.alist.missing_api_url"); - } + String apiUrl = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("api-url"), () -> new LocalizedException("warning.config.host.alist.missing_api_url")); String userName = useEnv ? System.getenv("CE_ALIST_USERNAME") : Optional.ofNullable(arguments.get("username")).map(String::valueOf).orElse(null); if (userName == null || userName.isEmpty()) { throw new LocalizedException("warning.config.host.alist.missing_username"); @@ -307,10 +304,7 @@ public class AlistHost implements ResourcePackHost { String filePassword = useEnv ? System.getenv("CE_ALIST_FILE_PASSWORD") : arguments.getOrDefault("file-password", "").toString(); String otpCode = Optional.ofNullable(arguments.get("otp-code")).map(String::valueOf).orElse(null); Duration jwtTokenExpiration = Duration.ofHours((int) arguments.getOrDefault("jwt-token-expiration", 48)); - String uploadPath = Optional.ofNullable(arguments.get("upload-path")).map(String::valueOf).orElse(null); - if (uploadPath == null || uploadPath.isEmpty()) { - throw new LocalizedException("warning.config.host.alist.missing_upload_path"); - } + String uploadPath = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("upload-path"), () -> new LocalizedException("warning.config.host.alist.missing_upload_path")); boolean disableUpload = (boolean) arguments.getOrDefault("disable-upload", false); ProxySelector proxy = getProxySelector(MiscUtils.castToMap(arguments.get("proxy"), true)); return new AlistHost(apiUrl, userName, password, filePassword, otpCode, jwtTokenExpiration, uploadPath, disableUpload, proxy); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java index 7e273c339..091115e16 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java @@ -8,10 +8,7 @@ import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory; import net.momirealms.craftengine.core.pack.host.ResourcePackHosts; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -import net.momirealms.craftengine.core.util.GsonHelper; -import net.momirealms.craftengine.core.util.HashUtils; -import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.*; import java.io.IOException; import java.io.InputStream; @@ -279,10 +276,7 @@ public class DropboxHost implements ResourcePackHost { if (refreshToken == null || refreshToken.isEmpty()) { throw new LocalizedException("warning.config.host.dropbox.missing_refresh_token"); } - String uploadPath = Optional.ofNullable(arguments.get("upload-path")).map(String::valueOf).orElse(null); - if (uploadPath == null || uploadPath.isEmpty()) { - throw new LocalizedException("warning.config.host.dropbox.missing_upload_path"); - } + String uploadPath = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("upload-path"), () -> new LocalizedException("warning.config.host.dropbox.missing_upload_path")); ProxySelector proxy = getProxySelector(MiscUtils.castToMap(arguments.get("proxy"), true)); return new DropboxHost(appKey, appSecret, refreshToken, "/" + uploadPath, proxy); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3Host.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3Host.java index 3cd890e9f..21f20a97d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3Host.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3Host.java @@ -206,18 +206,12 @@ public class S3Host implements ResourcePackHost { Map proxySetting = MiscUtils.castToMap(arguments.get("proxy"), true); if (proxySetting != null) { - String host = Optional.ofNullable(proxySetting.get("host")).map(String::valueOf).orElse(null); - if (host == null || host.isEmpty()) { - throw new LocalizedException("warning.config.host.proxy.missing_host"); - } + String host = ResourceConfigUtils.requireNonEmptyStringOrThrow(proxySetting.get("host"), () -> new LocalizedException("warning.config.host.proxy.missing_host")); int port = ResourceConfigUtils.getAsInt(proxySetting.get("port"), "port"); if (port <= 0 || port > 65535) { throw new LocalizedException("warning.config.host.proxy.missing_port"); } - String scheme = Optional.ofNullable(proxySetting.get("scheme")).map(String::valueOf).orElse(null); - if (scheme == null || scheme.isEmpty()) { - throw new LocalizedException("warning.config.host.proxy.missing_scheme"); - } + String scheme = ResourceConfigUtils.requireNonEmptyStringOrThrow(proxySetting.get("scheme"), () -> new LocalizedException("warning.config.host.proxy.missing_scheme")); String username = Optional.ofNullable(proxySetting.get("username")).map(String::valueOf).orElse(null); String password = Optional.ofNullable(proxySetting.get("password")).map(String::valueOf).orElse(null); ProxyConfiguration.Builder builder = ProxyConfiguration.builder().host(host).port(port).scheme(scheme); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHost.java index 39245b0b8..de38d7771 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHost.java @@ -14,7 +14,6 @@ import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.nio.file.Path; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -62,12 +61,9 @@ public class SelfHost implements ResourcePackHost { @Override public ResourcePackHost create(Map arguments) { SelfHostHttpServer selfHostHttpServer = SelfHostHttpServer.instance(); - String ip = Optional.ofNullable(arguments.get("ip")).map(String::valueOf).orElse(null); - if (ip == null) { - throw new LocalizedException("warning.config.host.self.missing_ip"); - } + String ip = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("ip"), () -> new LocalizedException("warning.config.host.self.missing_ip")); int port = ResourceConfigUtils.getAsInt(arguments.getOrDefault("port", 8163), "port"); - if (port < 0 || port > 65535) { + if (port <= 0 || port > 65535) { throw new LocalizedException("warning.config.host.self.invalid_port", String.valueOf(port)); } boolean oneTimeToken = (boolean) arguments.getOrDefault("one-time-token", true); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/BaseItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/BaseItemModel.java index ab7a54bcc..4b2609c3b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/BaseItemModel.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/BaseItemModel.java @@ -9,6 +9,7 @@ import net.momirealms.craftengine.core.pack.model.tint.Tints; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -69,11 +70,7 @@ public class BaseItemModel implements ItemModel { @SuppressWarnings("unchecked") @Override public ItemModel create(Map arguments) { - Object path = arguments.get("path"); - if (path == null) { - throw new LocalizedResourceConfigException("warning.config.item.model.base.missing_path"); - } - String modelPath = path.toString(); + String modelPath = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("path"), "warning.config.item.model.base.missing_path"); if (!ResourceLocation.isValid(modelPath)) { throw new LocalizedResourceConfigException("warning.config.item.model.base.invalid_path", modelPath); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModels.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModels.java index fb2938a14..b96282128 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModels.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModels.java @@ -36,7 +36,7 @@ public class ItemModels { } public static ItemModel fromMap(Map map) { - String type = (String) map.getOrDefault("type", "minecraft:model"); + String type = map.getOrDefault("type", "minecraft:model").toString(); Key key = Key.withDefaultNamespace(type, "minecraft"); ItemModelFactory factory = BuiltInRegistries.ITEM_MODEL_FACTORY.getValue(key); if (factory == null) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/SelectItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/SelectItemModel.java index 24ac80089..f57f30efb 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/SelectItemModel.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/SelectItemModel.java @@ -97,7 +97,6 @@ public class SelectItemModel implements ItemModel { public ItemModel create(Map arguments) { SelectProperty property = SelectProperties.fromMap(arguments); Map fallback = MiscUtils.castToMap(arguments.get("fallback"), true); - Object casesObj = arguments.get("cases"); if (casesObj instanceof List list) { List> cases = (List>) list; diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperties.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperties.java index 9419c204b..ccb36b529 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperties.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperties.java @@ -6,6 +6,7 @@ import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; import java.util.Map; @@ -46,10 +47,7 @@ public class ConditionProperties { } public static ConditionProperty fromMap(Map map) { - String type = (String) map.get("property"); - if (type == null) { - throw new LocalizedResourceConfigException("warning.config.item.model.condition.missing_property"); - } + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("property"), "warning.config.item.model.condition.missing_property"); Key key = Key.withDefaultNamespace(type, "minecraft"); ConditionPropertyFactory factory = BuiltInRegistries.CONDITION_PROPERTY_FACTORY.getValue(key); if (factory == null) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/HasComponentConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/HasComponentConditionProperty.java index 4f0a9a7aa..7da522b40 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/HasComponentConditionProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/HasComponentConditionProperty.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.pack.model.condition; import com.google.gson.JsonObject; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; @@ -35,12 +35,8 @@ public class HasComponentConditionProperty implements ConditionProperty { @Override public ConditionProperty create(Map arguments) { boolean ignoreDefault = (boolean) arguments.getOrDefault("ignore-default", false); - Object componentObj = arguments.get("component"); - if (componentObj == null) { - throw new LocalizedResourceConfigException("warning.config.item.model.condition.has_component.missing_component"); - } - String component = componentObj.toString(); - return new HasComponentConditionProperty(component, ignoreDefault); + String componentObj = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("component"), "warning.config.item.model.condition.has_component.missing_component"); + return new HasComponentConditionProperty(componentObj, ignoreDefault); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/KeyBindDownConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/KeyBindDownConditionProperty.java index 5597a60b5..12b099843 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/KeyBindDownConditionProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/KeyBindDownConditionProperty.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.pack.model.condition; import com.google.gson.JsonObject; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; @@ -29,12 +29,8 @@ public class KeyBindDownConditionProperty implements ConditionProperty { @Override public ConditionProperty create(Map arguments) { - Object keybindObj = arguments.get("keybind"); - if (keybindObj == null) { - throw new LocalizedResourceConfigException("warning.config.item.model.condition.keybind.missing"); - } - String keybind = keybindObj.toString(); - return new KeyBindDownConditionProperty(keybind); + String keybindObj = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("keybind"), "warning.config.item.model.condition.keybind.missing"); + return new KeyBindDownConditionProperty(keybindObj); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CompassRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CompassRangeDispatchProperty.java index 3b8f31f0b..e1008a576 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CompassRangeDispatchProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CompassRangeDispatchProperty.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.pack.model.rangedisptach; import com.google.gson.JsonObject; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; @@ -29,12 +29,8 @@ public class CompassRangeDispatchProperty implements RangeDispatchProperty { @Override public RangeDispatchProperty create(Map arguments) { - Object targetObj = arguments.get("target"); - if (targetObj == null) { - throw new LocalizedResourceConfigException("warning.config.item.model.range_dispatch.compass.missing_target"); - } - String target = targetObj.toString(); - return new CompassRangeDispatchProperty(target); + String targetObj = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("target"), "warning.config.item.model.range_dispatch.compass.missing_target"); + return new CompassRangeDispatchProperty(targetObj); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperties.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperties.java index edaeb7190..cafb43f05 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperties.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperties.java @@ -6,6 +6,7 @@ import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; import java.util.Map; @@ -42,10 +43,7 @@ public class RangeDispatchProperties { } public static RangeDispatchProperty fromMap(Map map) { - String type = (String) map.get("property"); - if (type == null) { - throw new LocalizedResourceConfigException("warning.config.item.model.range_dispatch.missing_property"); - } + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("property"), "warning.config.item.model.range_dispatch.missing_property"); Key key = Key.withDefaultNamespace(type, "minecraft"); RangeDispatchPropertyFactory factory = BuiltInRegistries.RANGE_DISPATCH_PROPERTY_FACTORY.getValue(key); if (factory == null) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/TimeRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/TimeRangeDispatchProperty.java index 9af1705fe..3cd818c4a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/TimeRangeDispatchProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/TimeRangeDispatchProperty.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.pack.model.rangedisptach; import com.google.gson.JsonObject; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; @@ -34,13 +34,9 @@ public class TimeRangeDispatchProperty implements RangeDispatchProperty { @Override public RangeDispatchProperty create(Map arguments) { - Object sourceObj = arguments.get("source"); - if (sourceObj == null) { - throw new LocalizedResourceConfigException("warning.config.item.model.range_dispatch.time.missing_source"); - } - String source = sourceObj.toString(); + String sourceObj = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("source"), "warning.config.item.model.range_dispatch.time.missing_source"); boolean wobble = (boolean) arguments.getOrDefault("wobble", true); - return new TimeRangeDispatchProperty(source, wobble); + return new TimeRangeDispatchProperty(sourceObj, wobble); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/BlockStateSelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/BlockStateSelectProperty.java index d30e02f36..bb89446eb 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/BlockStateSelectProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/BlockStateSelectProperty.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.pack.model.select; import com.google.gson.JsonObject; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; @@ -29,12 +29,8 @@ public class BlockStateSelectProperty implements SelectProperty { @Override public SelectProperty create(Map arguments) { - Object property = arguments.get("block-state-property"); - if (property == null) { - throw new LocalizedResourceConfigException("warning.config.item.model.select.block_state.missing_property"); - } - String blockStateProperty = property.toString(); - return new BlockStateSelectProperty(blockStateProperty); + String property = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("block-state-property"), "warning.config.item.model.select.block_state.missing_property"); + return new BlockStateSelectProperty(property); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/LocalTimeSelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/LocalTimeSelectProperty.java index ec8cec8a6..7de594b79 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/LocalTimeSelectProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/LocalTimeSelectProperty.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.pack.model.select; import com.google.gson.JsonObject; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -42,11 +43,7 @@ public class LocalTimeSelectProperty implements SelectProperty { @Override public SelectProperty create(Map arguments) { - Object patternObj = arguments.get("pattern"); - if (patternObj == null) { - throw new IllegalArgumentException("warning.config.item.model.select.local_time.missing_pattern", new NullPointerException("pattern should not be null")); - } - String pattern = patternObj.toString(); + String pattern = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("pattern"), "warning.config.item.model.select.local_time.missing_pattern"); String locale = (String) arguments.get("locale"); String timeZone = (String) arguments.get("time-zone"); return new LocalTimeSelectProperty(pattern, locale, timeZone); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperties.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperties.java index dad39c385..ee01af5d5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperties.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperties.java @@ -6,6 +6,7 @@ import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; import java.util.Map; @@ -40,10 +41,7 @@ public class SelectProperties { } public static SelectProperty fromMap(Map map) { - String type = (String) map.get("property"); - if (type == null) { - throw new LocalizedResourceConfigException("warning.config.item.model.select.missing_property"); - } + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("property"), "warning.config.item.model.select.missing_property"); Key key = Key.withDefaultNamespace(type, "minecraft"); SelectPropertyFactory factory = BuiltInRegistries.SELECT_PROPERTY_FACTORY.getValue(key); if (factory == null) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BannerSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BannerSpecialModel.java index c19570798..d8f27dc8c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BannerSpecialModel.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BannerSpecialModel.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.pack.model.special; import com.google.gson.JsonObject; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; @@ -31,11 +31,8 @@ public class BannerSpecialModel implements SpecialModel { @Override public SpecialModel create(Map arguments) { - Object color = arguments.get("color"); - if (color == null) { - throw new LocalizedResourceConfigException(""); - } - return new BannerSpecialModel(color.toString()); + String color = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("color"), "warning.config.item.model.special.banner.missing_color"); + return new BannerSpecialModel(color); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BedSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BedSpecialModel.java index 318f18252..4b2e60004 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BedSpecialModel.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BedSpecialModel.java @@ -2,9 +2,9 @@ package net.momirealms.craftengine.core.pack.model.special; import com.google.gson.JsonObject; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; -import java.util.Objects; public class BedSpecialModel implements SpecialModel { public static final Factory FACTORY = new Factory(); @@ -31,7 +31,7 @@ public class BedSpecialModel implements SpecialModel { @Override public SpecialModel create(Map arguments) { - String color = Objects.requireNonNull(arguments.get("texture"), "texture").toString(); + String color = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("texture"), "warning.config.item.model.special.bed.missing_texture"); return new BedSpecialModel(color); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ChestSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ChestSpecialModel.java index feb049fd9..31aaf4563 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ChestSpecialModel.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ChestSpecialModel.java @@ -36,14 +36,11 @@ public class ChestSpecialModel implements SpecialModel { @Override public SpecialModel create(Map arguments) { float openness = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("openness", 0), "openness"); - Object texture = arguments.get("texture"); - if (texture == null) { - throw new LocalizedResourceConfigException("warning.config.item.model.special.chest.missing_texture"); - } + String texture = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("texture"), "warning.config.item.model.special.chest.missing_texture"); if (openness > 1 || openness < 0) { throw new LocalizedResourceConfigException("warning.config.item.model.special.chest.invalid_openness", String.valueOf(openness)); } - return new ChestSpecialModel(texture.toString(), openness); + return new ChestSpecialModel(texture, openness); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/HeadSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/HeadSpecialModel.java index 6b44c37fa..6f1cf530c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/HeadSpecialModel.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/HeadSpecialModel.java @@ -1,7 +1,6 @@ package net.momirealms.craftengine.core.pack.model.special; import com.google.gson.JsonObject; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -38,16 +37,10 @@ public class HeadSpecialModel implements SpecialModel { @Override public SpecialModel create(Map arguments) { - Object kind = arguments.get("kind"); - if (kind == null) { - throw new LocalizedResourceConfigException("warning.config.item.model.special.head.missing_kind"); - } - Object texture = arguments.get("texture"); - if (texture == null) { - throw new LocalizedResourceConfigException("warning.config.item.model.special.head.missing_texture"); - } + String kind = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("kind"), "warning.config.item.model.special.head.missing_kind"); + String texture = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("texture"), "warning.config.item.model.special.head.missing_texture"); int animation = ResourceConfigUtils.getAsInt(arguments.getOrDefault("animation", 0), "animation"); - return new HeadSpecialModel(kind.toString(), texture.toString(), animation); + return new HeadSpecialModel(kind, texture, animation); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ShulkerBoxSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ShulkerBoxSpecialModel.java index f8d68f58e..0eaf640a6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ShulkerBoxSpecialModel.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ShulkerBoxSpecialModel.java @@ -41,15 +41,12 @@ public class ShulkerBoxSpecialModel implements SpecialModel { @Override public SpecialModel create(Map arguments) { float openness = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("openness", 0), "openness"); - Object texture = arguments.get("texture"); - if (texture == null) { - throw new LocalizedResourceConfigException("warning.config.item.model.special.shulker_box.missing_texture"); - } + String texture = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("texture"), "warning.config.item.model.special.shulker_box.missing_texture"); Direction orientation = Direction.valueOf(arguments.getOrDefault("orientation", "down").toString().toUpperCase(Locale.ENGLISH)); if (openness > 1 || openness < 0) { throw new LocalizedResourceConfigException("warning.config.item.model.special.shulker_box.invalid_openness", String.valueOf(openness)); } - return new ShulkerBoxSpecialModel(texture.toString(), openness, orientation); + return new ShulkerBoxSpecialModel(texture, openness, orientation); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SignSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SignSpecialModel.java index accda1694..9f64bab5e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SignSpecialModel.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SignSpecialModel.java @@ -1,12 +1,10 @@ package net.momirealms.craftengine.core.pack.model.special; import com.google.gson.JsonObject; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; -import java.util.Objects; public class SignSpecialModel implements SpecialModel { public static final Factory FACTORY = new Factory(); @@ -39,8 +37,8 @@ public class SignSpecialModel implements SpecialModel { @Override public SpecialModel create(Map arguments) { Key type = Key.of(arguments.get("type").toString()); - String woodType = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("wood-type"), "warning.config.item.model.special.sign.missing_wood_type").toString(); - String texture = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("texture"), "warning.config.item.model.special.sign.missing_texture").toString(); + String woodType = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("wood-type"), "warning.config.item.model.special.sign.missing_wood_type"); + String texture = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("texture"), "warning.config.item.model.special.sign.missing_texture"); return new SignSpecialModel(type, woodType, texture); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModels.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModels.java index 42b85e940..7856d5907 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModels.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModels.java @@ -6,6 +6,7 @@ import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; import java.util.Map; @@ -43,10 +44,7 @@ public class SpecialModels { } public static SpecialModel fromMap(Map map) { - String type = (String) map.get("type"); - if (type == null) { - throw new LocalizedResourceConfigException("warning.config.item.model.special.missing_type"); - } + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.item.model.special.missing_type"); Key key = Key.withDefaultNamespace(type, "minecraft"); SpecialModelFactory factory = BuiltInRegistries.SPECIAL_MODEL_FACTORY.getValue(key); if (factory == null) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/ConstantTint.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/ConstantTint.java index 525c02668..2c06ab251 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/ConstantTint.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/ConstantTint.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.pack.model.tint; import com.google.gson.JsonObject; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import org.incendo.cloud.type.Either; import java.util.List; @@ -33,10 +33,7 @@ public class ConstantTint implements Tint { @Override public Tint create(Map arguments) { - Object value = arguments.get("value"); - if (value == null) { - throw new LocalizedResourceConfigException("warning.config.item.model.tint.constant.missing_value"); - } + Object value = ResourceConfigUtils.requireNonNullOrThrow("warning.config.item.model.special.missing_type", "warning.config.item.model.tint.constant.missing_value"); return new ConstantTint(parseTintValue(value)); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tints.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tints.java index c0f2baf3e..07f9172dc 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tints.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tints.java @@ -6,6 +6,7 @@ import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; import java.util.Map; @@ -38,10 +39,7 @@ public class Tints { } public static Tint fromMap(Map map) { - String type = (String) map.get("type"); - if (type == null) { - throw new LocalizedResourceConfigException("warning.config.item.model.tint.missing_type"); - } + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.item.model.tint.missing_type"); Key key = Key.withDefaultNamespace(type, "minecraft"); TintFactory factory = BuiltInRegistries.TINT_FACTORY.getValue(key); if (factory == null) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/AbstractSoundManager.java b/core/src/main/java/net/momirealms/craftengine/core/sound/AbstractSoundManager.java index ff6878e77..789aa65d8 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/sound/AbstractSoundManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/sound/AbstractSoundManager.java @@ -75,16 +75,13 @@ public abstract class AbstractSoundManager implements SoundManager { @Override public void parseSection(Pack pack, Path path, Key id, Map section) { if (AbstractSoundManager.this.songs.containsKey(id)) { - throw new LocalizedResourceConfigException("warning.config.jukebox_song.duplicate", path, id); - } - Object sound = section.get("sound"); - if (sound == null) { - throw new LocalizedResourceConfigException("warning.config.jukebox_song.missing_sound", path, id); + throw new LocalizedResourceConfigException("warning.config.jukebox_song.duplicate"); } + String sound = ResourceConfigUtils.requireNonEmptyStringOrThrow(section.get("sound"), "warning.config.jukebox_song.missing_sound"); Component description = AdventureHelper.miniMessage().deserialize(section.getOrDefault("description", "").toString()); float length = ResourceConfigUtils.getAsFloat(section.get("length"), "length"); int comparatorOutput = ResourceConfigUtils.getAsInt(section.getOrDefault("comparator-output", 15), "comparator-output"); - JukeboxSong song = new JukeboxSong(Key.of(sound.toString()), description, length, comparatorOutput, ResourceConfigUtils.getAsFloat(section.getOrDefault("range", 32f), "range")); + JukeboxSong song = new JukeboxSong(Key.of(sound), description, length, comparatorOutput, ResourceConfigUtils.getAsFloat(section.getOrDefault("range", 32f), "range")); AbstractSoundManager.this.songs.put(id, song); } } @@ -105,14 +102,11 @@ public abstract class AbstractSoundManager implements SoundManager { @Override public void parseSection(Pack pack, Path path, Key id, Map section) { if (AbstractSoundManager.this.byId.containsKey(id)) { - throw new LocalizedResourceConfigException("warning.config.sound.duplicate", path, id); + throw new LocalizedResourceConfigException("warning.config.sound.duplicate"); } boolean replace = (boolean) section.getOrDefault("replace", false); String subtitle = (String) section.get("subtitle"); - List soundList = (List) section.get("sounds"); - if (soundList == null) { - throw new LocalizedResourceConfigException("warning.config.sound.missing_sounds", path, id); - } + List soundList = (List) ResourceConfigUtils.requireNonNullOrThrow(section.get("sounds"), "warning.config.sound.missing_sounds"); List sounds = new ArrayList<>(); for (Object sound : soundList) { if (sound instanceof String soundPath) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ResourceConfigUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/ResourceConfigUtils.java index 9f22b3389..b81e56ca0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/ResourceConfigUtils.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ResourceConfigUtils.java @@ -1,7 +1,11 @@ package net.momirealms.craftengine.core.util; +import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import java.util.Map; +import java.util.function.Supplier; + public final class ResourceConfigUtils { private ResourceConfigUtils() {} @@ -12,6 +16,36 @@ public final class ResourceConfigUtils { return obj; } + public static T requireNonNullOrThrow(T obj, Supplier exceptionSupplier) { + if (obj == null) + throw exceptionSupplier.get(); + return obj; + } + + public static String requireNonEmptyStringOrThrow(Object obj, String node) { + Object o = requireNonNullOrThrow(obj, node); + String s = o.toString(); + if (s.isEmpty()) throw new LocalizedResourceConfigException(node); + return s; + } + + public static String requireNonEmptyStringOrThrow(Object obj, Supplier exceptionSupplier) { + Object o = requireNonNullOrThrow(obj, exceptionSupplier); + String s = o.toString(); + if (s.isEmpty()) throw exceptionSupplier.get(); + return s; + } + + public static Object get(Map arguments, String... keys) { + for (String key : keys) { + Object value = arguments.get(key); + if (value != null) { + return value; + } + } + return null; + } + public static int getAsInt(Object o, String option) { switch (o) { case null -> {