From 8317fc4ca1d0fea12fd9b2e1548c59fb22374cad Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sun, 27 Feb 2022 11:24:08 +0100 Subject: [PATCH 01/36] command api refactor --- .../command/MMOCoreCommandTreeRoot.java | 4 +- .../command/rpg/CoinsCommandTreeNode.java | 57 ++++++++++--------- .../command/rpg/NoteCommandTreeNode.java | 8 +-- .../command/rpg/ReloadCommandTreeNode.java | 2 +- .../rpg/admin/AdminCommandTreeNode.java | 2 +- .../rpg/admin/AttributeCommandTreeNode.java | 4 +- .../rpg/admin/ClassCommandTreeNode.java | 4 +- .../rpg/admin/ExperienceCommandTreeNode.java | 4 +- .../rpg/admin/ForceClassCommandTreeNode.java | 4 +- .../admin/HideActionBarCommandTreeNode.java | 4 +- .../rpg/admin/InfoCommandTreeNode.java | 4 +- .../rpg/admin/LevelCommandTreeNode.java | 4 +- .../rpg/admin/NoCooldownCommandTreeNode.java | 4 +- .../rpg/admin/PointsCommandTreeNode.java | 4 +- .../rpg/admin/ResetCommandTreeNode.java | 4 +- .../rpg/admin/ResourceCommandTreeNode.java | 4 +- .../rpg/booster/BoosterCommandTreeNode.java | 2 +- .../rpg/booster/CreateCommandTreeNode.java | 4 +- .../rpg/booster/ListCommandTreeNode.java | 2 +- .../rpg/booster/RemoveCommandTreeNode.java | 4 +- .../rpg/debug/DebugCommandTreeNode.java | 2 +- .../debug/StatModifiersCommandTreeNode.java | 4 +- .../rpg/debug/StatValueCommandTreeNode.java | 4 +- .../rpg/quest/CancelCommandTreeNode.java | 4 +- .../rpg/quest/FinishCommandTreeNode.java | 4 +- .../rpg/quest/QuestCommandTreeNode.java | 2 +- .../rpg/quest/StartCommandTreeNode.java | 4 +- .../rpg/waypoint/OpenCommandTreeNode.java | 4 +- .../rpg/waypoint/TeleportCommandTreeNode.java | 6 +- .../rpg/waypoint/UnlockCommandTreeNode.java | 6 +- .../waypoint/WaypointsCommandTreeNode.java | 2 +- 31 files changed, 87 insertions(+), 84 deletions(-) diff --git a/src/main/java/net/Indyuce/mmocore/command/MMOCoreCommandTreeRoot.java b/src/main/java/net/Indyuce/mmocore/command/MMOCoreCommandTreeRoot.java index 70ed75bc..dcefd387 100644 --- a/src/main/java/net/Indyuce/mmocore/command/MMOCoreCommandTreeRoot.java +++ b/src/main/java/net/Indyuce/mmocore/command/MMOCoreCommandTreeRoot.java @@ -1,7 +1,7 @@ package net.Indyuce.mmocore.command; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeRoot; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeRoot; +import io.lumine.mythic.lib.command.api.Parameter; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.command.rpg.CoinsCommandTreeNode; import net.Indyuce.mmocore.command.rpg.NoteCommandTreeNode; diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/CoinsCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/CoinsCommandTreeNode.java index fc8f2636..0e702165 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/CoinsCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/CoinsCommandTreeNode.java @@ -1,44 +1,47 @@ package net.Indyuce.mmocore.command.rpg; import io.lumine.mythic.lib.api.util.SmartGive; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; -import net.Indyuce.mmocore.api.util.item.CurrencyItem; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; +import net.Indyuce.mmocore.api.util.item.CurrencyItemBuilder; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; public class CoinsCommandTreeNode extends CommandTreeNode { - public CoinsCommandTreeNode(CommandTreeNode parent) { - super(parent, "coins"); + public CoinsCommandTreeNode(CommandTreeNode parent) { + super(parent, "coins"); - addParameter(Parameter.PLAYER); - addParameter(Parameter.AMOUNT); - } + addParameter(Parameter.PLAYER); + addParameter(Parameter.AMOUNT); + } - @Override - public CommandResult execute(CommandSender sender, String[] args) { - if (args.length < 3) - return CommandResult.THROW_USAGE; + @Override + public CommandResult execute(CommandSender sender, String[] args) { + if (args.length < 3) + return CommandResult.THROW_USAGE; - Player player = Bukkit.getPlayer(args[1]); - if (player == null) { - sender.sendMessage(ChatColor.RED + "Could not find the player called " + args[1] + "."); - return CommandResult.FAILURE; - } + Player player = Bukkit.getPlayer(args[1]); + if (player == null) { + sender.sendMessage(ChatColor.RED + "Could not find the player called " + args[1] + "."); + return CommandResult.FAILURE; + } - int amount; - try { - amount = Integer.parseInt(args[2]); - } catch (Exception e) { - sender.sendMessage(ChatColor.RED + args[2] + " is not a valid number."); - return CommandResult.FAILURE; - } + int amount; + try { + amount = Integer.parseInt(args[2]); + } catch (Exception e) { + sender.sendMessage(ChatColor.RED + args[2] + " is not a valid number."); + return CommandResult.FAILURE; + } - new SmartGive(player).give(new CurrencyItem("GOLD_COIN", 1, amount).build()); - return CommandResult.SUCCESS; - } + ItemStack coins = new CurrencyItemBuilder("GOLD_COIN", 1).build(); + coins.setAmount(amount); + new SmartGive(player).give(coins); + return CommandResult.SUCCESS; + } } diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/NoteCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/NoteCommandTreeNode.java index 19b85802..74c88e3f 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/NoteCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/NoteCommandTreeNode.java @@ -7,10 +7,10 @@ import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import net.Indyuce.mmocore.api.util.item.CurrencyItem; +import net.Indyuce.mmocore.api.util.item.CurrencyItemBuilder; import io.lumine.mythic.lib.api.util.SmartGive; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; public class NoteCommandTreeNode extends CommandTreeNode { public NoteCommandTreeNode(CommandTreeNode parent) { @@ -40,7 +40,7 @@ public class NoteCommandTreeNode extends CommandTreeNode { return CommandResult.FAILURE; } - new SmartGive(player).give(new CurrencyItem("NOTE", worth).build()); + new SmartGive(player).give(new CurrencyItemBuilder("NOTE", worth).build()); return CommandResult.SUCCESS; } } diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/ReloadCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/ReloadCommandTreeNode.java index f964d556..ba033ff7 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/ReloadCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/ReloadCommandTreeNode.java @@ -5,7 +5,7 @@ import org.bukkit.command.CommandSender; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.CommandTreeNode; public class ReloadCommandTreeNode extends CommandTreeNode { public ReloadCommandTreeNode(CommandTreeNode parent) { diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/AdminCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/AdminCommandTreeNode.java index 5db6d11c..6065fce1 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/AdminCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/AdminCommandTreeNode.java @@ -1,6 +1,6 @@ package net.Indyuce.mmocore.command.rpg.admin; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.CommandTreeNode; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource; import org.bukkit.command.CommandSender; diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/AttributeCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/AttributeCommandTreeNode.java index 4679d447..c1682b00 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/AttributeCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/AttributeCommandTreeNode.java @@ -10,8 +10,8 @@ import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute; import net.Indyuce.mmocore.api.player.attribute.PlayerAttributes.AttributeInstance; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; public class AttributeCommandTreeNode extends CommandTreeNode { public AttributeCommandTreeNode(CommandTreeNode parent) { diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ClassCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ClassCommandTreeNode.java index a2c122fc..4328fa8a 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ClassCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ClassCommandTreeNode.java @@ -12,8 +12,8 @@ import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.profess.PlayerClass; import net.Indyuce.mmocore.api.player.profess.SavedClassInformation; import net.Indyuce.mmocore.command.CommandVerbose; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; public class ClassCommandTreeNode extends CommandTreeNode { public ClassCommandTreeNode(CommandTreeNode parent) { diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExperienceCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExperienceCommandTreeNode.java index 523c21dc..b556d3d7 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExperienceCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExperienceCommandTreeNode.java @@ -1,7 +1,7 @@ package net.Indyuce.mmocore.command.rpg.admin; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.command.CommandVerbose; diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ForceClassCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ForceClassCommandTreeNode.java index 58cdccc2..17bdcbce 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ForceClassCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ForceClassCommandTreeNode.java @@ -9,8 +9,8 @@ import org.bukkit.entity.Player; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.profess.PlayerClass; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; public class ForceClassCommandTreeNode extends CommandTreeNode { public ForceClassCommandTreeNode(CommandTreeNode parent) { diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/HideActionBarCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/HideActionBarCommandTreeNode.java index a72c6865..0b94207c 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/HideActionBarCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/HideActionBarCommandTreeNode.java @@ -1,7 +1,7 @@ package net.Indyuce.mmocore.command.rpg.admin; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; import net.Indyuce.mmocore.api.player.PlayerActivity; import net.Indyuce.mmocore.api.player.PlayerData; import org.bukkit.Bukkit; diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/InfoCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/InfoCommandTreeNode.java index 03c6928e..4b26626e 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/InfoCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/InfoCommandTreeNode.java @@ -8,8 +8,8 @@ import org.bukkit.entity.Player; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.experience.Profession; import net.Indyuce.mmocore.api.player.PlayerData; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; public class InfoCommandTreeNode extends CommandTreeNode { public InfoCommandTreeNode(CommandTreeNode parent) { diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/LevelCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/LevelCommandTreeNode.java index 7d3d8dee..512c187a 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/LevelCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/LevelCommandTreeNode.java @@ -14,8 +14,8 @@ import net.Indyuce.mmocore.experience.PlayerProfessions; import net.Indyuce.mmocore.experience.Profession; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.command.MMOCoreCommandTreeRoot; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; public class LevelCommandTreeNode extends CommandTreeNode { public LevelCommandTreeNode(CommandTreeNode parent) { diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/NoCooldownCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/NoCooldownCommandTreeNode.java index 29698e91..ad41fde2 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/NoCooldownCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/NoCooldownCommandTreeNode.java @@ -7,8 +7,8 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import net.Indyuce.mmocore.api.player.PlayerData; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; public class NoCooldownCommandTreeNode extends CommandTreeNode { public NoCooldownCommandTreeNode(CommandTreeNode parent) { diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/PointsCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/PointsCommandTreeNode.java index 8ef7c449..a240c997 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/PointsCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/PointsCommandTreeNode.java @@ -10,8 +10,8 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import net.Indyuce.mmocore.api.player.PlayerData; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; public class PointsCommandTreeNode extends CommandTreeNode { private final String type; diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ResetCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ResetCommandTreeNode.java index c79b489f..de2b6824 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ResetCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ResetCommandTreeNode.java @@ -10,8 +10,8 @@ import net.Indyuce.mmocore.experience.Profession; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.attribute.PlayerAttributes.AttributeInstance; import net.Indyuce.mmocore.command.CommandVerbose; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; public class ResetCommandTreeNode extends CommandTreeNode { public ResetCommandTreeNode(CommandTreeNode parent) { diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ResourceCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ResourceCommandTreeNode.java index 94f440ad..9f453a35 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ResourceCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ResourceCommandTreeNode.java @@ -1,7 +1,7 @@ package net.Indyuce.mmocore.command.rpg.admin; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource; import net.Indyuce.mmocore.api.quest.trigger.ManaTrigger; diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/booster/BoosterCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/booster/BoosterCommandTreeNode.java index e837758c..ec893da0 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/booster/BoosterCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/booster/BoosterCommandTreeNode.java @@ -2,7 +2,7 @@ package net.Indyuce.mmocore.command.rpg.booster; import org.bukkit.command.CommandSender; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.CommandTreeNode; public class BoosterCommandTreeNode extends CommandTreeNode { public BoosterCommandTreeNode(CommandTreeNode parent) { diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/booster/CreateCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/booster/CreateCommandTreeNode.java index 09ad2d68..99b0742d 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/booster/CreateCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/booster/CreateCommandTreeNode.java @@ -12,8 +12,8 @@ import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.experience.Booster; import net.Indyuce.mmocore.experience.Profession; import net.Indyuce.mmocore.command.MMOCoreCommandTreeRoot; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; public class CreateCommandTreeNode extends CommandTreeNode { public CreateCommandTreeNode(CommandTreeNode parent) { diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/booster/ListCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/booster/ListCommandTreeNode.java index 55da16af..ecaba7d3 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/booster/ListCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/booster/ListCommandTreeNode.java @@ -8,7 +8,7 @@ import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.experience.Booster; import net.Indyuce.mmocore.api.util.math.format.DelayFormat; import io.lumine.mythic.lib.MythicLib; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.CommandTreeNode; public class ListCommandTreeNode extends CommandTreeNode { public ListCommandTreeNode(CommandTreeNode parent) { diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/booster/RemoveCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/booster/RemoveCommandTreeNode.java index 08801ec2..03ce630f 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/booster/RemoveCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/booster/RemoveCommandTreeNode.java @@ -8,8 +8,8 @@ import org.bukkit.command.CommandSender; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.experience.Booster; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; public class RemoveCommandTreeNode extends CommandTreeNode { public RemoveCommandTreeNode(CommandTreeNode parent) { diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/debug/DebugCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/debug/DebugCommandTreeNode.java index c488afb7..f077d10e 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/debug/DebugCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/debug/DebugCommandTreeNode.java @@ -3,7 +3,7 @@ package net.Indyuce.mmocore.command.rpg.debug; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.CommandTreeNode; public class DebugCommandTreeNode extends CommandTreeNode { public static final String commandPrefix = ChatColor.YELLOW + "[" + ChatColor.RED + "DEBUG" + ChatColor.GOLD + "] " + ChatColor.RESET; diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/debug/StatModifiersCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/debug/StatModifiersCommandTreeNode.java index 4dd79cb9..38de283c 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/debug/StatModifiersCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/debug/StatModifiersCommandTreeNode.java @@ -2,8 +2,8 @@ package net.Indyuce.mmocore.command.rpg.debug; import io.lumine.mythic.lib.api.stat.StatInstance; import io.lumine.mythic.lib.api.stat.modifier.StatModifier; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.stats.StatType; import org.bukkit.ChatColor; diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/debug/StatValueCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/debug/StatValueCommandTreeNode.java index dc4683a5..f13d42a4 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/debug/StatValueCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/debug/StatValueCommandTreeNode.java @@ -6,8 +6,8 @@ import org.bukkit.entity.Player; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.stats.StatType; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; public class StatValueCommandTreeNode extends CommandTreeNode { public StatValueCommandTreeNode(CommandTreeNode parent) { diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/quest/CancelCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/quest/CancelCommandTreeNode.java index 8d38c1fb..1556da28 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/quest/CancelCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/quest/CancelCommandTreeNode.java @@ -7,8 +7,8 @@ import org.bukkit.entity.Player; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.quest.PlayerQuests; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; public class CancelCommandTreeNode extends CommandTreeNode { public CancelCommandTreeNode(CommandTreeNode parent) { diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/quest/FinishCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/quest/FinishCommandTreeNode.java index f44ed586..5514bfbb 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/quest/FinishCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/quest/FinishCommandTreeNode.java @@ -1,7 +1,7 @@ package net.Indyuce.mmocore.command.rpg.quest; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.quest.PlayerQuests; import org.bukkit.Bukkit; diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/quest/QuestCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/quest/QuestCommandTreeNode.java index 4a09c09c..866b6981 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/quest/QuestCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/quest/QuestCommandTreeNode.java @@ -2,7 +2,7 @@ package net.Indyuce.mmocore.command.rpg.quest; import org.bukkit.command.CommandSender; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.CommandTreeNode; public class QuestCommandTreeNode extends CommandTreeNode { diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/quest/StartCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/quest/StartCommandTreeNode.java index e56e853e..079c262c 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/quest/StartCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/quest/StartCommandTreeNode.java @@ -10,8 +10,8 @@ import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.quest.PlayerQuests; import net.Indyuce.mmocore.api.quest.Quest; import net.Indyuce.mmocore.command.MMOCoreCommandTreeRoot; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; public class StartCommandTreeNode extends CommandTreeNode { public StartCommandTreeNode(CommandTreeNode parent) { diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/waypoint/OpenCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/waypoint/OpenCommandTreeNode.java index 7db30c5d..84f1ac91 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/waypoint/OpenCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/waypoint/OpenCommandTreeNode.java @@ -6,8 +6,8 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import net.Indyuce.mmocore.manager.InventoryManager; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; public class OpenCommandTreeNode extends CommandTreeNode { public OpenCommandTreeNode(CommandTreeNode parent) { diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/waypoint/TeleportCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/waypoint/TeleportCommandTreeNode.java index 1a79f48b..9b78c351 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/waypoint/TeleportCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/waypoint/TeleportCommandTreeNode.java @@ -1,9 +1,9 @@ package net.Indyuce.mmocore.command.rpg.waypoint; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.Waypoint; +import net.Indyuce.mmocore.waypoint.Waypoint; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/waypoint/UnlockCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/waypoint/UnlockCommandTreeNode.java index 4a09e359..a33e7a30 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/waypoint/UnlockCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/waypoint/UnlockCommandTreeNode.java @@ -6,10 +6,10 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.Waypoint; +import net.Indyuce.mmocore.waypoint.Waypoint; import net.Indyuce.mmocore.api.player.PlayerData; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; -import io.lumine.mythic.lib.commands.mmolib.api.Parameter; +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.Parameter; public class UnlockCommandTreeNode extends CommandTreeNode { public UnlockCommandTreeNode(CommandTreeNode parent) { diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/waypoint/WaypointsCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/waypoint/WaypointsCommandTreeNode.java index 5ef0090a..839f2995 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/waypoint/WaypointsCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/waypoint/WaypointsCommandTreeNode.java @@ -2,7 +2,7 @@ package net.Indyuce.mmocore.command.rpg.waypoint; import org.bukkit.command.CommandSender; -import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode; +import io.lumine.mythic.lib.command.api.CommandTreeNode; public class WaypointsCommandTreeNode extends CommandTreeNode { public WaypointsCommandTreeNode(CommandTreeNode parent) { From e27980f18d8e69b411058e42c1a50f75536eadaa Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sun, 27 Feb 2022 11:26:21 +0100 Subject: [PATCH 02/36] chest particle refactor --- .../{api/util/math => loot/chest}/particle/CastingParticle.java | 2 +- .../util/math => loot/chest}/particle/ChestParticleEffect.java | 2 +- .../util/math => loot/chest}/particle/ParabolicProjectile.java | 2 +- .../{api/util/math => loot/chest}/particle/PotionParticles.java | 2 +- .../util/math => loot/chest}/particle/SmallParticleEffect.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename src/main/java/net/Indyuce/mmocore/{api/util/math => loot/chest}/particle/CastingParticle.java (96%) rename src/main/java/net/Indyuce/mmocore/{api/util/math => loot/chest}/particle/ChestParticleEffect.java (96%) rename src/main/java/net/Indyuce/mmocore/{api/util/math => loot/chest}/particle/ParabolicProjectile.java (98%) rename src/main/java/net/Indyuce/mmocore/{api/util/math => loot/chest}/particle/PotionParticles.java (95%) rename src/main/java/net/Indyuce/mmocore/{api/util/math => loot/chest}/particle/SmallParticleEffect.java (94%) diff --git a/src/main/java/net/Indyuce/mmocore/api/util/math/particle/CastingParticle.java b/src/main/java/net/Indyuce/mmocore/loot/chest/particle/CastingParticle.java similarity index 96% rename from src/main/java/net/Indyuce/mmocore/api/util/math/particle/CastingParticle.java rename to src/main/java/net/Indyuce/mmocore/loot/chest/particle/CastingParticle.java index 152d21d6..993ec56f 100644 --- a/src/main/java/net/Indyuce/mmocore/api/util/math/particle/CastingParticle.java +++ b/src/main/java/net/Indyuce/mmocore/loot/chest/particle/CastingParticle.java @@ -1,4 +1,4 @@ -package net.Indyuce.mmocore.api.util.math.particle; +package net.Indyuce.mmocore.loot.chest.particle; import java.util.function.Consumer; diff --git a/src/main/java/net/Indyuce/mmocore/api/util/math/particle/ChestParticleEffect.java b/src/main/java/net/Indyuce/mmocore/loot/chest/particle/ChestParticleEffect.java similarity index 96% rename from src/main/java/net/Indyuce/mmocore/api/util/math/particle/ChestParticleEffect.java rename to src/main/java/net/Indyuce/mmocore/loot/chest/particle/ChestParticleEffect.java index 33bf1c01..00bb6c66 100644 --- a/src/main/java/net/Indyuce/mmocore/api/util/math/particle/ChestParticleEffect.java +++ b/src/main/java/net/Indyuce/mmocore/loot/chest/particle/ChestParticleEffect.java @@ -1,4 +1,4 @@ -package net.Indyuce.mmocore.api.util.math.particle; +package net.Indyuce.mmocore.loot.chest.particle; import java.util.function.BiConsumer; diff --git a/src/main/java/net/Indyuce/mmocore/api/util/math/particle/ParabolicProjectile.java b/src/main/java/net/Indyuce/mmocore/loot/chest/particle/ParabolicProjectile.java similarity index 98% rename from src/main/java/net/Indyuce/mmocore/api/util/math/particle/ParabolicProjectile.java rename to src/main/java/net/Indyuce/mmocore/loot/chest/particle/ParabolicProjectile.java index c1596a89..a1615350 100644 --- a/src/main/java/net/Indyuce/mmocore/api/util/math/particle/ParabolicProjectile.java +++ b/src/main/java/net/Indyuce/mmocore/loot/chest/particle/ParabolicProjectile.java @@ -1,4 +1,4 @@ -package net.Indyuce.mmocore.api.util.math.particle; +package net.Indyuce.mmocore.loot.chest.particle; import java.util.function.Consumer; diff --git a/src/main/java/net/Indyuce/mmocore/api/util/math/particle/PotionParticles.java b/src/main/java/net/Indyuce/mmocore/loot/chest/particle/PotionParticles.java similarity index 95% rename from src/main/java/net/Indyuce/mmocore/api/util/math/particle/PotionParticles.java rename to src/main/java/net/Indyuce/mmocore/loot/chest/particle/PotionParticles.java index bb879389..63a9343a 100644 --- a/src/main/java/net/Indyuce/mmocore/api/util/math/particle/PotionParticles.java +++ b/src/main/java/net/Indyuce/mmocore/loot/chest/particle/PotionParticles.java @@ -1,4 +1,4 @@ -package net.Indyuce.mmocore.api.util.math.particle; +package net.Indyuce.mmocore.loot.chest.particle; import org.bukkit.Color; import org.bukkit.Particle; diff --git a/src/main/java/net/Indyuce/mmocore/api/util/math/particle/SmallParticleEffect.java b/src/main/java/net/Indyuce/mmocore/loot/chest/particle/SmallParticleEffect.java similarity index 94% rename from src/main/java/net/Indyuce/mmocore/api/util/math/particle/SmallParticleEffect.java rename to src/main/java/net/Indyuce/mmocore/loot/chest/particle/SmallParticleEffect.java index 07075d2f..0b0cdef5 100644 --- a/src/main/java/net/Indyuce/mmocore/api/util/math/particle/SmallParticleEffect.java +++ b/src/main/java/net/Indyuce/mmocore/loot/chest/particle/SmallParticleEffect.java @@ -1,4 +1,4 @@ -package net.Indyuce.mmocore.api.util.math.particle; +package net.Indyuce.mmocore.loot.chest.particle; import org.bukkit.Location; import org.bukkit.Particle; From fff24aa077862d08be333e3fbab162e1d28a076d Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sun, 27 Feb 2022 13:16:52 +0100 Subject: [PATCH 03/36] custom item recode --- .../net/Indyuce/mmocore/api/eco/Withdraw.java | 6 +- .../mmocore/api/util/item/ConfigItem.java | 144 ------------------ .../mmocore/api/util/item/CurrencyItem.java | 45 ------ .../mmocore/api/util/item/NamedItemStack.java | 17 --- .../command/rpg/CoinsCommandTreeNode.java | 2 +- .../command/rpg/NoteCommandTreeNode.java | 2 +- .../mythicmobs/load/CurrencyItemDrop.java | 4 +- .../comp/mythicmobs/load/GoldPouchDrop.java | 15 +- .../Indyuce/mmocore/gui/eco/DepositMenu.java | 6 +- .../mmocore/loot/chest/TierEffect.java | 2 +- .../loot/droptable/dropitem/GoldDropItem.java | 21 +-- .../loot/droptable/dropitem/NoteDropItem.java | 29 ++-- .../mmocore/manager/ConfigItemManager.java | 2 +- .../util/item/AbstractItemBuilder.java | 88 +++++++++++ .../Indyuce/mmocore/util/item/ConfigItem.java | 65 ++++++++ .../util/item/CurrencyItemBuilder.java | 26 ++++ .../mmocore/util/item/SimpleItemBuilder.java | 26 ++++ 17 files changed, 255 insertions(+), 245 deletions(-) delete mode 100644 src/main/java/net/Indyuce/mmocore/api/util/item/ConfigItem.java delete mode 100644 src/main/java/net/Indyuce/mmocore/api/util/item/CurrencyItem.java delete mode 100644 src/main/java/net/Indyuce/mmocore/api/util/item/NamedItemStack.java create mode 100644 src/main/java/net/Indyuce/mmocore/util/item/AbstractItemBuilder.java create mode 100644 src/main/java/net/Indyuce/mmocore/util/item/ConfigItem.java create mode 100644 src/main/java/net/Indyuce/mmocore/util/item/CurrencyItemBuilder.java create mode 100644 src/main/java/net/Indyuce/mmocore/util/item/SimpleItemBuilder.java diff --git a/src/main/java/net/Indyuce/mmocore/api/eco/Withdraw.java b/src/main/java/net/Indyuce/mmocore/api/eco/Withdraw.java index f1669ba0..e143c2b7 100644 --- a/src/main/java/net/Indyuce/mmocore/api/eco/Withdraw.java +++ b/src/main/java/net/Indyuce/mmocore/api/eco/Withdraw.java @@ -17,7 +17,7 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.util.item.CurrencyItem; +import net.Indyuce.mmocore.util.item.CurrencyItemBuilder; import io.lumine.mythic.lib.api.util.SmartGive; public class Withdraw implements Listener { @@ -101,9 +101,9 @@ public class Withdraw implements Listener { SmartGive smart = new SmartGive(player); if (note > 0) - smart.give(new CurrencyItem("NOTE", note).build()); + smart.give(new CurrencyItemBuilder("NOTE", note).build()); - ItemStack coinsItem = new CurrencyItem("GOLD_COIN", 1).build(); + ItemStack coinsItem = new CurrencyItemBuilder("GOLD_COIN", 1).build(); coinsItem.setAmount(coins); smart.give(coinsItem); } diff --git a/src/main/java/net/Indyuce/mmocore/api/util/item/ConfigItem.java b/src/main/java/net/Indyuce/mmocore/api/util/item/ConfigItem.java deleted file mode 100644 index 42c0962a..00000000 --- a/src/main/java/net/Indyuce/mmocore/api/util/item/ConfigItem.java +++ /dev/null @@ -1,144 +0,0 @@ -package net.Indyuce.mmocore.api.util.item; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.logging.Level; - -import org.apache.commons.lang.Validate; -import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Damageable; -import org.bukkit.inventory.meta.ItemMeta; - -import com.mojang.authlib.GameProfile; -import com.mojang.authlib.properties.Property; - -import net.Indyuce.mmocore.MMOCore; -import io.lumine.mythic.lib.MythicLib; -import io.lumine.mythic.lib.api.item.ItemTag; -import io.lumine.mythic.lib.api.item.NBTItem; -import io.lumine.mythic.lib.version.VersionMaterial; - -public class ConfigItem { - private final String name, id, texture; - private final ItemStack item; - private final List lore; - private final int damage, modeldata; - - private boolean unbreakable; - private final Map placeholders = new HashMap<>(); - - public ConfigItem(ConfigurationSection config) { - id = config.getName(); - name = config.getString("name"); - lore = config.getStringList("lore"); - item = new ItemStack(Material.valueOf(config.getString("item"))); - - Validate.notNull(name, "Name cannot be null"); - Validate.notNull(lore, "Lore can be empty but not null"); - - /* - * extra options - */ - damage = config.getInt("damage"); - texture = config.getString("texture"); - modeldata = config.getInt("custom-model-data"); - } - - public ConfigItem(String id) { - this(MMOCore.plugin.configItems.get(id)); - } - - public ConfigItem(ConfigItem cache) { - this.id = cache.id; - name = cache.name; - lore = cache.lore; - item = cache.item; - damage = cache.damage; - texture = cache.texture; - modeldata = cache.modeldata; - unbreakable = cache.unbreakable; - } - - public ItemStack getItem(int amount) { - ItemStack item = this.item.clone(); - item.setAmount(amount); - return item; - } - - public List getLore() { - return lore; - } - - public String getName() { - return name; - } - - public int getModelData() { - return modeldata; - } - - public String getId() { - return id; - } - - public ConfigItem setUnbreakable() { - unbreakable = true; - return this; - } - - public ConfigItem addPlaceholders(String... placeholders) { - for (int j = 0; j < placeholders.length - 1; j += 2) - this.placeholders.put(placeholders[j], placeholders[j + 1]); - return this; - } - - public ItemStack build() { - return build(1); - } - - public ItemStack build(int amount) { - ItemStack item = getItem(amount); - ItemMeta meta = item.getItemMeta(); - - if (meta instanceof Damageable) - ((Damageable) meta).setDamage(damage); - - if (MythicLib.plugin.getVersion().isStrictlyHigher(1, 13)) - meta.setCustomModelData(modeldata); - - if (item.getType() == VersionMaterial.PLAYER_HEAD.toMaterial() && texture != null) - try { - Field profileField = meta.getClass().getDeclaredField("profile"); - profileField.setAccessible(true); - GameProfile profile = new GameProfile(UUID.randomUUID(), null); - profile.getProperties().put("textures", new Property("textures", texture)); - profileField.set(meta, profile); - } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException exception) { - MMOCore.log(Level.WARNING, "Could not load config item texture of " + id); - } - - meta.addItemFlags(ItemFlag.values()); - meta.setDisplayName(format(name)); - - List lore = new ArrayList<>(); - getLore().forEach(line -> lore.add(format(line))); - meta.setLore(lore); - - item.setItemMeta(meta); - return unbreakable ? NBTItem.get(item).addTag(new ItemTag("Unbreakable", true)).toItem() : item; - } - - protected String format(String string) { - for (String placeholder : placeholders.keySet()) - if (string.contains("{" + placeholder + "}")) - string = string.replace("{" + placeholder + "}", "" + placeholders.get(placeholder)); - return MythicLib.plugin.parseColors(string); - } -} diff --git a/src/main/java/net/Indyuce/mmocore/api/util/item/CurrencyItem.java b/src/main/java/net/Indyuce/mmocore/api/util/item/CurrencyItem.java deleted file mode 100644 index ca8366e6..00000000 --- a/src/main/java/net/Indyuce/mmocore/api/util/item/CurrencyItem.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.Indyuce.mmocore.api.util.item; - -import java.util.ArrayList; -import java.util.List; - -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import io.lumine.mythic.lib.MythicLib; -import io.lumine.mythic.lib.api.item.ItemTag; -import io.lumine.mythic.lib.api.item.NBTItem; - -public class CurrencyItem extends ConfigItem { - private final int worth, amount; - - public CurrencyItem(String key, int worth) { - this(key, worth, 1); - } - - public CurrencyItem(String key, int worth, int amount) { - super(key); - addPlaceholders("worth", "" + (this.worth = worth)); - this.amount = amount; - } - - @Override - public ItemStack build() { - ItemStack item = getItem(amount); - ItemMeta meta = item.getItemMeta(); - - meta.addItemFlags(ItemFlag.values()); - meta.setDisplayName(format(getName())); - - List lore = new ArrayList<>(); - getLore().forEach(line -> lore.add(format(line))); - meta.setLore(lore); - - if(MythicLib.plugin.getVersion().isStrictlyHigher(1, 13)) - meta.setCustomModelData(getModelData()); - - item.setItemMeta(meta); - return NBTItem.get(item).addTag(new ItemTag("RpgWorth", worth)).toItem(); - } -} diff --git a/src/main/java/net/Indyuce/mmocore/api/util/item/NamedItemStack.java b/src/main/java/net/Indyuce/mmocore/api/util/item/NamedItemStack.java deleted file mode 100644 index 8bdc5608..00000000 --- a/src/main/java/net/Indyuce/mmocore/api/util/item/NamedItemStack.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.Indyuce.mmocore.api.util.item; - -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import io.lumine.mythic.lib.MythicLib; - -public class NamedItemStack extends ItemStack { - public NamedItemStack(Material material, String name) { - super(material); - - ItemMeta meta = getItemMeta(); - meta.setDisplayName(MythicLib.plugin.parseColors(name)); - setItemMeta(meta); - } -} diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/CoinsCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/CoinsCommandTreeNode.java index 0e702165..fc185d36 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/CoinsCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/CoinsCommandTreeNode.java @@ -3,7 +3,7 @@ package net.Indyuce.mmocore.command.rpg; import io.lumine.mythic.lib.api.util.SmartGive; import io.lumine.mythic.lib.command.api.CommandTreeNode; import io.lumine.mythic.lib.command.api.Parameter; -import net.Indyuce.mmocore.api.util.item.CurrencyItemBuilder; +import net.Indyuce.mmocore.util.item.CurrencyItemBuilder; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/NoteCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/NoteCommandTreeNode.java index 74c88e3f..b83173c6 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/NoteCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/NoteCommandTreeNode.java @@ -7,7 +7,7 @@ import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import net.Indyuce.mmocore.api.util.item.CurrencyItemBuilder; +import net.Indyuce.mmocore.util.item.CurrencyItemBuilder; import io.lumine.mythic.lib.api.util.SmartGive; import io.lumine.mythic.lib.command.api.CommandTreeNode; import io.lumine.mythic.lib.command.api.Parameter; diff --git a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/CurrencyItemDrop.java b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/CurrencyItemDrop.java index 5d849a31..37fc4b9f 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/CurrencyItemDrop.java +++ b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/CurrencyItemDrop.java @@ -9,7 +9,7 @@ import io.lumine.xikage.mythicmobs.drops.IMultiDrop; import io.lumine.xikage.mythicmobs.drops.LootBag; import io.lumine.xikage.mythicmobs.drops.droppables.ItemDrop; import io.lumine.xikage.mythicmobs.io.MythicLineConfig; -import net.Indyuce.mmocore.api.util.item.CurrencyItem; +import net.Indyuce.mmocore.util.item.CurrencyItemBuilder; public class CurrencyItemDrop extends Drop implements IMultiDrop { private final String key; @@ -30,7 +30,7 @@ public class CurrencyItemDrop extends Drop implements IMultiDrop { @Override public LootBag get(DropMetadata metadata) { LootBag loot = new LootBag(metadata); - loot.add(new ItemDrop(this.getLine(), (MythicLineConfig) this.getConfig(), new BukkitItemStack(new CurrencyItem(key, random(minw, maxw)).build()))); + loot.add(new ItemDrop(this.getLine(), (MythicLineConfig) this.getConfig(), new BukkitItemStack(new CurrencyItemBuilder(key, random(minw, maxw)).build()))); return loot; } diff --git a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/GoldPouchDrop.java b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/GoldPouchDrop.java index 57f8c2ac..f168d904 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/GoldPouchDrop.java +++ b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/GoldPouchDrop.java @@ -2,6 +2,7 @@ package net.Indyuce.mmocore.comp.mythicmobs.load; import java.util.Random; +import net.Indyuce.mmocore.util.item.SimpleItemBuilder; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -13,8 +14,7 @@ import io.lumine.xikage.mythicmobs.drops.LootBag; import io.lumine.xikage.mythicmobs.drops.droppables.ItemDrop; import io.lumine.xikage.mythicmobs.io.MythicLineConfig; import net.Indyuce.mmocore.api.util.MMOCoreUtils; -import net.Indyuce.mmocore.api.util.item.ConfigItem; -import net.Indyuce.mmocore.api.util.item.CurrencyItem; +import net.Indyuce.mmocore.util.item.CurrencyItemBuilder; import io.lumine.mythic.lib.api.item.ItemTag; import io.lumine.mythic.lib.api.item.NBTItem; @@ -35,7 +35,7 @@ public class GoldPouchDrop extends Drop implements IMultiDrop { @Override public LootBag get(DropMetadata metadata) { LootBag loot = new LootBag(metadata); - NBTItem nbt = NBTItem.get(new ConfigItem("MOB_GOLD_POUCH").build()); + NBTItem nbt = NBTItem.get(new SimpleItemBuilder("MOB_GOLD_POUCH").build()); ItemStack[] content = new ItemStack[18]; int money = random.nextInt(max - min + 1) + min; @@ -45,11 +45,11 @@ public class GoldPouchDrop extends Drop implements IMultiDrop { money -= a; if (a < 30 && random.nextDouble() < .3) { - content[getAvailableSlot(content)] = new CurrencyItem("GOLD_COIN", 1, a).build(); + content[getAvailableSlot(content)] = setAmount(new CurrencyItemBuilder("GOLD_COIN", 1).build(), a); continue; } - content[getAvailableSlot(content)] = new CurrencyItem("NOTE", a, 1).build(); + content[getAvailableSlot(content)] = new CurrencyItemBuilder("NOTE", a).build(); } nbt.addTag(new ItemTag("RpgPouchSize", 18), new ItemTag("RpgPouchMob", true), new ItemTag("RpgPouchInventory", MMOCoreUtils.toBase64(content))); @@ -57,6 +57,11 @@ public class GoldPouchDrop extends Drop implements IMultiDrop { return loot; } + private ItemStack setAmount(ItemStack item, int amount) { + item.setAmount(amount); + return item; + } + private int getAvailableSlot(ItemStack[] content) { int slot; while (content[slot = random.nextInt(content.length)] != null) diff --git a/src/main/java/net/Indyuce/mmocore/gui/eco/DepositMenu.java b/src/main/java/net/Indyuce/mmocore/gui/eco/DepositMenu.java index 8c943eeb..3260490c 100644 --- a/src/main/java/net/Indyuce/mmocore/gui/eco/DepositMenu.java +++ b/src/main/java/net/Indyuce/mmocore/gui/eco/DepositMenu.java @@ -1,5 +1,6 @@ package net.Indyuce.mmocore.gui.eco; +import net.Indyuce.mmocore.util.item.SimpleItemBuilder; import net.milkbowl.vault.economy.EconomyResponse; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -13,7 +14,6 @@ import org.bukkit.scheduler.BukkitRunnable; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.util.MMOCoreUtils; -import net.Indyuce.mmocore.api.util.item.ConfigItem; import net.Indyuce.mmocore.gui.api.PluginInventory; import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.api.util.SmartGive; @@ -30,7 +30,7 @@ public class DepositMenu extends PluginInventory { public Inventory getInventory() { Inventory inv = Bukkit.createInventory(this, 27, "Deposit"); - inv.setItem(26, depositItem = new ConfigItem("DEPOSIT_ITEM").addPlaceholders("worth", "0").build()); + inv.setItem(26, depositItem = new SimpleItemBuilder("DEPOSIT_ITEM").addPlaceholders("worth", "0").build()); new BukkitRunnable() { @@ -115,6 +115,6 @@ public class DepositMenu extends PluginInventory { private void updateDeposit(Inventory inv) { deposit = MMOCoreUtils.getWorth(inv.getContents()); - inv.setItem(26, depositItem = new ConfigItem("DEPOSIT_ITEM").addPlaceholders("worth", "" + deposit).build()); + inv.setItem(26, depositItem = new SimpleItemBuilder("DEPOSIT_ITEM").addPlaceholders("worth", "" + deposit).build()); } } diff --git a/src/main/java/net/Indyuce/mmocore/loot/chest/TierEffect.java b/src/main/java/net/Indyuce/mmocore/loot/chest/TierEffect.java index fb26bd86..cf80f6d5 100644 --- a/src/main/java/net/Indyuce/mmocore/loot/chest/TierEffect.java +++ b/src/main/java/net/Indyuce/mmocore/loot/chest/TierEffect.java @@ -7,7 +7,7 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.scheduler.BukkitRunnable; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.util.math.particle.ChestParticleEffect; +import net.Indyuce.mmocore.loot.chest.particle.ChestParticleEffect; public class TierEffect { private final ChestParticleEffect type; diff --git a/src/main/java/net/Indyuce/mmocore/loot/droptable/dropitem/GoldDropItem.java b/src/main/java/net/Indyuce/mmocore/loot/droptable/dropitem/GoldDropItem.java index 6f79c112..b19296fb 100644 --- a/src/main/java/net/Indyuce/mmocore/loot/droptable/dropitem/GoldDropItem.java +++ b/src/main/java/net/Indyuce/mmocore/loot/droptable/dropitem/GoldDropItem.java @@ -1,16 +1,19 @@ package net.Indyuce.mmocore.loot.droptable.dropitem; -import net.Indyuce.mmocore.loot.LootBuilder; -import net.Indyuce.mmocore.api.util.item.CurrencyItem; import io.lumine.mythic.lib.api.MMOLineConfig; +import net.Indyuce.mmocore.util.item.CurrencyItemBuilder; +import net.Indyuce.mmocore.loot.LootBuilder; +import org.bukkit.inventory.ItemStack; public class GoldDropItem extends DropItem { - public GoldDropItem(MMOLineConfig config) { - super(config); - } + public GoldDropItem(MMOLineConfig config) { + super(config); + } - @Override - public void collect(LootBuilder builder) { - builder.addLoot(new CurrencyItem("GOLD_COIN", 1, rollAmount()).build()); - } + @Override + public void collect(LootBuilder builder) { + ItemStack item = new CurrencyItemBuilder("GOLD_COIN", 1).build(); + item.setAmount(rollAmount()); + builder.addLoot(item); + } } diff --git a/src/main/java/net/Indyuce/mmocore/loot/droptable/dropitem/NoteDropItem.java b/src/main/java/net/Indyuce/mmocore/loot/droptable/dropitem/NoteDropItem.java index 41f45c21..f9afeffa 100644 --- a/src/main/java/net/Indyuce/mmocore/loot/droptable/dropitem/NoteDropItem.java +++ b/src/main/java/net/Indyuce/mmocore/loot/droptable/dropitem/NoteDropItem.java @@ -1,23 +1,26 @@ package net.Indyuce.mmocore.loot.droptable.dropitem; -import net.Indyuce.mmocore.loot.LootBuilder; -import net.Indyuce.mmocore.api.util.item.CurrencyItem; import io.lumine.mythic.lib.api.MMOLineConfig; +import net.Indyuce.mmocore.util.item.CurrencyItemBuilder; +import net.Indyuce.mmocore.loot.LootBuilder; +import org.bukkit.inventory.ItemStack; public class NoteDropItem extends DropItem { - private final int min, max; + private final int min, max; - public NoteDropItem(MMOLineConfig config) { - super(config); + public NoteDropItem(MMOLineConfig config) { + super(config); - config.validate("max", "min"); + config.validate("max", "min"); - min = (int) config.getDouble("min"); - max = (int) config.getDouble("max"); - } + min = (int) config.getDouble("min"); + max = (int) config.getDouble("max"); + } - @Override - public void collect(LootBuilder builder) { - builder.addLoot(new CurrencyItem("NOTE", random.nextInt(max - min + 1) + min, rollAmount()).build()); - } + @Override + public void collect(LootBuilder builder) { + ItemStack item = new CurrencyItemBuilder("NOTE", random.nextInt(max - min + 1) + min).build(); + item.setAmount(rollAmount()); + builder.addLoot(item); + } } diff --git a/src/main/java/net/Indyuce/mmocore/manager/ConfigItemManager.java b/src/main/java/net/Indyuce/mmocore/manager/ConfigItemManager.java index 6d69fbda..3714e5fb 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/ConfigItemManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/ConfigItemManager.java @@ -7,7 +7,7 @@ import java.util.logging.Level; import org.bukkit.configuration.file.FileConfiguration; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.util.item.ConfigItem; +import net.Indyuce.mmocore.util.item.ConfigItem; public class ConfigItemManager { private final Map map = new HashMap<>(); diff --git a/src/main/java/net/Indyuce/mmocore/util/item/AbstractItemBuilder.java b/src/main/java/net/Indyuce/mmocore/util/item/AbstractItemBuilder.java new file mode 100644 index 00000000..18aad29f --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/util/item/AbstractItemBuilder.java @@ -0,0 +1,88 @@ +package net.Indyuce.mmocore.util.item; + +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; +import io.lumine.mythic.lib.MythicLib; +import io.lumine.mythic.lib.api.item.ItemTag; +import io.lumine.mythic.lib.api.item.NBTItem; +import io.lumine.mythic.lib.version.VersionMaterial; +import net.Indyuce.mmocore.MMOCore; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.Field; +import java.util.*; +import java.util.logging.Level; + +public abstract class AbstractItemBuilder { + private final ConfigItem configItem; + private final Map placeholders = new HashMap<>(); + + public AbstractItemBuilder(@NotNull ConfigItem configItem) { + this.configItem = Objects.requireNonNull(configItem, "Config item cannot be null"); + } + + public AbstractItemBuilder(String key) { + this(MMOCore.plugin.configItems.get(key)); + } + + public ConfigItem getItem() { + return configItem; + } + + public AbstractItemBuilder addPlaceholders(String... placeholders) { + for (int j = 0; j < placeholders.length - 1; j += 2) + this.placeholders.put(placeholders[j], placeholders[j + 1]); + return this; + } + + public ItemStack build() { + ItemStack item = new ItemStack(configItem.getMaterial()); + ItemMeta meta = item.getItemMeta(); + + if (item.getType() == VersionMaterial.PLAYER_HEAD.toMaterial() && configItem.getTexture() != null) + try { + Field profileField = meta.getClass().getDeclaredField("profile"); + profileField.setAccessible(true); + GameProfile profile = new GameProfile(UUID.randomUUID(), null); + profile.getProperties().put("textures", new Property("textures", configItem.getTexture())); + profileField.set(meta, profile); + } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException exception) { + MMOCore.log(Level.WARNING, "Could not load texture of config item called '" + configItem.getId() + "'"); + } + + meta.addItemFlags(ItemFlag.values()); + meta.setDisplayName(applyPlaceholders(configItem.getName())); + if (configItem.isUnbreakable()) + meta.setUnbreakable(true); + if (meta instanceof Damageable) + ((Damageable) meta).setDamage(configItem.getDamage()); + meta.setCustomModelData(configItem.getModelData()); + + List lore = new ArrayList<>(); + configItem.getLore().forEach(line -> lore.add(applyPlaceholders(line))); + meta.setLore(lore); + + whenBuildingMeta(item, meta); + item.setItemMeta(meta); + + NBTItem nbtItem = NBTItem.get(item); + nbtItem.addTag(new ItemTag("MMOCoreItemId", configItem.getId())); + whenBuildingNBT(nbtItem); + return nbtItem.toItem(); + } + + public abstract void whenBuildingMeta(ItemStack item, ItemMeta meta); + + public abstract void whenBuildingNBT(NBTItem nbtItem); + + public String applyPlaceholders(String string) { + for (String placeholder : placeholders.keySet()) + if (string.contains("{" + placeholder + "}")) + string = string.replace("{" + placeholder + "}", "" + placeholders.get(placeholder)); + return MythicLib.plugin.parseColors(string); + } +} diff --git a/src/main/java/net/Indyuce/mmocore/util/item/ConfigItem.java b/src/main/java/net/Indyuce/mmocore/util/item/ConfigItem.java new file mode 100644 index 00000000..f778f7b6 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/util/item/ConfigItem.java @@ -0,0 +1,65 @@ +package net.Indyuce.mmocore.util.item; + +import org.apache.commons.lang.Validate; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; + +import javax.annotation.Nullable; +import java.util.List; + +public class ConfigItem { + private final String name, id, texture; + private final Material material; + private final List lore; + private final int damage, modeldata; + private final boolean unbreakable; + + public ConfigItem(ConfigurationSection config) { + id = config.getName(); + name = config.getString("name"); + lore = config.getStringList("lore"); + material = Material.valueOf(config.getString("item")); + + Validate.notNull(name, "Name cannot be null"); + Validate.notNull(lore, "Lore can be empty but not null"); + + // Extra options + damage = config.getInt("damage"); + texture = config.getString("texture"); + modeldata = config.getInt("custom-model-data"); + unbreakable = config.getBoolean("unbreakable"); + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public Material getMaterial() { + return material; + } + + public int getDamage() { + return damage; + } + + @Nullable + public String getTexture() { + return texture; + } + + public boolean isUnbreakable() { + return unbreakable; + } + + public List getLore() { + return lore; + } + + public int getModelData() { + return modeldata; + } +} diff --git a/src/main/java/net/Indyuce/mmocore/util/item/CurrencyItemBuilder.java b/src/main/java/net/Indyuce/mmocore/util/item/CurrencyItemBuilder.java new file mode 100644 index 00000000..63be6b29 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/util/item/CurrencyItemBuilder.java @@ -0,0 +1,26 @@ +package net.Indyuce.mmocore.util.item; + +import io.lumine.mythic.lib.api.item.ItemTag; +import io.lumine.mythic.lib.api.item.NBTItem; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +public class CurrencyItemBuilder extends AbstractItemBuilder { + private final int worth; + + public CurrencyItemBuilder(String key, int worth) { + super(key); + + addPlaceholders("worth", String.valueOf(this.worth = worth)); + } + + @Override + public void whenBuildingMeta(ItemStack item, ItemMeta meta) { + // Nothing + } + + @Override + public void whenBuildingNBT(NBTItem nbtItem) { + nbtItem.addTag(new ItemTag("RpgWorth", worth)); + } +} diff --git a/src/main/java/net/Indyuce/mmocore/util/item/SimpleItemBuilder.java b/src/main/java/net/Indyuce/mmocore/util/item/SimpleItemBuilder.java new file mode 100644 index 00000000..a9b67f0f --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/util/item/SimpleItemBuilder.java @@ -0,0 +1,26 @@ +package net.Indyuce.mmocore.util.item; + +import io.lumine.mythic.lib.api.item.NBTItem; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; + +public class SimpleItemBuilder extends AbstractItemBuilder { + public SimpleItemBuilder(@NotNull ConfigItem configItem) { + super(configItem); + } + + public SimpleItemBuilder(@NotNull String key) { + super(key); + } + + @Override + public void whenBuildingMeta(ItemStack item, ItemMeta meta) { + // Nothing + } + + @Override + public void whenBuildingNBT(NBTItem nbtItem) { + // Nothing + } +} From 09bd1eec3deb1b47b081c8bcab76727109f15c70 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sun, 27 Feb 2022 13:24:25 +0100 Subject: [PATCH 04/36] !waypoints improvements --- .../net/Indyuce/mmocore/api/Waypoint.java | 91 ------ .../api/event/PlayerResourceUpdateEvent.java | 5 + .../mmocore/api/player/PlayerData.java | 17 +- .../api/player/profess/PlayerClass.java | 2 +- .../mmocore/experience/PlayerProfessions.java | 2 +- .../Indyuce/mmocore/gui/WaypointViewer.java | 292 ++++++++++-------- .../mmocore/listener/WaypointsListener.java | 68 ++-- .../profession/PlayerCollectStats.java | 2 +- .../mmocore/manager/WaypointManager.java | 2 +- .../mmocore/{api => }/player/Unlockable.java | 4 +- .../Indyuce/mmocore/tree/SkillTreeNode.java | 2 +- .../Indyuce/mmocore/waypoint/CostType.java | 29 ++ .../Indyuce/mmocore/waypoint/Waypoint.java | 121 ++++++++ .../mmocore/waypoint/WaypointOption.java | 46 +++ src/main/resources/default/gui/waypoints.yml | 114 ++++--- src/main/resources/default/items.yml | 38 ++- src/main/resources/default/messages.yml | 1 + src/main/resources/default/waypoints.yml | 71 +++-- 18 files changed, 556 insertions(+), 351 deletions(-) delete mode 100644 src/main/java/net/Indyuce/mmocore/api/Waypoint.java rename src/main/java/net/Indyuce/mmocore/{api => }/player/Unlockable.java (79%) create mode 100644 src/main/java/net/Indyuce/mmocore/waypoint/CostType.java create mode 100644 src/main/java/net/Indyuce/mmocore/waypoint/Waypoint.java create mode 100644 src/main/java/net/Indyuce/mmocore/waypoint/WaypointOption.java diff --git a/src/main/java/net/Indyuce/mmocore/api/Waypoint.java b/src/main/java/net/Indyuce/mmocore/api/Waypoint.java deleted file mode 100644 index 76a4c727..00000000 --- a/src/main/java/net/Indyuce/mmocore/api/Waypoint.java +++ /dev/null @@ -1,91 +0,0 @@ -package net.Indyuce.mmocore.api; - -import org.apache.commons.lang.Validate; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.entity.Player; - -public class Waypoint { - private final String id, name; - private final Location loc; - private final double radiusSquared, stellium; - private final boolean def, sneak, dynamic; - - public Waypoint(ConfigurationSection section) { - Validate.notNull(section, "Could not load config section"); - - id = section.getName(); - - name = section.getString("name"); - Validate.notNull(name, "Could not load waypoint name"); - - String format = section.getString("location"); - Validate.notNull(format, "Could not read location"); - loc = readLocation(format); - - stellium = section.getDouble("stellium"); - radiusSquared = Math.pow(section.getDouble("radius"), 2); - def = section.getBoolean("default"); - sneak = !section.contains("sneak") || section.getBoolean("sneak"); - dynamic = section.getBoolean("dynamic"); - } - - public Location getLocation() { - return loc; - } - - public String getName() { - return name; - } - - public double getStelliumCost() { - return stellium; - } - - public boolean hasSneakEnabled() { - return sneak; - } - - public String getId() { - return id; - } - - public boolean isDefault() { - return def; - } - - public boolean isDynamic() { - return dynamic; - } - - public boolean isOnWaypoint(Player player) { - return player.getWorld().equals(loc.getWorld()) && player.getLocation().distanceSquared(loc) < radiusSquared; - } - - @Override - public String toString() { - return id; - } - - @Override - public boolean equals(Object object) { - return object instanceof Waypoint && ((Waypoint) object).id.equals(id); - } - - private Location readLocation(String string) { - String[] split = string.split(" "); - - World world = Bukkit.getWorld(split[0]); - Validate.notNull(world, "Could not find world with name '" + split[0]+"'"); - - double x = Double.parseDouble(split[1]); - double y = Double.parseDouble(split[2]); - double z = Double.parseDouble(split[3]); - float yaw = split.length > 4 ? (float) Double.parseDouble(split[4]) : 0; - float pitch = split.length > 5 ? (float) Double.parseDouble(split[5]) : 0; - - return new Location(world, x, y, z, yaw, pitch); - } -} \ No newline at end of file diff --git a/src/main/java/net/Indyuce/mmocore/api/event/PlayerResourceUpdateEvent.java b/src/main/java/net/Indyuce/mmocore/api/event/PlayerResourceUpdateEvent.java index a364a43f..291f4876 100644 --- a/src/main/java/net/Indyuce/mmocore/api/event/PlayerResourceUpdateEvent.java +++ b/src/main/java/net/Indyuce/mmocore/api/event/PlayerResourceUpdateEvent.java @@ -97,6 +97,11 @@ public class PlayerResourceUpdateEvent extends PlayerDataEvent implements Cancel */ SKILL_COST, + /** + * When consuming stellium to use a waypoint + */ + USE_WAYPOINT, + /** * Used by quests triggers * - {@link net.Indyuce.mmocore.api.quest.trigger.ManaTrigger} 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 43c719e4..7d318220 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java @@ -6,7 +6,9 @@ import io.lumine.mythic.lib.player.cooldown.CooldownMap; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.SoundEvent; -import net.Indyuce.mmocore.api.Waypoint; +import net.Indyuce.mmocore.player.Unlockable; +import net.Indyuce.mmocore.waypoint.CostType; +import net.Indyuce.mmocore.waypoint.Waypoint; import net.Indyuce.mmocore.api.event.PlayerExperienceGainEvent; import net.Indyuce.mmocore.api.event.PlayerLevelUpEvent; import net.Indyuce.mmocore.api.event.PlayerResourceUpdateEvent; @@ -22,7 +24,7 @@ import net.Indyuce.mmocore.api.player.stats.StatType; import net.Indyuce.mmocore.api.quest.PlayerQuests; import net.Indyuce.mmocore.api.util.Closable; import net.Indyuce.mmocore.api.util.MMOCoreUtils; -import net.Indyuce.mmocore.api.util.math.particle.SmallParticleEffect; +import net.Indyuce.mmocore.loot.chest.particle.SmallParticleEffect; import net.Indyuce.mmocore.experience.EXPSource; import net.Indyuce.mmocore.experience.ExperienceObject; import net.Indyuce.mmocore.experience.ExperienceTableClaimer; @@ -35,6 +37,7 @@ import net.Indyuce.mmocore.party.provided.Party; import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skill.RegisteredSkill; import net.Indyuce.mmocore.skill.cast.SkillCastingHandler; +import net.Indyuce.mmocore.waypoint.WaypointOption; import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.chat.TextComponent; import org.apache.commons.lang.Validate; @@ -382,7 +385,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc } public boolean hasWaypoint(Waypoint waypoint) { - return waypoint.isDefault() || waypoints.contains(waypoint.getId()); + return waypoint.hasOption(WaypointOption.DEFAULT) || waypoints.contains(waypoint.getId()); } public void unlockWaypoint(Waypoint waypoint) { @@ -455,9 +458,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc * * @param waypoint Target waypoint */ - public void warp(Waypoint waypoint) { - if (!isOnline()) - return; + public void warp(Waypoint waypoint, CostType costType) { /* * This cooldown is only used internally to make sure the player is not @@ -466,7 +467,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc */ setLastActivity(PlayerActivity.USE_WAYPOINT); - giveStellium(-waypoint.getStelliumCost(), PlayerResourceUpdateEvent.UpdateReason.SKILL_COST); + giveStellium(-waypoint.getCost(costType), PlayerResourceUpdateEvent.UpdateReason.USE_WAYPOINT); new BukkitRunnable() { final int x = getPlayer().getLocation().getBlockX(); @@ -481,7 +482,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc || getPlayer().getLocation().getBlockZ() != z) { MMOCore.plugin.soundManager.getSound(SoundEvent.WARP_CANCELLED).playTo(getPlayer()); MMOCore.plugin.configManager.getSimpleMessage("warping-canceled").send(getPlayer()); - giveStellium(waypoint.getStelliumCost(), PlayerResourceUpdateEvent.UpdateReason.SKILL_REGENERATION); + giveStellium(waypoint.getCost(CostType.NORMAL_USE), PlayerResourceUpdateEvent.UpdateReason.SKILL_REGENERATION); cancel(); return; } 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 afded88e..3cd04908 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 @@ -14,7 +14,7 @@ import net.Indyuce.mmocore.api.player.profess.resource.ResourceRegeneration; import net.Indyuce.mmocore.api.player.stats.StatType; 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.loot.chest.particle.CastingParticle; import net.Indyuce.mmocore.experience.ExpCurve; import net.Indyuce.mmocore.experience.ExperienceObject; import net.Indyuce.mmocore.experience.droptable.ExperienceTable; diff --git a/src/main/java/net/Indyuce/mmocore/experience/PlayerProfessions.java b/src/main/java/net/Indyuce/mmocore/experience/PlayerProfessions.java index 4bcfb903..f7dd9963 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/PlayerProfessions.java +++ b/src/main/java/net/Indyuce/mmocore/experience/PlayerProfessions.java @@ -12,7 +12,7 @@ import net.Indyuce.mmocore.api.event.PlayerLevelUpEvent; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.stats.StatType; import net.Indyuce.mmocore.api.util.MMOCoreUtils; -import net.Indyuce.mmocore.api.util.math.particle.SmallParticleEffect; +import net.Indyuce.mmocore.loot.chest.particle.SmallParticleEffect; import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; import org.bukkit.ChatColor; diff --git a/src/main/java/net/Indyuce/mmocore/gui/WaypointViewer.java b/src/main/java/net/Indyuce/mmocore/gui/WaypointViewer.java index c4f598f7..307d9fef 100644 --- a/src/main/java/net/Indyuce/mmocore/gui/WaypointViewer.java +++ b/src/main/java/net/Indyuce/mmocore/gui/WaypointViewer.java @@ -3,7 +3,6 @@ package net.Indyuce.mmocore.gui; import io.lumine.mythic.lib.api.item.ItemTag; import io.lumine.mythic.lib.api.item.NBTItem; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.Waypoint; import net.Indyuce.mmocore.api.player.PlayerActivity; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.gui.api.EditableInventory; @@ -11,7 +10,9 @@ import net.Indyuce.mmocore.gui.api.GeneratedInventory; import net.Indyuce.mmocore.gui.api.item.InventoryItem; import net.Indyuce.mmocore.gui.api.item.Placeholders; import net.Indyuce.mmocore.gui.api.item.SimplePlaceholderItem; -import org.apache.commons.lang.Validate; +import net.Indyuce.mmocore.waypoint.CostType; +import net.Indyuce.mmocore.waypoint.Waypoint; +import net.Indyuce.mmocore.waypoint.WaypointOption; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.event.inventory.InventoryClickEvent; @@ -19,177 +20,202 @@ import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.List; +import java.util.Objects; public class WaypointViewer extends EditableInventory { - public WaypointViewer() { - super("waypoints"); - } + public WaypointViewer() { + super("waypoints"); + } - @Override - public InventoryItem load(String function, ConfigurationSection config) { + @Override + public InventoryItem load(String function, ConfigurationSection config) { - if (function.equals("waypoint")) - return new WaypointItem(config); + if (function.equals("waypoint")) + return new WaypointItem(config); - if (function.equals("previous")) - return new SimplePlaceholderItem(config) { + if (function.equals("previous")) + return new SimplePlaceholderItem(config) { - @Override - public boolean canDisplay(WaypointViewerInventory inv) { - return inv.page > 0; - } - }; + @Override + public boolean canDisplay(WaypointViewerInventory inv) { + return inv.page > 0; + } + }; - if (function.equals("next")) - return new SimplePlaceholderItem(config) { + if (function.equals("next")) + return new SimplePlaceholderItem(config) { - @Override - public boolean canDisplay(WaypointViewerInventory inv) { - return inv.getEditable().getByFunction("waypoint").getSlots().size() * (inv.page + 1) < inv.waypoints.size(); - } - }; + @Override + public boolean canDisplay(WaypointViewerInventory inv) { + return inv.getEditable().getByFunction("waypoint").getSlots().size() * (inv.page + 1) < inv.waypoints.size(); + } + }; - return new SimplePlaceholderItem(config); - } + return new SimplePlaceholderItem(config); + } - public GeneratedInventory newInventory(PlayerData data) { - return newInventory(data, null); - } + public GeneratedInventory newInventory(PlayerData data) { + return newInventory(data, null); + } - public GeneratedInventory newInventory(PlayerData data, Waypoint waypoint) { - return new WaypointViewerInventory(data, this, waypoint); - } + public GeneratedInventory newInventory(PlayerData data, Waypoint waypoint) { + return new WaypointViewerInventory(data, this, waypoint); + } - public class WaypointDisplayItem extends InventoryItem { - private final Material notReady; + public class WaypointItem extends SimplePlaceholderItem { + private final SimplePlaceholderItem noWaypoint, locked; + private final WaypointItemHandler availWaypoint, notLinked, notDynamic, noStellium; - public WaypointDisplayItem(ConfigurationSection config) { - super(config); + public WaypointItem(ConfigurationSection config) { + super(Material.BARRIER, config); - Validate.isTrue(config.contains("not-ready"), "Could not read 'not-ready' material"); - notReady = Material.valueOf(config.getString("not-ready")); - } + noWaypoint = new SimplePlaceholderItem(Objects.requireNonNull(config.getConfigurationSection("no-waypoint"), "Could not load 'no-waypoint' config")); + locked = new SimplePlaceholderItem(Objects.requireNonNull(config.getConfigurationSection("locked"), "Could not load 'locked' config")); - @Override - public ItemStack display(WaypointViewerInventory inv, int n) { - ItemStack disp = super.display(inv, n); + notLinked = new WaypointItemHandler(Objects.requireNonNull(config.getConfigurationSection("not-a-destination"), "Could not load 'not-a-destination' config")); + notDynamic = new WaypointItemHandler(Objects.requireNonNull(config.getConfigurationSection("not-dynamic"), "Could not load 'not-dynamic' config")); + noStellium = new WaypointItemHandler(Objects.requireNonNull(config.getConfigurationSection("not-enough-stellium"), "Could not load 'not-enough-stellium' config")); + availWaypoint = new WaypointItemHandler(Objects.requireNonNull(config.getConfigurationSection("display"), "Could not load 'display' config")); + } - Waypoint waypoint = inv.waypoints.get(inv.page * inv.getEditable().getByFunction("waypoint").getSlots().size() + n); - if (inv.getPlayerData().getStellium() < waypoint.getStelliumCost() || (inv.current == null && !waypoint.isDynamic())) - disp.setType(notReady); + @Override + public boolean hasDifferentDisplay() { + return true; + } - return NBTItem.get(disp).addTag(new ItemTag("waypointId", waypoint.getId())).toItem(); - } + @Override + public ItemStack display(WaypointViewerInventory inv, int n) { - @Override - public Placeholders getPlaceholders(WaypointViewerInventory inv, int n) { - Placeholders holders = new Placeholders(); + int index = inv.page * inv.getEditable().getByFunction("waypoint").getSlots().size() + n; + if (index >= inv.waypoints.size()) + return noWaypoint.display(inv, n); - Waypoint waypoint = inv.waypoints.get(inv.page * inv.getByFunction("waypoint").getSlots().size() + n); - holders.register("name", waypoint.getName()); - holders.register("stellium", decimal.format(waypoint.getStelliumCost())); + // Locked waypoint? + Waypoint waypoint = inv.waypoints.get(index); + if (!inv.getPlayerData().hasWaypoint(waypoint)) + return locked.display(inv, n); - return holders; - } - } + // Waypoints are not linked + if (inv.current != null && !inv.current.hasDestination(waypoint)) + return notLinked.display(inv, n); - public class WaypointItem extends SimplePlaceholderItem { - private final SimplePlaceholderItem noWaypoint, locked; - private final WaypointDisplayItem availWaypoint; + // Not dynamic waypoint + if (inv.current == null && !waypoint.hasOption(WaypointOption.DYNAMIC)) + return notDynamic.display(inv, n); - public WaypointItem(ConfigurationSection config) { - super(Material.BARRIER, config); + // Stellium cost + if (waypoint.getCost(inv.current == null ? CostType.DYNAMIC_USE : CostType.NORMAL_USE) > inv.getPlayerData().getStellium()) + return noStellium.display(inv, n); - Validate.notNull(config.getConfigurationSection("no-waypoint"), "Could not load 'no-waypoint' config"); - Validate.notNull(config.getConfigurationSection("locked"), "Could not load 'locked' config"); - Validate.notNull(config.getConfigurationSection("display"), "Could not load 'display' config"); + return availWaypoint.display(inv, n); + } + } - noWaypoint = new SimplePlaceholderItem(config.getConfigurationSection("no-waypoint")); - locked = new SimplePlaceholderItem(config.getConfigurationSection("locked")); - availWaypoint = new WaypointDisplayItem(config.getConfigurationSection("display")); - } + public class WaypointItemHandler extends InventoryItem { + public WaypointItemHandler(ConfigurationSection config) { + super(config); + } - @Override - public boolean hasDifferentDisplay() { - return true; - } + @Override + public ItemStack display(WaypointViewerInventory inv, int n) { + ItemStack disp = super.display(inv, n); - @Override - public ItemStack display(WaypointViewerInventory inv, int n) { + // If a player can teleport to another waypoint given his location + Waypoint waypoint = inv.waypoints.get(inv.page * inv.getEditable().getByFunction("waypoint").getSlots().size() + n); + return NBTItem.get(disp).addTag(new ItemTag("waypointId", waypoint.getId())).toItem(); + } - int index = inv.page * inv.getEditable().getByFunction("waypoint").getSlots().size() + n; - if (index >= inv.waypoints.size()) - return noWaypoint.display(inv, n); + @Override + public Placeholders getPlaceholders(WaypointViewerInventory inv, int n) { + Placeholders holders = new Placeholders(); - Waypoint waypoint = inv.waypoints.get(index); - return inv.getPlayerData().hasWaypoint(waypoint) ? availWaypoint.display(inv, n) : locked.display(inv); - } - } + Waypoint waypoint = inv.waypoints.get(inv.page * inv.getByFunction("waypoint").getSlots().size() + n); + holders.register("name", waypoint.getName()); + holders.register("current_cost", decimal.format(waypoint.getCost(inv.waypointCostType))); + holders.register("normal_cost", decimal.format(waypoint.getCost(CostType.NORMAL_USE))); + holders.register("dynamic_cost", decimal.format(waypoint.getCost(CostType.DYNAMIC_USE))); - public class WaypointViewerInventory extends GeneratedInventory { - private final List waypoints = new ArrayList<>(MMOCore.plugin.waypointManager.getAll()); - private final Waypoint current; + return holders; + } + } - private int page; + public class WaypointViewerInventory extends GeneratedInventory { + private final List waypoints = new ArrayList<>(MMOCore.plugin.waypointManager.getAll()); + private final Waypoint current; + private final CostType waypointCostType; - public WaypointViewerInventory(PlayerData playerData, EditableInventory editable, Waypoint current) { - super(playerData, editable); + private int page; - this.current = current; - } + public WaypointViewerInventory(PlayerData playerData, EditableInventory editable, Waypoint current) { + super(playerData, editable); - @Override - public String calculateName() { - return getName(); - } + this.current = current; + this.waypointCostType = current == null ? CostType.DYNAMIC_USE : CostType.NORMAL_USE; + } - @Override - public void whenClicked(InventoryClickEvent event, InventoryItem item) { - if (item.getFunction().equals("next")) { - page++; - open(); - return; - } + @Override + public String calculateName() { + return getName(); + } - if (item.getFunction().equals("previous")) { - page--; - open(); - return; - } + @Override + public void whenClicked(InventoryClickEvent event, InventoryItem item) { + if (item.getFunction().equals("next")) { + page++; + open(); + return; + } - if (item.getFunction().equals("waypoint")) { - String tag = NBTItem.get(event.getCurrentItem()).getString("waypointId"); - if (tag.equals("")) - return; + if (item.getFunction().equals("previous")) { + page--; + open(); + return; + } - Waypoint waypoint = MMOCore.plugin.waypointManager.get(tag); - if (!playerData.hasWaypoint(waypoint)) { - MMOCore.plugin.configManager.getSimpleMessage("not-unlocked-waypoint").send(player); - return; - } + if (item.getFunction().equals("waypoint")) { + String tag = NBTItem.get(event.getCurrentItem()).getString("waypointId"); + if (tag.equals("")) + return; - if (waypoint.equals(current)) { - MMOCore.plugin.configManager.getSimpleMessage("standing-on-waypoint").send(player); - return; - } + // Locked waypoint? + Waypoint waypoint = MMOCore.plugin.waypointManager.get(tag); + if (!playerData.hasWaypoint(waypoint)) { + MMOCore.plugin.configManager.getSimpleMessage("not-unlocked-waypoint").send(player); + return; + } - if (current == null && !waypoint.isDynamic()) { - MMOCore.plugin.configManager.getSimpleMessage("not-dynamic-waypoint").send(player); - return; - } + // Cannot teleport to current waypoint + if (waypoint.equals(current)) { + MMOCore.plugin.configManager.getSimpleMessage("standing-on-waypoint").send(player); + return; + } - double left = waypoint.getStelliumCost() - playerData.getStellium(); - if (left > 0) { - MMOCore.plugin.configManager.getSimpleMessage("not-enough-stellium", "more", decimal.format(left)).send(player); - return; - } + // Waypoint does not have target as destination + if (current != null && !current.hasDestination(waypoint)) { + MMOCore.plugin.configManager.getSimpleMessage("cannot-teleport-to").send(player); + return; + } - if (playerData.getActivityTimeOut(PlayerActivity.USE_WAYPOINT) > 0) - return; + // Not dynamic waypoint + if (current == null && !waypoint.hasOption(WaypointOption.DYNAMIC)) { + MMOCore.plugin.configManager.getSimpleMessage("not-dynamic-waypoint").send(player); + return; + } - player.closeInventory(); - playerData.warp(waypoint); - } - } - } + // Stellium cost + CostType costType = current == null ? CostType.DYNAMIC_USE : CostType.NORMAL_USE; + double left = waypoint.getCost(costType) - playerData.getStellium(); + if (left > 0) { + MMOCore.plugin.configManager.getSimpleMessage("not-enough-stellium", "more", decimal.format(left)).send(player); + return; + } + + if (playerData.getActivityTimeOut(PlayerActivity.USE_WAYPOINT) > 0) + return; + + player.closeInventory(); + playerData.warp(waypoint, costType); + } + } + } } diff --git a/src/main/java/net/Indyuce/mmocore/listener/WaypointsListener.java b/src/main/java/net/Indyuce/mmocore/listener/WaypointsListener.java index b95d7c7c..f49dc3ca 100644 --- a/src/main/java/net/Indyuce/mmocore/listener/WaypointsListener.java +++ b/src/main/java/net/Indyuce/mmocore/listener/WaypointsListener.java @@ -1,40 +1,58 @@ package net.Indyuce.mmocore.listener; +import io.lumine.mythic.lib.api.item.NBTItem; +import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.SoundEvent; -import net.Indyuce.mmocore.manager.SoundManager; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.loot.chest.particle.SmallParticleEffect; +import net.Indyuce.mmocore.manager.InventoryManager; +import net.Indyuce.mmocore.waypoint.Waypoint; +import net.Indyuce.mmocore.waypoint.WaypointOption; import org.bukkit.Particle; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerToggleSneakEvent; -import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.Waypoint; -import net.Indyuce.mmocore.api.player.PlayerData; -import net.Indyuce.mmocore.api.util.math.particle.SmallParticleEffect; -import net.Indyuce.mmocore.manager.InventoryManager; +import java.util.Objects; public class WaypointsListener implements Listener { - @EventHandler - public void a(PlayerToggleSneakEvent event) { - Player player = event.getPlayer(); - if (!event.isSneaking()) - return; - Waypoint waypoint = MMOCore.plugin.waypointManager.getCurrentWaypoint(player); - if (waypoint == null || !waypoint.hasSneakEnabled()) - return; + @EventHandler + public void interactWithWaypoint(PlayerToggleSneakEvent event) { + Player player = event.getPlayer(); + if (!event.isSneaking()) + return; - PlayerData data = PlayerData.get(player); - if (!data.hasWaypoint(waypoint)) { - data.unlockWaypoint(waypoint); - new SmallParticleEffect(player, Particle.SPELL_WITCH); - MMOCore.plugin.configManager.getSimpleMessage("new-waypoint", "waypoint", waypoint.getName()).send(player); - MMOCore.plugin.soundManager.getSound(SoundEvent.WARP_UNLOCK).playTo(player); - return; - } + Waypoint waypoint = MMOCore.plugin.waypointManager.getCurrentWaypoint(player); + if (waypoint == null) + return; - player.setSneaking(false); - InventoryManager.WAYPOINTS.newInventory(data, waypoint).open(); - } + PlayerData data = PlayerData.get(player); + if (waypoint.hasOption(WaypointOption.UNLOCKABLE) && !data.hasWaypoint(waypoint)) { + data.unlockWaypoint(waypoint); + new SmallParticleEffect(player, Particle.SPELL_WITCH); + MMOCore.plugin.configManager.getSimpleMessage("new-waypoint", "waypoint", waypoint.getName()).send(player); + MMOCore.plugin.soundManager.getSound(SoundEvent.WARP_UNLOCK).playTo(player); + return; + } + + if (waypoint.hasOption(WaypointOption.ENABLE_MENU)) { + player.setSneaking(false); + InventoryManager.WAYPOINTS.newInventory(data, waypoint).open(); + } + } + + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void waypointBook(PlayerInteractEvent event) { + if (!event.hasItem() || (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK)) + return; + + NBTItem nbtItem = NBTItem.get(event.getItem()); + if (Objects.equals(nbtItem.getString("MMOCoreItemId"), "WAYPOINT_BOOK")) + InventoryManager.WAYPOINTS.newInventory(PlayerData.get(event.getPlayer())).open(); + } } diff --git a/src/main/java/net/Indyuce/mmocore/listener/profession/PlayerCollectStats.java b/src/main/java/net/Indyuce/mmocore/listener/profession/PlayerCollectStats.java index b27a618b..ce81b963 100644 --- a/src/main/java/net/Indyuce/mmocore/listener/profession/PlayerCollectStats.java +++ b/src/main/java/net/Indyuce/mmocore/listener/profession/PlayerCollectStats.java @@ -13,7 +13,7 @@ import org.bukkit.potion.PotionEffectType; import net.Indyuce.mmocore.api.event.CustomBlockMineEvent; import net.Indyuce.mmocore.api.player.stats.StatType; -import net.Indyuce.mmocore.api.util.math.particle.SmallParticleEffect; +import net.Indyuce.mmocore.loot.chest.particle.SmallParticleEffect; import io.lumine.mythic.lib.MythicLib; public class PlayerCollectStats implements Listener { diff --git a/src/main/java/net/Indyuce/mmocore/manager/WaypointManager.java b/src/main/java/net/Indyuce/mmocore/manager/WaypointManager.java index 16236878..244a68e3 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/WaypointManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/WaypointManager.java @@ -9,7 +9,7 @@ import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.Waypoint; +import net.Indyuce.mmocore.waypoint.Waypoint; public class WaypointManager { private final Map waypoints = new LinkedHashMap<>(); diff --git a/src/main/java/net/Indyuce/mmocore/api/player/Unlockable.java b/src/main/java/net/Indyuce/mmocore/player/Unlockable.java similarity index 79% rename from src/main/java/net/Indyuce/mmocore/api/player/Unlockable.java rename to src/main/java/net/Indyuce/mmocore/player/Unlockable.java index 3ec06f74..8cf75544 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/Unlockable.java +++ b/src/main/java/net/Indyuce/mmocore/player/Unlockable.java @@ -1,4 +1,6 @@ -package net.Indyuce.mmocore.api.player; +package net.Indyuce.mmocore.player; + +import net.Indyuce.mmocore.api.player.PlayerData; /** * Some item that can be unlocked diff --git a/src/main/java/net/Indyuce/mmocore/tree/SkillTreeNode.java b/src/main/java/net/Indyuce/mmocore/tree/SkillTreeNode.java index 2ef69251..1d8025e4 100644 --- a/src/main/java/net/Indyuce/mmocore/tree/SkillTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/tree/SkillTreeNode.java @@ -3,7 +3,7 @@ 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.api.player.Unlockable; +import net.Indyuce.mmocore.player.Unlockable; import org.apache.commons.lang.Validate; import org.bukkit.configuration.ConfigurationSection; diff --git a/src/main/java/net/Indyuce/mmocore/waypoint/CostType.java b/src/main/java/net/Indyuce/mmocore/waypoint/CostType.java new file mode 100644 index 00000000..64719615 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/waypoint/CostType.java @@ -0,0 +1,29 @@ +package net.Indyuce.mmocore.waypoint; + +public enum CostType { + + /** + * When teleporting to this waypoint + */ + NORMAL_USE, + + /** + * When dynamically teleporting to this waypoint + */ + DYNAMIC_USE, + + /** + * When setting your spawn point to this waypoint. + */ + SET_SPAWNPOINT; + + private final String path; + + CostType() { + this.path = name().toLowerCase().replace("_", "-"); + } + + public String getPath() { + return path; + } +} diff --git a/src/main/java/net/Indyuce/mmocore/waypoint/Waypoint.java b/src/main/java/net/Indyuce/mmocore/waypoint/Waypoint.java new file mode 100644 index 00000000..f6d609b7 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/waypoint/Waypoint.java @@ -0,0 +1,121 @@ +package net.Indyuce.mmocore.waypoint; + +import net.Indyuce.mmocore.player.Unlockable; +import org.apache.commons.lang.Validate; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; + +import java.util.*; + +public class Waypoint implements Unlockable { + private final String id, name; + private final Location loc; + private final double radiusSquared; + + /** + * Set that saves all the waypoints accessible when in this waypoint. + * This turns the waypoints system into a giant network. + *

+ * If it's empty it can access any waypoint. + */ + private final Set destinations = new HashSet<>(); + + /** + * Waypoint options saved here. + */ + private final Map options = new HashMap<>(); + + /** + * Stellium cost for each action (0 being the default cost) + */ + private final Map costs = new HashMap<>(); + + public Waypoint(ConfigurationSection config) { + id = Objects.requireNonNull(config, "Could not load config section").getName(); + name = Objects.requireNonNull(config.getString("name"), "Could not load waypoint name"); + + loc = readLocation(Objects.requireNonNull(config.getString("location"), "Could not read location")); + radiusSquared = Math.pow(config.getDouble("radius"), 2); + + for (CostType costType : CostType.values()) + costs.put(costType, config.getDouble("cost." + costType.getPath())); + + for (WaypointOption option : WaypointOption.values()) + options.put(option, config.getBoolean("option." + option.getPath(), option.getDefaultValue())); + + destinations.addAll(config.getStringList("linked")); + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public Location getLocation() { + return loc; + } + + /** + * @param other Another waypoint + * @return If any player standing on that waypoint can teleport to given waypoint + */ + public boolean hasDestination(Waypoint other) { + return destinations.isEmpty() || destinations.contains(other.getId()); + } + + public double getCost(CostType type) { + return costs.getOrDefault(type, 0d); + } + + public boolean hasOption(WaypointOption option) { + return options.get(option); + } + + public boolean isOnWaypoint(Player player) { + return player.getWorld().equals(loc.getWorld()) && player.getLocation().distanceSquared(loc) < radiusSquared; + } + + @Override + public String toString() { + return id; + } + + @Override + public String getUnlockNamespacedKey() { + return "waypoint:" + getId(); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Waypoint waypoint = (Waypoint) o; + return id.equals(waypoint.id); + } + + private Location readLocation(String string) { + String[] split = string.split(" "); + + World world = Bukkit.getWorld(split[0]); + Validate.notNull(world, "Could not find world with name '" + split[0] + "'"); + + double x = Double.parseDouble(split[1]); + double y = Double.parseDouble(split[2]); + double z = Double.parseDouble(split[3]); + float yaw = split.length > 4 ? (float) Double.parseDouble(split[4]) : 0; + float pitch = split.length > 5 ? (float) Double.parseDouble(split[5]) : 0; + + return new Location(world, x, y, z, yaw, pitch); + } +} \ No newline at end of file diff --git a/src/main/java/net/Indyuce/mmocore/waypoint/WaypointOption.java b/src/main/java/net/Indyuce/mmocore/waypoint/WaypointOption.java new file mode 100644 index 00000000..65a3b582 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/waypoint/WaypointOption.java @@ -0,0 +1,46 @@ +package net.Indyuce.mmocore.waypoint; + +public enum WaypointOption { + + DEFAULT(false), + + /** + * Enable this so make the waypoint auto unlock when you sneak on it. + */ + UNLOCKABLE(true), + + /** + * When enabled players can sneak when standing on that waypoint + * to open its menu. This option can be disabled to create waypoints + * that you can only teleport to. + */ + ENABLE_MENU(true), + + /** + * By defaut, players must stand into + */ + DYNAMIC(false), + + /** + * When set to true, players can choose this waypoint as their spawnpoint. + * This action costs some stellium. + */ + // SPAWNABLE(false) + ; + + private final String path; + private final boolean defaultValue; + + WaypointOption(boolean defaultValue) { + this.path = name().toLowerCase().replace("_", "-"); + this.defaultValue = defaultValue; + } + + public String getPath() { + return path; + } + + public boolean getDefaultValue() { + return defaultValue; + } +} diff --git a/src/main/resources/default/gui/waypoints.yml b/src/main/resources/default/gui/waypoints.yml index 6d5a2c58..074e6aca 100644 --- a/src/main/resources/default/gui/waypoints.yml +++ b/src/main/resources/default/gui/waypoints.yml @@ -1,51 +1,79 @@ - # GUI display name name: Waypoints +name-on-waypoint: 'Waypoint: {waypoint}' # Number of slots in your inventory. Must be # between 9 and 54 and must be a multiple of 9. slots: 45 items: - waypoint: - slots: [10,11,12,13,14,15,16,19,20,21,22,23,24,25,28,29,30,31,32,33,34] - function: waypoint - - # Displayed when there is no waypoint - no-waypoint: - item: GRAY_STAINED_GLASS_PANE - name: '&a' - lore: {} - - # Displayed when the waypoint has not been unlocked yet. - locked: - name: '&c- Locked -' - item: GRAY_DYE - lore: {} - - # Displayed when the waypoint is unlocked. - display: - name: '&a{name}' - item: ENDER_EYE - - # Material displayed when the waypoint is not - # ready (not dynamic, or not enough stellium) - not-ready: ENDER_PEARL - - lore: - - '&7You have unlocked this waypoint.' - - '&7Click to teleport for &b{stellium} &7stellium.' - next: - slots: [26] - function: next - item: PLAYER_HEAD - texture: eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTliZjMyOTJlMTI2YTEwNWI1NGViYTcxM2FhMWIxNTJkNTQxYTFkODkzODgyOWM1NjM2NGQxNzhlZDIyYmYifX19 - name: '&aNext Page' - lore: [] - previous: - slots: [18] - function: previous - item: PLAYER_HEAD - texture: eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmQ2OWUwNmU1ZGFkZmQ4NGU1ZjNkMWMyMTA2M2YyNTUzYjJmYTk0NWVlMWQ0ZDcxNTJmZGM1NDI1YmMxMmE5In19fQ== - name: '&aPrevious Page' - lore: [] \ No newline at end of file + waypoint: + slots: [ 10,11,12,13,14,15,16,19,20,21,22,23,24,25,28,29,30,31,32,33,34 ] + function: waypoint + + # Displayed when there is no waypoint + no-waypoint: + item: GRAY_STAINED_GLASS_PANE + name: '&a' + lore: { } + + # Displayed when the waypoint has not been unlocked yet. + locked: + name: '&c- Locked -' + item: GRAY_DYE + lore: { } + + # When the two waypoints are not linked together + not-a-destination: + name: '&a{name}' + item: ENDER_PEARL + + # Material displayed when the waypoint is not + # ready (not dynamic, or not enough stellium) + not-ready: ENDER_PEARL + + lore: + - '&7You cannot teleport as the two waypoints are not linked.' + - '&7Teleporting costs &b&l{normal_cost}&7/&b&l{dynamic_cost} &7Stellium.' + + # When you cannot teleport to a non dynamic waypoint + not-dynamic: + name: '&a{name}' + item: ENDER_PEARL + + lore: + - '&7You cannot teleport as you are not standing on a waypoint.' + - '&7Teleporting costs &b&l{normal_cost}&7/&b&l{dynamic_cost} &7Stellium.' + + # When you cannot teleport to a non dynamic waypoint + not-enough-stellium: + name: '&a{name}' + item: ENDER_PEARL + + lore: + - '&7You cannot teleport as you do not have enough Stellium.' + - '&7Teleporting costs &b&l{normal_cost}&7/&b&l{dynamic_cost} &7Stellium.' + + # Displayed when the waypoint is unlocked and usable + display: + name: '&a{name}' + item: ENDER_EYE + + lore: + - '&7You can teleport to this waypoint.' + - '&7Click to teleport for &b{current_cost} &7Stellium.' + + next: + slots: [ 26 ] + function: next + item: PLAYER_HEAD + texture: eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTliZjMyOTJlMTI2YTEwNWI1NGViYTcxM2FhMWIxNTJkNTQxYTFkODkzODgyOWM1NjM2NGQxNzhlZDIyYmYifX19 + name: '&aNext Page' + lore: [ ] + previous: + slots: [ 18 ] + function: previous + item: PLAYER_HEAD + texture: eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmQ2OWUwNmU1ZGFkZmQ4NGU1ZjNkMWMyMTA2M2YyNTUzYjJmYTk0NWVlMWQ0ZDcxNTJmZGM1NDI1YmMxMmE5In19fQ== + name: '&aPrevious Page' + lore: [ ] \ No newline at end of file diff --git a/src/main/resources/default/items.yml b/src/main/resources/default/items.yml index 1c98c533..05de0cbe 100644 --- a/src/main/resources/default/items.yml +++ b/src/main/resources/default/items.yml @@ -1,29 +1,35 @@ - GOLD_COIN: - item: GOLD_NUGGET - name: '&6Gold Coin' - lore: + item: GOLD_NUGGET + name: '&6Gold Coin' + lore: - '&eWorth: 1g' NOTE: - item: PAPER - name: '&6Note' - lore: + item: PAPER + name: '&6Note' + lore: - '&eWorth: {worth}g' +WAYPOINT_BOOK: + item: ENCHANTED_BOOK + name: '&6Waypoints Book' + lore: + - '&7Waypoints are locations used to save your progress.' + - '&7This book gives you the ability to freely warp between these.' + DEPOSIT_ITEM: - item: BOOK - name: '&eDeposit {worth}g' - lore: {} + item: BOOK + name: '&eDeposit {worth}g' + lore: { } GOLD_POUCH: - item: LEATHER - name: '&fGold Pouch' - lore: + item: LEATHER + name: '&fGold Pouch' + lore: - '&7Right-Click to open.' MOB_GOLD_POUCH: - item: LEATHER - name: '&fGold Pouch' - lore: + item: LEATHER + name: '&fGold Pouch' + lore: - '&7Right-Click to open.' diff --git a/src/main/resources/default/messages.yml b/src/main/resources/default/messages.yml index 209e4727..e15a1895 100644 --- a/src/main/resources/default/messages.yml +++ b/src/main/resources/default/messages.yml @@ -73,6 +73,7 @@ not-dynamic-waypoint: '&cYou many only teleport to a non-dynamic waypoint while standing-on-waypoint: '&cYou are already standing on this waypoint.' warping-canceled: '%&cWaypoint warping canceled.' warping-comencing: '%&cDO NOT MOVE!&e You will be warped in {left}sec.' +cannot-teleport-to: '&cThe two waypoints are not linked.' # Cash deposit: '&eYou successfully deposited &6{worth}g&e.' diff --git a/src/main/resources/default/waypoints.yml b/src/main/resources/default/waypoints.yml index 30eeb7b7..8613282a 100644 --- a/src/main/resources/default/waypoints.yml +++ b/src/main/resources/default/waypoints.yml @@ -1,45 +1,58 @@ - -# Waypoint ID, used as reference. -# Make sure the waypoints have different IDs. +# Waypoint identifier, used as reference for admin commands. +# Make sure all the waypoints have different identifiers. spawn: - # Name of waypoint displayed in the waypoint GUI. - name: Spawn - - # Location of waypoint: - # Yaw and pitch are where the player will be looking at when teleported. - location: 'world 69 71 136 136 0' - - # Radius of waypoint around the specified location. - radius: 1.5 - + # Name of waypoint displayed in the waypoint GUI. + name: Spawn + + # Location of waypoint: + # Yaw and pitch are where the player will be looking at when teleported. + location: 'world 69 71 136 136 0' + + # Radius of waypoint around the specified location. + radius: 2.0 + + cost: + # Stellium cost in order to use the waypoint. # Stellium is like stamina however it's not used # by skills and regens much slower than mana. - stellium: 3 - + normal-use: 3 + + # Cost when not standing on any waypoint. + dynamic-use: 5 + + option: + # When enabled, players can unlock the waypoint - # by sneaking on it, and can open the waypoint menu - # from the specified location (true by default). - sneak: true - + # by sneaking on it (true by default) + unlockable: true + + # When enabled, players can teleport to other + #waypoints when sneaking (true by default) + enable-menu: true + # Should be waypoint be unlocked by default? default: true spawn1: - name: Spawn1 - location: 'world 69 71 136 136 0' - radius: 1.5 - stellium: 3 + name: Spawn1 + location: 'world 69 71 136 136 0' + radius: 2.0 + cost: + normal-use: 3 + option: default: false - + # Can be teleported to even when not standing # on any waypoint (waypoint must be unlocked). dynamic: true spawn2: - name: Spawn2 - location: 'world 69 71 136 136 0' - radius: 1.5 - stellium: 3 - sneak: false + name: Spawn2 + location: 'world 69 71 136 136 0' + radius: 3.0 + cost: + normal-use: 3 + option: + enable-menu: false From e6cfecb608c3eea48758a73799b1ed17999c62bd Mon Sep 17 00:00:00 2001 From: Jules Date: Sun, 27 Feb 2022 23:28:07 +0100 Subject: [PATCH 05/36] Updated ver nb --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e540a3dc..02fabaae 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 net.Indyuce MMOCore - 1.9 + 1.9.1 MMOCore Offer your players a brand new RPG experience!! From 600a2b1e3ca9ad1659cf6d73236b4c748e63c75f Mon Sep 17 00:00:00 2001 From: ASangarin Date: Tue, 1 Mar 2022 15:10:37 +0100 Subject: [PATCH 06/36] why was this even here? --- MMOCore (1).iml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 MMOCore (1).iml diff --git a/MMOCore (1).iml b/MMOCore (1).iml new file mode 100644 index 00000000..86300f98 --- /dev/null +++ b/MMOCore (1).iml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file From 4be7379ed2ba44b9a4696baf093c635d7f0fe2b2 Mon Sep 17 00:00:00 2001 From: ASangarin Date: Tue, 1 Mar 2022 15:16:59 +0100 Subject: [PATCH 07/36] added a "no stamina" option to the casting action bar --- .../mmocore/skill/cast/listener/SkillBar.java | 198 +++++++++--------- src/main/resources/default/messages.yml | 1 + 2 files changed, 100 insertions(+), 99 deletions(-) diff --git a/src/main/java/net/Indyuce/mmocore/skill/cast/listener/SkillBar.java b/src/main/java/net/Indyuce/mmocore/skill/cast/listener/SkillBar.java index 4947f519..3db7938d 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/cast/listener/SkillBar.java +++ b/src/main/java/net/Indyuce/mmocore/skill/cast/listener/SkillBar.java @@ -21,121 +21,121 @@ import org.bukkit.event.player.PlayerItemHeldEvent; import java.util.Objects; public class SkillBar implements Listener { - private final PlayerKey mainKey; + private final PlayerKey mainKey; - public SkillBar(ConfigurationSection config) { - mainKey = PlayerKey.valueOf(UtilityMethods.enumName(Objects.requireNonNull(config.getString("open"), "Could not find open key"))); - } + public SkillBar(ConfigurationSection config) { + mainKey = PlayerKey.valueOf(UtilityMethods.enumName(Objects.requireNonNull(config.getString("open"), "Could not find open key"))); + } - @EventHandler - public void a(PlayerKeyPressEvent event) { - if (event.getPressed() != mainKey) - return; + @EventHandler + public void a(PlayerKeyPressEvent event) { + if (event.getPressed() != mainKey) return; - // Always cancel event - if (event.getPressed().shouldCancelEvent()) - event.setCancelled(true); + // Always cancel event + if (event.getPressed().shouldCancelEvent()) event.setCancelled(true); - // Enter spell casting - Player player = event.getData().getPlayer(); - PlayerData playerData = event.getData(); - if (player.getGameMode() != GameMode.SPECTATOR - && (MMOCore.plugin.configManager.canCreativeCast || player.getGameMode() != GameMode.CREATIVE) - && !playerData.isCasting() - && !playerData.getBoundSkills().isEmpty()) { - playerData.setSkillCasting(new CustomSkillCastingHandler(playerData)); - MMOCore.plugin.soundManager.getSound(SoundEvent.SPELL_CAST_BEGIN).playTo(player); - } - } + // Enter spell casting + Player player = event.getData().getPlayer(); + PlayerData playerData = event.getData(); + if (player.getGameMode() != GameMode.SPECTATOR && (MMOCore.plugin.configManager.canCreativeCast || player.getGameMode() != GameMode.CREATIVE) && !playerData.isCasting() && !playerData.getBoundSkills() + .isEmpty()) { + playerData.setSkillCasting(new CustomSkillCastingHandler(playerData)); + MMOCore.plugin.soundManager.getSound(SoundEvent.SPELL_CAST_BEGIN).playTo(player); + } + } - private class CustomSkillCastingHandler extends SkillCastingHandler { - private final String ready = MMOCore.plugin.configManager.getSimpleMessage("casting.action-bar.ready").message(); - private final String onCooldown = MMOCore.plugin.configManager.getSimpleMessage("casting.action-bar.on-cooldown").message(); - private final String noMana = MMOCore.plugin.configManager.getSimpleMessage("casting.action-bar.no-mana").message(); - private final String split = MMOCore.plugin.configManager.getSimpleMessage("casting.split").message(); + private class CustomSkillCastingHandler extends SkillCastingHandler { + private final String ready = MMOCore.plugin.configManager.getSimpleMessage("casting.action-bar.ready").message(); + private final String onCooldown = MMOCore.plugin.configManager.getSimpleMessage("casting.action-bar.on-cooldown").message(); + private final String noMana = MMOCore.plugin.configManager.getSimpleMessage("casting.action-bar.no-mana").message(); + private final String noStamina = MMOCore.plugin.configManager.getSimpleMessage("casting.action-bar.no-stamina").message(); + private final String split = MMOCore.plugin.configManager.getSimpleMessage("casting.split").message(); - private int j; + private int j; - CustomSkillCastingHandler(PlayerData playerData) { - super(playerData, 1); - } + CustomSkillCastingHandler(PlayerData playerData) { + super(playerData, 1); + } - @EventHandler - public void onSkillCast(PlayerItemHeldEvent event) { - Player player = event.getPlayer(); - if (!getCaster().isOnline()) return; - if (!event.getPlayer().equals(getCaster().getPlayer())) - return; + @EventHandler + public void onSkillCast(PlayerItemHeldEvent event) { + Player player = event.getPlayer(); + if (!getCaster().isOnline()) return; + if (!event.getPlayer().equals(getCaster().getPlayer())) return; - /* - * When the event is cancelled, another playerItemHeldEvent is - * called and previous and next slots are equal. the event must not - * listen to that non-player called event. - */ - if (event.getPreviousSlot() == event.getNewSlot()) - return; + /* + * When the event is cancelled, another playerItemHeldEvent is + * called and previous and next slots are equal. the event must not + * listen to that non-player called event. + */ + if (event.getPreviousSlot() == event.getNewSlot()) return; - event.setCancelled(true); - int slot = event.getNewSlot() + (event.getNewSlot() >= player.getInventory().getHeldItemSlot() ? -1 : 0); + event.setCancelled(true); + int slot = event.getNewSlot() + (event.getNewSlot() >= player.getInventory().getHeldItemSlot() ? -1 : 0); - /* - * The event is called again soon after the first since when - * cancelling the first one, the player held item slot must go back - * to the previous one. - */ - if (slot >= 0 && getCaster().hasSkillBound(slot)) { - PlayerMetadata caster = getCaster().getMMOPlayerData().getStatMap().cache(EquipmentSlot.MAIN_HAND); - getCaster().getBoundSkill(slot).toCastable(getCaster()).cast(new TriggerMetadata(caster, null, null)); - } - } + /* + * The event is called again soon after the first since when + * cancelling the first one, the player held item slot must go back + * to the previous one. + */ + if (slot >= 0 && getCaster().hasSkillBound(slot)) { + PlayerMetadata caster = getCaster().getMMOPlayerData().getStatMap().cache(EquipmentSlot.MAIN_HAND); + getCaster().getBoundSkill(slot).toCastable(getCaster()).cast(new TriggerMetadata(caster, null, null)); + } + } - @EventHandler - public void stopCasting(PlayerKeyPressEvent event) { - Player player = event.getPlayer(); - if (event.getPressed() == mainKey && event.getPlayer().equals(getCaster().getPlayer())) { - MMOCore.plugin.soundManager.getSound(SoundEvent.SPELL_CAST_END).playTo(player); - MMOCore.plugin.configManager.getSimpleMessage("casting.no-longer").send(getCaster().getPlayer()); - PlayerData.get(player).leaveCastingMode(); - } - } + @EventHandler + public void stopCasting(PlayerKeyPressEvent event) { + Player player = event.getPlayer(); + if (event.getPressed() == mainKey && event.getPlayer().equals(getCaster().getPlayer())) { + MMOCore.plugin.soundManager.getSound(SoundEvent.SPELL_CAST_END).playTo(player); + MMOCore.plugin.configManager.getSimpleMessage("casting.no-longer").send(getCaster().getPlayer()); + PlayerData.get(player).leaveCastingMode(); + } + } - private String getFormat(PlayerData data) { - StringBuilder str = new StringBuilder(); - if (!data.isOnline()) return str.toString(); - for (int j = 0; j < data.getBoundSkills().size(); j++) { - ClassSkill skill = data.getBoundSkill(j); - str.append((str.length() == 0) ? "" : split).append((onCooldown(data, skill) - ? onCooldown.replace("{cooldown}", String.valueOf(data.getCooldownMap().getInfo(skill).getRemaining() / 1000)) - : noMana(data, skill) ? noMana : ready).replace("{index}", "" + (j + 1 + (data.getPlayer().getInventory().getHeldItemSlot() - <= j ? 1 : 0))).replace("{skill}", data.getBoundSkill(j).getSkill().getName())); - } + private String getFormat(PlayerData data) { + StringBuilder str = new StringBuilder(); + if (!data.isOnline()) return str.toString(); + for (int j = 0; j < data.getBoundSkills().size(); j++) { + ClassSkill skill = data.getBoundSkill(j); + str.append((str.length() == 0) ? "" : split).append((onCooldown(data, skill) ? onCooldown.replace("{cooldown}", + String.valueOf(data.getCooldownMap().getInfo(skill).getRemaining() / 1000)) : noMana(data, skill) ? noMana : (noStamina( + data, skill) ? noStamina : ready)).replace("{index}", + "" + (j + 1 + (data.getPlayer().getInventory().getHeldItemSlot() <= j ? 1 : 0))) + .replace("{skill}", data.getBoundSkill(j).getSkill().getName())); + } - return str.toString(); - } + return str.toString(); + } - /** - * We don't even need to check if the skill has the 'cooldown' - * modifier. We just look for an entry in the cooldown map which - * won't be here if the skill has no cooldown. - */ - private boolean onCooldown(PlayerData data, ClassSkill skill) { - return data.getCooldownMap().isOnCooldown(skill); - } + /** + * We don't even need to check if the skill has the 'cooldown' + * modifier. We just look for an entry in the cooldown map which + * won't be here if the skill has no cooldown. + */ + private boolean onCooldown(PlayerData data, ClassSkill skill) { + return data.getCooldownMap().isOnCooldown(skill); + } - private boolean noMana(PlayerData data, ClassSkill skill) { - return skill.getSkill().hasModifier("mana") && skill.getModifier("mana", data.getSkillLevel(skill.getSkill())) > data.getMana(); - } + private boolean noMana(PlayerData data, ClassSkill skill) { + return skill.getSkill().hasModifier("mana") && skill.getModifier("mana", data.getSkillLevel(skill.getSkill())) > data.getMana(); + } - @Override - public void onTick() { - if (j % 20 == 0) - getCaster().displayActionBar(getFormat(getCaster())); + private boolean noStamina(PlayerData data, ClassSkill skill) { + return skill.getSkill().hasModifier("stamina") && skill.getModifier("stamina", + data.getSkillLevel(skill.getSkill())) > data.getStamina(); + } - for (int k = 0; k < 2; k++) { - double a = (double) j++ / 5; - getCaster().getProfess().getCastParticle() - .display(getCaster().getPlayer().getLocation().add(Math.cos(a), 1 + Math.sin(a / 3) / 1.3, Math.sin(a))); - } - } - } + @Override + public void onTick() { + if (j % 20 == 0) getCaster().displayActionBar(getFormat(getCaster())); + + for (int k = 0; k < 2; k++) { + double a = (double) j++ / 5; + getCaster().getProfess().getCastParticle() + .display(getCaster().getPlayer().getLocation().add(Math.cos(a), 1 + Math.sin(a / 3) / 1.3, Math.sin(a))); + } + } + } } diff --git a/src/main/resources/default/messages.yml b/src/main/resources/default/messages.yml index e15a1895..697ebaa9 100644 --- a/src/main/resources/default/messages.yml +++ b/src/main/resources/default/messages.yml @@ -54,6 +54,7 @@ casting: ready: '&6[{index}] &a&l{skill}' on-cooldown: '&6[{index}] &c&l{skill} &6(&c{cooldown}&6)' no-mana: '&6[{index}] &9&l{skill}' + no-stamina: '&6[{index}] &9&l{skill}' split: '&7 &7 - &7 ' no-longer: '%&cYou cancelled skill casting.' no-mana: '&cYou do not have enough {mana}!' From 48a2ada8e65d99e2ff0e49efc94dd19e3c5085a8 Mon Sep 17 00:00:00 2001 From: Gunging <48371009+Gunging@users.noreply.github.com> Date: Thu, 3 Mar 2022 13:01:16 -0600 Subject: [PATCH 08/36] Allows {mana_color} placeholder in class skill lore, to complement {mana_name} --- .../api/player/profess/resource/ManaDisplayOptions.java | 4 ++++ src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java | 1 + 2 files changed, 5 insertions(+) diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/ManaDisplayOptions.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/ManaDisplayOptions.java index 970d329a..2e238aec 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/ManaDisplayOptions.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/ManaDisplayOptions.java @@ -12,6 +12,10 @@ public class ManaDisplayOptions { private final String name, icon; private final char barCharacter; + public ChatColor getFull() { return full; } + public ChatColor getHalf() { return half; } + public ChatColor getEmpty() { return empty; } + public static final ManaDisplayOptions DEFAULT = new ManaDisplayOptions(ChatColor.AQUA, ChatColor.BLUE, ChatColor.WHITE, "Mana", AltChar.listSquare.charAt(0), ChatColor.BLUE + AltChar.star2); diff --git a/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java b/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java index 47934579..f87e6f44 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java +++ b/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java @@ -83,6 +83,7 @@ public class ClassSkill implements CooldownObject { Map placeholders = calculateModifiers(x); placeholders.put("mana_name", data.getProfess().getManaDisplay().getName()); + placeholders.put("mana_color", data.getProfess().getManaDisplay().getFull().toString()); skill.getLore().forEach(str -> list.add(applyPlaceholders(placeholders, str))); return list; From 3cbc0126bfa3d6a346d8177c73b7e3031f00593e Mon Sep 17 00:00:00 2001 From: Gunging <48371009+Gunging@users.noreply.github.com> Date: Thu, 3 Mar 2022 17:51:44 -0600 Subject: [PATCH 09/36] With this, misconfigured regions (most notably the example one :kekwolf:) should not crash the plugin, and instead only print an error message. --- .../Indyuce/mmocore/gui/WaypointViewer.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/Indyuce/mmocore/gui/WaypointViewer.java b/src/main/java/net/Indyuce/mmocore/gui/WaypointViewer.java index 307d9fef..385db1ce 100644 --- a/src/main/java/net/Indyuce/mmocore/gui/WaypointViewer.java +++ b/src/main/java/net/Indyuce/mmocore/gui/WaypointViewer.java @@ -13,6 +13,7 @@ import net.Indyuce.mmocore.gui.api.item.SimplePlaceholderItem; import net.Indyuce.mmocore.waypoint.CostType; import net.Indyuce.mmocore.waypoint.Waypoint; import net.Indyuce.mmocore.waypoint.WaypointOption; +import org.apache.commons.lang.Validate; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.event.inventory.InventoryClickEvent; @@ -69,13 +70,19 @@ public class WaypointViewer extends EditableInventory { public WaypointItem(ConfigurationSection config) { super(Material.BARRIER, config); - noWaypoint = new SimplePlaceholderItem(Objects.requireNonNull(config.getConfigurationSection("no-waypoint"), "Could not load 'no-waypoint' config")); - locked = new SimplePlaceholderItem(Objects.requireNonNull(config.getConfigurationSection("locked"), "Could not load 'locked' config")); + Validate.notNull(config.getConfigurationSection("no-waypoint"), "Could not load 'no-waypoint' config"); + Validate.notNull(config.getConfigurationSection("locked"), "Could not load 'locked' config"); + Validate.notNull(config.getConfigurationSection("not-a-destination"), "Could not load 'not-a-destination' config"); + Validate.notNull(config.getConfigurationSection("not-dynamic"), "Could not load 'not-dynamic' config"); + Validate.notNull(config.getConfigurationSection("not-enough-stellium"), "Could not load 'not-enough-stellium' config"); + Validate.notNull(config.getConfigurationSection("display"), "Could not load 'display' config"); - notLinked = new WaypointItemHandler(Objects.requireNonNull(config.getConfigurationSection("not-a-destination"), "Could not load 'not-a-destination' config")); - notDynamic = new WaypointItemHandler(Objects.requireNonNull(config.getConfigurationSection("not-dynamic"), "Could not load 'not-dynamic' config")); - noStellium = new WaypointItemHandler(Objects.requireNonNull(config.getConfigurationSection("not-enough-stellium"), "Could not load 'not-enough-stellium' config")); - availWaypoint = new WaypointItemHandler(Objects.requireNonNull(config.getConfigurationSection("display"), "Could not load 'display' config")); + noWaypoint = new SimplePlaceholderItem(config.getConfigurationSection("no-waypoint")); + locked = new SimplePlaceholderItem(config.getConfigurationSection("locked")); + notLinked = new WaypointItemHandler(config.getConfigurationSection("not-a-destination")); + notDynamic = new WaypointItemHandler(config.getConfigurationSection("not-dynamic")); + noStellium = new WaypointItemHandler(config.getConfigurationSection("not-enough-stellium")); + availWaypoint = new WaypointItemHandler(config.getConfigurationSection("display")); } @Override From d044fe3f3c7cdf3b3be9d1315970851e54091be8 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Fri, 4 Mar 2022 23:38:25 +0100 Subject: [PATCH 10/36] Added timer to default skill configs --- src/main/resources/default/skills/ambers.yml | 5 +++++ src/main/resources/default/skills/backstab.yml | 5 +++++ src/main/resources/default/skills/combo-attack.yml | 5 +++++ src/main/resources/default/skills/control.yml | 5 +++++ src/main/resources/default/skills/deep-wound.yml | 5 +++++ src/main/resources/default/skills/empowered-attack.yml | 5 +++++ src/main/resources/default/skills/evade.yml | 5 +++++ src/main/resources/default/skills/fire-berserker.yml | 5 +++++ src/main/resources/default/skills/fire-rage.yml | 5 +++++ src/main/resources/default/skills/fire-storm.yml | 5 +++++ src/main/resources/default/skills/fireball.yml | 5 +++++ src/main/resources/default/skills/furtive-strike.yml | 5 +++++ src/main/resources/default/skills/greater-healings.yml | 5 +++++ src/main/resources/default/skills/human-shield.yml | 5 +++++ src/main/resources/default/skills/ice-spikes.yml | 5 +++++ src/main/resources/default/skills/minor-healings.yml | 5 +++++ src/main/resources/default/skills/neptune-gift.yml | 5 +++++ src/main/resources/default/skills/power-mark.yml | 5 +++++ src/main/resources/default/skills/sneaky-picky.yml | 5 +++++ src/main/resources/default/skills/telekinesy.yml | 5 +++++ src/main/resources/default/skills/warp.yml | 5 +++++ src/main/resources/default/skills/weaken.yml | 5 +++++ 22 files changed, 110 insertions(+) diff --git a/src/main/resources/default/skills/ambers.yml b/src/main/resources/default/skills/ambers.yml index 24eab92a..35023490 100644 --- a/src/main/resources/default/skills/ambers.yml +++ b/src/main/resources/default/skills/ambers.yml @@ -31,3 +31,8 @@ percent: per-level: 0.1 max: 20.0 min: 10.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/backstab.yml b/src/main/resources/default/skills/backstab.yml index f8a6704b..7a5a0e53 100644 --- a/src/main/resources/default/skills/backstab.yml +++ b/src/main/resources/default/skills/backstab.yml @@ -18,3 +18,8 @@ extra: cooldown: base: 0.0 per-level: 0.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/combo-attack.yml b/src/main/resources/default/skills/combo-attack.yml index fb8b986f..54f1e90f 100644 --- a/src/main/resources/default/skills/combo-attack.yml +++ b/src/main/resources/default/skills/combo-attack.yml @@ -27,3 +27,8 @@ cooldown: count: base: 3.0 per-level: 0.2 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/control.yml b/src/main/resources/default/skills/control.yml index d674a4d8..0c639e53 100644 --- a/src/main/resources/default/skills/control.yml +++ b/src/main/resources/default/skills/control.yml @@ -27,3 +27,8 @@ cooldown: knockback: base: 30.0 per-level: 3.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/deep-wound.yml b/src/main/resources/default/skills/deep-wound.yml index bbb31d69..3d796093 100644 --- a/src/main/resources/default/skills/deep-wound.yml +++ b/src/main/resources/default/skills/deep-wound.yml @@ -26,3 +26,8 @@ cooldown: per-level: -0.1 max: 20.0 min: 5.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/empowered-attack.yml b/src/main/resources/default/skills/empowered-attack.yml index 05c1173b..572e1b22 100644 --- a/src/main/resources/default/skills/empowered-attack.yml +++ b/src/main/resources/default/skills/empowered-attack.yml @@ -32,3 +32,8 @@ ratio: per-level: 10.0 max: 100.0 min: 30.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/evade.yml b/src/main/resources/default/skills/evade.yml index 3be455a1..e159f9c6 100644 --- a/src/main/resources/default/skills/evade.yml +++ b/src/main/resources/default/skills/evade.yml @@ -22,3 +22,8 @@ stamina: cooldown: base: 20.0 per-level: 0.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/fire-berserker.yml b/src/main/resources/default/skills/fire-berserker.yml index f5cf6db3..0c05d3ac 100644 --- a/src/main/resources/default/skills/fire-berserker.yml +++ b/src/main/resources/default/skills/fire-berserker.yml @@ -15,3 +15,8 @@ stamina: extra: base: 10.0 per-level: 5.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/fire-rage.yml b/src/main/resources/default/skills/fire-rage.yml index b45746e4..11431fcd 100644 --- a/src/main/resources/default/skills/fire-rage.yml +++ b/src/main/resources/default/skills/fire-rage.yml @@ -33,3 +33,8 @@ cooldown: per-level: -0.1 max: 5.0 min: 1.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/fire-storm.yml b/src/main/resources/default/skills/fire-storm.yml index 57f4fc02..54fa94b1 100644 --- a/src/main/resources/default/skills/fire-storm.yml +++ b/src/main/resources/default/skills/fire-storm.yml @@ -27,3 +27,8 @@ cooldown: per-level: -0.1 max: 5.0 min: 1.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/fireball.yml b/src/main/resources/default/skills/fireball.yml index faec3105..6605c76b 100644 --- a/src/main/resources/default/skills/fireball.yml +++ b/src/main/resources/default/skills/fireball.yml @@ -33,3 +33,8 @@ cooldown: ratio: base: 50.0 per-level: 3.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/furtive-strike.yml b/src/main/resources/default/skills/furtive-strike.yml index ef1fd5e6..7090cff2 100644 --- a/src/main/resources/default/skills/furtive-strike.yml +++ b/src/main/resources/default/skills/furtive-strike.yml @@ -28,3 +28,8 @@ cooldown: radius: base: 7.0 per-level: 0.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/greater-healings.yml b/src/main/resources/default/skills/greater-healings.yml index 38fc7fe3..c18c3758 100644 --- a/src/main/resources/default/skills/greater-healings.yml +++ b/src/main/resources/default/skills/greater-healings.yml @@ -22,3 +22,8 @@ cooldown: per-level: -0.1 max: 5.0 min: 1.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/human-shield.yml b/src/main/resources/default/skills/human-shield.yml index 4c1bd8cf..05c63da0 100644 --- a/src/main/resources/default/skills/human-shield.yml +++ b/src/main/resources/default/skills/human-shield.yml @@ -38,3 +38,8 @@ reduction: per-level: 3.0 max: 70.0 min: 30.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/ice-spikes.yml b/src/main/resources/default/skills/ice-spikes.yml index c366f960..d9ed7e53 100644 --- a/src/main/resources/default/skills/ice-spikes.yml +++ b/src/main/resources/default/skills/ice-spikes.yml @@ -27,3 +27,8 @@ cooldown: per-level: -0.1 max: 6.0 min: 2.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/minor-healings.yml b/src/main/resources/default/skills/minor-healings.yml index 42c13963..d436ac6a 100644 --- a/src/main/resources/default/skills/minor-healings.yml +++ b/src/main/resources/default/skills/minor-healings.yml @@ -22,3 +22,8 @@ cooldown: per-level: -0.1 max: 5.0 min: 1.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/neptune-gift.yml b/src/main/resources/default/skills/neptune-gift.yml index e664b23b..a2ec7cfd 100644 --- a/src/main/resources/default/skills/neptune-gift.yml +++ b/src/main/resources/default/skills/neptune-gift.yml @@ -5,3 +5,8 @@ material: LILY_PAD extra: base: 30.0 per-level: 5.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/power-mark.yml b/src/main/resources/default/skills/power-mark.yml index 5ab415fe..fd829486 100644 --- a/src/main/resources/default/skills/power-mark.yml +++ b/src/main/resources/default/skills/power-mark.yml @@ -36,3 +36,8 @@ stun: ratio: base: 10.0 per-level: 5.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/sneaky-picky.yml b/src/main/resources/default/skills/sneaky-picky.yml index db00a5f1..846032ed 100644 --- a/src/main/resources/default/skills/sneaky-picky.yml +++ b/src/main/resources/default/skills/sneaky-picky.yml @@ -19,3 +19,8 @@ extra: cooldown: base: 0.0 per-level: 0.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/telekinesy.yml b/src/main/resources/default/skills/telekinesy.yml index f965da4e..0931d119 100644 --- a/src/main/resources/default/skills/telekinesy.yml +++ b/src/main/resources/default/skills/telekinesy.yml @@ -28,3 +28,8 @@ cooldown: knockback: base: 50.0 per-level: 10.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/warp.yml b/src/main/resources/default/skills/warp.yml index 9a98be5b..f3020a15 100644 --- a/src/main/resources/default/skills/warp.yml +++ b/src/main/resources/default/skills/warp.yml @@ -24,3 +24,8 @@ range: per-level: 1.0 max: 100.0 min: 0.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 diff --git a/src/main/resources/default/skills/weaken.yml b/src/main/resources/default/skills/weaken.yml index ad80071e..740e9ad4 100644 --- a/src/main/resources/default/skills/weaken.yml +++ b/src/main/resources/default/skills/weaken.yml @@ -28,3 +28,8 @@ cooldown: ratio: base: 30.0 per-level: 3.0 +timer: + base: 0.0 + per-level: 0.0 + max: 0.0 + min: 0.0 From 8b708e78ff604fccbab54f0dd403c674d6b785e3 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Fri, 4 Mar 2022 23:40:06 +0100 Subject: [PATCH 11/36] Revert "Added timer to default skill configs" This reverts commit d044fe3f --- src/main/resources/default/skills/ambers.yml | 5 ----- src/main/resources/default/skills/backstab.yml | 5 ----- src/main/resources/default/skills/combo-attack.yml | 5 ----- src/main/resources/default/skills/control.yml | 5 ----- src/main/resources/default/skills/deep-wound.yml | 5 ----- src/main/resources/default/skills/empowered-attack.yml | 5 ----- src/main/resources/default/skills/evade.yml | 5 ----- src/main/resources/default/skills/fire-berserker.yml | 5 ----- src/main/resources/default/skills/fire-rage.yml | 5 ----- src/main/resources/default/skills/fire-storm.yml | 5 ----- src/main/resources/default/skills/fireball.yml | 5 ----- src/main/resources/default/skills/furtive-strike.yml | 5 ----- src/main/resources/default/skills/greater-healings.yml | 5 ----- src/main/resources/default/skills/human-shield.yml | 5 ----- src/main/resources/default/skills/ice-spikes.yml | 5 ----- src/main/resources/default/skills/minor-healings.yml | 5 ----- src/main/resources/default/skills/neptune-gift.yml | 5 ----- src/main/resources/default/skills/power-mark.yml | 5 ----- src/main/resources/default/skills/sneaky-picky.yml | 5 ----- src/main/resources/default/skills/telekinesy.yml | 5 ----- src/main/resources/default/skills/warp.yml | 5 ----- src/main/resources/default/skills/weaken.yml | 5 ----- 22 files changed, 110 deletions(-) diff --git a/src/main/resources/default/skills/ambers.yml b/src/main/resources/default/skills/ambers.yml index 35023490..24eab92a 100644 --- a/src/main/resources/default/skills/ambers.yml +++ b/src/main/resources/default/skills/ambers.yml @@ -31,8 +31,3 @@ percent: per-level: 0.1 max: 20.0 min: 10.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/backstab.yml b/src/main/resources/default/skills/backstab.yml index 7a5a0e53..f8a6704b 100644 --- a/src/main/resources/default/skills/backstab.yml +++ b/src/main/resources/default/skills/backstab.yml @@ -18,8 +18,3 @@ extra: cooldown: base: 0.0 per-level: 0.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/combo-attack.yml b/src/main/resources/default/skills/combo-attack.yml index 54f1e90f..fb8b986f 100644 --- a/src/main/resources/default/skills/combo-attack.yml +++ b/src/main/resources/default/skills/combo-attack.yml @@ -27,8 +27,3 @@ cooldown: count: base: 3.0 per-level: 0.2 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/control.yml b/src/main/resources/default/skills/control.yml index 0c639e53..d674a4d8 100644 --- a/src/main/resources/default/skills/control.yml +++ b/src/main/resources/default/skills/control.yml @@ -27,8 +27,3 @@ cooldown: knockback: base: 30.0 per-level: 3.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/deep-wound.yml b/src/main/resources/default/skills/deep-wound.yml index 3d796093..bbb31d69 100644 --- a/src/main/resources/default/skills/deep-wound.yml +++ b/src/main/resources/default/skills/deep-wound.yml @@ -26,8 +26,3 @@ cooldown: per-level: -0.1 max: 20.0 min: 5.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/empowered-attack.yml b/src/main/resources/default/skills/empowered-attack.yml index 572e1b22..05c1173b 100644 --- a/src/main/resources/default/skills/empowered-attack.yml +++ b/src/main/resources/default/skills/empowered-attack.yml @@ -32,8 +32,3 @@ ratio: per-level: 10.0 max: 100.0 min: 30.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/evade.yml b/src/main/resources/default/skills/evade.yml index e159f9c6..3be455a1 100644 --- a/src/main/resources/default/skills/evade.yml +++ b/src/main/resources/default/skills/evade.yml @@ -22,8 +22,3 @@ stamina: cooldown: base: 20.0 per-level: 0.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/fire-berserker.yml b/src/main/resources/default/skills/fire-berserker.yml index 0c05d3ac..f5cf6db3 100644 --- a/src/main/resources/default/skills/fire-berserker.yml +++ b/src/main/resources/default/skills/fire-berserker.yml @@ -15,8 +15,3 @@ stamina: extra: base: 10.0 per-level: 5.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/fire-rage.yml b/src/main/resources/default/skills/fire-rage.yml index 11431fcd..b45746e4 100644 --- a/src/main/resources/default/skills/fire-rage.yml +++ b/src/main/resources/default/skills/fire-rage.yml @@ -33,8 +33,3 @@ cooldown: per-level: -0.1 max: 5.0 min: 1.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/fire-storm.yml b/src/main/resources/default/skills/fire-storm.yml index 54fa94b1..57f4fc02 100644 --- a/src/main/resources/default/skills/fire-storm.yml +++ b/src/main/resources/default/skills/fire-storm.yml @@ -27,8 +27,3 @@ cooldown: per-level: -0.1 max: 5.0 min: 1.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/fireball.yml b/src/main/resources/default/skills/fireball.yml index 6605c76b..faec3105 100644 --- a/src/main/resources/default/skills/fireball.yml +++ b/src/main/resources/default/skills/fireball.yml @@ -33,8 +33,3 @@ cooldown: ratio: base: 50.0 per-level: 3.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/furtive-strike.yml b/src/main/resources/default/skills/furtive-strike.yml index 7090cff2..ef1fd5e6 100644 --- a/src/main/resources/default/skills/furtive-strike.yml +++ b/src/main/resources/default/skills/furtive-strike.yml @@ -28,8 +28,3 @@ cooldown: radius: base: 7.0 per-level: 0.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/greater-healings.yml b/src/main/resources/default/skills/greater-healings.yml index c18c3758..38fc7fe3 100644 --- a/src/main/resources/default/skills/greater-healings.yml +++ b/src/main/resources/default/skills/greater-healings.yml @@ -22,8 +22,3 @@ cooldown: per-level: -0.1 max: 5.0 min: 1.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/human-shield.yml b/src/main/resources/default/skills/human-shield.yml index 05c63da0..4c1bd8cf 100644 --- a/src/main/resources/default/skills/human-shield.yml +++ b/src/main/resources/default/skills/human-shield.yml @@ -38,8 +38,3 @@ reduction: per-level: 3.0 max: 70.0 min: 30.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/ice-spikes.yml b/src/main/resources/default/skills/ice-spikes.yml index d9ed7e53..c366f960 100644 --- a/src/main/resources/default/skills/ice-spikes.yml +++ b/src/main/resources/default/skills/ice-spikes.yml @@ -27,8 +27,3 @@ cooldown: per-level: -0.1 max: 6.0 min: 2.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/minor-healings.yml b/src/main/resources/default/skills/minor-healings.yml index d436ac6a..42c13963 100644 --- a/src/main/resources/default/skills/minor-healings.yml +++ b/src/main/resources/default/skills/minor-healings.yml @@ -22,8 +22,3 @@ cooldown: per-level: -0.1 max: 5.0 min: 1.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/neptune-gift.yml b/src/main/resources/default/skills/neptune-gift.yml index a2ec7cfd..e664b23b 100644 --- a/src/main/resources/default/skills/neptune-gift.yml +++ b/src/main/resources/default/skills/neptune-gift.yml @@ -5,8 +5,3 @@ material: LILY_PAD extra: base: 30.0 per-level: 5.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/power-mark.yml b/src/main/resources/default/skills/power-mark.yml index fd829486..5ab415fe 100644 --- a/src/main/resources/default/skills/power-mark.yml +++ b/src/main/resources/default/skills/power-mark.yml @@ -36,8 +36,3 @@ stun: ratio: base: 10.0 per-level: 5.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/sneaky-picky.yml b/src/main/resources/default/skills/sneaky-picky.yml index 846032ed..db00a5f1 100644 --- a/src/main/resources/default/skills/sneaky-picky.yml +++ b/src/main/resources/default/skills/sneaky-picky.yml @@ -19,8 +19,3 @@ extra: cooldown: base: 0.0 per-level: 0.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/telekinesy.yml b/src/main/resources/default/skills/telekinesy.yml index 0931d119..f965da4e 100644 --- a/src/main/resources/default/skills/telekinesy.yml +++ b/src/main/resources/default/skills/telekinesy.yml @@ -28,8 +28,3 @@ cooldown: knockback: base: 50.0 per-level: 10.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/warp.yml b/src/main/resources/default/skills/warp.yml index f3020a15..9a98be5b 100644 --- a/src/main/resources/default/skills/warp.yml +++ b/src/main/resources/default/skills/warp.yml @@ -24,8 +24,3 @@ range: per-level: 1.0 max: 100.0 min: 0.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 diff --git a/src/main/resources/default/skills/weaken.yml b/src/main/resources/default/skills/weaken.yml index 740e9ad4..ad80071e 100644 --- a/src/main/resources/default/skills/weaken.yml +++ b/src/main/resources/default/skills/weaken.yml @@ -28,8 +28,3 @@ cooldown: ratio: base: 30.0 per-level: 3.0 -timer: - base: 0.0 - per-level: 0.0 - max: 0.0 - min: 0.0 From bcf519e6f5ed9a23d1b038823877f8952d71d97a Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 5 Mar 2022 00:04:29 +0100 Subject: [PATCH 12/36] cleanup --- .../java/net/Indyuce/mmocore/api/MMOCoreAPI.java | 12 +++++------- .../java/net/Indyuce/mmocore/skill/ClassSkill.java | 9 +++++---- .../net/Indyuce/mmocore/skill/RegisteredSkill.java | 3 --- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/main/java/net/Indyuce/mmocore/api/MMOCoreAPI.java b/src/main/java/net/Indyuce/mmocore/api/MMOCoreAPI.java index a5a65a3c..1a843613 100644 --- a/src/main/java/net/Indyuce/mmocore/api/MMOCoreAPI.java +++ b/src/main/java/net/Indyuce/mmocore/api/MMOCoreAPI.java @@ -2,12 +2,9 @@ package net.Indyuce.mmocore.api; import io.lumine.mythic.lib.api.player.EquipmentSlot; import io.lumine.mythic.lib.player.PlayerMetadata; -import io.lumine.mythic.lib.skill.SimpleSkill; -import io.lumine.mythic.lib.skill.Skill; import io.lumine.mythic.lib.skill.handler.SkillHandler; import io.lumine.mythic.lib.skill.result.SkillResult; import io.lumine.mythic.lib.skill.trigger.TriggerMetadata; -import io.lumine.mythic.lib.skill.trigger.TriggerType; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.party.AbstractParty; @@ -18,6 +15,8 @@ import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; +import java.util.Objects; + public class MMOCoreAPI { private final JavaPlugin plugin; @@ -87,7 +86,7 @@ public class MMOCoreAPI { public SkillResult cast(PlayerData playerData, RegisteredSkill skill, int level) { PlayerMetadata casterMeta = playerData.getMMOPlayerData().getStatMap().cache(EquipmentSlot.MAIN_HAND); TriggerMetadata triggerMeta = new TriggerMetadata(casterMeta, null, null); - return new CastableSkill(new ClassSkill(skill, 0), level).cast(triggerMeta); + return new CastableSkill(new ClassSkill(skill, 0, 0), level).cast(triggerMeta); } /** @@ -110,8 +109,7 @@ public class MMOCoreAPI { public SkillResult cast(PlayerData playerData, SkillHandler skill, int level) { PlayerMetadata casterMeta = playerData.getMMOPlayerData().getStatMap().cache(EquipmentSlot.MAIN_HAND); TriggerMetadata triggerMeta = new TriggerMetadata(casterMeta, null, null); - RegisteredSkill registered = MMOCore.plugin.skillManager.getSkill(skill.getId()); - Skill cast = registered == null ? new SimpleSkill(TriggerType.CAST, skill) : new CastableSkill(new ClassSkill(registered, 0), level); - return cast.cast(triggerMeta); + RegisteredSkill registered = Objects.requireNonNull(MMOCore.plugin.skillManager.getSkill(skill.getId()), "Could not find registered skill with such handler"); + return new CastableSkill(new ClassSkill(registered, 0, 0), level).cast(triggerMeta); } } diff --git a/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java b/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java index f87e6f44..1d72842b 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java +++ b/src/main/java/net/Indyuce/mmocore/skill/ClassSkill.java @@ -17,13 +17,14 @@ public class ClassSkill implements CooldownObject { private final int unlockLevel, maxSkillLevel; private final Map modifiers = new HashMap<>(); - public ClassSkill(RegisteredSkill skill, int unlockLevel) { - this(skill, unlockLevel, 0); - } - /** * Class used to save information about skills IN A CLASS CONTEXT i.e at * which level the skill can be unlocked, etc. + *

+ * This constructor can be used by other plugins to register class skills + * directly without the use of class config files. + *

+ * It is also used by the MMOCore API to force players to cast abilities. */ public ClassSkill(RegisteredSkill skill, int unlockLevel, int maxSkillLevel) { this.skill = skill; diff --git a/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java b/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java index 7c21e8d8..8fb2b970 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java +++ b/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java @@ -5,7 +5,6 @@ import io.lumine.mythic.lib.skill.handler.SkillHandler; import io.lumine.mythic.lib.skill.trigger.TriggerType; import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.api.util.math.formula.LinearValue; -import org.apache.commons.lang.Validate; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; @@ -18,7 +17,6 @@ import java.util.Objects; public class RegisteredSkill { private final SkillHandler handler; - private final String name; private final Map defaultModifiers = new HashMap<>(); private final ItemStack icon; @@ -28,7 +26,6 @@ public class RegisteredSkill { public RegisteredSkill(SkillHandler handler, ConfigurationSection config) { this.handler = handler; - name = Objects.requireNonNull(config.getString("name"), "Could not find skill name"); icon = MMOCoreUtils.readIcon(Objects.requireNonNull(config.getString("material"), "Could not find skill icon")); lore = Objects.requireNonNull(config.getStringList("lore"), "Could not find skill lore"); From 1017bff05dcea487d78c925346de90aa9bfb470b Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 5 Mar 2022 00:17:41 +0100 Subject: [PATCH 13/36] Fixed an issue with default skills and /mmocore reload --- src/main/java/net/Indyuce/mmocore/MMOCore.java | 5 ----- .../java/net/Indyuce/mmocore/manager/SkillManager.java | 8 ++++++++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/Indyuce/mmocore/MMOCore.java b/src/main/java/net/Indyuce/mmocore/MMOCore.java index b2566216..ae84ddd9 100644 --- a/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -130,11 +130,6 @@ public class MMOCore extends LuminePlugin { if (Bukkit.getPluginManager().getPlugin("MythicMobs") != null) loadManager.registerLoader(new MythicMobsMMOLoader()); - - // Register MMOCore specific skills - MythicLib.plugin.getSkills().registerSkillHandler(new Ambers()); - MythicLib.plugin.getSkills().registerSkillHandler(new Neptune_Gift()); - MythicLib.plugin.getSkills().registerSkillHandler(new Sneaky_Picky()); } public void enable() { diff --git a/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java b/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java index f5949003..9febb1ef 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java @@ -6,6 +6,9 @@ import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigFile; import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.skill.RegisteredSkill; +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.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -46,6 +49,11 @@ public class SkillManager implements MMOCoreManager { if (clearBefore) skills.clear(); + // Register MMOCore specific skills + MythicLib.plugin.getSkills().registerSkillHandler(new Ambers()); + MythicLib.plugin.getSkills().registerSkillHandler(new Neptune_Gift()); + MythicLib.plugin.getSkills().registerSkillHandler(new Sneaky_Picky()); + // Check for default files File skillFolder = new File(MMOCore.plugin.getDataFolder() + "/skills"); if (!skillFolder.exists()) From 6896d06657d7cb71c6bd367505420e5163ddfc8e Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 5 Mar 2022 00:46:07 +0100 Subject: [PATCH 14/36] MM based skills now reload when using /mm reload --- .../Indyuce/mmocore/api/player/profess/PlayerClass.java | 1 + .../net/Indyuce/mmocore/comp/mythicmobs/MythicHook.java | 7 ++----- 2 files changed, 3 insertions(+), 5 deletions(-) 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 3cd04908..e2393bf6 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 @@ -375,6 +375,7 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { return found == null ? Optional.empty() : Optional.of(found); } + @Nullable public ClassSkill getSkill(String id) { return skills.get(id); } diff --git a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicHook.java b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicHook.java index f680b621..9bf70be8 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicHook.java +++ b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicHook.java @@ -10,15 +10,10 @@ import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute; import net.Indyuce.mmocore.api.player.attribute.PlayerAttributes; import net.Indyuce.mmocore.comp.mythicmobs.load.CurrencyItemDrop; import net.Indyuce.mmocore.comp.mythicmobs.load.GoldPouchDrop; -import net.Indyuce.mmocore.skill.RegisteredSkill; -import org.apache.commons.lang.Validate; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import java.util.Optional; -import java.util.logging.Level; - public class MythicHook implements Listener { public MythicHook() { registerPlaceholders(); @@ -48,6 +43,8 @@ public class MythicHook implements Listener { // Reload skills MMOCore.plugin.skillManager.initialize(true); + MMOCore.plugin.classManager.initialize(true); + PlayerData.getAll().forEach(PlayerData::update); } private void registerPlaceholders() { From 611cdb390bf3c96e5d0e5fecf159718b501ba140 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 5 Mar 2022 10:05:08 +0100 Subject: [PATCH 15/36] Fixed issue with waypoint costs --- src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java | 5 +++-- .../java/net/Indyuce/mmocore/waypoint/WaypointOption.java | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) 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 7d318220..5e0c6ee5 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java @@ -467,7 +467,8 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc */ setLastActivity(PlayerActivity.USE_WAYPOINT); - giveStellium(-waypoint.getCost(costType), PlayerResourceUpdateEvent.UpdateReason.USE_WAYPOINT); + final double cost = waypoint.getCost(costType); + giveStellium(-cost, PlayerResourceUpdateEvent.UpdateReason.USE_WAYPOINT); new BukkitRunnable() { final int x = getPlayer().getLocation().getBlockX(); @@ -482,7 +483,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc || getPlayer().getLocation().getBlockZ() != z) { MMOCore.plugin.soundManager.getSound(SoundEvent.WARP_CANCELLED).playTo(getPlayer()); MMOCore.plugin.configManager.getSimpleMessage("warping-canceled").send(getPlayer()); - giveStellium(waypoint.getCost(CostType.NORMAL_USE), PlayerResourceUpdateEvent.UpdateReason.SKILL_REGENERATION); + giveStellium(cost, PlayerResourceUpdateEvent.UpdateReason.USE_WAYPOINT); cancel(); return; } diff --git a/src/main/java/net/Indyuce/mmocore/waypoint/WaypointOption.java b/src/main/java/net/Indyuce/mmocore/waypoint/WaypointOption.java index 65a3b582..d9f626d5 100644 --- a/src/main/java/net/Indyuce/mmocore/waypoint/WaypointOption.java +++ b/src/main/java/net/Indyuce/mmocore/waypoint/WaypointOption.java @@ -17,7 +17,8 @@ public enum WaypointOption { ENABLE_MENU(true), /** - * By defaut, players must stand into + * By default waypoints are not dynamic. Players need to be standing on + * ANOTHER waypoint to be able to teleport to other waypoints. */ DYNAMIC(false), From be22442a7816d2ecca281ec3711f9cbe0c771a33 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 5 Mar 2022 10:05:47 +0100 Subject: [PATCH 16/36] MMOCore 1.9.2 dev build --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 02fabaae..0063fa66 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 net.Indyuce MMOCore - 1.9.1 + 1.9.2 MMOCore Offer your players a brand new RPG experience!! From 9727f02051df1b5153f771aea5a004c030f52e53 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 5 Mar 2022 10:31:40 +0100 Subject: [PATCH 17/36] 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); } } From 7d5f2fd9f27231713a79cd6a442c9bdedb9e3808 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 5 Mar 2022 10:40:53 +0100 Subject: [PATCH 18/36] MMOCore managers are now marked final --- .../java/net/Indyuce/mmocore/MMOCore.java | 30 ++++++------ .../mmocore/manager/ConfigItemManager.java | 47 +++++++++++-------- .../Indyuce/mmocore/manager/SoundManager.java | 18 ++++--- .../manager/social/RequestManager.java | 42 +++++++++++------ 4 files changed, 82 insertions(+), 55 deletions(-) diff --git a/src/main/java/net/Indyuce/mmocore/MMOCore.java b/src/main/java/net/Indyuce/mmocore/MMOCore.java index 95e70504..635b32b2 100644 --- a/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -61,11 +61,10 @@ import java.util.logging.Level; public class MMOCore extends LuminePlugin { public static MMOCore plugin; - public ConfigManager configManager; public final WaypointManager waypointManager = new WaypointManager(); - public SoundManager soundManager; - public RequestManager requestManager; - public ConfigItemManager configItems; + public final SoundManager soundManager = new SoundManager(); + public final RequestManager requestManager = new RequestManager(); + public final ConfigItemManager configItems = new ConfigItemManager(); public final PlayerActionBar actionBarManager = new PlayerActionBar(); public final SkillManager skillManager = new SkillManager(); public final ClassManager classManager = new ClassManager(); @@ -82,6 +81,15 @@ public class MMOCore extends LuminePlugin { @Deprecated public final SkillTreeManager skillTreeManager = new SkillTreeManager(); + // Profession managers + public final CustomBlockManager mineManager = new CustomBlockManager(); + public final FishingManager fishingManager = new FishingManager(); + public final AlchemyManager alchemyManager = new AlchemyManager(); + public final EnchantManager enchantManager = new EnchantManager(); + public final SmithingManager smithingManager = new SmithingManager(); + + @NotNull + public ConfigManager configManager; public VaultEconomy economy; public RegionHandler regionHandler = new DefaultRegionHandler(); public PlaceholderParser placeholderParser = new DefaultParser(); @@ -91,13 +99,6 @@ public class MMOCore extends LuminePlugin { @NotNull public PartyModule partyModule; - // Profession managers - public final CustomBlockManager mineManager = new CustomBlockManager(); - public final FishingManager fishingManager = new FishingManager(); - public final AlchemyManager alchemyManager = new AlchemyManager(); - public final EnchantManager enchantManager = new EnchantManager(); - public final SmithingManager smithingManager = new SmithingManager(); - public boolean shouldDebugSQL = false; private static final int MYTHICLIB_COMPATIBILITY_INDEX = 7; @@ -408,10 +409,9 @@ public class MMOCore extends LuminePlugin { lootChests.initialize(clearBefore); restrictionManager.initialize(clearBefore); waypointManager.initialize(clearBefore); - - requestManager = new RequestManager(); - soundManager = new SoundManager(new ConfigFile("sounds").getConfig()); - configItems = new ConfigItemManager(new ConfigFile("items").getConfig()); + requestManager.initialize(clearBefore); + soundManager.initialize(clearBefore); + configItems.initialize(clearBefore); if (getConfig().isConfigurationSection("action-bar")) actionBarManager.reload(getConfig().getConfigurationSection("action-bar")); diff --git a/src/main/java/net/Indyuce/mmocore/manager/ConfigItemManager.java b/src/main/java/net/Indyuce/mmocore/manager/ConfigItemManager.java index 3714e5fb..46439ec5 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/ConfigItemManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/ConfigItemManager.java @@ -1,31 +1,38 @@ package net.Indyuce.mmocore.manager; +import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.ConfigFile; +import net.Indyuce.mmocore.util.item.ConfigItem; +import org.bukkit.configuration.file.FileConfiguration; +import org.jetbrains.annotations.Nullable; + import java.util.HashMap; import java.util.Map; import java.util.logging.Level; -import org.bukkit.configuration.file.FileConfiguration; +public class ConfigItemManager implements MMOCoreManager { + private final Map map = new HashMap<>(); -import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.util.item.ConfigItem; + public void register(ConfigItem item) { + map.put(item.getId(), item); + } -public class ConfigItemManager { - private final Map map = new HashMap<>(); + @Nullable + public ConfigItem get(String id) { + return map.get(id); + } - public ConfigItemManager(FileConfiguration config) { - for (String key : config.getKeys(false)) - try { - register(new ConfigItem(config.getConfigurationSection(key))); - } catch (NullPointerException | IllegalArgumentException exception) { - MMOCore.plugin.getLogger().log(Level.WARNING, "Could not load config item " + key); - } - } + @Override + public void initialize(boolean clearBefore) { + if (clearBefore) + map.clear(); - public void register(ConfigItem item) { - map.put(item.getId(), item); - } - - public ConfigItem get(String id) { - return map.get(id); - } + FileConfiguration config = new ConfigFile("items").getConfig(); + for (String key : config.getKeys(false)) + try { + register(new ConfigItem(config.getConfigurationSection(key))); + } catch (NullPointerException | IllegalArgumentException exception) { + MMOCore.plugin.getLogger().log(Level.WARNING, "Could not load config item " + key); + } + } } diff --git a/src/main/java/net/Indyuce/mmocore/manager/SoundManager.java b/src/main/java/net/Indyuce/mmocore/manager/SoundManager.java index b64c47a5..cd488546 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/SoundManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/SoundManager.java @@ -1,5 +1,6 @@ package net.Indyuce.mmocore.manager; +import net.Indyuce.mmocore.api.ConfigFile; import net.Indyuce.mmocore.api.SoundEvent; import net.Indyuce.mmocore.api.SoundObject; import org.bukkit.configuration.file.FileConfiguration; @@ -9,16 +10,21 @@ import java.util.HashMap; import java.util.Map; import java.util.Objects; -public class SoundManager { +public class SoundManager implements MMOCoreManager { private final Map sounds = new HashMap<>(); - public SoundManager(FileConfiguration config) { - for (SoundEvent sound : SoundEvent.values()) - sounds.put(sound, new SoundObject(config.getString(sound.name().replace("_", "-").toLowerCase()))); - } - @NotNull public SoundObject getSound(SoundEvent event) { return Objects.requireNonNull(sounds.get(event), "Could not find sound for " + event.name()); } + + @Override + public void initialize(boolean clearBefore) { + if (clearBefore) + sounds.clear(); + + FileConfiguration config = new ConfigFile("sounds").getConfig(); + for (SoundEvent sound : SoundEvent.values()) + sounds.put(sound, new SoundObject(config.getString(sound.name().replace("_", "-").toLowerCase()))); + } } diff --git a/src/main/java/net/Indyuce/mmocore/manager/social/RequestManager.java b/src/main/java/net/Indyuce/mmocore/manager/social/RequestManager.java index aa882b0e..d6b1a70b 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/social/RequestManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/social/RequestManager.java @@ -2,35 +2,35 @@ package net.Indyuce.mmocore.manager.social; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.social.Request; +import net.Indyuce.mmocore.manager.MMOCoreManager; import org.bukkit.Bukkit; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.UUID; +import java.util.*; -public class RequestManager { +public class RequestManager implements MMOCoreManager { private final Map requests = new HashMap<>(); - /** - * Flushes friend requests every 5 minutes so there is no memory overleak - */ - public RequestManager() { - Bukkit.getScheduler().runTaskTimer(MMOCore.plugin, this::flushRequests, 60 * 20, 60 * 20 * 5); - } + private boolean ENABLED; + @NotNull public Request getRequest(UUID uuid) { - return requests.get(uuid); + return Objects.requireNonNull(requests.get(uuid), "Could not find request with UUID '" + uuid.toString() + "'"); } public void registerRequest(Request request) { requests.put(request.getUniqueId(), request); } - public void unregisterRequest(UUID uuid) { - requests.remove(uuid); + @Nullable + public Request unregisterRequest(UUID uuid) { + return requests.remove(uuid); } + /** + * Flushes friend, guild or party invites every 5 minutes to prevent memory leaks + */ private void flushRequests() { for (Iterator iterator = requests.values().iterator(); iterator.hasNext(); ) { Request next = iterator.next(); @@ -38,4 +38,18 @@ public class RequestManager { iterator.remove(); } } + + /** + * The request map is NOT cleared, whatever state of the clearBefore + * boolean as it's useless because they are guaranteed to disappear with time. + * + * @param clearBefore Useless here + */ + @Override + public void initialize(boolean clearBefore) { + if (!ENABLED) { + Bukkit.getScheduler().runTaskTimer(MMOCore.plugin, this::flushRequests, 60 * 20, 60 * 20 * 5); + ENABLED = true; + } + } } From 3336637333adc6c35e05eee9bcb7f304f6c7e15a Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 5 Mar 2022 10:42:52 +0100 Subject: [PATCH 19/36] Oe --- src/main/java/net/Indyuce/mmocore/MMOCore.java | 2 -- src/main/java/net/Indyuce/mmocore/manager/SkillManager.java | 4 +++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/Indyuce/mmocore/MMOCore.java b/src/main/java/net/Indyuce/mmocore/MMOCore.java index 635b32b2..b5a92b77 100644 --- a/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -387,8 +387,6 @@ public class MMOCore extends LuminePlugin { configManager = new ConfigManager(); - if (clearBefore) - MythicLib.plugin.getSkills().initialize(true); skillManager.initialize(clearBefore); mineManager.initialize(clearBefore); partyManager.initialize(clearBefore); diff --git a/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java b/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java index 9febb1ef..303e5635 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java @@ -46,8 +46,10 @@ public class SkillManager implements MMOCoreManager { public void initialize(boolean clearBefore) { - if (clearBefore) + if (clearBefore) { + MythicLib.plugin.getSkills().initialize(true); skills.clear(); + } // Register MMOCore specific skills MythicLib.plugin.getSkills().registerSkillHandler(new Ambers()); From 3f16202f03ea61c893a7b4371ff28caadf67a82a Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 5 Mar 2022 10:48:47 +0100 Subject: [PATCH 20/36] Small waypoint change --- .../java/net/Indyuce/mmocore/waypoint/CostType.java | 3 ++- src/main/resources/default/waypoints.yml | 10 ++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/Indyuce/mmocore/waypoint/CostType.java b/src/main/java/net/Indyuce/mmocore/waypoint/CostType.java index 64719615..6a0fefaa 100644 --- a/src/main/java/net/Indyuce/mmocore/waypoint/CostType.java +++ b/src/main/java/net/Indyuce/mmocore/waypoint/CostType.java @@ -15,7 +15,8 @@ public enum CostType { /** * When setting your spawn point to this waypoint. */ - SET_SPAWNPOINT; + // SET_SPAWNPOINT + ; private final String path; diff --git a/src/main/resources/default/waypoints.yml b/src/main/resources/default/waypoints.yml index 8613282a..32df80e7 100644 --- a/src/main/resources/default/waypoints.yml +++ b/src/main/resources/default/waypoints.yml @@ -28,10 +28,16 @@ spawn: # by sneaking on it (true by default) unlockable: true - # When enabled, players can teleport to other - #waypoints when sneaking (true by default) + # When enabled, opens up the teleportation menu + # when sneaking (true by default) enable-menu: true + # When set to true (false by default) players don't + # have to be standing on any waypoint to teleport + # to that waypoint. This could be a nice option for + # spawn waypoints alongside with the 'default' option. + dynamic: false + # Should be waypoint be unlocked by default? default: true From dca18c993dc9fc33f14a86fb46b9fadc36101b82 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 5 Mar 2022 10:53:24 +0100 Subject: [PATCH 21/36] Changed waypoint default config --- src/main/resources/default/waypoints.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/resources/default/waypoints.yml b/src/main/resources/default/waypoints.yml index 32df80e7..59999359 100644 --- a/src/main/resources/default/waypoints.yml +++ b/src/main/resources/default/waypoints.yml @@ -41,6 +41,14 @@ spawn: # Should be waypoint be unlocked by default? default: true + # All the waypoints you can teleport to when standing + # on that waypoint. If that list is empty you are able + # to teleport to any waypoint + linked: + - spawn1 + - spawn2 + - forest + spawn1: name: Spawn1 location: 'world 69 71 136 136 0' From c3f51a3520052cabea4c925947aefa3dea31e12b Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 5 Mar 2022 12:04:11 +0100 Subject: [PATCH 22/36] Fixed an issue with fishing weights --- .../dropitem/fishing/FishingDropItem.java | 22 +++++++++---------- .../manager/profession/FishingManager.java | 10 ++++----- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/Indyuce/mmocore/loot/droptable/dropitem/fishing/FishingDropItem.java b/src/main/java/net/Indyuce/mmocore/loot/droptable/dropitem/fishing/FishingDropItem.java index b1754716..7762aa7b 100644 --- a/src/main/java/net/Indyuce/mmocore/loot/droptable/dropitem/fishing/FishingDropItem.java +++ b/src/main/java/net/Indyuce/mmocore/loot/droptable/dropitem/fishing/FishingDropItem.java @@ -1,34 +1,31 @@ package net.Indyuce.mmocore.loot.droptable.dropitem.fishing; +import io.lumine.mythic.lib.api.MMOLineConfig; +import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.util.math.formula.RandomAmount; +import net.Indyuce.mmocore.loot.LootBuilder; +import net.Indyuce.mmocore.loot.droptable.dropitem.DropItem; import org.apache.commons.lang.Validate; import org.bukkit.inventory.ItemStack; - -import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.loot.droptable.dropitem.DropItem; -import net.Indyuce.mmocore.loot.LootBuilder; -import net.Indyuce.mmocore.api.util.math.formula.RandomAmount; -import io.lumine.mythic.lib.api.MMOLineConfig; +import org.jetbrains.annotations.Nullable; public class FishingDropItem { private final RandomAmount experience, tugs; private final DropItem dropItem; - private final int weight; - public FishingDropItem(MMOLineConfig config) { config.validate("tugs", "experience"); tugs = new RandomAmount(config.getString("tugs")); experience = new RandomAmount(config.getString("experience")); - weight = config.getInt("weight", 1); - Validate.isTrue(weight > 0, "A fishing drop table item cannot have 0 weight"); - dropItem = MMOCore.plugin.loadManager.loadDropItem(config); + Validate.isTrue(dropItem.getWeight() > 0, "A fishing drop table item must have a strictly positive weight"); } + @Deprecated public int getWeight() { - return weight; + return (int) Math.floor(getItem().getWeight()); } public DropItem getItem() { @@ -55,6 +52,7 @@ public class FishingDropItem { return dropItem; } + @Nullable public ItemStack collect(LootBuilder builder) { dropItem.collect(builder); return builder.getLoot().stream().findAny().orElse(null); diff --git a/src/main/java/net/Indyuce/mmocore/manager/profession/FishingManager.java b/src/main/java/net/Indyuce/mmocore/manager/profession/FishingManager.java index 4c400de1..aa9e1738 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/profession/FishingManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/profession/FishingManager.java @@ -15,7 +15,7 @@ import java.util.logging.Level; public class FishingManager extends SpecificProfessionManager { private final Set tables = new LinkedHashSet<>(); - private static final Random random = new Random(); + private static final Random RANDOM = new Random(); public FishingManager() { super("on-fish"); @@ -44,7 +44,7 @@ public class FishingManager extends SpecificProfessionManager { public static class FishingDropTable { private final Set conditions = new HashSet<>(); private final List items = new ArrayList<>(); - private int maxWeight = 0; + private double maxWeight = 0; public FishingDropTable(ConfigurationSection section) { Validate.notNull(section, "Could not load config"); @@ -69,8 +69,8 @@ public class FishingManager extends SpecificProfessionManager { for (String str : list) try { FishingDropItem dropItem = new FishingDropItem(new MMOLineConfig(str)); - maxWeight += dropItem.getWeight(); items.add(dropItem); + maxWeight += dropItem.getItem().getWeight(); } catch (RuntimeException exception) { MMOCore.plugin.getLogger().log(Level.WARNING, "Could not load item '" + str + "' from fishing drop table '" + id + "': " + exception.getMessage()); @@ -91,10 +91,10 @@ public class FishingManager extends SpecificProfessionManager { } public FishingDropItem getRandomItem() { - int randomCoefficient = random.nextInt(maxWeight); + double randomCoefficient = RANDOM.nextDouble() * maxWeight; for (FishingDropItem item : items) - if ((randomCoefficient -= item.getWeight()) <= 0) + if ((randomCoefficient -= item.getItem().getWeight()) <= 0) return item; throw new NullPointerException("Could not find item in drop table"); From 848b4023938434ed1fa3437a454d7399c3c1cd14 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 5 Mar 2022 12:17:17 +0100 Subject: [PATCH 23/36] Fixed fishing tugs --- .../listener/profession/FishingListener.java | 116 ++++++++++-------- .../profession/SpecificProfessionManager.java | 6 +- 2 files changed, 68 insertions(+), 54 deletions(-) diff --git a/src/main/java/net/Indyuce/mmocore/listener/profession/FishingListener.java b/src/main/java/net/Indyuce/mmocore/listener/profession/FishingListener.java index 6a5a0451..76984660 100644 --- a/src/main/java/net/Indyuce/mmocore/listener/profession/FishingListener.java +++ b/src/main/java/net/Indyuce/mmocore/listener/profession/FishingListener.java @@ -36,7 +36,7 @@ import java.util.UUID; public class FishingListener implements Listener { private final Set fishing = new HashSet<>(); - private static final Random random = new Random(); + private static final Random RANDOM = new Random(); @EventHandler(priority = EventPriority.LOW) public void a(PlayerFishEvent event) { @@ -65,9 +65,9 @@ public class FishingListener implements Listener { private final Player player; private final FishHook hook; - private final int total, exp; + private final int fishStrength, experienceDropped; - private int pulls; + private int currentPulls; /** * Used to track the last time the player swung the fishing rod. @@ -84,16 +84,20 @@ public class FishingListener implements Listener { this.playerData = PlayerData.get(this.player = player); this.hook = hook; - this.total = (int) (caught.rollTugs() * (1 - PlayerData.get(player).getStats().getStat(StatType.FISHING_STRENGTH) / 100)); - this.exp = caught.rollExperience(); + this.fishStrength = (int) Math.floor(caught.rollTugs() * (1 - PlayerData.get(player).getStats().getStat(StatType.FISHING_STRENGTH) / 100)); + this.experienceDropped = caught.rollExperience(); fishing.add(player.getUniqueId()); runTaskTimer(MMOCore.plugin, 0, 2); Bukkit.getPluginManager().registerEvents(this, MMOCore.plugin); + + // Check for instant loot + if (fishStrength == 0) + lootFish(); } public void criticalFish() { - pulls = total + 2; + currentPulls = fishStrength + 2; } public boolean isTimedOut() { @@ -105,14 +109,15 @@ public class FishingListener implements Listener { */ public boolean pull() { last = System.currentTimeMillis(); - return pulls++ > total; + currentPulls++; + return currentPulls >= fishStrength; } /** * Critical fish's means you catch the fish on the very first try */ public boolean isCrit() { - return pulls > total + 1; + return currentPulls > fishStrength + 1; } private void close() { @@ -128,7 +133,7 @@ public class FishingListener implements Listener { if (isTimedOut()) close(); - location.getWorld().spawnParticle(Particle.CRIT, location, 0, 2 * (random.nextDouble() - .5), 3, 2 * (random.nextDouble() - .5), .6); + location.getWorld().spawnParticle(Particle.CRIT, location, 0, 2 * (RANDOM.nextDouble() - .5), 3, 2 * (RANDOM.nextDouble() - .5), .6); } @EventHandler @@ -143,54 +148,59 @@ public class FishingListener implements Listener { return; } - if (pulls == 0 && random.nextDouble() < PlayerData.get(player).getStats().getStat(StatType.CRITICAL_FISHING_CHANCE) / 100) + System.out.println("Pulls: " + currentPulls + " / " + fishStrength); + + if (currentPulls == 0 && RANDOM.nextDouble() < PlayerData.get(player).getStats().getStat(StatType.CRITICAL_FISHING_CHANCE) / 100) criticalFish(); // Check if enough pulls; if not, wait till the next fish event - if (!pull()) - return; - - // The fish is successfully looted from here - close(); - - ItemStack mainhand = player.getInventory().getItem(EquipmentSlot.HAND); - MMOCoreUtils.decreaseDurability(player, - (mainhand != null && mainhand.getType() == Material.FISHING_ROD) ? EquipmentSlot.HAND : EquipmentSlot.OFF_HAND, 1); - - if (!isCrit() && random.nextDouble() < PlayerData.get(player).getStats().getStat(StatType.CRITICAL_FISHING_FAILURE_CHANCE) / 100) { - player.setVelocity(hook.getLocation().subtract(player.getLocation()).toVector().setY(0).multiply(3).setY(.5)); - hook.getWorld().spawnParticle(Particle.SMOKE_NORMAL, location, 24, 0, 0, 0, .08); - return; - } - - ItemStack collect = caught.collect(new LootBuilder(playerData, 0)); - if (collect == null) { - hook.getWorld().spawnParticle(Particle.SMOKE_NORMAL, location, 24, 0, 0, 0, .08); - return; - } - - CustomPlayerFishEvent called = new CustomPlayerFishEvent(playerData, collect); - Bukkit.getPluginManager().callEvent(called); - if (called.isCancelled()) - return; - - // Calculate yeet velocity - Item item = hook.getWorld().dropItemNaturally(hook.getLocation(), collect); - MMOCoreUtils.displayIndicator(location.add(0, 1.25, 0), - MMOCore.plugin.configManager.getSimpleMessage("fish-out-water" + (isCrit() ? "-crit" : "")).message()); - Vector vec = player.getLocation().subtract(hook.getLocation()).toVector(); - vec.setY(vec.getY() * .031 + vec.length() * .05); - vec.setX(vec.getX() * .08); - vec.setZ(vec.getZ() * .08); - item.setVelocity(vec); - player.getWorld().playSound(player.getLocation(), VersionSound.BLOCK_NOTE_BLOCK_HAT.toSound(), 1, 0); - for (int j = 0; j < 16; j++) - location.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, location, 0, 4 * (random.nextDouble() - .5), 2, - 4 * (random.nextDouble() - .5), .05); - - if (MMOCore.plugin.fishingManager.hasLinkedProfession()) - playerData.getCollectionSkills().giveExperience(MMOCore.plugin.fishingManager.getLinkedProfession(), exp, EXPSource.FISHING, location); + if (pull()) + lootFish(); } } + + public void lootFish() { + close(); + + ItemStack mainhand = player.getInventory().getItem(EquipmentSlot.HAND); + MMOCoreUtils.decreaseDurability(player, + (mainhand != null && mainhand.getType() == Material.FISHING_ROD) ? EquipmentSlot.HAND : EquipmentSlot.OFF_HAND, 1); + + // Critical fishing failure + if (!isCrit() && RANDOM.nextDouble() < PlayerData.get(player).getStats().getStat(StatType.CRITICAL_FISHING_FAILURE_CHANCE) / 100) { + player.setVelocity(hook.getLocation().subtract(player.getLocation()).toVector().setY(0).multiply(3).setY(.5)); + hook.getWorld().spawnParticle(Particle.SMOKE_NORMAL, location, 24, 0, 0, 0, .08); + return; + } + + // Find looted item + ItemStack collect = caught.collect(new LootBuilder(playerData, 0)); + if (collect == null) { + hook.getWorld().spawnParticle(Particle.SMOKE_NORMAL, location, 24, 0, 0, 0, .08); + return; + } + + // Call Bukkit event + CustomPlayerFishEvent called = new CustomPlayerFishEvent(playerData, collect); + Bukkit.getPluginManager().callEvent(called); + if (called.isCancelled()) + return; + + // Calculate yeet velocity + Item item = hook.getWorld().dropItemNaturally(hook.getLocation(), collect); + MMOCoreUtils.displayIndicator(location.add(0, 1.25, 0), + MMOCore.plugin.configManager.getSimpleMessage("fish-out-water" + (isCrit() ? "-crit" : "")).message()); + Vector vec = player.getLocation().subtract(hook.getLocation()).toVector(); + vec.setY(vec.getY() * .031 + vec.length() * .05); + vec.setX(vec.getX() * .08); + vec.setZ(vec.getZ() * .08); + item.setVelocity(vec); + player.getWorld().playSound(player.getLocation(), VersionSound.BLOCK_NOTE_BLOCK_HAT.toSound(), 1, 0); + for (int j = 0; j < 8; j++) + location.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, location, 0, 4 * (RANDOM.nextDouble() - .5), RANDOM.nextDouble() + 1, 4 * (RANDOM.nextDouble() - .5), .08); + + if (MMOCore.plugin.fishingManager.hasLinkedProfession()) + playerData.getCollectionSkills().giveExperience(MMOCore.plugin.fishingManager.getLinkedProfession(), experienceDropped, EXPSource.FISHING, location); + } } } diff --git a/src/main/java/net/Indyuce/mmocore/manager/profession/SpecificProfessionManager.java b/src/main/java/net/Indyuce/mmocore/manager/profession/SpecificProfessionManager.java index 8ee2708a..04e7cdb9 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/profession/SpecificProfessionManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/profession/SpecificProfessionManager.java @@ -3,6 +3,9 @@ package net.Indyuce.mmocore.manager.profession; import net.Indyuce.mmocore.experience.Profession; import net.Indyuce.mmocore.manager.MMOCoreManager; import org.bukkit.configuration.ConfigurationSection; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; public abstract class SpecificProfessionManager implements MMOCoreManager { @@ -25,8 +28,9 @@ public abstract class SpecificProfessionManager implements MMOCoreManager { this.linkedProfession = linkedProfession; } + @NotNull public Profession getLinkedProfession() { - return linkedProfession; + return Objects.requireNonNull(linkedProfession, "No linked profession found"); } public boolean hasLinkedProfession() { From 1671df5ed91fa8d66593c92ed84686ee4a27356e Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 5 Mar 2022 13:13:13 +0100 Subject: [PATCH 24/36] Changed durability application method --- .../mmocore/api/util/MMOCoreUtils.java | 27 +++++++++---------- .../listener/profession/FishingListener.java | 16 +++++------ 2 files changed, 19 insertions(+), 24 deletions(-) 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 1a5f73f1..869fa6be 100644 --- a/src/main/java/net/Indyuce/mmocore/api/util/MMOCoreUtils.java +++ b/src/main/java/net/Indyuce/mmocore/api/util/MMOCoreUtils.java @@ -1,7 +1,6 @@ package net.Indyuce.mmocore.api.util; import io.lumine.mythic.lib.MythicLib; -import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.version.VersionMaterial; import io.lumine.mythic.utils.holograms.Hologram; import io.lumine.mythic.utils.serialize.Position; @@ -184,8 +183,11 @@ public class MMOCoreUtils { /** * Method used when mining a custom block or fishing, as the corresponding * interaction event is cancelled durability is not handled. This method is - * needed and actually calls a damage event so that MMOItems can listen to - * it + * needed and actually calls a damage event so that MMOItems can listen to it. + *

+ * This method only supports item types which DO have a durability bar like + * fishing rods or pickaxes. This shouldn't cause any issue because you can + * only use fishing rods to fish and pickaxes to mine stuff. * * @param player Player holding the item with durability * @param slot The slot of the item with durability @@ -193,26 +195,21 @@ public class MMOCoreUtils { */ public static void decreaseDurability(Player player, EquipmentSlot slot, int damage) { ItemStack item = player.getInventory().getItem(slot); - NBTItem nbt = NBTItem.get(item); - - if (!nbt.hasTag("MMOITEMS_MAX_DURABILITY")) { + if (!item.hasItemMeta() || !(item.getItemMeta() instanceof Damageable) || item.getItemMeta().isUnbreakable()) return; - } PlayerItemDamageEvent event = new PlayerItemDamageEvent(player, item, damage); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) return; - - if (!nbt.getBoolean("Unbreakable") && item.getItemMeta() instanceof Damageable) { - ItemMeta meta = item.getItemMeta(); - ((Damageable) meta).setDamage(((Damageable) meta).getDamage() + damage); + ItemMeta meta = item.getItemMeta(); + if (event.getDamage() + ((Damageable) meta).getDamage() >= item.getType().getMaxDurability()) { + player.playSound(player.getLocation(), Sound.ENTITY_ITEM_BREAK, 1F, 1F); + player.getInventory().setItem(slot, null); + } else { + ((Damageable) meta).setDamage(((Damageable) meta).getDamage() + event.getDamage()); item.setItemMeta(meta); - if (((Damageable) meta).getDamage() >= item.getType().getMaxDurability()) { - player.playSound(player.getLocation(), Sound.ENTITY_ITEM_BREAK, 1F, 1F); - player.getInventory().setItem(slot, null); - } } } } diff --git a/src/main/java/net/Indyuce/mmocore/listener/profession/FishingListener.java b/src/main/java/net/Indyuce/mmocore/listener/profession/FishingListener.java index 76984660..19ec3c4f 100644 --- a/src/main/java/net/Indyuce/mmocore/listener/profession/FishingListener.java +++ b/src/main/java/net/Indyuce/mmocore/listener/profession/FishingListener.java @@ -96,7 +96,7 @@ public class FishingListener implements Listener { lootFish(); } - public void criticalFish() { + public void setCriticalFish() { currentPulls = fishStrength + 2; } @@ -107,7 +107,7 @@ public class FishingListener implements Listener { /** * @return If the fish is weak enough to be looted by the player. */ - public boolean pull() { + public boolean pullOnce() { last = System.currentTimeMillis(); currentPulls++; return currentPulls >= fishStrength; @@ -116,7 +116,7 @@ public class FishingListener implements Listener { /** * Critical fish's means you catch the fish on the very first try */ - public boolean isCrit() { + public boolean isCriticalFish() { return currentPulls > fishStrength + 1; } @@ -148,13 +148,11 @@ public class FishingListener implements Listener { return; } - System.out.println("Pulls: " + currentPulls + " / " + fishStrength); - if (currentPulls == 0 && RANDOM.nextDouble() < PlayerData.get(player).getStats().getStat(StatType.CRITICAL_FISHING_CHANCE) / 100) - criticalFish(); + setCriticalFish(); // Check if enough pulls; if not, wait till the next fish event - if (pull()) + if (pullOnce()) lootFish(); } } @@ -167,7 +165,7 @@ public class FishingListener implements Listener { (mainhand != null && mainhand.getType() == Material.FISHING_ROD) ? EquipmentSlot.HAND : EquipmentSlot.OFF_HAND, 1); // Critical fishing failure - if (!isCrit() && RANDOM.nextDouble() < PlayerData.get(player).getStats().getStat(StatType.CRITICAL_FISHING_FAILURE_CHANCE) / 100) { + if (!isCriticalFish() && RANDOM.nextDouble() < PlayerData.get(player).getStats().getStat(StatType.CRITICAL_FISHING_FAILURE_CHANCE) / 100) { player.setVelocity(hook.getLocation().subtract(player.getLocation()).toVector().setY(0).multiply(3).setY(.5)); hook.getWorld().spawnParticle(Particle.SMOKE_NORMAL, location, 24, 0, 0, 0, .08); return; @@ -189,7 +187,7 @@ public class FishingListener implements Listener { // Calculate yeet velocity Item item = hook.getWorld().dropItemNaturally(hook.getLocation(), collect); MMOCoreUtils.displayIndicator(location.add(0, 1.25, 0), - MMOCore.plugin.configManager.getSimpleMessage("fish-out-water" + (isCrit() ? "-crit" : "")).message()); + MMOCore.plugin.configManager.getSimpleMessage("fish-out-water" + (isCriticalFish() ? "-crit" : "")).message()); Vector vec = player.getLocation().subtract(hook.getLocation()).toVector(); vec.setY(vec.getY() * .031 + vec.length() * .05); vec.setX(vec.getX() * .08); From d0395f2b7ff5a1573f31e05e7cb42becb072918e Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 5 Mar 2022 15:36:22 +0100 Subject: [PATCH 25/36] Fixed double MythicLib skill manager reload --- src/main/java/net/Indyuce/mmocore/MMOCore.java | 2 ++ src/main/java/net/Indyuce/mmocore/manager/SkillManager.java | 4 +--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/Indyuce/mmocore/MMOCore.java b/src/main/java/net/Indyuce/mmocore/MMOCore.java index b5a92b77..635b32b2 100644 --- a/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -387,6 +387,8 @@ public class MMOCore extends LuminePlugin { configManager = new ConfigManager(); + if (clearBefore) + MythicLib.plugin.getSkills().initialize(true); skillManager.initialize(clearBefore); mineManager.initialize(clearBefore); partyManager.initialize(clearBefore); diff --git a/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java b/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java index 303e5635..9febb1ef 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java @@ -46,10 +46,8 @@ public class SkillManager implements MMOCoreManager { public void initialize(boolean clearBefore) { - if (clearBefore) { - MythicLib.plugin.getSkills().initialize(true); + if (clearBefore) skills.clear(); - } // Register MMOCore specific skills MythicLib.plugin.getSkills().registerSkillHandler(new Ambers()); From 49ed57d0577c6f364e76d125a61edc075c846e8e Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sun, 6 Mar 2022 17:00:34 +0100 Subject: [PATCH 26/36] Added unarmed damage as mmocore stat --- src/main/java/net/Indyuce/mmocore/api/player/stats/StatType.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/net/Indyuce/mmocore/api/player/stats/StatType.java b/src/main/java/net/Indyuce/mmocore/api/player/stats/StatType.java index eaf8ce72..cfc69000 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/stats/StatType.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/stats/StatType.java @@ -68,6 +68,7 @@ public enum StatType { PROJECTILE_DAMAGE, WEAPON_DAMAGE, SKILL_DAMAGE, + UNARMED_DAMAGE, UNDEAD_DAMAGE, // Misc damage stats From 196b977676cd815d6c4fdc45a76db803b02c74fc Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sun, 6 Mar 2022 17:50:50 +0100 Subject: [PATCH 27/36] !New stuff --- pom.xml | 2 +- .../manager/data/mysql/MySQLDataProvider.java | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0063fa66..575b9d6c 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ io.lumine MythicLib-dist - 1.3 + 1.3.1 provided diff --git a/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLDataProvider.java b/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLDataProvider.java index e90d93ac..b121b008 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLDataProvider.java +++ b/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLDataProvider.java @@ -17,6 +17,24 @@ public class MySQLDataProvider extends MMODataSource implements DataProvider { @Override public void load() { + + + /*TODO + also move Debug function to mysql data provider + + String tableName = getPoolName(); +getResultAsync("SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = '" +getPoolName()+ "' AND TABLE_NAME = 'mmocore_playerdata' AND COLUMN_NAME = 'times_claimed'", + result -> { + if (!result.next()) + executeUpdateAsync() + }): + executeUpdateAsync(); + + + if (!provider.prepareStatement("SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = '" + provider.getDatabase() + + "' AND TABLE_NAME = '" + provider.getBountyDataTable() + "' AND COLUMN_NAME = 'last_updated'").executeQuery().next()) + provider.prepareStatement("ALTER TABLE " + provider.getBountyDataTable() + " ADD COLUMN last_updated BIGINT").execute();*/ + executeUpdateAsync( "CREATE TABLE IF NOT EXISTS mmocore_playerdata(uuid VARCHAR(36),class_points " + "INT(11) DEFAULT 0,skill_points INT(11) DEFAULT 0,attribute_points INT(11) " From d4813f5cfa12f820d5329c9021478641caf786cb Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 12 Mar 2022 13:56:44 +0100 Subject: [PATCH 28/36] MM 5.0.1 support --- pom.xml | 4 +- .../mmocore/comp/mythicmobs/MythicHook.java | 16 +-- .../comp/mythicmobs/MythicMobsMMOLoader.java | 59 +++++----- .../mythicmobs/load/CurrencyItemDrop.java | 60 +++++------ .../comp/mythicmobs/load/GoldPouchDrop.java | 101 +++++++++--------- .../KillMythicFactionExperienceSource.java | 4 +- .../load/KillMythicFactionObjective.java | 79 +++++++------- .../load/KillMythicMobExperienceSource.java | 4 +- .../load/KillMythicMobObjective.java | 75 +++++++------ .../mythicmobs/load/MythicSkillTrigger.java | 24 +++-- 10 files changed, 210 insertions(+), 216 deletions(-) diff --git a/pom.xml b/pom.xml index 575b9d6c..e0540704 100644 --- a/pom.xml +++ b/pom.xml @@ -146,8 +146,8 @@ io.lumine - MythicMobs-Dist - 5.0.0-SNAPSHOT + Mythic-Dist + 5.0.1 provided diff --git a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicHook.java b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicHook.java index 9bf70be8..59a92e8a 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicHook.java +++ b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicHook.java @@ -1,9 +1,9 @@ package net.Indyuce.mmocore.comp.mythicmobs; -import io.lumine.xikage.mythicmobs.MythicMobs; -import io.lumine.xikage.mythicmobs.api.bukkit.events.MythicDropLoadEvent; -import io.lumine.xikage.mythicmobs.api.bukkit.events.MythicReloadedEvent; -import io.lumine.xikage.mythicmobs.skills.placeholders.Placeholder; +import io.lumine.mythic.bukkit.MythicBukkit; +import io.lumine.mythic.bukkit.events.MythicDropLoadEvent; +import io.lumine.mythic.bukkit.events.MythicReloadedEvent; +import io.lumine.mythic.core.skills.placeholders.Placeholder; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute; @@ -50,18 +50,18 @@ public class MythicHook implements Listener { private void registerPlaceholders() { // Resource - MythicMobs.inst().getPlaceholderManager().register("mana", Placeholder.meta((metadata, arg) -> { + MythicBukkit.inst().getPlaceholderManager().register("mana", Placeholder.meta((metadata, arg) -> { return String.valueOf((int) PlayerData.get(metadata.getCaster().getEntity().getUniqueId()).getMana()); })); - MythicMobs.inst().getPlaceholderManager().register("stamina", Placeholder.meta((metadata, arg) -> { + MythicBukkit.inst().getPlaceholderManager().register("stamina", Placeholder.meta((metadata, arg) -> { return String.valueOf((int) PlayerData.get(metadata.getCaster().getEntity().getUniqueId()).getStamina()); })); - MythicMobs.inst().getPlaceholderManager().register("stellium", Placeholder.meta((metadata, arg) -> { + MythicBukkit.inst().getPlaceholderManager().register("stellium", Placeholder.meta((metadata, arg) -> { return String.valueOf((int) PlayerData.get(metadata.getCaster().getEntity().getUniqueId()).getStellium()); })); // Attributes - MythicMobs.inst().getPlaceholderManager().register("attribute", Placeholder.meta((metadata, arg) -> { + MythicBukkit.inst().getPlaceholderManager().register("attribute", Placeholder.meta((metadata, arg) -> { PlayerAttributes attributes = PlayerData.get(metadata.getCaster().getEntity().getUniqueId()).getAttributes(); PlayerAttribute attribute = MMOCore.plugin.attributeManager.get(arg); return String.valueOf(attributes.getAttribute(attribute)); diff --git a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicMobsMMOLoader.java b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicMobsMMOLoader.java index d53ad849..112c53ff 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicMobsMMOLoader.java +++ b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicMobsMMOLoader.java @@ -1,49 +1,44 @@ package net.Indyuce.mmocore.comp.mythicmobs; -import net.Indyuce.mmocore.experience.provider.ExperienceDispenser; -import org.bukkit.configuration.ConfigurationSection; - -import net.Indyuce.mmocore.experience.source.type.ExperienceSource; +import io.lumine.mythic.lib.api.MMOLineConfig; import net.Indyuce.mmocore.api.load.MMOLoader; import net.Indyuce.mmocore.api.quest.objective.Objective; import net.Indyuce.mmocore.api.quest.trigger.Trigger; -import net.Indyuce.mmocore.comp.mythicmobs.load.KillMythicFactionExperienceSource; -import net.Indyuce.mmocore.comp.mythicmobs.load.KillMythicFactionObjective; -import net.Indyuce.mmocore.comp.mythicmobs.load.KillMythicMobExperienceSource; -import net.Indyuce.mmocore.comp.mythicmobs.load.KillMythicMobObjective; -import net.Indyuce.mmocore.comp.mythicmobs.load.MythicSkillTrigger; -import io.lumine.mythic.lib.api.MMOLineConfig; +import net.Indyuce.mmocore.comp.mythicmobs.load.*; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; +import net.Indyuce.mmocore.experience.source.type.ExperienceSource; +import org.bukkit.configuration.ConfigurationSection; public class MythicMobsMMOLoader extends MMOLoader { - @Override - public Trigger loadTrigger(MMOLineConfig config) { + @Override + public Trigger loadTrigger(MMOLineConfig config) { - if (config.getKey().equalsIgnoreCase("mmskill") || config.getKey().equalsIgnoreCase("mythicmobskill")) - return new MythicSkillTrigger(config); + if (config.getKey().equalsIgnoreCase("mmskill") || config.getKey().equalsIgnoreCase("mythicmobskill")) + return new MythicSkillTrigger(config); - return null; - } + return null; + } - @Override - public Objective loadObjective(MMOLineConfig config, ConfigurationSection section) { + @Override + public Objective loadObjective(MMOLineConfig config, ConfigurationSection section) { - if (config.getKey().equalsIgnoreCase("killmythicmob")) - return new KillMythicMobObjective(section, config); - if (config.getKey().equalsIgnoreCase("killmythicfaction")) - return new KillMythicFactionObjective(section, config); + if (config.getKey().equalsIgnoreCase("killmythicmob")) + return new KillMythicMobObjective(section, config); + if (config.getKey().equalsIgnoreCase("killmythicfaction")) + return new KillMythicFactionObjective(section, config); - return null; - } + return null; + } - @Override - public ExperienceSource loadExperienceSource(MMOLineConfig config, ExperienceDispenser dispenser) { + @Override + public ExperienceSource loadExperienceSource(MMOLineConfig config, ExperienceDispenser dispenser) { - if (config.getKey().equalsIgnoreCase("killmythicmob")) - return new KillMythicMobExperienceSource(dispenser, config); - if (config.getKey().equalsIgnoreCase("killmythicfaction")) - return new KillMythicFactionExperienceSource(dispenser, config); + if (config.getKey().equalsIgnoreCase("killmythicmob")) + return new KillMythicMobExperienceSource(dispenser, config); + if (config.getKey().equalsIgnoreCase("killmythicfaction")) + return new KillMythicFactionExperienceSource(dispenser, config); - return null; - } + return null; + } } diff --git a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/CurrencyItemDrop.java b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/CurrencyItemDrop.java index 37fc4b9f..ccba02f2 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/CurrencyItemDrop.java +++ b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/CurrencyItemDrop.java @@ -1,40 +1,40 @@ package net.Indyuce.mmocore.comp.mythicmobs.load; +import io.lumine.mythic.api.config.MythicLineConfig; +import io.lumine.mythic.api.drops.DropMetadata; +import io.lumine.mythic.api.drops.IMultiDrop; +import io.lumine.mythic.bukkit.adapters.BukkitItemStack; +import io.lumine.mythic.core.drops.Drop; +import io.lumine.mythic.core.drops.LootBag; +import io.lumine.mythic.core.drops.droppables.ItemDrop; +import net.Indyuce.mmocore.util.item.CurrencyItemBuilder; + import java.util.Random; -import io.lumine.xikage.mythicmobs.adapters.bukkit.BukkitItemStack; -import io.lumine.xikage.mythicmobs.drops.Drop; -import io.lumine.xikage.mythicmobs.drops.DropMetadata; -import io.lumine.xikage.mythicmobs.drops.IMultiDrop; -import io.lumine.xikage.mythicmobs.drops.LootBag; -import io.lumine.xikage.mythicmobs.drops.droppables.ItemDrop; -import io.lumine.xikage.mythicmobs.io.MythicLineConfig; -import net.Indyuce.mmocore.util.item.CurrencyItemBuilder; - public class CurrencyItemDrop extends Drop implements IMultiDrop { - private final String key; - private final int minw; - private final int maxw; + private final String key; + private final int minw; + private final int maxw; - private static final Random random = new Random(); + private static final Random random = new Random(); - public CurrencyItemDrop(String key, MythicLineConfig config) { - super(config.getLine(), config); - - this.key = key; - minw = config.getInteger("minw", 1); - maxw = config.getInteger("maxw", 1); - } + public CurrencyItemDrop(String key, MythicLineConfig config) { + super(config.getLine(), config); - @SuppressWarnings("deprecation") - @Override - public LootBag get(DropMetadata metadata) { - LootBag loot = new LootBag(metadata); - loot.add(new ItemDrop(this.getLine(), (MythicLineConfig) this.getConfig(), new BukkitItemStack(new CurrencyItemBuilder(key, random(minw, maxw)).build()))); - return loot; - } + this.key = key; + minw = config.getInteger("minw", 1); + maxw = config.getInteger("maxw", 1); + } - private int random(int a, int b) { - return random.nextInt(b - a + 1) + a; - } + @SuppressWarnings("deprecation") + @Override + public LootBag get(DropMetadata metadata) { + LootBag loot = new LootBag(metadata); + loot.add(new ItemDrop(this.getLine(), this.getConfig(), new BukkitItemStack(new CurrencyItemBuilder(key, random(minw, maxw)).build()))); + return loot; + } + + private int random(int a, int b) { + return random.nextInt(b - a + 1) + a; + } } diff --git a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/GoldPouchDrop.java b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/GoldPouchDrop.java index f168d904..65c4123a 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/GoldPouchDrop.java +++ b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/GoldPouchDrop.java @@ -1,71 +1,70 @@ package net.Indyuce.mmocore.comp.mythicmobs.load; -import java.util.Random; - +import io.lumine.mythic.api.config.MythicLineConfig; +import io.lumine.mythic.api.drops.DropMetadata; +import io.lumine.mythic.api.drops.IMultiDrop; +import io.lumine.mythic.bukkit.adapters.BukkitItemStack; +import io.lumine.mythic.core.drops.Drop; +import io.lumine.mythic.core.drops.LootBag; +import io.lumine.mythic.core.drops.droppables.ItemDrop; +import io.lumine.mythic.lib.api.item.ItemTag; +import io.lumine.mythic.lib.api.item.NBTItem; +import net.Indyuce.mmocore.api.util.MMOCoreUtils; +import net.Indyuce.mmocore.util.item.CurrencyItemBuilder; import net.Indyuce.mmocore.util.item.SimpleItemBuilder; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; -import io.lumine.xikage.mythicmobs.adapters.bukkit.BukkitItemStack; -import io.lumine.xikage.mythicmobs.drops.Drop; -import io.lumine.xikage.mythicmobs.drops.DropMetadata; -import io.lumine.xikage.mythicmobs.drops.IMultiDrop; -import io.lumine.xikage.mythicmobs.drops.LootBag; -import io.lumine.xikage.mythicmobs.drops.droppables.ItemDrop; -import io.lumine.xikage.mythicmobs.io.MythicLineConfig; -import net.Indyuce.mmocore.api.util.MMOCoreUtils; -import net.Indyuce.mmocore.util.item.CurrencyItemBuilder; -import io.lumine.mythic.lib.api.item.ItemTag; -import io.lumine.mythic.lib.api.item.NBTItem; +import java.util.Random; public class GoldPouchDrop extends Drop implements IMultiDrop { - private final int min; - private final int max; + private final int min; + private final int max; - private static final Random random = new Random(); + private static final Random random = new Random(); - public GoldPouchDrop(MythicLineConfig config) { - super(config.getLine(), config); + public GoldPouchDrop(MythicLineConfig config) { + super(config.getLine(), config); - min = config.getInteger("min", 1); - max = config.getInteger("max", 10); - } + min = config.getInteger("min", 1); + max = config.getInteger("max", 10); + } - @SuppressWarnings("deprecation") - @Override - public LootBag get(DropMetadata metadata) { - LootBag loot = new LootBag(metadata); - NBTItem nbt = NBTItem.get(new SimpleItemBuilder("MOB_GOLD_POUCH").build()); + @SuppressWarnings("deprecation") + @Override + public LootBag get(DropMetadata metadata) { + LootBag loot = new LootBag(metadata); + NBTItem nbt = NBTItem.get(new SimpleItemBuilder("MOB_GOLD_POUCH").build()); - ItemStack[] content = new ItemStack[18]; - int money = random.nextInt(max - min + 1) + min; + ItemStack[] content = new ItemStack[18]; + int money = random.nextInt(max - min + 1) + min; - for (int j = 0; j < 7 && money > 0; j++) { - int a = j == 6 ? money : Math.max(1, (int) ((.12 + random.nextDouble() * .4) * (double) money)); - money -= a; + for (int j = 0; j < 7 && money > 0; j++) { + int a = j == 6 ? money : Math.max(1, (int) ((.12 + random.nextDouble() * .4) * (double) money)); + money -= a; - if (a < 30 && random.nextDouble() < .3) { - content[getAvailableSlot(content)] = setAmount(new CurrencyItemBuilder("GOLD_COIN", 1).build(), a); - continue; - } + if (a < 30 && random.nextDouble() < .3) { + content[getAvailableSlot(content)] = setAmount(new CurrencyItemBuilder("GOLD_COIN", 1).build(), a); + continue; + } - content[getAvailableSlot(content)] = new CurrencyItemBuilder("NOTE", a).build(); - } + content[getAvailableSlot(content)] = new CurrencyItemBuilder("NOTE", a).build(); + } - nbt.addTag(new ItemTag("RpgPouchSize", 18), new ItemTag("RpgPouchMob", true), new ItemTag("RpgPouchInventory", MMOCoreUtils.toBase64(content))); - loot.add(new ItemDrop(this.getLine(), (MythicLineConfig) this.getConfig(), new BukkitItemStack(nbt.toItem()))); - return loot; - } + nbt.addTag(new ItemTag("RpgPouchSize", 18), new ItemTag("RpgPouchMob", true), new ItemTag("RpgPouchInventory", MMOCoreUtils.toBase64(content))); + loot.add(new ItemDrop(this.getLine(), this.getConfig(), new BukkitItemStack(nbt.toItem()))); + return loot; + } - private ItemStack setAmount(ItemStack item, int amount) { - item.setAmount(amount); - return item; - } + private ItemStack setAmount(ItemStack item, int amount) { + item.setAmount(amount); + return item; + } - private int getAvailableSlot(ItemStack[] content) { - int slot; - while (content[slot = random.nextInt(content.length)] != null) - if(content[slot].getType() == Material.AIR) break; - return slot; - } + private int getAvailableSlot(ItemStack[] content) { + int slot; + while (content[slot = random.nextInt(content.length)] != null) + if (content[slot].getType() == Material.AIR) break; + return slot; + } } diff --git a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/KillMythicFactionExperienceSource.java b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/KillMythicFactionExperienceSource.java index 88e57d22..e6828afd 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/KillMythicFactionExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/KillMythicFactionExperienceSource.java @@ -1,10 +1,10 @@ package net.Indyuce.mmocore.comp.mythicmobs.load; +import io.lumine.mythic.bukkit.events.MythicMobDeathEvent; import io.lumine.mythic.lib.api.MMOLineConfig; -import io.lumine.xikage.mythicmobs.api.bukkit.events.MythicMobDeathEvent; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; -import net.Indyuce.mmocore.experience.provider.ExperienceDispenser; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import org.bukkit.Bukkit; diff --git a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/KillMythicFactionObjective.java b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/KillMythicFactionObjective.java index f3f7dfd1..678d950b 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/KillMythicFactionObjective.java +++ b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/KillMythicFactionObjective.java @@ -1,57 +1,56 @@ package net.Indyuce.mmocore.comp.mythicmobs.load; +import io.lumine.mythic.bukkit.events.MythicMobDeathEvent; +import io.lumine.mythic.lib.api.MMOLineConfig; +import net.Indyuce.mmocore.api.quest.ObjectiveProgress; +import net.Indyuce.mmocore.api.quest.QuestProgress; +import net.Indyuce.mmocore.api.quest.objective.Objective; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import io.lumine.xikage.mythicmobs.api.bukkit.events.MythicMobDeathEvent; -import net.Indyuce.mmocore.api.quest.ObjectiveProgress; -import net.Indyuce.mmocore.api.quest.QuestProgress; -import net.Indyuce.mmocore.api.quest.objective.Objective; -import io.lumine.mythic.lib.api.MMOLineConfig; - public class KillMythicFactionObjective extends Objective { - private final String factionName; - private final int required; + private final String factionName; + private final int required; - public KillMythicFactionObjective(ConfigurationSection section, MMOLineConfig config) { - super(section); + public KillMythicFactionObjective(ConfigurationSection section, MMOLineConfig config) { + super(section); - config.validate("amount", "name"); + config.validate("amount", "name"); - factionName = config.getString("name"); - required = config.getInt("amount"); - } + factionName = config.getString("name"); + required = config.getInt("amount"); + } - @Override - public ObjectiveProgress newProgress(QuestProgress questProgress) { - return new KillFactionProgress(questProgress, this); - } + @Override + public ObjectiveProgress newProgress(QuestProgress questProgress) { + return new KillFactionProgress(questProgress, this); + } - public class KillFactionProgress extends ObjectiveProgress implements Listener { - private int count; + public class KillFactionProgress extends ObjectiveProgress implements Listener { + private int count; - public KillFactionProgress(QuestProgress questProgress, Objective objective) { - super(questProgress, objective); - } + public KillFactionProgress(QuestProgress questProgress, Objective objective) { + super(questProgress, objective); + } - @EventHandler - public void a(MythicMobDeathEvent event) { - if(!getQuestProgress().getPlayer().isOnline()) return; - if (event.getKiller() instanceof Player - && event.getKiller().equals(getQuestProgress().getPlayer().getPlayer()) - && event.getMob().hasFaction() && event.getMob().getFaction().equals(factionName)) { - count++; - getQuestProgress().getPlayer().getQuestData().updateBossBar(); - if (count >= required) - getQuestProgress().completeObjective(); - } - } + @EventHandler + public void a(MythicMobDeathEvent event) { + if (!getQuestProgress().getPlayer().isOnline()) return; + if (event.getKiller() instanceof Player + && event.getKiller().equals(getQuestProgress().getPlayer().getPlayer()) + && event.getMob().hasFaction() && event.getMob().getFaction().equals(factionName)) { + count++; + getQuestProgress().getPlayer().getQuestData().updateBossBar(); + if (count >= required) + getQuestProgress().completeObjective(); + } + } - @Override - public String formatLore(String lore) { - return lore.replace("{left}", "" + (required - count)); - } - } + @Override + public String formatLore(String lore) { + return lore.replace("{left}", "" + (required - count)); + } + } } diff --git a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/KillMythicMobExperienceSource.java b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/KillMythicMobExperienceSource.java index c23e8b06..bf161320 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/KillMythicMobExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/KillMythicMobExperienceSource.java @@ -1,10 +1,10 @@ package net.Indyuce.mmocore.comp.mythicmobs.load; +import io.lumine.mythic.bukkit.events.MythicMobDeathEvent; import io.lumine.mythic.lib.api.MMOLineConfig; -import io.lumine.xikage.mythicmobs.api.bukkit.events.MythicMobDeathEvent; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; -import net.Indyuce.mmocore.experience.provider.ExperienceDispenser; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import org.bukkit.Bukkit; diff --git a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/KillMythicMobObjective.java b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/KillMythicMobObjective.java index e932722d..2003f662 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/KillMythicMobObjective.java +++ b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/KillMythicMobObjective.java @@ -1,55 +1,54 @@ package net.Indyuce.mmocore.comp.mythicmobs.load; +import io.lumine.mythic.bukkit.events.MythicMobDeathEvent; +import io.lumine.mythic.lib.api.MMOLineConfig; +import net.Indyuce.mmocore.api.quest.ObjectiveProgress; +import net.Indyuce.mmocore.api.quest.QuestProgress; +import net.Indyuce.mmocore.api.quest.objective.Objective; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import io.lumine.xikage.mythicmobs.api.bukkit.events.MythicMobDeathEvent; -import net.Indyuce.mmocore.api.quest.ObjectiveProgress; -import net.Indyuce.mmocore.api.quest.QuestProgress; -import net.Indyuce.mmocore.api.quest.objective.Objective; -import io.lumine.mythic.lib.api.MMOLineConfig; - public class KillMythicMobObjective extends Objective { - private final String internalName; - private final int required; + private final String internalName; + private final int required; - public KillMythicMobObjective(ConfigurationSection section, MMOLineConfig config) { - super(section); + public KillMythicMobObjective(ConfigurationSection section, MMOLineConfig config) { + super(section); - config.validate("amount", "name"); + config.validate("amount", "name"); - internalName = config.getString("name"); - required = config.getInt("amount"); - } + internalName = config.getString("name"); + required = config.getInt("amount"); + } - @Override - public ObjectiveProgress newProgress(QuestProgress questProgress) { - return new KillMobProgress(questProgress, this); - } + @Override + public ObjectiveProgress newProgress(QuestProgress questProgress) { + return new KillMobProgress(questProgress, this); + } - public class KillMobProgress extends ObjectiveProgress implements Listener { - private int count; + public class KillMobProgress extends ObjectiveProgress implements Listener { + private int count; - public KillMobProgress(QuestProgress questProgress, Objective objective) { - super(questProgress, objective); - } + public KillMobProgress(QuestProgress questProgress, Objective objective) { + super(questProgress, objective); + } - @EventHandler - public void a(MythicMobDeathEvent event) { - if(!getQuestProgress().getPlayer().isOnline()) return; - if (event.getKiller() instanceof Player && event.getKiller().equals(getQuestProgress().getPlayer().getPlayer()) && event.getMob().getType().getInternalName().equals(internalName)) { - count++; - getQuestProgress().getPlayer().getQuestData().updateBossBar(); - if (count >= required) - getQuestProgress().completeObjective(); - } - } + @EventHandler + public void a(MythicMobDeathEvent event) { + if (!getQuestProgress().getPlayer().isOnline()) return; + if (event.getKiller() instanceof Player && event.getKiller().equals(getQuestProgress().getPlayer().getPlayer()) && event.getMob().getType().getInternalName().equals(internalName)) { + count++; + getQuestProgress().getPlayer().getQuestData().updateBossBar(); + if (count >= required) + getQuestProgress().completeObjective(); + } + } - @Override - public String formatLore(String lore) { - return lore.replace("{left}", "" + (required - count)); - } - } + @Override + public String formatLore(String lore) { + return lore.replace("{left}", "" + (required - count)); + } + } } diff --git a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/MythicSkillTrigger.java b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/MythicSkillTrigger.java index 696a8877..f266da7c 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/MythicSkillTrigger.java +++ b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/MythicSkillTrigger.java @@ -1,18 +1,20 @@ package net.Indyuce.mmocore.comp.mythicmobs.load; +import io.lumine.mythic.api.adapters.AbstractPlayer; +import io.lumine.mythic.api.mobs.GenericCaster; +import io.lumine.mythic.api.skills.Skill; +import io.lumine.mythic.api.skills.SkillCaster; +import io.lumine.mythic.api.skills.SkillMetadata; +import io.lumine.mythic.api.skills.SkillTrigger; +import io.lumine.mythic.bukkit.BukkitAdapter; +import io.lumine.mythic.bukkit.MythicBukkit; +import io.lumine.mythic.core.skills.SkillMetadataImpl; import io.lumine.mythic.lib.api.MMOLineConfig; -import io.lumine.xikage.mythicmobs.MythicMobs; -import io.lumine.xikage.mythicmobs.adapters.AbstractPlayer; -import io.lumine.xikage.mythicmobs.adapters.bukkit.BukkitAdapter; -import io.lumine.xikage.mythicmobs.mobs.GenericCaster; -import io.lumine.xikage.mythicmobs.skills.Skill; -import io.lumine.xikage.mythicmobs.skills.SkillCaster; -import io.lumine.xikage.mythicmobs.skills.SkillMetadata; -import io.lumine.xikage.mythicmobs.skills.SkillTrigger; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.quest.trigger.Trigger; import org.apache.commons.lang.Validate; +import java.util.ArrayList; import java.util.HashSet; import java.util.Optional; @@ -24,7 +26,7 @@ public class MythicSkillTrigger extends Trigger { config.validate("id"); String id = config.getString("id"); - Optional opt = MythicMobs.inst().getSkillManager().getSkill(id); + Optional opt = MythicBukkit.inst().getSkillManager().getSkill(id); Validate.isTrue(opt.isPresent(), "Could not find MM skill " + id); skill = opt.get(); } @@ -35,8 +37,8 @@ public class MythicSkillTrigger extends Trigger { AbstractPlayer trigger = BukkitAdapter.adapt(player.getPlayer()); SkillCaster caster = new GenericCaster(trigger); - SkillMetadata skillMeta = new SkillMetadata(SkillTrigger.API, caster, trigger, BukkitAdapter.adapt(player.getPlayer().getLocation()), new HashSet<>(), null, 1); - if (skill.usable(skillMeta, SkillTrigger.API)) + SkillMetadata skillMeta = new SkillMetadataImpl(new SkillTrigger("API", new ArrayList<>()), caster, trigger, BukkitAdapter.adapt(player.getPlayer().getLocation()), new HashSet<>(), null, 1); + if (skill.isUsable(skillMeta)) skill.execute(skillMeta); } } From d1a241a60fb24d636ff81b52b7a193f4a72189ec Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 12 Mar 2022 13:57:12 +0100 Subject: [PATCH 29/36] EXP dispensers cleanup --- .../mmocore/api/load/DefaultMMOLoader.java | 2 +- .../Indyuce/mmocore/api/load/MMOLoader.java | 2 +- .../api/player/profess/PlayerClass.java | 6 ++-- .../api/quest/trigger/ExperienceTrigger.java | 28 ++++++++----------- .../mmocore/experience/ExperienceInfo.java | 19 ------------- .../mmocore/experience/Profession.java | 4 +-- .../ClassExperienceDispenser.java} | 10 +++---- .../ExperienceDispenser.java | 17 +++++++---- .../ProfessionExperienceDispenser.java | 4 +-- .../dispenser/SimpleExperienceDispenser.java | 22 +++++++++++++++ .../source/BrewPotionExperienceSource.java | 5 ++-- .../source/CraftItemExperienceSource.java | 2 +- .../source/EnchantItemExperienceSource.java | 5 ++-- .../source/FishItemExperienceSource.java | 2 +- .../source/KillMobExperienceSource.java | 2 +- .../source/MineBlockExperienceSource.java | 2 +- .../source/PlaceBlockExperienceSource.java | 2 +- .../source/RepairItemExperienceSource.java | 5 ++-- .../source/SmeltItemExperienceSource.java | 2 +- .../source/type/ExperienceSource.java | 2 +- .../source/type/SpecificExperienceSource.java | 5 ++-- .../mmocore/manager/MMOLoadManager.java | 2 +- 22 files changed, 78 insertions(+), 72 deletions(-) delete mode 100644 src/main/java/net/Indyuce/mmocore/experience/ExperienceInfo.java rename src/main/java/net/Indyuce/mmocore/experience/{provider/MainExperienceDispenser.java => dispenser/ClassExperienceDispenser.java} (70%) rename src/main/java/net/Indyuce/mmocore/experience/{provider => dispenser}/ExperienceDispenser.java (64%) rename src/main/java/net/Indyuce/mmocore/experience/{provider => dispenser}/ProfessionExperienceDispenser.java (89%) create mode 100644 src/main/java/net/Indyuce/mmocore/experience/dispenser/SimpleExperienceDispenser.java diff --git a/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java b/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java index 13e22eef..294cbcb8 100644 --- a/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java +++ b/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java @@ -1,6 +1,6 @@ package net.Indyuce.mmocore.api.load; -import net.Indyuce.mmocore.experience.provider.ExperienceDispenser; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import org.bukkit.configuration.ConfigurationSection; import net.Indyuce.mmocore.api.block.BlockType; diff --git a/src/main/java/net/Indyuce/mmocore/api/load/MMOLoader.java b/src/main/java/net/Indyuce/mmocore/api/load/MMOLoader.java index 43624dfe..c3065e0e 100644 --- a/src/main/java/net/Indyuce/mmocore/api/load/MMOLoader.java +++ b/src/main/java/net/Indyuce/mmocore/api/load/MMOLoader.java @@ -4,7 +4,7 @@ import io.lumine.mythic.lib.api.MMOLineConfig; import net.Indyuce.mmocore.api.block.BlockType; import net.Indyuce.mmocore.loot.droptable.condition.Condition; import net.Indyuce.mmocore.loot.droptable.dropitem.DropItem; -import net.Indyuce.mmocore.experience.provider.ExperienceDispenser; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.ExperienceSource; import net.Indyuce.mmocore.api.quest.objective.Objective; import net.Indyuce.mmocore.api.quest.trigger.Trigger; 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 e2393bf6..5108aef8 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 @@ -18,8 +18,8 @@ import net.Indyuce.mmocore.loot.chest.particle.CastingParticle; import net.Indyuce.mmocore.experience.ExpCurve; import net.Indyuce.mmocore.experience.ExperienceObject; import net.Indyuce.mmocore.experience.droptable.ExperienceTable; -import net.Indyuce.mmocore.experience.provider.ExperienceDispenser; -import net.Indyuce.mmocore.experience.provider.MainExperienceDispenser; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; +import net.Indyuce.mmocore.experience.dispenser.ClassExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.ExperienceSource; import net.Indyuce.mmocore.player.playerclass.ClassTrigger; import net.Indyuce.mmocore.player.playerclass.ClassTriggerType; @@ -155,7 +155,7 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { } if (config.contains("main-exp-sources")) { - ExperienceDispenser dispenser = new MainExperienceDispenser(this); + ExperienceDispenser dispenser = new ClassExperienceDispenser(this); for (String key : config.getStringList("main-exp-sources")) try { ExperienceSource source = MMOCore.plugin.loadManager.loadExperienceSource(new MMOLineConfig(key), dispenser); diff --git a/src/main/java/net/Indyuce/mmocore/api/quest/trigger/ExperienceTrigger.java b/src/main/java/net/Indyuce/mmocore/api/quest/trigger/ExperienceTrigger.java index 35e1e433..4a84e0b0 100644 --- a/src/main/java/net/Indyuce/mmocore/api/quest/trigger/ExperienceTrigger.java +++ b/src/main/java/net/Indyuce/mmocore/api/quest/trigger/ExperienceTrigger.java @@ -1,19 +1,24 @@ package net.Indyuce.mmocore.api.quest.trigger; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; +import net.Indyuce.mmocore.experience.dispenser.ProfessionExperienceDispenser; +import net.Indyuce.mmocore.experience.dispenser.SimpleExperienceDispenser; import org.apache.commons.lang.Validate; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.experience.EXPSource; -import net.Indyuce.mmocore.experience.ExperienceInfo; -import net.Indyuce.mmocore.experience.Profession; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.util.math.formula.RandomAmount; import io.lumine.mythic.lib.api.MMOLineConfig; +import org.jetbrains.annotations.NotNull; public class ExperienceTrigger extends Trigger { + @NotNull private final RandomAmount amount; - private final Profession profession; + @NotNull private final EXPSource source; + @NotNull + private final ExperienceDispenser dispenser; public ExperienceTrigger(MMOLineConfig config) { super(config); @@ -23,26 +28,15 @@ public class ExperienceTrigger extends Trigger { if (config.contains("profession")) { String id = config.getString("profession").toLowerCase().replace("_", "-"); Validate.isTrue(MMOCore.plugin.professionManager.has(id), "Could not find profession"); - profession = MMOCore.plugin.professionManager.get(id); + dispenser = new ProfessionExperienceDispenser(MMOCore.plugin.professionManager.get(id)); } else - profession = null; + dispenser = new SimpleExperienceDispenser(); amount = new RandomAmount(config.getString("amount")); source = config.contains("source") ? EXPSource.valueOf(config.getString("source").toUpperCase()) : EXPSource.QUEST; } @Override public void apply(PlayerData player) { - if (profession == null) - player.giveExperience(amount.calculateInt(), source); - else - player.getCollectionSkills().giveExperience(profession, amount.calculateInt(), source); - } - - /* - * experience must be accessible from the custom mine event. this method - * allows to generate an experience info instance for easy manipulations - */ - public ExperienceInfo newInfo() { - return new ExperienceInfo(amount.calculateInt(), profession); + dispenser.giveExperience(player, amount.calculateInt(), null, source); } } diff --git a/src/main/java/net/Indyuce/mmocore/experience/ExperienceInfo.java b/src/main/java/net/Indyuce/mmocore/experience/ExperienceInfo.java deleted file mode 100644 index 18113069..00000000 --- a/src/main/java/net/Indyuce/mmocore/experience/ExperienceInfo.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.Indyuce.mmocore.experience; - -public class ExperienceInfo { - private final Profession profess; - private final int value; - - public ExperienceInfo(int value, Profession profess) { - this.value = value; - this.profess = profess; - } - - public Profession getProfession() { - return profess; - } - - public int getValue() { - return value; - } -} diff --git a/src/main/java/net/Indyuce/mmocore/experience/Profession.java b/src/main/java/net/Indyuce/mmocore/experience/Profession.java index 48d307b0..ade8f4fb 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/Profession.java +++ b/src/main/java/net/Indyuce/mmocore/experience/Profession.java @@ -5,8 +5,8 @@ import io.lumine.mythic.lib.api.util.PostLoadObject; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.util.math.formula.LinearValue; import net.Indyuce.mmocore.experience.droptable.ExperienceTable; -import net.Indyuce.mmocore.experience.provider.ExperienceDispenser; -import net.Indyuce.mmocore.experience.provider.ProfessionExperienceDispenser; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; +import net.Indyuce.mmocore.experience.dispenser.ProfessionExperienceDispenser; import org.apache.commons.lang.Validate; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; diff --git a/src/main/java/net/Indyuce/mmocore/experience/provider/MainExperienceDispenser.java b/src/main/java/net/Indyuce/mmocore/experience/dispenser/ClassExperienceDispenser.java similarity index 70% rename from src/main/java/net/Indyuce/mmocore/experience/provider/MainExperienceDispenser.java rename to src/main/java/net/Indyuce/mmocore/experience/dispenser/ClassExperienceDispenser.java index dbd23dd9..8be7dfe0 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/provider/MainExperienceDispenser.java +++ b/src/main/java/net/Indyuce/mmocore/experience/dispenser/ClassExperienceDispenser.java @@ -1,4 +1,4 @@ -package net.Indyuce.mmocore.experience.provider; +package net.Indyuce.mmocore.experience.dispenser; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; @@ -7,18 +7,18 @@ import net.Indyuce.mmocore.experience.EXPSource; import org.bukkit.Location; import org.jetbrains.annotations.Nullable; -public class MainExperienceDispenser implements ExperienceDispenser { +public class ClassExperienceDispenser implements ExperienceDispenser { private final PlayerClass profess; - public MainExperienceDispenser(PlayerClass profess) { + public ClassExperienceDispenser(PlayerClass profess) { this.profess = profess; } @Override - public void giveExperience(PlayerData playerData, double experience, @Nullable Location hologramLocation) { + public void giveExperience(PlayerData playerData, double experience, @Nullable Location hologramLocation, EXPSource source) { hologramLocation = !MMOCore.plugin.getConfig().getBoolean("display-main-class-exp-holograms") ? null : hologramLocation == null ? getPlayerLocation(playerData) : hologramLocation; - playerData.giveExperience(experience, EXPSource.SOURCE, hologramLocation, true); + playerData.giveExperience(experience, source, hologramLocation, true); } @Override diff --git a/src/main/java/net/Indyuce/mmocore/experience/provider/ExperienceDispenser.java b/src/main/java/net/Indyuce/mmocore/experience/dispenser/ExperienceDispenser.java similarity index 64% rename from src/main/java/net/Indyuce/mmocore/experience/provider/ExperienceDispenser.java rename to src/main/java/net/Indyuce/mmocore/experience/dispenser/ExperienceDispenser.java index 2a345d30..cdc266da 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/provider/ExperienceDispenser.java +++ b/src/main/java/net/Indyuce/mmocore/experience/dispenser/ExperienceDispenser.java @@ -1,12 +1,15 @@ -package net.Indyuce.mmocore.experience.provider; +package net.Indyuce.mmocore.experience.dispenser; import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.experience.EXPSource; import org.bukkit.Location; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** - * Used to differenciate between the main class experience - * and experience given in a specific profession + * Used to differenciate between the main class experience and + * experience given in a specific profession. Also being used to + * monitor EXP holograms. */ public interface ExperienceDispenser { @@ -17,10 +20,12 @@ public interface ExperienceDispenser { * @param experience Experience gained. Note that it is a double * because it gets converted to an integer at * the very last moment in MMOCore - * @param hologramLocation Location of displayed hologram, nothing - * is displayed if it's null + * @param hologramLocation Location of displayed hologram. When set to null + * and if exp holograms are enabled it will take the + * player's location instead. + * @param source Why the EXP was gained */ - void giveExperience(PlayerData playerData, double experience, @Nullable Location hologramLocation); + void giveExperience(PlayerData playerData, double experience, @Nullable Location hologramLocation, @NotNull EXPSource source); /** * Experience sources handle both CLASS experience sources and PROFESSION diff --git a/src/main/java/net/Indyuce/mmocore/experience/provider/ProfessionExperienceDispenser.java b/src/main/java/net/Indyuce/mmocore/experience/dispenser/ProfessionExperienceDispenser.java similarity index 89% rename from src/main/java/net/Indyuce/mmocore/experience/provider/ProfessionExperienceDispenser.java rename to src/main/java/net/Indyuce/mmocore/experience/dispenser/ProfessionExperienceDispenser.java index 4d66d9c8..af385fc1 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/provider/ProfessionExperienceDispenser.java +++ b/src/main/java/net/Indyuce/mmocore/experience/dispenser/ProfessionExperienceDispenser.java @@ -1,4 +1,4 @@ -package net.Indyuce.mmocore.experience.provider; +package net.Indyuce.mmocore.experience.dispenser; import net.Indyuce.mmocore.experience.EXPSource; import net.Indyuce.mmocore.experience.Profession; @@ -14,7 +14,7 @@ public class ProfessionExperienceDispenser implements ExperienceDispenser { } @Override - public void giveExperience(PlayerData playerData, double experience, @Nullable Location hologramLocation) { + public void giveExperience(PlayerData playerData, double experience, @Nullable Location hologramLocation, EXPSource source) { hologramLocation = !profession.getOption(Profession.ProfessionOption.EXP_HOLOGRAMS) ? null : hologramLocation == null ? getPlayerLocation(playerData) : hologramLocation; playerData.getCollectionSkills().giveExperience(profession, experience, EXPSource.SOURCE, hologramLocation); diff --git a/src/main/java/net/Indyuce/mmocore/experience/dispenser/SimpleExperienceDispenser.java b/src/main/java/net/Indyuce/mmocore/experience/dispenser/SimpleExperienceDispenser.java new file mode 100644 index 00000000..fc99e73b --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/experience/dispenser/SimpleExperienceDispenser.java @@ -0,0 +1,22 @@ +package net.Indyuce.mmocore.experience.dispenser; + +import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.experience.EXPSource; +import org.bukkit.Location; +import org.jetbrains.annotations.Nullable; + +public class SimpleExperienceDispenser implements ExperienceDispenser { + + @Override + public void giveExperience(PlayerData playerData, double experience, @Nullable Location hologramLocation, EXPSource source) { + hologramLocation = !MMOCore.plugin.getConfig().getBoolean("display-main-class-exp-holograms") ? null + : hologramLocation == null ? getPlayerLocation(playerData) : hologramLocation; + playerData.giveExperience(experience, source, hologramLocation, true); + } + + @Override + public boolean shouldHandle(PlayerData playerData) { + return true; + } +} diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/BrewPotionExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/BrewPotionExperienceSource.java index 2f804709..a5c085b7 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/source/BrewPotionExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/experience/source/BrewPotionExperienceSource.java @@ -2,7 +2,8 @@ package net.Indyuce.mmocore.experience.source; import io.lumine.mythic.lib.api.MMOLineConfig; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.experience.provider.ExperienceDispenser; +import net.Indyuce.mmocore.experience.EXPSource; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.ExperienceSource; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; @@ -167,7 +168,7 @@ public class BrewPotionExperienceSource extends ExperienceSource { */ // exp += getTotal(mapEffectDurations()); - getDispenser().giveExperience(PlayerData.get(player), (int) exp * multiplier, null); + getDispenser().giveExperience(PlayerData.get(player), (int) exp * multiplier, null, EXPSource.SOURCE); } } } diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/CraftItemExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/CraftItemExperienceSource.java index 0b9b1bc7..be59c9ae 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/source/CraftItemExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/experience/source/CraftItemExperienceSource.java @@ -3,7 +3,7 @@ package net.Indyuce.mmocore.experience.source; import io.lumine.mythic.lib.api.MMOLineConfig; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; -import net.Indyuce.mmocore.experience.provider.ExperienceDispenser; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import org.apache.commons.lang.Validate; diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/EnchantItemExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/EnchantItemExperienceSource.java index 3900582a..aae363b1 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/source/EnchantItemExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/experience/source/EnchantItemExperienceSource.java @@ -4,7 +4,8 @@ import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.api.MMOLineConfig; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; -import net.Indyuce.mmocore.experience.provider.ExperienceDispenser; +import net.Indyuce.mmocore.experience.EXPSource; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.ExperienceSource; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import org.bukkit.enchantments.Enchantment; @@ -59,7 +60,7 @@ public class EnchantItemExperienceSource extends ExperienceSource { double exp = 0; for (Entry entry : applicableEnchants.entrySet()) exp += MMOCore.plugin.enchantManager.getBaseExperience(entry.getKey()) * entry.getValue(); - getDispenser().giveExperience(player, (int) exp, event.getEnchantBlock().getLocation()); + getDispenser().giveExperience(player, (int) exp, event.getEnchantBlock().getLocation(), EXPSource.SOURCE); } } }; diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/FishItemExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/FishItemExperienceSource.java index 2be0e14f..6bf23620 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/source/FishItemExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/experience/source/FishItemExperienceSource.java @@ -1,7 +1,7 @@ package net.Indyuce.mmocore.experience.source; import io.lumine.mythic.lib.api.MMOLineConfig; -import net.Indyuce.mmocore.experience.provider.ExperienceDispenser; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/KillMobExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/KillMobExperienceSource.java index 4ec23fa2..82742749 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/source/KillMobExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/experience/source/KillMobExperienceSource.java @@ -4,7 +4,7 @@ import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.event.PlayerKillEntityEvent; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; -import net.Indyuce.mmocore.experience.provider.ExperienceDispenser; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import org.bukkit.Bukkit; diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/MineBlockExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/MineBlockExperienceSource.java index 0425fb82..4eef178f 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/source/MineBlockExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/experience/source/MineBlockExperienceSource.java @@ -3,7 +3,7 @@ package net.Indyuce.mmocore.experience.source; import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.api.MMOLineConfig; import net.Indyuce.mmocore.api.player.PlayerData; -import net.Indyuce.mmocore.experience.provider.ExperienceDispenser; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import org.bukkit.GameMode; diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/PlaceBlockExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/PlaceBlockExperienceSource.java index 707451dd..fcd19b70 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/source/PlaceBlockExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/experience/source/PlaceBlockExperienceSource.java @@ -1,7 +1,7 @@ package net.Indyuce.mmocore.experience.source; import io.lumine.mythic.lib.api.MMOLineConfig; -import net.Indyuce.mmocore.experience.provider.ExperienceDispenser; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/RepairItemExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/RepairItemExperienceSource.java index a1960ebe..e7942846 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/source/RepairItemExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/experience/source/RepairItemExperienceSource.java @@ -2,7 +2,8 @@ package net.Indyuce.mmocore.experience.source; import io.lumine.mythic.lib.api.MMOLineConfig; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.experience.provider.ExperienceDispenser; +import net.Indyuce.mmocore.experience.EXPSource; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.ExperienceSource; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; @@ -74,7 +75,7 @@ public class RepairItemExperienceSource extends ExperienceSource { */ double exp = MMOCore.plugin.smithingManager.getBaseExperience(item.getType()) * Math.max(0, ((Damageable) old.getItemMeta()).getDamage() - ((Damageable) item.getItemMeta()).getDamage()) / 100; - getDispenser().giveExperience(data, (int) exp, null); + getDispenser().giveExperience(data, (int) exp, null, EXPSource.SOURCE); } } } diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/SmeltItemExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/SmeltItemExperienceSource.java index d28e6d84..8993515d 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/source/SmeltItemExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/experience/source/SmeltItemExperienceSource.java @@ -2,7 +2,7 @@ package net.Indyuce.mmocore.experience.source; import io.lumine.mythic.lib.api.MMOLineConfig; import net.Indyuce.mmocore.api.player.PlayerData; -import net.Indyuce.mmocore.experience.provider.ExperienceDispenser; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import org.bukkit.Location; diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/type/ExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/type/ExperienceSource.java index 644666d5..66d3e7dd 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/source/type/ExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/experience/source/type/ExperienceSource.java @@ -1,7 +1,7 @@ package net.Indyuce.mmocore.experience.source.type; import net.Indyuce.mmocore.api.player.PlayerData; -import net.Indyuce.mmocore.experience.provider.ExperienceDispenser; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; public abstract class ExperienceSource { diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/type/SpecificExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/type/SpecificExperienceSource.java index 314028a0..6e62560c 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/source/type/SpecificExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/experience/source/type/SpecificExperienceSource.java @@ -1,7 +1,8 @@ package net.Indyuce.mmocore.experience.source.type; import io.lumine.mythic.lib.api.MMOLineConfig; -import net.Indyuce.mmocore.experience.provider.ExperienceDispenser; +import net.Indyuce.mmocore.experience.EXPSource; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.util.math.formula.RandomAmount; import org.bukkit.Location; @@ -41,6 +42,6 @@ public abstract class SpecificExperienceSource extends ExperienceSource { * @param hologramLocation Location used to display the exp hologram */ public void giveExperience(PlayerData player, double multiplier, @Nullable Location hologramLocation) { - getDispenser().giveExperience(player, rollAmount() * multiplier, hologramLocation); + getDispenser().giveExperience(player, rollAmount() * multiplier, hologramLocation, EXPSource.SOURCE); } } diff --git a/src/main/java/net/Indyuce/mmocore/manager/MMOLoadManager.java b/src/main/java/net/Indyuce/mmocore/manager/MMOLoadManager.java index c25d36ce..67f7c279 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/MMOLoadManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/MMOLoadManager.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Function; -import net.Indyuce.mmocore.experience.provider.ExperienceDispenser; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import org.apache.commons.lang.Validate; import org.bukkit.configuration.ConfigurationSection; From 57aaa7228a57922b0168866e7c3ffdcfa3ef152e Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 12 Mar 2022 14:01:09 +0100 Subject: [PATCH 30/36] Fixed mmdroptable{..} --- .../mmocore/api/load/DefaultMMOLoader.java | 4 -- .../comp/mythicmobs/MythicMobsMMOLoader.java | 10 +++++ .../mythicmobs/load/MMDropTableDropItem.java | 42 +++++++++++++++++++ .../dropitem/MMDropTableDropItem.java | 40 ------------------ 4 files changed, 52 insertions(+), 44 deletions(-) create mode 100644 src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/MMDropTableDropItem.java delete mode 100644 src/main/java/net/Indyuce/mmocore/loot/droptable/dropitem/MMDropTableDropItem.java diff --git a/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java b/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java index 294cbcb8..7b8857b7 100644 --- a/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java +++ b/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java @@ -14,7 +14,6 @@ import net.Indyuce.mmocore.loot.droptable.condition.WorldCondition; import net.Indyuce.mmocore.loot.droptable.dropitem.DropItem; import net.Indyuce.mmocore.loot.droptable.dropitem.DropTableDropItem; import net.Indyuce.mmocore.loot.droptable.dropitem.GoldDropItem; -import net.Indyuce.mmocore.loot.droptable.dropitem.MMDropTableDropItem; import net.Indyuce.mmocore.loot.droptable.dropitem.NoteDropItem; import net.Indyuce.mmocore.loot.droptable.dropitem.VanillaDropItem; import net.Indyuce.mmocore.experience.source.BrewPotionExperienceSource; @@ -88,9 +87,6 @@ public class DefaultMMOLoader extends MMOLoader { if (config.getKey().equals("gold") || config.getKey().equals("coin")) return new GoldDropItem(config); - if (config.getKey().equals("mmdroptable")) - return new MMDropTableDropItem(config); - return null; } diff --git a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicMobsMMOLoader.java b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicMobsMMOLoader.java index 112c53ff..8a197ee8 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicMobsMMOLoader.java +++ b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicMobsMMOLoader.java @@ -7,6 +7,7 @@ import net.Indyuce.mmocore.api.quest.trigger.Trigger; import net.Indyuce.mmocore.comp.mythicmobs.load.*; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.ExperienceSource; +import net.Indyuce.mmocore.loot.droptable.dropitem.DropItem; import org.bukkit.configuration.ConfigurationSection; public class MythicMobsMMOLoader extends MMOLoader { @@ -20,6 +21,15 @@ public class MythicMobsMMOLoader extends MMOLoader { return null; } + @Override + public DropItem loadDropItem(MMOLineConfig config) { + + if (config.getKey().equals("mmdroptable")) + return new MMDropTableDropItem(config); + + return null; + } + @Override public Objective loadObjective(MMOLineConfig config, ConfigurationSection section) { diff --git a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/MMDropTableDropItem.java b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/MMDropTableDropItem.java new file mode 100644 index 00000000..05ea8441 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/MMDropTableDropItem.java @@ -0,0 +1,42 @@ +package net.Indyuce.mmocore.comp.mythicmobs.load; + +import io.lumine.mythic.api.drops.DropMetadata; +import io.lumine.mythic.api.drops.IItemDrop; +import io.lumine.mythic.bukkit.BukkitAdapter; +import io.lumine.mythic.bukkit.MythicBukkit; +import io.lumine.mythic.core.drops.Drop; +import io.lumine.mythic.core.drops.DropMetadataImpl; +import io.lumine.mythic.core.drops.DropTable; +import io.lumine.mythic.core.drops.LootBag; +import io.lumine.mythic.lib.api.MMOLineConfig; +import net.Indyuce.mmocore.loot.LootBuilder; +import net.Indyuce.mmocore.loot.droptable.dropitem.DropItem; + +import java.util.NoSuchElementException; + +public class MMDropTableDropItem extends DropItem { + private final DropTable dropTable; + + private static final DropMetadata DROP_METADATA = new DropMetadataImpl(null, null); + + public MMDropTableDropItem(MMOLineConfig config) { + super(config); + + config.validate("id"); + String id = config.getString("id"); + + try { + dropTable = MythicBukkit.inst().getDropManager().getDropTable(id).orElse(null); + } catch (NoSuchElementException exception) { + throw new IllegalArgumentException("Could not find MM drop table with ID '" + id + "'"); + } + } + + @Override + public void collect(LootBuilder builder) { + LootBag lootBag = dropTable.generate(DROP_METADATA); + for (Drop type : lootBag.getDrops()) + if (type instanceof IItemDrop) + builder.addLoot(BukkitAdapter.adapt(((IItemDrop) type).getDrop(DROP_METADATA, 1))); + } +} diff --git a/src/main/java/net/Indyuce/mmocore/loot/droptable/dropitem/MMDropTableDropItem.java b/src/main/java/net/Indyuce/mmocore/loot/droptable/dropitem/MMDropTableDropItem.java deleted file mode 100644 index 2d8d1473..00000000 --- a/src/main/java/net/Indyuce/mmocore/loot/droptable/dropitem/MMDropTableDropItem.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.Indyuce.mmocore.loot.droptable.dropitem; - -import java.util.NoSuchElementException; - -import io.lumine.xikage.mythicmobs.MythicMobs; -import io.lumine.xikage.mythicmobs.adapters.bukkit.BukkitAdapter; -import io.lumine.xikage.mythicmobs.drops.Drop; -import io.lumine.xikage.mythicmobs.drops.DropMetadata; -import io.lumine.xikage.mythicmobs.drops.DropTable; -import io.lumine.xikage.mythicmobs.drops.IItemDrop; -import io.lumine.xikage.mythicmobs.drops.LootBag; -import net.Indyuce.mmocore.loot.LootBuilder; -import io.lumine.mythic.lib.api.MMOLineConfig; - -public class MMDropTableDropItem extends DropItem { - private final DropTable dropTable; - - private static final DropMetadata metadata = new DropMetadata(null, null); - - public MMDropTableDropItem(MMOLineConfig config) { - super(config); - - config.validate("id"); - String id = config.getString("id"); - - try { - dropTable = MythicMobs.inst().getDropManager().getDropTable(id).orElse(null); - } catch (NoSuchElementException exception) { - throw new IllegalArgumentException("Could not find MM drop table with ID '" + id + "'"); - } - } - - @Override - public void collect(LootBuilder builder) { - LootBag lootBag = dropTable.generate(metadata); - for (Drop type : lootBag.getDrops()) - if (type instanceof IItemDrop) - builder.addLoot(BukkitAdapter.adapt(((IItemDrop) type).getDrop(metadata))); - } -} From 30fa13ffb1f1572090f44a640b90122e863dab46 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 12 Mar 2022 14:08:17 +0100 Subject: [PATCH 31/36] Fixed small issue with MM 5.0.1 API --- .../mmocore/comp/mythicmobs/load/MythicSkillTrigger.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/MythicSkillTrigger.java b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/MythicSkillTrigger.java index f266da7c..b4c3fcba 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/MythicSkillTrigger.java +++ b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/load/MythicSkillTrigger.java @@ -9,6 +9,7 @@ import io.lumine.mythic.api.skills.SkillTrigger; import io.lumine.mythic.bukkit.BukkitAdapter; import io.lumine.mythic.bukkit.MythicBukkit; import io.lumine.mythic.core.skills.SkillMetadataImpl; +import io.lumine.mythic.core.skills.SkillTriggers; import io.lumine.mythic.lib.api.MMOLineConfig; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.quest.trigger.Trigger; @@ -37,7 +38,7 @@ public class MythicSkillTrigger extends Trigger { AbstractPlayer trigger = BukkitAdapter.adapt(player.getPlayer()); SkillCaster caster = new GenericCaster(trigger); - SkillMetadata skillMeta = new SkillMetadataImpl(new SkillTrigger("API", new ArrayList<>()), caster, trigger, BukkitAdapter.adapt(player.getPlayer().getLocation()), new HashSet<>(), null, 1); + SkillMetadata skillMeta = new SkillMetadataImpl(SkillTriggers.API, caster, trigger, BukkitAdapter.adapt(player.getPlayer().getLocation()), new HashSet<>(), null, 1); if (skill.isUsable(skillMeta)) skill.execute(skillMeta); } From 56996788a915e73ebfd3e23ab38e45bc79d6929d Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 12 Mar 2022 14:20:49 +0100 Subject: [PATCH 32/36] Fixed an issue with /mm reload --- src/main/java/net/Indyuce/mmocore/MMOCore.java | 6 +++++- .../Indyuce/mmocore/command/rpg/ReloadCommandTreeNode.java | 4 ---- .../net/Indyuce/mmocore/comp/mythicmobs/MythicHook.java | 6 ++---- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/Indyuce/mmocore/MMOCore.java b/src/main/java/net/Indyuce/mmocore/MMOCore.java index 635b32b2..bb02fa74 100644 --- a/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -383,7 +383,8 @@ public class MMOCore extends LuminePlugin { * @param clearBefore True when issuing a plugin reload */ public void initializePlugin(boolean clearBefore) { - reloadConfig(); + if (clearBefore) + reloadConfig(); configManager = new ConfigManager(); @@ -417,6 +418,9 @@ public class MMOCore extends LuminePlugin { actionBarManager.reload(getConfig().getConfigurationSection("action-bar")); StatType.load(); + + if (clearBefore) + PlayerData.getAll().forEach(PlayerData::update); } public static void log(String message) { diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/ReloadCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/ReloadCommandTreeNode.java index ba033ff7..c85df307 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/ReloadCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/ReloadCommandTreeNode.java @@ -18,15 +18,11 @@ public class ReloadCommandTreeNode extends CommandTreeNode { sender.sendMessage(ChatColor.YELLOW + "Reloading " + MMOCore.plugin.getName() + " " + MMOCore.plugin.getDescription().getVersion() + "..."); long ms = System.currentTimeMillis(); - MMOCore.plugin.reloadConfig(); MMOCore.plugin.initializePlugin(true); - - PlayerData.getAll().forEach(PlayerData::update); ms = System.currentTimeMillis() - ms; sender.sendMessage(ChatColor.YELLOW + MMOCore.plugin.getName() + " " + MMOCore.plugin.getDescription().getVersion() + " successfully reloaded."); sender.sendMessage(ChatColor.YELLOW + "Time Taken: " + ChatColor.GOLD + ms + ChatColor.YELLOW + "ms (" + ChatColor.GOLD + (double) ms / 50 + ChatColor.YELLOW + " ticks)"); return CommandResult.SUCCESS; } - } diff --git a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicHook.java b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicHook.java index 59a92e8a..bbcc4a53 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicHook.java +++ b/src/main/java/net/Indyuce/mmocore/comp/mythicmobs/MythicHook.java @@ -41,10 +41,8 @@ public class MythicHook implements Listener { // When MM is reloaded, reload placeholders because they are no longer registered registerPlaceholders(); - // Reload skills - MMOCore.plugin.skillManager.initialize(true); - MMOCore.plugin.classManager.initialize(true); - PlayerData.getAll().forEach(PlayerData::update); + // Reload every god damn thing + MMOCore.plugin.initializePlugin(true); } private void registerPlaceholders() { From 735baac9013f172703216570ed6fb7cabb24c812 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sun, 20 Mar 2022 14:41:53 +0100 Subject: [PATCH 33/36] Changed the way placeholders are parsed in the GUI --- .../mmocore/gui/api/item/Placeholders.java | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/Indyuce/mmocore/gui/api/item/Placeholders.java b/src/main/java/net/Indyuce/mmocore/gui/api/item/Placeholders.java index 8e76720a..6843fd81 100644 --- a/src/main/java/net/Indyuce/mmocore/gui/api/item/Placeholders.java +++ b/src/main/java/net/Indyuce/mmocore/gui/api/item/Placeholders.java @@ -7,28 +7,25 @@ import java.util.HashMap; import java.util.Map; public class Placeholders { - private final Map placeholders = new HashMap<>(); + private final Map placeholders = new HashMap<>(); - public void register(String path, Object obj) { - placeholders.put(path, obj.toString()); - } + public void register(String path, Object obj) { + placeholders.put(path, obj.toString()); + } - public String apply(Player player, String str) { + public String apply(Player player, String str) { - /* - * Remove potential conditions, apply color codes - * and external placeholders if needed. - */ - str = MMOCore.plugin.placeholderParser.parse(player, removeCondition(str)); - - while (str.contains("{") && str.substring(str.indexOf("{")).contains("}")) { + // Internal placeholders + while (str.contains("{") && str.substring(str.indexOf("{")).contains("}")) { String holder = str.substring(str.indexOf("{") + 1, str.indexOf("}")); str = str.replace("{" + holder + "}", placeholders.getOrDefault(holder, "Error")); } - return str; - } - private String removeCondition(String str) { - return str.startsWith("{") && str.contains("}") ? str.substring(str.indexOf("}") + 1) : str; - } + // External placeholders + return MMOCore.plugin.placeholderParser.parse(player, removeCondition(str)); + } + + private String removeCondition(String str) { + return str.startsWith("{") && str.contains("}") ? str.substring(str.indexOf("}") + 1) : str; + } } From 2d3249b15f2d240258ee7ffbb018d0e1e462fcf2 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sun, 20 Mar 2022 15:16:09 +0100 Subject: [PATCH 34/36] Fixed an issue with exp holos --- .../java/net/Indyuce/mmocore/api/player/PlayerData.java | 2 +- .../java/net/Indyuce/mmocore/api/util/MMOCoreUtils.java | 8 ++++++++ .../mmocore/experience/dispenser/ExperienceDispenser.java | 4 +++- .../experience/source/KillMobExperienceSource.java | 3 ++- 4 files changed, 14 insertions(+), 3 deletions(-) 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 5e0c6ee5..5499c244 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java @@ -538,7 +538,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc // Experience hologram if (hologramLocation != null && isOnline()) - MMOCoreUtils.displayIndicator(hologramLocation.add(.5, 1.5, .5), MMOCore.plugin.configManager.getSimpleMessage("exp-hologram", "exp", "" + value).message()); + MMOCoreUtils.displayIndicator(hologramLocation, MMOCore.plugin.configManager.getSimpleMessage("exp-hologram", "exp", "" + value).message()); value = MMOCore.plugin.boosterManager.calculateExp(null, value); value *= 1 + getStats().getStat(StatType.ADDITIONAL_EXPERIENCE) / 100; 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 869fa6be..b15bb60a 100644 --- a/src/main/java/net/Indyuce/mmocore/api/util/MMOCoreUtils.java +++ b/src/main/java/net/Indyuce/mmocore/api/util/MMOCoreUtils.java @@ -65,6 +65,7 @@ public class MMOCoreUtils { */ public static void displayIndicator(Location loc, String message) { Hologram holo = Hologram.create(Position.of(loc), Arrays.asList(message)); + holo.spawn(); Bukkit.getScheduler().runTaskLater(MMOCore.plugin, () -> holo.despawn(), 20); } @@ -212,4 +213,11 @@ public class MMOCoreUtils { item.setItemMeta(meta); } } + + /** + * @return Center location of an entity using its bounding box + */ + public static Location getCenterLocation(Entity entity) { + return entity.getBoundingBox().getCenter().toLocation(entity.getWorld()); + } } diff --git a/src/main/java/net/Indyuce/mmocore/experience/dispenser/ExperienceDispenser.java b/src/main/java/net/Indyuce/mmocore/experience/dispenser/ExperienceDispenser.java index cdc266da..5ac9eac0 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/dispenser/ExperienceDispenser.java +++ b/src/main/java/net/Indyuce/mmocore/experience/dispenser/ExperienceDispenser.java @@ -1,6 +1,7 @@ package net.Indyuce.mmocore.experience.dispenser; import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.experience.EXPSource; import org.bukkit.Location; import org.jetbrains.annotations.NotNull; @@ -37,7 +38,8 @@ public interface ExperienceDispenser { */ boolean shouldHandle(PlayerData playerData); + @Nullable default Location getPlayerLocation(PlayerData player) { - return player.isOnline() ? player.getPlayer().getLocation() : null; + return player.isOnline() ? MMOCoreUtils.getCenterLocation(player.getPlayer()) : null; } } diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/KillMobExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/KillMobExperienceSource.java index 82742749..3596a77d 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/source/KillMobExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/experience/source/KillMobExperienceSource.java @@ -4,6 +4,7 @@ import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.event.PlayerKillEntityEvent; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; @@ -34,7 +35,7 @@ public class KillMobExperienceSource extends SpecificExperienceSource { for (KillMobExperienceSource source : getSources()) if (source.matches(data, event.getTarget())) - source.giveExperience(data, 1, event.getTarget().getLocation()); + source.giveExperience(data, 1, MMOCoreUtils.getCenterLocation(event.getTarget())); } }, 2); } From 5660a31d865644579f61af74e69211f612f76b3b Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sun, 20 Mar 2022 15:18:58 +0100 Subject: [PATCH 35/36] Improved format of exp amount in exp holo message --- .../java/net/Indyuce/mmocore/api/player/PlayerData.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) 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 5499c244..0fae0302 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java @@ -1,5 +1,6 @@ package net.Indyuce.mmocore.api.player; +import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.api.player.MMOPlayerData; import io.lumine.mythic.lib.player.TemporaryPlayerData; import io.lumine.mythic.lib.player.cooldown.CooldownMap; @@ -536,10 +537,6 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc return; } - // Experience hologram - if (hologramLocation != null && isOnline()) - MMOCoreUtils.displayIndicator(hologramLocation, MMOCore.plugin.configManager.getSimpleMessage("exp-hologram", "exp", "" + value).message()); - value = MMOCore.plugin.boosterManager.calculateExp(null, value); value *= 1 + getStats().getStat(StatType.ADDITIONAL_EXPERIENCE) / 100; @@ -557,6 +554,10 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc if (event.isCancelled()) return; + // Experience hologram + if (hologramLocation != null && isOnline()) + MMOCoreUtils.displayIndicator(hologramLocation, MMOCore.plugin.configManager.getSimpleMessage("exp-hologram", "exp", String.valueOf(event.getExperience())).message()); + experience = Math.max(0, experience + event.getExperience()); // Calculate the player's next level From 045b349183f3c580f2d1416a7c5c42f737c8cbaa Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sun, 20 Mar 2022 16:38:49 +0100 Subject: [PATCH 36/36] Fixed an issue with player head in parties/guilds/friends --- .../net/Indyuce/mmocore/gui/PlayerStats.java | 14 +- .../mmocore/gui/api/GeneratedInventory.java | 141 +++++---- .../mmocore/gui/api/item/InventoryItem.java | 233 +++++++------- .../gui/api/item/SimplePlaceholderItem.java | 4 + .../gui/social/friend/EditableFriendList.java | 70 ++--- .../gui/social/guild/EditableGuildAdmin.java | 28 +- .../gui/social/guild/EditableGuildView.java | 32 +- .../gui/social/party/EditablePartyView.java | 283 +++++++++--------- 8 files changed, 416 insertions(+), 389 deletions(-) diff --git a/src/main/java/net/Indyuce/mmocore/gui/PlayerStats.java b/src/main/java/net/Indyuce/mmocore/gui/PlayerStats.java index e7bdfff5..0a870c26 100644 --- a/src/main/java/net/Indyuce/mmocore/gui/PlayerStats.java +++ b/src/main/java/net/Indyuce/mmocore/gui/PlayerStats.java @@ -200,13 +200,15 @@ public class PlayerStats extends EditableInventory { @Override public ItemStack display(GeneratedInventory inv, int n) { - ItemStack item = super.display(inv, n); - if (item.getType() == VersionMaterial.PLAYER_HEAD.toMaterial()) { - SkullMeta meta = (SkullMeta) item.getItemMeta(); - meta.setOwningPlayer(inv.getPlayer()); - item.setItemMeta(meta); + ItemStack disp = super.display(inv, n); + if (disp.getType() == VersionMaterial.PLAYER_HEAD.toMaterial()) { + SkullMeta meta = (SkullMeta) disp.getItemMeta(); + inv.dynamicallyUpdateItem(this, n, disp, current -> { + meta.setOwningPlayer(inv.getPlayer()); + current.setItemMeta(meta); + }); } - return item; + return disp; } @Override diff --git a/src/main/java/net/Indyuce/mmocore/gui/api/GeneratedInventory.java b/src/main/java/net/Indyuce/mmocore/gui/api/GeneratedInventory.java index b3cca611..f01e98e2 100644 --- a/src/main/java/net/Indyuce/mmocore/gui/api/GeneratedInventory.java +++ b/src/main/java/net/Indyuce/mmocore/gui/api/GeneratedInventory.java @@ -1,95 +1,112 @@ package net.Indyuce.mmocore.gui.api; import io.lumine.mythic.lib.MythicLib; +import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.gui.api.item.InventoryItem; import net.Indyuce.mmocore.gui.api.item.TriggerItem; import org.bukkit.Bukkit; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.List; +import java.util.function.Consumer; public abstract class GeneratedInventory extends PluginInventory { - private final EditableInventory editable; - private final List loaded = new ArrayList<>(); + private final EditableInventory editable; + private final List loaded = new ArrayList<>(); - public GeneratedInventory(PlayerData playerData, EditableInventory editable) { - super(playerData); + private Inventory open; - this.editable = editable; - } + public GeneratedInventory(PlayerData playerData, EditableInventory editable) { + super(playerData); - public List getLoaded() { - return loaded; - } + this.editable = editable; + } - public EditableInventory getEditable() { - return editable; - } + public List getLoaded() { + return loaded; + } - public InventoryItem getByFunction(String function) { - for (InventoryItem item : loaded) - if (item.getFunction().equals(function)) - return item; - return null; - } + public EditableInventory getEditable() { + return editable; + } - public InventoryItem getBySlot(int slot) { - for (InventoryItem item : loaded) - if (item.getSlots().contains(slot)) - return item; - return null; - } + public InventoryItem getByFunction(String function) { + for (InventoryItem item : loaded) + if (item.getFunction().equals(function)) + return item; + return null; + } - /** - * This method must use an ordered collection because - * of GUI items overriding possibilities. Hence the use - * of an array list instead of a set - */ - public void addLoaded(InventoryItem item) { - loaded.add(0, item); - } + public InventoryItem getBySlot(int slot) { + for (InventoryItem item : loaded) + if (item.getSlots().contains(slot)) + return item; + return null; + } - @Override - public Inventory getInventory() { - Inventory inv = Bukkit.createInventory(this, editable.getSlots(), MythicLib.plugin.parseColors(calculateName())); + /** + * This method must use an ordered collection because + * of GUI items overriding possibilities. Hence the use + * of an array list instead of a set + */ + public void addLoaded(InventoryItem item) { + loaded.add(0, item); + } - for (InventoryItem item : editable.getItems()) - if (item.canDisplay(this)) - item.setDisplayed(inv, this); + @Override + public Inventory getInventory() { + Inventory inv = Bukkit.createInventory(this, editable.getSlots(), MythicLib.plugin.parseColors(calculateName())); - return inv; - } + for (InventoryItem item : editable.getItems()) + if (item.canDisplay(this)) + item.setDisplayed(inv, this); - public void open() { + return inv; + } - /* - * Very important, in order to prevent ghost items, the loaded items map - * must be cleared when the inventory is updated or open at least twice - */ - loaded.clear(); + public void open() { - getPlayer().openInventory(getInventory()); - } + /* + * Very important, in order to prevent ghost items, the loaded items map + * must be cleared when the inventory is updated or open at least twice + */ + loaded.clear(); - public void whenClicked(InventoryClickEvent event) { - event.setCancelled(true); + getPlayer().openInventory(open = getInventory()); + } - if (event.getClickedInventory() != null && event.getClickedInventory().equals(event.getInventory())) { - InventoryItem item = getBySlot(event.getSlot()); - if (item == null) - return; + /** + * @deprecated Not a fan of that implementation. + * Better work with {@link InventoryItem#setDisplayed(Inventory, GeneratedInventory)} + */ + @Deprecated + public void dynamicallyUpdateItem(InventoryItem item, int n, ItemStack placed, Consumer update) { + Bukkit.getScheduler().runTaskAsynchronously(MMOCore.plugin, () -> { + update.accept(placed); + open.setItem(item.getSlots().get(n), placed); + }); + } - if (item instanceof TriggerItem) - ((TriggerItem) item).getTrigger().apply(getPlayerData()); - else - whenClicked(event, item); - } - } + public void whenClicked(InventoryClickEvent event) { + event.setCancelled(true); - public abstract String calculateName(); + if (event.getClickedInventory() != null && event.getClickedInventory().equals(event.getInventory())) { + InventoryItem item = getBySlot(event.getSlot()); + if (item == null) + return; - public abstract void whenClicked(InventoryClickEvent event, InventoryItem item); + if (item instanceof TriggerItem) + ((TriggerItem) item).getTrigger().apply(getPlayerData()); + else + whenClicked(event, item); + } + } + + public abstract String calculateName(); + + public abstract void whenClicked(InventoryClickEvent event, InventoryItem item); } diff --git a/src/main/java/net/Indyuce/mmocore/gui/api/item/InventoryItem.java b/src/main/java/net/Indyuce/mmocore/gui/api/item/InventoryItem.java index 395e2f7a..1de7b85d 100644 --- a/src/main/java/net/Indyuce/mmocore/gui/api/item/InventoryItem.java +++ b/src/main/java/net/Indyuce/mmocore/gui/api/item/InventoryItem.java @@ -13,6 +13,8 @@ import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.SkullMeta; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.lang.reflect.Field; import java.util.ArrayList; @@ -21,147 +23,160 @@ import java.util.UUID; import java.util.logging.Level; public abstract class InventoryItem { - private final String id, function; - private final List slots = new ArrayList<>(); + private final String id, function; + private final List slots = new ArrayList<>(); - private final Material material; - private final String name, texture; - private final List lore; - private final int modelData; - private final boolean placeholders, hideFlags; + @Nullable + private final InventoryItem parent; - public InventoryItem(ConfigurationSection config) { - this(Material.valueOf(config.getString("item", "").toUpperCase().replace(" ", "_").replace("-", "_")), config); - } + private final Material material; + private final String name, texture; + private final List lore; + private final int modelData; + private final boolean hideFlags; - public InventoryItem(Material material, ConfigurationSection config) { - this.id = config.getName(); - this.function = config.getString("function", ""); + public InventoryItem(ConfigurationSection config) { + this((InventoryItem) null, config); + } - this.material = material; - this.name = config.getString("name"); - this.lore = config.getStringList("lore"); - this.hideFlags = config.getBoolean("hide-flags"); - this.texture = config.getString("texture"); - this.placeholders = config.getBoolean("placeholders"); - this.modelData = config.getInt("custom-model-data"); + public InventoryItem(@Nullable InventoryItem parent, ConfigurationSection config) { + this(parent, Material.valueOf(config.getString("item", "").toUpperCase().replace(" ", "_").replace("-", "_")), config); + } - config.getStringList("slots").forEach(str -> slots.add(Integer.parseInt(str))); - } + public InventoryItem(@NotNull Material material, ConfigurationSection config) { + this(null, material, config); + } - public String getId() { - return id; - } + public InventoryItem(InventoryItem parent, Material material, ConfigurationSection config) { + this.id = config.getName(); + this.function = config.getString("function", ""); + this.parent = parent; - public String getFunction() { - return function; - } + this.material = material; + this.name = config.getString("name"); + this.lore = config.getStringList("lore"); + this.hideFlags = config.getBoolean("hide-flags"); + this.texture = config.getString("texture"); + this.modelData = config.getInt("custom-model-data"); - public boolean hasFunction() { - return !function.isEmpty(); - } + config.getStringList("slots").forEach(str -> slots.add(Integer.parseInt(str))); + } - public List getSlots() { - return slots; - } + public String getId() { + return id; + } - public Material getMaterial() { - return material; - } + @NotNull + public String getFunction() { + return parent == null ? function : parent.function; + } - public boolean hideFlags() { - return hideFlags; - } + public boolean hasFunction() { + return !getFunction().isEmpty(); + } - public boolean hasName() { - return name != null; - } + @NotNull + public List getSlots() { + return parent == null ? slots : parent.slots; + } - public String getName() { - return name; - } + public Material getMaterial() { + return material; + } - public boolean hasLore() { - return lore != null && !lore.isEmpty(); - } + public boolean hideFlags() { + return hideFlags; + } - public List getLore() { - return lore; - } + public boolean hasName() { + return name != null; + } - public int getModelData() { - return modelData; - } + public String getName() { + return name; + } - public void setDisplayed(Inventory inv, T generated) { - generated.addLoaded(this); + public boolean hasLore() { + return lore != null && !lore.isEmpty(); + } - if (!hasDifferentDisplay()) { - ItemStack display = display(generated); - for (int slot : getSlots()) - inv.setItem(slot, display); - } else - for (int j = 0; j < slots.size(); j++) - inv.setItem(slots.get(j), display(generated, j)); + public List getLore() { + return lore; + } - } + public int getModelData() { + return modelData; + } - public boolean hasDifferentDisplay() { - return false; - } + public void setDisplayed(Inventory inv, T generated) { + generated.addLoaded(this); - public boolean canDisplay(T inv) { - return true; - } + if (!hasDifferentDisplay()) { + ItemStack display = display(generated); + for (int slot : getSlots()) + inv.setItem(slot, display); + } else + for (int j = 0; j < slots.size(); j++) + inv.setItem(slots.get(j), display(generated, j)); - public ItemStack display(T inv) { - return display(inv, 0); - } + } - public ItemStack display(T inv, int n) { + public boolean hasDifferentDisplay() { + return false; + } - Placeholders placeholders = getPlaceholders(inv, n); - ItemStack item = new ItemStack(material); - ItemMeta meta = item.getItemMeta(); + public boolean canDisplay(T inv) { + return true; + } - if (texture != null && meta instanceof SkullMeta) - applyTexture(texture, (SkullMeta) meta); + public ItemStack display(T inv) { + return display(inv, 0); + } - if (hasName()) - meta.setDisplayName(placeholders.apply(inv.getPlayer(), getName())); + public ItemStack display(T inv, int n) { - if (hideFlags()) - meta.addItemFlags(ItemFlag.values()); + Placeholders placeholders = getPlaceholders(inv, n); + ItemStack item = new ItemStack(material); + ItemMeta meta = item.getItemMeta(); - if (hasLore()) { - List lore = new ArrayList<>(); - getLore().forEach(line -> lore.add(ChatColor.GRAY + placeholders.apply(inv.getPlayer(), line))); - meta.setLore(lore); - } + if (texture != null && meta instanceof SkullMeta) + applyTexture(texture, (SkullMeta) meta); - if (MythicLib.plugin.getVersion().isStrictlyHigher(1, 13)) - meta.setCustomModelData(getModelData()); + if (hasName()) + meta.setDisplayName(placeholders.apply(inv.getPlayer(), getName())); - item.setItemMeta(meta); - return item; - } + if (hideFlags()) + meta.addItemFlags(ItemFlag.values()); - private void applyTexture(String value, SkullMeta meta) { - try { - GameProfile profile = new GameProfile(UUID.randomUUID(), null); - profile.getProperties().put("textures", new Property("textures", value)); + if (hasLore()) { + List lore = new ArrayList<>(); + getLore().forEach(line -> lore.add(ChatColor.GRAY + placeholders.apply(inv.getPlayer(), line))); + meta.setLore(lore); + } - Field profileField = meta.getClass().getDeclaredField("profile"); - profileField.setAccessible(true); - profileField.set(meta, profile); - } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException exception) { - MMOCore.log(Level.WARNING, "Could not apply item texture value of " + getId()); - } - } + if (MythicLib.plugin.getVersion().isStrictlyHigher(1, 13)) + meta.setCustomModelData(getModelData()); - public Placeholders getPlaceholders(T inv) { - return getPlaceholders(inv, 0); - } + item.setItemMeta(meta); + return item; + } - public abstract Placeholders getPlaceholders(T inv, int n); + private void applyTexture(String value, SkullMeta meta) { + try { + GameProfile profile = new GameProfile(UUID.randomUUID(), null); + profile.getProperties().put("textures", new Property("textures", value)); + + Field profileField = meta.getClass().getDeclaredField("profile"); + profileField.setAccessible(true); + profileField.set(meta, profile); + } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException exception) { + MMOCore.log(Level.WARNING, "Could not apply item texture value of " + getId()); + } + } + + public Placeholders getPlaceholders(T inv) { + return getPlaceholders(inv, 0); + } + + public abstract Placeholders getPlaceholders(T inv, int n); } diff --git a/src/main/java/net/Indyuce/mmocore/gui/api/item/SimplePlaceholderItem.java b/src/main/java/net/Indyuce/mmocore/gui/api/item/SimplePlaceholderItem.java index 4f152333..57cf9f97 100644 --- a/src/main/java/net/Indyuce/mmocore/gui/api/item/SimplePlaceholderItem.java +++ b/src/main/java/net/Indyuce/mmocore/gui/api/item/SimplePlaceholderItem.java @@ -5,6 +5,10 @@ import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; public class SimplePlaceholderItem extends InventoryItem { + public SimplePlaceholderItem(InventoryItem parent, ConfigurationSection config) { + super(parent, config); + } + public SimplePlaceholderItem(ConfigurationSection config) { super(config); } diff --git a/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendList.java b/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendList.java index 4b7ae05f..040ff023 100644 --- a/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendList.java +++ b/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendList.java @@ -1,7 +1,5 @@ package net.Indyuce.mmocore.gui.social.friend; -import io.lumine.mythic.lib.api.item.ItemTag; -import io.lumine.mythic.lib.api.item.NBTItem; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerActivity; import net.Indyuce.mmocore.api.player.PlayerData; @@ -15,6 +13,7 @@ import net.Indyuce.mmocore.gui.api.item.SimplePlaceholderItem; import net.Indyuce.mmocore.manager.InventoryManager; import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; +import org.bukkit.NamespacedKey; import org.bukkit.OfflinePlayer; import org.bukkit.Sound; import org.bukkit.configuration.ConfigurationSection; @@ -24,10 +23,13 @@ import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.SkullMeta; +import org.bukkit.persistence.PersistentDataType; import java.util.UUID; public class EditableFriendList extends EditableInventory { + private static final NamespacedKey UUID_NAMESPACEDKEY = new NamespacedKey(MMOCore.plugin, "Uuid"); + public EditableFriendList() { super("friend-list"); } @@ -64,8 +66,8 @@ public class EditableFriendList extends EditableInventory { } public static class OfflineFriendItem extends InventoryItem { - public OfflineFriendItem(ConfigurationSection config) { - super(config); + public OfflineFriendItem(FriendItem parent, ConfigurationSection config) { + super(parent, config); } @Override @@ -82,27 +84,11 @@ public class EditableFriendList extends EditableInventory { holders.register("last_seen", new DelayFormat(2).format(System.currentTimeMillis() - friend.getLastPlayed())); return holders; } - - @Override - public ItemStack display(GeneratedInventory inv, int n) { - OfflinePlayer friend = Bukkit.getOfflinePlayer(inv.getPlayerData().getFriends().get(n)); - - ItemStack disp = super.display(inv, n); - ItemMeta meta = disp.getItemMeta(); - - if (meta instanceof SkullMeta) - Bukkit.getScheduler().runTaskAsynchronously(MMOCore.plugin, () -> { - ((SkullMeta) meta).setOwningPlayer(friend); - disp.setItemMeta(meta); - }); - - return NBTItem.get(disp).addTag(new ItemTag("uuid", friend.getUniqueId().toString())).toItem(); - } } public static class OnlineFriendItem extends SimplePlaceholderItem { - public OnlineFriendItem(ConfigurationSection config) { - super(config); + public OnlineFriendItem(FriendItem parent, ConfigurationSection config) { + super(parent, config); } @Override @@ -123,22 +109,6 @@ public class EditableFriendList extends EditableInventory { holders.register("online_since", new DelayFormat(2).format(System.currentTimeMillis() - data.getLastLogin())); return holders; } - - @Override - public ItemStack display(GeneratedInventory inv, int n) { - Player friend = Bukkit.getPlayer(inv.getPlayerData().getFriends().get(n)); - - ItemStack disp = super.display(inv, n); - ItemMeta meta = disp.getItemMeta(); - - if (meta instanceof SkullMeta) - Bukkit.getScheduler().runTaskAsynchronously(MMOCore.plugin, () -> { - ((SkullMeta) meta).setOwningPlayer(friend); - disp.setItemMeta(meta); - }); - - return NBTItem.get(disp).addTag(new ItemTag("uuid", friend.getUniqueId().toString())).toItem(); - } } public static class FriendItem extends SimplePlaceholderItem { @@ -151,14 +121,28 @@ public class EditableFriendList extends EditableInventory { Validate.notNull(config.contains("online"), "Could not load online config"); Validate.notNull(config.contains("offline"), "Could not load offline config"); - online = new OnlineFriendItem(config.getConfigurationSection("online")); - offline = new OfflineFriendItem(config.getConfigurationSection("offline")); + online = new OnlineFriendItem(this, config.getConfigurationSection("online")); + offline = new OfflineFriendItem(this, config.getConfigurationSection("offline")); } @Override public ItemStack display(GeneratedInventory inv, int n) { - return inv.getPlayerData().getFriends().size() <= n ? super.display(inv, n) - : Bukkit.getOfflinePlayer(inv.getPlayerData().getFriends().get(n)).isOnline() ? online.display(inv, n) : offline.display(inv, n); + if (inv.getPlayerData().getFriends().size() <= n) + return super.display(inv, n); + + ItemStack disp = Bukkit.getOfflinePlayer(inv.getPlayerData().getFriends().get(n)).isOnline() ? online.display(inv, n) : offline.display(inv, n); + Player friend = Bukkit.getPlayer(inv.getPlayerData().getFriends().get(n)); + ItemMeta meta = disp.getItemMeta(); + meta.getPersistentDataContainer().set(UUID_NAMESPACEDKEY, PersistentDataType.STRING, friend.getUniqueId().toString()); + + if (meta instanceof SkullMeta) + inv.dynamicallyUpdateItem(this, n, disp, current -> { + ((SkullMeta) meta).setOwningPlayer(friend); + current.setItemMeta(meta); + }); + + disp.setItemMeta(meta); + return disp; } @Override @@ -238,7 +222,7 @@ public class EditableFriendList extends EditableInventory { } if (item.getFunction().equals("friend") && event.getAction() == InventoryAction.PICKUP_HALF) { - String tag = NBTItem.get(event.getCurrentItem()).getString("uuid"); + String tag = event.getCurrentItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING); if (tag == null || tag.isEmpty()) return; diff --git a/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildAdmin.java b/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildAdmin.java index d4ffc20a..accda5e7 100644 --- a/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildAdmin.java +++ b/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildAdmin.java @@ -13,6 +13,7 @@ import net.Indyuce.mmocore.gui.api.item.Placeholders; import net.Indyuce.mmocore.gui.api.item.SimplePlaceholderItem; import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; +import org.bukkit.NamespacedKey; import org.bukkit.OfflinePlayer; import org.bukkit.Sound; import org.bukkit.configuration.ConfigurationSection; @@ -22,10 +23,13 @@ import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.SkullMeta; +import org.bukkit.persistence.PersistentDataType; import java.util.UUID; public class EditableGuildAdmin extends EditableInventory { + private static final NamespacedKey UUID_NAMESPACEDKEY = new NamespacedKey(MMOCore.plugin, "Uuid"); + public EditableGuildAdmin() { super("guild-admin"); } @@ -40,8 +44,8 @@ public class EditableGuildAdmin extends EditableInventory { } public static class MemberDisplayItem extends InventoryItem { - public MemberDisplayItem(ConfigurationSection config) { - super(config); + public MemberDisplayItem(MemberItem memberItem, ConfigurationSection config) { + super(memberItem, config); } @Override @@ -65,19 +69,21 @@ public class EditableGuildAdmin extends EditableInventory { @Override public ItemStack display(GeneratedInventory inv, int n) { - PlayerData member = PlayerData.get(inv.getPlayerData().getGuild().getMembers().get(n)); + UUID uuid = inv.getPlayerData().getGuild().getMembers().get(n); + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(uuid); ItemStack disp = super.display(inv, n); ItemMeta meta = disp.getItemMeta(); + meta.getPersistentDataContainer().set(UUID_NAMESPACEDKEY, PersistentDataType.STRING, uuid.toString()); - if (meta instanceof SkullMeta) - Bukkit.getScheduler().runTaskAsynchronously(MMOCore.plugin, () -> { - if (!member.isOnline()) return; - ((SkullMeta) meta).setOwningPlayer(member.getPlayer()); - disp.setItemMeta(meta); + if (meta instanceof SkullMeta && offlinePlayer != null) + inv.dynamicallyUpdateItem(this, n, disp, current -> { + ((SkullMeta) meta).setOwningPlayer(offlinePlayer); + current.setItemMeta(meta); }); - return NBTItem.get(disp).addTag(new ItemTag("uuid", member.getUniqueId().toString())).toItem(); + disp.setItemMeta(meta); + return disp; } } @@ -92,7 +98,7 @@ public class EditableGuildAdmin extends EditableInventory { Validate.notNull(config.contains("member"), "Could not load member config"); empty = new SimplePlaceholderItem(config.getConfigurationSection("empty")); - member = new MemberDisplayItem(config.getConfigurationSection("member")); + member = new MemberDisplayItem(this, config.getConfigurationSection("member")); } @Override @@ -174,7 +180,7 @@ public class EditableGuildAdmin extends EditableInventory { if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId())) return; - OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(NBTItem.get(event.getCurrentItem()).getString("uuid"))); + OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(event.getCurrentItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING))); if (target.equals(player)) return; diff --git a/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildView.java b/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildView.java index 161dad7e..165b87e3 100644 --- a/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildView.java +++ b/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildView.java @@ -1,7 +1,5 @@ package net.Indyuce.mmocore.gui.social.guild; -import io.lumine.mythic.lib.api.item.ItemTag; -import io.lumine.mythic.lib.api.item.NBTItem; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.OfflinePlayerData; import net.Indyuce.mmocore.api.player.PlayerData; @@ -13,10 +11,7 @@ import net.Indyuce.mmocore.gui.api.item.InventoryItem; import net.Indyuce.mmocore.gui.api.item.Placeholders; import net.Indyuce.mmocore.gui.api.item.SimplePlaceholderItem; import org.apache.commons.lang.Validate; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Sound; +import org.bukkit.*; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryAction; @@ -24,10 +19,13 @@ import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.SkullMeta; +import org.bukkit.persistence.PersistentDataType; import java.util.UUID; public class EditableGuildView extends EditableInventory { + private static final NamespacedKey UUID_NAMESPACEDKEY = new NamespacedKey(MMOCore.plugin, "Uuid"); + public EditableGuildView() { super("guild-view"); } @@ -38,8 +36,8 @@ public class EditableGuildView extends EditableInventory { } public static class MemberDisplayItem extends InventoryItem { - public MemberDisplayItem(ConfigurationSection config) { - super(config); + public MemberDisplayItem(MemberItem memberItem, ConfigurationSection config) { + super(memberItem, config); } @Override @@ -71,14 +69,16 @@ public class EditableGuildView extends EditableInventory { ItemStack disp = super.display(inv, n); ItemMeta meta = disp.getItemMeta(); + meta.getPersistentDataContainer().set(UUID_NAMESPACEDKEY, PersistentDataType.STRING, uuid.toString()); if (meta instanceof SkullMeta) - Bukkit.getScheduler().runTaskAsynchronously(MMOCore.plugin, () -> { + inv.dynamicallyUpdateItem(this, n, disp, current -> { ((SkullMeta) meta).setOwningPlayer(Bukkit.getOfflinePlayer(uuid)); - disp.setItemMeta(meta); + current.setItemMeta(meta); }); - return NBTItem.get(disp).addTag(new ItemTag("uuid", uuid.toString())).toItem(); + disp.setItemMeta(meta); + return disp; } } @@ -93,7 +93,7 @@ public class EditableGuildView extends EditableInventory { Validate.notNull(config.contains("member"), "Could not load member config"); empty = new SimplePlaceholderItem(config.getConfigurationSection("empty")); - member = new MemberDisplayItem(config.getConfigurationSection("member")); + member = new MemberDisplayItem(this, config.getConfigurationSection("member")); } @Override @@ -223,11 +223,15 @@ public class EditableGuildView extends EditableInventory { }); } - if (item.getFunction().equals("member") && event.getAction() == InventoryAction.PICKUP_HALF && !NBTItem.get(event.getCurrentItem()).getString("uuid").isEmpty()) { + if (item.getFunction().equals("member") && event.getAction() == InventoryAction.PICKUP_HALF) { if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId())) return; - OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(NBTItem.get(event.getCurrentItem()).getString("uuid"))); + String tag = event.getCurrentItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING); + if (tag == null || tag.isEmpty()) + return; + + OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(tag)); if (target.equals(player)) return; diff --git a/src/main/java/net/Indyuce/mmocore/gui/social/party/EditablePartyView.java b/src/main/java/net/Indyuce/mmocore/gui/social/party/EditablePartyView.java index a115dec2..ce442cf2 100644 --- a/src/main/java/net/Indyuce/mmocore/gui/social/party/EditablePartyView.java +++ b/src/main/java/net/Indyuce/mmocore/gui/social/party/EditablePartyView.java @@ -1,7 +1,5 @@ package net.Indyuce.mmocore.gui.social.party; -import io.lumine.mythic.lib.api.item.ItemTag; -import io.lumine.mythic.lib.api.item.NBTItem; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.util.input.PlayerInput.InputType; @@ -13,10 +11,7 @@ import net.Indyuce.mmocore.gui.api.item.Placeholders; import net.Indyuce.mmocore.gui.api.item.SimplePlaceholderItem; import net.Indyuce.mmocore.party.provided.Party; import org.apache.commons.lang.Validate; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Sound; +import org.bukkit.*; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryAction; @@ -24,178 +19,178 @@ import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.SkullMeta; +import org.bukkit.persistence.PersistentDataType; import java.util.UUID; - public class EditablePartyView extends EditableInventory { - public EditablePartyView() { - super("party-view"); - } + private static final NamespacedKey UUID_NAMESPACEDKEY = new NamespacedKey(MMOCore.plugin, "Uuid"); - @Override - public InventoryItem load(String function, ConfigurationSection config) { - return function.equals("member") ? new MemberItem(config) : new SimplePlaceholderItem(config); - } + public EditablePartyView() { + super("party-view"); + } - public static class MemberDisplayItem extends InventoryItem { - public MemberDisplayItem(ConfigurationSection config) { - super(config); - } + @Override + public InventoryItem load(String function, ConfigurationSection config) { + return function.equals("member") ? new MemberItem(config) : new SimplePlaceholderItem(config); + } - @Override - public boolean hasDifferentDisplay() { - return true; - } + public static class MemberDisplayItem extends InventoryItem { + public MemberDisplayItem(MemberItem memberItem, ConfigurationSection config) { + super(memberItem, config); + } - @Override - public Placeholders getPlaceholders(GeneratedInventory inv, int n) { - Party party = (Party) inv.getPlayerData().getParty(); - PlayerData member = party.getMembers().get(n); + @Override + public boolean hasDifferentDisplay() { + return true; + } - Placeholders holders = new Placeholders(); - if (member.isOnline()) - holders.register("name", member.getPlayer().getName()); - holders.register("class", member.getProfess().getName()); - holders.register("level", "" + member.getLevel()); - holders.register("since", new DelayFormat(2).format(System.currentTimeMillis() - member.getLastLogin())); - return holders; - } + @Override + public Placeholders getPlaceholders(GeneratedInventory inv, int n) { + Party party = (Party) inv.getPlayerData().getParty(); + PlayerData member = party.getMembers().get(n); - @Override - public ItemStack display(GeneratedInventory inv, int n) { - Party party = (Party) inv.getPlayerData().getParty(); - PlayerData member = party.getMembers().get(n); + Placeholders holders = new Placeholders(); + if (member.isOnline()) + holders.register("name", member.getPlayer().getName()); + holders.register("class", member.getProfess().getName()); + holders.register("level", "" + member.getLevel()); + holders.register("since", new DelayFormat(2).format(System.currentTimeMillis() - member.getLastLogin())); + return holders; + } - ItemStack disp = super.display(inv, n); - ItemMeta meta = disp.getItemMeta(); + @Override + public ItemStack display(GeneratedInventory inv, int n) { + Party party = (Party) inv.getPlayerData().getParty(); + PlayerData member = party.getMembers().get(n); - /* - * run async to save performance - */ - if (meta instanceof SkullMeta) - Bukkit.getScheduler().runTaskAsynchronously(MMOCore.plugin, () -> { - if (!member.isOnline()) return; - ((SkullMeta) meta).setOwningPlayer(member.getPlayer()); - disp.setItemMeta(meta); - }); + ItemStack disp = super.display(inv, n); + ItemMeta meta = disp.getItemMeta(); + meta.getPersistentDataContainer().set(UUID_NAMESPACEDKEY, PersistentDataType.STRING, member.getUniqueId().toString()); - return NBTItem.get(disp).addTag(new ItemTag("uuid", member.getUniqueId().toString())).toItem(); - } - } + if (meta instanceof SkullMeta) + inv.dynamicallyUpdateItem(this, n, disp, current -> { + ((SkullMeta) meta).setOwningPlayer(member.getPlayer()); + current.setItemMeta(meta); + }); - public static class MemberItem extends SimplePlaceholderItem { - private final InventoryItem empty; - private final MemberDisplayItem member; + disp.setItemMeta(meta); + return disp; + } + } - public MemberItem(ConfigurationSection config) { - super(Material.BARRIER, config); + public static class MemberItem extends SimplePlaceholderItem { + private final InventoryItem empty; + private final MemberDisplayItem member; - Validate.notNull(config.contains("empty"), "Could not load empty config"); - Validate.notNull(config.contains("member"), "Could not load member config"); + public MemberItem(ConfigurationSection config) { + super(Material.BARRIER, config); - empty = new SimplePlaceholderItem(config.getConfigurationSection("empty")); - member = new MemberDisplayItem(config.getConfigurationSection("member")); - } + Validate.notNull(config.contains("empty"), "Could not load empty config"); + Validate.notNull(config.contains("member"), "Could not load member config"); - @Override - public ItemStack display(GeneratedInventory inv, int n) { - Party party = (Party) inv.getPlayerData().getParty(); - return party.getMembers().size() > n ? member.display(inv, n) : empty.display(inv, n); - } + empty = new SimplePlaceholderItem(config.getConfigurationSection("empty")); + member = new MemberDisplayItem(this, config.getConfigurationSection("member")); + } - @Override - public boolean hasDifferentDisplay() { - return true; - } + @Override + public ItemStack display(GeneratedInventory inv, int n) { + Party party = (Party) inv.getPlayerData().getParty(); + return party.getMembers().size() > n ? member.display(inv, n) : empty.display(inv, n); + } - @Override - public boolean canDisplay(GeneratedInventory inv) { - return true; - } - } + @Override + public boolean hasDifferentDisplay() { + return true; + } - public GeneratedInventory newInventory(PlayerData data) { - return new PartyViewInventory(data, this); - } + @Override + public boolean canDisplay(GeneratedInventory inv) { + return true; + } + } - public class PartyViewInventory extends GeneratedInventory { - private final int max; + public GeneratedInventory newInventory(PlayerData data) { + return new PartyViewInventory(data, this); + } - public PartyViewInventory(PlayerData playerData, EditableInventory editable) { - super(playerData, editable); + public class PartyViewInventory extends GeneratedInventory { + private final int max; - max = editable.getByFunction("member").getSlots().size(); - } + public PartyViewInventory(PlayerData playerData, EditableInventory editable) { + super(playerData, editable); - @Override - public String calculateName() { - Party party = (Party) getPlayerData().getParty(); - return getName().replace("{max}", "" + max).replace("{players}", "" + party.getMembers().size()); - } + max = editable.getByFunction("member").getSlots().size(); + } - @Override - public void whenClicked(InventoryClickEvent event, InventoryItem item) { - Party party = (Party) playerData.getParty(); + @Override + public String calculateName() { + Party party = (Party) getPlayerData().getParty(); + return getName().replace("{max}", "" + max).replace("{players}", "" + party.getMembers().size()); + } - if (item.getFunction().equals("leave")) { - party.removeMember(playerData); - player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); - player.closeInventory(); - return; - } + @Override + public void whenClicked(InventoryClickEvent event, InventoryItem item) { + Party party = (Party) playerData.getParty(); - if (item.getFunction().equals("invite")) { + if (item.getFunction().equals("leave")) { + party.removeMember(playerData); + player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); + player.closeInventory(); + return; + } - if (party.getMembers().size() >= max) { - MMOCore.plugin.configManager.getSimpleMessage("party-is-full").send(player); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); - return; - } + if (item.getFunction().equals("invite")) { - MMOCore.plugin.configManager.newPlayerInput(player, InputType.PARTY_INVITE, (input) -> { - Player target = Bukkit.getPlayer(input); - if (target == null) { - MMOCore.plugin.configManager.getSimpleMessage("not-online-player", "player", input).send(player); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); - open(); - return; - } + if (party.getMembers().size() >= max) { + MMOCore.plugin.configManager.getSimpleMessage("party-is-full").send(player); + player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); + return; + } - long remaining = party.getLastInvite(target) + 60 * 2 * 1000 - System.currentTimeMillis(); - if (remaining > 0) { - MMOCore.plugin.configManager.getSimpleMessage("party-invite-cooldown", "player", target.getName(), "cooldown", new DelayFormat().format(remaining)).send(player); - open(); - return; - } + MMOCore.plugin.configManager.newPlayerInput(player, InputType.PARTY_INVITE, (input) -> { + Player target = Bukkit.getPlayer(input); + if (target == null) { + MMOCore.plugin.configManager.getSimpleMessage("not-online-player", "player", input).send(player); + player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); + open(); + return; + } - PlayerData targetData = PlayerData.get(target); - if (party.hasMember(target)) { - MMOCore.plugin.configManager.getSimpleMessage("already-in-party", "player", target.getName()).send(player); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); - open(); - return; - } + long remaining = party.getLastInvite(target) + 60 * 2 * 1000 - System.currentTimeMillis(); + if (remaining > 0) { + MMOCore.plugin.configManager.getSimpleMessage("party-invite-cooldown", "player", target.getName(), "cooldown", new DelayFormat().format(remaining)).send(player); + open(); + return; + } - party.sendInvite(playerData, targetData); - MMOCore.plugin.configManager.getSimpleMessage("sent-party-invite", "player", target.getName()).send(player); - player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); - open(); - }); - } + PlayerData targetData = PlayerData.get(target); + if (party.hasMember(target)) { + MMOCore.plugin.configManager.getSimpleMessage("already-in-party", "player", target.getName()).send(player); + player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); + open(); + return; + } - if (item.getFunction().equals("member") && event.getAction() == InventoryAction.PICKUP_HALF) { - if (!party.getOwner().equals(playerData)) - return; + party.sendInvite(playerData, targetData); + MMOCore.plugin.configManager.getSimpleMessage("sent-party-invite", "player", target.getName()).send(player); + player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); + open(); + }); + } - OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(NBTItem.get(event.getCurrentItem()).getString("uuid"))); - if (target.equals(player)) - return; + if (item.getFunction().equals("member") && event.getAction() == InventoryAction.PICKUP_HALF) { + if (!party.getOwner().equals(playerData)) + return; - party.removeMember(PlayerData.get(target)); - MMOCore.plugin.configManager.getSimpleMessage("kick-from-party", "player", target.getName()).send(player); - player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); - } - } - } + OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(event.getCurrentItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING))); + if (target.equals(player)) + return; + + party.removeMember(PlayerData.get(target)); + MMOCore.plugin.configManager.getSimpleMessage("kick-from-party", "player", target.getName()).send(player); + player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); + } + } + } }