mirror of
https://gitlab.com/phoenix-dvpmt/mmocore.git
synced 2025-11-18 06:24:17 +01:00
mmocore ui centralization towards mythiclib
This commit is contained in:
parent
affaca202f
commit
637f508a90
@ -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);
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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<String> 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<String> output) {
|
||||
public ChatInput(@NotNull Player player, @NotNull InputType inputType, @Nullable GeneratedInventory lastOpened, @NotNull Consumer<String> output) {
|
||||
super(player, output);
|
||||
|
||||
this.inputType = inputType;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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() {
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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<Material> {
|
||||
public final Material material;
|
||||
|
||||
@ -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<Entity> {
|
||||
|
||||
@ -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<ItemStack> {
|
||||
@Nullable
|
||||
|
||||
@ -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<AttrInventory> {
|
||||
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<AttrInventory> {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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<ClassConfirmationInventory> {
|
||||
public class UnlockedItem extends PhysicalItem<ClassConfirmationInventory> {
|
||||
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<ClassConfirmationInventory> {
|
||||
private final InventoryItem unlocked, locked;
|
||||
public class YesItem extends InventoryItem<ClassConfirmationInventory> {
|
||||
private final InventoryItem<ClassConfirmationInventory> 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<ClassConfirmationInventory>(config.getConfigurationSection("locked")) {
|
||||
locked = new PhysicalItem<ClassConfirmationInventory>(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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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<ProfessSelectionInventory> {
|
||||
private final String name;
|
||||
private final List<String> lore;
|
||||
public class ClassItem extends SimpleItem<ProfessSelectionInventory> {
|
||||
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<String> lore = new ArrayList<>(this.lore);
|
||||
if (meta.hasDisplayName())
|
||||
meta.setDisplayName(meta.getDisplayName().replace("{name}", playerClass.getName()));
|
||||
List<String> 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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -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<PlayerStatsInventory>(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<PlayerStatsInventory>(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<PlayerStatsInventory>(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<PlayerStatsInventory>(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<PlayerStatsInventory> {
|
||||
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<PlayerStatsInventory> {
|
||||
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<PlayerStatsInventory> {
|
||||
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<PlayerStatsInventory> {
|
||||
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<PlayerStatsInventory> {
|
||||
public static class PartyMoraleItem extends PhysicalItem<PlayerStatsInventory> {
|
||||
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<PlayerStatsInventory> {
|
||||
public static class PlayerProfileItem extends PhysicalItem<PlayerStatsInventory> {
|
||||
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<PlayerStatsInventory> {
|
||||
private final InventoryItem noBoost, mainLevel, profession;
|
||||
public class BoostItem extends SimpleItem<PlayerStatsInventory> {
|
||||
private final PhysicalItem<PlayerStatsInventory> 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<PlayerStatsInventory>(mainLevel) {
|
||||
this.mainLevel = new PhysicalItem<PlayerStatsInventory>(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<PlayerStatsInventory>(profession) {
|
||||
this.profession = new PhysicalItem<PlayerStatsInventory>(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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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<QuestInventory>(config) {
|
||||
|
||||
@Override
|
||||
public boolean canDisplay(QuestInventory inv) {
|
||||
return inv.page > 0;
|
||||
}
|
||||
};
|
||||
|
||||
if (function.equals("next"))
|
||||
return new SimplePlaceholderItem<QuestInventory>(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<QuestInventory> {
|
||||
private final SimpleItem<QuestInventory> 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<String> lore = new ArrayList<>(getLore());
|
||||
ItemStack item = super.getDisplayedItem(inv, itemIndex);
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
List<String> 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<Quest> 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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<SkillViewerInventory>(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<SkillViewerInventory>(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) {
|
||||
|
||||
@ -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<SubclassSelectionInventory> {
|
||||
private final String name;
|
||||
private final List<String> lore;
|
||||
public class ClassItem extends SimpleItem<SubclassSelectionInventory> {
|
||||
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<String> lore = new ArrayList<>(this.lore);
|
||||
if (meta.hasDisplayName())
|
||||
meta.setDisplayName(meta.getDisplayName().replace("{name}", playerClass.getName()));
|
||||
List<String> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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<WaypointViewerInventory>(config) {
|
||||
|
||||
@Override
|
||||
public boolean canDisplay(WaypointViewerInventory inv) {
|
||||
return inv.page > 0;
|
||||
}
|
||||
};
|
||||
|
||||
if (function.equals("next"))
|
||||
return new SimplePlaceholderItem<WaypointViewerInventory>(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<WaypointViewerInventory> {
|
||||
private final SimplePlaceholderItem noWaypoint, locked;
|
||||
public class WaypointItem extends InventoryItem<WaypointViewerInventory> {
|
||||
private final SimpleItem<WaypointViewerInventory> 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<WaypointViewerInventory> {
|
||||
public class WaypointItemHandler extends PhysicalItem<WaypointViewerInventory> {
|
||||
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<String> 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<Waypoint> waypoints = new ArrayList<>(MMOCore.plugin.waypointManager.getAll());
|
||||
@Nullable
|
||||
private final Waypoint current;
|
||||
private final PlayerData playerData;
|
||||
|
||||
private Map<Waypoint, WaypointPath> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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<InventoryItem> loaded = new ArrayList<>();
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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 "???";
|
||||
}
|
||||
}
|
||||
@ -18,6 +18,7 @@ import org.jetbrains.annotations.Nullable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Deprecated
|
||||
public abstract class InventoryItem<T extends GeneratedInventory> {
|
||||
private final String id, function;
|
||||
private final List<Integer> slots = new ArrayList<>();
|
||||
|
||||
@ -8,6 +8,7 @@ import org.jetbrains.annotations.Nullable;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Deprecated
|
||||
public class Placeholders {
|
||||
private final Map<String, String> placeholders = new HashMap<>();
|
||||
|
||||
|
||||
@ -4,6 +4,7 @@ import net.Indyuce.mmocore.gui.api.GeneratedInventory;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
|
||||
@Deprecated
|
||||
public class SimplePlaceholderItem<T extends GeneratedInventory> extends InventoryItem<T> {
|
||||
public SimplePlaceholderItem(InventoryItem<?> parent, ConfigurationSection config) {
|
||||
super(parent, config);
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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<DisplayInfo, Icon> icons = new HashMap<>();
|
||||
protected final Map<NodeState, String> 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<SkillTreeInventory>(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<SkillTreeInventory> {
|
||||
|
||||
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<SkillTreeInventory> {
|
||||
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<SkillTreeInventory> {
|
||||
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<SkillTreeInventory> {
|
||||
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<SkillTreeInventory> {
|
||||
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<SkillTreeInventory> {
|
||||
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<SkillTreeInventory> {
|
||||
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<String> 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<SkillTreeInventory> {
|
||||
|
||||
public class NextTreeListPageItem extends SimpleItem<SkillTreeInventory> {
|
||||
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<SkillTreeInventory> {
|
||||
public class PreviousTreeListPageItem extends SimpleItem<SkillTreeInventory> {
|
||||
|
||||
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<SkillTreeInventory> {
|
||||
|
||||
public class SkillTreeNodeItem extends PhysicalItem<SkillTreeInventory> {
|
||||
private final List<String> 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<String> 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<String> getParentsLore(SkillTreeInventory inv, SkillTreeNode node, Collection<SkillTreeNode> parents) {
|
||||
List<String> 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<SkillTree> skillTrees;
|
||||
private final List<Integer> 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<SkillTree> skillTrees;
|
||||
@NotNull
|
||||
private SkillTree skillTree;
|
||||
private final List<Integer> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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<FriendListInventory>(config) {
|
||||
|
||||
@Override
|
||||
public boolean canDisplay(FriendListInventory inv) {
|
||||
return inv.page > 0;
|
||||
}
|
||||
};
|
||||
|
||||
if (function.equals("next"))
|
||||
return new SimplePlaceholderItem<FriendListInventory>(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<FriendListInventory> {
|
||||
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<FriendListInventory> {
|
||||
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<FriendListInventory> {
|
||||
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<FriendListInventory> {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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<ClassConfirmationInventory>(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<ClassConfirmationInventory> {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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<GuildViewInventory> {
|
||||
public MemberDisplayItem(MemberItem memberItem, ConfigurationSection config) {
|
||||
super(memberItem, config);
|
||||
}
|
||||
public class InviteItem extends SimpleItem<GuildViewInventory> {
|
||||
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<GuildViewInventory> {
|
||||
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<GuildViewInventory> {
|
||||
public MemberDisplayItem(MemberItem memberItem, ConfigurationSection config) {
|
||||
super(memberItem, config);
|
||||
}
|
||||
|
||||
public static class MemberItem extends SimplePlaceholderItem<GuildViewInventory> {
|
||||
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<UUID> members;
|
||||
disp.setItemMeta(meta);
|
||||
return disp;
|
||||
}
|
||||
}
|
||||
|
||||
public GuildViewInventory(PlayerData playerData, EditableInventory editable) {
|
||||
super(playerData, editable);
|
||||
public static class MemberItem extends InventoryItem<GuildViewInventory> {
|
||||
private final InventoryItem<GuildViewInventory> 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<UUID> 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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
public class CreateItem extends SimpleItem<GuildCreationInventory> {
|
||||
public CreateItem(ConfigurationSection config) {
|
||||
super(config);
|
||||
}
|
||||
|
||||
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();
|
||||
@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();
|
||||
|
||||
if(check(player, input, MMOCore.plugin.nativeGuildManager.getConfig().getTagRules())) {
|
||||
String tag = input;
|
||||
if (check(inv.getPlayer(), input, MMOCore.plugin.nativeGuildManager.getConfig().getTagRules())) {
|
||||
String tag = input;
|
||||
|
||||
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());
|
||||
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());
|
||||
|
||||
InventoryManager.GUILD_VIEW.newInventory(playerData).open();
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
InventoryManager.GUILD_VIEW.newInventory(inv.playerData).open();
|
||||
inv.getPlayer().playSound(inv.getPlayer().getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
public GuildCreationInventory newInventory(PlayerData data) {
|
||||
return new GuildCreationInventory(data);
|
||||
}
|
||||
|
||||
if (item.getFunction().equals("back"))
|
||||
player.closeInventory();
|
||||
}
|
||||
public class GuildCreationInventory extends GeneratedInventory {
|
||||
private final PlayerData playerData;
|
||||
|
||||
@Override
|
||||
public String calculateName() {
|
||||
return getName();
|
||||
}
|
||||
}
|
||||
public GuildCreationInventory(PlayerData playerData) {
|
||||
super(new Navigator(playerData.getMMOPlayerData()), EditableGuildCreation.this);
|
||||
|
||||
public boolean check(Player player, String input, GuildDataManager.GuildConfiguration.NamingRules rules) {
|
||||
String reason;
|
||||
this.playerData = playerData;
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
public boolean check(Player player, String input, GuildDataManager.GuildConfiguration.NamingRules rules) {
|
||||
String reason;
|
||||
|
||||
ConfigMessage.fromKey("guild-creation.failed", "reason", reason).send(player);
|
||||
return false;
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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<GuildViewInventory> {
|
||||
public class LeaveItem extends SimpleItem<GuildViewInventory> {
|
||||
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<GuildViewInventory> {
|
||||
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<GuildViewInventory> {
|
||||
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<GuildViewInventory> {
|
||||
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<GuildViewInventory> {
|
||||
private final InventoryItem empty;
|
||||
public class MemberItem extends SimpleItem<GuildViewInventory> {
|
||||
private final InventoryItem<GuildViewInventory> 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<GuildViewInventory> {
|
||||
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<UUID> 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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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<ClassConfirmationInventory> {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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<PartyViewInventory> {
|
||||
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<PartyViewInventory> {
|
||||
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<PartyViewInventory> {
|
||||
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<PartyViewInventory> {
|
||||
private final InventoryItem<PartyViewInventory> 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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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());
|
||||
}
|
||||
|
||||
@ -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<String, Guild> guilds = new HashMap<>();
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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<T extends AbstractQuest> {
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user