diff --git a/src/main/java/net/Indyuce/mmocore/api/load/PostLoadObject.java b/src/main/java/net/Indyuce/mmocore/api/load/PostLoadObject.java new file mode 100644 index 00000000..11545b0d --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/api/load/PostLoadObject.java @@ -0,0 +1,27 @@ +package net.Indyuce.mmocore.api.load; + +import org.bukkit.configuration.file.FileConfiguration; + +public abstract class PostLoadObject { + private FileConfiguration config; + + /* + * objects which must load some data afterwards, like quests which must load + * their parent quests after all quests were initialized or classes which + * must load their subclasses + */ + public PostLoadObject(FileConfiguration config) { + this.config = config; + } + + public void postLoad() { + whenPostLoaded(config); + + /* + * clean config object for garbage collection + */ + config = null; + } + + protected abstract void whenPostLoaded(FileConfiguration config); +} \ No newline at end of file diff --git a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java index 982e883c..9f4bba00 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java @@ -32,8 +32,8 @@ import net.Indyuce.mmocore.api.event.PlayerRegenResourceEvent; import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute; import net.Indyuce.mmocore.api.player.attribute.PlayerAttributes; import net.Indyuce.mmocore.api.player.profess.PlayerClass; -import net.Indyuce.mmocore.api.player.profess.PlayerClass.Subclass; import net.Indyuce.mmocore.api.player.profess.SavedClassInformation; +import net.Indyuce.mmocore.api.player.profess.Subclass; import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource; import net.Indyuce.mmocore.api.player.social.FriendRequest; import net.Indyuce.mmocore.api.player.social.Party; diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/ClassOption.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/ClassOption.java new file mode 100644 index 00000000..407879b8 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/ClassOption.java @@ -0,0 +1,40 @@ +package net.Indyuce.mmocore.api.player.profess; + +public enum ClassOption { + + /* + * is class by default + */ + DEFAULT, + + /* + * displays in the /class GUI + */ + DISPLAY(true), + + /* + * only regen resource when out of combat + */ + OFF_COMBAT_HEALTH_REGEN, + OFF_COMBAT_MANA_REGEN, + OFF_COMBAT_STAMINA_REGEN, + OFF_COMBAT_STELLIUM_REGEN; + + private final boolean def; + + private ClassOption() { + this(false); + } + + private ClassOption(boolean def) { + this.def = def; + } + + public boolean getDefault() { + return def; + } + + public String getPath() { + return name().toLowerCase().replace("_", "-"); + } +} \ No newline at end of file diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java index 32a0a739..589e863b 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java @@ -26,6 +26,7 @@ import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.AltChar; import net.Indyuce.mmocore.api.experience.source.type.ExperienceSource; import net.Indyuce.mmocore.api.load.MMOLoadException; +import net.Indyuce.mmocore.api.load.PostLoadObject; import net.Indyuce.mmocore.api.player.ExpCurve; import net.Indyuce.mmocore.api.player.profess.event.EventTrigger; import net.Indyuce.mmocore.api.player.profess.resource.ManaDisplayOptions; @@ -37,12 +38,11 @@ import net.Indyuce.mmocore.api.skill.Skill.SkillInfo; import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.api.util.math.formula.LinearValue; import net.Indyuce.mmocore.api.util.math.particle.CastingParticle; -import net.Indyuce.mmocore.manager.ClassManager; import net.mmogroup.mmolib.api.MMOLineConfig; import net.mmogroup.mmolib.version.VersionMaterial; -public class PlayerClass { - private final String name, id, fileName; +public class PlayerClass extends PostLoadObject { + private final String name, id; private final List description = new ArrayList<>(), attrDescription = new ArrayList<>(); private final ItemStack icon; private final Map options = new HashMap<>(); @@ -57,21 +57,17 @@ public class PlayerClass { private final Map resourceHandlers = new HashMap<>(); private final Map eventTriggers = new HashMap<>(); - private CastingParticle castParticle = new CastingParticle(Particle.SPELL_INSTANT); - - /* - * easy load - */ - private FileConfiguration loaded; + private final CastingParticle castParticle; public PlayerClass(String id, FileConfiguration config) { - this.id = (fileName = id).toUpperCase().replace("-", "_").replace(" ", "_"); - this.loaded = config; + super(config); + + this.id = id.toUpperCase().replace("-", "_").replace(" ", "_"); name = ChatColor.translateAlternateColorCodes('&', config.getString("display.name")); icon = MMOCoreUtils.readIcon(config.getString("display.item")); - if (config.contains("display.texture")) { + if (config.contains("display.texture")) if (icon.getType() == VersionMaterial.PLAYER_HEAD.toMaterial()) { ItemMeta meta = icon.getItemMeta(); try { @@ -84,10 +80,8 @@ public class PlayerClass { MMOCore.log(Level.WARNING, "[PlayerClasses:" + id + "] Could not apply playerhead texture: " + exception.getMessage()); } icon.setItemMeta(meta); - } else { + } else MMOCore.log(Level.WARNING, "[PlayerClasses:" + id + "] Could not add player head texture. The item is not a playerhead!"); - } - } for (String string : config.getStringList("display.lore")) description.add(ChatColor.GRAY + ChatColor.translateAlternateColorCodes('&', string)); @@ -95,7 +89,7 @@ public class PlayerClass { attrDescription.add(ChatColor.GRAY + ChatColor.translateAlternateColorCodes('&', string)); manaDisplay = new ManaDisplayOptions(config.getConfigurationSection("mana")); maxLevel = config.getInt("max-level"); - displayOrder = config.getInt("display-order"); + displayOrder = config.getInt("display.order"); expCurve = config.contains("exp-curve") ? MMOCore.plugin.experience.getOrThrow(config.get("exp-curve").toString().toLowerCase().replace("_", "-").replace(" ", "-")) @@ -119,12 +113,8 @@ public class PlayerClass { MMOCore.log(Level.WARNING, "[PlayerClasses:" + id + "] Could not load skill info '" + key + "': " + exception.getMessage()); } - if (config.contains("cast-particle")) - try { - castParticle = new CastingParticle(config.getConfigurationSection("cast-particle")); - } catch (IllegalArgumentException exception) { - MMOCore.log(Level.WARNING, "[PlayerClasses:" + id + "] Could not read casting particle, using default: " + exception.getMessage()); - } + castParticle = config.contains("cast-particle") ? new CastingParticle(config.getConfigurationSection("cast-particle")) + : new CastingParticle(Particle.SPELL_INSTANT); if (config.contains("options")) for (String key : config.getConfigurationSection("options").getKeys(false)) @@ -151,7 +141,6 @@ public class PlayerClass { eventTriggers.put(format, new EventTrigger(format, config.getStringList("triggers." + key))); } catch (IllegalArgumentException exception) { MMOCore.log(Level.WARNING, "[PlayerClasses:" + id + "] " + exception.getMessage()); - continue; } } @@ -178,13 +167,15 @@ public class PlayerClass { * used to generate display class */ public PlayerClass(String id, String name, Material material) { + super(null); + this.id = id; this.name = name; - this.fileName = id; manaDisplay = new ManaDisplayOptions(ChatColor.BLUE, "Mana", AltChar.listSquare.charAt(0)); maxLevel = 0; displayOrder = 0; expCurve = ExpCurve.DEFAULT; + castParticle = new CastingParticle(Particle.SPELL_INSTANT); this.icon = new ItemStack(material); setOption(ClassOption.DISPLAY, false); @@ -194,11 +185,12 @@ public class PlayerClass { resourceHandlers.put(resource, new ResourceHandler(resource)); } - public void loadSubclasses(ClassManager manager) { - if (loaded.contains("subclasses")) - for (String key : loaded.getConfigurationSection("subclasses").getKeys(false)) - subclasses.add(new Subclass(manager.get(key.toUpperCase().replace("-", "_").replace(" ", "_")), loaded.getInt("subclasses." + key))); - loaded = null; + @Override + protected void whenPostLoaded(FileConfiguration config) { + if (config.contains("subclasses")) + for (String key : config.getConfigurationSection("subclasses").getKeys(false)) + subclasses.add(new Subclass(MMOCore.plugin.classManager.get(key.toUpperCase().replace("-", "_").replace(" ", "_")), + config.getInt("subclasses." + key))); } public String getId() { @@ -229,10 +221,6 @@ public class PlayerClass { return expCurve; } - public String getFileName() { - return fileName; - } - public ItemStack getIcon() { return icon.clone(); } @@ -305,61 +293,4 @@ public class PlayerClass { public boolean equals(Object obj) { return obj != null && obj instanceof PlayerClass && ((PlayerClass) obj).id.equals(id); } - - public class Subclass { - private PlayerClass profess; - private int level; - - public Subclass(PlayerClass profess, int level) { - this.profess = profess; - this.level = level; - } - - public PlayerClass getProfess() { - return profess; - } - - public int getLevel() { - return level; - } - } - - public enum ClassOption { - - /* - * is class by default - */ - DEFAULT, - - /* - * displays in the /class GUI - */ - DISPLAY(true), - - /* - * only regen resource when out of combat - */ - OFF_COMBAT_HEALTH_REGEN, - OFF_COMBAT_MANA_REGEN, - OFF_COMBAT_STAMINA_REGEN, - OFF_COMBAT_STELLIUM_REGEN; - - private final boolean def; - - private ClassOption() { - this(false); - } - - private ClassOption(boolean def) { - this.def = def; - } - - public boolean getDefault() { - return def; - } - - public String getPath() { - return name().toLowerCase().replace("_", "-"); - } - } } diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java index 25064e54..1c5cfcf8 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/SavedClassInformation.java @@ -12,7 +12,6 @@ import com.google.gson.JsonObject; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute; -import net.Indyuce.mmocore.api.player.profess.PlayerClass.ClassOption; import net.Indyuce.mmocore.api.skill.Skill; public class SavedClassInformation { diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/Subclass.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/Subclass.java new file mode 100644 index 00000000..5a088a88 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/Subclass.java @@ -0,0 +1,23 @@ +package net.Indyuce.mmocore.api.player.profess; + +import org.apache.commons.lang.Validate; + +public class Subclass { + private final PlayerClass profess; + private final int level; + + public Subclass(PlayerClass profess, int level) { + Validate.notNull(profess, "Subclass cannot be null"); + + this.profess = profess; + this.level = level; + } + + public PlayerClass getProfess() { + return profess; + } + + public int getLevel() { + return level; + } +} \ No newline at end of file diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/PlayerResource.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/PlayerResource.java index ef89a4d8..87ee24c9 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/PlayerResource.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/PlayerResource.java @@ -6,7 +6,7 @@ import java.util.function.Function; import org.bukkit.attribute.Attribute; import net.Indyuce.mmocore.api.player.PlayerData; -import net.Indyuce.mmocore.api.player.profess.PlayerClass.ClassOption; +import net.Indyuce.mmocore.api.player.profess.ClassOption; import net.Indyuce.mmocore.api.player.stats.StatType; public enum PlayerResource { diff --git a/src/main/java/net/Indyuce/mmocore/api/quest/Quest.java b/src/main/java/net/Indyuce/mmocore/api/quest/Quest.java index 538da1f3..f7a0d302 100644 --- a/src/main/java/net/Indyuce/mmocore/api/quest/Quest.java +++ b/src/main/java/net/Indyuce/mmocore/api/quest/Quest.java @@ -14,70 +14,50 @@ import org.bukkit.configuration.file.FileConfiguration; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.experience.Profession; import net.Indyuce.mmocore.api.load.MMOLoadException; +import net.Indyuce.mmocore.api.load.PostLoadObject; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.quest.objective.Objective; -import net.Indyuce.mmocore.manager.QuestManager; import net.mmogroup.mmolib.api.MMOLineConfig; -public class Quest { +public class Quest extends PostLoadObject { private final String id; - private String name; - private List parents = new ArrayList<>(); - private List objectives = new ArrayList<>(); - private List lore; + private final String name; + private final List parents = new ArrayList<>(); + private final List objectives = new ArrayList<>(); + private final List lore; - private int mainLevelRestriction; - private Map levelRestrictions = new HashMap<>(); + private final int mainLevelRestriction; + private final Map levelRestrictions = new HashMap<>(); // cooldown in millis - private long cooldown; - - /* - * cached to load other info to enable parent quests. - */ - private FileConfiguration loaded; + private final long cooldown; public Quest(String id, FileConfiguration config) { + super(config); + this.id = id.toLowerCase().replace("_", "-").replace(" ", "-"); - loaded = config; - } + cooldown = (long) (config.contains("delay") ? config.getDouble("delay") * 60 * 60 * 1000 : -1); + name = config.getString("name"); + lore = config.getStringList("lore"); - /* - * forced to request a Questmanager instance because the one in the main - * MMOCore class has not been initialized yet, so it can't be accessed using - * MMOCore.plugin.questManager - */ - public void load(QuestManager manager) { - cooldown = (long) (loaded.contains("delay") ? loaded.getDouble("delay") * 60 * 60 * 1000 : -1); + mainLevelRestriction = config.getInt("level-req.main"); - if (loaded.contains("parent")) - for (String parent : loaded.getStringList("parent")) - try { - parents.add(manager.get(parent)); - } catch (NullPointerException exception) { - MMOCore.plugin.getLogger().log(Level.WARNING, "Couldn't find quest ID '" + parent + "'"); - } - - name = loaded.getString("name"); - lore = loaded.getStringList("lore"); - - mainLevelRestriction = loaded.getInt("level-req.main"); - - if (loaded.contains("level-req")) - for (String key : loaded.getConfigurationSection("level-req").getKeys(false)) + if (config.contains("level-req")) + for (String key : config.getConfigurationSection("level-req").getKeys(false)) if (!key.equals("main")) try { - String id = key.toLowerCase().replace("_", "-"); - Validate.isTrue(MMOCore.plugin.professionManager.has(id)); - levelRestrictions.put(MMOCore.plugin.professionManager.get(id), loaded.getInt("level-req." + key)); + String id1 = key.toLowerCase().replace("_", "-"); + Validate.isTrue(MMOCore.plugin.professionManager.has(id1), "Could not find profession called '" + id1 + "'"); + levelRestrictions.put(MMOCore.plugin.professionManager.get(id1), config.getInt("level-req." + key)); } catch (IllegalArgumentException exception) { - MMOCore.plugin.getLogger().log(Level.WARNING, "[Quests:" + id + "] Couldn't find profession '" + key + "'"); + MMOCore.plugin.getLogger().log(Level.WARNING, + "Could not load level requirement '" + key + "' from quest '" + id + "': " + exception.getMessage()); } - for (String key : loaded.getConfigurationSection("objectives").getKeys(false)) + for (String key : config.getConfigurationSection("objectives").getKeys(false)) try { - ConfigurationSection section = loaded.getConfigurationSection("objectives." + key); + ConfigurationSection section = config.getConfigurationSection("objectives." + key); Validate.notNull(section, "Could not find config section"); String format = section.getString("type"); @@ -87,8 +67,17 @@ public class Quest { } catch (MMOLoadException exception) { exception.printConsole("Quests:" + id, "objective"); } + } - loaded = null; + @Override + protected void whenPostLoaded(FileConfiguration config) { + if (config.contains("parent")) + for (String parent : config.getStringList("parent")) + try { + parents.add(MMOCore.plugin.questManager.get(parent)); + } catch (NullPointerException exception) { + MMOCore.plugin.getLogger().log(Level.WARNING, "Couldn't find quest ID '" + parent + "'"); + } } public String getId() { diff --git a/src/main/java/net/Indyuce/mmocore/api/util/MMOCoreUtils.java b/src/main/java/net/Indyuce/mmocore/api/util/MMOCoreUtils.java index bfa549a5..2e323164 100644 --- a/src/main/java/net/Indyuce/mmocore/api/util/MMOCoreUtils.java +++ b/src/main/java/net/Indyuce/mmocore/api/util/MMOCoreUtils.java @@ -55,16 +55,12 @@ public class MMOCoreUtils { return material == VersionMaterial.PLAYER_HEAD.toMaterial() || material == VersionMaterial.PLAYER_WALL_HEAD.toMaterial(); } - public static ItemStack readIcon(String string) { - try { - Validate.notNull(string, "String cannot be null"); - String[] split = string.split("\\:"); - Material material = Material.valueOf(split[0].toUpperCase().replace("-", "_").replace(" ", "_")); - return split.length > 1 ? MMOLib.plugin.getVersion().getWrapper().textureItem(material, Integer.parseInt(split[1])) - : new ItemStack(material); - } catch (IllegalArgumentException exception) { - return new ItemStack(Material.BARRIER); - } + public static ItemStack readIcon(String string) throws IllegalArgumentException { + Validate.notNull(string, "String cannot be null"); + + String[] split = string.split("\\:"); + Material material = Material.valueOf(split[0].toUpperCase().replace("-", "_").replace(" ", "_")); + return split.length > 1 ? MMOLib.plugin.getVersion().getWrapper().textureItem(material, Integer.parseInt(split[1])) : new ItemStack(material); } public static int getWorth(ItemStack[] items) { diff --git a/src/main/java/net/Indyuce/mmocore/gui/ClassSelect.java b/src/main/java/net/Indyuce/mmocore/gui/ClassSelect.java index f2251203..3e5250e3 100644 --- a/src/main/java/net/Indyuce/mmocore/gui/ClassSelect.java +++ b/src/main/java/net/Indyuce/mmocore/gui/ClassSelect.java @@ -17,8 +17,8 @@ import org.bukkit.inventory.meta.ItemMeta; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.api.player.profess.ClassOption; import net.Indyuce.mmocore.api.player.profess.PlayerClass; -import net.Indyuce.mmocore.api.player.profess.PlayerClass.ClassOption; import net.Indyuce.mmocore.gui.api.EditableInventory; import net.Indyuce.mmocore.gui.api.GeneratedInventory; import net.Indyuce.mmocore.gui.api.item.InventoryItem; diff --git a/src/main/java/net/Indyuce/mmocore/gui/SubclassSelect.java b/src/main/java/net/Indyuce/mmocore/gui/SubclassSelect.java index a0c8adf4..5b85da0b 100644 --- a/src/main/java/net/Indyuce/mmocore/gui/SubclassSelect.java +++ b/src/main/java/net/Indyuce/mmocore/gui/SubclassSelect.java @@ -15,7 +15,7 @@ import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.profess.PlayerClass; -import net.Indyuce.mmocore.api.player.profess.PlayerClass.Subclass; +import net.Indyuce.mmocore.api.player.profess.Subclass; import net.Indyuce.mmocore.gui.api.EditableInventory; import net.Indyuce.mmocore.gui.api.GeneratedInventory; import net.Indyuce.mmocore.gui.api.item.InventoryItem; @@ -61,6 +61,8 @@ public class SubclassSelect extends EditableInventory { return null; PlayerClass profess = generated.subclasses.get(n).getProfess(); + + ItemStack item = profess.getIcon(); ItemMeta meta = item.getItemMeta(); meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name).replace("{name}", profess.getName())); @@ -97,7 +99,8 @@ public class SubclassSelect extends EditableInventory { public SubclassSelectionInventory(PlayerData playerData, EditableInventory editable) { super(playerData, editable); - subclasses = playerData.getProfess().getSubclasses().stream().filter(sub -> playerData.getLevel() >= sub.getLevel()).collect(Collectors.toList()); + subclasses = playerData.getProfess().getSubclasses().stream().filter(sub -> playerData.getLevel() >= sub.getLevel()) + .collect(Collectors.toList()); } @Override diff --git a/src/main/java/net/Indyuce/mmocore/manager/ClassManager.java b/src/main/java/net/Indyuce/mmocore/manager/ClassManager.java index a8f23dc6..fb0e274e 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/ClassManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/ClassManager.java @@ -15,8 +15,8 @@ import org.bukkit.event.HandlerList; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.api.player.profess.ClassOption; import net.Indyuce.mmocore.api.player.profess.PlayerClass; -import net.Indyuce.mmocore.api.player.profess.PlayerClass.ClassOption; import net.Indyuce.mmocore.api.player.profess.event.EventTriggerHandler; import net.Indyuce.mmocore.api.player.profess.event.trigger.AttackEventTrigger; import net.Indyuce.mmocore.api.player.profess.event.trigger.BlockBrokenTrigger; @@ -82,11 +82,18 @@ public class ClassManager extends MMOManager { String id = file.getName().substring(0, file.getName().length() - 4); register(new PlayerClass(id, YamlConfiguration.loadConfiguration(file))); } catch (IllegalArgumentException exception) { - MMOCore.plugin.getLogger().log(Level.WARNING, "Could not load class " + file.getName() + ": " + exception.getMessage()); + MMOCore.plugin.getLogger().log(Level.WARNING, "Could not load class '" + file.getName() + "': " + exception.getMessage()); } - map.values().forEach(profess -> profess.loadSubclasses(this)); - defaultClass = map.values().stream().filter(profess -> profess.hasOption(ClassOption.DEFAULT)).findFirst().orElse(new PlayerClass("HUMAN", "Human", Material.LEATHER_BOOTS)); + for (PlayerClass profess : map.values()) + try { + profess.postLoad(); + } catch (IllegalArgumentException exception) { + MMOCore.plugin.getLogger().log(Level.WARNING, "Could not post-load class '" + profess.getId() + "': " + exception.getMessage()); + } + + defaultClass = map.values().stream().filter(profess -> profess.hasOption(ClassOption.DEFAULT)).findFirst() + .orElse(new PlayerClass("HUMAN", "Human", Material.LEATHER_BOOTS)); /* * register event triggers diff --git a/src/main/java/net/Indyuce/mmocore/manager/CustomBlockManager.java b/src/main/java/net/Indyuce/mmocore/manager/CustomBlockManager.java index 0588232b..e2719cea 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/CustomBlockManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/CustomBlockManager.java @@ -5,6 +5,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.logging.Level; @@ -44,15 +45,16 @@ public class CustomBlockManager extends MMOManager { private final List customMineConditions = new ArrayList<>(); /* - * list of functions which let + * list of functions which let MMOCore recognize what block a player is + * currently breaking */ - private final List> blockTypes = new ArrayList<>(); + private final List>> blockTypes = new ArrayList<>(); public CustomBlockManager() { - registerBlockType(block -> MMOCoreUtils.isPlayerHead(block.getType()) ? new SkullBlockType(block) : null); + registerBlockType(block -> MMOCoreUtils.isPlayerHead(block.getType()) ? Optional.of(new SkullBlockType(block)) : Optional.empty()); } - public void registerBlockType(Function function) { + public void registerBlockType(Function> function) { blockTypes.add(function); } @@ -65,10 +67,10 @@ public class CustomBlockManager extends MMOManager { } public BlockType findBlockType(Block block) { - for (Function blockType : blockTypes) { - BlockType type = blockType.apply(block); - if (type != null) - return type; + for (Function> blockType : blockTypes) { + Optional type = blockType.apply(block); + if (type.isPresent()) + return type.get(); } return new VanillaBlockType(block); diff --git a/src/main/java/net/Indyuce/mmocore/manager/QuestManager.java b/src/main/java/net/Indyuce/mmocore/manager/QuestManager.java index d9bca7ba..a5674eef 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/QuestManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/QuestManager.java @@ -6,6 +6,7 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Level; +import org.apache.commons.lang.Validate; import org.bukkit.configuration.file.YamlConfiguration; import net.Indyuce.mmocore.MMOCore; @@ -34,6 +35,11 @@ public class QuestManager extends MMOManager { return quests.get(id); } + public Quest getOrThrow(String id) { + Validate.isTrue(quests.containsKey(id), "Could not find quest with ID '" + id + "'"); + return get(id); + } + public Collection getAll() { return quests.values(); } @@ -41,7 +47,12 @@ public class QuestManager extends MMOManager { @Override public void reload() { load(new File(MMOCore.plugin.getDataFolder() + "/quests")); - quests.values().forEach(quest -> quest.load(this)); + for (Quest quest : quests.values()) + try { + quest.postLoad(); + } catch (IllegalArgumentException exception) { + MMOCore.plugin.getLogger().log(Level.WARNING, "Could not post-load quest '" + quest.getId() + "' :" + exception.getMessage()); + } } @Override