mmocore ui centralization towards mythiclib

This commit is contained in:
Jules 2025-04-17 01:13:45 +02:00
parent affaca202f
commit 637f508a90
55 changed files with 1660 additions and 1766 deletions

View File

@ -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);
}

View File

@ -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();

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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() {

View File

@ -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.

View File

@ -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;

View File

@ -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;

View File

@ -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> {

View File

@ -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

View File

@ -1,21 +1,25 @@
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() {
@ -23,28 +27,56 @@ public class AttributeView extends EditableInventory {
}
@Override
public InventoryItem load(String function, ConfigurationSection config) {
if (function.equalsIgnoreCase("reallocation"))
return new InventoryItem(config) {
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);
return null;
}
public AttrInventory newInventory(PlayerData data) {
return new AttrInventory(data);
}
public class ReallocateButton extends PhysicalItem<AttrInventory> {
public ReallocateButton(ConfigurationSection config) {
super(config);
}
@Override
public Placeholders getPlaceholders(GeneratedInventory inv, int n) {
public Placeholders getPlaceholders(AttrInventory 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());
holders.register("attribute_points", inv.playerData.getAttributePoints());
holders.register("points", inv.playerData.getAttributeReallocationPoints());
holders.register("total", inv.playerData.getAttributes().countPoints());
return holders;
}
};
return function.startsWith("attribute_") ? new AttributeItem(function, config) : new SimplePlaceholderItem(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;
}
public GeneratedInventory newInventory(PlayerData data) {
return new AttributeViewerInventory(data, this);
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;
}
public static class AttributeItem extends InventoryItem {
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();
}
}
public static class AttributeItem extends PhysicalItem<AttrInventory> {
private final PlayerAttribute attribute;
private final int shiftCost;
@ -57,16 +89,16 @@ public class AttributeView extends EditableInventory {
}
@Override
public Placeholders getPlaceholders(GeneratedInventory inv, int n) {
int total = inv.getPlayerData().getAttributes().getInstance(attribute).getTotal();
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.getPlayerData().getAttributes().getInstance(attribute).getBase());
holders.register("spent", inv.playerData.getAttributes().getInstance(attribute).getBase());
holders.register("max", attribute.getMax());
holders.register("current", total);
holders.register("attribute_points", inv.getPlayerData().getAttributePoints());
holders.register("attribute_points", inv.playerData.getAttributePoints());
holders.register("shift_points", shiftCost);
attribute.getBuffs().forEach(buff -> {
final String stat = buff.getStat();
@ -76,88 +108,58 @@ public class AttributeView extends EditableInventory {
return holders;
}
}
public class AttributeViewerInventory extends GeneratedInventory {
public AttributeViewerInventory(PlayerData playerData, EditableInventory editable) {
super(playerData, editable);
}
@Override
public String calculateName() {
return getName();
}
public void onClick(@NotNull AttrInventory inv, @NotNull InventoryClickEvent event) {
@Override
public void whenClicked(InventoryClickContext context, InventoryItem item) {
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());
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;
}
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();
}
if (item.getFunction().startsWith("attribute_")) {
PlayerAttribute attribute = ((AttributeItem) item).attribute;
if (playerData.getAttributePoints() < 1) {
ConfigMessage.fromKey("not-attribute-point").send(player);
MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(getPlayer());
return;
}
PlayerAttributes.AttributeInstance ins = playerData.getAttributes().getInstance(attribute);
PlayerAttributes.AttributeInstance ins = inv.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());
ConfigMessage.fromKey("attribute-max-points-hit").send(inv.playerData);
MMOCore.plugin.soundManager.getSound(SoundEvent.NOT_ENOUGH_POINTS).playTo(inv.getPlayer());
return;
}
// 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());
final boolean shiftClick = event.getClick().isShiftClick();
int pointsSpent = shiftClick ? shiftCost : 1;
if (attribute.hasMax()) pointsSpent = Math.min(pointsSpent, attribute.getMax() - ins.getBase());
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());
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;
}
ins.addBase(pointsSpent);
playerData.giveAttributePoints(-pointsSpent);
inv.playerData.giveAttributePoints(-pointsSpent);
// Apply exp table as many times as required
while (pointsSpent-- > 0)
attribute.updateAdvancement(playerData, ins.getBase());
attribute.updateAdvancement(inv.playerData, ins.getBase());
ConfigMessage.fromKey("attribute-level-up", "attribute", attribute.getName(), "level", String.valueOf(ins.getBase())).send(player);
MMOCore.plugin.soundManager.getSound(SoundEvent.LEVEL_ATTRIBUTE).playTo(getPlayer());
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());
PlayerAttributeUseEvent playerAttributeUseEvent = new PlayerAttributeUseEvent(playerData, attribute);
PlayerAttributeUseEvent playerAttributeUseEvent = new PlayerAttributeUseEvent(inv.playerData, attribute);
Bukkit.getServer().getPluginManager().callEvent(playerAttributeUseEvent);
open();
}
inv.open();
}
}
public class AttrInventory extends GeneratedInventory {
private final PlayerData playerData;
public AttrInventory(PlayerData playerData) {
super(new Navigator(playerData.getMMOPlayerData()), AttributeView.this);
this.playerData = playerData;
}
}
}

View File

@ -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());
}
}
}

View File

@ -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);
}
}
/**

View File

@ -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,44 +34,74 @@ 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);
return null;
}
public PlayerStatsInventory newInventory(PlayerData invTarget, PlayerData opening) {
return new PlayerStatsInventory(invTarget, opening);
}
public PlayerStatsInventory newInventory(PlayerData player) {
return new PlayerStatsInventory(player, player);
}
public class BoostPreviousButton extends SimpleItem<PlayerStatsInventory> {
public BoostPreviousButton(ConfigurationSection config) {
super(config);
}
@Override
public boolean canDisplay(PlayerStatsInventory inv) {
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();
}
};
if (function.equals("boost-previous"))
return new SimplePlaceholderItem<PlayerStatsInventory>(config) {
@Override
public boolean canDisplay(PlayerStatsInventory inv) {
return inv.boostOffset > 0;
public void onClick(@NotNull PlayerStatsInventory inv, @NotNull InventoryClickEvent event) {
inv.boostOffset++;
inv.open();
}
}
};
if (function.equals("party"))
return new PartyMoraleItem(config);
public class ProfessionItem extends PhysicalItem<PlayerStatsInventory> {
private final Profession profession;
public ProfessionItem(String function, @NotNull ConfigurationSection config) {
super(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) {
profession = MMOCore.plugin.professionManager.get(id);
}
@Override
public boolean hasDifferentDisplay() {
@ -94,32 +126,24 @@ public class PlayerStats extends EditableInventory {
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));
holders.register("percent", ONE_DIGIT.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;
public class StatsItem extends PhysicalItem<PlayerStatsInventory> {
public StatsItem(ConfigurationSection config) {
super(config);
}
@Override
public Placeholders getPlaceholders(PlayerStatsInventory inv, int n) {
public @NotNull 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) {
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));
@ -140,17 +164,6 @@ public class PlayerStats extends EditableInventory {
}
};
}
};
return new SimplePlaceholderItem(config);
}
public PlayerStatsInventory newInventory(PlayerData invTarget, PlayerData opening) {
return new PlayerStatsInventory(invTarget, opening, this);
}
public PlayerStatsInventory newInventory(PlayerData player) {
return new PlayerStatsInventory(player, player, this);
}
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);
}
}
}

View File

@ -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;
}
}
public class QuestInventory extends GeneratedInventory {
private final List<Quest> quests = new ArrayList<>(MMOCore.plugin.questManager.getAll());
private final int perPage;
private int page;
public QuestInventory(PlayerData playerData, EditableInventory editable) {
super(playerData, editable);
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()
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 (playerData.getQuestData().hasCurrent()) {
if (inv.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();
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(player);
ConfigMessage.fromKey("already-on-quest").send(inv.playerData);
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);
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 (playerData.getCollectionSkills().getLevel(profession) < (level = quest.getLevelRestriction(profession))) {
if (inv.playerData.getCollectionSkills().getLevel(profession) < (level = quest.getLevelRestriction(profession))) {
ConfigMessage.fromKey("quest-level-restriction", "level", profession.getName() + " Lvl", "count", "" + level)
.send(player);
.send(inv.playerData);
return;
}
if (playerData.getQuestData().hasFinished(quest)) {
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(player);
ConfigMessage.fromKey("cant-redo-quest").send(inv.playerData);
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);
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(player);
MMOCore.plugin.soundManager.getSound(SoundEvent.START_QUEST).playTo(player);
playerData.getQuestData().start(quest);
open();
}
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 final PlayerData playerData;
public QuestInventory(PlayerData playerData, EditableInventory editable) {
super(new Navigator(playerData.getMMOPlayerData()), editable);
this.playerData = playerData;
perPage = editable.getByFunction("quest").getSlots().size();
}
}
}

View File

@ -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) {

View File

@ -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;
}
}
}

View File

@ -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,56 +164,17 @@ 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;
}
}
public class WaypointViewerInventory extends GeneratedInventory {
private final List<Waypoint> waypoints = new ArrayList<>(MMOCore.plugin.waypointManager.getAll());
@Nullable
private final Waypoint current;
private Map<Waypoint, WaypointPath> paths;
private int page;
public WaypointViewerInventory(PlayerData playerData, EditableInventory editable, Waypoint current) {
super(playerData, editable);
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();
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) : "";
@ -244,37 +182,57 @@ public class WaypointViewer extends EditableInventory {
// Locked waypoint?
final Waypoint waypoint = MMOCore.plugin.waypointManager.get(tag);
if (!playerData.hasWaypoint(waypoint)) {
ConfigMessage.fromKey("not-unlocked-waypoint").send(player);
if (!inv.playerData.hasWaypoint(waypoint)) {
ConfigMessage.fromKey("not-unlocked-waypoint").send(inv.playerData);
return;
}
// Cannot teleport to current waypoint
if (waypoint.equals(current)) {
ConfigMessage.fromKey("standing-on-waypoint").send(player);
if (waypoint.equals(inv.current)) {
ConfigMessage.fromKey("standing-on-waypoint").send(inv.playerData);
return;
}
// No access to that waypoint
if (paths.get(waypoint) == null) {
ConfigMessage.fromKey("cannot-teleport-to").send(player);
if (inv.paths.get(waypoint) == null) {
ConfigMessage.fromKey("cannot-teleport-to").send(inv.playerData);
return;
}
// Stellium cost
double withdraw = paths.get(waypoint).getCost();
double left = withdraw - playerData.getStellium();
double withdraw = inv.paths.get(waypoint).getCost();
double left = withdraw - inv.playerData.getStellium();
if (left > 0) {
ConfigMessage.fromKey("not-enough-stellium", "more", decimal.format(left)).send(player);
ConfigMessage.fromKey("not-enough-stellium", "more", ONE_DIGIT.format(left)).send(inv.playerData);
return;
}
if (playerData.getActivityTimeOut(PlayerActivity.USE_WAYPOINT) > 0)
if (inv.playerData.getActivityTimeOut(PlayerActivity.USE_WAYPOINT) > 0)
return;
player.closeInventory();
playerData.warp(waypoint, withdraw);
}
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;
public WaypointViewerInventory(PlayerData playerData, EditableInventory editable, Waypoint current) {
super(new Navigator(playerData.getMMOPlayerData()), editable);
this.playerData = playerData;
this.current = current;
paths = new WaypointPathCalculation(playerData).run(current).getPaths();
}
public boolean isDynamicUse() {
return current == null;
}
}
}

View File

@ -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;

View File

@ -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<>();

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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 "???";
}
}

View File

@ -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<>();

View File

@ -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<>();

View File

@ -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);

View File

@ -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;

View File

@ -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();

View File

@ -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);
}

View File

@ -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;
}
}
}
}
}
}

View File

@ -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;
}
}
}

View File

@ -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) {
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);
return null;
}
public Placeholders getGlobalPlaceholders(ClassConfirmationInventory inv) {
Placeholders holders = new Placeholders();
holders.register("name", inv.friend.getName());
return holders;
}
};
public class YesItem extends SimpleItem<ClassConfirmationInventory> {
public YesItem(ConfigurationSection config) {
super(config);
}
public GeneratedInventory newInventory(PlayerData data, OfflinePlayer friend, GeneratedInventory last) {
return new ClassConfirmationInventory(data, this, friend, last);
@Override
public @NotNull Placeholders getPlaceholders(ClassConfirmationInventory inv, int n) {
return getGlobalPlaceholders(inv);
}
@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 GeneratedInventory last;
private final PlayerData playerData;
public ClassConfirmationInventory(PlayerData playerData, EditableInventory editable, OfflinePlayer friend, GeneratedInventory last) {
super(playerData, editable);
public ClassConfirmationInventory(EditableFriendList.FriendListInventory inventory, OfflinePlayer friend) {
super(inventory.getNavigator(), EditableFriendRemoval.this);
this.playerData = inventory.getPlayerData();
this.friend = friend;
this.last = last;
}
@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();
}
if (item.getFunction().equals("back"))
last.open();
}
@Override
public String calculateName() {
return getName();
}
}
}

View File

@ -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,15 +20,18 @@ 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");
@ -36,15 +40,77 @@ public class EditableGuildAdmin 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 LeaveItem(config);
if (function.equalsIgnoreCase("invite")) return new InviteItem(config);
return null;
}
public GeneratedInventory newInventory(PlayerData data) {
return new GuildViewInventory(data, this);
return new GuildViewInventory(data);
}
public static class MemberDisplayItem extends InventoryItem<GuildViewInventory> {
public class InviteItem extends SimpleItem<GuildViewInventory> {
public InviteItem(ConfigurationSection config) {
super(config);
}
@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;
}
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(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;
}
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 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 static class MemberDisplayItem extends PhysicalItem<GuildViewInventory> {
public MemberDisplayItem(MemberItem memberItem, ConfigurationSection config) {
super(memberItem, config);
}
@ -69,11 +135,11 @@ public class EditableGuildAdmin extends EditableInventory {
}
@Override
public ItemStack display(GuildViewInventory inv, int n) {
public ItemStack getDisplayedItem(GuildViewInventory inv, int n) {
UUID uuid = inv.members.get(n);
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(uuid);
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,8 +154,8 @@ public class EditableGuildAdmin extends EditableInventory {
}
}
public static class MemberItem extends SimplePlaceholderItem<GuildViewInventory> {
private final InventoryItem empty;
public static class MemberItem extends InventoryItem<GuildViewInventory> {
private final InventoryItem<GuildViewInventory> empty;
private final MemberDisplayItem member;
public MemberItem(ConfigurationSection config) {
@ -98,30 +164,46 @@ public class EditableGuildAdmin extends EditableInventory {
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) {
return inv.getPlayerData().getGuild().countMembers() > n ? member.display(inv, n) : empty.display(inv, n);
public ItemStack getDisplayedItem(GuildViewInventory inv, int n) {
return inv.playerData.getGuild().countMembers() > n ? member.getDisplayedItem(inv, n) : empty.getDisplayedItem(inv, n);
}
@Override
public boolean hasDifferentDisplay() {
return true;
}
@Override
public void onClick(@NotNull GuildViewInventory inv, @NotNull InventoryClickEvent event) {
if (!inv.isGuildOwner) return;
OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(event.getCurrentItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING)));
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 GuildViewInventory extends GeneratedInventory {
private final int max;
private final PlayerData playerData;
private final boolean isGuildOwner;
private List<UUID> members;
public GuildViewInventory(PlayerData playerData, EditableInventory editable) {
super(playerData, editable);
public GuildViewInventory(PlayerData playerData) {
super(new Navigator(playerData.getMMOPlayerData()), EditableGuildAdmin.this);
max = editable.getByFunction("member").getSlots().size();
max = getEditable().getByFunction("member").getSlots().size();
this.playerData = playerData;
isGuildOwner = playerData.getGuild().getOwner().equals(playerData.getUniqueId());
}
@Override
@ -131,72 +213,8 @@ public class EditableGuildAdmin extends EditableInventory {
}
@Override
public String calculateName() {
return getName().replace("{max}", "" + max).replace("{players}", "" + getPlayerData().getGuild().countMembers());
}
@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("invite")) {
if (playerData.getGuild().countMembers() >= 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(target.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;
OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(context.getClickedItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING)));
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 @NotNull String getRawName() {
return guiName.replace("{max}", String.valueOf(max)).replace("{players}", String.valueOf(playerData.getGuild().countMembers()));
}
}
}

View File

@ -1,20 +1,24 @@
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() {
@ -22,52 +26,52 @@ public class EditableGuildCreation extends EditableInventory {
}
@Override
public InventoryItem load(String function, ConfigurationSection config) {
return new SimplePlaceholderItem(config);
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 GeneratedInventory newInventory(PlayerData data) {
return new GuildCreationInventory(data, this);
}
public class GuildCreationInventory extends GeneratedInventory {
public GuildCreationInventory(PlayerData playerData, EditableInventory editable) {
super(playerData, editable);
public class CreateItem extends SimpleItem<GuildCreationInventory> {
public CreateItem(ConfigurationSection config) {
super(config);
}
@Override
public void whenClicked(InventoryClickContext context, InventoryItem item) {
if (item.getFunction().equals("create")) {
new ChatInput(player, PlayerInput.InputType.GUILD_CREATION_TAG, context.getInventoryHolder(), input -> {
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())) {
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;
}
}
if (item.getFunction().equals("back"))
player.closeInventory();
public GuildCreationInventory newInventory(PlayerData data) {
return new GuildCreationInventory(data);
}
@Override
public String calculateName() {
return getName();
public class GuildCreationInventory extends GeneratedInventory {
private final PlayerData playerData;
public GuildCreationInventory(PlayerData playerData) {
super(new Navigator(playerData.getMMOPlayerData()), EditableGuildCreation.this);
this.playerData = playerData;
}
}

View File

@ -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());
}
}
}

View File

@ -1,16 +1,20 @@
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() {
@ -18,35 +22,36 @@ public class EditablePartyCreation extends EditableInventory {
}
@Override
public InventoryItem load(String function, ConfigurationSection config) {
return new SimplePlaceholderItem(config);
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 GeneratedInventory newInventory(PlayerData data) {
return new ClassConfirmationInventory(data, this);
public ClassConfirmationInventory newInventory(PlayerData data) {
return new ClassConfirmationInventory(data);
}
public class CreateItem extends SimpleItem<ClassConfirmationInventory> {
public CreateItem(ConfigurationSection config) {
super(config);
}
@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);
}
}
public class ClassConfirmationInventory extends GeneratedInventory {
public ClassConfirmationInventory(PlayerData playerData, EditableInventory editable) {
super(playerData, editable);
}
private final PlayerData playerData;
@Override
public void whenClicked(InventoryClickContext context, InventoryItem item) {
public ClassConfirmationInventory(PlayerData playerData) {
super(new Navigator(playerData.getMMOPlayerData()), EditablePartyCreation.this);
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);
}
if (item.getFunction().equals("back"))
player.closeInventory();
}
@Override
public String calculateName() {
return getName();
this.playerData = playerData;
}
}
}

View File

@ -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()));
}
}
}

View File

@ -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;

View File

@ -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 {

View File

@ -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());
}

View File

@ -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<>();

View File

@ -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;

View File

@ -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> {

View File

@ -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;

View File

@ -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 {

View File

@ -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 {

View File

@ -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;

View File

@ -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