From 0c241003504e0e148f5b1b349ba45cb7562b0b7e Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 28 Apr 2025 22:26:13 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/translations/en.yml | 14 ++ .../bukkit/block/BukkitBlockManager.java | 23 ++-- .../behavior/ConcretePowderBlockBehavior.java | 9 +- .../block/behavior/CropBlockBehavior.java | 5 +- .../block/behavior/FallingBlockBehavior.java | 5 +- .../block/behavior/SaplingBlockBehavior.java | 9 +- .../behavior/SugarCaneBlockBehavior.java | 9 +- .../furniture/BukkitFurnitureManager.java | 10 +- .../entity/furniture/hitbox/CustomHitBox.java | 5 +- .../furniture/hitbox/HappyGhastHitBox.java | 5 +- .../furniture/hitbox/InteractionHitBox.java | 7 +- .../furniture/hitbox/ShulkerHitBox.java | 6 +- .../bukkit/item/BukkitItemManager.java | 2 +- .../LiquidCollisionBlockItemBehavior.java | 3 +- .../craftengine/core/block/BlockSettings.java | 16 +-- .../core/block/properties/EnumProperty.java | 5 +- .../block/properties/IntegerProperty.java | 17 ++- .../core/block/properties/Properties.java | 9 +- .../core/block/properties/StringProperty.java | 5 +- .../core/entity/furniture/HitBoxFactory.java | 4 +- .../core/font/AbstractFontManager.java | 4 +- .../craftengine/core/item/ItemSettings.java | 9 +- .../item/recipe/CustomBlastingRecipe.java | 5 +- .../item/recipe/CustomCampfireRecipe.java | 5 +- .../item/recipe/CustomSmeltingRecipe.java | 5 +- .../core/item/recipe/CustomSmokingRecipe.java | 5 +- .../core/item/recipe/RecipeFactory.java | 3 +- .../craftengine/core/loot/LootTable.java | 18 ++- .../core/loot/condition/RandomCondition.java | 3 +- .../loot/condition/TableBonusCondition.java | 24 +++- .../function/ApplyBonusCountFunction.java | 9 +- .../core/pack/AbstractPackManager.java | 7 +- .../pack/host/ResourcePackHostFactory.java | 27 ++++ .../core/pack/host/impl/AlistHost.java | 2 +- .../core/pack/host/impl/DropboxHost.java | 2 +- .../core/pack/host/impl/GitLabHost.java | 2 +- .../core/pack/host/impl/LobFileHost.java | 2 +- .../core/pack/host/impl/OneDriveHost.java | 2 +- .../core/pack/host/impl/SelfHost.java | 7 +- .../pack/model/RangeDispatchItemModel.java | 5 +- .../CustomModelDataConditionProperty.java | 3 +- .../CustomModelDataRangeDispatchProperty.java | 3 +- .../UseCycleRangeDispatchProperty.java | 3 +- .../select/CustomModelDataSelectProperty.java | 3 +- .../pack/model/special/ChestSpecialModel.java | 3 +- .../pack/model/special/HeadSpecialModel.java | 3 +- .../model/special/ShulkerBoxSpecialModel.java | 3 +- .../pack/model/tint/CustomModelDataTint.java | 3 +- .../core/pack/model/tint/GrassTint.java | 5 +- .../SelfIncreaseIntTemplateArgument.java | 9 +- .../config/template/TemplateManagerImpl.java | 5 +- .../gui/category/ItemBrowserManagerImpl.java | 3 +- .../core/sound/AbstractSoundManager.java | 11 +- .../craftengine/core/sound/Sound.java | 9 +- .../craftengine/core/sound/SoundData.java | 5 +- .../craftengine/core/util/MiscUtils.java | 128 +----------------- .../core/util/ResourceConfigUtils.java | 83 ++++++++++++ 57 files changed, 329 insertions(+), 267 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/ResourceConfigUtils.java diff --git a/bukkit/loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml index 6b918c595..11c6c2e63 100644 --- a/bukkit/loader/src/main/resources/translations/en.yml +++ b/bukkit/loader/src/main/resources/translations/en.yml @@ -63,6 +63,11 @@ command.upload.failure.not_supported: "Current hosting method '' doe command.upload.on_progress: "Started uploading progress. Check the console for more information." command.send_resource_pack.success.single: "Sent resource pack to ." command.send_resource_pack.success.multiple: "Send resource packs to players." +warning.config.cast_int: "Issue found in file - Failed to load '': Cannot cast '' to integer type for option ''." +warning.config.cast_float: "Issue found in file - Failed to load '': Cannot cast '' to float type for option ''." +warning.config.cast_double: "Issue found in file - Failed to load '': Cannot cast '' to double type for option ''." +warning.config.cast_quaternionf: "Issue found in file - Failed to load '': Cannot cast '' to Quaternionf type for option ''." +warning.config.cast_vector3f: "Issue found in file - Failed to load '': Cannot cast '' to Vector3f type for option ''." warning.config.not_a_section: "Issue found in file - '.' is expected to be a config section while it's actually a(n) ''." warning.config.image.duplicated: "Issue found in file - Duplicated image ''." warning.config.image.lack_height: "Issue found in file - The image '' is missing the required 'height' argument." @@ -93,6 +98,7 @@ warning.config.recipe.smithing_transform.post_processor.keep_component.lack_comp warning.config.recipe.smithing_transform.post_processor.keep_component.lack_tags: "Issue found in file - The smithing transform recipe '' is missing the required argument 'tags' for post-processors 'keep_tags'" warning.config.i18n.unknown_locale: "Issue found in file - Unknown locale ''." warning.config.template.duplicated: "Issue found in file - Duplicated template ''." +warning.config.template.from_larger_than_to: "Issue found in file - The template '' has a 'from'[] argument larger than 'to'[]." warning.config.vanilla_loot.type_not_exist: "Issue found in file - 'type' not set for vanilla loot ''." warning.config.vanilla_loot.block.invalid_target: "Issue found in file - Invalid block target [] in vanilla loot ''." warning.config.sound.duplicated: "Issue found in file - Duplicated sound ''." @@ -148,6 +154,9 @@ warning.config.item.model.select.block_state.lack_block_state_property: "Issue found in file - The item '' is missing the required 'pattern' argument for 'minecraft:local_time'." warning.config.block.duplicated: "Issue found in file - Duplicated block ''." warning.config.block.lack_state: "Issue found in file - The block '' is missing the required 'state' argument." +warning.config.block.state.property.lack_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 type 'range' argument '' for integer property ''. Correct syntax: 1~2." warning.config.block.state.lack_real_id: "Issue found in file - The block '' is missing the required 'id' argument for 'state'." warning.config.block.state.lack_state: "Issue found in file - The block '' is missing the required 'state' argument for 'state'." warning.config.block.state.lack_properties: "Issue found in file - The block '' is missing the required 'properties' section for 'states'." @@ -202,6 +211,8 @@ warning.config.loot_table.entry.exp.lack_count: "Issue found in file Issue found in file - '' has a misconfigured loot table, entry 'item' is missing the required argument 'item'." warning.config.loot_table.condition.lack_type: "Issue found in file - '' has a misconfigured loot table, one of the conditions is missing the required argument 'type'." warning.config.loot_table.condition.invalid_type: "Issue found in file - '' has a misconfigured loot table, one of the conditions is using an invalid condition type ''." +warning.config.loot_table.condition.table_bonus.lack_enchantment: "Issue found in file - '' has a misconfigured loot table, 'table_bonus' condition is missing the required 'enchantment' argument." +warning.config.loot_table.condition.table_bonus.lack_chances: "Issue found in file - '' has a misconfigured loot table, 'table_bonus' condition is missing the required 'chances' argument." warning.config.loot_table.number.lack_type: "Issue found in file - '' has a misconfigured loot table, one of the numbers is missing the required argument 'type'." warning.config.loot_table.number.invalid_type: "Issue found in file - '' has a misconfigured loot table, one of the numbers is using an invalid number type ''." warning.config.host.lack_type: "Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required argument 'type' for host." @@ -230,6 +241,9 @@ warning.config.host.self.invalid_port: "Issue found in config.yml at 're warning.config.host.gitlab.lack_url: "Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required argument 'gitlab-url' for gitlab host." warning.config.host.gitlab.lack_access_token: "Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required argument 'access-token' for gitlab host." warning.config.host.gitlab.lack_project_id: "Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required argument 'project-id' for gitlab host." +warning.config.host.proxy.lack_host: "Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required argument 'host' for proxy." +warning.config.host.proxy.lack_port: "Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required argument 'port' for proxy." +warning.config.host.proxy.invalid: "Issue found in config.yml at 'resource-pack.delivery.hosting' - Invalid proxy ''." warning.config.conflict_matcher.lack_type: "Issue found in config.yml at 'resource-pack.duplicated-files-handler' - Missing required argument 'type' for one of the handlers." warning.config.conflict_matcher.invalid_type: "Issue found in config.yml at 'resource-pack.duplicated-files-handler' - One of the terms is using the invalid type ''." warning.config.conflict_matcher.exact.lack_path: "Issue found in config.yml at 'resource-pack.duplicated-files-handler' - Missing required argument 'path' for 'exact' matcher." 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 1e3059c9f..676698505 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 @@ -361,7 +361,7 @@ public class BukkitBlockManager extends AbstractBlockManager { Map stateSection = MiscUtils.castToMap(section.get("state"), true); if (stateSection != null) { properties = Map.of(); - int internalId = MiscUtils.getAsInt(stateSection.getOrDefault("id", -1)); + int internalId = ResourceConfigUtils.getAsInt(stateSection.getOrDefault("id", -1), "id"); if (internalId < 0) { throw new LocalizedResourceConfigException("warning.config.block.state.lack_real_id", path, id); } @@ -370,12 +370,13 @@ public class BukkitBlockManager extends AbstractBlockManager { if (pair == null) return; appearances = Map.of("default", pair.right()); - Key internalBlockId = Key.of(CraftEngine.NAMESPACE, pair.left().value() + "_" + internalId); - int internalBlockRegistryId = MiscUtils.getAsInt(internalId2StateId.getOrDefault(internalBlockId, -1)); + String internalBlock = pair.left().value() + "_" + internalId; + 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_state_id", path, id, - pair.left().value() + "_" + internalId, - String.valueOf(MiscUtils.getAsInt(registeredRealBlockSlots.get(pair.left()))-1)); + internalBlock, + String.valueOf(registeredRealBlockSlots.get(pair.left()) - 1)); } variants = Map.of("", new VariantState("default", settings, internalBlockRegistryId)); } else { @@ -422,14 +423,14 @@ public class BukkitBlockManager extends AbstractBlockManager { if (!appearances.containsKey(appearance)) { throw new LocalizedResourceConfigException("warning.config.block.state.variant.invalid_appearance", path, id, variantName, appearance); } - int internalId = MiscUtils.getAsInt(variantSection.getOrDefault("id", -1)); + 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 = MiscUtils.getAsInt(internalId2StateId.getOrDefault(internalBlockId, -1)); + int internalBlockRegistryId = Optional.ofNullable(internalId2StateId.get(internalBlockId)).orElse(-1); if (internalBlockRegistryId == -1) { throw new LocalizedResourceConfigException("warning.config.block.state.invalid_real_state_id", path, id, internalBlockId.toString(), - String.valueOf(MiscUtils.getAsInt(registeredRealBlockSlots.getOrDefault(baseBlock, 1)) - 1)); + String.valueOf(registeredRealBlockSlots.getOrDefault(baseBlock, 1) - 1)); } Map anotherSetting = MiscUtils.castToMap(variantSection.get("settings"), true); variants.put(variantName, new VariantState(appearance, anotherSetting == null ? settings : BlockSettings.ofFullCopy(settings, anotherSetting), internalBlockRegistryId)); @@ -575,10 +576,10 @@ public class BukkitBlockManager extends AbstractBlockManager { return; } json.addProperty("model", modelPath); - if (singleModelMap.containsKey("x")) json.addProperty("x", MiscUtils.getAsInt(singleModelMap.get("x"))); - if (singleModelMap.containsKey("y")) json.addProperty("y", MiscUtils.getAsInt(singleModelMap.get("y"))); + if (singleModelMap.containsKey("x")) json.addProperty("x", ResourceConfigUtils.getAsInt(singleModelMap.get("x"), "x")); + if (singleModelMap.containsKey("y")) json.addProperty("y", ResourceConfigUtils.getAsInt(singleModelMap.get("y"), "y")); if (singleModelMap.containsKey("uvlock")) json.addProperty("uvlock", (boolean) singleModelMap.get("uvlock")); - if (singleModelMap.containsKey("weight")) json.addProperty("weight", MiscUtils.getAsInt(singleModelMap.get("weight"))); + if (singleModelMap.containsKey("weight")) json.addProperty("weight", ResourceConfigUtils.getAsInt(singleModelMap.get("weight"), "weight")); Map generationMap = MiscUtils.castToMap(singleModelMap.get("generation"), true); if (generationMap != null) { prepareModelGeneration(path, id, new ModelGeneration(Key.of(modelPath), generationMap)); 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 0ab2e2870..22e651c7d 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 @@ -14,10 +14,7 @@ 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.MiscUtils; -import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.util.*; import net.momirealms.craftengine.shared.block.BlockBehavior; import org.bukkit.block.BlockState; import org.bukkit.event.block.BlockFormEvent; @@ -156,8 +153,8 @@ public class ConcretePowderBlockBehavior extends FallingBlockBehavior { @Override public BlockBehavior create(CustomBlock block, Map arguments) { - float hurtAmount = MiscUtils.getAsFloat(arguments.getOrDefault("hurt-amount", -1f)); - int hurtMax = MiscUtils.getAsInt(arguments.getOrDefault("max-hurt", -1)); + 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.lack_solid_block", new NullPointerException("No `solid-block` specified for concrete powder block behavior")); 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 ddf2a9bae..d59d3e191 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 @@ -19,6 +19,7 @@ import net.momirealms.craftengine.core.loot.parameter.LootParameters; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.RandomUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.Tuple; import net.momirealms.craftengine.core.util.context.ContextHolder; import net.momirealms.craftengine.core.world.Vec3d; @@ -173,8 +174,8 @@ public class CropBlockBehavior extends BushBlockBehavior { if (ageProperty == null) { throw new LocalizedResourceConfigException("warning.config.block.behavior.crop.lack_age", new IllegalArgumentException("age property not set for crop")); } - int minGrowLight = MiscUtils.getAsInt(arguments.getOrDefault("light-requirement", 9)); - float growSpeed = MiscUtils.getAsFloat(arguments.getOrDefault("grow-speed", 0.125f)); + 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); NumberProvider boneMealAgeBonus = NumberProviders.fromObject(arguments.getOrDefault("bone-meal-age-bonus", 1)); return new CropBlockBehavior(block, tuple.left(), tuple.mid(), tuple.right(), ageProperty, growSpeed, minGrowLight, isBoneMealTarget, boneMealAgeBonus); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java index 07874400a..171b682bc 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java @@ -12,6 +12,7 @@ import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.parameter.LootParameters; import net.momirealms.craftengine.core.util.MiscUtils; +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.Vec3d; @@ -129,8 +130,8 @@ public class FallingBlockBehavior extends BukkitBlockBehavior { public static class Factory implements BlockBehaviorFactory { @Override public BlockBehavior create(CustomBlock block, Map arguments) { - float hurtAmount = MiscUtils.getAsFloat(arguments.getOrDefault("hurt-amount", -1f)); - int hurtMax = MiscUtils.getAsInt(arguments.getOrDefault("max-hurt", -1)); + float hurtAmount = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("hurt-amount", -1f), "hurt-amount"); + int hurtMax = ResourceConfigUtils.getAsInt(arguments.getOrDefault("max-hurt", -1), "max-hurt"); return new FallingBlockBehavior(block, hurtAmount, hurtMax); } } 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 8f5c7489e..cb0adde07 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 @@ -11,10 +11,7 @@ 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.MiscUtils; -import net.momirealms.craftengine.core.util.RandomUtils; -import net.momirealms.craftengine.core.util.Tuple; +import net.momirealms.craftengine.core.util.*; import net.momirealms.craftengine.shared.block.BlockBehavior; import org.bukkit.Location; import org.bukkit.World; @@ -149,10 +146,10 @@ public class SaplingBlockBehavior extends BushBlockBehavior { if (stageProperty == null) { throw new LocalizedResourceConfigException("warning.config.block.behavior.sapling.lack_stage", new IllegalArgumentException("stage property not set for sapling")); } - double boneMealSuccessChance = MiscUtils.getAsDouble(arguments.getOrDefault("bone-meal-success-chance", 0.45)); + 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, - MiscUtils.getAsFloat(arguments.getOrDefault("grow-speed", 1.0 / 7.0))); + ResourceConfigUtils.getAsFloat(arguments.getOrDefault("grow-speed", 1.0 / 7.0), "grow-speed")); } } } 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 2848f97de..c77ce87fb 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 @@ -15,10 +15,7 @@ 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.MiscUtils; -import net.momirealms.craftengine.core.util.RandomUtils; -import net.momirealms.craftengine.core.util.Tuple; -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.BlockPos; import net.momirealms.craftengine.core.world.Vec3d; @@ -206,12 +203,12 @@ public class SugarCaneBlockBehavior extends BushBlockBehavior { if (ageProperty == null) { throw new LocalizedResourceConfigException("warning.config.block.behavior.sugar_cane.lack_age", new IllegalArgumentException("'age' property not set for sugar cane block behavior")); } - int maxHeight = MiscUtils.getAsInt(arguments.getOrDefault("max-height", 3)); + 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"); boolean nearLava = nearbyLiquids.contains("lava"); return new SugarCaneBlockBehavior(block, tuple.left(), tuple.mid(), tuple.right(), ageProperty, maxHeight, nearWater, nearLava, - MiscUtils.getAsFloat(arguments.getOrDefault("grow-speed", 1))); + ResourceConfigUtils.getAsFloat(arguments.getOrDefault("grow-speed", 1), "grow-speed")); } } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java index a244727d0..09f9f50bf 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java @@ -135,10 +135,10 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager { ItemDisplayContext transform = ItemDisplayContext.valueOf(element.getOrDefault("transform", "NONE").toString().toUpperCase(Locale.ENGLISH)); Billboard billboard = Billboard.valueOf(element.getOrDefault("billboard", "FIXED").toString().toUpperCase(Locale.ENGLISH)); FurnitureElement furnitureElement = new BukkitFurnitureElement(Key.of(key), billboard, transform, - MiscUtils.getVector3f(element.getOrDefault("scale", "1")), - MiscUtils.getVector3f(element.getOrDefault("translation", "0")), - MiscUtils.getVector3f(element.getOrDefault("position", "0")), - MiscUtils.getQuaternionf(element.getOrDefault("rotation", "0")) + MiscUtils.getAsVector3f(element.getOrDefault("scale", "1"), "scale"), + MiscUtils.getAsVector3f(element.getOrDefault("translation", "0"), "translation"), + MiscUtils.getAsVector3f(element.getOrDefault("position", "0"), "position"), + MiscUtils.getAsQuaternionf(element.getOrDefault("rotation", "0"), "rotation") ); elements.add(furnitureElement); } @@ -455,7 +455,7 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager { plugin.logger().warn("Failed to get vector3f for player " + player.getName() + "'s seat"); return; } - Vector3f seatPos = MiscUtils.getVector3f(vector3f); + Vector3f seatPos = MiscUtils.getAsVector3f(vector3f, "seat"); furniture.removeOccupiedSeat(seatPos); if (player.getVehicle() != null) return; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/CustomHitBox.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/CustomHitBox.java index 62ab6f9e6..5a3e0780e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/CustomHitBox.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/CustomHitBox.java @@ -7,6 +7,7 @@ import net.momirealms.craftengine.core.entity.furniture.*; 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 net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.collision.AABB; @@ -81,8 +82,8 @@ public class CustomHitBox extends AbstractHitBox { @Override public HitBox create(Map arguments) { - Vector3f position = MiscUtils.getVector3f(arguments.getOrDefault("position", "0")); - float scale = MiscUtils.getAsFloat(arguments.getOrDefault("scale", "1")); + Vector3f position = MiscUtils.getAsVector3f(arguments.getOrDefault("position", "0"), "position"); + float scale = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("scale", 1), "scale"); String type = (String) arguments.getOrDefault("entity-type", "slime"); EntityType entityType = Registry.ENTITY_TYPE.get(new NamespacedKey("minecraft", type)); if (entityType == null) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/HappyGhastHitBox.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/HappyGhastHitBox.java index 571f126d4..dae5e7afe 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/HappyGhastHitBox.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/HappyGhastHitBox.java @@ -3,6 +3,7 @@ package net.momirealms.craftengine.bukkit.entity.furniture.hitbox; import net.momirealms.craftengine.core.entity.furniture.*; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.collision.AABB; import org.joml.Quaternionf; @@ -48,13 +49,13 @@ public class HappyGhastHitBox extends AbstractHitBox { @Override public HitBox create(Map arguments) { - double scale = MiscUtils.getAsDouble(arguments.getOrDefault("scale", "1")); + double scale = ResourceConfigUtils.getAsDouble(arguments.getOrDefault("scale", 1), "scale"); boolean canUseOn = (boolean) arguments.getOrDefault("can-use-item-on", false); boolean canBeHitByProjectile = (boolean) arguments.getOrDefault("can-be-hit-by-projectile", false); boolean blocksBuilding = (boolean) arguments.getOrDefault("blocks-building", false); return new HappyGhastHitBox( HitBoxFactory.getSeats(arguments), - MiscUtils.getVector3f(arguments.getOrDefault("position", "0")), + MiscUtils.getAsVector3f(arguments.getOrDefault("position", "0"), "position"), scale, canUseOn, blocksBuilding, canBeHitByProjectile ); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/InteractionHitBox.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/InteractionHitBox.java index fa21617cc..e48713e89 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/InteractionHitBox.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/InteractionHitBox.java @@ -7,6 +7,7 @@ import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.entity.furniture.*; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.collision.AABB; @@ -87,7 +88,7 @@ public class InteractionHitBox extends AbstractHitBox { @Override public HitBox create(Map arguments) { - Vector3f position = MiscUtils.getVector3f(arguments.getOrDefault("position", "0")); + Vector3f position = MiscUtils.getAsVector3f(arguments.getOrDefault("position", "0"), "position"); float width; float height; if (arguments.containsKey("scale")) { @@ -95,8 +96,8 @@ public class InteractionHitBox extends AbstractHitBox { width = Float.parseFloat(split[0]); height = Float.parseFloat(split[1]); } else { - width = MiscUtils.getAsFloat(arguments.getOrDefault("width", "1")); - height = MiscUtils.getAsFloat(arguments.getOrDefault("height", "1")); + width = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("width", "1"), "width"); + height = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("height", "1"), "height"); } boolean canUseOn = (boolean) arguments.getOrDefault("can-use-item-on", false); boolean interactive = (boolean) arguments.getOrDefault("interactive", true); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerHitBox.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerHitBox.java index 0dd717463..56d8985a4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerHitBox.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerHitBox.java @@ -272,9 +272,9 @@ public class ShulkerHitBox extends AbstractHitBox { @Override public HitBox create(Map arguments) { - Vector3f position = MiscUtils.getVector3f(arguments.getOrDefault("position", "0")); - float scale = MiscUtils.getAsFloat(arguments.getOrDefault("scale", "1")); - byte peek = (byte) MiscUtils.getAsInt(arguments.getOrDefault("peek", 0)); + Vector3f position = MiscUtils.getAsVector3f(arguments.getOrDefault("position", "0"), "position"); + float scale = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("scale", "1"), "scale"); + byte peek = (byte) ResourceConfigUtils.getAsInt(arguments.getOrDefault("peek", 0), "peek"); Direction directionEnum = Optional.ofNullable(arguments.get("direction")).map(it -> Direction.valueOf(it.toString().toUpperCase(Locale.ENGLISH))).orElse(Direction.UP); boolean interactive = (boolean) arguments.getOrDefault("interactive", true); boolean interactionEntity = (boolean) arguments.getOrDefault("interaction-entity", true); 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 7ebecbf2f..a2a182468 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 @@ -262,7 +262,7 @@ public class BukkitItemManager extends AbstractItemManager { } Key materialId = Key.of(material.getKey().namespace(), material.getKey().value()); - int customModelData = MiscUtils.getAsInt(section.getOrDefault("custom-model-data", 0)); + int customModelData = ResourceConfigUtils.getAsInt(section.getOrDefault("custom-model-data", 0), "custom-model-data"); Key itemModelKey = null; CustomItem.Builder itemBuilder = BukkitCustomItem.builder().id(id).material(materialId); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/LiquidCollisionBlockItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/LiquidCollisionBlockItemBehavior.java index 14c1762a2..f690e07a4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/LiquidCollisionBlockItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/LiquidCollisionBlockItemBehavior.java @@ -16,6 +16,7 @@ import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigExce import net.momirealms.craftengine.core.util.Direction; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.world.BlockHitResult; import net.momirealms.craftengine.core.world.BlockPos; import net.momirealms.craftengine.core.world.Vec3d; @@ -66,7 +67,7 @@ public class LiquidCollisionBlockItemBehavior extends BlockItemBehavior { if (id == null) { throw new LocalizedResourceConfigException("warning.config.item.behavior.liquid_collision_block.lack_block", new IllegalArgumentException("Missing required parameter 'block' for liquid_collision_block_item behavior")); } - int offset = MiscUtils.getAsInt(arguments.getOrDefault("y-offset", 1)); + int offset = ResourceConfigUtils.getAsInt(arguments.getOrDefault("y-offset", 1), "y-offset"); if (id instanceof Map map) { if (map.containsKey(key.toString())) { // 防呆 diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockSettings.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockSettings.java index 6a0e50b7f..35b55839f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/BlockSettings.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockSettings.java @@ -331,19 +331,19 @@ public class BlockSettings { static { registerFactory("luminance", (value -> { - int intValue = MiscUtils.getAsInt(value); + int intValue = ResourceConfigUtils.getAsInt(value, "luminance"); return settings -> settings.luminance(intValue); })); registerFactory("block-light", (value -> { - int intValue = MiscUtils.getAsInt(value); + int intValue = ResourceConfigUtils.getAsInt(value, "block-light"); return settings -> settings.blockLight(intValue); })); registerFactory("hardness", (value -> { - float floatValue = MiscUtils.getAsFloat(value); + float floatValue = ResourceConfigUtils.getAsFloat(value, "hardness"); return settings -> settings.hardness(floatValue); })); registerFactory("resistance", (value -> { - float floatValue = MiscUtils.getAsFloat(value); + float floatValue = ResourceConfigUtils.getAsFloat(value, "resistance"); return settings -> settings.resistance(floatValue); })); registerFactory("is-randomly-ticking", (value -> { @@ -355,7 +355,7 @@ public class BlockSettings { return settings -> settings.pushReaction(reaction); })); registerFactory("map-color", (value -> { - int intValue = MiscUtils.getAsInt(value); + int intValue = ResourceConfigUtils.getAsInt(value, "map-color"); return settings -> settings.mapColor(MapColor.get(intValue)); })); registerFactory("burnable", (value -> { @@ -375,11 +375,11 @@ public class BlockSettings { return settings -> settings.tags(tags.stream().map(Key::of).collect(Collectors.toSet())); })); registerFactory("burn-chance", (value -> { - int intValue = MiscUtils.getAsInt(value); + int intValue = ResourceConfigUtils.getAsInt(value, "burn-chance"); return settings -> settings.burnChance(intValue); })); registerFactory("fire-spread-chance", (value -> { - int intValue = MiscUtils.getAsInt(value); + int intValue = ResourceConfigUtils.getAsInt(value, "fire-spread-chance"); return settings -> settings.fireSpreadChance(intValue); })); registerFactory("replaceable", (value -> { @@ -423,7 +423,7 @@ public class BlockSettings { return settings -> settings.respectToolComponent(booleanValue); })); registerFactory("incorrect-tool-dig-speed", (value -> { - float floatValue = MiscUtils.getAsFloat(value); + float floatValue = ResourceConfigUtils.getAsFloat(value, "incorrect-tool-dig-speed"); return settings -> settings.incorrectToolSpeed(floatValue); })); registerFactory("name", (value -> { diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/EnumProperty.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/EnumProperty.java index 085e09505..b4d530aa7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/properties/EnumProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/EnumProperty.java @@ -116,10 +116,7 @@ public class EnumProperty> extends Property { A defaultValue = enums.stream() .filter(e -> e.name().toLowerCase(Locale.ENGLISH).equals(defaultValueName)) .findFirst() - .orElseGet(() -> { - CraftEngine.instance().logger().warn("Invalid default value '" + defaultValueName + "' for property '" + name + "'"); - return enums.get(0); - }); + .orElseGet(() -> enums.get(0)); return EnumProperty.create(name, enumClass, enums, defaultValue); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/IntegerProperty.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/IntegerProperty.java index 4b17184ac..7f7edeb06 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/properties/IntegerProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/IntegerProperty.java @@ -1,7 +1,9 @@ package net.momirealms.craftengine.core.block.properties; import it.unimi.dsi.fastutil.ints.IntImmutableList; +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.sparrow.nbt.IntTag; import net.momirealms.sparrow.nbt.NumericTag; import net.momirealms.sparrow.nbt.Tag; @@ -89,10 +91,17 @@ public class IntegerProperty extends Property { public Property create(String name, Map arguments) { String range = arguments.getOrDefault("range", "1~1").toString(); String[] split = range.split("~"); - int min = Integer.parseInt(split[0]); - int max = Integer.parseInt(split[1]); - int defaultValue = MiscUtils.getAsInt(arguments.getOrDefault("default", min)); - return IntegerProperty.create(name, min, max,defaultValue); + if (split.length != 2) { + throw new LocalizedResourceConfigException("warning.config.block.state.property.integer.invalid_range", range, name); + } + try { + int min = Integer.parseInt(split[0]); + int max = Integer.parseInt(split[1]); + int defaultValue = ResourceConfigUtils.getAsInt(arguments.getOrDefault("default", min), "default"); + return IntegerProperty.create(name, min, max,defaultValue); + } catch (NumberFormatException e) { + throw new LocalizedResourceConfigException("warning.config.block.state.property.integer.invalid_range", e, range, name); + } } } } \ No newline at end of file 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 ac84cf0d5..0fae569ad 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 @@ -1,5 +1,6 @@ package net.momirealms.craftengine.core.block.properties; +import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; @@ -34,14 +35,14 @@ public class Properties { } public static Property fromMap(String name, Map map) { - String type = (String) map.getOrDefault("type", "empty"); + Object type = map.get("type"); if (type == null) { - throw new NullPointerException("Property type cannot be null"); + throw new LocalizedResourceConfigException("warning.config.block.state.property.lack_type", new NullPointerException("'type' cannot be null for block state property"), name); } - Key key = Key.withDefaultNamespace(type, "craftengine"); + Key key = Key.withDefaultNamespace(type.toString(), "craftengine"); PropertyFactory factory = BuiltInRegistries.PROPERTY_FACTORY.getValue(key); if (factory == null) { - throw new IllegalArgumentException("Unknown property type: " + type); + throw new LocalizedResourceConfigException("warning.config.block.state.property.invalid_type", new IllegalArgumentException("Unknown property type: " + type), key.toString(), name); } return factory.create(name, map); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/StringProperty.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/StringProperty.java index ee1e88cff..0c9dbb7c1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/properties/StringProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/StringProperty.java @@ -99,10 +99,7 @@ public class StringProperty extends Property { String defaultValue = values.stream() .filter(e -> e.toLowerCase(Locale.ENGLISH).equals(defaultValueName)) .findFirst() - .orElseGet(() -> { - CraftEngine.instance().logger().warn("Invalid default value '" + defaultValueName + "' for property '" + name + "'"); - return values.getFirst(); - }); + .orElseGet(() -> values.get(0)); return StringProperty.create(name, values, defaultValue); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBoxFactory.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBoxFactory.java index 54a4f6c39..3720eb9bd 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBoxFactory.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBoxFactory.java @@ -15,8 +15,8 @@ public interface HitBoxFactory { return seats.stream() .map(arg -> { String[] split = arg.split(" "); - if (split.length == 1) return new Seat(MiscUtils.getVector3f(split[0]), 0, false); - return new Seat(MiscUtils.getVector3f(split[0]), Float.parseFloat(split[1]), true); + if (split.length == 1) return new Seat(MiscUtils.getAsVector3f(split[0], "seats"), 0, false); + return new Seat(MiscUtils.getAsVector3f(split[0], "seats"), Float.parseFloat(split[1]), true); }) .toArray(Seat[]::new); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java index c2d829228..5ea86da63 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java @@ -515,8 +515,8 @@ public abstract class AbstractFontManager implements FontManager { throw new LocalizedResourceConfigException("warning.config.image.lack_height", path, id); } - int height = MiscUtils.getAsInt(heightObj); - int ascent = MiscUtils.getAsInt(section.getOrDefault("ascent", height - 1)); + int height = ResourceConfigUtils.getAsInt(heightObj, "height"); + int ascent = ResourceConfigUtils.getAsInt(section.getOrDefault("ascent", height - 1), "ascent"); if (height < ascent) { throw new LocalizedResourceConfigException("warning.config.image.height_smaller_than_ascent", path, id, String.valueOf(height), String.valueOf(ascent)); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java index 8b646436a..e3e6133ba 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java @@ -6,6 +6,7 @@ import net.momirealms.craftengine.core.pack.misc.EquipmentGeneration; 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 net.momirealms.craftengine.core.util.VersionHelper; import org.jetbrains.annotations.Nullable; @@ -157,14 +158,14 @@ public class ItemSettings { List> materials = (List>) value; List anvilRepairItemList = new ArrayList<>(); for (Map material : materials) { - int amount = MiscUtils.getAsInt(material.getOrDefault("amount", 0)); - double percent = MiscUtils.getAsDouble(material.getOrDefault("percent", 0)); + int amount = ResourceConfigUtils.getAsInt(material.getOrDefault("amount", 0), "amount"); + double percent = ResourceConfigUtils.getAsDouble(material.getOrDefault("percent", 0), "percent"); anvilRepairItemList.add(new AnvilRepairItem(MiscUtils.getAsStringList(material.get("target")), amount, percent)); } return settings -> settings.repairItems(anvilRepairItemList); })); registerFactory("fuel-time", (value -> { - int intValue = MiscUtils.getAsInt(value); + int intValue = ResourceConfigUtils.getAsInt(value, "fuel-time"); return settings -> settings.fuelTime(intValue); })); registerFactory("tags", (value -> { @@ -184,7 +185,7 @@ public class ItemSettings { EquipmentGeneration.Layer.fromConfig(args.get("wolf-body")), EquipmentGeneration.Layer.fromConfig(args.get("wings")), data, - MiscUtils.getAsInt(args.getOrDefault("trim", -1)) + ResourceConfigUtils.getAsInt(args.getOrDefault("trim", -1), "trim") ); return settings -> settings.equipment(equipment); })); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomBlastingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomBlastingRecipe.java index 2ec2dc0ae..fd0f29ebe 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomBlastingRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomBlastingRecipe.java @@ -3,6 +3,7 @@ package net.momirealms.craftengine.core.item.recipe; import net.momirealms.craftengine.core.registry.Holder; 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.NotNull; import java.util.Locale; @@ -27,8 +28,8 @@ public class CustomBlastingRecipe extends CustomCookingRecipe { @Override public Recipe create(Key id, Map arguments) { String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; - int cookingTime = MiscUtils.getAsInt(arguments.getOrDefault("time", 80)); - float experience = MiscUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f)); + int cookingTime = ResourceConfigUtils.getAsInt(arguments.getOrDefault("time", 80), "time"); + float experience = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f), "experience"); Set> holders = ingredientHolders(arguments); return new CustomBlastingRecipe(id, cookingRecipeCategory(arguments), group, Ingredient.of(holders), cookingTime, experience, parseResult(arguments)); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomCampfireRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomCampfireRecipe.java index 0a60194cd..984d185dd 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomCampfireRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomCampfireRecipe.java @@ -3,6 +3,7 @@ package net.momirealms.craftengine.core.item.recipe; import net.momirealms.craftengine.core.registry.Holder; 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.NotNull; import java.util.Locale; @@ -27,8 +28,8 @@ public class CustomCampfireRecipe extends CustomCookingRecipe { @Override public Recipe create(Key id, Map arguments) { String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; - int cookingTime = MiscUtils.getAsInt(arguments.getOrDefault("time", 80)); - float experience = MiscUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f)); + int cookingTime = ResourceConfigUtils.getAsInt(arguments.getOrDefault("time", 80), "time"); + float experience = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f), "experience"); Set> holders = ingredientHolders(arguments); return new CustomCampfireRecipe(id, cookingRecipeCategory(arguments), group, Ingredient.of(holders), cookingTime, experience, parseResult(arguments)); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmeltingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmeltingRecipe.java index b85c1a137..6698c3591 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmeltingRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmeltingRecipe.java @@ -4,6 +4,7 @@ import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigExce import net.momirealms.craftengine.core.registry.Holder; 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.NotNull; import java.util.Locale; @@ -28,8 +29,8 @@ public class CustomSmeltingRecipe extends CustomCookingRecipe { @Override public Recipe create(Key id, Map arguments) { String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; - int cookingTime = MiscUtils.getAsInt(arguments.getOrDefault("time", 80)); - float experience = MiscUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f)); + int cookingTime = ResourceConfigUtils.getAsInt(arguments.getOrDefault("time", 80), "time"); + float experience = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f), "experience"); Set> holders = ingredientHolders(arguments); return new CustomSmeltingRecipe(id, cookingRecipeCategory(arguments), group, Ingredient.of(holders), cookingTime, experience, parseResult(arguments)); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmokingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmokingRecipe.java index 308fed3a4..c875a19d5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmokingRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmokingRecipe.java @@ -4,6 +4,7 @@ import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigExce import net.momirealms.craftengine.core.registry.Holder; 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.NotNull; import java.util.Locale; @@ -28,8 +29,8 @@ public class CustomSmokingRecipe extends CustomCookingRecipe { @Override public Recipe create(Key id, Map arguments) { String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; - int cookingTime = MiscUtils.getAsInt(arguments.getOrDefault("time", 80)); - float experience = MiscUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f)); + int cookingTime = ResourceConfigUtils.getAsInt(arguments.getOrDefault("time", 80), "time"); + float experience = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f), "experience"); Set> holders = ingredientHolders(arguments); return new CustomSmokingRecipe(id, cookingRecipeCategory(arguments), group, Ingredient.of(holders), cookingTime, experience, parseResult(arguments)); } 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 517a04f35..8a9bd1ae0 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 @@ -4,6 +4,7 @@ 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.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; @@ -21,7 +22,7 @@ public interface RecipeFactory { if (id == null) { throw new LocalizedResourceConfigException("warning.config.recipe.result.lack_id", new IllegalArgumentException("id cannot be empty for result")); } - int count = MiscUtils.getAsInt(resultMap.getOrDefault("count", 1)); + int count = ResourceConfigUtils.getAsInt(resultMap.getOrDefault("count", 1), "count"); return new CustomRecipeResult( CraftEngine.instance().itemManager().getBuildableItem(Key.of(id)).orElseThrow( () -> new LocalizedResourceConfigException("warning.config.recipe.invalid_item", new IllegalArgumentException("Unknown recipe result item id: " + id), id)), 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 9f8bd8ac5..f5d197fa0 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 @@ -23,6 +23,7 @@ import java.util.Optional; import java.util.concurrent.ThreadLocalRandom; import java.util.function.BiFunction; import java.util.function.Consumer; +import java.util.function.Supplier; public class LootTable { private final List> pools; @@ -54,15 +55,15 @@ public class LootTable { NumberProvider rolls = NumberProviders.fromObject(pool.getOrDefault("rolls", 1)); NumberProvider bonus_rolls = NumberProviders.fromObject(pool.getOrDefault("bonus_rolls", 0)); List conditions = Optional.ofNullable(pool.get("conditions")) - .map(it -> LootConditions.fromMapList(MiscUtils.castToMapListOrThrow(it, + .map(it -> LootConditions.fromMapList(castToMapListOrThrow(it, () -> new LocalizedResourceConfigException("warning.config.loot_table.wrong_conditions_type", new RuntimeException("'conditions' should be a map list, current type: " + it.getClass().getSimpleName()), it.getClass().getSimpleName())))) .orElse(Lists.newArrayList()); List> containers = Optional.ofNullable(pool.get("entries")) - .map(it -> (List>) new ArrayList>(LootEntryContainers.fromMapList(MiscUtils.castToMapListOrThrow(it, + .map(it -> (List>) new ArrayList>(LootEntryContainers.fromMapList(castToMapListOrThrow(it, () -> new LocalizedResourceConfigException("warning.config.loot_table.wrong_entries_type", new RuntimeException("'entries' should be a map list, current type: " + it.getClass().getSimpleName()), it.getClass().getSimpleName()))))) .orElse(Lists.newArrayList()); List> functions = Optional.ofNullable(pool.get("functions")) - .map(it -> (List>) new ArrayList>(LootFunctions.fromMapList(MiscUtils.castToMapListOrThrow(it, + .map(it -> (List>) new ArrayList>(LootFunctions.fromMapList(castToMapListOrThrow(it, () -> new LocalizedResourceConfigException("warning.config.loot_table.wrong_functions_type", new RuntimeException("'functions' should be a map list, current type: " + it.getClass().getSimpleName()), it.getClass().getSimpleName()))))) .orElse(Lists.newArrayList()); lootPools.add(new LootPool<>(containers, conditions, functions, rolls, bonus_rolls)); @@ -74,7 +75,7 @@ public class LootTable { } return new LootTable<>(lootPools, Optional.ofNullable(map.get("functions")) - .map(it -> (List>) new ArrayList>(LootFunctions.fromMapList(MiscUtils.castToMapListOrThrow(it, + .map(it -> (List>) new ArrayList>(LootFunctions.fromMapList(castToMapListOrThrow(it, () -> new LocalizedResourceConfigException("warning.config.loot_table.wrong_functions_type", new RuntimeException("'functions' should be a map list, current type: " + it.getClass().getSimpleName()), it.getClass().getSimpleName()))))) .orElse(Lists.newArrayList()) ); @@ -129,4 +130,13 @@ public class LootTable { public static LootPool readFlatFormatLootPool(String pool) { return null; } + + @SuppressWarnings("unchecked") + private static List> castToMapListOrThrow(Object obj, Supplier exceptionSupplier) { + if (obj instanceof List list) { + return (List>) list; + } else { + throw exceptionSupplier.get(); + } + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/RandomCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/RandomCondition.java index 547daf8ed..a13aa0913 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/RandomCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/RandomCondition.java @@ -4,6 +4,7 @@ import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.RandomUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; @@ -28,7 +29,7 @@ public class RandomCondition implements LootCondition { public static class Factory implements LootConditionFactory { @Override public LootCondition create(Map arguments) { - float chance = MiscUtils.getAsFloat(arguments.getOrDefault("value", 0.5f)); + float chance = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("value", 0.5f), "value"); return new RandomCondition(chance); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/TableBonusCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/TableBonusCondition.java index 8560f80bd..28afe190e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/TableBonusCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/TableBonusCondition.java @@ -4,9 +4,12 @@ import net.momirealms.craftengine.core.item.Enchantment; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.LootContext; 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.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; @@ -37,9 +40,24 @@ public class TableBonusCondition implements LootCondition { public static class Factory implements LootConditionFactory { @Override public LootCondition create(Map arguments) { - Key enchantmentType = Key.of((String) arguments.get("enchantment")); - List floats = MiscUtils.getAsFloatList(arguments.get("chances")); - return new TableBonusCondition(enchantmentType, floats); + Object enchantmentObj = arguments.get("enchantment"); + if (enchantmentObj == null) { + throw new LocalizedResourceConfigException("warning.config.loot_table.condition.table_bonus.lack_enchantment", new NullPointerException("'enchantment' should not be null for table bonus")); + } + Key enchantmentType = Key.of(enchantmentObj.toString()); + Object chances = arguments.get("chances"); + if (chances != null) { + if (chances instanceof Number number) { + return new TableBonusCondition(enchantmentType, List.of(number.floatValue())); + } else if (chances instanceof List list) { + List values = new ArrayList<>(list.size()); + for (Object o : list) { + values.add(ResourceConfigUtils.getAsFloat(o, "chances")); + } + return new TableBonusCondition(enchantmentType, values); + } + } + throw new LocalizedResourceConfigException("warning.config.loot_table.condition.table_bonus.lack_chances", new NullPointerException("'chances' should not be null for table bonus")); } } } 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 9435a68b9..2801cf7da 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 @@ -11,10 +11,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.Key; -import net.momirealms.craftengine.core.util.MiscUtils; -import net.momirealms.craftengine.core.util.RandomUtils; -import net.momirealms.craftengine.core.util.ResourceKey; +import net.momirealms.craftengine.core.util.*; import java.util.Collections; import java.util.List; @@ -167,8 +164,8 @@ public class ApplyBonusCountFunction extends AbstractLootConditionalFunction< @Override public Formula create(Map arguments) { - int extra = MiscUtils.getAsInt(arguments.getOrDefault("extra", 1)); - float probability = MiscUtils.getAsFloat(arguments.getOrDefault("probability", 0.5f)); + int extra = ResourceConfigUtils.getAsInt(arguments.getOrDefault("extra", 1), "extra"); + float probability = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("probability", 0.5f), "probability"); return new CropDrops(extra, probability); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index de3c80cba..ddd89785d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -22,6 +22,7 @@ import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.plugin.config.StringKeyConstructor; import net.momirealms.craftengine.core.plugin.locale.I18NData; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; +import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.sound.AbstractSoundManager; import net.momirealms.craftengine.core.sound.SoundEvent; @@ -157,6 +158,10 @@ public abstract class AbstractPackManager implements PackManager { // we might add multiple host methods in future versions this.resourcePackHost = ResourcePackHosts.fromMap(MiscUtils.castToMap(list.get(0), false)); } catch (LocalizedException e) { + if (e instanceof LocalizedResourceConfigException exception) { + exception.setPath(plugin.dataFolderPath().resolve("config.yml")); + e.setArgument(1, "hosting"); + } TranslationManager.instance().log(e.node(), e.arguments()); this.resourcePackHost = NoneHost.INSTANCE; } @@ -426,7 +431,7 @@ public abstract class AbstractPackManager implements PackManager { for (Path path : files.right()) { try (InputStreamReader inputStream = new InputStreamReader(new FileInputStream(path.toFile()), StandardCharsets.UTF_8)) { Map dataRaw = GsonHelper.get().fromJson(JsonParser.parseReader(inputStream).getAsJsonObject(), Map.class); - Map data = MiscUtils.castToMap(dataRaw, false); + Map data = castToMap(dataRaw, false); for (Map.Entry entry : data.entrySet()) { processConfigEntry(entry, path, pack); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHostFactory.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHostFactory.java index 21c8bbf27..b77439841 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHostFactory.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHostFactory.java @@ -1,8 +1,35 @@ package net.momirealms.craftengine.core.pack.host; +import net.momirealms.craftengine.core.plugin.locale.LocalizedException; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; + +import java.net.InetSocketAddress; +import java.net.ProxySelector; import java.util.Map; public interface ResourcePackHostFactory { ResourcePackHost create(Map arguments); + + default ProxySelector getProxySelector(Map proxySetting) { + ProxySelector proxy = ProxySelector.getDefault(); + if (proxySetting != null) { + Object hostObj = proxySetting.get("host"); + if (hostObj == null) { + throw new LocalizedException("warning.config.host.proxy.lack_host", new NullPointerException("'host' should not be null for proxy setting")); + } + String proxyHost = hostObj.toString(); + Object portObj = proxySetting.get("port"); + if (portObj == null) { + throw new LocalizedException("warning.config.host.proxy.lack_port", new NullPointerException("'port' should not be null for proxy setting")); + } + int proxyPort = ResourceConfigUtils.getAsInt(portObj, "port"); + if (proxyHost == null || proxyHost.isEmpty() || proxyPort <= 0 || proxyPort > 65535) { + throw new LocalizedException("warning.config.host.proxy.invalid", proxyHost + ":" + proxyPort); + } else { + proxy = ProxySelector.of(new InetSocketAddress(proxyHost, proxyPort)); + } + } + return proxy; + } } 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 309c30a17..ea0b1a8a7 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 @@ -312,7 +312,7 @@ public class AlistHost implements ResourcePackHost { throw new LocalizedException("warning.config.host.alist.lack_upload_path"); } boolean disableUpload = (boolean) arguments.getOrDefault("disable-upload", false); - ProxySelector proxy = MiscUtils.getProxySelector(arguments.get("proxy")); + 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 9d4d6c743..9c8fc306e 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 @@ -283,7 +283,7 @@ public class DropboxHost implements ResourcePackHost { if (uploadPath == null || uploadPath.isEmpty()) { throw new LocalizedException("warning.config.host.dropbox.lack_upload_path"); } - ProxySelector proxy = MiscUtils.getProxySelector(arguments.get("proxy")); + 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/GitLabHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/GitLabHost.java index 6989c0f23..f70f37069 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/GitLabHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/GitLabHost.java @@ -193,7 +193,7 @@ public class GitLabHost implements ResourcePackHost { throw new LocalizedException("warning.config.host.gitlab.lack_project_id"); } projectId = URLEncoder.encode(projectId, StandardCharsets.UTF_8).replace("/", "%2F"); - ProxySelector proxy = MiscUtils.getProxySelector(arguments.get("proxy")); + ProxySelector proxy = getProxySelector(MiscUtils.castToMap(arguments.get("proxy"), true)); return new GitLabHost(gitlabUrl, accessToken, projectId, proxy); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java index 54023c414..3ff6f9e51 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java @@ -276,7 +276,7 @@ public class LobFileHost implements ResourcePackHost { if (apiKey == null || apiKey.isEmpty()) { throw new LocalizedException("warning.config.host.lobfile.lack_api_key"); } - ProxySelector proxy = MiscUtils.getProxySelector(arguments.get("proxy")); + ProxySelector proxy = getProxySelector(MiscUtils.castToMap(arguments.get("proxy"), true)); return new LobFileHost(apiKey, proxy); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java index f1e7dc100..fda092d7a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java @@ -248,7 +248,7 @@ public class OneDriveHost implements ResourcePackHost { if (uploadPath == null || uploadPath.isEmpty()) { throw new LocalizedException("warning.config.host.onedrive.lack_upload_path"); } - ProxySelector proxy = MiscUtils.getProxySelector(arguments.get("proxy")); + ProxySelector proxy = getProxySelector(MiscUtils.castToMap(arguments.get("proxy"), true)); return new OneDriveHost(clientId, clientSecret, refreshToken, uploadPath, proxy); } } 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 90ca54755..88dde11e9 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 @@ -9,6 +9,7 @@ import net.momirealms.craftengine.core.plugin.config.Config; 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.List; @@ -64,7 +65,7 @@ public class SelfHost implements ResourcePackHost { if (ip == null) { throw new LocalizedException("warning.config.host.self.lack_ip"); } - int port = MiscUtils.getAsInt(arguments.getOrDefault("port", 8163)); + int port = ResourceConfigUtils.getAsInt(arguments.getOrDefault("port", 8163), "port"); if (port < 0 || port > 65535) { throw new LocalizedException("warning.config.host.self.invalid_port", String.valueOf(port)); } @@ -75,8 +76,8 @@ public class SelfHost implements ResourcePackHost { int maxRequests = 5; int resetInterval = 20_000; if (rateMap != null) { - maxRequests = MiscUtils.getAsInt(rateMap.getOrDefault("max-requests", 5)); - resetInterval = MiscUtils.getAsInt(rateMap.getOrDefault("reset-interval", 20)) * 1000; + maxRequests = ResourceConfigUtils.getAsInt(rateMap.getOrDefault("max-requests", 5), "max-requests"); + resetInterval = ResourceConfigUtils.getAsInt(rateMap.getOrDefault("reset-interval", 20), "reset-interval") * 1000; } selfHostHttpServer.updateProperties(ip, port, denyNonMinecraftRequest, protocol, maxRequests, resetInterval, oneTimeToken); return INSTANCE; diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/RangeDispatchItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/RangeDispatchItemModel.java index ae66d0020..ab1f2167c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/RangeDispatchItemModel.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/RangeDispatchItemModel.java @@ -8,6 +8,7 @@ import net.momirealms.craftengine.core.pack.model.rangedisptach.RangeDispatchPro 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.NotNull; import org.jetbrains.annotations.Nullable; @@ -97,7 +98,7 @@ public class RangeDispatchItemModel implements ItemModel { @Override public ItemModel create(Map arguments) { RangeDispatchProperty property = RangeDispatchProperties.fromMap(arguments); - float scale = MiscUtils.getAsFloat(arguments.getOrDefault("scale", 1.0)); + float scale = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("scale", 1.0), "scale"); Map fallback = MiscUtils.castToMap(arguments.get("fallback"), true); Object entriesObj = arguments.get("entries"); if (entriesObj instanceof List list) { @@ -105,7 +106,7 @@ public class RangeDispatchItemModel implements ItemModel { if (!entries.isEmpty()) { Map entryMap = new HashMap<>(); for (Map entry : entries) { - float threshold = MiscUtils.getAsFloat(entry.getOrDefault("threshold", 1)); + float threshold = ResourceConfigUtils.getAsFloat(entry.getOrDefault("threshold", 1), "threshold"); Object model = entry.getOrDefault("model", fallback); if (model == null) { throw new LocalizedResourceConfigException("warning.config.item.model.range_dispatch.entry.lack_model", new NullPointerException("'model' is required for range_dispatch entry")); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/CustomModelDataConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/CustomModelDataConditionProperty.java index 3cfea5b88..ec17f1df0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/CustomModelDataConditionProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/CustomModelDataConditionProperty.java @@ -3,6 +3,7 @@ package net.momirealms.craftengine.core.pack.model.condition; import com.google.gson.JsonObject; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; @@ -30,7 +31,7 @@ public class CustomModelDataConditionProperty implements ConditionProperty { @Override public ConditionProperty create(Map arguments) { - int index = MiscUtils.getAsInt(arguments.getOrDefault("index", 0)); + int index = ResourceConfigUtils.getAsInt(arguments.getOrDefault("index", 0), "index"); return new CustomModelDataConditionProperty(index); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CustomModelDataRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CustomModelDataRangeDispatchProperty.java index 52a0aab71..445cd83da 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CustomModelDataRangeDispatchProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CustomModelDataRangeDispatchProperty.java @@ -4,6 +4,7 @@ import com.google.gson.JsonObject; import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; @@ -40,7 +41,7 @@ public class CustomModelDataRangeDispatchProperty implements RangeDispatchProper @Override public RangeDispatchProperty create(Map arguments) { - int index = MiscUtils.getAsInt(arguments.getOrDefault("index", 0)); + int index = ResourceConfigUtils.getAsInt(arguments.getOrDefault("index", 0), "index"); return new CustomModelDataRangeDispatchProperty(index); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseCycleRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseCycleRangeDispatchProperty.java index ff2e71104..522d05f30 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseCycleRangeDispatchProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseCycleRangeDispatchProperty.java @@ -3,6 +3,7 @@ package net.momirealms.craftengine.core.pack.model.rangedisptach; import com.google.gson.JsonObject; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; @@ -29,7 +30,7 @@ public class UseCycleRangeDispatchProperty implements RangeDispatchProperty { @Override public RangeDispatchProperty create(Map arguments) { - int period = MiscUtils.getAsInt(arguments.getOrDefault("period", 0)); + int period = ResourceConfigUtils.getAsInt(arguments.getOrDefault("period", 0), "period"); return new UseCycleRangeDispatchProperty(period); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/CustomModelDataSelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/CustomModelDataSelectProperty.java index 600f50e5b..a7f23ead6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/CustomModelDataSelectProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/CustomModelDataSelectProperty.java @@ -3,6 +3,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.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; @@ -29,7 +30,7 @@ public class CustomModelDataSelectProperty implements SelectProperty { @Override public SelectProperty create(Map arguments) { - int index = MiscUtils.getAsInt(arguments.getOrDefault("index", 0)); + int index = ResourceConfigUtils.getAsInt(arguments.getOrDefault("index", 0), "index"); return new CustomModelDataSelectProperty(index); } } 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 7e1511e0f..8acbfaca4 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 @@ -3,6 +3,7 @@ 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.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; import java.util.Objects; @@ -35,7 +36,7 @@ public class ChestSpecialModel implements SpecialModel { @Override public SpecialModel create(Map arguments) { - float openness = MiscUtils.getAsFloat(arguments.getOrDefault("openness", 0)); + float openness = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("openness", 0), "openness"); String texture = Objects.requireNonNull(arguments.get("texture"), "texture").toString(); if (openness > 1 || openness < 0) { throw new IllegalArgumentException("Invalid openness: " + openness + ". Valid range 0~1"); 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 680b7cda2..355aefef5 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 @@ -3,6 +3,7 @@ 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.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; import java.util.Objects; @@ -40,7 +41,7 @@ public class HeadSpecialModel implements SpecialModel { public SpecialModel create(Map arguments) { String kind = Objects.requireNonNull(arguments.get("kind"), "kind").toString(); String texture = Objects.requireNonNull(arguments.get("texture"), "texture").toString(); - int animation = MiscUtils.getAsInt(arguments.getOrDefault("animation", 0)); + int animation = ResourceConfigUtils.getAsInt(arguments.getOrDefault("animation", 0), "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 bc80c2693..2c01f9048 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 @@ -4,6 +4,7 @@ import com.google.gson.JsonObject; import net.momirealms.craftengine.core.util.Direction; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Locale; import java.util.Map; @@ -40,7 +41,7 @@ public class ShulkerBoxSpecialModel implements SpecialModel { @Override public SpecialModel create(Map arguments) { - float openness = MiscUtils.getAsFloat(arguments.getOrDefault("openness", 0)); + float openness = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("openness", 0), "openness"); String texture = Objects.requireNonNull(arguments.get("texture"), "texture").toString(); Direction orientation = Direction.valueOf(arguments.getOrDefault("orientation", "down").toString().toUpperCase(Locale.ENGLISH)); if (openness > 1 || openness < 0) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/CustomModelDataTint.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/CustomModelDataTint.java index a031e2690..df14b2b50 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/CustomModelDataTint.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/CustomModelDataTint.java @@ -4,6 +4,7 @@ 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.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import org.incendo.cloud.type.Either; import java.util.List; @@ -39,7 +40,7 @@ public class CustomModelDataTint implements Tint { @Override public Tint create(Map arguments) { Object value = arguments.getOrDefault("default", 0); - int index = MiscUtils.getAsInt(arguments.getOrDefault("index", 0)); + int index = ResourceConfigUtils.getAsInt(arguments.getOrDefault("index", 0), "index"); return new CustomModelDataTint(parseTintValue(value), index); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/GrassTint.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/GrassTint.java index a5f6752ba..06de9de31 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/GrassTint.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/GrassTint.java @@ -4,6 +4,7 @@ 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.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; @@ -35,8 +36,8 @@ public class GrassTint implements Tint { @Override public Tint create(Map arguments) { - float temperature = MiscUtils.getAsFloat(arguments.getOrDefault("temperature", 0)); - float downfall = MiscUtils.getAsFloat(arguments.getOrDefault("downfall", 0)); + float temperature = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("temperature", 0), "temperature"); + float downfall = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("downfall", 0), "downfall"); if (temperature > 1 || temperature < 0) { throw new LocalizedResourceConfigException("warning.config.item.model.tint.grass.invalid_temperature", new IllegalArgumentException("Invalid temperature: " + temperature + ". Valid range 0~1"), String.valueOf(temperature)); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/SelfIncreaseIntTemplateArgument.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/SelfIncreaseIntTemplateArgument.java index 89dab33a5..49dda102a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/SelfIncreaseIntTemplateArgument.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/SelfIncreaseIntTemplateArgument.java @@ -1,7 +1,10 @@ package net.momirealms.craftengine.core.plugin.config.template; +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 software.amazon.awssdk.services.s3.endpoints.internal.Value; import java.util.Map; @@ -44,9 +47,9 @@ public class SelfIncreaseIntTemplateArgument implements TemplateArgument { public static class Factory implements TemplateArgumentFactory { @Override public TemplateArgument create(Map arguments) { - int from = MiscUtils.getAsInt(arguments.get("from")); - int to = MiscUtils.getAsInt(arguments.get("to")); - if (from > to) throw new IllegalArgumentException("from > to"); + int from = ResourceConfigUtils.getAsInt(arguments.get("from"), "from"); + int to = ResourceConfigUtils.getAsInt(arguments.get("to"), "to"); + if (from > to) throw new LocalizedResourceConfigException("warning.config.template.from_larger_than_to", String.valueOf(from), String.valueOf(to)); return new SelfIncreaseIntTemplateArgument(from, to); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java index 11ca0db20..bae7a0adf 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java @@ -7,6 +7,7 @@ import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.util.GsonHelper; 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.NotNull; import java.nio.file.Path; @@ -15,8 +16,6 @@ import java.util.function.Consumer; import java.util.function.Supplier; import java.util.regex.Matcher; -import static net.momirealms.craftengine.core.util.MiscUtils.castToMap; - public class TemplateManagerImpl implements TemplateManager { private final Map templates = new HashMap<>(); private final static Set NON_TEMPLATE_KEY = new HashSet<>(Set.of(TEMPLATE, ARGUMENTS, OVERRIDES)); @@ -184,7 +183,7 @@ public class TemplateManagerImpl implements TemplateManager { } // 将本节点下的参数与父参数合并 Map arguments = mergeArguments( - castToMap(input.getOrDefault(ARGUMENTS, Collections.emptyMap()), false), + MiscUtils.castToMap(input.getOrDefault(ARGUMENTS, Collections.emptyMap()), false), parentArguments ); // 对overrides参数应用 本节点 + 父节点 参数 diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java index b8d61c3d7..6bed70f13 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java @@ -15,6 +15,7 @@ import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.craftengine.core.util.Key; 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.util.context.PlayerContext; @@ -110,7 +111,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { String name = section.getOrDefault("name", id).toString(); List members = MiscUtils.getAsStringList(section.getOrDefault("list", List.of())); Key icon = Key.of(section.getOrDefault("icon", ItemKeys.STONE).toString()); - int priority = MiscUtils.getAsInt(section.getOrDefault("priority", 0)); + int priority = ResourceConfigUtils.getAsInt(section.getOrDefault("priority", 0), "priority"); Category category = new Category(id, name, MiscUtils.getAsStringList(section.getOrDefault("lore", List.of())), icon, members.stream().distinct().toList(), priority, (boolean) section.getOrDefault("hidden", false)); if (ItemBrowserManagerImpl.this.byId.containsKey(id)) { ItemBrowserManagerImpl.this.byId.get(id).merge(category); 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 6a0826695..d1ace9653 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 @@ -6,10 +6,7 @@ import net.momirealms.craftengine.core.pack.Pack; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; -import net.momirealms.craftengine.core.util.AdventureHelper; -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 java.nio.file.Path; import java.util.*; @@ -85,9 +82,9 @@ public abstract class AbstractSoundManager implements SoundManager { throw new LocalizedResourceConfigException("warning.config.jukebox_song.lack_sound", path, id); } Component description = AdventureHelper.miniMessage().deserialize(section.getOrDefault("description", "").toString()); - float length = MiscUtils.getAsFloat(section.get("length")); - int comparatorOutput = MiscUtils.getAsInt(section.getOrDefault("comparator-output", 15)); - JukeboxSong song = new JukeboxSong(Key.of(sound), description, length, comparatorOutput, MiscUtils.getAsFloat(section.getOrDefault("range", 32f))); + 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), description, length, comparatorOutput, ResourceConfigUtils.getAsFloat(section.getOrDefault("range", 32f), "range")); AbstractSoundManager.this.songs.put(id, song); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/Sound.java b/core/src/main/java/net/momirealms/craftengine/core/sound/Sound.java index df6de9576..4fa034178 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/sound/Sound.java +++ b/core/src/main/java/net/momirealms/craftengine/core/sound/Sound.java @@ -4,6 +4,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.HashMap; import java.util.Map; @@ -93,11 +94,11 @@ public interface Sound extends Supplier { public static final Map MODIFIERS = new HashMap<>(); static { - MODIFIERS.put("volume", (b, o) -> b.volume(MiscUtils.getAsFloat(o))); - MODIFIERS.put("pitch", (b, o) -> b.pitch(MiscUtils.getAsFloat(o))); - MODIFIERS.put("weight", (b, o) -> b.pitch(MiscUtils.getAsInt(o))); + MODIFIERS.put("volume", (b, o) -> b.volume(ResourceConfigUtils.getAsFloat(o, "volume"))); + MODIFIERS.put("pitch", (b, o) -> b.pitch(ResourceConfigUtils.getAsFloat(o, "pitch"))); + MODIFIERS.put("weight", (b, o) -> b.pitch(ResourceConfigUtils.getAsInt(o, "weight"))); MODIFIERS.put("stream", (b, o) -> b.stream((boolean) o)); - MODIFIERS.put("attenuation-distance", (b, o) -> b.attenuationDistance(MiscUtils.getAsInt(o))); + MODIFIERS.put("attenuation-distance", (b, o) -> b.attenuationDistance(ResourceConfigUtils.getAsInt(o, "attenuation-distance"))); MODIFIERS.put("preload", (b, o) -> b.preload((boolean) o)); MODIFIERS.put("type", (b, o) -> b.type(o.toString())); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/SoundData.java b/core/src/main/java/net/momirealms/craftengine/core/sound/SoundData.java index 5cdd8d198..457100e5d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/sound/SoundData.java +++ b/core/src/main/java/net/momirealms/craftengine/core/sound/SoundData.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.sound; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; @@ -13,8 +14,8 @@ public record SoundData(Key id, float volume, float pitch) { } else if (obj instanceof Map map) { Map data = MiscUtils.castToMap(map, false); Key id = Key.of((String) data.get("id")); - float volumeFloat = MiscUtils.getAsFloat(data.getOrDefault("volume", volume)); - float pitchFloat = MiscUtils.getAsFloat(data.getOrDefault("pitch", pitch)); + float volumeFloat = ResourceConfigUtils.getAsFloat(data.getOrDefault("volume", volume), "volume"); + float pitchFloat = ResourceConfigUtils.getAsFloat(data.getOrDefault("pitch", pitch), "pitch"); return new SoundData(id, volumeFloat, pitchFloat); } else { throw new IllegalArgumentException("Illegal object type for sound data: " + obj.getClass()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/MiscUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/MiscUtils.java index 12e27e285..463218307 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/MiscUtils.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/MiscUtils.java @@ -1,15 +1,12 @@ package net.momirealms.craftengine.core.util; +import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import org.joml.Quaternionf; -import org.joml.Vector3d; import org.joml.Vector3f; -import java.net.InetSocketAddress; -import java.net.ProxySelector; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.function.Supplier; public class MiscUtils { @@ -26,15 +23,6 @@ public class MiscUtils { throw new IllegalArgumentException("Expected Map, got: " + (obj == null ? null : obj.getClass().getSimpleName())); } - @SuppressWarnings("unchecked") - public static List> castToMapListOrThrow(Object obj, Supplier exceptionSupplier) { - if (obj instanceof List list) { - return (List>) list; - } else { - throw exceptionSupplier.get(); - } - } - @SuppressWarnings("unchecked") public static List castToList(Object obj, boolean allowNull) { if (allowNull && obj == null) { @@ -62,84 +50,8 @@ public class MiscUtils { return list; } - public static List getAsFloatList(Object o) { - List list = new ArrayList<>(); - if (o instanceof List) { - for (Object object : (List) o) { - if (object instanceof Number) { - list.add(((Number) object).floatValue()); - } else if (object instanceof String) { - try { - list.add(Float.parseFloat((String) object)); - } catch (NumberFormatException e) { - throw new RuntimeException("Cannot convert " + object + " to float"); - } - } else { - throw new RuntimeException("Cannot convert " + object + " to float"); - } - } - } else if (o instanceof Float) { - list.add((Float) o); - } else if (o instanceof String) { - try { - list.add(Float.parseFloat((String) o)); - } catch (NumberFormatException e) { - throw new RuntimeException("Cannot convert " + o + " to float"); - } - } else { - throw new RuntimeException("Cannot convert " + o + " to float"); - } - return list; - } - - public static int getAsInt(Object o) { - if (o instanceof Integer) { - return (Integer) o; - } else if (o instanceof String) { - try { - return Integer.parseInt((String) o); - } catch (NumberFormatException e) { - throw new RuntimeException("Cannot convert " + o + " to int"); - } - } else if (o instanceof Boolean) { - return (Boolean) o ? 1 : 0; - } else if (o instanceof Number) { - return ((Number) o).intValue(); - } - throw new RuntimeException("Cannot convert " + o + " to int"); - } - - public static double getAsDouble(Object o) { - if (o instanceof Double) { - return (Double) o; - } else if (o instanceof String) { - try { - return Double.parseDouble((String) o); - } catch (NumberFormatException e) { - throw new RuntimeException("Cannot convert " + o + " to double"); - } - } else if (o instanceof Number) { - return ((Number) o).doubleValue(); - } - throw new RuntimeException("Cannot convert " + o + " to double"); - } - - public static float getAsFloat(Object o) { - if (o instanceof Float) { - return (Float) o; - } else if (o instanceof String) { - try { - return Float.parseFloat((String) o); - } catch (NumberFormatException e) { - throw new RuntimeException("Cannot convert " + o + " to float"); - } - } else if (o instanceof Number) { - return ((Number) o).floatValue(); - } - throw new RuntimeException("Cannot convert " + o + " to float"); - } - - public static Vector3f getVector3f(Object o) { + public static Vector3f getAsVector3f(Object o, String option) { + if (o == null) return new Vector3f(); String stringFormat = o.toString(); String[] split = stringFormat.split(","); if (split.length == 3) { @@ -147,23 +59,12 @@ public class MiscUtils { } else if (split.length == 1) { return new Vector3f(Float.parseFloat(split[0])); } else { - throw new RuntimeException("Cannot convert " + o + " to Vector3f"); + throw new LocalizedResourceConfigException("warning.config.cast_vector3f", new RuntimeException("Cannot convert " + o + " to Vector3f"), stringFormat, option); } } - public static Vector3d getVector3d(Object o) { - String stringFormat = o.toString(); - String[] split = stringFormat.split(","); - if (split.length == 3) { - return new Vector3d(Double.parseDouble(split[0]), Double.parseDouble(split[1]), Double.parseDouble(split[2])); - } else if (split.length == 1) { - return new Vector3d(Double.parseDouble(split[0])); - } else { - throw new RuntimeException("Cannot convert " + o + " to Vector3d"); - } - } - - public static Quaternionf getQuaternionf(Object o) { + public static Quaternionf getAsQuaternionf(Object o, String option) { + if (o == null) return new Quaternionf(); String stringFormat = o.toString(); String[] split = stringFormat.split(","); if (split.length == 4) { @@ -171,22 +72,7 @@ public class MiscUtils { } else if (split.length == 1) { return QuaternionUtils.toQuaternionf(0, Math.toRadians(Float.parseFloat(split[0])), 0); } else { - throw new RuntimeException("Cannot convert " + o + " to Quaternionf"); + throw new LocalizedResourceConfigException("warning.config.cast_quaternionf", new RuntimeException("Cannot convert " + o + " to Quaternionf"), stringFormat, option); } } - - public static ProxySelector getProxySelector(Object o) { - Map proxySetting = castToMap(o, true); - ProxySelector proxy = ProxySelector.getDefault(); - if (proxySetting != null) { - String proxyHost = (String) proxySetting.get("host"); - int proxyPort = (int) proxySetting.get("port"); - if (proxyHost == null || proxyHost.isEmpty() || proxyPort <= 0 || proxyPort > 65535) { - throw new IllegalArgumentException("Invalid proxy setting"); - } else { - proxy = ProxySelector.of(new InetSocketAddress(proxyHost, proxyPort)); - } - } - return proxy; - } } 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 new file mode 100644 index 000000000..0ad2edc63 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ResourceConfigUtils.java @@ -0,0 +1,83 @@ +package net.momirealms.craftengine.core.util; + +import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; + +import java.util.Map; + +public final class ResourceConfigUtils { + + private ResourceConfigUtils() {} + + public static int getAsInt(Object o, String option) { + switch (o) { + case null -> { + return 0; + } + case Integer i -> { + return i; + } + case Number number -> { + return number.intValue(); + } + case String s -> { + try { + return Integer.parseInt(s); + } catch (NumberFormatException e) { + throw new LocalizedResourceConfigException("warning.config.cast_int", e, s, option); + } + } + case Boolean b -> { + return b ? 1 : 0; + } + default -> throw new LocalizedResourceConfigException("warning.config.cast_int", o.toString(), option); + } + } + + public static double getAsDouble(Object o, String option) { + switch (o) { + case null -> { + return 0.0; + } + case Double d -> { + return d; + } + case Number n -> { + return n.doubleValue(); + } + case String s -> { + try { + return Double.parseDouble(s); + } catch (NumberFormatException e) { + throw new LocalizedResourceConfigException("warning.config.cast_double", e, s, option); + } + } + default -> { + throw new LocalizedResourceConfigException("warning.config.cast_double", o.toString(), option); + } + } + } + + public static float getAsFloat(Object o, String option) { + switch (o) { + case null -> { + return 0.0f; + } + case Float f -> { + return f; + } + case String s -> { + try { + return Float.parseFloat(s); + } catch (NumberFormatException e) { + throw new LocalizedResourceConfigException("warning.config.cast_float", e, s, option); + } + } + case Number number -> { + return number.floatValue(); + } + default -> { + throw new LocalizedResourceConfigException("warning.config.cast_float", o.toString(), option); + } + } + } +}