refactor: split ConfigParser into 3 classes (464→222 lines)
Разбил ConfigParser на три класса для соблюдения лимита 200 строк: - ConfigParser.java (222 строки) - базовый парсинг selections, blocks, fillMode, mask, teleport - RewardParser.java (222 строки) - парсинг наград (rewards, materials, items, commands) - RewardItemParser.java (80 строк) - парсинг ItemStack из YAML Все классы теперь соответствуют требованию ≤200 строк. ConfigLoader обновлен для использования новой архитектуры.
This commit is contained in:
parent
5ddd6e93b0
commit
d317d0b1b0
4 changed files with 312 additions and 251 deletions
|
|
@ -20,7 +20,8 @@ public final class ConfigLoader {
|
||||||
private final ConfigSerializer serializer;
|
private final ConfigSerializer serializer;
|
||||||
|
|
||||||
public ConfigLoader() {
|
public ConfigLoader() {
|
||||||
this.parser = new ConfigParser();
|
RewardParser rewardParser = new RewardParser();
|
||||||
|
this.parser = new ConfigParser(rewardParser);
|
||||||
this.validator = new ConfigValidator();
|
this.validator = new ConfigValidator();
|
||||||
this.serializer = new ConfigSerializer();
|
this.serializer = new ConfigSerializer();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,12 @@ import java.util.Map;
|
||||||
*/
|
*/
|
||||||
final class ConfigParser {
|
final class ConfigParser {
|
||||||
|
|
||||||
|
private final RewardParser rewardParser;
|
||||||
|
|
||||||
|
ConfigParser(RewardParser rewardParser) {
|
||||||
|
this.rewardParser = rewardParser;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses selection coordinates from the YAML configuration.
|
* Parses selection coordinates from the YAML configuration.
|
||||||
* Reads selection.1 through selection.10 fields.
|
* Reads selection.1 through selection.10 fields.
|
||||||
|
|
@ -150,48 +156,14 @@ final class ConfigParser {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses rewards from the YAML configuration.
|
* Parses rewards from the YAML configuration.
|
||||||
|
* Delegates to RewardParser for actual parsing logic.
|
||||||
*
|
*
|
||||||
* @param yaml the YAML configuration
|
* @param yaml the YAML configuration
|
||||||
* @return list of parsed Reward objects
|
* @return list of parsed Reward objects
|
||||||
* @throws ConfigParseException if reward configuration is invalid
|
* @throws ConfigParseException if reward configuration is invalid
|
||||||
*/
|
*/
|
||||||
List<Reward> parseRewards(YamlConfiguration yaml) throws ConfigParseException {
|
List<Reward> parseRewards(YamlConfiguration yaml) throws ConfigParseException {
|
||||||
List<Reward> rewards = new ArrayList<>();
|
return rewardParser.parseRewards(yaml);
|
||||||
|
|
||||||
if (!yaml.contains("random-rewards")) {
|
|
||||||
return rewards;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<?> rewardsList = yaml.getList("random-rewards");
|
|
||||||
if (rewardsList == null) {
|
|
||||||
return rewards;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < rewardsList.size(); i++) {
|
|
||||||
Object rewardObj = rewardsList.get(i);
|
|
||||||
|
|
||||||
if (!(rewardObj instanceof Map)) {
|
|
||||||
throw new ConfigParseException(
|
|
||||||
"Invalid reward at index " + i + ": expected map, got " +
|
|
||||||
(rewardObj != null ? rewardObj.getClass().getSimpleName() : "null")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
Map<String, Object> rewardMap = (Map<String, Object>) rewardObj;
|
|
||||||
|
|
||||||
try {
|
|
||||||
Reward reward = parseReward(rewardMap);
|
|
||||||
rewards.add(reward);
|
|
||||||
} catch (ConfigParseException e) {
|
|
||||||
throw new ConfigParseException(
|
|
||||||
"Error parsing reward at index " + i + ": " + e.getMessage(),
|
|
||||||
e
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return rewards;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -247,218 +219,4 @@ final class ConfigParser {
|
||||||
}
|
}
|
||||||
return key.toLowerCase();
|
return key.toLowerCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Reward parseReward(Map<String, Object> rewardMap) throws ConfigParseException {
|
|
||||||
double chance = parseRewardField(rewardMap, "chance", Double.class);
|
|
||||||
boolean preventDrops = parseRewardField(rewardMap, "prevent-drops", Boolean.class, false);
|
|
||||||
|
|
||||||
List<org.bukkit.Material> materials = parseRewardMaterials(rewardMap);
|
|
||||||
List<org.bukkit.inventory.ItemStack> items = parseRewardItems(rewardMap);
|
|
||||||
List<String> commands = parseRewardCommands(rewardMap);
|
|
||||||
|
|
||||||
return new Reward(materials, chance, items, commands, preventDrops);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
private <T> T parseRewardField(Map<String, Object> map, String key, Class<T> type)
|
|
||||||
throws ConfigParseException {
|
|
||||||
if (!map.containsKey(key)) {
|
|
||||||
throw new ConfigParseException("Missing required '" + key + "' field in reward");
|
|
||||||
}
|
|
||||||
|
|
||||||
Object value = map.get(key);
|
|
||||||
|
|
||||||
if (type == Double.class) {
|
|
||||||
return (T) parseDoubleValue(key, value);
|
|
||||||
} else if (type == Boolean.class) {
|
|
||||||
if (!(value instanceof Boolean)) {
|
|
||||||
throw new ConfigParseException(
|
|
||||||
"Invalid '" + key + "' value: expected boolean, got " +
|
|
||||||
(value != null ? value.getClass().getSimpleName() : "null")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return (T) value;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new ConfigParseException("Unsupported type: " + type);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
private <T> T parseRewardField(Map<String, Object> map, String key, Class<T> type, T defaultValue) {
|
|
||||||
if (!map.containsKey(key)) {
|
|
||||||
return defaultValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
Object value = map.get(key);
|
|
||||||
if (type.isInstance(value)) {
|
|
||||||
return (T) value;
|
|
||||||
}
|
|
||||||
|
|
||||||
return defaultValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Double parseDoubleValue(String key, Object value) throws ConfigParseException {
|
|
||||||
try {
|
|
||||||
if (value instanceof Number) {
|
|
||||||
return ((Number) value).doubleValue();
|
|
||||||
} else if (value instanceof String) {
|
|
||||||
return Double.parseDouble((String) value);
|
|
||||||
} else {
|
|
||||||
throw new ConfigParseException(
|
|
||||||
"Invalid '" + key + "' type: expected number, got " +
|
|
||||||
(value != null ? value.getClass().getSimpleName() : "null")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
throw new ConfigParseException("Invalid '" + key + "' value: " + value, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<org.bukkit.Material> parseRewardMaterials(Map<String, Object> rewardMap)
|
|
||||||
throws ConfigParseException {
|
|
||||||
if (!rewardMap.containsKey("blocks")) {
|
|
||||||
throw new ConfigParseException("Missing required 'blocks' field in reward");
|
|
||||||
}
|
|
||||||
|
|
||||||
Object blocksObj = rewardMap.get("blocks");
|
|
||||||
if (!(blocksObj instanceof List)) {
|
|
||||||
throw new ConfigParseException(
|
|
||||||
"Invalid 'blocks' type: expected list, got " +
|
|
||||||
(blocksObj != null ? blocksObj.getClass().getSimpleName() : "null")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
List<String> blocksList = (List<String>) blocksObj;
|
|
||||||
|
|
||||||
List<org.bukkit.Material> materials = new ArrayList<>();
|
|
||||||
for (String blockName : blocksList) {
|
|
||||||
if (blockName == null || blockName.trim().isEmpty()) {
|
|
||||||
throw new ConfigParseException("Block name cannot be null or empty");
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
org.bukkit.Material material = org.bukkit.Material.valueOf(blockName.toUpperCase());
|
|
||||||
materials.add(material);
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
throw new ConfigParseException(
|
|
||||||
"Unknown material in reward blocks: '" + blockName + "'",
|
|
||||||
e
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return materials;
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<org.bukkit.inventory.ItemStack> parseRewardItems(Map<String, Object> rewardMap)
|
|
||||||
throws ConfigParseException {
|
|
||||||
List<org.bukkit.inventory.ItemStack> items = new ArrayList<>();
|
|
||||||
|
|
||||||
if (!rewardMap.containsKey("items")) {
|
|
||||||
return items;
|
|
||||||
}
|
|
||||||
|
|
||||||
Object itemsObj = rewardMap.get("items");
|
|
||||||
if (!(itemsObj instanceof List)) {
|
|
||||||
throw new ConfigParseException(
|
|
||||||
"Invalid 'items' type: expected list, got " +
|
|
||||||
(itemsObj != null ? itemsObj.getClass().getSimpleName() : "null")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<?> itemsList = (List<?>) itemsObj;
|
|
||||||
|
|
||||||
for (int i = 0; i < itemsList.size(); i++) {
|
|
||||||
Object itemObj = itemsList.get(i);
|
|
||||||
|
|
||||||
if (!(itemObj instanceof Map)) {
|
|
||||||
throw new ConfigParseException(
|
|
||||||
"Invalid item at index " + i + ": expected map, got " +
|
|
||||||
(itemObj != null ? itemObj.getClass().getSimpleName() : "null")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
Map<String, Object> itemMap = (Map<String, Object>) itemObj;
|
|
||||||
|
|
||||||
org.bukkit.inventory.ItemStack item = parseRewardItem(itemMap, i);
|
|
||||||
items.add(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
return items;
|
|
||||||
}
|
|
||||||
|
|
||||||
private org.bukkit.inventory.ItemStack parseRewardItem(Map<String, Object> itemMap, int index)
|
|
||||||
throws ConfigParseException {
|
|
||||||
if (!itemMap.containsKey("type")) {
|
|
||||||
throw new ConfigParseException("Missing required 'type' field in item at index " + index);
|
|
||||||
}
|
|
||||||
|
|
||||||
String typeName = String.valueOf(itemMap.get("type"));
|
|
||||||
org.bukkit.Material material;
|
|
||||||
try {
|
|
||||||
material = org.bukkit.Material.valueOf(typeName.toUpperCase());
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
throw new ConfigParseException(
|
|
||||||
"Unknown material in item type: '" + typeName + "'",
|
|
||||||
e
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
int amount = parseItemAmount(itemMap);
|
|
||||||
|
|
||||||
return new org.bukkit.inventory.ItemStack(material, amount);
|
|
||||||
}
|
|
||||||
|
|
||||||
private int parseItemAmount(Map<String, Object> itemMap) throws ConfigParseException {
|
|
||||||
if (!itemMap.containsKey("amount")) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
Object amountObj = itemMap.get("amount");
|
|
||||||
try {
|
|
||||||
if (amountObj instanceof Number) {
|
|
||||||
return ((Number) amountObj).intValue();
|
|
||||||
} else if (amountObj instanceof String) {
|
|
||||||
return Integer.parseInt((String) amountObj);
|
|
||||||
} else {
|
|
||||||
throw new ConfigParseException(
|
|
||||||
"Invalid 'amount' type: expected number, got " +
|
|
||||||
(amountObj != null ? amountObj.getClass().getSimpleName() : "null")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
throw new ConfigParseException("Invalid 'amount' value: " + amountObj, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<String> parseRewardCommands(Map<String, Object> rewardMap)
|
|
||||||
throws ConfigParseException {
|
|
||||||
List<String> commands = new ArrayList<>();
|
|
||||||
|
|
||||||
if (!rewardMap.containsKey("commands")) {
|
|
||||||
return commands;
|
|
||||||
}
|
|
||||||
|
|
||||||
Object commandsObj = rewardMap.get("commands");
|
|
||||||
if (!(commandsObj instanceof List)) {
|
|
||||||
throw new ConfigParseException(
|
|
||||||
"Invalid 'commands' type: expected list, got " +
|
|
||||||
(commandsObj != null ? commandsObj.getClass().getSimpleName() : "null")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
List<String> commandsList = (List<String>) commandsObj;
|
|
||||||
|
|
||||||
for (String command : commandsList) {
|
|
||||||
if (command == null || command.trim().isEmpty()) {
|
|
||||||
throw new ConfigParseException("Command cannot be null or empty");
|
|
||||||
}
|
|
||||||
commands.add(command);
|
|
||||||
}
|
|
||||||
|
|
||||||
return commands;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
80
src/main/java/com/loki/lomines/data/RewardItemParser.java
Normal file
80
src/main/java/com/loki/lomines/data/RewardItemParser.java
Normal file
|
|
@ -0,0 +1,80 @@
|
||||||
|
package com.loki.lomines.data;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses ItemStack objects from YAML reward item configurations.
|
||||||
|
* Handles material type, amount, and basic item properties.
|
||||||
|
*/
|
||||||
|
final class RewardItemParser {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses a single reward item from a map configuration.
|
||||||
|
*
|
||||||
|
* @param itemMap the item configuration map
|
||||||
|
* @param index the index of the item in the list (for error messages)
|
||||||
|
* @return the parsed ItemStack
|
||||||
|
* @throws ConfigParseException if the item configuration is invalid
|
||||||
|
*/
|
||||||
|
ItemStack parseItem(Map<String, Object> itemMap, int index) throws ConfigParseException {
|
||||||
|
if (!itemMap.containsKey("type")) {
|
||||||
|
throw new ConfigParseException("Missing required 'type' field in item at index " + index);
|
||||||
|
}
|
||||||
|
|
||||||
|
String typeName = String.valueOf(itemMap.get("type"));
|
||||||
|
Material material = parseMaterial(typeName);
|
||||||
|
int amount = parseAmount(itemMap);
|
||||||
|
|
||||||
|
return new ItemStack(material, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses a material from a string name.
|
||||||
|
*
|
||||||
|
* @param typeName the material name
|
||||||
|
* @return the parsed Material
|
||||||
|
* @throws ConfigParseException if the material is unknown
|
||||||
|
*/
|
||||||
|
private Material parseMaterial(String typeName) throws ConfigParseException {
|
||||||
|
try {
|
||||||
|
return Material.valueOf(typeName.toUpperCase());
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
throw new ConfigParseException(
|
||||||
|
"Unknown material in item type: '" + typeName + "'",
|
||||||
|
e
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the amount field from an item configuration.
|
||||||
|
*
|
||||||
|
* @param itemMap the item configuration map
|
||||||
|
* @return the parsed amount (defaults to 1 if not specified)
|
||||||
|
* @throws ConfigParseException if the amount value is invalid
|
||||||
|
*/
|
||||||
|
private int parseAmount(Map<String, Object> itemMap) throws ConfigParseException {
|
||||||
|
if (!itemMap.containsKey("amount")) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Object amountObj = itemMap.get("amount");
|
||||||
|
try {
|
||||||
|
if (amountObj instanceof Number) {
|
||||||
|
return ((Number) amountObj).intValue();
|
||||||
|
} else if (amountObj instanceof String) {
|
||||||
|
return Integer.parseInt((String) amountObj);
|
||||||
|
} else {
|
||||||
|
throw new ConfigParseException(
|
||||||
|
"Invalid 'amount' type: expected number, got " +
|
||||||
|
(amountObj != null ? amountObj.getClass().getSimpleName() : "null")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throw new ConfigParseException("Invalid 'amount' value: " + amountObj, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
222
src/main/java/com/loki/lomines/data/RewardParser.java
Normal file
222
src/main/java/com/loki/lomines/data/RewardParser.java
Normal file
|
|
@ -0,0 +1,222 @@
|
||||||
|
package com.loki.lomines.data;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses reward configurations from YAML.
|
||||||
|
* Handles reward chance, materials, items, commands, and prevent-drops settings.
|
||||||
|
*/
|
||||||
|
final class RewardParser {
|
||||||
|
|
||||||
|
private final RewardItemParser itemParser;
|
||||||
|
|
||||||
|
RewardParser() {
|
||||||
|
this.itemParser = new RewardItemParser();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses all rewards from the YAML configuration.
|
||||||
|
*
|
||||||
|
* @param yaml the YAML configuration
|
||||||
|
* @return list of parsed Reward objects
|
||||||
|
* @throws ConfigParseException if reward configuration is invalid
|
||||||
|
*/
|
||||||
|
List<Reward> parseRewards(YamlConfiguration yaml) throws ConfigParseException {
|
||||||
|
List<Reward> rewards = new ArrayList<>();
|
||||||
|
|
||||||
|
if (!yaml.contains("random-rewards")) {
|
||||||
|
return rewards;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<?> rewardsList = yaml.getList("random-rewards");
|
||||||
|
if (rewardsList == null) {
|
||||||
|
return rewards;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < rewardsList.size(); i++) {
|
||||||
|
Object rewardObj = rewardsList.get(i);
|
||||||
|
|
||||||
|
if (!(rewardObj instanceof Map)) {
|
||||||
|
throw new ConfigParseException(
|
||||||
|
"Invalid reward at index " + i + ": expected map, got " +
|
||||||
|
(rewardObj != null ? rewardObj.getClass().getSimpleName() : "null")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Map<String, Object> rewardMap = (Map<String, Object>) rewardObj;
|
||||||
|
|
||||||
|
try {
|
||||||
|
Reward reward = parseReward(rewardMap);
|
||||||
|
rewards.add(reward);
|
||||||
|
} catch (ConfigParseException e) {
|
||||||
|
throw new ConfigParseException(
|
||||||
|
"Error parsing reward at index " + i + ": " + e.getMessage(),
|
||||||
|
e
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rewards;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses a single reward from a map configuration.
|
||||||
|
*
|
||||||
|
* @param rewardMap the reward configuration map
|
||||||
|
* @return the parsed Reward object
|
||||||
|
* @throws ConfigParseException if the reward configuration is invalid
|
||||||
|
*/
|
||||||
|
private Reward parseReward(Map<String, Object> rewardMap) throws ConfigParseException {
|
||||||
|
double chance = parseRewardField(rewardMap, "chance", Double.class);
|
||||||
|
boolean preventDrops = parseRewardField(rewardMap, "prevent-drops", Boolean.class, false);
|
||||||
|
|
||||||
|
List<Material> materials = parseRewardMaterials(rewardMap);
|
||||||
|
List<ItemStack> items = parseRewardItems(rewardMap);
|
||||||
|
List<String> commands = parseRewardCommands(rewardMap);
|
||||||
|
|
||||||
|
return new Reward(materials, chance, items, commands, preventDrops);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private <T> T parseRewardField(Map<String, Object> map, String key, Class<T> type)
|
||||||
|
throws ConfigParseException {
|
||||||
|
if (!map.containsKey(key)) {
|
||||||
|
throw new ConfigParseException("Missing required '" + key + "' field in reward");
|
||||||
|
}
|
||||||
|
Object value = map.get(key);
|
||||||
|
if (type == Double.class) {
|
||||||
|
return (T) parseDoubleValue(key, value);
|
||||||
|
} else if (type == Boolean.class) {
|
||||||
|
if (!(value instanceof Boolean)) {
|
||||||
|
throw new ConfigParseException(
|
||||||
|
"Invalid '" + key + "' value: expected boolean, got " +
|
||||||
|
(value != null ? value.getClass().getSimpleName() : "null")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return (T) value;
|
||||||
|
}
|
||||||
|
throw new ConfigParseException("Unsupported type: " + type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private <T> T parseRewardField(Map<String, Object> map, String key, Class<T> type, T defaultValue) {
|
||||||
|
if (!map.containsKey(key)) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
Object value = map.get(key);
|
||||||
|
if (type.isInstance(value)) {
|
||||||
|
return (T) value;
|
||||||
|
}
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Double parseDoubleValue(String key, Object value) throws ConfigParseException {
|
||||||
|
try {
|
||||||
|
if (value instanceof Number) {
|
||||||
|
return ((Number) value).doubleValue();
|
||||||
|
} else if (value instanceof String) {
|
||||||
|
return Double.parseDouble((String) value);
|
||||||
|
} else {
|
||||||
|
throw new ConfigParseException(
|
||||||
|
"Invalid '" + key + "' type: expected number, got " +
|
||||||
|
(value != null ? value.getClass().getSimpleName() : "null")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throw new ConfigParseException("Invalid '" + key + "' value: " + value, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Material> parseRewardMaterials(Map<String, Object> rewardMap)
|
||||||
|
throws ConfigParseException {
|
||||||
|
if (!rewardMap.containsKey("blocks")) {
|
||||||
|
throw new ConfigParseException("Missing required 'blocks' field in reward");
|
||||||
|
}
|
||||||
|
Object blocksObj = rewardMap.get("blocks");
|
||||||
|
if (!(blocksObj instanceof List)) {
|
||||||
|
throw new ConfigParseException(
|
||||||
|
"Invalid 'blocks' type: expected list, got " +
|
||||||
|
(blocksObj != null ? blocksObj.getClass().getSimpleName() : "null")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
List<String> blocksList = (List<String>) blocksObj;
|
||||||
|
List<Material> materials = new ArrayList<>();
|
||||||
|
for (String blockName : blocksList) {
|
||||||
|
if (blockName == null || blockName.trim().isEmpty()) {
|
||||||
|
throw new ConfigParseException("Block name cannot be null or empty");
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Material material = Material.valueOf(blockName.toUpperCase());
|
||||||
|
materials.add(material);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
throw new ConfigParseException(
|
||||||
|
"Unknown material in reward blocks: '" + blockName + "'",
|
||||||
|
e
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return materials;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<ItemStack> parseRewardItems(Map<String, Object> rewardMap)
|
||||||
|
throws ConfigParseException {
|
||||||
|
List<ItemStack> items = new ArrayList<>();
|
||||||
|
if (!rewardMap.containsKey("items")) {
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
Object itemsObj = rewardMap.get("items");
|
||||||
|
if (!(itemsObj instanceof List)) {
|
||||||
|
throw new ConfigParseException(
|
||||||
|
"Invalid 'items' type: expected list, got " +
|
||||||
|
(itemsObj != null ? itemsObj.getClass().getSimpleName() : "null")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
List<?> itemsList = (List<?>) itemsObj;
|
||||||
|
for (int i = 0; i < itemsList.size(); i++) {
|
||||||
|
Object itemObj = itemsList.get(i);
|
||||||
|
if (!(itemObj instanceof Map)) {
|
||||||
|
throw new ConfigParseException(
|
||||||
|
"Invalid item at index " + i + ": expected map, got " +
|
||||||
|
(itemObj != null ? itemObj.getClass().getSimpleName() : "null")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Map<String, Object> itemMap = (Map<String, Object>) itemObj;
|
||||||
|
ItemStack item = itemParser.parseItem(itemMap, i);
|
||||||
|
items.add(item);
|
||||||
|
}
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> parseRewardCommands(Map<String, Object> rewardMap)
|
||||||
|
throws ConfigParseException {
|
||||||
|
List<String> commands = new ArrayList<>();
|
||||||
|
if (!rewardMap.containsKey("commands")) {
|
||||||
|
return commands;
|
||||||
|
}
|
||||||
|
Object commandsObj = rewardMap.get("commands");
|
||||||
|
if (!(commandsObj instanceof List)) {
|
||||||
|
throw new ConfigParseException(
|
||||||
|
"Invalid 'commands' type: expected list, got " +
|
||||||
|
(commandsObj != null ? commandsObj.getClass().getSimpleName() : "null")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
List<String> commandsList = (List<String>) commandsObj;
|
||||||
|
for (String command : commandsList) {
|
||||||
|
if (command == null || command.trim().isEmpty()) {
|
||||||
|
throw new ConfigParseException("Command cannot be null or empty");
|
||||||
|
}
|
||||||
|
commands.add(command);
|
||||||
|
}
|
||||||
|
return commands;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue