From 9727f02051df1b5153f771aea5a004c030f52e53 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 5 Mar 2022 10:31:40 +0100 Subject: [PATCH] New register stuff --- .../java/net/Indyuce/mmocore/MMOCore.java | 9 +-- .../mmocore/manager/SkillTreeManager.java | 21 ++++++ .../mmocore/manager/WaypointManager.java | 75 +++++++++++-------- .../manager/registry/MMOCoreRegister.java | 30 ++++++++ .../manager/registry/RegisterObject.java | 9 +++ .../Indyuce/mmocore/player/Unlockable.java | 9 ++- .../net/Indyuce/mmocore/tree/SkillTree.java | 10 ++- .../Indyuce/mmocore/tree/SkillTreeNode.java | 30 +++++++- 8 files changed, 150 insertions(+), 43 deletions(-) create mode 100644 src/main/java/net/Indyuce/mmocore/manager/SkillTreeManager.java create mode 100644 src/main/java/net/Indyuce/mmocore/manager/registry/MMOCoreRegister.java create mode 100644 src/main/java/net/Indyuce/mmocore/manager/registry/RegisterObject.java diff --git a/src/main/java/net/Indyuce/mmocore/MMOCore.java b/src/main/java/net/Indyuce/mmocore/MMOCore.java index ae84ddd9..95e70504 100644 --- a/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -45,9 +45,6 @@ import net.Indyuce.mmocore.party.PartyModule; import net.Indyuce.mmocore.party.PartyModuleType; import net.Indyuce.mmocore.party.provided.MMOCorePartyModule; import net.Indyuce.mmocore.skill.cast.SkillCastingMode; -import net.Indyuce.mmocore.skill.list.Ambers; -import net.Indyuce.mmocore.skill.list.Neptune_Gift; -import net.Indyuce.mmocore.skill.list.Sneaky_Picky; import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -65,7 +62,7 @@ public class MMOCore extends LuminePlugin { public static MMOCore plugin; public ConfigManager configManager; - public WaypointManager waypointManager; + public final WaypointManager waypointManager = new WaypointManager(); public SoundManager soundManager; public RequestManager requestManager; public ConfigItemManager configItems; @@ -82,6 +79,8 @@ public class MMOCore extends LuminePlugin { public final LootChestManager lootChests = new LootChestManager(); public final MMOLoadManager loadManager = new MMOLoadManager(); public final RestrictionManager restrictionManager = new RestrictionManager(); + @Deprecated + public final SkillTreeManager skillTreeManager = new SkillTreeManager(); public VaultEconomy economy; public RegionHandler regionHandler = new DefaultRegionHandler(); @@ -408,8 +407,8 @@ public class MMOCore extends LuminePlugin { questManager.initialize(clearBefore); lootChests.initialize(clearBefore); restrictionManager.initialize(clearBefore); + waypointManager.initialize(clearBefore); - waypointManager = new WaypointManager(new ConfigFile("waypoints").getConfig()); requestManager = new RequestManager(); soundManager = new SoundManager(new ConfigFile("sounds").getConfig()); configItems = new ConfigItemManager(new ConfigFile("items").getConfig()); diff --git a/src/main/java/net/Indyuce/mmocore/manager/SkillTreeManager.java b/src/main/java/net/Indyuce/mmocore/manager/SkillTreeManager.java new file mode 100644 index 00000000..29a5b7bd --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/manager/SkillTreeManager.java @@ -0,0 +1,21 @@ +package net.Indyuce.mmocore.manager; + +import net.Indyuce.mmocore.manager.registry.MMOCoreRegister; +import net.Indyuce.mmocore.tree.SkillTree; + +@Deprecated +public class SkillTreeManager extends MMOCoreRegister { + + @Override + public String getRegisteredObjectName() { + return "skill tree"; + } + + @Override + public void initialize(boolean clearBefore) { + if (clearBefore) + registered.clear(); + + // TODO + } +} diff --git a/src/main/java/net/Indyuce/mmocore/manager/WaypointManager.java b/src/main/java/net/Indyuce/mmocore/manager/WaypointManager.java index 244a68e3..9ff105f0 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/WaypointManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/WaypointManager.java @@ -1,48 +1,59 @@ package net.Indyuce.mmocore.manager; +import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.ConfigFile; +import net.Indyuce.mmocore.waypoint.Waypoint; +import org.apache.commons.lang.Validate; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.Nullable; + import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Objects; import java.util.logging.Level; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.Player; +public class WaypointManager implements MMOCoreManager { + private final Map waypoints = new LinkedHashMap<>(); -import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.waypoint.Waypoint; + public Collection getAll() { + return waypoints.values(); + } -public class WaypointManager { - private final Map waypoints = new LinkedHashMap<>(); + public boolean has(String id) { + return waypoints.containsKey(id); + } - public WaypointManager(FileConfiguration config) { - for (String key : config.getKeys(false)) - try { - register(new Waypoint(config.getConfigurationSection(key))); - } catch (IllegalArgumentException exception) { - MMOCore.log(Level.WARNING, "Could not load waypoint '" + key + "': " + exception.getMessage()); - } - } + public Waypoint get(String id) { + return waypoints.get(id); + } - public Collection getAll() { - return waypoints.values(); - } + public void register(Waypoint waypoint) { + Validate.isTrue(!waypoints.containsKey(Objects.requireNonNull(waypoint, "Waypoint cannot be null").getId()), "There is already a waypoint with ID '" + waypoint.getId() + "'"); - public boolean has(String id) { - return waypoints.containsKey(id); - } + waypoints.put(waypoint.getId(), waypoint); + } - public Waypoint get(String id) { - return waypoints.get(id); - } + @Nullable + public Waypoint getCurrentWaypoint(Player player) { + for (Waypoint waypoint : getAll()) + if (waypoint.isOnWaypoint(player)) + return waypoint; + return null; + } - public void register(Waypoint waypoint) { - waypoints.put(waypoint.getId(), waypoint); - } + @Override + public void initialize(boolean clearBefore) { + if (clearBefore) + waypoints.clear(); - public Waypoint getCurrentWaypoint(Player player) { - for (Waypoint waypoint : getAll()) - if (waypoint.isOnWaypoint(player)) - return waypoint; - return null; - } + FileConfiguration config = new ConfigFile("waypoints").getConfig(); + for (String key : config.getKeys(false)) + try { + register(new Waypoint(config.getConfigurationSection(key))); + } catch (RuntimeException exception) { + MMOCore.log(Level.WARNING, "Could not load waypoint '" + key + "': " + exception.getMessage()); + } + } } diff --git a/src/main/java/net/Indyuce/mmocore/manager/registry/MMOCoreRegister.java b/src/main/java/net/Indyuce/mmocore/manager/registry/MMOCoreRegister.java new file mode 100644 index 00000000..5a33ce8c --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/manager/registry/MMOCoreRegister.java @@ -0,0 +1,30 @@ +package net.Indyuce.mmocore.manager.registry; + +import net.Indyuce.mmocore.manager.MMOCoreManager; +import org.apache.commons.lang.Validate; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public abstract class MMOCoreRegister implements MMOCoreManager { + protected final Map registered = new HashMap<>(); + + public void register(T t) { + Validate.notNull(t, getRegisteredObjectName() + " cannot be null"); + Validate.isTrue(!registered.containsKey(t.getId()), "There is already a " + getRegisteredObjectName() + " registered with ID '" + t.getId() + "'"); + + registered.put(t.getId(), t); + } + + public T get(String id) { + return Objects.requireNonNull(registered.get(id), "Could not find " + getRegisteredObjectName() + " with ID '" + id + "'"); + } + + public Collection getAll() { + return registered.values(); + } + + public abstract String getRegisteredObjectName(); +} diff --git a/src/main/java/net/Indyuce/mmocore/manager/registry/RegisterObject.java b/src/main/java/net/Indyuce/mmocore/manager/registry/RegisterObject.java new file mode 100644 index 00000000..57b5b7b7 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/manager/registry/RegisterObject.java @@ -0,0 +1,9 @@ +package net.Indyuce.mmocore.manager.registry; + +public interface RegisterObject { + + /** + * Identifier used to register an object + */ + public String getId(); +} diff --git a/src/main/java/net/Indyuce/mmocore/player/Unlockable.java b/src/main/java/net/Indyuce/mmocore/player/Unlockable.java index 8cf75544..6940d1a1 100644 --- a/src/main/java/net/Indyuce/mmocore/player/Unlockable.java +++ b/src/main/java/net/Indyuce/mmocore/player/Unlockable.java @@ -3,7 +3,12 @@ package net.Indyuce.mmocore.player; import net.Indyuce.mmocore.api.player.PlayerData; /** - * Some item that can be unlocked + * Some item that can be unlocked. ALl unlockable are saved in the same list in + * the player data. This useful list can be used for: + * - waypoints + * - skill tree nodes + * - skills using skill books? TODO + * - external plugins that implement other unlockable items * * @see {@link PlayerData#unlock(Unlockable)} and {@link PlayerData#hasUnlocked(Unlockable)} */ @@ -11,7 +16,7 @@ public interface Unlockable { /** * Format being used is the minecraft's default - * namespaced key format, e.g skill_tree:strength_1_5 + * namespaced key format, e.g "skill_tree:strength_1_5" */ String getUnlockNamespacedKey(); } diff --git a/src/main/java/net/Indyuce/mmocore/tree/SkillTree.java b/src/main/java/net/Indyuce/mmocore/tree/SkillTree.java index d372be11..15282002 100644 --- a/src/main/java/net/Indyuce/mmocore/tree/SkillTree.java +++ b/src/main/java/net/Indyuce/mmocore/tree/SkillTree.java @@ -1,8 +1,10 @@ package net.Indyuce.mmocore.tree; import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.manager.registry.RegisterObject; import org.apache.commons.lang.Validate; import org.bukkit.configuration.ConfigurationSection; +import org.jetbrains.annotations.NotNull; import java.util.Collection; import java.util.HashMap; @@ -25,7 +27,7 @@ import java.util.logging.Level; * @author jules * @see {@link SkillTreeNode} */ -public class SkillTree { +public class SkillTree implements RegisterObject { private final String id, name; private final Map nodes = new HashMap<>(); @@ -44,6 +46,7 @@ public class SkillTree { } } + @Override public String getId() { return id; } @@ -56,6 +59,11 @@ public class SkillTree { return nodes.values(); } + @NotNull + public SkillTreeNode getNode(IntegerCoordinates coords) { + return Objects.requireNonNull(nodes.get(coords), "Could not find node in tree '" + id + "' with coordinates '" + coords.toString() + "'"); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/net/Indyuce/mmocore/tree/SkillTreeNode.java b/src/main/java/net/Indyuce/mmocore/tree/SkillTreeNode.java index 1d8025e4..61b396ae 100644 --- a/src/main/java/net/Indyuce/mmocore/tree/SkillTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/tree/SkillTreeNode.java @@ -3,9 +3,11 @@ package net.Indyuce.mmocore.tree; import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.player.modifier.PlayerModifier; import io.lumine.mythic.lib.util.configobject.ConfigSectionObject; +import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.player.Unlockable; import org.apache.commons.lang.Validate; import org.bukkit.configuration.ConfigurationSection; +import org.jetbrains.annotations.NotNull; import java.util.HashSet; import java.util.List; @@ -50,6 +52,11 @@ public class SkillTreeNode implements Unlockable { return lore; } + @Override + public String getUnlockNamespacedKey() { + return "skill_tree:" + tree.getId() + "_" + coordinates.getX() + "_" + coordinates.getY(); + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -63,8 +70,25 @@ public class SkillTreeNode implements Unlockable { return Objects.hash(tree, coordinates); } - @Override - public String getUnlockNamespacedKey() { - return "skill_tree:" + tree.getId() + "_" + coordinates.getX() + "_" + coordinates.getY(); + /** + * @param namespacedKey Something like "skill_tree:tree_name_1_5" + * @return The corresponding skill tree node + * @throws RuntimeException If the string cannot be parsed, if the specified + * skill tree does not exist or if the skill tree has no such node + */ + @NotNull + public static SkillTreeNode getFromNamespacedKey(String namespacedKey) { + String[] split = namespacedKey.substring(11).split("_"); + int n = split.length; + + IntegerCoordinates coords = new IntegerCoordinates(Integer.valueOf(split[n - 2]), Integer.valueOf(split[n - 1])); + StringBuilder treeIdBuilder = new StringBuilder(); + for (int i = 0; i < n - 2; i++) { + if (i > 0) + treeIdBuilder.append("_"); + treeIdBuilder.append(split[i]); + } + String treeId = treeIdBuilder.toString(); + return MMOCore.plugin.skillTreeManager.get(treeId).getNode(coords); } }