From 637f508a905241fd8dfd2e7d0799d6110ba64977 Mon Sep 17 00:00:00 2001 From: Jules Date: Thu, 17 Apr 2025 01:13:45 +0200 Subject: [PATCH] mmocore ui centralization towards mythiclib --- .../Indyuce/mmocore/api/ConfigMessage.java | 4 + .../api/event/PlayerExperienceGainEvent.java | 2 +- .../mmocore/api/player/PlayerData.java | 2 +- .../api/quest/trigger/BindSkillTrigger.java | 2 +- .../api/quest/trigger/UnlockSkillTrigger.java | 2 +- .../mmocore/api/util/input/ChatInput.java | 7 +- .../comp/placeholder/RPGPlaceholders.java | 2 +- .../comp/region/pvpmode/PvPModeListener.java | 2 +- .../mmocore/experience/ExperienceObject.java | 2 +- .../mmocore/experience/PlayerProfessions.java | 2 +- .../source/CraftItemExperienceSource.java | 2 +- .../source/KillMobExperienceSource.java | 2 +- .../source/RepairItemExperienceSource.java | 2 +- .../Indyuce/mmocore/gui/AttributeView.java | 248 +++++----- .../mmocore/gui/ClassConfirmation.java | 124 +++-- .../net/Indyuce/mmocore/gui/ClassSelect.java | 134 +++--- .../net/Indyuce/mmocore/gui/PlayerStats.java | 320 ++++++------ .../net/Indyuce/mmocore/gui/QuestViewer.java | 262 +++++----- .../net/Indyuce/mmocore/gui/SkillList.java | 48 +- .../Indyuce/mmocore/gui/SubclassSelect.java | 112 ++--- .../Indyuce/mmocore/gui/WaypointViewer.java | 210 ++++---- .../mmocore/gui/api/EditableInventory.java | 1 + .../mmocore/gui/api/GeneratedInventory.java | 1 + .../gui/api/InventoryClickContext.java | 1 + .../mmocore/gui/api/PluginInventory.java | 1 + .../mmocore/gui/api/adaptor/Adaptor.java | 1 + .../mmocore/gui/api/adaptor/AdaptorType.java | 1 + .../gui/api/adaptor/ClassicAdaptor.java | 1 + .../gui/api/adaptor/ThreeDimAdaptor.java | 1 + .../gui/api/item/ErrorPlaceholders.java | 12 - .../mmocore/gui/api/item/InventoryItem.java | 1 + .../mmocore/gui/api/item/Placeholders.java | 1 + .../gui/api/item/SimplePlaceholderItem.java | 1 + .../mmocore/gui/api/item/TriggerItem.java | 1 + .../Indyuce/mmocore/gui/eco/DepositMenu.java | 29 +- .../Indyuce/mmocore/gui/eco/GoldPouch.java | 34 +- .../gui/skilltree/SkillTreeViewer.java | 455 +++++++++--------- .../gui/social/friend/EditableFriendList.java | 208 ++++---- .../social/friend/EditableFriendRemoval.java | 104 ++-- .../gui/social/guild/EditableGuildAdmin.java | 302 ++++++------ .../social/guild/EditableGuildCreation.java | 138 +++--- .../gui/social/guild/EditableGuildView.java | 298 ++++++------ .../social/party/EditablePartyCreation.java | 73 +-- .../gui/social/party/EditablePartyView.java | 224 +++++---- .../Indyuce/mmocore/loot/chest/LootChest.java | 2 +- .../mmocore/manager/ExperienceManager.java | 2 +- .../mmocore/manager/InventoryManager.java | 6 +- .../manager/data/GuildDataManager.java | 2 +- .../profession/CustomBlockManager.java | 2 +- .../mmocore/quest/compat/QuestModule.java | 2 +- .../mmocore/skill/binding/SkillSlot.java | 2 +- .../mmocore/skill/cast/handler/KeyCombos.java | 2 +- .../skill/cast/handler/SkillScroller.java | 2 +- .../Indyuce/mmocore/util/item/ConfigItem.java | 2 +- .../mmocore/listener/PlayerListener.java | 22 - 55 files changed, 1660 insertions(+), 1766 deletions(-) delete mode 100644 MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/ErrorPlaceholders.java diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/ConfigMessage.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/ConfigMessage.java index 0d4db073..c0a6b4b9 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/ConfigMessage.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/ConfigMessage.java @@ -90,6 +90,10 @@ public class ConfigMessage { send(player); } + public void send(PlayerData playerData) { + for (String line : lines) send(playerData.getPlayer(), line); + } + public void send(CommandSender player) { for (String line : lines) send(player, line); } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/PlayerExperienceGainEvent.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/PlayerExperienceGainEvent.java index e6515d97..62e4edb5 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/PlayerExperienceGainEvent.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/PlayerExperienceGainEvent.java @@ -6,7 +6,7 @@ import net.Indyuce.mmocore.experience.Profession; import org.bukkit.event.Cancellable; import org.bukkit.event.HandlerList; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; public class PlayerExperienceGainEvent extends PlayerDataEvent implements Cancellable { private static final HandlerList handlers = new HandlerList(); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java index 668e184b..5de3aeb7 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java @@ -62,7 +62,7 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/BindSkillTrigger.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/BindSkillTrigger.java index f86e5f51..70d6699e 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/BindSkillTrigger.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/BindSkillTrigger.java @@ -7,7 +7,7 @@ import net.Indyuce.mmocore.api.quest.trigger.api.Removable; import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skill.RegisteredSkill; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; public class BindSkillTrigger extends Trigger implements Removable { private final RegisteredSkill skill; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/UnlockSkillTrigger.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/UnlockSkillTrigger.java index 9de22153..bd6758b4 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/UnlockSkillTrigger.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/quest/trigger/UnlockSkillTrigger.java @@ -7,7 +7,7 @@ import net.Indyuce.mmocore.api.quest.trigger.api.Removable; import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skill.RegisteredSkill; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; public class UnlockSkillTrigger extends Trigger implements Removable { private final RegisteredSkill skill; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/util/input/ChatInput.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/util/input/ChatInput.java index 549bae32..839a87dc 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/util/input/ChatInput.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/util/input/ChatInput.java @@ -1,8 +1,8 @@ package net.Indyuce.mmocore.api.util.input; +import io.lumine.mythic.lib.gui.editable.GeneratedInventory; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; -import net.Indyuce.mmocore.gui.api.PluginInventory; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -13,10 +13,9 @@ import org.bukkit.util.Consumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; - public class ChatInput extends PlayerInput { private final InputType inputType; - private final PluginInventory lastOpened; + private final GeneratedInventory lastOpened; @Deprecated public ChatInput(@NotNull Player player, @NotNull InputType inputType, @NotNull Consumer output) { @@ -31,7 +30,7 @@ public class ChatInput extends PlayerInput { * @param lastOpened Inventory opened again if 'cancel' is input. Set to null to disable * @param output What to do when input is detected */ - public ChatInput(@NotNull Player player, @NotNull InputType inputType, @Nullable PluginInventory lastOpened, @NotNull Consumer output) { + public ChatInput(@NotNull Player player, @NotNull InputType inputType, @Nullable GeneratedInventory lastOpened, @NotNull Consumer output) { super(player, output); this.inputType = inputType; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/placeholder/RPGPlaceholders.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/placeholder/RPGPlaceholders.java index 48bf6d06..79cc9002 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/placeholder/RPGPlaceholders.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/placeholder/RPGPlaceholders.java @@ -23,7 +23,7 @@ import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import java.util.Objects; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/region/pvpmode/PvPModeListener.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/region/pvpmode/PvPModeListener.java index 82053faa..7d03b5cd 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/region/pvpmode/PvPModeListener.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/region/pvpmode/PvPModeListener.java @@ -14,7 +14,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; public class PvPModeListener implements Listener { public PvPModeListener() { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/ExperienceObject.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/ExperienceObject.java index 8fca7db7..15a80e95 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/ExperienceObject.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/ExperienceObject.java @@ -5,7 +5,7 @@ import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.droptable.ExperienceTable; import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; /** * General implementation for professions, classes and attributes. diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/PlayerProfessions.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/PlayerProfessions.java index b759b30a..eb0228ee 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/PlayerProfessions.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/PlayerProfessions.java @@ -21,7 +21,7 @@ import org.bukkit.Location; import org.bukkit.configuration.ConfigurationSection; import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/CraftItemExperienceSource.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/CraftItemExperienceSource.java index a0401a07..7be59b19 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/CraftItemExperienceSource.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/CraftItemExperienceSource.java @@ -16,7 +16,7 @@ import org.bukkit.event.inventory.CraftItemEvent; import org.bukkit.event.inventory.InventoryAction; import org.bukkit.inventory.ItemStack; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; public class CraftItemExperienceSource extends SpecificExperienceSource { public final Material material; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/KillMobExperienceSource.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/KillMobExperienceSource.java index dd5e4a4b..9063e420 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/KillMobExperienceSource.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/KillMobExperienceSource.java @@ -19,7 +19,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.persistence.PersistentDataType; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import java.util.UUID; public class KillMobExperienceSource extends SpecificExperienceSource { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/RepairItemExperienceSource.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/RepairItemExperienceSource.java index 6ff8ee09..1b65c29d 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/RepairItemExperienceSource.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/experience/source/RepairItemExperienceSource.java @@ -18,7 +18,7 @@ import org.bukkit.inventory.AnvilInventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.Damageable; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; public class RepairItemExperienceSource extends ExperienceSource { @Nullable diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/AttributeView.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/AttributeView.java index 47257424..aa75fd25 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/AttributeView.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/AttributeView.java @@ -1,163 +1,165 @@ package net.Indyuce.mmocore.gui; +import io.lumine.mythic.lib.gui.Navigator; +import io.lumine.mythic.lib.gui.editable.EditableInventory; +import io.lumine.mythic.lib.gui.editable.GeneratedInventory; +import io.lumine.mythic.lib.gui.editable.item.InventoryItem; +import io.lumine.mythic.lib.gui.editable.item.PhysicalItem; +import io.lumine.mythic.lib.gui.editable.placeholder.Placeholders; import io.lumine.mythic.lib.manager.StatManager; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; -import net.Indyuce.mmocore.api.player.PlayerData; -import net.Indyuce.mmocore.gui.api.EditableInventory; -import net.Indyuce.mmocore.gui.api.GeneratedInventory; -import net.Indyuce.mmocore.gui.api.InventoryClickContext; -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 net.Indyuce.mmocore.api.SoundEvent; import net.Indyuce.mmocore.api.event.PlayerAttributeUseEvent; +import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute; import net.Indyuce.mmocore.api.player.attribute.PlayerAttributes; -import net.Indyuce.mmocore.api.SoundEvent; import org.bukkit.Bukkit; import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.w3c.dom.Attr; public class AttributeView extends EditableInventory { - public AttributeView() { - super("attribute-view"); - } + public AttributeView() { + super("attribute-view"); + } - @Override - public InventoryItem load(String function, ConfigurationSection config) { - if (function.equalsIgnoreCase("reallocation")) - return new InventoryItem(config) { + @Override + public @Nullable InventoryItem resolveItem(@NotNull String function, @NotNull ConfigurationSection config) { + if (function.equalsIgnoreCase("reallocation")) return new ReallocateButton(config); + if (function.startsWith("attribute_")) return new AttributeItem(function, config); - @Override - public Placeholders getPlaceholders(GeneratedInventory inv, int n) { - Placeholders holders = new Placeholders(); - holders.register("attribute_points", inv.getPlayerData().getAttributePoints()); - holders.register("points", inv.getPlayerData().getAttributeReallocationPoints()); - holders.register("total", inv.getPlayerData().getAttributes().countPoints()); - return holders; - } - }; + return null; + } - return function.startsWith("attribute_") ? new AttributeItem(function, config) : new SimplePlaceholderItem(config); - } + public AttrInventory newInventory(PlayerData data) { + return new AttrInventory(data); + } - public GeneratedInventory newInventory(PlayerData data) { - return new AttributeViewerInventory(data, this); - } + public class ReallocateButton extends PhysicalItem { + public ReallocateButton(ConfigurationSection config) { + super(config); + } - public static class AttributeItem extends InventoryItem { - private final PlayerAttribute attribute; - private final int shiftCost; + @Override + public Placeholders getPlaceholders(AttrInventory inv, int n) { + Placeholders holders = new Placeholders(); + holders.register("attribute_points", inv.playerData.getAttributePoints()); + holders.register("points", inv.playerData.getAttributeReallocationPoints()); + holders.register("total", inv.playerData.getAttributes().countPoints()); + return holders; + } - public AttributeItem(String function, ConfigurationSection config) { - super(config); + @Override + public void onClick(@NotNull AttrInventory inv, @NotNull InventoryClickEvent event) { + int spent = inv.playerData.getAttributes().countPoints(); + if (spent < 1) { + ConfigMessage.fromKey("no-attribute-points-spent").send(inv.playerData); + MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(inv.getPlayer()); + return; + } - attribute = MMOCore.plugin.attributeManager - .get(function.substring("attribute_".length()).toLowerCase().replace(" ", "-").replace("_", "-")); - shiftCost = Math.max(config.getInt("shift-cost"), 1); - } + if (inv.playerData.getAttributeReallocationPoints() < 1) { + ConfigMessage.fromKey("not-attribute-reallocation-point").send(inv.playerData); + MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(inv.getPlayer()); + return; + } - @Override - public Placeholders getPlaceholders(GeneratedInventory inv, int n) { - int total = inv.getPlayerData().getAttributes().getInstance(attribute).getTotal(); + inv.playerData.getAttributes().getInstances().forEach(ins -> ins.setBase(0)); + inv.playerData.giveAttributePoints(spent); + inv.playerData.giveAttributeReallocationPoints(-1); + ConfigMessage.fromKey("attribute-points-reallocated", "points", inv.playerData.getAttributePoints()).send(inv.playerData); + MMOCore.plugin.soundManager.getSound(SoundEvent.RESET_ATTRIBUTES).playTo(inv.getPlayer()); + inv.open(); + } + } - Placeholders holders = new Placeholders(); - holders.register("name", attribute.getName()); - holders.register("buffs", attribute.getBuffs().size()); - holders.register("spent", inv.getPlayerData().getAttributes().getInstance(attribute).getBase()); - holders.register("max", attribute.getMax()); - holders.register("current", total); - holders.register("attribute_points", inv.getPlayerData().getAttributePoints()); - holders.register("shift_points", shiftCost); - attribute.getBuffs().forEach(buff -> { - final String stat = buff.getStat(); - holders.register("buff_" + buff.getStat().toLowerCase(), StatManager.format(stat, buff.getValue())); - holders.register("total_" + buff.getStat().toLowerCase(), StatManager.format(stat, buff.multiply(total).getValue())); - }); + public static class AttributeItem extends PhysicalItem { + private final PlayerAttribute attribute; + private final int shiftCost; - return holders; - } - } + public AttributeItem(String function, ConfigurationSection config) { + super(config); - public class AttributeViewerInventory extends GeneratedInventory { + attribute = MMOCore.plugin.attributeManager + .get(function.substring("attribute_".length()).toLowerCase().replace(" ", "-").replace("_", "-")); + shiftCost = Math.max(config.getInt("shift-cost"), 1); + } - public AttributeViewerInventory(PlayerData playerData, EditableInventory editable) { - super(playerData, editable); + @Override + public Placeholders getPlaceholders(AttrInventory inv, int n) { + int total = inv.playerData.getAttributes().getInstance(attribute).getTotal(); - } + Placeholders holders = new Placeholders(); + holders.register("name", attribute.getName()); + holders.register("buffs", attribute.getBuffs().size()); + holders.register("spent", inv.playerData.getAttributes().getInstance(attribute).getBase()); + holders.register("max", attribute.getMax()); + holders.register("current", total); + holders.register("attribute_points", inv.playerData.getAttributePoints()); + holders.register("shift_points", shiftCost); + attribute.getBuffs().forEach(buff -> { + final String stat = buff.getStat(); + holders.register("buff_" + buff.getStat().toLowerCase(), StatManager.format(stat, buff.getValue())); + holders.register("total_" + buff.getStat().toLowerCase(), StatManager.format(stat, buff.multiply(total).getValue())); + }); - @Override - public String calculateName() { - return getName(); - } + return holders; + } - @Override - public void whenClicked(InventoryClickContext context, InventoryItem item) { + @Override + public void onClick(@NotNull AttrInventory inv, @NotNull InventoryClickEvent event) { - if (item.getFunction().equalsIgnoreCase("reallocation")) { - int spent = playerData.getAttributes().countPoints(); - if (spent < 1) { - ConfigMessage.fromKey("no-attribute-points-spent").send(player); - MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(getPlayer()); - return; - } + if (inv.playerData.getAttributePoints() < 1) { + ConfigMessage.fromKey("not-attribute-point").send(inv.playerData); + MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(inv.getPlayer()); + return; + } - if (playerData.getAttributeReallocationPoints() < 1) { - ConfigMessage.fromKey("not-attribute-reallocation-point").send(player); - MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(getPlayer()); - return; - } + PlayerAttributes.AttributeInstance ins = inv.playerData.getAttributes().getInstance(attribute); + if (attribute.hasMax() && ins.getBase() >= attribute.getMax()) { + ConfigMessage.fromKey("attribute-max-points-hit").send(inv.playerData); + MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(inv.getPlayer()); + return; + } - playerData.getAttributes().getInstances().forEach(ins -> ins.setBase(0)); - playerData.giveAttributePoints(spent); - playerData.giveAttributeReallocationPoints(-1); - ConfigMessage.fromKey("attribute-points-reallocated", "points", String.valueOf(playerData.getAttributePoints())).send(player); - MMOCore.plugin.soundManager.getSound(SoundEvent.RESET_ATTRIBUTES).playTo(getPlayer()); - open(); - } + // Amount of points spent + final boolean shiftClick = event.getClick().isShiftClick(); + int pointsSpent = shiftClick ? shiftCost : 1; + if (attribute.hasMax()) pointsSpent = Math.min(pointsSpent, attribute.getMax() - ins.getBase()); - if (item.getFunction().startsWith("attribute_")) { - PlayerAttribute attribute = ((AttributeItem) item).attribute; + if (shiftClick && inv.playerData.getAttributePoints() < pointsSpent) { + ConfigMessage.fromKey("not-attribute-point-shift", "shift_points", String.valueOf(pointsSpent)).send(inv.playerData); + MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(inv.getPlayer()); + return; + } - if (playerData.getAttributePoints() < 1) { - ConfigMessage.fromKey("not-attribute-point").send(player); - MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(getPlayer()); - return; - } + ins.addBase(pointsSpent); + inv.playerData.giveAttributePoints(-pointsSpent); - PlayerAttributes.AttributeInstance ins = playerData.getAttributes().getInstance(attribute); - if (attribute.hasMax() && ins.getBase() >= attribute.getMax()) { - ConfigMessage.fromKey("attribute-max-points-hit").send(player); - MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(getPlayer()); - return; - } + // Apply exp table as many times as required + while (pointsSpent-- > 0) + attribute.updateAdvancement(inv.playerData, ins.getBase()); - // Amount of points spent - final boolean shiftClick = context.getClickType().isShiftClick(); - int pointsSpent = shiftClick ? ((AttributeItem) item).shiftCost : 1; - if (attribute.hasMax()) - pointsSpent = Math.min(pointsSpent, attribute.getMax() - ins.getBase()); + ConfigMessage.fromKey("attribute-level-up", "attribute", attribute.getName(), "level", String.valueOf(ins.getBase())).send(inv.playerData); + MMOCore.plugin.soundManager.getSound(SoundEvent.LEVEL_ATTRIBUTE).playTo(inv.getPlayer()); - if (shiftClick && playerData.getAttributePoints() < pointsSpent) { - ConfigMessage.fromKey("not-attribute-point-shift", "shift_points", String.valueOf(pointsSpent)).send(player); - MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(getPlayer()); - return; - } + PlayerAttributeUseEvent playerAttributeUseEvent = new PlayerAttributeUseEvent(inv.playerData, attribute); + Bukkit.getServer().getPluginManager().callEvent(playerAttributeUseEvent); - ins.addBase(pointsSpent); - playerData.giveAttributePoints(-pointsSpent); + inv.open(); + } + } - // Apply exp table as many times as required - while (pointsSpent-- > 0) - attribute.updateAdvancement(playerData, ins.getBase()); + public class AttrInventory extends GeneratedInventory { + private final PlayerData playerData; - ConfigMessage.fromKey("attribute-level-up", "attribute", attribute.getName(), "level", String.valueOf(ins.getBase())).send(player); - MMOCore.plugin.soundManager.getSound(SoundEvent.LEVEL_ATTRIBUTE).playTo(getPlayer()); + public AttrInventory(PlayerData playerData) { + super(new Navigator(playerData.getMMOPlayerData()), AttributeView.this); - PlayerAttributeUseEvent playerAttributeUseEvent = new PlayerAttributeUseEvent(playerData, attribute); - Bukkit.getServer().getPluginManager().callEvent(playerAttributeUseEvent); - - open(); - } - } - } + this.playerData = playerData; + } + } } \ No newline at end of file diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/ClassConfirmation.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/ClassConfirmation.java index 3d079ebc..0f9e3dbd 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/ClassConfirmation.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/ClassConfirmation.java @@ -1,6 +1,13 @@ package net.Indyuce.mmocore.gui; import io.lumine.mythic.lib.UtilityMethods; +import io.lumine.mythic.lib.gui.Navigator; +import io.lumine.mythic.lib.gui.editable.EditableInventory; +import io.lumine.mythic.lib.gui.editable.GeneratedInventory; +import io.lumine.mythic.lib.gui.editable.item.InventoryItem; +import io.lumine.mythic.lib.gui.editable.item.PhysicalItem; +import io.lumine.mythic.lib.gui.editable.item.builtin.GoBackItem; +import io.lumine.mythic.lib.gui.editable.placeholder.Placeholders; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.SoundEvent; @@ -8,23 +15,15 @@ import net.Indyuce.mmocore.api.event.PlayerChangeClassEvent; 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.gui.api.EditableInventory; -import net.Indyuce.mmocore.gui.api.GeneratedInventory; -import net.Indyuce.mmocore.gui.api.InventoryClickContext; -import net.Indyuce.mmocore.gui.api.PluginInventory; -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 net.Indyuce.mmocore.player.ClassDataContainer; import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; - -import javax.annotation.Nullable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class ClassConfirmation extends EditableInventory { private final PlayerClass playerClass; @@ -35,20 +34,23 @@ public class ClassConfirmation extends EditableInventory { this.playerClass = playerClass; } + @Nullable @Override - public InventoryItem load(String function, ConfigurationSection config) { - return function.equalsIgnoreCase("yes") ? new YesItem(config) : new SimplePlaceholderItem(config); + public InventoryItem resolveItem(@NotNull String function, @NotNull ConfigurationSection config) { + if (function.equalsIgnoreCase("yes")) return new YesItem(config); + if (function.equalsIgnoreCase("back")) return new GoBackItem<>(config); + return null; } - public GeneratedInventory newInventory(PlayerData data, PluginInventory last, boolean setClass) { - return newInventory(data, last, setClass, null); + public GeneratedInventory newInventory(Navigator navigator, PlayerData playerData, boolean setClass) { + return newInventory(navigator, playerData, setClass, null); } - public GeneratedInventory newInventory(PlayerData data, PluginInventory last, boolean setClass, @Nullable Runnable profileRunnable) { - return new ClassConfirmationInventory(data, this, playerClass, last, setClass, profileRunnable); + public GeneratedInventory newInventory(Navigator navigator, PlayerData playerData, boolean setClass, @Nullable Runnable profileRunnable) { + return new ClassConfirmationInventory(navigator, playerData, playerClass, setClass, profileRunnable); } - public class UnlockedItem extends InventoryItem { + public class UnlockedItem extends PhysicalItem { public UnlockedItem(ConfigurationSection config) { super(config); } @@ -56,10 +58,10 @@ public class ClassConfirmation extends EditableInventory { @Override public Placeholders getPlaceholders(ClassConfirmationInventory inv, int n) { PlayerClass profess = inv.profess; - ClassDataContainer info = inv.subclass ? inv.getPlayerData() : inv.getPlayerData().getClassInfo(profess); + ClassDataContainer info = inv.subclass ? inv.playerData : inv.playerData.getClassInfo(profess); Placeholders holders = new Placeholders(); - final double nextLevelExp = inv.getPlayerData().getLevelUpExperience(); + final double nextLevelExp = inv.playerData.getLevelUpExperience(); final double ratio = info.getExperience() / nextLevelExp; StringBuilder bar = new StringBuilder("" + ChatColor.BOLD); @@ -67,7 +69,7 @@ public class ClassConfirmation extends EditableInventory { for (int j = 0; j < 20; j++) bar.append(j == chars ? "" + ChatColor.WHITE + ChatColor.BOLD : "").append("|"); - holders.register("percent", decimal.format(ratio * 100)); + holders.register("percent", ONE_DIGIT.format(ratio * 100)); holders.register("progress", bar.toString()); holders.register("class", profess.getName()); holders.register("unlocked_skills", info.mapSkillLevels().size()); @@ -81,17 +83,17 @@ public class ClassConfirmation extends EditableInventory { } } - public class YesItem extends SimplePlaceholderItem { - private final InventoryItem unlocked, locked; + public class YesItem extends InventoryItem { + private final InventoryItem unlocked, locked; public YesItem(ConfigurationSection config) { - super(Material.BARRIER, config); + super(config); Validate.isTrue(config.contains("unlocked"), "Could not load 'unlocked' config"); Validate.isTrue(config.contains("locked"), "Could not load 'locked' config"); unlocked = new UnlockedItem(config.getConfigurationSection("unlocked")); - locked = new InventoryItem(config.getConfigurationSection("locked")) { + locked = new PhysicalItem(config.getConfigurationSection("locked")) { @Override public Placeholders getPlaceholders(ClassConfirmationInventory inv, int n) { @@ -103,71 +105,57 @@ public class ClassConfirmation extends EditableInventory { } @Override - public ItemStack display(ClassConfirmationInventory inv, int n) { - return inv.getPlayerData().hasSavedClass(inv.profess) ? unlocked.display(inv, n) : locked.display(inv, n); + public ItemStack getDisplayedItem(@NotNull ClassConfirmationInventory inv, int n) { + return inv.playerData.hasSavedClass(inv.profess) ? unlocked.getDisplayedItem(inv, n) : locked.getDisplayedItem(inv, n); + } + + @Override + public void onClick(@NotNull ClassConfirmationInventory inv, @NotNull InventoryClickEvent event) { + PlayerChangeClassEvent called = new PlayerChangeClassEvent(inv.playerData, inv.profess); + Bukkit.getPluginManager().callEvent(called); + if (called.isCancelled()) + return; + + inv.getNavigator().unblockClosing(); + inv.playerData.giveClassPoints(-1); + if (inv.subclass) inv.playerData.setClass(inv.profess); + else + (inv.playerData.hasSavedClass(inv.profess) ? inv.playerData.getClassInfo(inv.profess) + : new SavedClassInformation(MMOCore.plugin.playerDataManager.getDefaultData())).load(inv.profess, inv.playerData); + ConfigMessage.fromKey("class-select", "class", inv.profess.getName()).send(inv.playerData); + MMOCore.plugin.soundManager.getSound(SoundEvent.SELECT_CLASS).playTo(inv.getPlayer()); + inv.getPlayer().closeInventory(); } } public class ClassConfirmationInventory extends GeneratedInventory { private final PlayerClass profess; - private final PluginInventory last; private final boolean subclass; + private final PlayerData playerData; @Nullable + // TODO check private final Runnable profileRunnable; - private boolean canClose; - - public ClassConfirmationInventory(PlayerData playerData, EditableInventory editable, PlayerClass profess, PluginInventory last, boolean subclass, @Nullable Runnable profileRunnable) { - super(playerData, editable); + public ClassConfirmationInventory(Navigator navigator, PlayerData playerData, PlayerClass profess, boolean subclass, @Nullable Runnable profileRunnable) { + super(navigator, ClassConfirmation.this); + this.playerData = playerData; this.profess = profess; - this.last = last; this.subclass = subclass; this.profileRunnable = profileRunnable; } + @NotNull @Override - public void whenClicked(InventoryClickContext context, InventoryItem item) { - if (item.getFunction().equals("back")) { - canClose = true; - last.open(); - } else if (item.getFunction().equals("yes")) { - - PlayerChangeClassEvent called = new PlayerChangeClassEvent(playerData, profess); - Bukkit.getPluginManager().callEvent(called); - if (called.isCancelled()) - return; - - canClose = true; - playerData.giveClassPoints(-1); - if (subclass) - playerData.setClass(profess); - else - (playerData.hasSavedClass(profess) ? playerData.getClassInfo(profess) - : new SavedClassInformation(MMOCore.plugin.playerDataManager.getDefaultData())).load(profess, playerData); - ConfigMessage.fromKey("class-select", "class", profess.getName()).send(player); - MMOCore.plugin.soundManager.getSound(SoundEvent.SELECT_CLASS).playTo(player); - player.closeInventory(); - if (profileRunnable != null) profileRunnable.run(); - } + public String getRawName() { + return guiName.replace("{class}", profess.getName()); } @Override public void open() { - canClose = false; + getNavigator().blockClosing(); super.open(); } - - @Override - public void whenClosed(InventoryCloseEvent event) { - if (profileRunnable != null && !canClose) - Bukkit.getScheduler().runTaskLater(MMOCore.plugin, () -> open(), 2 * 20); - } - - @Override - public String calculateName() { - return getName().replace("{class}", profess.getName()); - } } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/ClassSelect.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/ClassSelect.java index d28fba32..56fd80bf 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/ClassSelect.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/ClassSelect.java @@ -1,7 +1,12 @@ package net.Indyuce.mmocore.gui; -import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.UtilityMethods; +import io.lumine.mythic.lib.gui.Navigator; +import io.lumine.mythic.lib.gui.editable.EditableInventory; +import io.lumine.mythic.lib.gui.editable.GeneratedInventory; +import io.lumine.mythic.lib.gui.editable.item.InventoryItem; +import io.lumine.mythic.lib.gui.editable.item.ItemOptions; +import io.lumine.mythic.lib.gui.editable.item.SimpleItem; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.SoundEvent; @@ -9,24 +14,18 @@ import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.profess.ClassOption; import net.Indyuce.mmocore.api.player.profess.PlayerClass; import net.Indyuce.mmocore.api.util.MMOCoreUtils; -import net.Indyuce.mmocore.gui.api.EditableInventory; -import net.Indyuce.mmocore.gui.api.GeneratedInventory; -import net.Indyuce.mmocore.gui.api.InventoryClickContext; -import net.Indyuce.mmocore.gui.api.item.InventoryItem; -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.Material; +import org.bukkit.ChatColor; import org.bukkit.NamespacedKey; import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import javax.annotation.Nullable; -import java.util.ArrayList; import java.util.List; public class ClassSelect extends EditableInventory { @@ -34,32 +33,30 @@ public class ClassSelect extends EditableInventory { super("class-select"); } + @Nullable @Override - public InventoryItem load(String function, ConfigurationSection config) { - return function.startsWith("class") ? new ClassItem(config) : new SimplePlaceholderItem(config); + public InventoryItem resolveItem(@NotNull String function, @NotNull ConfigurationSection config) { + if (function.startsWith("class")) return new ClassItem(config); + return null; } - public GeneratedInventory newInventory(PlayerData data) { + public ProfessSelectionInventory newInventory(PlayerData data) { return newInventory(data, null); } - public GeneratedInventory newInventory(PlayerData data, @Nullable Runnable profileRunnable) { - return new ProfessSelectionInventory(data, this, profileRunnable); + public ProfessSelectionInventory newInventory(PlayerData data, @Nullable Runnable profileRunnable) { + return new ProfessSelectionInventory(data, profileRunnable); } - public class ClassItem extends SimplePlaceholderItem { - private final String name; - private final List lore; + public class ClassItem extends SimpleItem { private final PlayerClass playerClass; public ClassItem(ConfigurationSection config) { - super(config.contains("item") ? Material.valueOf(UtilityMethods.enumName(config.getString("item"))) : Material.BARRIER, config); + super(config); Validate.isTrue(config.getString("function").length() > 6, "Couldn't find the class associated to: " + config.getString("function")); String classId = UtilityMethods.enumName(config.getString("function").substring(6)); this.playerClass = MMOCore.plugin.classManager.getOrThrow(classId); - this.name = config.getString("name"); - this.lore = config.getStringList("lore"); } public boolean hasDifferentDisplay() { @@ -67,22 +64,22 @@ public class ClassSelect extends EditableInventory { } @Override - public ItemStack display(ProfessSelectionInventory inv, int n) { - ItemStack item = n == 0 ? playerClass.getIcon() : super.display(inv, n); + public ItemStack getDisplayedItem(ProfessSelectionInventory inv, int n) { + ItemOptions options = n == 0 ? ItemOptions.item(n, playerClass.getIcon()) : ItemOptions.index(n); + ItemStack item = super.getDisplayedItem(inv, options); ItemMeta meta = item.getItemMeta(); - if (hideFlags()) MMOCoreUtils.addAllItemFlags(meta); - if (hideTooltip()) meta.setHideTooltip(true); - meta.setDisplayName(MythicLib.plugin.parseColors(name).replace("{name}", playerClass.getName())); - List lore = new ArrayList<>(this.lore); + if (meta.hasDisplayName()) + meta.setDisplayName(meta.getDisplayName().replace("{name}", playerClass.getName())); + List lore = meta.getLore(); - int index = lore.indexOf("{lore}"); + int index = lore.indexOf(ChatColor.GRAY + "{lore}"); if (index >= 0) { lore.remove(index); for (int j = 0; j < playerClass.getDescription().size(); j++) lore.add(index + j, playerClass.getDescription().get(j)); } - index = lore.indexOf("{attribute-lore}"); + index = lore.indexOf(ChatColor.GRAY + "{attribute-lore}"); if (index >= 0) { lore.remove(index); for (int j = 0; j < playerClass.getAttributeDescription().size(); j++) @@ -94,66 +91,51 @@ public class ClassSelect extends EditableInventory { item.setItemMeta(meta); return item; } + + @Override + public void onClick(@NotNull ProfessSelectionInventory inv, @NotNull InventoryClickEvent event) { + + if (inv.profileRunnable == null && inv.playerData.getClassPoints() < 1) { + MMOCore.plugin.soundManager.getSound(SoundEvent.CANT_SELECT_CLASS).playTo(inv.getPlayer()); + ConfigMessage.fromKey("cant-choose-new-class").send(inv.playerData); + return; + } + + if (playerClass.hasOption(ClassOption.NEEDS_PERMISSION) && !inv.getPlayer().hasPermission("mmocore.class." + playerClass.getId().toLowerCase())) { + MMOCore.plugin.soundManager.getSound(SoundEvent.CANT_SELECT_CLASS).playTo(inv.getPlayer()); + ConfigMessage.fromKey("no-permission-for-class").send(inv.playerData); + return; + } + + if (playerClass.equals(inv.playerData.getProfess())) { + MMOCore.plugin.soundManager.getSound(SoundEvent.CANT_SELECT_CLASS).playTo(inv.getPlayer()); + ConfigMessage.fromKey("already-on-class", "class", playerClass.getName()).send(inv.getPlayer()); + return; + } + + inv.getNavigator().unblockClosing(); + final PlayerClass playerClass = findDeepestSubclass(inv.playerData, this.playerClass); + InventoryManager.CLASS_CONFIRM.get(MMOCoreUtils.ymlName(playerClass.getId())).newInventory(inv.getNavigator(), inv.playerData, inv.profileRunnable != null, inv.profileRunnable).open(); + } } public class ProfessSelectionInventory extends GeneratedInventory { - @Nullable private final Runnable profileRunnable; + private final PlayerData playerData; - private boolean canClose; - - public ProfessSelectionInventory(PlayerData playerData, EditableInventory editable, @Nullable Runnable profileRunnable) { - super(playerData, editable); + public ProfessSelectionInventory(PlayerData playerData, @Nullable Runnable profileRunnable) { + super(new Navigator(playerData.getMMOPlayerData()), ClassSelect.this); + this.playerData = playerData; this.profileRunnable = profileRunnable; } - @Override - public String calculateName() { - return getName(); - } - - @Override - public void whenClicked(InventoryClickContext context, InventoryItem item) { - if (item instanceof ClassItem) { - PlayerClass profess = ((ClassItem) item).playerClass; - - if (profileRunnable == null && playerData.getClassPoints() < 1) { - MMOCore.plugin.soundManager.getSound(SoundEvent.CANT_SELECT_CLASS).playTo(player); - ConfigMessage.fromKey("cant-choose-new-class").send(player); - return; - } - - if (profess.hasOption(ClassOption.NEEDS_PERMISSION) && !player.hasPermission("mmocore.class." + profess.getId().toLowerCase())) { - MMOCore.plugin.soundManager.getSound(SoundEvent.CANT_SELECT_CLASS).playTo(player); - ConfigMessage.fromKey("no-permission-for-class").send(player); - return; - } - - if (profess.equals(playerData.getProfess())) { - MMOCore.plugin.soundManager.getSound(SoundEvent.CANT_SELECT_CLASS).playTo(player); - ConfigMessage.fromKey("already-on-class", "class", profess.getName()).send(player); - return; - } - - canClose = true; - final PlayerClass playerClass = findDeepestSubclass(playerData, profess); - InventoryManager.CLASS_CONFIRM.get(MMOCoreUtils.ymlName(playerClass.getId())).newInventory(playerData, this, profileRunnable != null, profileRunnable).open(); - } - } - @Override public void open() { - canClose = false; + if (profileRunnable != null) getNavigator().blockClosing(); super.open(); } - - @Override - public void whenClosed(InventoryCloseEvent event) { - if (profileRunnable != null && !canClose) - Bukkit.getScheduler().runTaskLater(MMOCore.plugin, () -> open(), 2 * 20); - } } /** diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/PlayerStats.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/PlayerStats.java index cd562aa7..59134b86 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/PlayerStats.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/PlayerStats.java @@ -3,6 +3,13 @@ package net.Indyuce.mmocore.gui; import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.api.stat.modifier.StatModifier; +import io.lumine.mythic.lib.gui.Navigator; +import io.lumine.mythic.lib.gui.editable.EditableInventory; +import io.lumine.mythic.lib.gui.editable.GeneratedInventory; +import io.lumine.mythic.lib.gui.editable.item.InventoryItem; +import io.lumine.mythic.lib.gui.editable.item.PhysicalItem; +import io.lumine.mythic.lib.gui.editable.item.SimpleItem; +import io.lumine.mythic.lib.gui.editable.placeholder.Placeholders; import io.lumine.mythic.lib.manager.StatManager; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; @@ -11,20 +18,15 @@ import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute; import net.Indyuce.mmocore.api.util.math.format.DelayFormat; import net.Indyuce.mmocore.experience.Booster; import net.Indyuce.mmocore.experience.Profession; -import net.Indyuce.mmocore.gui.api.EditableInventory; -import net.Indyuce.mmocore.gui.api.GeneratedInventory; -import net.Indyuce.mmocore.gui.api.InventoryClickContext; -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 net.Indyuce.mmocore.party.AbstractParty; import org.apache.commons.lang.Validate; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.SkullMeta; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; public class PlayerStats extends EditableInventory { public PlayerStats() { @@ -32,125 +34,136 @@ public class PlayerStats extends EditableInventory { } @Override - public InventoryItem load(String function, ConfigurationSection config) { + public InventoryItem resolveItem(String function, ConfigurationSection config) { - if (function.equals("boost")) - return new BoostItem(config); + if (function.equals("boost")) return new BoostItem(config); - if (function.equals("boost-next")) - return new SimplePlaceholderItem(config) { + if (function.equals("boost-next")) return new BoostNextButton(config); + if (function.equals("boost-previous")) return new BoostPreviousButton(config); - @Override - public boolean hasDifferentDisplay() { - return true; - } + if (function.equals("party")) return new PartyMoraleItem(config); + if (function.startsWith("profession_")) return new ProfessionItem(function, config); + if (function.equals("profile")) return new PlayerProfileItem(config); + if (function.equals("stats")) return new StatsItem(config); - @Override - public boolean canDisplay(PlayerStatsInventory inv) { - InventoryItem boost = inv.getByFunction("boost"); - return boost != null && inv.boostOffset + boost.getSlots().size() < MMOCore.plugin.boosterManager.getActive().size(); - } - }; - - if (function.equals("boost-previous")) - return new SimplePlaceholderItem(config) { - - @Override - public boolean canDisplay(PlayerStatsInventory inv) { - return inv.boostOffset > 0; - } - }; - - if (function.equals("party")) - return new PartyMoraleItem(config); - - if (function.startsWith("profession_")) { - String id = function.substring("profession_".length()).toLowerCase(); - Validate.isTrue(MMOCore.plugin.professionManager.has(id)); - Profession profession = MMOCore.plugin.professionManager.get(id); - - return new InventoryItem(config) { - - @Override - public boolean hasDifferentDisplay() { - return true; - } - - @Override - public Placeholders getPlaceholders(PlayerStatsInventory inv, int n) { - - Placeholders holders = new Placeholders(); - //net.Indyuce.mmocore.api.player.stats.PlayerStats stats = inv.target.getStats(); - - double ratio = inv.target.getCollectionSkills().getExperience(profession) - / (double) inv.target.getCollectionSkills().getLevelUpExperience(profession); - - String bar = "" + ChatColor.BOLD; - int chars = (int) (ratio * 20); - for (int j = 0; j < 20; j++) - bar += (j == chars ? "" + ChatColor.WHITE + ChatColor.BOLD : "") + "|"; - - // holders.register("profession", type.getName()); - holders.register("progress", bar); - holders.register("level", String.valueOf(inv.target.getCollectionSkills().getLevel(profession))); - holders.register("xp", inv.target.getCollectionSkills().getExperience(profession)); - holders.register("percent", decimal.format(ratio * 100)); - - return holders; - } - }; - } - - if (function.equals("profile")) - return new PlayerProfileItem(config); - - if (function.equals("stats")) - return new InventoryItem(config) { - - @Override - public boolean hasDifferentDisplay() { - return true; - } - - @Override - public Placeholders getPlaceholders(PlayerStatsInventory inv, int n) { - return new Placeholders() { - final net.Indyuce.mmocore.api.player.stats.PlayerStats stats = inv.target.getStats(); - - @Nullable - @Override - public String getPlaceholder(String holder) { - if (holder.endsWith("_base")) { - final String stat = UtilityMethods.enumName(holder.substring(0, holder.length() - 5)); - return StatManager.format(stat, stats.getBase(stat)); - } - - if (holder.endsWith("_extra")) { - final String stat = UtilityMethods.enumName(holder.substring(0, holder.length() - 6)); - return StatManager.format(stat, stats.getStat(stat) - stats.getBase(stat)); - } - - if (holder.startsWith("attribute_")) { - final PlayerAttribute attr = MMOCore.plugin.attributeManager.get(holder.substring(10).replace("_", "-").toLowerCase()); - return String.valueOf(inv.target.getAttributes().getAttribute(attr)); - } - - final String stat = UtilityMethods.enumName(holder); - return StatManager.format(stat, stats.getStat(stat)); - } - }; - } - }; - - return new SimplePlaceholderItem(config); + return null; } public PlayerStatsInventory newInventory(PlayerData invTarget, PlayerData opening) { - return new PlayerStatsInventory(invTarget, opening, this); + return new PlayerStatsInventory(invTarget, opening); } public PlayerStatsInventory newInventory(PlayerData player) { - return new PlayerStatsInventory(player, player, this); + return new PlayerStatsInventory(player, player); + } + + public class BoostPreviousButton extends SimpleItem { + public BoostPreviousButton(ConfigurationSection config) { + super(config); + } + + @Override + public void onClick(@NotNull PlayerStatsInventory inv, @NotNull InventoryClickEvent event) { + inv.boostOffset--; + inv.open(); + } + + @Override + public boolean isDisplayed(@NotNull PlayerStatsInventory inv) { + return inv.boostOffset > 0; + } + } + + public class BoostNextButton extends SimpleItem { + public BoostNextButton(ConfigurationSection config) { + super(config); + } + + @Override + public boolean isDisplayed(@NotNull PlayerStatsInventory inv) { + InventoryItem boost = inv.getByFunction("boost"); + return boost != null && inv.boostOffset + boost.getSlots().size() < MMOCore.plugin.boosterManager.getActive().size(); + } + + @Override + public void onClick(@NotNull PlayerStatsInventory inv, @NotNull InventoryClickEvent event) { + inv.boostOffset++; + inv.open(); + } + } + + public class ProfessionItem extends PhysicalItem { + private final Profession profession; + + public ProfessionItem(String function, @NotNull ConfigurationSection config) { + super(config); + + String id = function.substring("profession_".length()).toLowerCase(); + Validate.isTrue(MMOCore.plugin.professionManager.has(id)); + profession = MMOCore.plugin.professionManager.get(id); + } + + @Override + public boolean hasDifferentDisplay() { + return true; + } + + @Override + public Placeholders getPlaceholders(PlayerStatsInventory inv, int n) { + + Placeholders holders = new Placeholders(); + //net.Indyuce.mmocore.api.player.stats.PlayerStats stats = inv.target.getStats(); + + double ratio = inv.target.getCollectionSkills().getExperience(profession) + / (double) inv.target.getCollectionSkills().getLevelUpExperience(profession); + + String bar = "" + ChatColor.BOLD; + int chars = (int) (ratio * 20); + for (int j = 0; j < 20; j++) + bar += (j == chars ? "" + ChatColor.WHITE + ChatColor.BOLD : "") + "|"; + + // holders.register("profession", type.getName()); + holders.register("progress", bar); + holders.register("level", String.valueOf(inv.target.getCollectionSkills().getLevel(profession))); + holders.register("xp", inv.target.getCollectionSkills().getExperience(profession)); + holders.register("percent", ONE_DIGIT.format(ratio * 100)); + + return holders; + } + } + + public class StatsItem extends PhysicalItem { + public StatsItem(ConfigurationSection config) { + super(config); + } + + @Override + public @NotNull Placeholders getPlaceholders(PlayerStatsInventory inv, int n) { + return new Placeholders() { + final net.Indyuce.mmocore.api.player.stats.PlayerStats stats = inv.target.getStats(); + + @Override + public @NotNull String parsePlaceholder(String holder) { + if (holder.endsWith("_base")) { + final String stat = UtilityMethods.enumName(holder.substring(0, holder.length() - 5)); + return StatManager.format(stat, stats.getBase(stat)); + } + + if (holder.endsWith("_extra")) { + final String stat = UtilityMethods.enumName(holder.substring(0, holder.length() - 6)); + return StatManager.format(stat, stats.getStat(stat) - stats.getBase(stat)); + } + + if (holder.startsWith("attribute_")) { + final PlayerAttribute attr = MMOCore.plugin.attributeManager.get(holder.substring(10).replace("_", "-").toLowerCase()); + return String.valueOf(inv.target.getAttributes().getAttribute(attr)); + } + + final String stat = UtilityMethods.enumName(holder); + return StatManager.format(stat, stats.getStat(stat)); + } + }; + } } public class PlayerStatsInventory extends GeneratedInventory { @@ -158,33 +171,10 @@ public class PlayerStats extends EditableInventory { private int boostOffset; - /** - * @param invTarget Target player - * @param opening Player opening the inventory - * @param inv Corresponding editable inventory - */ - public PlayerStatsInventory(PlayerData invTarget, PlayerData opening, EditableInventory inv) { - super(opening, inv); + public PlayerStatsInventory(PlayerData target, PlayerData opening) { + super(new Navigator(opening.getMMOPlayerData()), PlayerStats.this); - this.target = invTarget; - } - - @Override - public String calculateName() { - return getName(); - } - - @Override - public void whenClicked(InventoryClickContext event, InventoryItem item) { - if (item.hasFunction()) - if (item.getFunction().equals("boost-next")) { - boostOffset++; - open(); - - } else if (item.getFunction().equals("boost-previous")) { - boostOffset--; - open(); - } + this.target = target; } } @@ -193,7 +183,7 @@ public class PlayerStats extends EditableInventory { return item; } - public static class PartyMoraleItem extends InventoryItem { + public static class PartyMoraleItem extends PhysicalItem { public PartyMoraleItem(ConfigurationSection config) { super(config); } @@ -211,20 +201,21 @@ public class PlayerStats extends EditableInventory { } @Override - public boolean canDisplay(PlayerStatsInventory inv) { + public boolean isDisplayed(@NotNull PlayerStatsInventory inv) { AbstractParty party = inv.target.getParty(); return party != null && party.getOnlineMembers().size() > 1; } } - public static class PlayerProfileItem extends InventoryItem { + public static class PlayerProfileItem extends PhysicalItem { public PlayerProfileItem(ConfigurationSection config) { super(config); } @Override - public ItemStack display(PlayerStatsInventory inv, int n) { - ItemStack disp = super.display(inv, n); + public ItemStack getDisplayedItem(PlayerStatsInventory inv, int n) { + ItemStack disp = super.getDisplayedItem(inv, n); + if (disp.getType() == Material.PLAYER_HEAD) { SkullMeta meta = (SkullMeta) disp.getItemMeta(); inv.asyncUpdate(this, n, disp, current -> { @@ -232,6 +223,7 @@ public class PlayerStats extends EditableInventory { current.setItemMeta(meta); }); } + return disp; } @@ -248,41 +240,42 @@ public class PlayerStats extends EditableInventory { for (int j = 0; j < 20; j++) bar.append(j == chars ? "" + ChatColor.WHITE + ChatColor.BOLD : "").append("|"); - holders.register("percent", decimal.format(ratio * 100)); + holders.register("percent", ONE_DIGIT.format(ratio * 100)); holders.register("exp", MythicLib.plugin.getMMOConfig().decimal.format(data.getExperience())); - holders.register("level", "" + data.getLevel()); - holders.register("class_points", "" + data.getClassPoints()); - holders.register("skill_points", "" + data.getSkillPoints()); - holders.register("attribute_points", "" + data.getAttributePoints()); + holders.register("level", data.getLevel()); + holders.register("class_points", data.getClassPoints()); + holders.register("skill_points", data.getSkillPoints()); + holders.register("attribute_points", data.getAttributePoints()); holders.register("progress", bar.toString()); - holders.register("next_level", "" + nextLevelExp); + holders.register("next_level", nextLevelExp); if (data.isOnline()) - holders.register("player", "" + data.getPlayer().getName()); - holders.register("class", "" + data.getProfess().getName()); + holders.register("player", data.getPlayer().getName()); + holders.register("class", data.getProfess().getName()); return holders; } } - public class BoostItem extends SimplePlaceholderItem { - private final InventoryItem noBoost, mainLevel, profession; + public class BoostItem extends SimpleItem { + private final PhysicalItem noBoost, mainLevel, profession; public BoostItem(ConfigurationSection config) { super(config); ConfigurationSection noBoost = config.getConfigurationSection("no-boost"); Validate.notNull(noBoost, "Could not load 'no-boost' config"); - this.noBoost = new SimplePlaceholderItem(noBoost); + this.noBoost = new SimpleItem<>(noBoost); ConfigurationSection mainLevel = config.getConfigurationSection("main-level"); Validate.notNull(mainLevel, "Could not load 'main-level' config"); - this.mainLevel = new InventoryItem(mainLevel) { + this.mainLevel = new PhysicalItem(mainLevel) { @Override public boolean hasDifferentDisplay() { return true; } + @NotNull @Override public Placeholders getPlaceholders(PlayerStatsInventory inv, int n) { Placeholders holders = new Placeholders(); @@ -300,13 +293,14 @@ public class PlayerStats extends EditableInventory { ConfigurationSection profession = config.getConfigurationSection("profession"); Validate.notNull(profession, "Could not load 'profession' config"); - this.profession = new InventoryItem(profession) { + this.profession = new PhysicalItem(profession) { @Override public boolean hasDifferentDisplay() { return true; } + @NotNull @Override public Placeholders getPlaceholders(PlayerStatsInventory inv, int n) { Placeholders holders = new Placeholders(); @@ -330,13 +324,13 @@ public class PlayerStats extends EditableInventory { } @Override - public ItemStack display(PlayerStatsInventory inv, int n) { + public ItemStack getDisplayedItem(PlayerStatsInventory inv, int n) { int offset = inv.boostOffset; if (n + offset >= MMOCore.plugin.boosterManager.getActive().size()) - return noBoost.display(inv, n); + return noBoost.getDisplayedItem(inv, n); Booster boost = MMOCore.plugin.boosterManager.get(inv.boostOffset + n); - return amount(boost.hasProfession() ? profession.display(inv, n) : mainLevel.display(inv, n), n + offset + 1); + return amount(boost.hasProfession() ? profession.getDisplayedItem(inv, n) : mainLevel.getDisplayedItem(inv, n), n + offset + 1); } } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/QuestViewer.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/QuestViewer.java index 612d6e70..d908ecbf 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/QuestViewer.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/QuestViewer.java @@ -1,5 +1,14 @@ package net.Indyuce.mmocore.gui; +import io.lumine.mythic.lib.gui.Navigator; +import io.lumine.mythic.lib.gui.editable.EditableInventory; +import io.lumine.mythic.lib.gui.editable.GeneratedInventory; +import io.lumine.mythic.lib.gui.editable.item.InventoryItem; +import io.lumine.mythic.lib.gui.editable.item.PhysicalItem; +import io.lumine.mythic.lib.gui.editable.item.SimpleItem; +import io.lumine.mythic.lib.gui.editable.item.builtin.NextPageItem; +import io.lumine.mythic.lib.gui.editable.item.builtin.PreviousPageItem; +import io.lumine.mythic.lib.gui.editable.placeholder.Placeholders; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.SoundEvent; @@ -7,20 +16,17 @@ import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.quest.Quest; import net.Indyuce.mmocore.api.util.math.format.DelayFormat; import net.Indyuce.mmocore.experience.Profession; -import net.Indyuce.mmocore.gui.api.EditableInventory; -import net.Indyuce.mmocore.gui.api.GeneratedInventory; -import net.Indyuce.mmocore.gui.api.InventoryClickContext; -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.ChatColor; import org.bukkit.NamespacedKey; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -32,39 +38,23 @@ public class QuestViewer extends EditableInventory { super("quest-list"); } + @Nullable @Override - public InventoryItem load(String function, ConfigurationSection config) { + public InventoryItem resolveItem(@NotNull String function, @NotNull ConfigurationSection config) { + if (function.equals("quest")) return new QuestItem(config); - if (function.equals("quest")) - return new QuestItem(config); + if (function.equals("previous")) return new PreviousPageItem<>(config); + if (function.equals("next")) return new NextPageItem<>(config); - if (function.equals("previous")) - return new SimplePlaceholderItem(config) { - - @Override - public boolean canDisplay(QuestInventory inv) { - return inv.page > 0; - } - }; - - if (function.equals("next")) - return new SimplePlaceholderItem(config) { - - @Override - public boolean canDisplay(QuestInventory inv) { - return inv.perPage * (inv.page + 1) < inv.quests.size(); - } - }; - - return new SimplePlaceholderItem(config); + return null; } public GeneratedInventory newInventory(PlayerData data) { return new QuestInventory(data, this); } - public class QuestItem extends SimplePlaceholderItem { - private final SimplePlaceholderItem noQuest, locked; + public class QuestItem extends PhysicalItem { + private final SimpleItem noQuest, locked; private final String mainHit, mainNotHit, professionHit, professionNotHit; private final SimpleDateFormat dateFormat; @@ -75,8 +65,8 @@ public class QuestViewer extends EditableInventory { Validate.isTrue(config.contains("no-quest"), "Could not load config 'no-quest'"); Validate.isTrue(config.contains("locked"), "Could not load config 'locked'"); - locked = new SimplePlaceholderItem(config.getConfigurationSection("locked")); - noQuest = new SimplePlaceholderItem(config.getConfigurationSection("no-quest")); + locked = new SimpleItem<>(config.getConfigurationSection("locked")); + noQuest = new SimpleItem<>(config.getConfigurationSection("no-quest")); Validate.isTrue(config.contains("date-format"), "Could not find date-format"); dateFormat = new SimpleDateFormat(config.getString("date-format")); @@ -95,21 +85,22 @@ public class QuestViewer extends EditableInventory { } @Override - public ItemStack display(GeneratedInventory inv, int itemIndex) { - final QuestInventory list = (QuestInventory) inv; - final int index = list.page * list.perPage + itemIndex; + public ItemStack getDisplayedItem(QuestInventory inv, int itemIndex) { + final int index = inv.page * inv.perPage + itemIndex; - if (index >= list.quests.size()) - return noQuest.display(inv, itemIndex); + if (index >= inv.quests.size()) + return noQuest.getDisplayedItem(inv, itemIndex); - Quest quest = list.quests.get(index); - if (quest.hasParent() && !inv.getPlayerData().getQuestData().checkParentAvailability(quest)) - return locked.display(inv, itemIndex); + Quest quest = inv.quests.get(index); + if (quest.hasParent() && !inv.playerData.getQuestData().checkParentAvailability(quest)) + return locked.getDisplayedItem(inv, itemIndex); - List lore = new ArrayList<>(getLore()); + ItemStack item = super.getDisplayedItem(inv, itemIndex); + ItemMeta meta = item.getItemMeta(); + List lore = new ArrayList<>(meta.getLore()); // Replace quest lore - int loreIndex = lore.indexOf("{lore}"); + int loreIndex = lore.indexOf(ChatColor.GRAY + "{lore}"); if (loreIndex >= 0) { lore.remove(loreIndex); for (int j = 0; j < quest.getLore().size(); j++) @@ -118,40 +109,37 @@ public class QuestViewer extends EditableInventory { // Calculate lore for later int reqCount = quest.countLevelRestrictions(); - boolean started = inv.getPlayerData().getQuestData().hasCurrent(quest), completed = inv.getPlayerData().getQuestData().hasFinished(quest), - cooldown = completed && inv.getPlayerData().getQuestData().checkCooldownAvailability(quest); + boolean started = inv.playerData.getQuestData().hasCurrent(quest), completed = inv.playerData.getQuestData().hasFinished(quest), + cooldown = completed && inv.playerData.getQuestData().checkCooldownAvailability(quest); - lore.removeIf(next -> (next.startsWith("{level_req}") && reqCount < 1) - || (next.startsWith("{started}") && !started) - || (next.startsWith("{!started}") && started) - || (next.startsWith("{completed}") && !completed) - || (next.startsWith("{completed_cannot_redo}") && !(completed && !quest.isRedoable())) - || (next.startsWith("{completed_can_redo}") && !(cooldown && quest.isRedoable())) - || (next.startsWith("{completed_delay}") && !(completed && !cooldown))); + lore.removeIf(next -> (next.startsWith(ChatColor.GRAY + "{level_req}") && reqCount < 1) + || (next.startsWith(ChatColor.GRAY + "{started}") && !started) + || (next.startsWith(ChatColor.GRAY + "{!started}") && started) + || (next.startsWith(ChatColor.GRAY + "{completed}") && !completed) + || (next.startsWith(ChatColor.GRAY + "{completed_cannot_redo}") && !(completed && !quest.isRedoable())) + || (next.startsWith(ChatColor.GRAY + "{completed_can_redo}") && !(cooldown && quest.isRedoable())) + || (next.startsWith(ChatColor.GRAY + "{completed_delay}") && !(completed && !cooldown))); // Replace level requirements - loreIndex = lore.indexOf("{level_req}{level_requirements}"); + loreIndex = lore.indexOf(ChatColor.GRAY + "{level_req}{level_requirements}"); if (loreIndex >= 0) { lore.remove(loreIndex); int mainRequired = quest.getLevelRestriction(null); if (mainRequired > 0) - lore.add(loreIndex, (inv.getPlayerData().getLevel() >= mainRequired ? mainHit : mainNotHit).replace("{level}", "" + mainRequired)); + lore.add(loreIndex, (inv.playerData.getLevel() >= mainRequired ? mainHit : mainNotHit).replace("{level}", "" + mainRequired)); for (Profession profession : quest.getLevelRestrictions()) { int required = quest.getLevelRestriction(profession); lore.add(loreIndex + (mainRequired > 0 ? 1 : 0), - (inv.getPlayerData().getCollectionSkills().getLevel(profession) >= required ? professionHit : professionNotHit) + (inv.playerData.getCollectionSkills().getLevel(profession) >= required ? professionHit : professionNotHit) .replace("{level}", "" + required).replace("{profession}", profession.getName())); } } Placeholders holders = getPlaceholders(inv, itemIndex); - for (int j = 0; j < lore.size(); j++) - lore.set(j, ChatColor.GRAY + holders.apply(inv.getPlayer(), lore.get(j))); + lore.replaceAll(str -> ChatColor.GRAY + holders.apply(inv.getPlayer(), str)); // Generate item - ItemStack item = super.display(inv, itemIndex); - ItemMeta meta = item.getItemMeta(); meta.setLore(lore); meta.getPersistentDataContainer().set(new NamespacedKey(MMOCore.plugin, "quest_id"), PersistentDataType.STRING, quest.getId()); item.setItemMeta(meta); @@ -160,10 +148,9 @@ public class QuestViewer extends EditableInventory { } @Override - public Placeholders getPlaceholders(GeneratedInventory inv, int itemIndex) { - final QuestInventory list = (QuestInventory) inv; - final Quest quest = ((QuestInventory) inv).quests.get(list.page * list.perPage + itemIndex); - PlayerData data = inv.getPlayerData(); + public Placeholders getPlaceholders(QuestInventory inv, int itemIndex) { + final Quest quest = inv.quests.get(inv.page * inv.perPage + itemIndex); + PlayerData data = inv.playerData; Placeholders holders = new Placeholders(); holders.register("name", quest.getName()); @@ -184,100 +171,81 @@ public class QuestViewer extends EditableInventory { return holders; } + + @Override + public void onClick(@NotNull QuestInventory inv, @NotNull InventoryClickEvent event) { + String questId = event.getCurrentItem().getItemMeta().getPersistentDataContainer() + .get(new NamespacedKey(MMOCore.plugin, "quest_id"), PersistentDataType.STRING); + if (questId == null || questId.equals("")) + return; + + Quest quest = MMOCore.plugin.questManager.get(questId); + + if (inv.playerData.getQuestData().hasCurrent()) { + + // Check if the player is cancelling his ongoing quest + if (inv.playerData.getQuestData().hasCurrent(quest)) { + if (event.getClick() == ClickType.RIGHT) { + inv.playerData.getQuestData().start(null); + MMOCore.plugin.soundManager.getSound(SoundEvent.CANCEL_QUEST).playTo(inv.getPlayer()); + ConfigMessage.fromKey("cancel-quest").send(inv.playerData); + inv.open(); + } + return; + } + + // The player cannot start a new quest if he is already doing one + ConfigMessage.fromKey("already-on-quest").send(inv.playerData); + return; + } + + // Check for level requirements. + int level; + if (inv.playerData.getLevel() < (level = quest.getLevelRestriction(null))) { + ConfigMessage.fromKey("quest-level-restriction", "level", "Lvl", "count", "" + level).send(inv.playerData); + return; + } + + for (Profession profession : quest.getLevelRestrictions()) + if (inv.playerData.getCollectionSkills().getLevel(profession) < (level = quest.getLevelRestriction(profession))) { + ConfigMessage.fromKey("quest-level-restriction", "level", profession.getName() + " Lvl", "count", "" + level) + .send(inv.playerData); + return; + } + + if (inv.playerData.getQuestData().hasFinished(quest)) { + + // If the player has already finished this quest, he can't start it again + if (!quest.isRedoable()) { + ConfigMessage.fromKey("cant-redo-quest").send(inv.playerData); + return; + } + + // Has the player waited long enough + if (!inv.playerData.getQuestData().checkCooldownAvailability(quest)) { + ConfigMessage.fromKey("quest-cooldown", "delay", new DelayFormat(2).format(inv.playerData.getQuestData().getDelayFeft(quest))).send(inv.playerData); + return; + } + } + + // Eventually start the quest + ConfigMessage.fromKey("start-quest", "quest", quest.getName()).send(inv.playerData); + MMOCore.plugin.soundManager.getSound(SoundEvent.START_QUEST).playTo(inv.getPlayer()); + inv.playerData.getQuestData().start(quest); + inv.open(); + } } public class QuestInventory extends GeneratedInventory { private final List quests = new ArrayList<>(MMOCore.plugin.questManager.getAll()); private final int perPage; - - private int page; + private final PlayerData playerData; public QuestInventory(PlayerData playerData, EditableInventory editable) { - super(playerData, editable); + super(new Navigator(playerData.getMMOPlayerData()), editable); + this.playerData = playerData; perPage = editable.getByFunction("quest").getSlots().size(); } - - @Override - public String calculateName() { - return getName(); - } - - @Override - public void whenClicked(InventoryClickContext context, InventoryItem item) { - if (item.getFunction().equals("previous")) { - page--; - open(); - return; - } - - if (item.getFunction().equals("next")) { - page++; - open(); - return; - } - - if (item.getFunction().equals("quest")) { - String questId = context.getClickedItem().getItemMeta().getPersistentDataContainer() - .get(new NamespacedKey(MMOCore.plugin, "quest_id"), PersistentDataType.STRING); - if (questId == null || questId.equals("")) - return; - - Quest quest = MMOCore.plugin.questManager.get(questId); - - if (playerData.getQuestData().hasCurrent()) { - - // Check if the player is cancelling his ongoing quest - if (playerData.getQuestData().hasCurrent(quest)) { - if (context.getClickType() == ClickType.RIGHT) { - playerData.getQuestData().start(null); - MMOCore.plugin.soundManager.getSound(SoundEvent.CANCEL_QUEST).playTo(player); - ConfigMessage.fromKey("cancel-quest").send(player); - open(); - } - return; - } - - // The player cannot start a new quest if he is already doing one - ConfigMessage.fromKey("already-on-quest").send(player); - return; - } - - // Check for level requirements. - int level; - if (playerData.getLevel() < (level = quest.getLevelRestriction(null))) { - ConfigMessage.fromKey("quest-level-restriction", "level", "Lvl", "count", "" + level).send(player); - return; - } - - for (Profession profession : quest.getLevelRestrictions()) - if (playerData.getCollectionSkills().getLevel(profession) < (level = quest.getLevelRestriction(profession))) { - ConfigMessage.fromKey("quest-level-restriction", "level", profession.getName() + " Lvl", "count", "" + level) - .send(player); - return; - } - - if (playerData.getQuestData().hasFinished(quest)) { - - // If the player has already finished this quest, he can't start it again - if (!quest.isRedoable()) { - ConfigMessage.fromKey("cant-redo-quest").send(player); - return; - } - - // Has the player waited long enough - if (!playerData.getQuestData().checkCooldownAvailability(quest)) { - ConfigMessage.fromKey("quest-cooldown", "delay", new DelayFormat(2).format(playerData.getQuestData().getDelayFeft(quest))).send(player); - return; - } - } - - // Eventually start the quest - ConfigMessage.fromKey("start-quest", "quest", quest.getName()).send(player); - MMOCore.plugin.soundManager.getSound(SoundEvent.START_QUEST).playTo(player); - playerData.getQuestData().start(quest); - open(); - } - } } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java index b96875ad..944fe151 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SkillList.java @@ -3,17 +3,15 @@ package net.Indyuce.mmocore.gui; 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.gui.editable.EditableInventory; +import io.lumine.mythic.lib.gui.editable.item.InventoryItem; +import io.lumine.mythic.lib.gui.editable.item.builtin.NextPageItem; +import io.lumine.mythic.lib.gui.editable.item.builtin.PreviousPageItem; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.SoundEvent; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.util.MMOCoreUtils; -import net.Indyuce.mmocore.gui.api.EditableInventory; -import net.Indyuce.mmocore.gui.api.GeneratedInventory; -import net.Indyuce.mmocore.gui.api.InventoryClickContext; -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 net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skill.RegisteredSkill; import net.Indyuce.mmocore.skill.binding.SkillSlot; @@ -28,7 +26,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Comparator; import java.util.List; @@ -41,16 +39,13 @@ public class SkillList extends EditableInventory { } @Override - public InventoryItem load(String function, ConfigurationSection config) { + public @Nullable InventoryItem resolveItem(@NotNull String function, @NotNull ConfigurationSection config) { - if (function.equals("skill")) - return new SkillItem(config); + if (function.equals("skill")) return new SkillItem(config); - if (function.equals("level")) - return new LevelItem(config); + if (function.equals("level")) return new LevelItem(config); - if (function.equals("upgrade")) - return new UpgradeItem(config); + if (function.equals("upgrade")) return new UpgradeItem(config); if (function.equals("reallocation")) { @@ -70,29 +65,12 @@ public class SkillList extends EditableInventory { if (function.equals("slot")) return new SlotItem(config); - if (function.equals("previous")) - return new SimplePlaceholderItem(config) { + if (function.equals("previous")) return new PreviousPageItem<>(config); + if (function.equals("next")) return new NextPageItem<>(config); - @Override - public boolean canDisplay(SkillViewerInventory inv) { - return inv.page > 0; - } - }; + if (function.equals("selected")) return new SelectedItem(config); - if (function.equals("next")) { - return new SimplePlaceholderItem(config) { - - @Override - public boolean canDisplay(SkillViewerInventory inv) { - final int perPage = inv.skillSlots.size(); - return inv.page < (inv.skills.size() - 1) / perPage; - } - }; - } - if (function.equals("selected")) - return new SelectedItem(config); - - return new SimplePlaceholderItem(config); + return null; } public GeneratedInventory newInventory(PlayerData data) { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SubclassSelect.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SubclassSelect.java index 6cf850d5..120d7ebd 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SubclassSelect.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/SubclassSelect.java @@ -1,30 +1,31 @@ package net.Indyuce.mmocore.gui; -import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.UtilityMethods; +import io.lumine.mythic.lib.gui.Navigator; +import io.lumine.mythic.lib.gui.editable.EditableInventory; +import io.lumine.mythic.lib.gui.editable.GeneratedInventory; +import io.lumine.mythic.lib.gui.editable.item.InventoryItem; +import io.lumine.mythic.lib.gui.editable.item.ItemOptions; +import io.lumine.mythic.lib.gui.editable.item.SimpleItem; +import io.lumine.mythic.lib.gui.editable.item.builtin.GoBackItem; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.SoundEvent; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.profess.ClassOption; import net.Indyuce.mmocore.api.player.profess.PlayerClass; -import net.Indyuce.mmocore.api.util.MMOCoreUtils; -import net.Indyuce.mmocore.gui.api.EditableInventory; -import net.Indyuce.mmocore.gui.api.GeneratedInventory; -import net.Indyuce.mmocore.gui.api.InventoryClickContext; -import net.Indyuce.mmocore.gui.api.item.InventoryItem; -import net.Indyuce.mmocore.gui.api.item.SimplePlaceholderItem; import net.Indyuce.mmocore.manager.InventoryManager; import org.apache.commons.lang.Validate; -import org.bukkit.Material; +import org.bukkit.ChatColor; import org.bukkit.NamespacedKey; import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.inventory.ItemFlag; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.List; public class SubclassSelect extends EditableInventory { @@ -33,26 +34,26 @@ public class SubclassSelect extends EditableInventory { } @Override - public InventoryItem load(String function, ConfigurationSection config) { - return function.startsWith("sub-class") ? new ClassItem(config) : new SimplePlaceholderItem(config); + public @Nullable InventoryItem resolveItem(@NotNull String function, @NotNull ConfigurationSection config) { + if (function.startsWith("sub-class")) return new ClassItem(config); + if (function.equalsIgnoreCase("back")) return new GoBackItem<>(config); + return null; } public GeneratedInventory newInventory(PlayerData data) { - return new SubclassSelectionInventory(data, this); + ClassSelect.ProfessSelectionInventory prev = InventoryManager.CLASS_SELECT.newInventory(data); + return new SubclassSelectionInventory(prev.getNavigator(), data); } - public class ClassItem extends SimplePlaceholderItem { - private final String name; - private final List lore; + public class ClassItem extends SimpleItem { private final PlayerClass playerClass; public ClassItem(ConfigurationSection config) { - super(config.contains("item") ? Material.valueOf(UtilityMethods.enumName(config.getString("item"))) : Material.BARRIER, config); + super(config); + Validate.isTrue(config.getString("function").length() > 10, "Couldn't find the class associated to: " + config.getString("function")); String classId = UtilityMethods.enumName(config.getString("function").substring(10)); this.playerClass = MMOCore.plugin.classManager.getOrThrow(classId); - this.name = config.getString("name"); - this.lore = config.getStringList("lore"); } public boolean hasDifferentDisplay() { @@ -60,22 +61,22 @@ public class SubclassSelect extends EditableInventory { } @Override - public ItemStack display(SubclassSelectionInventory inv, int n) { - ItemStack item = n == 0 ? playerClass.getIcon() : super.display(inv, n); + public ItemStack getDisplayedItem(SubclassSelectionInventory inv, int n) { + ItemOptions options = n == 0 ? ItemOptions.item(n, playerClass.getIcon()) : ItemOptions.index(n); + ItemStack item = super.getDisplayedItem(inv, options); ItemMeta meta = item.getItemMeta(); - if (hideFlags()) MMOCoreUtils.addAllItemFlags(meta); - if (hideTooltip()) meta.setHideTooltip(true); - meta.setDisplayName(MythicLib.plugin.parseColors(name).replace("{name}", playerClass.getName())); - List lore = new ArrayList<>(this.lore); + if (meta.hasDisplayName()) + meta.setDisplayName(meta.getDisplayName().replace("{name}", playerClass.getName())); + List lore = meta.getLore(); - int index = lore.indexOf("{lore}"); + int index = lore.indexOf(ChatColor.GRAY + "{lore}"); if (index >= 0) { lore.remove(index); for (int j = 0; j < playerClass.getDescription().size(); j++) lore.add(index + j, playerClass.getDescription().get(j)); } - index = lore.indexOf("{attribute-lore}"); + index = lore.indexOf(ChatColor.GRAY + "{attribute-lore}"); if (index >= 0) { lore.remove(index); for (int j = 0; j < playerClass.getAttributeDescription().size(); j++) @@ -89,48 +90,41 @@ public class SubclassSelect extends EditableInventory { } @Override - public boolean canDisplay(SubclassSelectionInventory inv) { - return inv.getPlayerData() + public boolean isDisplayed(@NotNull SubclassSelectionInventory inv) { + return inv.playerData .getProfess() .getSubclasses() .stream() - .anyMatch(subclass -> subclass.getLevel() <= inv.getPlayerData().getLevel() + .anyMatch(subclass -> subclass.getLevel() <= inv.playerData.getLevel() && subclass.getProfess().getId().equals(playerClass.getId())); } + + @Override + public void onClick(@NotNull SubclassSelectionInventory inv, @NotNull InventoryClickEvent event) { + + if (inv.playerData.getClassPoints() < 1) { + inv.getPlayer().closeInventory(); + MMOCore.plugin.soundManager.getSound(SoundEvent.CANT_SELECT_CLASS).playTo(inv.getPlayer()); + ConfigMessage.fromKey("cant-choose-new-class").send(inv.playerData); + return; + } + if (playerClass.hasOption(ClassOption.NEEDS_PERMISSION) && !inv.getPlayer().hasPermission("mmocore.class." + playerClass.getId().toLowerCase())) { + MMOCore.plugin.soundManager.getSound(SoundEvent.CANT_SELECT_CLASS).playTo(inv.getPlayer()); + ConfigMessage.fromKey("no-permission-for-class").send(inv.playerData); + return; + } + + InventoryManager.CLASS_CONFIRM.get(playerClass.getId()).newInventory(inv.getNavigator(), inv.playerData, true, null).open(); + } } public class SubclassSelectionInventory extends GeneratedInventory { - public SubclassSelectionInventory(PlayerData playerData, EditableInventory editable) { - super(playerData, editable); - } + private final PlayerData playerData; - @Override - public String calculateName() { - return getName(); - } + public SubclassSelectionInventory(Navigator navigator, PlayerData playerData) { + super(navigator, SubclassSelect.this); - @Override - public void whenClicked(InventoryClickContext context, InventoryItem item) { - if (item.getFunction().equals("back")) - InventoryManager.CLASS_SELECT.newInventory(playerData).open(); - - if (item.getFunction().startsWith("sub-class")) { - String classId = UtilityMethods.ymlName(item.getFunction().substring(10)); - PlayerClass profess = MMOCore.plugin.classManager.get(UtilityMethods.enumName(classId)); - if (playerData.getClassPoints() < 1) { - player.closeInventory(); - MMOCore.plugin.soundManager.getSound(SoundEvent.CANT_SELECT_CLASS).playTo(getPlayer()); - ConfigMessage.fromKey("cant-choose-new-class").send(player); - return; - } - if (profess.hasOption(ClassOption.NEEDS_PERMISSION) && !player.hasPermission("mmocore.class." + profess.getId().toLowerCase())) { - MMOCore.plugin.soundManager.getSound(SoundEvent.CANT_SELECT_CLASS).playTo(player); - ConfigMessage.fromKey("no-permission-for-class").send(player); - return; - } - - InventoryManager.CLASS_CONFIRM.get(classId).newInventory(playerData, this, true, null).open(); - } + this.playerData = playerData; } } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/WaypointViewer.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/WaypointViewer.java index 489015c0..778e2b2c 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/WaypointViewer.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/WaypointViewer.java @@ -1,29 +1,32 @@ package net.Indyuce.mmocore.gui; +import io.lumine.mythic.lib.gui.Navigator; +import io.lumine.mythic.lib.gui.editable.EditableInventory; +import io.lumine.mythic.lib.gui.editable.GeneratedInventory; +import io.lumine.mythic.lib.gui.editable.item.InventoryItem; +import io.lumine.mythic.lib.gui.editable.item.PhysicalItem; +import io.lumine.mythic.lib.gui.editable.item.SimpleItem; +import io.lumine.mythic.lib.gui.editable.item.builtin.NextPageItem; +import io.lumine.mythic.lib.gui.editable.item.builtin.PreviousPageItem; +import io.lumine.mythic.lib.gui.editable.placeholder.Placeholders; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.player.PlayerActivity; import net.Indyuce.mmocore.api.player.PlayerData; -import net.Indyuce.mmocore.api.util.MMOCoreUtils; -import net.Indyuce.mmocore.gui.api.EditableInventory; -import net.Indyuce.mmocore.gui.api.GeneratedInventory; -import net.Indyuce.mmocore.gui.api.InventoryClickContext; -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 net.Indyuce.mmocore.waypoint.Waypoint; import net.Indyuce.mmocore.waypoint.WaypointPath; import net.Indyuce.mmocore.waypoint.WaypointPathCalculation; import org.apache.commons.lang.Validate; import org.bukkit.ChatColor; -import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.OfflinePlayer; import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -36,30 +39,12 @@ public class WaypointViewer extends EditableInventory { } @Override - public InventoryItem load(String function, ConfigurationSection config) { + public @Nullable InventoryItem resolveItem(@NotNull String function, @NotNull ConfigurationSection config) { + if (function.equals("waypoint")) return new WaypointItem(config); + if (function.equals("previous")) return new PreviousPageItem<>(config); + if (function.equals("next")) return new NextPageItem<>(config); - if (function.equals("waypoint")) - return new WaypointItem(config); - - if (function.equals("previous")) - return new SimplePlaceholderItem(config) { - - @Override - public boolean canDisplay(WaypointViewerInventory inv) { - return inv.page > 0; - } - }; - - 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(); - } - }; - - return new SimplePlaceholderItem(config); + return null; } public GeneratedInventory newInventory(PlayerData data) { @@ -70,12 +55,12 @@ public class WaypointViewer extends EditableInventory { return new WaypointViewerInventory(data, this, waypoint); } - public class WaypointItem extends SimplePlaceholderItem { - private final SimplePlaceholderItem noWaypoint, locked; + public class WaypointItem extends InventoryItem { + private final SimpleItem noWaypoint, locked; private final WaypointItemHandler availWaypoint, noStellium, notLinked, currentWayPoint; public WaypointItem(ConfigurationSection config) { - super(Material.BARRIER, config); + super(config); Validate.notNull(config.getConfigurationSection("no-waypoint"), "Could not load 'no-waypoint' config"); Validate.notNull(config.getConfigurationSection("locked"), "Could not load 'locked' config"); @@ -85,8 +70,8 @@ public class WaypointViewer extends EditableInventory { Validate.notNull(config.getConfigurationSection("not-enough-stellium"), "Could not load 'not-enough-stellium' config"); Validate.notNull(config.getConfigurationSection("display"), "Could not load 'display' config"); - noWaypoint = new SimplePlaceholderItem(config.getConfigurationSection("no-waypoint")); - locked = new SimplePlaceholderItem(config.getConfigurationSection("locked")); + noWaypoint = new SimpleItem<>(config.getConfigurationSection("no-waypoint")); + locked = new SimpleItem<>(config.getConfigurationSection("locked")); notLinked = new WaypointItemHandler(config.getConfigurationSection("not-a-destination"), true); //notDynamic = new WaypointItemHandler(config.getConfigurationSection("not-dynamic"), true); currentWayPoint = new WaypointItemHandler(config.getConfigurationSection("current-waypoint"), true); @@ -100,35 +85,35 @@ public class WaypointViewer extends EditableInventory { } @Override - public ItemStack display(WaypointViewerInventory inv, int n) { + public ItemStack getDisplayedItem(WaypointViewerInventory inv, int n) { int index = inv.page * inv.getEditable().getByFunction("waypoint").getSlots().size() + n; if (index >= inv.waypoints.size()) - return noWaypoint.display(inv, n); + return noWaypoint.getDisplayedItem(inv, n); final Waypoint waypoint = inv.waypoints.get(index); // Current waypoint if (inv.current != null && inv.current.equals(waypoint)) - return currentWayPoint.display(inv, n); + return currentWayPoint.getDisplayedItem(inv, n); // Locked waypoint - if (!inv.getPlayerData().hasWaypoint(waypoint)) - return locked.display(inv, n); + if (!inv.playerData.hasWaypoint(waypoint)) + return locked.getDisplayedItem(inv, n); // Waypoints are not linked if (!inv.paths.containsKey(waypoint)) - return notLinked.display(inv, n); + return notLinked.getDisplayedItem(inv, n); // Normal cost - if (inv.paths.get(waypoint).getCost() > inv.getPlayerData().getStellium()) - return noStellium.display(inv, n); + if (inv.paths.get(waypoint).getCost() > inv.playerData.getStellium()) + return noStellium.getDisplayedItem(inv, n); - return availWaypoint.display(inv, n); + return availWaypoint.getDisplayedItem(inv, n); } } - public class WaypointItemHandler extends InventoryItem { + public class WaypointItemHandler extends PhysicalItem { private final boolean onlyName; private final String splitter, none; @@ -141,27 +126,19 @@ public class WaypointViewer extends EditableInventory { } @Override - public ItemStack display(WaypointViewerInventory inv, int n) { - // TODO refactor code - final Placeholders placeholders = getPlaceholders(inv, n); - final OfflinePlayer effectivePlayer = getEffectivePlayer(inv, n); + public ItemStack getDisplayedItem(WaypointViewerInventory inv, int n) { + final OfflinePlayer effectivePlayer = getEffectivePlayer(inv, n); // TODO check if this is needed - final ItemStack item = new ItemStack(getMaterial()); + final ItemStack item = super.getDisplayedItem(inv, n); final ItemMeta meta = item.getItemMeta(); - meta.setCustomModelData(getModelData()); - // if (texture != null && meta instanceof SkullMeta) - // UtilityMethods.setTextureValue((SkullMeta) meta, texture); + final Placeholders placeholders = getPlaceholders(inv, n); // TODO remove dupe call - if (hasName()) meta.setDisplayName(placeholders.apply(effectivePlayer, getName())); - - if (hideFlags()) MMOCoreUtils.addAllItemFlags(meta); - if (hideTooltip()) meta.setHideTooltip(true); // 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); - if (hasLore()) { + if (meta.hasLore()) { List lore = new ArrayList<>(); - getLore().forEach(line -> { + meta.getLore().forEach(line -> { if (line.equals("{lore}")) for (String added : waypoint.getLore()) lore.add(ChatColor.GRAY + placeholders.apply(effectivePlayer, added)); else lore.add(ChatColor.GRAY + placeholders.apply(effectivePlayer, line)); @@ -187,94 +164,75 @@ public class WaypointViewer extends EditableInventory { if (!onlyName) { holders.register("current_cost", inv.paths.get(waypoint).getCost()); - holders.register("normal_cost", decimal.format(inv.paths.containsKey(waypoint) ? inv.paths.get(waypoint).getCost() : Double.POSITIVE_INFINITY)); - holders.register("dynamic_cost", decimal.format(waypoint.getDynamicCost())); + holders.register("normal_cost", ONE_DIGIT.format(inv.paths.containsKey(waypoint) ? inv.paths.get(waypoint).getCost() : Double.POSITIVE_INFINITY)); + holders.register("dynamic_cost", ONE_DIGIT.format(waypoint.getDynamicCost())); holders.register("intermediary_waypoints", inv.paths.containsKey(waypoint) ? inv.paths.get(waypoint).displayIntermediaryWayPoints(splitter, none) : none); } return holders; } + + @Override + public void onClick(@NotNull WaypointViewerInventory inv, @NotNull InventoryClickEvent event) { + PersistentDataContainer container = event.getCurrentItem().getItemMeta().getPersistentDataContainer(); + String tag = container.has(new NamespacedKey(MMOCore.plugin, "waypointId"), PersistentDataType.STRING) ? + container.get(new NamespacedKey(MMOCore.plugin, "waypointId"), PersistentDataType.STRING) : ""; + + if (tag.isEmpty()) return; + + // Locked waypoint? + final Waypoint waypoint = MMOCore.plugin.waypointManager.get(tag); + if (!inv.playerData.hasWaypoint(waypoint)) { + ConfigMessage.fromKey("not-unlocked-waypoint").send(inv.playerData); + return; + } + + // Cannot teleport to current waypoint + if (waypoint.equals(inv.current)) { + ConfigMessage.fromKey("standing-on-waypoint").send(inv.playerData); + return; + } + + // No access to that waypoint + if (inv.paths.get(waypoint) == null) { + ConfigMessage.fromKey("cannot-teleport-to").send(inv.playerData); + return; + } + + // Stellium cost + double withdraw = inv.paths.get(waypoint).getCost(); + double left = withdraw - inv.playerData.getStellium(); + if (left > 0) { + ConfigMessage.fromKey("not-enough-stellium", "more", ONE_DIGIT.format(left)).send(inv.playerData); + return; + } + + if (inv.playerData.getActivityTimeOut(PlayerActivity.USE_WAYPOINT) > 0) + return; + + inv.getPlayer().closeInventory(); + inv.playerData.warp(waypoint, withdraw); + } } public class WaypointViewerInventory extends GeneratedInventory { private final List waypoints = new ArrayList<>(MMOCore.plugin.waypointManager.getAll()); @Nullable private final Waypoint current; + private final PlayerData playerData; private Map paths; - private int page; - public WaypointViewerInventory(PlayerData playerData, EditableInventory editable, Waypoint current) { - super(playerData, editable); + super(new Navigator(playerData.getMMOPlayerData()), editable); + this.playerData = playerData; this.current = current; paths = new WaypointPathCalculation(playerData).run(current).getPaths(); } - @Override - public String calculateName() { - return getName(); - } - public boolean isDynamicUse() { return current == null; } - - @Override - public void whenClicked(InventoryClickContext context, InventoryItem item) { - if (item.getFunction().equals("next")) { - page++; - open(); - return; - } - - if (item.getFunction().equals("previous")) { - page--; - open(); - return; - } - - if (item.getFunction().equals("waypoint")) { - PersistentDataContainer container = context.getClickedItem().getItemMeta().getPersistentDataContainer(); - String tag = container.has(new NamespacedKey(MMOCore.plugin, "waypointId"), PersistentDataType.STRING) ? - container.get(new NamespacedKey(MMOCore.plugin, "waypointId"), PersistentDataType.STRING) : ""; - - if (tag.isEmpty()) return; - - // Locked waypoint? - final Waypoint waypoint = MMOCore.plugin.waypointManager.get(tag); - if (!playerData.hasWaypoint(waypoint)) { - ConfigMessage.fromKey("not-unlocked-waypoint").send(player); - return; - } - - // Cannot teleport to current waypoint - if (waypoint.equals(current)) { - ConfigMessage.fromKey("standing-on-waypoint").send(player); - return; - } - - // No access to that waypoint - if (paths.get(waypoint) == null) { - ConfigMessage.fromKey("cannot-teleport-to").send(player); - return; - } - - // Stellium cost - double withdraw = paths.get(waypoint).getCost(); - double left = withdraw - playerData.getStellium(); - if (left > 0) { - ConfigMessage.fromKey("not-enough-stellium", "more", decimal.format(left)).send(player); - return; - } - - if (playerData.getActivityTimeOut(PlayerActivity.USE_WAYPOINT) > 0) - return; - - player.closeInventory(); - playerData.warp(waypoint, withdraw); - } - } } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/EditableInventory.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/EditableInventory.java index 686f043a..2dfadc1c 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/EditableInventory.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/EditableInventory.java @@ -15,6 +15,7 @@ import java.util.LinkedHashSet; import java.util.Set; import java.util.logging.Level; +@Deprecated public abstract class EditableInventory { private final String id; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/GeneratedInventory.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/GeneratedInventory.java index 934d96ff..e79130ea 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/GeneratedInventory.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/GeneratedInventory.java @@ -17,6 +17,7 @@ import java.util.concurrent.CompletableFuture; import java.util.function.BiConsumer; import java.util.function.Consumer; +@Deprecated public abstract class GeneratedInventory extends PluginInventory { private final EditableInventory editable; private final List loaded = new ArrayList<>(); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/InventoryClickContext.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/InventoryClickContext.java index 8629991d..1c64c4e6 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/InventoryClickContext.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/InventoryClickContext.java @@ -7,6 +7,7 @@ import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +@Deprecated public class InventoryClickContext { private final int slot; private final ClickType clickType; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/PluginInventory.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/PluginInventory.java index e8ce43cf..3b65af37 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/PluginInventory.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/PluginInventory.java @@ -7,6 +7,7 @@ import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; +@Deprecated public abstract class PluginInventory implements InventoryHolder { protected final Player player; protected final PlayerData playerData; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/adaptor/Adaptor.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/adaptor/Adaptor.java index f8ba8441..d9c2e146 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/adaptor/Adaptor.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/adaptor/Adaptor.java @@ -8,6 +8,7 @@ import java.util.concurrent.CompletableFuture; import java.util.function.BiConsumer; import java.util.function.Consumer; +@Deprecated public abstract class Adaptor { protected final GeneratedInventory generated; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/adaptor/AdaptorType.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/adaptor/AdaptorType.java index 79022132..3ca9820b 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/adaptor/AdaptorType.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/adaptor/AdaptorType.java @@ -4,6 +4,7 @@ import net.Indyuce.mmocore.gui.api.GeneratedInventory; import java.util.function.Function; +@Deprecated public enum AdaptorType { CLASSIC_ADAPTOR(ClassicAdaptor::new), THREE_DIM_ADAPTOR(ThreeDimAdaptor::new); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/adaptor/ClassicAdaptor.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/adaptor/ClassicAdaptor.java index 7acdfa89..ad44c764 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/adaptor/ClassicAdaptor.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/adaptor/ClassicAdaptor.java @@ -13,6 +13,7 @@ import java.util.concurrent.CompletableFuture; import java.util.function.BiConsumer; import java.util.function.Consumer; +@Deprecated public class ClassicAdaptor extends Adaptor { private Inventory open; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/adaptor/ThreeDimAdaptor.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/adaptor/ThreeDimAdaptor.java index 767baea4..c5f0e20e 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/adaptor/ThreeDimAdaptor.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/adaptor/ThreeDimAdaptor.java @@ -37,6 +37,7 @@ import java.util.concurrent.CompletableFuture; import java.util.function.BiConsumer; import java.util.function.Consumer; +@Deprecated public class ThreeDimAdaptor extends Adaptor { private final double INITIAL_PERCENTAGE = 0.20; private final double INCREMENT_PERCENTAGE = 0.20; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/ErrorPlaceholders.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/ErrorPlaceholders.java deleted file mode 100644 index 5b490a0c..00000000 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/ErrorPlaceholders.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.Indyuce.mmocore.gui.api.item; - -import org.jetbrains.annotations.Nullable; - -public class ErrorPlaceholders extends Placeholders { - - @Nullable - @Override - public String getPlaceholder(String placeholder) { - return "???"; - } -} diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/InventoryItem.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/InventoryItem.java index f0ef7a8e..383569ff 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/InventoryItem.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/InventoryItem.java @@ -18,6 +18,7 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; +@Deprecated public abstract class InventoryItem { private final String id, function; private final List slots = new ArrayList<>(); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/Placeholders.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/Placeholders.java index 95e3db23..91ed666f 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/Placeholders.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/Placeholders.java @@ -8,6 +8,7 @@ import org.jetbrains.annotations.Nullable; import java.util.HashMap; import java.util.Map; +@Deprecated public class Placeholders { private final Map placeholders = new HashMap<>(); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/SimplePlaceholderItem.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/SimplePlaceholderItem.java index 57cf9f97..50a91104 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/SimplePlaceholderItem.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/SimplePlaceholderItem.java @@ -4,6 +4,7 @@ import net.Indyuce.mmocore.gui.api.GeneratedInventory; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; +@Deprecated public class SimplePlaceholderItem extends InventoryItem { public SimplePlaceholderItem(InventoryItem parent, ConfigurationSection config) { super(parent, config); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/TriggerItem.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/TriggerItem.java index 1b981344..16de2e29 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/TriggerItem.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/item/TriggerItem.java @@ -6,6 +6,7 @@ import net.Indyuce.mmocore.api.quest.trigger.Trigger; import net.Indyuce.mmocore.gui.api.GeneratedInventory; import org.bukkit.configuration.ConfigurationSection; +@Deprecated public class TriggerItem extends InventoryItem { private final Trigger triggers; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/eco/DepositMenu.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/eco/DepositMenu.java index d62ead9e..6980b68e 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/eco/DepositMenu.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/eco/DepositMenu.java @@ -2,17 +2,16 @@ package net.Indyuce.mmocore.gui.eco; import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.api.util.SmartGive; +import io.lumine.mythic.lib.gui.PluginInventory; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.util.MMOCoreUtils; -import net.Indyuce.mmocore.gui.api.InventoryClickContext; -import net.Indyuce.mmocore.gui.api.PluginInventory; import net.Indyuce.mmocore.util.item.SimpleItemBuilder; import net.milkbowl.vault.economy.EconomyResponse; import org.bukkit.Bukkit; import org.bukkit.Sound; import org.bukkit.entity.Player; -import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; @@ -21,6 +20,8 @@ public class DepositMenu extends PluginInventory { private ItemStack depositItem; private int deposit; + private Inventory lastBukkitInventory; + /** * Every time an item is clicked in the inventory, an inventory * update is scheduled. If nothing happens for the next 10 ticks @@ -37,13 +38,13 @@ public class DepositMenu extends PluginInventory { public Inventory getInventory() { Inventory inv = Bukkit.createInventory(this, 27, "Deposit"); updateDeposit(inv); - return inv; + return lastBukkitInventory = inv; } @Override - public void whenClicked(InventoryClickContext event) { + public void onClick(InventoryClickEvent event) { - if (event.getClickedItem().isSimilar(depositItem)) { + if (event.getCurrentItem() != null && event.getCurrentItem().isSimilar(depositItem)) { event.setCancelled(true); updateDeposit(event.getInventory()); @@ -61,7 +62,7 @@ public class DepositMenu extends PluginInventory { return; } - int worth = NBTItem.get(event.getClickedItem()).getInteger("RpgWorth"); + int worth = NBTItem.get(event.getCursor()).getInteger("RpgWorth"); if (worth < 1) event.setCancelled(true); else @@ -69,7 +70,7 @@ public class DepositMenu extends PluginInventory { } @Override - public void whenClosed(InventoryCloseEvent event) { + public void onClose() { // Cancel runnable if (updateRunnable != null) @@ -78,22 +79,12 @@ public class DepositMenu extends PluginInventory { // Give all items back SmartGive smart = new SmartGive(player); for (int j = 0; j < 26; j++) { - ItemStack item = event.getInventory().getItem(j); + ItemStack item = lastBukkitInventory.getItem(j); if (item != null) smart.give(item); } } - private BukkitRunnable newUpdateRunnable(Inventory inv) { - return new BukkitRunnable() { - - @Override - public void run() { - updateDeposit(inv); - } - }; - } - private void scheduleUpdate(Inventory inv) { if (updateRunnable != null) updateRunnable.cancel(); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/eco/GoldPouch.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/eco/GoldPouch.java index e1f6d90f..4f5cf49a 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/eco/GoldPouch.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/eco/GoldPouch.java @@ -2,15 +2,14 @@ package net.Indyuce.mmocore.gui.eco; import io.lumine.mythic.lib.api.item.ItemTag; import io.lumine.mythic.lib.api.item.NBTItem; +import io.lumine.mythic.lib.gui.PluginInventory; import net.Indyuce.mmocore.api.util.MMOCoreUtils; -import net.Indyuce.mmocore.gui.api.InventoryClickContext; -import net.Indyuce.mmocore.gui.api.PluginInventory; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Player; -import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -18,6 +17,8 @@ public class GoldPouch extends PluginInventory { private final boolean mob; private final NBTItem nbt; + private Inventory lastBukkitInventory; + public GoldPouch(Player player, NBTItem nbt) { super(player); @@ -29,36 +30,36 @@ public class GoldPouch extends PluginInventory { public Inventory getInventory() { Inventory inv = Bukkit.createInventory(this, 18, ChatColor.UNDERLINE + "Gold Pouch"); inv.setContents(MMOCoreUtils.itemStackArrayFromBase64(nbt.getString("RpgPouchInventory"))); - return inv; + return lastBukkitInventory = inv; } @Override - public void whenClicked(InventoryClickContext context) { + public void onClick(InventoryClickEvent event) { - ItemStack item = context.getClickedItem(); + ItemStack item = event.getCurrentItem(); if (item == null || item.getType() == Material.AIR) { - context.setCancelled(true); + event.setCancelled(true); return; } NBTItem nbt = NBTItem.get(item); if (!nbt.hasTag("RpgWorth")) { - context.setCancelled(true); + event.setCancelled(true); return; } if (mob) { - context.setCancelled(true); + event.setCancelled(true); // in deposit menu - if (context.getSlot() < 18) { + if (event.getSlot() < 18) { int empty = player.getInventory().firstEmpty(); if (empty < 0) return; player.playSound(player.getLocation(), Sound.ENTITY_SHULKER_TELEPORT, 1, 2); - player.getInventory().addItem(context.getClickedItem()); - context.getInventory().setItem(context.getSlot(), null); + player.getInventory().addItem(event.getCurrentItem()); + event.getInventory().setItem(event.getSlot(), null); } return; @@ -71,18 +72,17 @@ public class GoldPouch extends PluginInventory { * contents */ if (nbt.hasTag("RpgPouchInventory")) - context.setCancelled(true); + event.setCancelled(true); } @Override - public void whenClosed(InventoryCloseEvent event) { - Player player = (Player) event.getPlayer(); - if (mob && isEmpty(event.getInventory())) { + public void onClose() { + if (mob && isEmpty(lastBukkitInventory)) { player.getEquipment().setItemInMainHand(null); return; } - ItemStack updated = NBTItem.get(player.getEquipment().getItemInMainHand()).addTag(new ItemTag("RpgPouchInventory", MMOCoreUtils.toBase64(event.getInventory().getContents()))).toItem(); + ItemStack updated = NBTItem.get(player.getEquipment().getItemInMainHand()).addTag(new ItemTag("RpgPouchInventory", MMOCoreUtils.toBase64(lastBukkitInventory.getContents()))).toItem(); player.getEquipment().setItemInMainHand(updated); } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/skilltree/SkillTreeViewer.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/skilltree/SkillTreeViewer.java index 0629a7af..05e68095 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/skilltree/SkillTreeViewer.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/skilltree/SkillTreeViewer.java @@ -1,35 +1,38 @@ package net.Indyuce.mmocore.gui.skilltree; import io.lumine.mythic.lib.UtilityMethods; +import io.lumine.mythic.lib.gui.Navigator; +import io.lumine.mythic.lib.gui.editable.EditableInventory; +import io.lumine.mythic.lib.gui.editable.GeneratedInventory; +import io.lumine.mythic.lib.gui.editable.item.InventoryItem; +import io.lumine.mythic.lib.gui.editable.item.ItemOptions; +import io.lumine.mythic.lib.gui.editable.item.PhysicalItem; +import io.lumine.mythic.lib.gui.editable.item.SimpleItem; +import io.lumine.mythic.lib.gui.editable.placeholder.Placeholders; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.SoundEvent; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.util.MMOCoreUtils; -import net.Indyuce.mmocore.gui.api.EditableInventory; -import net.Indyuce.mmocore.gui.api.GeneratedInventory; -import net.Indyuce.mmocore.gui.api.InventoryClickContext; -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 net.Indyuce.mmocore.skilltree.*; import net.Indyuce.mmocore.skilltree.display.DisplayInfo; -import net.Indyuce.mmocore.util.Icon; import net.Indyuce.mmocore.skilltree.display.NodeDisplayInfo; import net.Indyuce.mmocore.skilltree.display.PathDisplayInfo; import net.Indyuce.mmocore.skilltree.tree.SkillTree; +import net.Indyuce.mmocore.util.Icon; import org.apache.commons.lang.Validate; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; +import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -41,11 +44,11 @@ public class SkillTreeViewer extends EditableInventory { protected final Map icons = new HashMap<>(); protected final Map statusNames = new HashMap<>(); - @Nullable /** * A null skillTree means the global skill tree view is opened. * Else this GUI represents a specific skill tree. */ + @Nullable private final SkillTree defaultSkillTree; public SkillTreeViewer() { @@ -59,8 +62,9 @@ public class SkillTreeViewer extends EditableInventory { } @Override - public void reload(FileConfiguration config) { - super.reload(config); + public void reload(@NotNull JavaPlugin plugin, @NotNull ConfigurationSection config) { + super.reload(plugin, config); + if (config.contains("status-names")) for (NodeState nodeState : NodeState.values()) statusNames.put(nodeState, config.getString("status-names." + UtilityMethods.ymlName(nodeState.name()), nodeState.name())); @@ -89,61 +93,126 @@ public class SkillTreeViewer extends EditableInventory { } @Override - public InventoryItem load(String function, ConfigurationSection config) { - if (function.equals("skill-tree")) { - return new SkillTreeItem(config); - } - if (function.equals("up")) - return new SimplePlaceholderItem(config); - if (function.equals("left")) - return new SimplePlaceholderItem(config); - if (function.equals("down")) - return new SimplePlaceholderItem(config); - if (function.equals("right")) - return new SimplePlaceholderItem(config); + public @Nullable InventoryItem resolveItem(@NotNull String function, @NotNull ConfigurationSection config) { + if (function.equals("skill-tree")) return new SkillTreeItem(config); - if (function.equals("reallocation")) - return new InventoryItem(config) { + if (function.equals("up")) return new UpArrow(config); + if (function.equals("left")) return new LeftArrow(config); + if (function.equals("down")) return new DownArrow(config); + if (function.equals("right")) return new RightArrow(config); - @Override - public Placeholders getPlaceholders(SkillTreeInventory inv, int n) { - Placeholders holders = new Placeholders(); - holders.register("skill-tree-points", inv.getPlayerData().getSkillTreePoints(inv.getSkillTree().getId())); - holders.register("global-points", inv.getPlayerData().getSkillTreePoints("global")); - holders.register("realloc-points", inv.getPlayerData().getSkillTreeReallocationPoints()); - int maxPointSpent = inv.getSkillTree().getMaxPointSpent(); - holders.register("max-point-spent", maxPointSpent == Integer.MAX_VALUE ? "∞" : maxPointSpent); - holders.register("point-spent", inv.getPlayerData().getPointsSpent(inv.getSkillTree())); + if (function.equals("reallocation")) return new ReallocateButton(config); - return holders; - } - }; + if (function.equals("skill-tree-node")) return new SkillTreeNodeItem(config); + + if (function.equals("next-tree-list-page")) return new NextTreeListPageItem(config); + if (function.equals("previous-tree-list-page")) return new PreviousTreeListPageItem(config); - if (function.equals("skill-tree-node")) - return new SkillTreeNodeItem(config); - if (function.equals("next-tree-list-page")) { - return new NextTreeListPageItem(config); - } - if (function.equals("previous-tree-list-page")) { - return new PreviousTreeListPageItem(config); - } return null; } - public SkillTreeInventory newInventory(PlayerData playerData) { return new SkillTreeInventory(playerData, this, defaultSkillTree); } - - public class SkillTreeItem extends InventoryItem { - - public SkillTreeItem(ConfigurationSection config) { - //We must use this constructor to show that there are not specified material - super(Material.BARRIER, config); - + public class ReallocateButton extends PhysicalItem { + public ReallocateButton(ConfigurationSection config) { + super(config); } + @Override + public Placeholders getPlaceholders(SkillTreeInventory inv, int n) { + Placeholders holders = new Placeholders(); + holders.register("skill-tree-points", inv.playerData.getSkillTreePoints(inv.getSkillTree().getId())); + holders.register("global-points", inv.playerData.getSkillTreePoints("global")); + holders.register("realloc-points", inv.playerData.getSkillTreeReallocationPoints()); + int maxPointSpent = inv.getSkillTree().getMaxPointSpent(); + holders.register("max-point-spent", maxPointSpent == Integer.MAX_VALUE ? "∞" : maxPointSpent); + holders.register("point-spent", inv.playerData.getPointsSpent(inv.getSkillTree())); + + return holders; + } + + @Override + public void onClick(@NotNull SkillTreeInventory inv, @NotNull InventoryClickEvent event) { + + int spent = inv.playerData.getPointsSpent(inv.skillTree); + if (spent < 1) { + ConfigMessage.fromKey("no-skill-tree-points-spent").send(inv.playerData); + MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(inv.getPlayer()); + return; + } + + if (inv.playerData.getSkillTreeReallocationPoints() <= 0) { + ConfigMessage.fromKey("not-skill-tree-reallocation-point").send(inv.playerData); + MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(inv.getPlayer()); + return; + } + + int reallocated = inv.playerData.getPointsSpent(inv.skillTree); + //We remove all the nodeStates progress + inv.playerData.giveSkillTreePoints(inv.skillTree.getId(), reallocated); + inv.playerData.giveSkillTreeReallocationPoints(-1); + inv.playerData.resetSkillTree(inv.skillTree); + inv.skillTree.setupNodeStates(inv.playerData); + ConfigMessage.fromKey("reallocated-points", "points", inv.playerData.getSkillTreePoints(inv.skillTree.getId()), "skill-tree", inv.skillTree.getName()).send(inv.playerData); + MMOCore.plugin.soundManager.getSound(SoundEvent.RESET_SKILL_TREE).playTo(inv.getPlayer()); + inv.open(); + } + } + + public class UpArrow extends SimpleItem { + public UpArrow(ConfigurationSection config) { + super(config); + } + + @Override + public void onClick(@NotNull SkillTreeInventory inv, @NotNull InventoryClickEvent event) { + inv.y -= MMOCore.plugin.configManager.skillTreeScrollStepY; + inv.open(); + } + } + + public class DownArrow extends SimpleItem { + public DownArrow(ConfigurationSection config) { + super(config); + } + + @Override + public void onClick(@NotNull SkillTreeInventory inv, @NotNull InventoryClickEvent event) { + inv.y += MMOCore.plugin.configManager.skillTreeScrollStepY; + inv.open(); + } + } + + public class LeftArrow extends SimpleItem { + public LeftArrow(ConfigurationSection config) { + super(config); + } + + @Override + public void onClick(@NotNull SkillTreeInventory inv, @NotNull InventoryClickEvent event) { + inv.x -= MMOCore.plugin.configManager.skillTreeScrollStepX; + inv.open(); + } + } + + public class RightArrow extends SimpleItem { + public RightArrow(ConfigurationSection config) { + super(config); + } + + @Override + public void onClick(@NotNull SkillTreeInventory inv, @NotNull InventoryClickEvent event) { + inv.x += MMOCore.plugin.configManager.skillTreeScrollStepX; + inv.open(); + } + } + + public class SkillTreeItem extends PhysicalItem { + public SkillTreeItem(ConfigurationSection config) { + super(config); + } @Override public boolean hasDifferentDisplay() { @@ -151,21 +220,20 @@ public class SkillTreeViewer extends EditableInventory { } @Override - public ItemStack display(SkillTreeInventory inv, int n) { + public ItemStack getDisplayedItem(SkillTreeInventory inv, int n) { int index = inv.getEditable().getByFunction("skill-tree").getSlots().size() * inv.treeListPage + n; - if (inv.skillTrees.size() <= index) { - return new ItemStack(Material.AIR); - } + if (inv.skillTrees.size() <= index) return null; + SkillTree skillTree = inv.skillTrees.get(index); //We display with the material corresponding to the skillTree - ItemStack item = super.display(inv, n, skillTree.getItem()); + ItemStack item = super.getDisplayedItem(inv, ItemOptions.material(n, skillTree.getItem())); ItemMeta meta = item.getItemMeta(); meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); meta.setDisplayName(skillTree.getName()); Placeholders holders = getPlaceholders(inv, n); List lore = new ArrayList<>(); - getLore().forEach(string -> { + meta.getLore().forEach(string -> { if (string.contains("{tree-lore}")) { lore.addAll(skillTree.getLore()); } else @@ -188,45 +256,63 @@ public class SkillTreeViewer extends EditableInventory { holders.register("id", skillTree.getId()); int maxPointSpent = inv.getSkillTree().getMaxPointSpent(); holders.register("max-point-spent", maxPointSpent == Integer.MAX_VALUE ? "∞" : maxPointSpent); - holders.register("point-spent", inv.getPlayerData().getPointsSpent(inv.getSkillTree())); - holders.register("skill-tree-points", inv.getPlayerData().getSkillTreePoints(inv.getSkillTree().getId())); - holders.register("global-points", inv.getPlayerData().getSkillTreePoints("global")); + holders.register("point-spent", inv.playerData.getPointsSpent(inv.getSkillTree())); + holders.register("skill-tree-points", inv.playerData.getSkillTreePoints(inv.getSkillTree().getId())); + holders.register("global-points", inv.playerData.getSkillTreePoints("global")); return holders; } + + @Override + public void onClick(@NotNull SkillTreeInventory inv, @NotNull InventoryClickEvent event) { + String id = event.getCurrentItem().getItemMeta().getPersistentDataContainer().get( + new NamespacedKey(MMOCore.plugin, "skill-tree-id"), PersistentDataType.STRING); + MMOCore.plugin.soundManager.getSound(SoundEvent.CHANGE_SKILL_TREE).playTo(inv.getPlayer()); + inv.skillTree = MMOCore.plugin.skillTreeManager.get(id); + inv.open(); + } } - public class NextTreeListPageItem extends SimplePlaceholderItem { - + public class NextTreeListPageItem extends SimpleItem { public NextTreeListPageItem(ConfigurationSection config) { super(config); } @Override - public boolean canDisplay(SkillTreeInventory inv) { + public void onClick(@NotNull SkillTreeInventory inv, @NotNull InventoryClickEvent event) { + inv.treeListPage++; + inv.open(); + } + + @Override + public boolean isDisplayed(SkillTreeInventory inv) { return inv.getTreeListPage() < inv.getMaxTreeListPage(); } } - public class PreviousTreeListPageItem extends SimplePlaceholderItem { + public class PreviousTreeListPageItem extends SimpleItem { public PreviousTreeListPageItem(ConfigurationSection config) { super(config); } @Override - public boolean canDisplay(SkillTreeInventory inv) { + public void onClick(@NotNull SkillTreeInventory inv, @NotNull InventoryClickEvent event) { + inv.treeListPage--; + inv.open(); + } + + @Override + public boolean isDisplayed(SkillTreeInventory inv) { return inv.getTreeListPage() > 0; } } - - public class SkillTreeNodeItem extends InventoryItem { - + public class SkillTreeNodeItem extends PhysicalItem { private final List pathLore = new ArrayList<>(); - public SkillTreeNodeItem(ConfigurationSection config) { - super(Material.AIR, config); + super(config); + if (config.isList("path-lore")) pathLore.addAll(config.getStringList("path-lore")); } @@ -243,19 +329,19 @@ public class SkillTreeViewer extends EditableInventory { * the yml of the skill tree. */ @Override - public ItemStack display(SkillTreeInventory inv, int n) { + public ItemStack getDisplayedItem(SkillTreeInventory inv, int n) { IntegerCoordinates coordinates = inv.getCoordinates(n); if (inv.getSkillTree().isPathOrNode(coordinates)) { Icon icon = inv.getIcon(coordinates); - ItemStack item = super.display(inv, n, icon.getMaterial(), icon.getModelData()); + ItemStack item = super.getDisplayedItem(inv, ItemOptions.model(n, icon.getMaterial(), icon.getModelData())); ItemMeta meta = item.getItemMeta(); Placeholders holders = getPlaceholders(inv, n); if (inv.getSkillTree().isNode(coordinates)) { SkillTreeNode node = inv.getSkillTree().getNode(coordinates); List lore = new ArrayList<>(); - getLore().forEach(str -> { + meta.getLore().forEach(str -> { if (str.contains("{node-lore}")) { - node.getLore(inv.getPlayerData()).forEach(s -> lore.add(holders.apply(inv.getPlayer(), str.replace("{node-lore}", s)))); + node.getLore(inv.playerData).forEach(s -> lore.add(holders.apply(inv.getPlayer(), str.replace("{node-lore}", s)))); } else if (str.contains("{strong-parents}")) { lore.addAll(getParentsLore(inv, node, node.getParents(ParentType.STRONG))); } else if (str.contains("{soft-parents}")) { @@ -284,21 +370,19 @@ public class SkillTreeViewer extends EditableInventory { return new ItemStack(Material.AIR); } - /** * Soft&Strong children lore for the node */ public List getParentsLore(SkillTreeInventory inv, SkillTreeNode node, Collection parents) { List lore = new ArrayList<>(); for (SkillTreeNode parent : parents) { - int level = inv.getPlayerData().getNodeLevel(parent); + int level = inv.playerData.getNodeLevel(parent); ChatColor color = level >= node.getParentNeededLevel(parent) ? ChatColor.GREEN : ChatColor.RED; lore.add(ChatColor.GRAY + "◆" + parent.getName() + ": " + color + node.getParentNeededLevel(parent)); } return lore; } - @Override public Placeholders getPlaceholders(SkillTreeInventory inv, int n) { Placeholders holders = new Placeholders(); @@ -306,8 +390,8 @@ public class SkillTreeViewer extends EditableInventory { boolean isNode = inv.getSkillTree().isNode(inv.getCoordinates(n)); if (isNode) { SkillTreeNode node = inv.getNode(n); - holders.register("current-level", inv.getPlayerData().getNodeLevel(node)); - NodeState status = inv.getPlayerData().getNodeState(node); + holders.register("current-level", inv.playerData.getNodeLevel(node)); + NodeState status = inv.playerData.getNodeState(node); holders.register("current-state", statusNames.getOrDefault(status, status.name())); holders.register("max-level", node.getMaxLevel()); holders.register("name", node.getName()); @@ -319,30 +403,84 @@ public class SkillTreeViewer extends EditableInventory { } int maxPointSpent = inv.getSkillTree().getMaxPointSpent(); holders.register("max-point-spent", maxPointSpent == Integer.MAX_VALUE ? "∞" : maxPointSpent); - holders.register("point-spent", inv.getPlayerData().getPointsSpent(inv.getSkillTree())); - holders.register("skill-tree-points", inv.getPlayerData().getSkillTreePoints(inv.getSkillTree().getId())); - holders.register("global-points", inv.getPlayerData().getSkillTreePoints("global")); + holders.register("point-spent", inv.playerData.getPointsSpent(inv.getSkillTree())); + holders.register("skill-tree-points", inv.playerData.getSkillTreePoints(inv.getSkillTree().getId())); + holders.register("global-points", inv.playerData.getSkillTreePoints("global")); return holders; } + + @Override + public void onClick(@NotNull SkillTreeInventory inv, @NotNull InventoryClickEvent event) { + if (event.getClick() != ClickType.LEFT) return; + + final PersistentDataContainer container = event.getCurrentItem().getItemMeta().getPersistentDataContainer(); + final int x = container.get(new NamespacedKey(MMOCore.plugin, "coordinates.x"), PersistentDataType.INTEGER); + final int y = container.get(new NamespacedKey(MMOCore.plugin, "coordinates.y"), PersistentDataType.INTEGER); + if (!inv.skillTree.isNode(new IntegerCoordinates(x, y))) return; + + // Maximum amount of skill points spent in node + final SkillTreeNode node = inv.skillTree.getNode(new IntegerCoordinates(x, y)); + if (inv.playerData.getPointsSpent(inv.skillTree) >= inv.skillTree.getMaxPointSpent()) { + ConfigMessage.fromKey("max-points-reached").send(inv.playerData); + MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(inv.getPlayer()); + return; + } + + switch (inv.playerData.canIncrementNodeLevel(node)) { + case SUCCESS: { + inv.playerData.incrementNodeLevel(node); + ConfigMessage.fromKey("upgrade-skill-node", "skill-node", node.getName(), "level", inv.playerData.getNodeLevel(node)).send(inv.playerData); + MMOCore.plugin.soundManager.getSound(SoundEvent.LEVEL_SKILL_TREE_NODE).playTo(inv.getPlayer()); + inv.open(); + break; + } + + case PERMISSION_DENIED: { + ConfigMessage.fromKey("missing-skill-node-permission").send(inv.playerData); + MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(inv.getPlayer()); + break; + } + + case LOCKED_NODE: { + ConfigMessage.fromKey("locked-node").send(inv.playerData); + MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(inv.getPlayer()); + break; + } + + case MAX_LEVEL_REACHED: { + ConfigMessage.fromKey("skill-node-max-level-hit").send(inv.playerData); + MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(inv.getPlayer()); + break; + } + + case NOT_ENOUGH_POINTS: { + ConfigMessage.fromKey("not-enough-skill-tree-points", "point", node.getPointConsumption()).send(inv.playerData); + MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(inv.getPlayer()); + break; + } + } + } } - public class SkillTreeInventory extends GeneratedInventory { + private final int width, height; + private final int maxTreeListPage; + private final List skillTrees; + private final List slots; + private final PlayerData playerData; + + @NotNull + private SkillTree skillTree; + private int treeListPage; private int x, y; //width and height correspond to the the size of the 'board' representing the skill tree private int minSlot, maxSlot; - private final int width, height; - private int treeListPage; - private final int maxTreeListPage; - private final List skillTrees; - @NotNull - private SkillTree skillTree; - private final List slots; public SkillTreeInventory(PlayerData playerData, EditableInventory editable, SkillTree skillTree) { - super(playerData, editable); + super(new Navigator(playerData.getMMOPlayerData()), editable); + this.playerData = playerData; skillTrees = playerData.getProfess().getSkillTrees(); this.skillTree = skillTree == null ? skillTrees.get(0) : skillTree; if (skillTree == null) @@ -381,6 +519,9 @@ public class SkillTreeViewer extends EditableInventory { return maxTreeListPage; } + public PlayerData getPlayerData() { + return playerData; + } public Icon getIcon(IntegerCoordinates coordinates) { if (skillTree.isNode(coordinates)) { @@ -412,15 +553,16 @@ public class SkillTreeViewer extends EditableInventory { } } + @NotNull @Override - public String calculateName() { - return getEditable().getName().replace("{skill-tree-name}", skillTree.getName()).replace("{skill-tree-id}", skillTree.getId()); + public String getRawName() { + return guiName.replace("{skill-tree-name}", skillTree.getName()).replace("{skill-tree-id}", skillTree.getId()); } public IntegerCoordinates getCoordinates(int n) { int slot = slots.get(n); - int deltaX = (slot - getMinSlot()) % 9; - int deltaY = (slot - getMinSlot()) / 9; + int deltaX = (slot - minSlot) % 9; + int deltaY = (slot - minSlot) / 9; IntegerCoordinates coordinates = new IntegerCoordinates(getX() + deltaX, getY() + deltaY); return coordinates; } @@ -429,7 +571,6 @@ public class SkillTreeViewer extends EditableInventory { return getSkillTree().getNode(getCoordinates(n)); } - public SkillTree getSkillTree() { return skillTree; } @@ -437,123 +578,5 @@ public class SkillTreeViewer extends EditableInventory { public int getMinSlot() { return minSlot; } - - @Override - public void whenClicked(InventoryClickContext event, InventoryItem item) { - - - if (item.getFunction().equals("next-tree-list-page")) { - treeListPage++; - open(); - } - if (item.getFunction().equals("up")) { - y -= MMOCore.plugin.configManager.skillTreeScrollStepY; - open(); - - } - if (item.getFunction().equals("right")) { - x += MMOCore.plugin.configManager.skillTreeScrollStepX; - open(); - } - if (item.getFunction().equals("down")) { - y += MMOCore.plugin.configManager.skillTreeScrollStepY; - open(); - } - if (item.getFunction().equals("left")) { - x -= MMOCore.plugin.configManager.skillTreeScrollStepX; - open(); - } - - - if (item.getFunction().equals("previous-tree-list-page")) { - treeListPage--; - open(); - } - if (item.getFunction().equals("reallocation")) { - int spent = playerData.getPointsSpent(skillTree); - if (spent < 1) { - ConfigMessage.fromKey("no-skill-tree-points-spent").send(player); - MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(getPlayer()); - return; - } - - if (getPlayerData().getSkillTreeReallocationPoints() <= 0) { - ConfigMessage.fromKey("not-skill-tree-reallocation-point").send(player); - MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(getPlayer()); - return; - } else { - int reallocated = playerData.getPointsSpent(skillTree); - //We remove all the nodeStates progress - playerData.giveSkillTreePoints(skillTree.getId(), reallocated); - playerData.giveSkillTreeReallocationPoints(-1); - playerData.resetSkillTree(skillTree); - skillTree.setupNodeStates(playerData); - ConfigMessage.fromKey("reallocated-points", "points", "" + playerData.getSkillTreePoints(skillTree.getId()), "skill-tree", skillTree.getName()).send(player); - MMOCore.plugin.soundManager.getSound(SoundEvent.RESET_SKILL_TREE).playTo(player); - open(); - return; - - } - } - - if (item.getFunction().equals("skill-tree")) { - String id = event.getClickedItem().getItemMeta().getPersistentDataContainer().get( - new NamespacedKey(MMOCore.plugin, "skill-tree-id"), PersistentDataType.STRING); - MMOCore.plugin.soundManager.getSound(SoundEvent.CHANGE_SKILL_TREE).playTo(player); - skillTree = MMOCore.plugin.skillTreeManager.get(id); - open(); - return; - } - - if (item.getFunction().equals("skill-tree-node") && event.getClickType() == ClickType.LEFT) { - - final PersistentDataContainer container = event.getClickedItem().getItemMeta().getPersistentDataContainer(); - final int x = container.get(new NamespacedKey(MMOCore.plugin, "coordinates.x"), PersistentDataType.INTEGER); - final int y = container.get(new NamespacedKey(MMOCore.plugin, "coordinates.y"), PersistentDataType.INTEGER); - if (!skillTree.isNode(new IntegerCoordinates(x, y))) return; - - // Maximum amount of skill points spent in node - final SkillTreeNode node = skillTree.getNode(new IntegerCoordinates(x, y)); - if (playerData.getPointsSpent(skillTree) >= skillTree.getMaxPointSpent()) { - ConfigMessage.fromKey("max-points-reached").send(player); - MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(getPlayer()); - return; - } - - switch (playerData.canIncrementNodeLevel(node)) { - case SUCCESS: { - playerData.incrementNodeLevel(node); - ConfigMessage.fromKey("upgrade-skill-node", "skill-node", node.getName(), "level", "" + playerData.getNodeLevel(node)).send(player); - MMOCore.plugin.soundManager.getSound(SoundEvent.LEVEL_SKILL_TREE_NODE).playTo(getPlayer()); - open(); - break; - } - - case PERMISSION_DENIED: { - ConfigMessage.fromKey("missing-skill-node-permission").send(player); - MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(getPlayer()); - break; - } - - case LOCKED_NODE: { - ConfigMessage.fromKey("locked-node").send(player); - MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(getPlayer()); - break; - } - - case MAX_LEVEL_REACHED: { - ConfigMessage.fromKey("skill-node-max-level-hit").send(player); - MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(getPlayer()); - break; - } - - case NOT_ENOUGH_POINTS: { - ConfigMessage.fromKey("not-enough-skill-tree-points", "point", "" + node.getPointConsumption()).send(player); - MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(getPlayer()); - break; - } - } - } - } } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendList.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendList.java index 67886b05..70ab788d 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendList.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendList.java @@ -1,5 +1,14 @@ package net.Indyuce.mmocore.gui.social.friend; +import io.lumine.mythic.lib.gui.Navigator; +import io.lumine.mythic.lib.gui.editable.EditableInventory; +import io.lumine.mythic.lib.gui.editable.GeneratedInventory; +import io.lumine.mythic.lib.gui.editable.item.PhysicalItem; +import io.lumine.mythic.lib.gui.editable.item.SimpleItem; +import io.lumine.mythic.lib.gui.editable.item.builtin.NextPageItem; +import io.lumine.mythic.lib.gui.editable.item.builtin.PreviousPageItem; +import io.lumine.mythic.lib.gui.editable.placeholder.ErrorPlaceholders; +import io.lumine.mythic.lib.gui.editable.placeholder.Placeholders; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.player.PlayerActivity; @@ -8,13 +17,6 @@ import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.api.util.input.ChatInput; import net.Indyuce.mmocore.api.util.input.PlayerInput.InputType; import net.Indyuce.mmocore.api.util.math.format.DelayFormat; -import net.Indyuce.mmocore.gui.api.EditableInventory; -import net.Indyuce.mmocore.gui.api.GeneratedInventory; -import net.Indyuce.mmocore.gui.api.InventoryClickContext; -import net.Indyuce.mmocore.gui.api.item.ErrorPlaceholders; -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 net.Indyuce.mmocore.manager.InventoryManager; import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; @@ -24,11 +26,13 @@ import org.bukkit.Sound; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; +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 org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.UUID; @@ -40,37 +44,20 @@ public class EditableFriendList extends EditableInventory { } @Override - public InventoryItem load(String function, ConfigurationSection config) { + public @Nullable io.lumine.mythic.lib.gui.editable.item.InventoryItem resolveItem(@NotNull String function, @NotNull ConfigurationSection config) { + if (function.equals("friend")) return new FriendItem(config); + if (function.equals("previous")) return new PreviousPageItem<>(config); + if (function.equals("next")) return new NextPageItem<>(config); + if (function.equals("request")) return new RequestItem(config); - if (function.equals("friend")) - return new FriendItem(config); - - if (function.equals("previous")) - return new SimplePlaceholderItem(config) { - - @Override - public boolean canDisplay(FriendListInventory inv) { - return inv.page > 0; - } - }; - - if (function.equals("next")) - return new SimplePlaceholderItem(config) { - - @Override - public boolean canDisplay(FriendListInventory inv) { - return inv.getEditable().getByFunction("friend").getSlots().size() * inv.page < inv.getPlayerData().getFriends().size(); - } - }; - - return new SimplePlaceholderItem(config); + return null; } public GeneratedInventory newInventory(PlayerData data) { - return new FriendListInventory(data, this); + return new FriendListInventory(data); } - class OfflineFriendItem extends InventoryItem { + class OfflineFriendItem extends PhysicalItem { public OfflineFriendItem(FriendItem parent, ConfigurationSection config) { super(parent, config); } @@ -82,12 +69,12 @@ public class EditableFriendList extends EditableInventory { @NotNull @Override - public OfflinePlayer getEffectivePlayer(GeneratedInventory inv, int n) { - return Bukkit.getOfflinePlayer(inv.getPlayerData().getFriends().get(n)); + public OfflinePlayer getEffectivePlayer(FriendListInventory inv, int n) { + return Bukkit.getOfflinePlayer(inv.playerData.getFriends().get(n)); } @Override - public Placeholders getPlaceholders(GeneratedInventory inv, int n) { + public @NotNull Placeholders getPlaceholders(FriendListInventory inv, int n) { OfflinePlayer friend = getEffectivePlayer(inv, n); if (MMOCoreUtils.isInvalid(friend)) return new ErrorPlaceholders(); @@ -98,7 +85,7 @@ public class EditableFriendList extends EditableInventory { } } - class OnlineFriendItem extends SimplePlaceholderItem { + class OnlineFriendItem extends SimpleItem { public OnlineFriendItem(FriendItem parent, ConfigurationSection config) { super(parent, config); } @@ -110,13 +97,12 @@ public class EditableFriendList extends EditableInventory { @NotNull @Override - public OfflinePlayer getEffectivePlayer(GeneratedInventory inv, int n) { - return Bukkit.getOfflinePlayer(inv.getPlayerData().getFriends().get(n)); + public OfflinePlayer getEffectivePlayer(FriendListInventory inv, int n) { + return Bukkit.getOfflinePlayer(inv.playerData.getFriends().get(n)); } - @Deprecated @Override - public Placeholders getPlaceholders(GeneratedInventory inv, int n) { + public @NotNull Placeholders getPlaceholders(FriendListInventory inv, int n) { final PlayerData friendData = PlayerData.get(getEffectivePlayer(inv, n)); Placeholders holders = new Placeholders(); @@ -129,7 +115,53 @@ public class EditableFriendList extends EditableInventory { } } - class FriendItem extends SimplePlaceholderItem { + class RequestItem extends SimpleItem { + public RequestItem(ConfigurationSection config) { + super(config); + } + + @Override + public void onClick(@NotNull FriendListInventory inv, @NotNull InventoryClickEvent event) { + long remaining = inv.playerData.getActivityTimeOut(PlayerActivity.FRIEND_REQUEST); + if (remaining > 0) { + ConfigMessage.fromKey("friend-request-cooldown", "cooldown", new DelayFormat().format(remaining)) + .send(inv.playerData); + return; + } + + new ChatInput(inv.getPlayer(), InputType.FRIEND_REQUEST, inv, input -> { + Player target = Bukkit.getPlayer(input); + if (target == null) { + ConfigMessage.fromKey("not-online-player", "player", input).send(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); + inv.open(); + return; + } + + if (inv.playerData.hasFriend(target.getUniqueId())) { + ConfigMessage.fromKey("already-friends", "player", target.getName()).send(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); + inv.open(); + return; + } + + if (inv.playerData.getUniqueId().equals(target.getUniqueId())) { + ConfigMessage.fromKey("cant-request-to-yourself").send(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); + inv.open(); + return; + } + + inv.playerData.sendFriendRequest(PlayerData.get(target)); + ConfigMessage.fromKey("sent-friend-request", "player", target.getName()).send(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); + inv.open(); + }); + + } + } + + class FriendItem extends SimpleItem { private final OnlineFriendItem online; private final OfflineFriendItem offline; @@ -144,12 +176,12 @@ public class EditableFriendList extends EditableInventory { } @Override - public ItemStack display(GeneratedInventory inv, int n) { - if (inv.getPlayerData().getFriends().size() <= n) - return super.display(inv, n); + public ItemStack getDisplayedItem(FriendListInventory inv, int n) { + if (inv.playerData.getFriends().size() <= n) + return super.getDisplayedItem(inv, n); - final OfflinePlayer friend = Bukkit.getOfflinePlayer(inv.getPlayerData().getFriends().get(n)); - ItemStack disp = (friend.isOnline() ? online : offline).display(inv, n); + final OfflinePlayer friend = Bukkit.getOfflinePlayer(inv.playerData.getFriends().get(n)); + ItemStack disp = (friend.isOnline() ? online : offline).getDisplayedItem(inv, n); ItemMeta meta = disp.getItemMeta(); meta.getPersistentDataContainer().set(UUID_NAMESPACEDKEY, PersistentDataType.STRING, friend.getUniqueId().toString()); if (meta instanceof SkullMeta) @@ -168,83 +200,27 @@ public class EditableFriendList extends EditableInventory { } @Override - public boolean canDisplay(GeneratedInventory inv) { - return true; + public void onClick(@NotNull FriendListInventory inv, @NotNull InventoryClickEvent event) { + if (event.getClick() != ClickType.RIGHT) return; + + String tag = event.getCurrentItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING); + if (tag == null || tag.isEmpty()) return; + + InventoryManager.FRIEND_REMOVAL.newInventory(inv, Bukkit.getOfflinePlayer(UUID.fromString(tag))).open(); } } class FriendListInventory extends GeneratedInventory { - private int page; + private final PlayerData playerData; - public FriendListInventory(PlayerData playerData, EditableInventory editable) { - super(playerData, editable); + public FriendListInventory(PlayerData playerData) { + super(new Navigator(playerData.getMMOPlayerData()), EditableFriendList.this); + + this.playerData = playerData; } - @Override - public String calculateName() { - return getName(); - } - - @Override - public void whenClicked(InventoryClickContext context, InventoryItem item) { - if (item.getFunction().equals("previous")) { - page--; - open(); - return; - } - - if (item.getFunction().equals("next")) { - page++; - open(); - return; - } - - if (item.getFunction().equals("request")) { - - long remaining = playerData.getActivityTimeOut(PlayerActivity.FRIEND_REQUEST); - if (remaining > 0) { - ConfigMessage.fromKey("friend-request-cooldown", "cooldown", new DelayFormat().format(remaining)) - .send(player); - return; - } - - new ChatInput(player, InputType.FRIEND_REQUEST, context.getInventoryHolder(), input -> { - Player target = Bukkit.getPlayer(input); - if (target == null) { - ConfigMessage.fromKey("not-online-player", "player", input).send(player); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); - open(); - return; - } - - if (playerData.hasFriend(target.getUniqueId())) { - ConfigMessage.fromKey("already-friends", "player", target.getName()).send(player); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); - open(); - return; - } - - if (playerData.getUniqueId().equals(target.getUniqueId())) { - ConfigMessage.fromKey("cant-request-to-yourself").send(player); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); - open(); - return; - } - - playerData.sendFriendRequest(PlayerData.get(target)); - ConfigMessage.fromKey("sent-friend-request", "player", target.getName()).send(player); - player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); - open(); - }); - } - - if (item.getFunction().equals("friend") && context.getClickType() == ClickType.RIGHT) { - String tag = context.getClickedItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING); - if (tag == null || tag.isEmpty()) - return; - - InventoryManager.FRIEND_REMOVAL.newInventory(playerData, Bukkit.getOfflinePlayer(UUID.fromString(tag)), this).open(); - } + public PlayerData getPlayerData() { + return playerData; } } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendRemoval.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendRemoval.java index 2e995613..5dc954ab 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendRemoval.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendRemoval.java @@ -1,68 +1,74 @@ package net.Indyuce.mmocore.gui.social.friend; +import io.lumine.mythic.lib.gui.editable.EditableInventory; +import io.lumine.mythic.lib.gui.editable.GeneratedInventory; +import io.lumine.mythic.lib.gui.editable.item.InventoryItem; +import io.lumine.mythic.lib.gui.editable.item.SimpleItem; +import io.lumine.mythic.lib.gui.editable.item.builtin.GoBackItem; +import io.lumine.mythic.lib.gui.editable.placeholder.Placeholders; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.player.PlayerData; -import net.Indyuce.mmocore.gui.api.EditableInventory; -import net.Indyuce.mmocore.gui.api.GeneratedInventory; -import net.Indyuce.mmocore.gui.api.InventoryClickContext; -import net.Indyuce.mmocore.gui.api.item.InventoryItem; -import net.Indyuce.mmocore.gui.api.item.Placeholders; import net.Indyuce.mmocore.manager.data.OfflinePlayerData; import org.bukkit.OfflinePlayer; import org.bukkit.Sound; import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class EditableFriendRemoval extends EditableInventory { - public EditableFriendRemoval() { - super("friend-removal"); - } - - @Override - public InventoryItem load(String function, ConfigurationSection config) { - - return new InventoryItem(config) { - - @Override - public Placeholders getPlaceholders(ClassConfirmationInventory inv, int n) { - Placeholders holders = new Placeholders(); - holders.register("name", inv.friend.getName()); - return holders; - } - }; + public EditableFriendRemoval() { + super("friend-removal"); } - public GeneratedInventory newInventory(PlayerData data, OfflinePlayer friend, GeneratedInventory last) { - return new ClassConfirmationInventory(data, this, friend, last); - } - public class ClassConfirmationInventory extends GeneratedInventory { - private final OfflinePlayer friend; - private final GeneratedInventory last; + @Override + public @Nullable InventoryItem resolveItem(@NotNull String function, @NotNull ConfigurationSection config) { + if (function.equalsIgnoreCase("yes")) return new YesItem(config); + if (function.equalsIgnoreCase("back")) return new GoBackItem<>(config); - public ClassConfirmationInventory(PlayerData playerData, EditableInventory editable, OfflinePlayer friend, GeneratedInventory last) { - super(playerData, editable); + return null; + } - this.friend = friend; - this.last = last; - } + public Placeholders getGlobalPlaceholders(ClassConfirmationInventory inv) { + Placeholders holders = new Placeholders(); + holders.register("name", inv.friend.getName()); + return holders; + } - @Override - public void whenClicked(InventoryClickContext context, InventoryItem item) { - if (item.getFunction().equals("yes")) { - playerData.removeFriend(friend.getUniqueId()); - OfflinePlayerData.get(friend.getUniqueId()).removeFriend(playerData.getUniqueId()); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); - ConfigMessage.fromKey("no-longer-friends", "unfriend", friend.getName()).send(player); - last.open(); - } + public class YesItem extends SimpleItem { + public YesItem(ConfigurationSection config) { + super(config); + } - if (item.getFunction().equals("back")) - last.open(); - } + @Override + public @NotNull Placeholders getPlaceholders(ClassConfirmationInventory inv, int n) { + return getGlobalPlaceholders(inv); + } - @Override - public String calculateName() { - return getName(); - } - } + @Override + public void onClick(@NotNull ClassConfirmationInventory inv, @NotNull InventoryClickEvent event) { + inv.playerData.removeFriend(inv.friend.getUniqueId()); + OfflinePlayerData.get(inv.friend.getUniqueId()).removeFriend(inv.playerData.getUniqueId()); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); + ConfigMessage.fromKey("no-longer-friends", "unfriend", inv.friend.getName()).send(inv.playerData); + inv.getNavigator().popOpen(); + } + } + + public ClassConfirmationInventory newInventory(EditableFriendList.FriendListInventory inventory, OfflinePlayer friend) { + return new ClassConfirmationInventory(inventory, friend); + } + + public class ClassConfirmationInventory extends GeneratedInventory { + private final OfflinePlayer friend; + private final PlayerData playerData; + + public ClassConfirmationInventory(EditableFriendList.FriendListInventory inventory, OfflinePlayer friend) { + super(inventory.getNavigator(), EditableFriendRemoval.this); + + this.playerData = inventory.getPlayerData(); + this.friend = friend; + } + } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildAdmin.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildAdmin.java index 3c8a9b3c..bd45f57a 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildAdmin.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildAdmin.java @@ -1,17 +1,18 @@ package net.Indyuce.mmocore.gui.social.guild; +import io.lumine.mythic.lib.gui.Navigator; +import io.lumine.mythic.lib.gui.editable.EditableInventory; +import io.lumine.mythic.lib.gui.editable.GeneratedInventory; +import io.lumine.mythic.lib.gui.editable.item.InventoryItem; +import io.lumine.mythic.lib.gui.editable.item.PhysicalItem; +import io.lumine.mythic.lib.gui.editable.item.SimpleItem; +import io.lumine.mythic.lib.gui.editable.placeholder.Placeholders; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.util.input.ChatInput; import net.Indyuce.mmocore.api.util.input.PlayerInput; import net.Indyuce.mmocore.api.util.math.format.DelayFormat; -import net.Indyuce.mmocore.gui.api.EditableInventory; -import net.Indyuce.mmocore.gui.api.GeneratedInventory; -import net.Indyuce.mmocore.gui.api.InventoryClickContext; -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.NamespacedKey; @@ -19,184 +20,201 @@ import org.bukkit.OfflinePlayer; import org.bukkit.Sound; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; +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 org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.UUID; +@Deprecated public class EditableGuildAdmin extends EditableInventory { - private static final NamespacedKey UUID_NAMESPACEDKEY = new NamespacedKey(MMOCore.plugin, "Uuid"); + private static final NamespacedKey UUID_NAMESPACEDKEY = new NamespacedKey(MMOCore.plugin, "Uuid"); - public EditableGuildAdmin() { - super("guild-admin"); - } + public EditableGuildAdmin() { + super("guild-admin"); + } - @Override - public InventoryItem load(String function, ConfigurationSection config) { - return function.equals("member") ? new MemberItem(config) : new SimplePlaceholderItem(config); - } + @Override + public @Nullable InventoryItem resolveItem(@NotNull String function, @NotNull ConfigurationSection config) { + if (function.equalsIgnoreCase("member")) return new MemberItem(config); + if (function.equalsIgnoreCase("leave")) return new LeaveItem(config); + if (function.equalsIgnoreCase("invite")) return new InviteItem(config); + return null; + } - public GeneratedInventory newInventory(PlayerData data) { - return new GuildViewInventory(data, this); - } + public GeneratedInventory newInventory(PlayerData data) { + return new GuildViewInventory(data); + } - public static class MemberDisplayItem extends InventoryItem { - public MemberDisplayItem(MemberItem memberItem, ConfigurationSection config) { - super(memberItem, config); - } + public class InviteItem extends SimpleItem { + public InviteItem(ConfigurationSection config) { + super(config); + } - @Override - public boolean hasDifferentDisplay() { - return true; - } + @Override + public void onClick(@NotNull GuildViewInventory inv, @NotNull InventoryClickEvent event) { + if (inv.playerData.getGuild().countMembers() >= inv.max) { + ConfigMessage.fromKey("guild-is-full").send(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); + return; + } - @Override - public Placeholders getPlaceholders(GuildViewInventory inv, int n) { - PlayerData member = PlayerData.get(inv.members.get(n)); + new ChatInput(inv.getPlayer(), PlayerInput.InputType.GUILD_INVITE, inv, input -> { + Player target = Bukkit.getPlayer(input); + if (target == null) { + ConfigMessage.fromKey("not-online-player", "player", input).send(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); + inv.open(); + return; + } - Placeholders holders = new Placeholders(); + long remaining = inv.playerData.getGuild().getLastInvite(target) + 60 * 2 * 1000 - System.currentTimeMillis(); + if (remaining > 0) { + ConfigMessage.fromKey("guild-invite-cooldown", "player", target.getName(), "cooldown", + new DelayFormat().format(remaining)).send(inv.playerData); + inv.open(); + return; + } - 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; - } + PlayerData targetData = PlayerData.get(target); + if (inv.playerData.getGuild().hasMember(target.getUniqueId())) { + ConfigMessage.fromKey("already-in-guild", "player", target.getName()).send(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); + inv.open(); + return; + } - @Override - public ItemStack display(GuildViewInventory inv, int n) { - UUID uuid = inv.members.get(n); - OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(uuid); + inv.playerData.getGuild().sendGuildInvite(inv.playerData, targetData); + ConfigMessage.fromKey("sent-guild-invite", "player", target.getName()).send(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); + inv.open(); + }); + } + } - ItemStack disp = super.display(inv, n); - ItemMeta meta = disp.getItemMeta(); - meta.getPersistentDataContainer().set(UUID_NAMESPACEDKEY, PersistentDataType.STRING, uuid.toString()); + public class LeaveItem extends SimpleItem { + public LeaveItem(ConfigurationSection config) { + super(config); + } - if (meta instanceof SkullMeta && offlinePlayer != null) - inv.asyncUpdate(this, n, disp, current -> { - ((SkullMeta) meta).setOwningPlayer(offlinePlayer); - current.setItemMeta(meta); - }); + @Override + public void onClick(@NotNull GuildViewInventory inv, @NotNull InventoryClickEvent event) { + inv.playerData.getGuild().removeMember(inv.playerData.getUniqueId()); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); + inv.getPlayer().closeInventory(); + } + } - disp.setItemMeta(meta); - return disp; - } - } + public static class MemberDisplayItem extends PhysicalItem { + public MemberDisplayItem(MemberItem memberItem, ConfigurationSection config) { + super(memberItem, config); + } - public static class MemberItem extends SimplePlaceholderItem { - private final InventoryItem empty; - private final MemberDisplayItem member; + @Override + public boolean hasDifferentDisplay() { + return true; + } - public MemberItem(ConfigurationSection config) { - super(config); + @Override + public Placeholders getPlaceholders(GuildViewInventory inv, int n) { + PlayerData member = PlayerData.get(inv.members.get(n)); - Validate.notNull(config.contains("empty"), "Could not load empty config"); - Validate.notNull(config.contains("member"), "Could not load member config"); + Placeholders holders = new Placeholders(); - empty = new SimplePlaceholderItem(config.getConfigurationSection("empty")); - member = new MemberDisplayItem(this, config.getConfigurationSection("member")); - } + 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 ItemStack display(GuildViewInventory inv, int n) { - return inv.getPlayerData().getGuild().countMembers() > n ? member.display(inv, n) : empty.display(inv, n); - } + @Override + public ItemStack getDisplayedItem(GuildViewInventory inv, int n) { + UUID uuid = inv.members.get(n); + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(uuid); - @Override - public boolean hasDifferentDisplay() { - return true; - } - } + ItemStack disp = super.getDisplayedItem(inv, n); + ItemMeta meta = disp.getItemMeta(); + meta.getPersistentDataContainer().set(UUID_NAMESPACEDKEY, PersistentDataType.STRING, uuid.toString()); - public class GuildViewInventory extends GeneratedInventory { - private final int max; + if (meta instanceof SkullMeta && offlinePlayer != null) + inv.asyncUpdate(this, n, disp, current -> { + ((SkullMeta) meta).setOwningPlayer(offlinePlayer); + current.setItemMeta(meta); + }); - private List members; + disp.setItemMeta(meta); + return disp; + } + } - public GuildViewInventory(PlayerData playerData, EditableInventory editable) { - super(playerData, editable); + public static class MemberItem extends InventoryItem { + private final InventoryItem empty; + private final MemberDisplayItem member; - max = editable.getByFunction("member").getSlots().size(); - } + public MemberItem(ConfigurationSection config) { + super(config); - @Override - public void open() { - members = playerData.getGuild().listMembers(); - super.open(); - } + Validate.notNull(config.contains("empty"), "Could not load empty config"); + Validate.notNull(config.contains("member"), "Could not load member config"); - @Override - public String calculateName() { - return getName().replace("{max}", "" + max).replace("{players}", "" + getPlayerData().getGuild().countMembers()); - } + empty = new SimpleItem<>(config.getConfigurationSection("empty")); + member = new MemberDisplayItem(this, config.getConfigurationSection("member")); + } - @Override - public void whenClicked(InventoryClickContext context, InventoryItem item) { + @Override + public ItemStack getDisplayedItem(GuildViewInventory inv, int n) { + return inv.playerData.getGuild().countMembers() > n ? member.getDisplayedItem(inv, n) : empty.getDisplayedItem(inv, n); + } - if (item.getFunction().equals("leave")) { - playerData.getGuild().removeMember(playerData.getUniqueId()); - player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); - player.closeInventory(); - return; - } + @Override + public boolean hasDifferentDisplay() { + return true; + } - if (item.getFunction().equals("invite")) { + @Override + public void onClick(@NotNull GuildViewInventory inv, @NotNull InventoryClickEvent event) { + if (!inv.isGuildOwner) return; - if (playerData.getGuild().countMembers() >= max) { - ConfigMessage.fromKey("guild-is-full").send(player); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); - return; - } + OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(event.getCurrentItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING))); + if (target.equals(inv.getPlayer())) return; - new ChatInput(player, PlayerInput.InputType.GUILD_INVITE, context.getInventoryHolder(), input -> { - Player target = Bukkit.getPlayer(input); - if (target == null) { - ConfigMessage.fromKey("not-online-player", "player", input).send(player); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); - open(); - return; - } + inv.playerData.getGuild().removeMember(target.getUniqueId()); + ConfigMessage.fromKey("kick-from-guild", "player", target.getName()).send(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); + } + } - long remaining = playerData.getGuild().getLastInvite(target) + 60 * 2 * 1000 - System.currentTimeMillis(); - if (remaining > 0) { - ConfigMessage.fromKey("guild-invite-cooldown", "player", target.getName(), "cooldown", - new DelayFormat().format(remaining)).send(player); - open(); - return; - } + public class GuildViewInventory extends GeneratedInventory { + private final int max; + private final PlayerData playerData; + private final boolean isGuildOwner; - PlayerData targetData = PlayerData.get(target); - if (playerData.getGuild().hasMember(target.getUniqueId())) { - ConfigMessage.fromKey("already-in-guild", "player", target.getName()).send(player); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); - open(); - return; - } + private List members; - playerData.getGuild().sendGuildInvite(playerData, targetData); - ConfigMessage.fromKey("sent-guild-invite", "player", target.getName()).send(player); - player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); - open(); - }); - } + public GuildViewInventory(PlayerData playerData) { + super(new Navigator(playerData.getMMOPlayerData()), EditableGuildAdmin.this); - if (item.getFunction().equals("member") && context.getClickType() == ClickType.RIGHT) { - if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId())) - return; + max = getEditable().getByFunction("member").getSlots().size(); + this.playerData = playerData; + isGuildOwner = playerData.getGuild().getOwner().equals(playerData.getUniqueId()); + } - OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(context.getClickedItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING))); - if (target.equals(player)) - return; + @Override + public void open() { + members = playerData.getGuild().listMembers(); + super.open(); + } - playerData.getGuild().removeMember(target.getUniqueId()); - ConfigMessage.fromKey("kick-from-guild", "player", target.getName()).send(player); - player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); - } - } - } + @Override + public @NotNull String getRawName() { + return guiName.replace("{max}", String.valueOf(max)).replace("{players}", String.valueOf(playerData.getGuild().countMembers())); + } + } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildCreation.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildCreation.java index eef891e2..15f397fd 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildCreation.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildCreation.java @@ -1,91 +1,95 @@ package net.Indyuce.mmocore.gui.social.guild; +import io.lumine.mythic.lib.gui.Navigator; +import io.lumine.mythic.lib.gui.editable.EditableInventory; +import io.lumine.mythic.lib.gui.editable.GeneratedInventory; +import io.lumine.mythic.lib.gui.editable.item.InventoryItem; +import io.lumine.mythic.lib.gui.editable.item.SimpleItem; +import io.lumine.mythic.lib.gui.editable.item.builtin.CloseInventoryItem; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.util.input.ChatInput; import net.Indyuce.mmocore.api.util.input.PlayerInput; -import net.Indyuce.mmocore.gui.api.EditableInventory; -import net.Indyuce.mmocore.gui.api.GeneratedInventory; -import net.Indyuce.mmocore.gui.api.InventoryClickContext; -import net.Indyuce.mmocore.gui.api.item.InventoryItem; -import net.Indyuce.mmocore.gui.api.item.SimplePlaceholderItem; import net.Indyuce.mmocore.manager.InventoryManager; import net.Indyuce.mmocore.manager.data.GuildDataManager; import org.bukkit.Sound; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class EditableGuildCreation extends EditableInventory { - public EditableGuildCreation() { - super("guild-creation"); - } - - @Override - public InventoryItem load(String function, ConfigurationSection config) { - return new SimplePlaceholderItem(config); + public EditableGuildCreation() { + super("guild-creation"); } - public GeneratedInventory newInventory(PlayerData data) { - return new GuildCreationInventory(data, this); - } + @Override + public @Nullable InventoryItem resolveItem(@NotNull String function, @NotNull ConfigurationSection config) { + if (function.equalsIgnoreCase("create")) return new CreateItem(config); + if (function.equalsIgnoreCase("back")) return new CloseInventoryItem<>(config); - public class GuildCreationInventory extends GeneratedInventory { - public GuildCreationInventory(PlayerData playerData, EditableInventory editable) { - super(playerData, editable); - } + return null; + } - @Override - public void whenClicked(InventoryClickContext context, InventoryItem item) { - - if (item.getFunction().equals("create")) { - new ChatInput(player, PlayerInput.InputType.GUILD_CREATION_TAG, context.getInventoryHolder(), input -> { - if(MMOCore.plugin.nativeGuildManager.getConfig().shouldUppercaseTags()) - input = input.toUpperCase(); - - if(check(player, input, MMOCore.plugin.nativeGuildManager.getConfig().getTagRules())) { - String tag = input; + public class CreateItem extends SimpleItem { + public CreateItem(ConfigurationSection config) { + super(config); + } - new ChatInput(player, PlayerInput.InputType.GUILD_CREATION_NAME, context.getInventoryHolder(), name -> { - if(check(player, name, MMOCore.plugin.nativeGuildManager.getConfig().getNameRules())) { - MMOCore.plugin.nativeGuildManager.newRegisteredGuild(playerData.getUniqueId(), name, tag); - MMOCore.plugin.nativeGuildManager.getGuild(tag.toLowerCase()).addMember(playerData.getUniqueId()); + @Override + public void onClick(@NotNull GuildCreationInventory inv, @NotNull InventoryClickEvent event) { + new ChatInput(inv.getPlayer(), PlayerInput.InputType.GUILD_CREATION_TAG, inv, input -> { + if (MMOCore.plugin.nativeGuildManager.getConfig().shouldUppercaseTags()) + input = input.toUpperCase(); - InventoryManager.GUILD_VIEW.newInventory(playerData).open(); - player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); - } - }); - } - }); - - return; - } + if (check(inv.getPlayer(), input, MMOCore.plugin.nativeGuildManager.getConfig().getTagRules())) { + String tag = input; - if (item.getFunction().equals("back")) - player.closeInventory(); - } + new ChatInput(inv.getPlayer(), PlayerInput.InputType.GUILD_CREATION_NAME, inv, name -> { + if (check(inv.getPlayer(), name, MMOCore.plugin.nativeGuildManager.getConfig().getNameRules())) { + MMOCore.plugin.nativeGuildManager.newRegisteredGuild(inv.playerData.getUniqueId(), name, tag); + MMOCore.plugin.nativeGuildManager.getGuild(tag.toLowerCase()).addMember(inv.playerData.getUniqueId()); - @Override - public String calculateName() { - return getName(); - } - } + InventoryManager.GUILD_VIEW.newInventory(inv.playerData).open(); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); + } + }); + } + }); + } + } - public boolean check(Player player, String input, GuildDataManager.GuildConfiguration.NamingRules rules) { - String reason; - - if(input.length() <= rules.getMax() && input.length() >= rules.getMin()) - if(input.matches(rules.getRegex())) - if(!MMOCore.plugin.nativeGuildManager.isRegistered(input)) - return true; - else - reason = ConfigMessage.fromKey("guild-creation.reasons.already-taken").asLine(); - else - reason = ConfigMessage.fromKey("guild-creation.reasons.invalid-characters").asLine(); - else - reason = ConfigMessage.fromKey("guild-creation.reasons.invalid-length", "min", "" + rules.getMin(), "max", "" + rules.getMax()).asLine(); - - ConfigMessage.fromKey("guild-creation.failed", "reason", reason).send(player); - return false; - } + public GuildCreationInventory newInventory(PlayerData data) { + return new GuildCreationInventory(data); + } + + public class GuildCreationInventory extends GeneratedInventory { + private final PlayerData playerData; + + public GuildCreationInventory(PlayerData playerData) { + super(new Navigator(playerData.getMMOPlayerData()), EditableGuildCreation.this); + + this.playerData = playerData; + } + } + + public boolean check(Player player, String input, GuildDataManager.GuildConfiguration.NamingRules rules) { + String reason; + + if (input.length() <= rules.getMax() && input.length() >= rules.getMin()) + if (input.matches(rules.getRegex())) + if (!MMOCore.plugin.nativeGuildManager.isRegistered(input)) + return true; + else + reason = ConfigMessage.fromKey("guild-creation.reasons.already-taken").asLine(); + else + reason = ConfigMessage.fromKey("guild-creation.reasons.invalid-characters").asLine(); + else + reason = ConfigMessage.fromKey("guild-creation.reasons.invalid-length", "min", "" + rules.getMin(), "max", "" + rules.getMax()).asLine(); + + ConfigMessage.fromKey("guild-creation.failed", "reason", reason).send(player); + return false; + } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildView.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildView.java index 95bea9e8..b373786a 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildView.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildView.java @@ -1,5 +1,14 @@ package net.Indyuce.mmocore.gui.social.guild; +import io.lumine.mythic.lib.gui.Navigator; +import io.lumine.mythic.lib.gui.editable.EditableInventory; +import io.lumine.mythic.lib.gui.editable.GeneratedInventory; +import io.lumine.mythic.lib.gui.editable.item.InventoryItem; +import io.lumine.mythic.lib.gui.editable.item.PhysicalItem; +import io.lumine.mythic.lib.gui.editable.item.SimpleItem; +import io.lumine.mythic.lib.gui.editable.item.builtin.NextPageItem; +import io.lumine.mythic.lib.gui.editable.item.builtin.PreviousPageItem; +import io.lumine.mythic.lib.gui.editable.placeholder.Placeholders; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.player.PlayerData; @@ -7,24 +16,22 @@ import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.api.util.input.ChatInput; import net.Indyuce.mmocore.api.util.input.PlayerInput; import net.Indyuce.mmocore.api.util.math.format.DelayFormat; -import net.Indyuce.mmocore.gui.api.EditableInventory; -import net.Indyuce.mmocore.gui.api.GeneratedInventory; -import net.Indyuce.mmocore.gui.api.InventoryClickContext; -import net.Indyuce.mmocore.gui.api.item.ErrorPlaceholders; -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 net.Indyuce.mmocore.manager.data.OfflinePlayerData; import org.apache.commons.lang.Validate; -import org.bukkit.*; +import org.bukkit.Bukkit; +import org.bukkit.NamespacedKey; +import org.bukkit.OfflinePlayer; +import org.bukkit.Sound; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; +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 org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.UUID; @@ -37,11 +44,104 @@ public class EditableGuildView extends EditableInventory { } @Override - public InventoryItem load(String function, ConfigurationSection config) { - return function.equals("member") ? new MemberItem(config) : (function.equals("next") || function.equals("previous") || function.equals("disband") || function.equals("invite")) ? new ConditionalItem(function, config) : new SimplePlaceholderItem(config); + public @Nullable InventoryItem resolveItem(@NotNull String function, @NotNull ConfigurationSection config) { + if (function.equalsIgnoreCase("member")) return new MemberItem(config); + if (function.equalsIgnoreCase("next")) return new NextPageItem<>(config); + if (function.equalsIgnoreCase("previous")) return new PreviousPageItem<>(config); + if (function.equalsIgnoreCase("disband")) return new DisbandItem(config); + if (function.equalsIgnoreCase("invite")) return new InviteItem(config); + if (function.equalsIgnoreCase("leave")) return new LeaveItem(config); + + return null; } - public static class MemberDisplayItem extends InventoryItem { + public class LeaveItem extends SimpleItem { + public LeaveItem(ConfigurationSection config) { + super(config); + } + + @Override + public void onClick(@NotNull GuildViewInventory inv, @NotNull InventoryClickEvent event) { + inv.playerData.getGuild().removeMember(inv.playerData.getUniqueId()); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); + inv.getPlayer().closeInventory(); + } + } + + public class InviteItem extends SimpleItem { + public InviteItem(ConfigurationSection config) { + super(config); + } + + @Override + public boolean isDisplayed(@NotNull GuildViewInventory inv) { + return inv.isGuildOwner; + } + + @Override + public void onClick(@NotNull GuildViewInventory inv, @NotNull InventoryClickEvent event) { + if (!inv.isGuildOwner) return; + + /* + * if (playerData.getGuild().getMembers().count() >= max) { + * ConfigMessage.fromKey("guild-is-full").send(inv.playerData); + * inv.getPlayer().playSound(inv.getPlayer().getLocation(), + * Sound.ENTITY_VILLAGER_NO, 1, 1); return; } + */ + + new ChatInput(inv.getPlayer(), PlayerInput.InputType.GUILD_INVITE, inv, input -> { + Player target = Bukkit.getPlayer(input); + if (target == null) { + ConfigMessage.fromKey("not-online-player", "player", input).send(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); + inv.open(); + return; + } + + long remaining = inv.playerData.getGuild().getLastInvite(target) + 60 * 2 * 1000 - System.currentTimeMillis(); + if (remaining > 0) { + ConfigMessage.fromKey("guild-invite-cooldown", "player", target.getName(), "cooldown", new DelayFormat().format(remaining)).send(inv.playerData); + inv.open(); + return; + } + + PlayerData targetData = PlayerData.get(target); + if (inv.playerData.getGuild().hasMember(targetData.getUniqueId())) { + ConfigMessage.fromKey("already-in-guild", "player", target.getName()).send(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); + inv.open(); + return; + } + + inv.playerData.getGuild().sendGuildInvite(inv.playerData, targetData); + ConfigMessage.fromKey("sent-guild-invite", "player", target.getName()).send(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); + inv.open(); + }); + } + } + + public class DisbandItem extends SimpleItem { + public DisbandItem(ConfigurationSection config) { + super(config); + } + + @Override + public void onClick(@NotNull GuildViewInventory inv, @NotNull InventoryClickEvent event) { + if (!inv.isGuildOwner) return; + + MMOCore.plugin.nativeGuildManager.unregisterGuild(inv.playerData.getGuild()); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); + inv.getPlayer().closeInventory(); + } + + @Override + public boolean isDisplayed(@NotNull GuildViewInventory inv) { + return inv.isGuildOwner; + } + } + + public static class MemberDisplayItem extends PhysicalItem { public MemberDisplayItem(MemberItem memberItem, ConfigurationSection config) { super(memberItem, config); } @@ -58,7 +158,7 @@ public class EditableGuildView extends EditableInventory { } @Override - public Placeholders getPlaceholders(GuildViewInventory inv, int n) { + public @NotNull Placeholders getPlaceholders(GuildViewInventory inv, int n) { UUID uuid = inv.members.get(n); OfflinePlayer player = getEffectivePlayer(inv, n); @@ -72,10 +172,10 @@ public class EditableGuildView extends EditableInventory { } @Override - public ItemStack display(GuildViewInventory inv, int n) { + public ItemStack getDisplayedItem(GuildViewInventory inv, int n) { UUID uuid = inv.members.get(n); - ItemStack disp = super.display(inv, n); + ItemStack disp = super.getDisplayedItem(inv, n); ItemMeta meta = disp.getItemMeta(); meta.getPersistentDataContainer().set(UUID_NAMESPACEDKEY, PersistentDataType.STRING, uuid.toString()); @@ -88,26 +188,43 @@ public class EditableGuildView extends EditableInventory { disp.setItemMeta(meta); return disp; } + + @Override + public void onClick(@NotNull GuildViewInventory inv, @NotNull InventoryClickEvent event) { + if (!inv.isGuildOwner) return; + if (event.getClick() != ClickType.RIGHT) return; + + 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(inv.getPlayer())) return; + + inv.playerData.getGuild().removeMember(target.getUniqueId()); + ConfigMessage.fromKey("kick-from-guild", "player", target.getName()).send(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); + } } - public class MemberItem extends SimplePlaceholderItem { - private final InventoryItem empty; + public class MemberItem extends SimpleItem { + private final InventoryItem empty; private final MemberDisplayItem member; public MemberItem(ConfigurationSection config) { - super(Material.BARRIER, config); + super(config); Validate.notNull(config.contains("empty"), "Could not load empty config"); Validate.notNull(config.contains("member"), "Could not load member config"); - empty = new SimplePlaceholderItem(config.getConfigurationSection("empty")); + empty = new SimpleItem<>(config.getConfigurationSection("empty")); member = new MemberDisplayItem(this, config.getConfigurationSection("member")); } @Override - public ItemStack display(GuildViewInventory inv, int n) { - int index = n * inv.getPage(); - return inv.getPlayerData().getGuild().countMembers() > index ? member.display(inv, index) : empty.display(inv, index); + public ItemStack getDisplayedItem(GuildViewInventory inv, int n) { + int index = n + inv.page * getSlots().size(); + return inv.playerData.getGuild().countMembers() > index ? member.getDisplayedItem(inv, index) : empty.getDisplayedItem(inv, index); } @Override @@ -116,43 +233,23 @@ public class EditableGuildView extends EditableInventory { } } - public class ConditionalItem extends SimplePlaceholderItem { - private final String function; - - public ConditionalItem(String func, ConfigurationSection config) { - super(config); - this.function = func; - } - - @Override - public ItemStack display(GuildViewInventory inv, int n) { - - if (function.equals("next")) - if (inv.getPage() == (inv.getPlayerData().getGuild().countMembers() + 20) - / inv.getByFunction("member").getSlots().size()) - return null; - if (function.equals("previous") && inv.getPage() == 1) - return null; - if ((function.equals("disband") || function.equals("invite")) && !inv.getPlayerData().getGuild().getOwner().equals(inv.getPlayer().getUniqueId())) - return null; - return super.display(inv, n); - } - } - public GeneratedInventory newInventory(PlayerData data) { - return new GuildViewInventory(data, this); + return new GuildViewInventory(data); } public class GuildViewInventory extends GeneratedInventory { private final int maxpages; + private final PlayerData playerData; + private final boolean isGuildOwner; - private int page = 1; private List members; - public GuildViewInventory(PlayerData playerData, EditableInventory editable) { - super(playerData, editable); + public GuildViewInventory(PlayerData playerData) { + super(new Navigator(playerData.getMMOPlayerData()), EditableGuildView.this); - maxpages = (playerData.getGuild().countMembers() + 20) / editable.getByFunction("member").getSlots().size(); + maxpages = (playerData.getGuild().countMembers() + 20) / getEditable().getByFunction("member").getSlots().size(); + this.playerData = playerData; + isGuildOwner = playerData.getGuild().getOwner().equals(playerData.getUniqueId()); } @Override @@ -162,102 +259,13 @@ public class EditableGuildView extends EditableInventory { } @Override - public String calculateName() { - return getName().replace("{online_players}", "" + getPlayerData().getGuild().countOnlineMembers()).replace("{page}", "" + page).replace("{maxpages}", "" + maxpages).replace("{players}", String.valueOf(getPlayerData().getGuild().countMembers())).replace("{tag}", getPlayerData().getGuild().getTag()).replace("{name}", getPlayerData().getGuild().getName()); - } - - @Override - public void whenClicked(InventoryClickContext context, InventoryItem item) { - if (item.getFunction().equals("leave")) { - playerData.getGuild().removeMember(playerData.getUniqueId()); - player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); - player.closeInventory(); - return; - } - - if (item.getFunction().equals("next") && page != maxpages) { - page++; - open(); - return; - } - - if (item.getFunction().equals("previous") && page != 1) { - page--; - open(); - return; - } - - if (item.getFunction().equals("disband")) { - if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId())) - return; - MMOCore.plugin.nativeGuildManager.unregisterGuild(playerData.getGuild()); - player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); - player.closeInventory(); - return; - } - - if (item.getFunction().equals("invite")) { - if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId())) - return; - - /* - * if (playerData.getGuild().getMembers().count() >= max) { - * ConfigMessage.fromKey("guild-is-full").send(player); - * player.playSound(player.getLocation(), - * Sound.ENTITY_VILLAGER_NO, 1, 1); return; } - */ - - new ChatInput(player, PlayerInput.InputType.GUILD_INVITE, context.getInventoryHolder(), input -> { - Player target = Bukkit.getPlayer(input); - if (target == null) { - ConfigMessage.fromKey("not-online-player", "player", input).send(player); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); - open(); - return; - } - - long remaining = playerData.getGuild().getLastInvite(target) + 60 * 2 * 1000 - System.currentTimeMillis(); - if (remaining > 0) { - ConfigMessage.fromKey("guild-invite-cooldown", "player", target.getName(), "cooldown", new DelayFormat().format(remaining)).send(player); - open(); - return; - } - - PlayerData targetData = PlayerData.get(target); - if (playerData.getGuild().hasMember(targetData.getUniqueId())) { - ConfigMessage.fromKey("already-in-guild", "player", target.getName()).send(player); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); - open(); - return; - } - - playerData.getGuild().sendGuildInvite(playerData, targetData); - ConfigMessage.fromKey("sent-guild-invite", "player", target.getName()).send(player); - player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); - open(); - }); - } - - if (item.getFunction().equals("member") && context.getClickType() == ClickType.RIGHT) { - if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId())) - return; - - String tag = context.getClickedItem().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; - - playerData.getGuild().removeMember(target.getUniqueId()); - ConfigMessage.fromKey("kick-from-guild", "player", target.getName()).send(player); - player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); - } - } - - public int getPage() { - return page; + public @NotNull String getRawName() { + return guiName + .replace("{online_players}", String.valueOf(playerData.getGuild().countOnlineMembers())) + .replace("{page}", "" + page).replace("{maxpages}", "" + maxpages) + .replace("{players}", String.valueOf(playerData.getGuild().countMembers())) + .replace("{tag}", playerData.getGuild().getTag()) + .replace("{name}", playerData.getGuild().getName()); } } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/party/EditablePartyCreation.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/party/EditablePartyCreation.java index 92dd7d78..dc9089b6 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/party/EditablePartyCreation.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/party/EditablePartyCreation.java @@ -1,52 +1,57 @@ package net.Indyuce.mmocore.gui.social.party; +import io.lumine.mythic.lib.gui.Navigator; +import io.lumine.mythic.lib.gui.editable.EditableInventory; +import io.lumine.mythic.lib.gui.editable.GeneratedInventory; +import io.lumine.mythic.lib.gui.editable.item.InventoryItem; +import io.lumine.mythic.lib.gui.editable.item.SimpleItem; +import io.lumine.mythic.lib.gui.editable.item.builtin.CloseInventoryItem; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; -import net.Indyuce.mmocore.gui.api.InventoryClickContext; import net.Indyuce.mmocore.manager.InventoryManager; import net.Indyuce.mmocore.party.provided.MMOCorePartyModule; -import net.Indyuce.mmocore.gui.api.GeneratedInventory; -import net.Indyuce.mmocore.gui.api.item.InventoryItem; -import net.Indyuce.mmocore.gui.api.item.SimplePlaceholderItem; -import net.Indyuce.mmocore.gui.api.EditableInventory; import org.bukkit.Sound; import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class EditablePartyCreation extends EditableInventory { - public EditablePartyCreation() { - super("party-creation"); - } - - @Override - public InventoryItem load(String function, ConfigurationSection config) { - return new SimplePlaceholderItem(config); + public EditablePartyCreation() { + super("party-creation"); } - public GeneratedInventory newInventory(PlayerData data) { - return new ClassConfirmationInventory(data, this); - } + @Override + public @Nullable InventoryItem resolveItem(@NotNull String function, @NotNull ConfigurationSection config) { + if (function.equalsIgnoreCase("create")) return new CreateItem(config); + if (function.equalsIgnoreCase("back")) return new CloseInventoryItem<>(config); + return null; + } - public class ClassConfirmationInventory extends GeneratedInventory { - public ClassConfirmationInventory(PlayerData playerData, EditableInventory editable) { - super(playerData, editable); - } + public ClassConfirmationInventory newInventory(PlayerData data) { + return new ClassConfirmationInventory(data); + } - @Override - public void whenClicked(InventoryClickContext context, InventoryItem item) { + public class CreateItem extends SimpleItem { + public CreateItem(ConfigurationSection config) { + super(config); + } - if (item.getFunction().equals("create")) { - ((MMOCorePartyModule) MMOCore.plugin.partyModule).newRegisteredParty(playerData); - InventoryManager.PARTY_VIEW.newInventory(playerData).open(); - player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); - } + @Override + public void onClick(@NotNull ClassConfirmationInventory inv, @NotNull InventoryClickEvent event) { + ((MMOCorePartyModule) MMOCore.plugin.partyModule).newRegisteredParty(inv.playerData); + InventoryManager.PARTY_VIEW.newInventory(inv.playerData).open(); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); + } + } - if (item.getFunction().equals("back")) - player.closeInventory(); - } + public class ClassConfirmationInventory extends GeneratedInventory { + private final PlayerData playerData; - @Override - public String calculateName() { - return getName(); - } - } + public ClassConfirmationInventory(PlayerData playerData) { + super(new Navigator(playerData.getMMOPlayerData()), EditablePartyCreation.this); + + this.playerData = playerData; + } + } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/party/EditablePartyView.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/party/EditablePartyView.java index d9e39547..2ed3e8f1 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/party/EditablePartyView.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/party/EditablePartyView.java @@ -1,28 +1,33 @@ package net.Indyuce.mmocore.gui.social.party; +import io.lumine.mythic.lib.gui.Navigator; +import io.lumine.mythic.lib.gui.editable.EditableInventory; +import io.lumine.mythic.lib.gui.editable.GeneratedInventory; +import io.lumine.mythic.lib.gui.editable.item.InventoryItem; +import io.lumine.mythic.lib.gui.editable.item.PhysicalItem; +import io.lumine.mythic.lib.gui.editable.item.SimpleItem; +import io.lumine.mythic.lib.gui.editable.placeholder.Placeholders; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.util.input.ChatInput; import net.Indyuce.mmocore.api.util.input.PlayerInput; import net.Indyuce.mmocore.api.util.math.format.DelayFormat; -import net.Indyuce.mmocore.gui.api.EditableInventory; -import net.Indyuce.mmocore.gui.api.GeneratedInventory; -import net.Indyuce.mmocore.gui.api.InventoryClickContext; -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 net.Indyuce.mmocore.party.provided.Party; import org.apache.commons.lang.Validate; -import org.bukkit.*; +import org.bukkit.Bukkit; +import org.bukkit.NamespacedKey; +import org.bukkit.OfflinePlayer; +import org.bukkit.Sound; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; +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 org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.UUID; @@ -34,11 +39,83 @@ public class EditablePartyView extends EditableInventory { } @Override - public InventoryItem load(String function, ConfigurationSection config) { - return function.equals("member") ? new MemberItem(config) : new SimplePlaceholderItem(config); + public @Nullable InventoryItem resolveItem(@NotNull String function, @NotNull ConfigurationSection config) { + if (function.equalsIgnoreCase("member")) return new MemberItem(config); + if (function.equalsIgnoreCase("leave")) return new LeaveButton(config); + if (function.equalsIgnoreCase("invite")) return new InviteItem(config); + + return null; } - public static class MemberDisplayItem extends InventoryItem { + public class InviteItem extends SimpleItem { + public InviteItem(ConfigurationSection config) { + super(config); + } + + @Override + public void onClick(@NotNull PartyViewInventory inv, @NotNull InventoryClickEvent event) { + Party party = (Party) inv.playerData.getParty(); + if (party.getMembers().size() >= MMOCore.plugin.configManager.maxPartyPlayers) { + ConfigMessage.fromKey("party-is-full").send(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); + return; + } + + new ChatInput(inv.getPlayer(), PlayerInput.InputType.PARTY_INVITE, inv, input -> { + Player target = Bukkit.getPlayer(input); + if (target == null) { + ConfigMessage.fromKey("not-online-player", "player", input).send(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); + // inv.open(); + return; + } + + long remaining = party.getLastInvite(target) + 60 * 2 * 1000 - System.currentTimeMillis(); + if (remaining > 0) { + ConfigMessage.fromKey("party-invite-cooldown", "player", target.getName(), "cooldown", new DelayFormat().format(remaining)).send(inv.playerData); + // inv.open(); + return; + } + + PlayerData targetData = PlayerData.get(target); + if (party.hasMember(target)) { + ConfigMessage.fromKey("already-in-party", "player", target.getName()).send(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); + // inv.open(); + return; + } + + int levelDifference = Math.abs(targetData.getLevel() - party.getLevel()); + if (levelDifference > MMOCore.plugin.configManager.maxPartyLevelDifference) { + ConfigMessage.fromKey("high-level-difference", "player", target.getName(), "diff", String.valueOf(levelDifference)).send(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); + // inv.open(); + return; + } + + party.sendInvite(inv.playerData, targetData); + ConfigMessage.fromKey("sent-party-invite", "player", target.getName()).send(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); + inv.open(); + }); + } + } + + public class LeaveButton extends SimpleItem { + public LeaveButton(ConfigurationSection config) { + super(config); + } + + @Override + public void onClick(@NotNull PartyViewInventory inv, @NotNull InventoryClickEvent event) { + Party party = (Party) inv.playerData.getParty(); + party.removeMember(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); + inv.getPlayer().closeInventory(); + } + } + + public static class MemberDisplayItem extends PhysicalItem { public MemberDisplayItem(MemberItem memberItem, ConfigurationSection config) { super(memberItem, config); } @@ -49,8 +126,8 @@ public class EditablePartyView extends EditableInventory { } @Override - public Placeholders getPlaceholders(GeneratedInventory inv, int n) { - Party party = (Party) inv.getPlayerData().getParty(); + public Placeholders getPlaceholders(PartyViewInventory inv, int n) { + Party party = (Party) inv.playerData.getParty(); PlayerData member = party.getMembers().get(n); Placeholders holders = new Placeholders(); @@ -64,15 +141,15 @@ public class EditablePartyView extends EditableInventory { @NotNull @Override - public Player getEffectivePlayer(GeneratedInventory inv, int n) { - return ((Party) inv.getPlayerData().getParty()).getMembers().get(n).getPlayer(); + public Player getEffectivePlayer(PartyViewInventory inv, int n) { + return ((Party) inv.playerData.getParty()).getMembers().get(n).getPlayer(); } @Override - public ItemStack display(GeneratedInventory inv, int n) { + public ItemStack getDisplayedItem(PartyViewInventory inv, int n) { final Player member = getEffectivePlayer(inv, n); - ItemStack disp = super.display(inv, n); + ItemStack disp = super.getDisplayedItem(inv, n); ItemMeta meta = disp.getItemMeta(); meta.getPersistentDataContainer().set(UUID_NAMESPACEDKEY, PersistentDataType.STRING, member.getUniqueId().toString()); @@ -87,24 +164,24 @@ public class EditablePartyView extends EditableInventory { } } - public static class MemberItem extends SimplePlaceholderItem { - private final InventoryItem empty; + public static class MemberItem extends InventoryItem { + private final InventoryItem empty; private final MemberDisplayItem member; public MemberItem(ConfigurationSection config) { - super(Material.BARRIER, config); + super(config); Validate.notNull(config.contains("empty"), "Could not load empty config"); Validate.notNull(config.contains("member"), "Could not load member config"); - empty = new SimplePlaceholderItem(config.getConfigurationSection("empty")); + empty = new SimpleItem<>(config.getConfigurationSection("empty")); member = new MemberDisplayItem(this, config.getConfigurationSection("member")); } @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); + public ItemStack getDisplayedItem(PartyViewInventory inv, int n) { + Party party = (Party) inv.playerData.getParty(); + return party.getMembers().size() > n ? member.getDisplayedItem(inv, n) : empty.getDisplayedItem(inv, n); } @Override @@ -113,97 +190,38 @@ public class EditablePartyView extends EditableInventory { } @Override - public boolean canDisplay(GeneratedInventory inv) { - return true; + public void onClick(@NotNull PartyViewInventory inv, @NotNull InventoryClickEvent event) { + Party party = (Party) inv.playerData.getParty(); + if (!party.getOwner().equals(inv.playerData)) return; + + final String uuidTag = event.getCurrentItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING); + if (uuidTag == null || uuidTag.isEmpty()) return; + final OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(uuidTag)); + if (target.equals(inv.getPlayer())) return; + + party.removeMember(PlayerData.get(target)); + ConfigMessage.fromKey("kick-from-party", "player", target.getName()).send(inv.playerData); + inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); } } public GeneratedInventory newInventory(PlayerData data) { - return new PartyViewInventory(data, this); + return new PartyViewInventory(data); } public class PartyViewInventory extends GeneratedInventory { + private final PlayerData playerData; - public PartyViewInventory(PlayerData playerData, EditableInventory editable) { - super(playerData, editable); + public PartyViewInventory(PlayerData playerData) { + super(new Navigator(playerData.getMMOPlayerData()), EditablePartyView.this); + + this.playerData = playerData; } @Override - public String calculateName() { - Party party = (Party) getPlayerData().getParty(); - return getName().replace("{max}", "" + MMOCore.plugin.configManager.maxPartyPlayers).replace("{players}", "" + party.getMembers().size()); - } - - @Override - public void whenClicked(InventoryClickContext context, InventoryItem item) { + public @NotNull String getRawName() { Party party = (Party) playerData.getParty(); - - if (item.getFunction().equals("leave")) { - party.removeMember(playerData); - player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); - player.closeInventory(); - return; - } - - if (item.getFunction().equals("invite")) { - - if (party.getMembers().size() >= MMOCore.plugin.configManager.maxPartyPlayers) { - ConfigMessage.fromKey("party-is-full").send(player); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); - return; - } - - new ChatInput(player, PlayerInput.InputType.PARTY_INVITE, context.getInventoryHolder(), input -> { - Player target = Bukkit.getPlayer(input); - if (target == null) { - ConfigMessage.fromKey("not-online-player", "player", input).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) { - ConfigMessage.fromKey("party-invite-cooldown", "player", target.getName(), "cooldown", new DelayFormat().format(remaining)).send(player); - open(); - return; - } - - PlayerData targetData = PlayerData.get(target); - if (party.hasMember(target)) { - ConfigMessage.fromKey("already-in-party", "player", target.getName()).send(player); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); - open(); - return; - } - - int levelDifference = Math.abs(targetData.getLevel() - party.getLevel()); - if (levelDifference > MMOCore.plugin.configManager.maxPartyLevelDifference) { - ConfigMessage.fromKey("high-level-difference", "player", target.getName(), "diff", String.valueOf(levelDifference)).send(player); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); - open(); - return; - } - - party.sendInvite(playerData, targetData); - ConfigMessage.fromKey("sent-party-invite", "player", target.getName()).send(player); - player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); - open(); - }); - } - - if (item.getFunction().equals("member") && context.getClickType() == ClickType.RIGHT) { - if (!party.getOwner().equals(playerData)) return; - - final String uuidTag = context.getClickedItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING); - if (uuidTag == null || uuidTag.isEmpty()) return; - final OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(uuidTag)); - if (target.equals(player)) return; - - party.removeMember(PlayerData.get(target)); - ConfigMessage.fromKey("kick-from-party", "player", target.getName()).send(player); - player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1); - } + return guiName.replace("{max}", String.valueOf(MMOCore.plugin.configManager.maxPartyPlayers)).replace("{players}", String.valueOf(party.getMembers().size())); } } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/loot/chest/LootChest.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/loot/chest/LootChest.java index b340fc39..91fa9215 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/loot/chest/LootChest.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/loot/chest/LootChest.java @@ -14,7 +14,7 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; public class LootChest { private final ChestTier tier; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ExperienceManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ExperienceManager.java index 6479cfa2..920cd1a2 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ExperienceManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ExperienceManager.java @@ -10,7 +10,7 @@ import org.apache.commons.lang.Validate; import org.bukkit.configuration.ConfigurationSection; import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import java.util.*; public class ExperienceManager implements MMOCoreManager { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/InventoryManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/InventoryManager.java index 8d394a1b..7e40578c 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/InventoryManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/InventoryManager.java @@ -1,11 +1,11 @@ package net.Indyuce.mmocore.manager; import io.lumine.mythic.lib.UtilityMethods; +import io.lumine.mythic.lib.gui.editable.EditableInventory; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigFile; import net.Indyuce.mmocore.api.player.profess.PlayerClass; import net.Indyuce.mmocore.gui.*; -import net.Indyuce.mmocore.gui.api.EditableInventory; import net.Indyuce.mmocore.gui.skilltree.SkillTreeViewer; import net.Indyuce.mmocore.gui.social.friend.EditableFriendList; import net.Indyuce.mmocore.gui.social.friend.EditableFriendRemoval; @@ -62,14 +62,14 @@ public class InventoryManager { final ConfigFile configFile = new ConfigFile("/gui/" + loader.name, loader.name + "-" + formattedId); final EditableInventory GUI = loader.provider.apply(id, !configFile.exists()); loader.inventories.put(formattedId, GUI); - GUI.reload(new ConfigFile("/gui/" + loader.name, GUI.getId()).getConfig()); + GUI.reload(MMOCore.plugin, new ConfigFile("/gui/" + loader.name, GUI.getId()).getConfig()); } } LIST.forEach(inv -> { try { MMOCore.plugin.configManager.copyDefaultFile("gui/" + inv.getId() + ".yml"); - inv.reload(new ConfigFile("/gui", inv.getId()).getConfig()); + inv.reload(MMOCore.plugin, new ConfigFile("/gui", inv.getId()).getConfig()); } catch (Exception exception) { MMOCore.log(Level.WARNING, "Could not load inventory '" + (inv instanceof ClassConfirmation ? "class-confirm/" : "") + inv.getId() + "': " + exception.getMessage()); } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/GuildDataManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/GuildDataManager.java index 2bd73fc5..0f4b2c1f 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/GuildDataManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/GuildDataManager.java @@ -11,7 +11,7 @@ import org.bukkit.configuration.file.FileConfiguration; import net.Indyuce.mmocore.api.ConfigFile; import net.Indyuce.mmocore.guild.provided.Guild; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; public abstract class GuildDataManager { protected final Map guilds = new HashMap<>(); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/profession/CustomBlockManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/profession/CustomBlockManager.java index 20a4d11b..972078c9 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/profession/CustomBlockManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/profession/CustomBlockManager.java @@ -17,7 +17,7 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Entity; import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.function.Function; import java.util.logging.Level; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/quest/compat/QuestModule.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/quest/compat/QuestModule.java index 284df49e..70851d54 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/quest/compat/QuestModule.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/quest/compat/QuestModule.java @@ -3,7 +3,7 @@ package net.Indyuce.mmocore.quest.compat; import net.Indyuce.mmocore.quest.AbstractQuest; import org.bukkit.entity.Player; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; public interface QuestModule { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/binding/SkillSlot.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/binding/SkillSlot.java index 8eef9e40..f7394ce9 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/binding/SkillSlot.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/binding/SkillSlot.java @@ -11,7 +11,7 @@ import org.apache.commons.lang.Validate; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/handler/KeyCombos.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/handler/KeyCombos.java index 01018ae7..0c88a1ba 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/handler/KeyCombos.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/handler/KeyCombos.java @@ -20,7 +20,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import java.util.*; public class KeyCombos extends SkillCastingHandler { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/handler/SkillScroller.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/handler/SkillScroller.java index 893f4945..ec0ea4b1 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/handler/SkillScroller.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/handler/SkillScroller.java @@ -21,7 +21,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerItemHeldEvent; import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import java.util.Objects; public class SkillScroller extends SkillCastingHandler { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/util/item/ConfigItem.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/util/item/ConfigItem.java index 50693c73..6efed515 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/util/item/ConfigItem.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/util/item/ConfigItem.java @@ -5,7 +5,7 @@ import org.apache.commons.lang.Validate; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Objects; diff --git a/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/PlayerListener.java b/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/PlayerListener.java index 739430c0..ad489953 100644 --- a/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/PlayerListener.java +++ b/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/PlayerListener.java @@ -9,8 +9,6 @@ import net.Indyuce.mmocore.api.event.PlayerResourceUpdateEvent; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource; import net.Indyuce.mmocore.api.util.MMOCoreUtils; -import net.Indyuce.mmocore.gui.api.InventoryClickContext; -import net.Indyuce.mmocore.gui.api.PluginInventory; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -19,8 +17,6 @@ import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityRegainHealthEvent; import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCloseEvent; public class PlayerListener implements Listener { @@ -53,24 +49,6 @@ public class PlayerListener implements Listener { } } - /** - * Register custom inventory clicks - */ - @EventHandler - public void registerInventoryClicks(InventoryClickEvent event) { - if (event.getInventory().getHolder() instanceof PluginInventory) - ((PluginInventory) event.getInventory().getHolder()).whenClicked(new InventoryClickContext(event.getRawSlot(), event.getCurrentItem(), event.getClick(), event, event.getInventory(), (PluginInventory) event.getInventory().getHolder())); - } - - /** - * Register custom inventory close effect - */ - @EventHandler - public void registerInventoryCloses(InventoryCloseEvent event) { - if (event.getInventory().getHolder() instanceof PluginInventory) - ((PluginInventory) event.getInventory().getHolder()).whenClosed(event); - } - /** * Updates the player's combat log data every time he hits an entity, or * gets hit by an entity or a projectile sent by another entity