forked from Upstream/mmocore
Huge refactor to centralize GUI API into MythicLib
This commit is contained in:
parent
c04d46d662
commit
ed17756842
@ -24,6 +24,7 @@ import net.Indyuce.mmocore.comp.region.WorldGuardRegionHandler;
|
||||
import net.Indyuce.mmocore.comp.region.pvpmode.PvPModeListener;
|
||||
import net.Indyuce.mmocore.comp.vault.VaultEconomy;
|
||||
import net.Indyuce.mmocore.comp.vault.VaultMMOLoader;
|
||||
import net.Indyuce.mmocore.gui.api.packets.InventoryPacketListener;
|
||||
import net.Indyuce.mmocore.guild.GuildModule;
|
||||
import net.Indyuce.mmocore.guild.GuildModuleType;
|
||||
import net.Indyuce.mmocore.guild.GuildRelationHandler;
|
||||
@ -263,6 +264,9 @@ public class MMOCore extends JavaPlugin {
|
||||
// load guild data after loading player data
|
||||
dataProvider.getGuildManager().load();
|
||||
|
||||
//TODO: Remove
|
||||
new InventoryPacketListener();
|
||||
|
||||
// Toggleable Commands
|
||||
ToggleableCommand.register();
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
package net.Indyuce.mmocore.api.util.input;
|
||||
|
||||
import io.lumine.mythic.lib.gui.framework.PluginInventory;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.gui.api.PluginInventory;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
|
@ -42,7 +42,7 @@ public class SkillTreesCommand extends RegisteredCommand {
|
||||
return false;
|
||||
}
|
||||
if (data.getProfess().getSkillTrees().size() != 0) {
|
||||
InventoryManager.TREE_VIEW.newInventory(data).open();
|
||||
InventoryManager.TREE_VIEW.generate(data).open();
|
||||
return true;
|
||||
} else {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("no-skill-tree").send(player);
|
||||
@ -60,7 +60,7 @@ public class SkillTreesCommand extends RegisteredCommand {
|
||||
.filter(skillTree -> UtilityMethods.ymlName(skillTree.getId()).equals(UtilityMethods.ymlName(args[0])))
|
||||
.collect(Collectors.toList())
|
||||
.size() != 0) {
|
||||
InventoryManager.SPECIFIC_TREE_VIEW.get(UtilityMethods.ymlName(args[0])).newInventory(data).open();
|
||||
InventoryManager.SPECIFIC_TREE_VIEW.get(UtilityMethods.ymlName(args[0])).generate(data).open();
|
||||
return true;
|
||||
} else {
|
||||
sender.sendMessage(ChatColor.RED + "Your class does not have a skill tree with id: " + args[0]);
|
||||
|
@ -3,12 +3,6 @@ package net.Indyuce.mmocore.gui;
|
||||
import io.lumine.mythic.lib.manager.StatManager;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
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.event.PlayerAttributeUseEvent;
|
||||
import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute;
|
||||
import net.Indyuce.mmocore.api.player.attribute.PlayerAttributes;
|
||||
@ -22,7 +16,7 @@ public class AttributeView extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public InventoryItem load(String function, ConfigurationSection config) {
|
||||
public InventoryItem loadItem(String function, ConfigurationSection config) {
|
||||
if (function.equalsIgnoreCase("reallocation"))
|
||||
return new InventoryItem(config) {
|
||||
|
||||
@ -36,7 +30,7 @@ public class AttributeView extends EditableInventory {
|
||||
}
|
||||
};
|
||||
|
||||
return function.startsWith("attribute_") ? new AttributeItem(function, config) : new SimplePlaceholderItem(config);
|
||||
return function.startsWith("attribute_") ? new AttributeItem(function, config) : new SimpleItem(config);
|
||||
}
|
||||
|
||||
public GeneratedInventory newInventory(PlayerData data) {
|
||||
@ -90,7 +84,7 @@ public class AttributeView extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void whenClicked(InventoryClickContext context, InventoryItem item) {
|
||||
public void whenClicked(InventoryClickEvent event, InventoryItem item) {
|
||||
|
||||
if (item.getFunction().equalsIgnoreCase("reallocation")) {
|
||||
int spent = playerData.getAttributes().countPoints();
|
||||
@ -131,7 +125,7 @@ public class AttributeView extends EditableInventory {
|
||||
}
|
||||
|
||||
// Amount of points spent
|
||||
final boolean shiftClick = context.getClickType().isShiftClick();
|
||||
final boolean shiftClick = event.getClick().isShiftClick();
|
||||
int pointsSpent = shiftClick ? ((AttributeItem) item).shiftCost : 1;
|
||||
if (attribute.hasMax())
|
||||
pointsSpent = Math.min(pointsSpent, attribute.getMax() - ins.getBase());
|
||||
|
@ -1,31 +1,31 @@
|
||||
package net.Indyuce.mmocore.gui;
|
||||
|
||||
import io.lumine.mythic.lib.UtilityMethods;
|
||||
import io.lumine.mythic.lib.gui.framework.EditableInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.GeneratedInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.PluginInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.item.InventoryItem;
|
||||
import io.lumine.mythic.lib.gui.framework.item.Placeholders;
|
||||
import io.lumine.mythic.lib.gui.framework.item.SimpleItem;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.SoundEvent;
|
||||
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.InventoryClickEvent;
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public class ClassConfirmation extends EditableInventory {
|
||||
public class ClassConfirmation extends EditableInventory<PlayerData> {
|
||||
private final PlayerClass playerClass;
|
||||
|
||||
public ClassConfirmation(PlayerClass playerClass, boolean isDefault) {
|
||||
@ -35,8 +35,13 @@ public class ClassConfirmation extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public InventoryItem load(String function, ConfigurationSection config) {
|
||||
return function.equalsIgnoreCase("yes") ? new YesItem(config) : new SimplePlaceholderItem(config);
|
||||
public GeneratedInventory generate(PlayerData playerData, @Nullable GeneratedInventory generatedInventory) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InventoryItem loadItem(String function, ConfigurationSection config) {
|
||||
return function.equalsIgnoreCase("yes") ? new YesItem(config) : new SimpleItem(config);
|
||||
}
|
||||
|
||||
public GeneratedInventory newInventory(PlayerData data, PluginInventory last, boolean setClass) {
|
||||
@ -80,7 +85,7 @@ public class ClassConfirmation extends EditableInventory {
|
||||
}
|
||||
}
|
||||
|
||||
public class YesItem extends SimplePlaceholderItem<ClassConfirmationInventory> {
|
||||
public class YesItem extends SimpleItem<ClassConfirmationInventory> {
|
||||
private final InventoryItem unlocked, locked;
|
||||
|
||||
public YesItem(ConfigurationSection config) {
|
||||
@ -102,12 +107,12 @@ 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(ClassConfirmationInventory inv, int n) {
|
||||
return inv.getPlayerData().hasSavedClass(inv.profess) ? unlocked.getDisplayedItem(inv, n) : locked.getDisplayedItem(inv, n);
|
||||
}
|
||||
}
|
||||
|
||||
public class ClassConfirmationInventory extends GeneratedInventory {
|
||||
public class ClassConfirmationInventory extends GeneratedInventory<PlayerData> {
|
||||
private final PlayerClass profess;
|
||||
private final PluginInventory last;
|
||||
private final boolean subclass;
|
||||
@ -127,7 +132,7 @@ public class ClassConfirmation extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void whenClicked(InventoryClickContext context, InventoryItem item) {
|
||||
public void whenClicked(InventoryClickEvent event, InventoryItem item) {
|
||||
if (item.getFunction().equals("back")) {
|
||||
canClose = true;
|
||||
last.open();
|
||||
|
@ -2,6 +2,10 @@ package net.Indyuce.mmocore.gui;
|
||||
|
||||
import io.lumine.mythic.lib.MythicLib;
|
||||
import io.lumine.mythic.lib.UtilityMethods;
|
||||
import io.lumine.mythic.lib.gui.framework.EditableInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.GeneratedInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.item.InventoryItem;
|
||||
import io.lumine.mythic.lib.gui.framework.item.SimpleItem;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.ConfigMessage;
|
||||
import net.Indyuce.mmocore.api.SoundEvent;
|
||||
@ -9,17 +13,13 @@ 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.NamespacedKey;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||
import org.bukkit.inventory.ItemFlag;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
@ -28,19 +28,17 @@ import org.bukkit.persistence.PersistentDataType;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class ClassSelect extends EditableInventory {
|
||||
public class ClassSelect extends EditableInventory<PlayerData> {
|
||||
public ClassSelect() {
|
||||
super("class-select");
|
||||
}
|
||||
|
||||
@Override
|
||||
public InventoryItem load(String function, ConfigurationSection config) {
|
||||
return function.startsWith("class") ? new ClassItem(config) : new SimplePlaceholderItem(config);
|
||||
public InventoryItem loadItem(String function, ConfigurationSection config) {
|
||||
return function.startsWith("class") ? new ClassItem(config) : new SimpleItem(config);
|
||||
}
|
||||
|
||||
public GeneratedInventory newInventory(PlayerData data) {
|
||||
@ -51,7 +49,7 @@ public class ClassSelect extends EditableInventory {
|
||||
return new ProfessSelectionInventory(data, this, profileRunnable);
|
||||
}
|
||||
|
||||
public class ClassItem extends SimplePlaceholderItem<ProfessSelectionInventory> {
|
||||
public class ClassItem extends SimpleItem<ProfessSelectionInventory> {
|
||||
private final String name;
|
||||
private final List<String> lore;
|
||||
private final PlayerClass playerClass;
|
||||
@ -71,8 +69,8 @@ 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) {
|
||||
ItemStack item = n == 0 ? playerClass.getIcon() : super.getDisplayedItem(inv, n);
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (hideFlags())
|
||||
meta.addItemFlags(ItemFlag.values());
|
||||
@ -100,7 +98,7 @@ public class ClassSelect extends EditableInventory {
|
||||
}
|
||||
}
|
||||
|
||||
public class ProfessSelectionInventory extends GeneratedInventory {
|
||||
public class ProfessSelectionInventory extends GeneratedInventory<PlayerData> {
|
||||
|
||||
@Nullable
|
||||
private final Runnable profileRunnable;
|
||||
@ -108,18 +106,18 @@ public class ClassSelect extends EditableInventory {
|
||||
private boolean canClose;
|
||||
|
||||
public ProfessSelectionInventory(PlayerData playerData, EditableInventory editable, @Nullable Runnable profileRunnable) {
|
||||
super(playerData, editable);
|
||||
super(playerData, editable, null);
|
||||
|
||||
this.profileRunnable = profileRunnable;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String calculateName() {
|
||||
return getName();
|
||||
public String applyNamePlaceholders(String s) {
|
||||
return s;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void whenClicked(InventoryClickContext context, InventoryItem item) {
|
||||
public void whenClicked(InventoryClickEvent event, InventoryItem item) {
|
||||
if (item instanceof ClassItem) {
|
||||
PlayerClass profess = ((ClassItem) item).playerClass;
|
||||
|
||||
@ -153,6 +151,8 @@ public class ClassSelect extends EditableInventory {
|
||||
super.open();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void whenClosed(InventoryCloseEvent event) {
|
||||
if (profileRunnable != null && !canClose)
|
||||
|
@ -3,27 +3,26 @@ 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.framework.EditableInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.GeneratedInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.item.InventoryItem;
|
||||
import io.lumine.mythic.lib.gui.framework.item.Placeholders;
|
||||
import io.lumine.mythic.lib.gui.framework.item.SimpleItem;
|
||||
import io.lumine.mythic.lib.manager.StatManager;
|
||||
import io.lumine.mythic.lib.version.VersionMaterial;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute;
|
||||
import net.Indyuce.mmocore.api.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 net.Indyuce.mmocore.player.stats.StatInfo;
|
||||
import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.SkullMeta;
|
||||
|
||||
@ -34,14 +33,15 @@ public class PlayerStats extends EditableInventory {
|
||||
super("player-stats");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public InventoryItem load(String function, ConfigurationSection config) {
|
||||
public InventoryItem loadItemItem(String function, ConfigurationSection config) {
|
||||
|
||||
if (function.equals("boost"))
|
||||
return new BoostItem(config);
|
||||
|
||||
if (function.equals("boost-next"))
|
||||
return new SimplePlaceholderItem<PlayerStatsInventory>(config) {
|
||||
return new SimpleItem<PlayerStatsInventory>(config) {
|
||||
|
||||
@Override
|
||||
public boolean hasDifferentDisplay() {
|
||||
@ -49,17 +49,17 @@ public class PlayerStats extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canDisplay(PlayerStatsInventory inv) {
|
||||
public boolean isDisplayed(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) {
|
||||
return new SimpleItem<PlayerStatsInventory>(config) {
|
||||
|
||||
@Override
|
||||
public boolean canDisplay(PlayerStatsInventory inv) {
|
||||
public boolean isDisplayed(PlayerStatsInventory inv) {
|
||||
return inv.boostOffset > 0;
|
||||
}
|
||||
};
|
||||
@ -158,7 +158,7 @@ public class PlayerStats extends EditableInventory {
|
||||
}
|
||||
};
|
||||
|
||||
return new SimplePlaceholderItem(config);
|
||||
return new SimpleItem(config);
|
||||
}
|
||||
|
||||
public PlayerStatsInventory newInventory(PlayerData invTarget, PlayerData opening) {
|
||||
@ -169,7 +169,7 @@ public class PlayerStats extends EditableInventory {
|
||||
return new PlayerStatsInventory(player, player, this);
|
||||
}
|
||||
|
||||
public class PlayerStatsInventory extends GeneratedInventory {
|
||||
public class PlayerStatsInventory extends GeneratedInventory<PlayerData> {
|
||||
private final PlayerData target;
|
||||
|
||||
private int boostOffset;
|
||||
@ -191,7 +191,7 @@ public class PlayerStats extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void whenClicked(InventoryClickContext event, InventoryItem item) {
|
||||
public void whenClicked(InventoryClickEvent event, InventoryItem item) {
|
||||
if (item.hasFunction())
|
||||
if (item.getFunction().equals("boost-next")) {
|
||||
boostOffset++;
|
||||
@ -227,7 +227,7 @@ public class PlayerStats extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canDisplay(PlayerStatsInventory inv) {
|
||||
public boolean isDisplayed(PlayerStatsInventory inv) {
|
||||
AbstractParty party = inv.target.getParty();
|
||||
return party != null && party.getOnlineMembers().size() > 1;
|
||||
}
|
||||
@ -239,8 +239,8 @@ public class PlayerStats extends EditableInventory {
|
||||
}
|
||||
|
||||
@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() == VersionMaterial.PLAYER_HEAD.toMaterial()) {
|
||||
SkullMeta meta = (SkullMeta) disp.getItemMeta();
|
||||
inv.dynamicallyUpdateItem(this, n, disp, current -> {
|
||||
@ -280,7 +280,7 @@ public class PlayerStats extends EditableInventory {
|
||||
}
|
||||
}
|
||||
|
||||
public class BoostItem extends SimplePlaceholderItem<PlayerStatsInventory> {
|
||||
public class BoostItem extends SimpleItem<PlayerStatsInventory> {
|
||||
private final InventoryItem noBoost, mainLevel, profession;
|
||||
|
||||
public BoostItem(ConfigurationSection config) {
|
||||
@ -288,7 +288,7 @@ public class PlayerStats extends EditableInventory {
|
||||
|
||||
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");
|
||||
@ -346,13 +346,13 @@ public class PlayerStats extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack display(PlayerStatsInventory inv, int n) {
|
||||
public ItemStack getDisplayedItem(PlayerStatsInventory inv, int n) {
|
||||
int offset = inv.boostOffset;
|
||||
if (n + offset >= MMOCore.plugin.boosterManager.getActive().size())
|
||||
return noBoost.display(inv, n);
|
||||
return noBoost.getDisplayedItem(inv, n);
|
||||
|
||||
Booster boost = MMOCore.plugin.boosterManager.get(inv.boostOffset + n);
|
||||
return amount(boost.hasProfession() ? profession.display(inv, n) : mainLevel.display(inv, n), n + offset + 1);
|
||||
return amount(boost.hasProfession() ? profession.getDisplayedItem(inv, n) : mainLevel.getDisplayedItem(inv, n), n + offset + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,15 +1,14 @@
|
||||
package net.Indyuce.mmocore.gui;
|
||||
|
||||
import io.lumine.mythic.lib.gui.framework.EditableInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.GeneratedInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.item.InventoryItem;
|
||||
import io.lumine.mythic.lib.gui.framework.item.Placeholders;
|
||||
import io.lumine.mythic.lib.gui.framework.item.SimpleItem;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
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 net.Indyuce.mmocore.api.quest.Quest;
|
||||
import net.Indyuce.mmocore.api.SoundEvent;
|
||||
import org.apache.commons.lang.Validate;
|
||||
@ -17,290 +16,293 @@ 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.ItemFlag;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class QuestViewer extends EditableInventory {
|
||||
public QuestViewer() {
|
||||
super("quest-list");
|
||||
}
|
||||
public class QuestViewer extends EditableInventory<PlayerData> {
|
||||
public QuestViewer() {
|
||||
super("quest-list");
|
||||
}
|
||||
|
||||
@Override
|
||||
public InventoryItem load(String function, ConfigurationSection config) {
|
||||
@Override
|
||||
public InventoryItem loadItem(String function, ConfigurationSection config) {
|
||||
|
||||
if (function.equals("quest"))
|
||||
return new QuestItem(config);
|
||||
if (function.equals("quest"))
|
||||
return new QuestItem(config);
|
||||
|
||||
if (function.equals("previous"))
|
||||
return new SimplePlaceholderItem<QuestInventory>(config) {
|
||||
if (function.equals("previous"))
|
||||
return new SimpleItem<QuestInventory>(config) {
|
||||
|
||||
@Override
|
||||
public boolean canDisplay(QuestInventory inv) {
|
||||
return inv.page > 0;
|
||||
}
|
||||
};
|
||||
@Override
|
||||
public boolean isDisplayed(QuestInventory inv) {
|
||||
return inv.page > 0;
|
||||
}
|
||||
};
|
||||
|
||||
if (function.equals("next"))
|
||||
return new SimplePlaceholderItem<QuestInventory>(config) {
|
||||
if (function.equals("next"))
|
||||
return new SimpleItem<QuestInventory>(config) {
|
||||
|
||||
@Override
|
||||
public boolean canDisplay(QuestInventory inv) {
|
||||
return inv.perPage * (inv.page + 1) < inv.quests.size();
|
||||
}
|
||||
};
|
||||
@Override
|
||||
public boolean isDisplayed(QuestInventory inv) {
|
||||
return inv.perPage * (inv.page + 1) < inv.quests.size();
|
||||
}
|
||||
};
|
||||
|
||||
return new SimplePlaceholderItem(config);
|
||||
}
|
||||
return new SimpleItem(config);
|
||||
}
|
||||
|
||||
public GeneratedInventory newInventory(PlayerData data) {
|
||||
return new QuestInventory(data, this);
|
||||
}
|
||||
@Override
|
||||
public GeneratedInventory generate(PlayerData playerData, @Nullable GeneratedInventory generatedInventory) {
|
||||
return new QuestInventory(playerData, this);
|
||||
}
|
||||
|
||||
public class QuestItem extends SimplePlaceholderItem {
|
||||
private final SimplePlaceholderItem noQuest, locked;
|
||||
public class QuestItem extends SimpleItem<QuestInventory> {
|
||||
private final SimpleItem noQuest, locked;
|
||||
|
||||
private final String mainHit, mainNotHit, professionHit, professionNotHit;
|
||||
private final SimpleDateFormat dateFormat;
|
||||
private final String mainHit, mainNotHit, professionHit, professionNotHit;
|
||||
private final SimpleDateFormat dateFormat;
|
||||
|
||||
public QuestItem(ConfigurationSection config) {
|
||||
super(config);
|
||||
public QuestItem(ConfigurationSection config) {
|
||||
super(config);
|
||||
|
||||
Validate.isTrue(config.contains("no-quest"), "Could not load config 'no-quest'");
|
||||
Validate.isTrue(config.contains("locked"), "Could not load config 'locked'");
|
||||
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"));
|
||||
Validate.isTrue(config.contains("date-format"), "Could not find date-format");
|
||||
dateFormat = new SimpleDateFormat(config.getString("date-format"));
|
||||
|
||||
Validate.notNull(mainHit = config.getString("level-requirement.main.hit"), "Could not load 'level-requirement.main.hit'");
|
||||
Validate.notNull(mainNotHit = config.getString("level-requirement.main.not-hit"), "Could not load 'level-requirement.main.not-hit'");
|
||||
Validate.notNull(professionHit = config.getString("level-requirement.profession.hit"),
|
||||
"Could not load 'level-requirement.profession.hit'");
|
||||
Validate.notNull(professionNotHit = config.getString("level-requirement.profession.not-hit"),
|
||||
"Could not load 'level-requirement.profession.not-hit'");
|
||||
}
|
||||
Validate.notNull(mainHit = config.getString("level-requirement.main.hit"), "Could not load 'level-requirement.main.hit'");
|
||||
Validate.notNull(mainNotHit = config.getString("level-requirement.main.not-hit"), "Could not load 'level-requirement.main.not-hit'");
|
||||
Validate.notNull(professionHit = config.getString("level-requirement.profession.hit"),
|
||||
"Could not load 'level-requirement.profession.hit'");
|
||||
Validate.notNull(professionNotHit = config.getString("level-requirement.profession.not-hit"),
|
||||
"Could not load 'level-requirement.profession.not-hit'");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasDifferentDisplay() {
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public boolean hasDifferentDisplay() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack display(GeneratedInventory inv, int n) {
|
||||
@Override
|
||||
public ItemStack getDisplayedItem(QuestInventory inv, int n) {
|
||||
|
||||
QuestInventory list = (QuestInventory) inv;
|
||||
int index = list.page * list.perPage + n;
|
||||
if (index >= list.quests.size())
|
||||
return noQuest.display(inv, n);
|
||||
QuestInventory list = (QuestInventory) inv;
|
||||
int index = list.page * list.perPage + n;
|
||||
if (index >= list.quests.size())
|
||||
return noQuest.getDisplayedItem(inv, n);
|
||||
|
||||
Quest quest = list.quests.get(index);
|
||||
if (quest.hasParent() && !inv.getPlayerData().getQuestData().checkParentAvailability(quest))
|
||||
return locked.display(inv, n);
|
||||
Quest quest = list.quests.get(index);
|
||||
if (quest.hasParent() && !inv.getPlayerData().getQuestData().checkParentAvailability(quest))
|
||||
return locked.getDisplayedItem(inv, n);
|
||||
|
||||
List<String> lore = new ArrayList<>(getLore());
|
||||
List<String> lore = new ArrayList<>(getLore());
|
||||
|
||||
/*
|
||||
* replace quest lore
|
||||
*/
|
||||
index = lore.indexOf("{lore}");
|
||||
if (index >= 0) {
|
||||
lore.remove(index);
|
||||
for (int j = 0; j < quest.getLore().size(); j++)
|
||||
lore.add(index + j, quest.getLore().get(j));
|
||||
}
|
||||
/*
|
||||
* replace quest lore
|
||||
*/
|
||||
index = lore.indexOf("{lore}");
|
||||
if (index >= 0) {
|
||||
lore.remove(index);
|
||||
for (int j = 0; j < quest.getLore().size(); j++)
|
||||
lore.add(index + j, quest.getLore().get(j));
|
||||
}
|
||||
|
||||
/*
|
||||
* calculate quest info 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);
|
||||
/*
|
||||
* calculate quest info 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);
|
||||
|
||||
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("{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)));
|
||||
|
||||
/*
|
||||
* replace level requirements
|
||||
*/
|
||||
index = lore.indexOf("{level_req}{level_requirements}");
|
||||
if (index >= 0) {
|
||||
lore.remove(index);
|
||||
int mainRequired = quest.getLevelRestriction(null);
|
||||
if (mainRequired > 0)
|
||||
lore.add(index, (inv.getPlayerData().getLevel() >= mainRequired ? mainHit : mainNotHit).replace("{level}", "" + mainRequired));
|
||||
/*
|
||||
* replace level requirements
|
||||
*/
|
||||
index = lore.indexOf("{level_req}{level_requirements}");
|
||||
if (index >= 0) {
|
||||
lore.remove(index);
|
||||
int mainRequired = quest.getLevelRestriction(null);
|
||||
if (mainRequired > 0)
|
||||
lore.add(index, (inv.getPlayerData().getLevel() >= mainRequired ? mainHit : mainNotHit).replace("{level}", "" + mainRequired));
|
||||
|
||||
for (Profession profession : quest.getLevelRestrictions()) {
|
||||
int required = quest.getLevelRestriction(profession);
|
||||
lore.add(index + (mainRequired > 0 ? 1 : 0),
|
||||
(inv.getPlayerData().getCollectionSkills().getLevel(profession) >= required ? professionHit : professionNotHit)
|
||||
.replace("{level}", "" + required).replace("{profession}", profession.getName()));
|
||||
}
|
||||
}
|
||||
for (Profession profession : quest.getLevelRestrictions()) {
|
||||
int required = quest.getLevelRestriction(profession);
|
||||
lore.add(index + (mainRequired > 0 ? 1 : 0),
|
||||
(inv.getPlayerData().getCollectionSkills().getLevel(profession) >= required ? professionHit : professionNotHit)
|
||||
.replace("{level}", "" + required).replace("{profession}", profession.getName()));
|
||||
}
|
||||
}
|
||||
|
||||
Placeholders holders = getPlaceholders(inv.getPlayerData(), quest);
|
||||
Placeholders holders = getPlaceholders(inv.getPlayerData(), quest);
|
||||
|
||||
for (int j = 0; j < lore.size(); j++)
|
||||
lore.set(j, ChatColor.GRAY + holders.apply(inv.getPlayer(), lore.get(j)));
|
||||
for (int j = 0; j < lore.size(); j++)
|
||||
lore.set(j, ChatColor.GRAY + holders.apply(inv.getPlayer(), lore.get(j)));
|
||||
|
||||
/*
|
||||
* generate item
|
||||
*/
|
||||
ItemStack item = new ItemStack(getMaterial());
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
meta.setDisplayName(holders.apply(inv.getPlayer(), getName()));
|
||||
meta.addItemFlags(ItemFlag.values());
|
||||
meta.setLore(lore);
|
||||
/*
|
||||
* generate item
|
||||
*/
|
||||
ItemStack item = new ItemStack(getMaterial());
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
meta.setDisplayName(holders.apply(inv.getPlayer(), getName()));
|
||||
meta.addItemFlags(ItemFlag.values());
|
||||
meta.setLore(lore);
|
||||
|
||||
|
||||
meta.getPersistentDataContainer().set(new NamespacedKey(MMOCore.plugin,"quest_id"), PersistentDataType.STRING,quest.getId());
|
||||
item.setItemMeta(meta);
|
||||
meta.getPersistentDataContainer().set(new NamespacedKey(MMOCore.plugin, "quest_id"), PersistentDataType.STRING, quest.getId());
|
||||
item.setItemMeta(meta);
|
||||
|
||||
return item;
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
private Placeholders getPlaceholders(PlayerData data, Quest quest) {
|
||||
Placeholders holders = new Placeholders();
|
||||
holders.register("name", quest.getName());
|
||||
holders.register("total_level_req", quest.getLevelRestrictions().size() + (quest.getLevelRestriction(null) > 0 ? 1 : 0));
|
||||
holders.register("current_level_req", (data.getLevel() >= quest.getLevelRestriction(null) ? 1 : 0) + quest.getLevelRestrictions().stream()
|
||||
.filter(type -> data.getCollectionSkills().getLevel(type) >= quest.getLevelRestriction(type)).collect(Collectors.toSet()).size());
|
||||
private Placeholders getPlaceholders(PlayerData data, Quest quest) {
|
||||
Placeholders holders = new Placeholders();
|
||||
holders.register("name", quest.getName());
|
||||
holders.register("total_level_req", quest.getLevelRestrictions().size() + (quest.getLevelRestriction(null) > 0 ? 1 : 0));
|
||||
holders.register("current_level_req", (data.getLevel() >= quest.getLevelRestriction(null) ? 1 : 0) + quest.getLevelRestrictions().stream()
|
||||
.filter(type -> data.getCollectionSkills().getLevel(type) >= quest.getLevelRestriction(type)).collect(Collectors.toSet()).size());
|
||||
|
||||
if (data.getQuestData().hasCurrent(quest)) {
|
||||
holders.register("objective", data.getQuestData().getCurrent().getFormattedLore());
|
||||
holders.register("progress",
|
||||
(int) ((double) data.getQuestData().getCurrent().getObjectiveNumber() / quest.getObjectives().size() * 100.));
|
||||
}
|
||||
if (data.getQuestData().hasCurrent(quest)) {
|
||||
holders.register("objective", data.getQuestData().getCurrent().getFormattedLore());
|
||||
holders.register("progress",
|
||||
(int) ((double) data.getQuestData().getCurrent().getObjectiveNumber() / quest.getObjectives().size() * 100.));
|
||||
}
|
||||
|
||||
if (data.getQuestData().hasFinished(quest)) {
|
||||
holders.register("date", dateFormat.format(data.getQuestData().getFinishDate(quest)));
|
||||
holders.register("delay", new DelayFormat(2).format(data.getQuestData().getDelayFeft(quest)));
|
||||
}
|
||||
if (data.getQuestData().hasFinished(quest)) {
|
||||
holders.register("date", dateFormat.format(data.getQuestData().getFinishDate(quest)));
|
||||
holders.register("delay", new DelayFormat(2).format(data.getQuestData().getDelayFeft(quest)));
|
||||
}
|
||||
|
||||
return holders;
|
||||
}
|
||||
}
|
||||
return holders;
|
||||
}
|
||||
}
|
||||
|
||||
public class QuestInventory extends GeneratedInventory {
|
||||
private final List<Quest> quests = new ArrayList<>(MMOCore.plugin.questManager.getAll());
|
||||
private final int perPage;
|
||||
public class QuestInventory extends GeneratedInventory<PlayerData> {
|
||||
private final List<Quest> quests = new ArrayList<>(MMOCore.plugin.questManager.getAll());
|
||||
private final int perPage;
|
||||
|
||||
private int page;
|
||||
private int page;
|
||||
|
||||
public QuestInventory(PlayerData playerData, EditableInventory editable) {
|
||||
super(playerData, editable);
|
||||
public QuestInventory(PlayerData playerData, EditableInventory editable) {
|
||||
super(playerData, editable);
|
||||
|
||||
perPage = editable.getByFunction("quest").getSlots().size();
|
||||
}
|
||||
perPage = editable.getByFunction("quest").getSlots().size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String calculateName() {
|
||||
return getName();
|
||||
}
|
||||
@Override
|
||||
public String applyNamePlaceholders(String s) {
|
||||
return s;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void whenClicked(InventoryClickContext context, InventoryItem item) {
|
||||
if (item.getFunction().equals("previous")) {
|
||||
page--;
|
||||
open();
|
||||
return;
|
||||
}
|
||||
@Override
|
||||
public void whenClicked(InventoryClickEvent event, InventoryItem item) {
|
||||
if (item.getFunction().equals("previous")) {
|
||||
page--;
|
||||
open();
|
||||
return;
|
||||
}
|
||||
|
||||
if (item.getFunction().equals("next")) {
|
||||
page++;
|
||||
open();
|
||||
return;
|
||||
}
|
||||
if (item.getFunction().equals("next")) {
|
||||
page++;
|
||||
open();
|
||||
return;
|
||||
}
|
||||
|
||||
if (item.getFunction().equals("quest")) {
|
||||
String questId = context.getClickedItem().getItemMeta().getPersistentDataContainer()
|
||||
.get(new NamespacedKey(MMOCore.plugin,"quest_id"), PersistentDataType.STRING);
|
||||
if (questId==null||questId.equals(""))
|
||||
return;
|
||||
if (item.getFunction().equals("quest")) {
|
||||
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);
|
||||
Quest quest = MMOCore.plugin.questManager.get(questId);
|
||||
|
||||
if (playerData.getQuestData().hasCurrent()) {
|
||||
if (playerData.getQuestData().hasCurrent()) {
|
||||
|
||||
/*
|
||||
* check if the player is cancelling his ongoing quest.
|
||||
*/
|
||||
if (playerData.getQuestData().hasCurrent(quest)) {
|
||||
if (context.getClickType() == ClickType.RIGHT) {
|
||||
playerData.getQuestData().start(null);
|
||||
MMOCore.plugin.soundManager.getSound(SoundEvent.CANCEL_QUEST).playTo(player);
|
||||
MMOCore.plugin.configManager.getSimpleMessage("cancel-quest").send(player);
|
||||
open();
|
||||
}
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* check if the player is cancelling his ongoing quest.
|
||||
*/
|
||||
if (playerData.getQuestData().hasCurrent(quest)) {
|
||||
if (event.getClick() == ClickType.RIGHT) {
|
||||
playerData.getQuestData().start(null);
|
||||
MMOCore.plugin.soundManager.getSound(SoundEvent.CANCEL_QUEST).playTo(player);
|
||||
MMOCore.plugin.configManager.getSimpleMessage("cancel-quest").send(player);
|
||||
open();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* the player cannot start a new quest if he is already
|
||||
* doing one.
|
||||
*/
|
||||
MMOCore.plugin.configManager.getSimpleMessage("already-on-quest").send(player);
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* the player cannot start a new quest if he is already
|
||||
* doing one.
|
||||
*/
|
||||
MMOCore.plugin.configManager.getSimpleMessage("already-on-quest").send(player);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* check for level requirements.
|
||||
*/
|
||||
int level;
|
||||
if (playerData.getLevel() < (level = quest.getLevelRestriction(null))) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("quest-level-restriction", "level", "Lvl", "count", "" + level).send(player);
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* check for level requirements.
|
||||
*/
|
||||
int level;
|
||||
if (playerData.getLevel() < (level = quest.getLevelRestriction(null))) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("quest-level-restriction", "level", "Lvl", "count", "" + level).send(player);
|
||||
return;
|
||||
}
|
||||
|
||||
for (Profession profession : quest.getLevelRestrictions())
|
||||
if (playerData.getCollectionSkills().getLevel(profession) < (level = quest.getLevelRestriction(profession))) {
|
||||
MMOCore.plugin.configManager
|
||||
.getSimpleMessage("quest-level-restriction", "level", profession.getName() + " Lvl", "count", "" + level)
|
||||
.send(player);
|
||||
return;
|
||||
}
|
||||
for (Profession profession : quest.getLevelRestrictions())
|
||||
if (playerData.getCollectionSkills().getLevel(profession) < (level = quest.getLevelRestriction(profession))) {
|
||||
MMOCore.plugin.configManager
|
||||
.getSimpleMessage("quest-level-restriction", "level", profession.getName() + " Lvl", "count", "" + level)
|
||||
.send(player);
|
||||
return;
|
||||
}
|
||||
|
||||
if (playerData.getQuestData().hasFinished(quest)) {
|
||||
if (playerData.getQuestData().hasFinished(quest)) {
|
||||
|
||||
/*
|
||||
* if the player has already finished this quest, he can't
|
||||
* start it again.
|
||||
*/
|
||||
if (!quest.isRedoable()) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("cant-redo-quest").send(player);
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* if the player has already finished this quest, he can't
|
||||
* start it again.
|
||||
*/
|
||||
if (!quest.isRedoable()) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("cant-redo-quest").send(player);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
if (!playerData.getQuestData().checkCooldownAvailability(quest)) {
|
||||
MMOCore.plugin.configManager
|
||||
.getSimpleMessage("quest-cooldown", "delay", new DelayFormat(2).format(playerData.getQuestData().getDelayFeft(quest)))
|
||||
.send(player);
|
||||
return;
|
||||
}
|
||||
}
|
||||
/*
|
||||
*
|
||||
*/
|
||||
if (!playerData.getQuestData().checkCooldownAvailability(quest)) {
|
||||
MMOCore.plugin.configManager
|
||||
.getSimpleMessage("quest-cooldown", "delay", new DelayFormat(2).format(playerData.getQuestData().getDelayFeft(quest)))
|
||||
.send(player);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* eventually start a new quest.
|
||||
*/
|
||||
MMOCore.plugin.configManager.getSimpleMessage("start-quest", "quest", quest.getName()).send(player);
|
||||
MMOCore.plugin.soundManager.getSound(SoundEvent.START_QUEST).playTo(player);
|
||||
playerData.getQuestData().start(quest);
|
||||
open();
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
* eventually start a new quest.
|
||||
*/
|
||||
MMOCore.plugin.configManager.getSimpleMessage("start-quest", "quest", quest.getName()).send(player);
|
||||
MMOCore.plugin.soundManager.getSound(SoundEvent.START_QUEST).playTo(player);
|
||||
playerData.getQuestData().start(quest);
|
||||
open();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,17 +3,16 @@ 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.framework.EditableInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.GeneratedInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.item.InventoryItem;
|
||||
import io.lumine.mythic.lib.gui.framework.item.Placeholders;
|
||||
import io.lumine.mythic.lib.gui.framework.item.SimpleItem;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.SoundEvent;
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import net.Indyuce.mmocore.skill.binding.SkillSlot;
|
||||
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 org.apache.commons.lang.Validate;
|
||||
@ -22,6 +21,7 @@ import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
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;
|
||||
@ -34,13 +34,13 @@ import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class SkillList extends EditableInventory {
|
||||
public class SkillList extends EditableInventory<PlayerData> {
|
||||
public SkillList() {
|
||||
super("skill-list");
|
||||
}
|
||||
|
||||
@Override
|
||||
public InventoryItem load(String function, ConfigurationSection config) {
|
||||
public InventoryItem loadItem(String function, ConfigurationSection config) {
|
||||
|
||||
if (function.equals("skill"))
|
||||
return new SkillItem(config);
|
||||
@ -53,10 +53,10 @@ public class SkillList extends EditableInventory {
|
||||
|
||||
if (function.equals("reallocation")) {
|
||||
|
||||
return new InventoryItem(config) {
|
||||
return new InventoryItem<SkillViewerInventory>(config) {
|
||||
|
||||
@Override
|
||||
public Placeholders getPlaceholders(GeneratedInventory inv, int n) {
|
||||
public Placeholders getPlaceholders(SkillViewerInventory inv, int n) {
|
||||
Placeholders holders = new Placeholders();
|
||||
holders.register("skill_points", inv.getPlayerData().getSkillPoints());
|
||||
holders.register("points", inv.getPlayerData().getSkillReallocationPoints());
|
||||
@ -70,19 +70,19 @@ public class SkillList extends EditableInventory {
|
||||
return new SlotItem(config);
|
||||
|
||||
if (function.equals("previous"))
|
||||
return new SimplePlaceholderItem<SkillViewerInventory>(config) {
|
||||
return new SimpleItem<SkillViewerInventory>(config) {
|
||||
|
||||
@Override
|
||||
public boolean canDisplay(SkillViewerInventory inv) {
|
||||
public boolean isDisplayed(SkillViewerInventory inv) {
|
||||
return inv.page > 0;
|
||||
}
|
||||
};
|
||||
|
||||
if (function.equals("next")) {
|
||||
return new SimplePlaceholderItem<SkillViewerInventory>(config) {
|
||||
return new SimpleItem<SkillViewerInventory>(config) {
|
||||
|
||||
@Override
|
||||
public boolean canDisplay(SkillViewerInventory inv) {
|
||||
public boolean isDisplayed(SkillViewerInventory inv) {
|
||||
final int perPage = inv.skillSlots.size();
|
||||
return inv.page < (inv.skills.size() - 1) / perPage;
|
||||
}
|
||||
@ -91,21 +91,22 @@ public class SkillList extends EditableInventory {
|
||||
if (function.equals("selected"))
|
||||
return new SelectedItem(config);
|
||||
|
||||
return new SimplePlaceholderItem(config);
|
||||
return new SimpleItem(config);
|
||||
}
|
||||
|
||||
public GeneratedInventory newInventory(PlayerData data) {
|
||||
return new SkillViewerInventory(data, this);
|
||||
@Override
|
||||
public GeneratedInventory generate(PlayerData playerData, @Nullable GeneratedInventory previousInventory) {
|
||||
return new SkillViewerInventory(playerData, this);
|
||||
}
|
||||
|
||||
public class SelectedItem extends InventoryItem<SkillViewerInventory> {
|
||||
public SelectedItem(ConfigurationSection config) {
|
||||
//We must use this constructor to show that there are not specified material
|
||||
super(Material.BARRIER, config);
|
||||
super(config, Material.BARRIER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack display(SkillViewerInventory inv, int n) {
|
||||
public ItemStack getDisplayedItem(SkillViewerInventory inv, int n) {
|
||||
if (inv.selected == null)
|
||||
return new ItemStack(Material.AIR);
|
||||
Placeholders holders = getPlaceholders(inv, n);
|
||||
@ -159,7 +160,7 @@ public class SkillList extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack display(SkillViewerInventory inv, int n) {
|
||||
public ItemStack getDisplayedItem(SkillViewerInventory inv, int n) {
|
||||
|
||||
ClassSkill skill = inv.selected;
|
||||
int skillLevel = inv.getPlayerData().getSkillLevel(skill.getSkill()) + n - offset;
|
||||
@ -211,7 +212,7 @@ public class SkillList extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack display(SkillViewerInventory inv, int n) {
|
||||
public ItemStack getDisplayedItem(SkillViewerInventory inv, int n) {
|
||||
final @NotNull SkillSlot skillSlot = inv.getPlayerData().getProfess().getSkillSlot(n + 1);
|
||||
if (!inv.getPlayerData().hasUnlocked(skillSlot))
|
||||
return new ItemStack(Material.AIR);
|
||||
@ -219,7 +220,7 @@ public class SkillList extends EditableInventory {
|
||||
final @Nullable ClassSkill boundSkill = inv.getPlayerData().getBoundSkill(n + 1);
|
||||
ItemStack item;
|
||||
if (boundSkill == null)
|
||||
item = super.display(inv, n);
|
||||
item = super.getDisplayedItem(inv, n);
|
||||
else if (filledItem == null)
|
||||
item = boundSkill.getSkill().getIcon();
|
||||
else {
|
||||
@ -280,7 +281,7 @@ public class SkillList extends EditableInventory {
|
||||
|
||||
public class SkillItem extends InventoryItem<SkillViewerInventory> {
|
||||
public SkillItem(ConfigurationSection config) {
|
||||
super(Material.BARRIER, config);
|
||||
super(config, Material.BARRIER);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -289,7 +290,7 @@ public class SkillList extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack display(SkillViewerInventory inv, int n) {
|
||||
public ItemStack getDisplayedItem(SkillViewerInventory inv, int n) {
|
||||
|
||||
// Calculate placeholders
|
||||
int index = n + inv.skillSlots.size() * inv.page;
|
||||
@ -366,7 +367,7 @@ public class SkillList extends EditableInventory {
|
||||
}
|
||||
}
|
||||
|
||||
public class SkillViewerInventory extends GeneratedInventory {
|
||||
public class SkillViewerInventory extends GeneratedInventory<PlayerData> {
|
||||
|
||||
// Cached information
|
||||
private final List<ClassSkill> skills;
|
||||
@ -392,20 +393,21 @@ public class SkillList extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String calculateName() {
|
||||
return getName().replace("{skill}", selected.getSkill().getName());
|
||||
public String applyNamePlaceholders(String s) {
|
||||
return s.replace("{skill}", selected.getSkill().getName());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void open() {
|
||||
super.open();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void whenClicked(InventoryClickContext context, InventoryItem item) {
|
||||
public void whenClicked(InventoryClickEvent event, InventoryItem item) {
|
||||
|
||||
if (item.getFunction().equals("skill")) {
|
||||
int index = skillSlots.size() * page + skillSlots.indexOf(context.getSlot());
|
||||
int index = skillSlots.size() * page + skillSlots.indexOf(event.getSlot());
|
||||
player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1, 2);
|
||||
selected = skills.get(index);
|
||||
open();
|
||||
@ -453,17 +455,17 @@ public class SkillList extends EditableInventory {
|
||||
|
||||
// Binding or unbinding skills.
|
||||
if (item.getFunction().equals("slot")) {
|
||||
int index = slotSlots.indexOf(context.getSlot()) + 1;
|
||||
int index = slotSlots.indexOf(event.getSlot()) + 1;
|
||||
SkillSlot skillSlot = playerData.getProfess().getSkillSlot(index);
|
||||
//Select if the player is doing Shift Left Click
|
||||
if (context.getClickType() == ClickType.SHIFT_LEFT) {
|
||||
if (event.getClick() == ClickType.SHIFT_LEFT) {
|
||||
if (playerData.hasSkillBound(index))
|
||||
selected = playerData.getBoundSkill(index);
|
||||
return;
|
||||
}
|
||||
|
||||
// unbind if there is a current spell.
|
||||
if (context.getClickType() == ClickType.RIGHT) {
|
||||
if (event.getClick() == ClickType.RIGHT) {
|
||||
if (!playerData.hasSkillBound(index)) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("no-skill-bound").send(player);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 2);
|
||||
@ -526,7 +528,7 @@ public class SkillList extends EditableInventory {
|
||||
return;
|
||||
}
|
||||
|
||||
if (context.getClickType().isShiftClick()) {
|
||||
if (event.getClick().isShiftClick()) {
|
||||
if (playerData.getSkillPoints() < shiftCost) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("not-enough-skill-points-shift", "shift_points", "" + shiftCost).send(player);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 2);
|
||||
|
@ -2,49 +2,50 @@ package net.Indyuce.mmocore.gui;
|
||||
|
||||
import io.lumine.mythic.lib.MythicLib;
|
||||
import io.lumine.mythic.lib.UtilityMethods;
|
||||
import io.lumine.mythic.lib.data.SynchronizedDataHolder;
|
||||
import io.lumine.mythic.lib.gui.framework.EditableInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.GeneratedInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.item.InventoryItem;
|
||||
import io.lumine.mythic.lib.gui.framework.item.SimpleItem;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import net.Indyuce.mmocore.api.player.profess.ClassOption;
|
||||
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.api.player.profess.PlayerClass;
|
||||
import net.Indyuce.mmocore.api.ConfigMessage;
|
||||
import net.Indyuce.mmocore.api.SoundEvent;
|
||||
import net.Indyuce.mmocore.api.player.profess.Subclass;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
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.PersistentDataType;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class SubclassSelect extends EditableInventory {
|
||||
public class SubclassSelect extends EditableInventory<PlayerData> {
|
||||
public SubclassSelect() {
|
||||
super("subclass-select");
|
||||
}
|
||||
|
||||
@Override
|
||||
public InventoryItem load(String function, ConfigurationSection config) {
|
||||
return function.startsWith("sub-class") ? new ClassItem(config) : new SimplePlaceholderItem(config);
|
||||
public InventoryItem loadItemItem(String function, ConfigurationSection config) {
|
||||
return function.startsWith("sub-class") ? new ClassItem(config) : new SimpleItem(config);
|
||||
}
|
||||
|
||||
public GeneratedInventory newInventory(PlayerData data) {
|
||||
return new SubclassSelectionInventory(data, this);
|
||||
|
||||
@Override
|
||||
public GeneratedInventory generate(PlayerData playerData, @Nullable GeneratedInventory generatedInventory) {
|
||||
return new SubclassSelectionInventory(playerData, this);
|
||||
}
|
||||
|
||||
public class ClassItem extends SimplePlaceholderItem<SubclassSelectionInventory> {
|
||||
public class ClassItem extends SimpleItem<SubclassSelectionInventory> {
|
||||
private final String name;
|
||||
private final List<String> lore;
|
||||
private final PlayerClass playerClass;
|
||||
@ -63,8 +64,8 @@ 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) {
|
||||
ItemStack item = n == 0 ? playerClass.getIcon() : super.getDisplayedItem(inv, n);
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (hideFlags())
|
||||
meta.addItemFlags(ItemFlag.values());
|
||||
@ -92,7 +93,7 @@ public class SubclassSelect extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canDisplay(SubclassSelectionInventory inv) {
|
||||
public boolean isDisplayed(SubclassSelectionInventory inv) {
|
||||
return inv.getPlayerData()
|
||||
.getProfess()
|
||||
.getSubclasses()
|
||||
@ -102,18 +103,18 @@ public class SubclassSelect extends EditableInventory {
|
||||
}
|
||||
}
|
||||
|
||||
public class SubclassSelectionInventory extends GeneratedInventory {
|
||||
public class SubclassSelectionInventory extends GeneratedInventory<PlayerData> {
|
||||
public SubclassSelectionInventory(PlayerData playerData, EditableInventory editable) {
|
||||
super(playerData, editable);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String calculateName() {
|
||||
return getName();
|
||||
public String applyNamePlaceholders(String s) {
|
||||
return MythicLib.plugin.getPlaceholderParser().parse(player, s);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void whenClicked(InventoryClickContext context, InventoryItem item) {
|
||||
public void whenClicked(InventoryClickEvent event, InventoryItem item) {
|
||||
if (item.getFunction().equals("back"))
|
||||
InventoryManager.CLASS_SELECT.newInventory(playerData).open();
|
||||
|
||||
|
@ -1,20 +1,20 @@
|
||||
package net.Indyuce.mmocore.gui;
|
||||
|
||||
import io.lumine.mythic.lib.gui.framework.EditableInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.GeneratedInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.item.InventoryItem;
|
||||
import io.lumine.mythic.lib.gui.framework.item.Placeholders;
|
||||
import io.lumine.mythic.lib.gui.framework.item.SimpleItem;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.player.PlayerActivity;
|
||||
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.waypoint.Waypoint;
|
||||
import net.Indyuce.mmocore.waypoint.WaypointPath;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.NamespacedKey;
|
||||
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;
|
||||
@ -26,36 +26,36 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class WaypointViewer extends EditableInventory {
|
||||
public class WaypointViewer extends EditableInventory<PlayerData> {
|
||||
public WaypointViewer() {
|
||||
super("waypoints");
|
||||
}
|
||||
|
||||
@Override
|
||||
public InventoryItem load(String function, ConfigurationSection config) {
|
||||
public InventoryItem loadItem(String function, ConfigurationSection config) {
|
||||
|
||||
if (function.equals("waypoint"))
|
||||
return new WaypointItem(config);
|
||||
|
||||
if (function.equals("previous"))
|
||||
return new SimplePlaceholderItem<WaypointViewerInventory>(config) {
|
||||
return new SimpleItem<WaypointViewerInventory>(config) {
|
||||
|
||||
@Override
|
||||
public boolean canDisplay(WaypointViewerInventory inv) {
|
||||
public boolean isDisplayed(WaypointViewerInventory inv) {
|
||||
return inv.page > 0;
|
||||
}
|
||||
};
|
||||
|
||||
if (function.equals("next"))
|
||||
return new SimplePlaceholderItem<WaypointViewerInventory>(config) {
|
||||
return new SimpleItem<WaypointViewerInventory>(config) {
|
||||
|
||||
@Override
|
||||
public boolean canDisplay(WaypointViewerInventory inv) {
|
||||
public boolean isDisplayed(WaypointViewerInventory inv) {
|
||||
return inv.getEditable().getByFunction("waypoint").getSlots().size() * (inv.page + 1) < inv.waypoints.size();
|
||||
}
|
||||
};
|
||||
|
||||
return new SimplePlaceholderItem(config);
|
||||
return new SimpleItem(config);
|
||||
}
|
||||
|
||||
public GeneratedInventory newInventory(PlayerData data) {
|
||||
@ -66,8 +66,8 @@ 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 SimpleItem<WaypointViewerInventory> {
|
||||
private final SimpleItem noWaypoint, locked;
|
||||
private final WaypointItemHandler availWaypoint, noStellium, notLinked, notDynamic, currentWayPoint;
|
||||
|
||||
public WaypointItem(ConfigurationSection config) {
|
||||
@ -81,8 +81,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);
|
||||
@ -96,33 +96,33 @@ 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);
|
||||
|
||||
// Locked waypoint?
|
||||
Waypoint waypoint = inv.waypoints.get(index);
|
||||
if (inv.current != null && inv.current.equals(waypoint))
|
||||
return currentWayPoint.display(inv, n);
|
||||
return currentWayPoint.getDisplayedItem(inv, n);
|
||||
|
||||
if (!inv.getPlayerData().hasWaypoint(waypoint))
|
||||
return locked.display(inv, n);
|
||||
return locked.getDisplayedItem(inv, n);
|
||||
|
||||
// Waypoints are not linked
|
||||
if (inv.current != null && !inv.paths.containsKey(waypoint))
|
||||
return notLinked.display(inv, n);
|
||||
return notLinked.getDisplayedItem(inv, n);
|
||||
|
||||
// Not dynamic waypoint
|
||||
if (inv.current == null && !inv.paths.containsKey(waypoint))
|
||||
return notDynamic.display(inv, n);
|
||||
return notDynamic.getDisplayedItem(inv, n);
|
||||
|
||||
//Normal cost
|
||||
if (inv.paths.get(waypoint).getCost() > inv.getPlayerData().getStellium())
|
||||
return noStellium.display(inv, n);
|
||||
return noStellium.getDisplayedItem(inv, n);
|
||||
|
||||
return availWaypoint.display(inv, n);
|
||||
return availWaypoint.getDisplayedItem(inv, n);
|
||||
}
|
||||
}
|
||||
|
||||
@ -135,8 +135,8 @@ public class WaypointViewer extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack display(WaypointViewerInventory inv, int n) {
|
||||
ItemStack disp = super.display(inv, n);
|
||||
public ItemStack getDisplayedItem(WaypointViewerInventory inv, int n) {
|
||||
ItemStack disp = super.getDisplayedItem(inv, n);
|
||||
|
||||
// If a player can teleport to another waypoint given his location
|
||||
Waypoint waypoint = inv.waypoints.get(inv.page * inv.getEditable().getByFunction("waypoint").getSlots().size() + n);
|
||||
@ -173,7 +173,7 @@ public class WaypointViewer extends EditableInventory {
|
||||
}
|
||||
}
|
||||
|
||||
public class WaypointViewerInventory extends GeneratedInventory {
|
||||
public class WaypointViewerInventory extends GeneratedInventory<PlayerData> {
|
||||
private final List<Waypoint> waypoints = new ArrayList<>(MMOCore.plugin.waypointManager.getAll());
|
||||
@Nullable
|
||||
private final Waypoint current;
|
||||
@ -220,7 +220,7 @@ public class WaypointViewer extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void whenClicked(InventoryClickContext context, InventoryItem item) {
|
||||
public void whenClicked(InventoryClickEvent event, InventoryItem item) {
|
||||
if (item.getFunction().equals("next")) {
|
||||
page++;
|
||||
open();
|
||||
@ -234,7 +234,7 @@ public class WaypointViewer extends EditableInventory {
|
||||
}
|
||||
|
||||
if (item.getFunction().equals("waypoint")) {
|
||||
PersistentDataContainer container = context.getClickedItem().getItemMeta().getPersistentDataContainer();
|
||||
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) : "";
|
||||
|
||||
|
@ -1,106 +0,0 @@
|
||||
package net.Indyuce.mmocore.gui.api;
|
||||
|
||||
import io.lumine.mythic.lib.MythicLib;
|
||||
import io.lumine.mythic.lib.UtilityMethods;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.gui.api.adaptor.AdaptorType;
|
||||
import net.Indyuce.mmocore.gui.api.item.InventoryItem;
|
||||
import net.Indyuce.mmocore.gui.api.item.TriggerItem;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Level;
|
||||
|
||||
public abstract class EditableInventory {
|
||||
private final String id;
|
||||
|
||||
private FileConfiguration config;
|
||||
private AdaptorType adaptorType;
|
||||
private String name;
|
||||
private int slots;
|
||||
|
||||
/*
|
||||
* This set is linked so it keeps the order/priority in
|
||||
* which the items are loaded from the config.
|
||||
*/
|
||||
private final Set<InventoryItem> items = new LinkedHashSet<>();
|
||||
|
||||
protected static final DecimalFormat decimal = MythicLib.plugin.getMMOConfig().decimal;
|
||||
|
||||
public EditableInventory(String id) {
|
||||
this.id = id;
|
||||
Validate.notNull(id, "ID must not be null");
|
||||
}
|
||||
|
||||
public void reload(FileConfiguration config) {
|
||||
this.config = config;
|
||||
this.adaptorType = AdaptorType.valueOf(UtilityMethods.enumName(config.getString("adaptor-type", "classic-adaptor")));
|
||||
Validate.notNull(adaptorType, config.getString("adaptor-type") + " does not correspond to an adaptor-type.");//TODO
|
||||
|
||||
this.name = config.getString("name");
|
||||
Validate.notNull(name, "Name must not be null");
|
||||
|
||||
this.slots = Math.min(Math.max(9, config.getInt("slots")), 54);
|
||||
Validate.isTrue((slots % 9) == 0, "Slots must be a multiple of 9");
|
||||
|
||||
items.clear();
|
||||
if (config.contains("items")) {
|
||||
Validate.notNull(config.getConfigurationSection("items"), "Could not load item list");
|
||||
for (String key : config.getConfigurationSection("items").getKeys(false))
|
||||
try {
|
||||
ConfigurationSection section = config.getConfigurationSection("items." + key);
|
||||
Validate.notNull(section, "Could not load config");
|
||||
InventoryItem loaded = loadInventoryItem(section);
|
||||
items.add(loaded);
|
||||
} catch (IllegalArgumentException exception) {
|
||||
MMOCore.log(Level.WARNING, "Could not load item '" + key + "' from inventory '" + getId() + "': " + exception.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public Set<InventoryItem> getItems() {
|
||||
return items;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public int getSlots() {
|
||||
return slots;
|
||||
}
|
||||
|
||||
public AdaptorType getAdaptorType() {
|
||||
return adaptorType;
|
||||
}
|
||||
|
||||
public FileConfiguration getConfig() {
|
||||
return config;
|
||||
}
|
||||
|
||||
public InventoryItem getByFunction(String function) {
|
||||
for (InventoryItem item : items)
|
||||
if (item.getFunction().equals(function))
|
||||
return item;
|
||||
return null;
|
||||
}
|
||||
|
||||
public abstract InventoryItem load(String function, ConfigurationSection config);
|
||||
|
||||
private InventoryItem loadInventoryItem(ConfigurationSection config) {
|
||||
String function = config.contains("function") ? config.getString("function").toLowerCase() : "";
|
||||
|
||||
if (function.startsWith("trigger:"))
|
||||
return new TriggerItem(config, function.substring(8));
|
||||
|
||||
return load(function, config);
|
||||
}
|
||||
}
|
@ -1,107 +0,0 @@
|
||||
package net.Indyuce.mmocore.gui.api;
|
||||
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import net.Indyuce.mmocore.gui.api.adaptor.Adaptor;
|
||||
import net.Indyuce.mmocore.gui.api.adaptor.ClassicAdaptor;
|
||||
import net.Indyuce.mmocore.gui.api.item.InventoryItem;
|
||||
import net.Indyuce.mmocore.gui.api.item.TriggerItem;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public abstract class GeneratedInventory extends PluginInventory {
|
||||
private final EditableInventory editable;
|
||||
private final List<InventoryItem> loaded = new ArrayList<>();
|
||||
private final Adaptor adaptor;
|
||||
|
||||
public GeneratedInventory(PlayerData playerData, EditableInventory editable) {
|
||||
super(playerData);
|
||||
|
||||
this.editable = editable;
|
||||
this.adaptor = editable.getAdaptorType().supply(this);
|
||||
}
|
||||
|
||||
public List<InventoryItem> getLoaded() {
|
||||
return loaded;
|
||||
}
|
||||
|
||||
public EditableInventory getEditable() {
|
||||
|
||||
return editable;
|
||||
}
|
||||
|
||||
public InventoryItem getByFunction(String function) {
|
||||
for (InventoryItem item : loaded)
|
||||
if (item.getFunction().equals(function))
|
||||
return item;
|
||||
return null;
|
||||
}
|
||||
|
||||
public InventoryItem getBySlot(int slot) {
|
||||
for (InventoryItem item : loaded)
|
||||
if (item.getSlots().contains(slot))
|
||||
return item;
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method must use an ordered collection because
|
||||
* of GUI items overriding possibilities. Hence the use
|
||||
* of an array list instead of a set
|
||||
*/
|
||||
public void addLoaded(InventoryItem item) {
|
||||
loaded.add(0, item);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Inventory getInventory() {
|
||||
Validate.isTrue(adaptor instanceof ClassicAdaptor);
|
||||
return ((ClassicAdaptor) adaptor).getInventory();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void open() {
|
||||
if (!getPlayerData().isOnline()) return;
|
||||
|
||||
/*
|
||||
* Very important, in order to prevent ghost items, the loaded items map
|
||||
* must be cleared when the inventory is updated or open at least twice
|
||||
*/
|
||||
loaded.clear();
|
||||
|
||||
adaptor.open();
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Not a fan of that implementation.
|
||||
* Better work with {@link InventoryItem#setDisplayed(Inventory, GeneratedInventory)}
|
||||
*/
|
||||
@Deprecated
|
||||
public void dynamicallyUpdateItem(InventoryItem<?> item, int n, ItemStack placed, Consumer<ItemStack> update) {
|
||||
adaptor.dynamicallyUpdateItem(item, n, placed, update);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void whenClicked(InventoryClickContext context) {
|
||||
context.setCancelled(true);
|
||||
InventoryItem item = getBySlot(context.getSlot());
|
||||
//Checks that the click corresponds to a GUI Item.
|
||||
if (item == null || context.getClickedItem() == null || context.getClickedItem().getType() == Material.AIR)
|
||||
return;
|
||||
|
||||
if (item instanceof TriggerItem)
|
||||
((TriggerItem) item).getTrigger().apply(getPlayerData());
|
||||
else
|
||||
whenClicked(context, item);
|
||||
}
|
||||
|
||||
public abstract String calculateName();
|
||||
|
||||
public abstract void whenClicked(@NotNull InventoryClickContext context, @NotNull InventoryItem item);
|
||||
}
|
@ -1,80 +0,0 @@
|
||||
package net.Indyuce.mmocore.gui.api;
|
||||
|
||||
import org.bukkit.event.Cancellable;
|
||||
import org.bukkit.event.inventory.ClickType;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class InventoryClickContext {
|
||||
private final int slot;
|
||||
private final ClickType clickType;
|
||||
private final Cancellable event;
|
||||
|
||||
@Nullable
|
||||
private final ItemStack currentItem;
|
||||
|
||||
@Nullable
|
||||
private final Inventory inv;
|
||||
private final PluginInventory invHolder;
|
||||
|
||||
public InventoryClickContext(int slot, ItemStack currentItem, ClickType clickType, Cancellable event) {
|
||||
this(slot, currentItem, clickType, event, null, null);
|
||||
}
|
||||
|
||||
public InventoryClickContext(int slot, @Nullable ItemStack currentItem, ClickType clickType, Cancellable event, @Nullable Inventory inv, @Nullable PluginInventory invHolder) {
|
||||
this.slot = slot;
|
||||
this.currentItem = currentItem;
|
||||
this.clickType = clickType;
|
||||
this.event = event;
|
||||
this.inv = inv;
|
||||
this.invHolder = invHolder;
|
||||
}
|
||||
|
||||
public void setCancelled(boolean val) {
|
||||
event.setCancelled(val);
|
||||
}
|
||||
|
||||
public boolean isCancelled() {
|
||||
return event.isCancelled();
|
||||
}
|
||||
|
||||
public int getSlot() {
|
||||
return slot;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The Bukkit InventoryClickEvent's current item. This is the item
|
||||
* which the player just clicked on. The item on the player's
|
||||
* cursor is NOT provided by click contexts
|
||||
*/
|
||||
@Nullable
|
||||
public ItemStack getClickedItem() {
|
||||
return currentItem;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Cancellable getEvent() {
|
||||
return event;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Inventory getInventory() {
|
||||
return inv;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public PluginInventory getInventoryHolder() {
|
||||
return invHolder;
|
||||
}
|
||||
|
||||
public boolean isClassic() {
|
||||
return inv != null;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public ClickType getClickType() {
|
||||
return clickType;
|
||||
}
|
||||
}
|
@ -1,40 +0,0 @@
|
||||
package net.Indyuce.mmocore.gui.api;
|
||||
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
|
||||
public abstract class PluginInventory implements InventoryHolder {
|
||||
protected final Player player;
|
||||
protected final PlayerData playerData;
|
||||
|
||||
public PluginInventory(Player player) {
|
||||
this.player = player;
|
||||
this.playerData = player.getOpenInventory() != null && player.getOpenInventory().getTopInventory().getHolder() instanceof PluginInventory ?
|
||||
((PluginInventory) player.getOpenInventory().getTopInventory().getHolder()).playerData : PlayerData.get(player);
|
||||
}
|
||||
|
||||
public PluginInventory(PlayerData playerData) {
|
||||
this.player = playerData.getPlayer();
|
||||
this.playerData = playerData;
|
||||
}
|
||||
|
||||
public PlayerData getPlayerData() {
|
||||
return playerData;
|
||||
}
|
||||
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
public void open() {
|
||||
getPlayer().openInventory(getInventory());
|
||||
}
|
||||
|
||||
public abstract void whenClicked(InventoryClickContext context);
|
||||
|
||||
public void whenClosed(InventoryCloseEvent event) {
|
||||
// Nothing by default
|
||||
}
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
package net.Indyuce.mmocore.gui.api.adaptor;
|
||||
|
||||
import net.Indyuce.mmocore.gui.api.GeneratedInventory;
|
||||
import net.Indyuce.mmocore.gui.api.item.InventoryItem;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public abstract class Adaptor {
|
||||
protected final GeneratedInventory generated;
|
||||
|
||||
public Adaptor(GeneratedInventory generated) {
|
||||
this.generated = generated;
|
||||
}
|
||||
|
||||
public abstract void open();
|
||||
|
||||
public abstract void close();
|
||||
|
||||
@Deprecated
|
||||
public abstract void dynamicallyUpdateItem(InventoryItem<?> item, int n, ItemStack placed, Consumer<ItemStack> update);
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
package net.Indyuce.mmocore.gui.api.adaptor;
|
||||
|
||||
import net.Indyuce.mmocore.gui.api.GeneratedInventory;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
public enum AdaptorType {
|
||||
CLASSIC_ADAPTOR(ClassicAdaptor::new),
|
||||
THREE_DIM_ADAPTOR(ThreeDimAdaptor::new);
|
||||
|
||||
private final Function<GeneratedInventory, Adaptor> supplier;
|
||||
|
||||
AdaptorType(Function<GeneratedInventory, Adaptor> supplier) {
|
||||
this.supplier = supplier;
|
||||
}
|
||||
|
||||
public Adaptor supply(GeneratedInventory inv) {
|
||||
return this.supplier.apply(inv);
|
||||
}
|
||||
}
|
@ -1,62 +0,0 @@
|
||||
package net.Indyuce.mmocore.gui.api.adaptor;
|
||||
|
||||
import io.lumine.mythic.lib.MythicLib;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.gui.api.GeneratedInventory;
|
||||
import net.Indyuce.mmocore.gui.api.item.InventoryItem;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class ClassicAdaptor extends Adaptor {
|
||||
private Inventory open;
|
||||
|
||||
public ClassicAdaptor(GeneratedInventory generated) {
|
||||
super(generated);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void open() {
|
||||
generated.getPlayer().openInventory(open = getInventory());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dynamicallyUpdateItem(InventoryItem<?> item, int n, ItemStack placed, Consumer<ItemStack> update) {
|
||||
Bukkit.getScheduler().runTaskAsynchronously(MMOCore.plugin, () -> {
|
||||
update.accept(placed);
|
||||
open.setItem(item.getSlots().get(n), placed);
|
||||
});
|
||||
}
|
||||
|
||||
public Inventory getInventory() {
|
||||
Inventory inv = Bukkit.createInventory(generated, generated.getEditable().getSlots(), MythicLib.plugin.getPlaceholderParser().parse(generated.getPlayer(), generated.calculateName()));
|
||||
|
||||
for (InventoryItem item : generated.getEditable().getItems())
|
||||
if (item.canDisplay(generated))
|
||||
setDisplayed(inv, item);
|
||||
|
||||
return inv;
|
||||
}
|
||||
|
||||
private void setDisplayed(Inventory inv, InventoryItem item) {
|
||||
generated.addLoaded(item);
|
||||
List<Integer> slots = item.getSlots();
|
||||
|
||||
if (!item.hasDifferentDisplay()) {
|
||||
ItemStack display = item.display(generated);
|
||||
for (int slot : slots)
|
||||
inv.setItem(slot, display);
|
||||
} else
|
||||
for (int j = 0; j < slots.size(); j++)
|
||||
inv.setItem(slots.get(j), item.display(generated, j));
|
||||
|
||||
}
|
||||
}
|
@ -1,524 +0,0 @@
|
||||
package net.Indyuce.mmocore.gui.api.adaptor;
|
||||
|
||||
import com.comphenix.protocol.PacketType;
|
||||
import com.comphenix.protocol.ProtocolLibrary;
|
||||
import com.comphenix.protocol.events.PacketAdapter;
|
||||
import com.comphenix.protocol.events.PacketContainer;
|
||||
import com.comphenix.protocol.events.PacketEvent;
|
||||
import io.lumine.mythic.lib.api.util.TemporaryListener;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.gui.api.GeneratedInventory;
|
||||
import net.Indyuce.mmocore.gui.api.InventoryClickContext;
|
||||
import net.Indyuce.mmocore.gui.api.item.InventoryItem;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.entity.ArmorStand;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||
import org.bukkit.event.inventory.ClickType;
|
||||
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
import org.bukkit.inventory.EquipmentSlot;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.persistence.PersistentDataContainer;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class ThreeDimAdaptor extends Adaptor {
|
||||
private final double INITIAL_PERCENTAGE = 0.20;
|
||||
private final double INCREMENT_PERCENTAGE = 0.20;
|
||||
|
||||
private SpawnPacketListener packetListener;
|
||||
private InteractListener interactListener;
|
||||
private final HashMap<Integer, ArmorStand> armorStands = new HashMap<>();
|
||||
|
||||
private final HashSet<ArmorStand> loreArmorStand = new HashSet<>();
|
||||
|
||||
private final HashMap<ItemStack, ArmorStand> hiddenArmorStand = new HashMap<>();
|
||||
|
||||
protected double radius, angleGap, verticalGap, curvature, verticalOffset, interactSensitivity;
|
||||
|
||||
|
||||
private boolean firstTime = true;
|
||||
|
||||
private final Vector direction = generated.getPlayer().getEyeLocation().getDirection().setY(0);
|
||||
private final Location location;
|
||||
|
||||
//Zoomed=-1 no armorstand are under zoom
|
||||
private int zoomed = -1;
|
||||
|
||||
|
||||
public ThreeDimAdaptor(GeneratedInventory generated) {
|
||||
super(generated);
|
||||
|
||||
this.radius = generated.getEditable().getConfig().getDouble("radius", 2);
|
||||
this.angleGap = generated.getEditable().getConfig().getDouble("angle-gap", 10);
|
||||
this.verticalGap = generated.getEditable().getConfig().getDouble("vertical-gap", 1);
|
||||
this.curvature = generated.getEditable().getConfig().getDouble("curvature", 1);
|
||||
this.verticalOffset = generated.getEditable().getConfig().getDouble("vertical-offset", 0);
|
||||
this.interactSensitivity = generated.getEditable().getConfig().getDouble("interact-sensitivity", 0.97);
|
||||
location = generated.getPlayer().getLocation().add(new Vector(0, verticalOffset, 0));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void open() {
|
||||
if (!firstTime) {
|
||||
fastClose();
|
||||
fastOpen();
|
||||
return;
|
||||
}
|
||||
firstTime = false;
|
||||
//MMOCore.plugin.protocolManager.addPacketListener(packetListener = new SpawnPacketListener());
|
||||
interactListener = new InteractListener();
|
||||
for (InventoryItem item : generated.getEditable().getItems()) {
|
||||
if (item.canDisplay(generated)) {
|
||||
setInventoryItem(item, INITIAL_PERCENTAGE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
new BukkitRunnable() {
|
||||
double total_percentage = INITIAL_PERCENTAGE;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (total_percentage < 1) {
|
||||
total_percentage += INCREMENT_PERCENTAGE;
|
||||
for (int slot : armorStands.keySet()) {
|
||||
armorStands.get(slot).teleport(getLocation(slot, total_percentage));
|
||||
}
|
||||
} else {
|
||||
cancel();
|
||||
}
|
||||
|
||||
}
|
||||
}.runTaskTimer(MMOCore.plugin, 0L, 1L);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
//Closes the packet listener,the interact listener and destroys the armor stands.
|
||||
//MMOCore.plugin.protocolManager.removePacketListener(packetListener);
|
||||
interactListener.close();
|
||||
removeLore();
|
||||
|
||||
new BukkitRunnable() {
|
||||
double total_percentage = 1;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (total_percentage > INITIAL_PERCENTAGE) {
|
||||
total_percentage -= INCREMENT_PERCENTAGE;
|
||||
for (int slot : armorStands.keySet()) {
|
||||
armorStands.get(slot).teleport(getLocation(slot, total_percentage));
|
||||
}
|
||||
} else {
|
||||
for (ArmorStand armorStand : armorStands.values())
|
||||
armorStand.remove();
|
||||
cancel();
|
||||
}
|
||||
|
||||
}
|
||||
}.runTaskTimer(MMOCore.plugin, 0L, 1L);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens the inventory without the little animation
|
||||
*/
|
||||
public void fastOpen() {
|
||||
//MMOCore.plugin.protocolManager.addPacketListener(packetListener = new SpawnPacketListener());
|
||||
interactListener = new InteractListener();
|
||||
for (InventoryItem item : generated.getEditable().getItems()) {
|
||||
if (item.canDisplay(generated)) {
|
||||
setInventoryItem(item, 1);
|
||||
}
|
||||
}
|
||||
if (zoomed != -1) {
|
||||
displayLore(zoomed);
|
||||
armorStands.get(zoomed).teleport(getLocation(zoomed, 0.75));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Closes the inventory without the little animation
|
||||
*/
|
||||
public void fastClose() {
|
||||
//Closes the packet listener,the interact listener and destroys the armor stands.
|
||||
//MMOCore.plugin.protocolManager.removePacketListener(packetListener);
|
||||
interactListener.close();
|
||||
|
||||
for (ArmorStand armorStand : armorStands.values())
|
||||
armorStand.remove();
|
||||
removeLore();
|
||||
|
||||
}
|
||||
|
||||
private void setInventoryItem(InventoryItem item, double percentage) {
|
||||
generated.addLoaded(item);
|
||||
|
||||
List<Integer> slots = item.getSlots();
|
||||
if (item.hasDifferentDisplay()) {
|
||||
for (int i : slots) {
|
||||
setItem(item.display(generated, i), i, percentage);
|
||||
}
|
||||
} else {
|
||||
ItemStack itemStack = item.display(generated);
|
||||
for (int i : slots) {
|
||||
setItem(itemStack, i, percentage);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void setItem(ItemStack item, int n, double percentage) {
|
||||
Location location = getLocation(n, percentage);
|
||||
if(item.getType().toString().contains("SKULL")||item.getType().toString().contains("HEAD")) {
|
||||
location.add(new Vector(0,4.9,0));
|
||||
}
|
||||
//We create the armorStand corresponding to display the item
|
||||
ArmorStand armorStand = (ArmorStand) generated.getPlayer().getWorld().spawnEntity(location, EntityType.ARMOR_STAND);
|
||||
armorStand.setVisible(true);
|
||||
armorStand.setSmall(false);
|
||||
armorStand.setArms(true);
|
||||
armorStand.setGravity(false);
|
||||
armorStand.getEquipment().setItem(EquipmentSlot.HEAD, item);
|
||||
if (item.hasItemMeta() && item.getItemMeta().getDisplayName() != null) {
|
||||
armorStand.setCustomName(item.getItemMeta().getDisplayName());
|
||||
}
|
||||
armorStand.setCustomNameVisible(true);
|
||||
|
||||
//We add properties to the PersistentDataContainer of the armor stand
|
||||
PersistentDataContainer container = armorStand.getPersistentDataContainer();
|
||||
container.set(new NamespacedKey(MMOCore.plugin, "slot"), PersistentDataType.INTEGER, n);
|
||||
|
||||
|
||||
//Makes the ArmorStand look at you
|
||||
//armorStand.setBodyPose(new EulerAngle(-direction.getX(),0,-direction.getZ()));
|
||||
|
||||
armorStands.put(n, armorStand);
|
||||
}
|
||||
|
||||
|
||||
public void displayLore(int n) {
|
||||
ArmorStand armorStand = armorStands.get(n);
|
||||
ItemStack itemStack = armorStand.getEquipment().getItem(EquipmentSlot.HEAD);
|
||||
|
||||
Location initalLocation = getLocation(n, 1);
|
||||
|
||||
for (ArmorStand armorStand1 : armorStands.values()) {
|
||||
armorStand1.setCustomNameVisible(false);
|
||||
}
|
||||
|
||||
Vector xAxis = initalLocation.clone().toVector().subtract(generated.getPlayer().getLocation().toVector()).setY(0).normalize();
|
||||
Vector yAxis = new Vector(0, 1, 0);
|
||||
Vector zAxis = xAxis.clone().rotateAroundAxis(yAxis, -Math.PI / 2);
|
||||
|
||||
|
||||
//Empiric height of a line: 0.25
|
||||
//Empiric size of a char: 0.13
|
||||
double lineHeight = 0.25;
|
||||
double charSize = 0.09;
|
||||
//We search the biggest line in the lore
|
||||
int max = 0;
|
||||
for (String line : itemStack.getItemMeta().getLore()) {
|
||||
if (line.length() > max)
|
||||
max = line.length();
|
||||
}
|
||||
|
||||
|
||||
initalLocation.add(zAxis.clone().multiply(max * charSize / 2 + 0.8)).add(yAxis.clone().multiply(2 + 0.125 * itemStack.getItemMeta().getLore().size()));
|
||||
for (String line : itemStack.getItemMeta().getLore()) {
|
||||
if (line.length() != 0) {
|
||||
ArmorStand as = (ArmorStand) initalLocation.getWorld().spawnEntity(initalLocation, EntityType.ARMOR_STAND);
|
||||
as.setSmall(false);
|
||||
as.setMarker(true);
|
||||
as.setVisible(false);
|
||||
as.setCustomNameVisible(true);
|
||||
as.setCustomName(line);
|
||||
loreArmorStand.add(as);
|
||||
}
|
||||
|
||||
initalLocation.add(yAxis.clone().multiply(-lineHeight));
|
||||
|
||||
}
|
||||
|
||||
double totalHeight = lineHeight * itemStack.getItemMeta().getLore().size();
|
||||
double totalLength = max * charSize;
|
||||
Location topCorner = getLocation(n, 1).add(yAxis.clone().multiply(armorStand.getHeight() * 0.25 + totalHeight / 2));
|
||||
|
||||
//We remove the items that can be in the field of vision
|
||||
for (int slot : armorStands.keySet()) {
|
||||
ArmorStand otherArmorStand = armorStands.get(slot);
|
||||
if (!otherArmorStand.equals(armorStand)) {
|
||||
//Calculates the direction between the player and otherArmorStand
|
||||
Vector direction = otherArmorStand.getLocation().add(new Vector(0, 0.25 * otherArmorStand.getHeight(), 0)).subtract(generated.getPlayer().getLocation()).toVector().normalize();
|
||||
//The vector between the plan and the player.
|
||||
//The plane normal is the xAxis
|
||||
|
||||
double t = (xAxis.clone().dot(topCorner.clone().subtract(generated.getPlayer().getLocation()).toVector())) / xAxis.clone().dot(direction);
|
||||
Vector relativeProjection = generated.getPlayer().getLocation().toVector().add(direction.multiply(t)).subtract(topCorner.toVector());
|
||||
|
||||
|
||||
//The intersection between 'direction' and the plane
|
||||
//Vector projection=generated.getPlayer().getLocation().toVector().add(direction.clone().multiply(1/vector.dot(direction)));
|
||||
//Vector relativeProjection=projection.subtract(topCorner.toVector());
|
||||
double z = zAxis.dot(relativeProjection);
|
||||
double y = (n / 9 - slot / 9) * lineHeight + totalHeight / 2;
|
||||
if (z > 0 && z < totalLength && y > 0 && y < totalHeight) {
|
||||
hideArmorStand(otherArmorStand);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Hide the item corrseponding to a certain armor stand if it hides the lore
|
||||
*/
|
||||
public void hideArmorStand(ArmorStand armorStand) {
|
||||
hiddenArmorStand.put(armorStand.getEquipment().getItem(EquipmentSlot.HEAD), armorStand);
|
||||
armorStand.getEquipment().setItem(EquipmentSlot.HEAD, null);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reestablishes all the item for armor stand
|
||||
*/
|
||||
public void reestablishHiddenArmorStand() {
|
||||
for (ItemStack item : hiddenArmorStand.keySet()) {
|
||||
hiddenArmorStand.get(item).getEquipment().setItem(EquipmentSlot.HEAD, item);
|
||||
}
|
||||
hiddenArmorStand.clear();
|
||||
}
|
||||
|
||||
|
||||
public void removeLore() {
|
||||
for (ArmorStand armorStand : loreArmorStand) {
|
||||
armorStand.remove();
|
||||
}
|
||||
loreArmorStand.clear();
|
||||
|
||||
for (ArmorStand armorStand1 : armorStands.values()) {
|
||||
armorStand1.setCustomNameVisible(true);
|
||||
}
|
||||
reestablishHiddenArmorStand();
|
||||
}
|
||||
|
||||
|
||||
public Location getLocation(int n, double percentage) {
|
||||
//Determines the location at which the ArmorStand will spawn
|
||||
|
||||
Location cloneLocation = location.clone();
|
||||
Vector cloneDirection = direction.clone().rotateAroundAxis(new Vector(0, 1, 0),
|
||||
-((n % 9) - 4) * angleGap * Math.PI / 180);
|
||||
|
||||
//Curvature of 1: r=cst Curvature of 1: r=R/cos(angle) (a plane)
|
||||
double radius = percentage * this.radius / Math.cos((1 - curvature)
|
||||
* -((n % 9) - 4) * angleGap * Math.PI / 180);
|
||||
cloneDirection = cloneDirection.normalize().multiply(radius);
|
||||
cloneDirection.add(new Vector(0, percentage * verticalGap * ((generated.getEditable().getSlots() - n - 1) / 9), 1));
|
||||
//We get the final direction
|
||||
cloneLocation.add(cloneDirection);
|
||||
|
||||
cloneLocation.setDirection(new Vector(-cloneDirection.getX(), 0, -cloneDirection.getZ()));
|
||||
return cloneLocation;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dynamicallyUpdateItem(InventoryItem<?> item, int n, ItemStack placed, Consumer<ItemStack> update) {
|
||||
|
||||
}
|
||||
|
||||
private class SpawnPacketListener extends PacketAdapter {
|
||||
|
||||
|
||||
public SpawnPacketListener() {
|
||||
super(MMOCore.plugin, PacketType.Play.Server.SPAWN_ENTITY_LIVING);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels all the packet corresponding to an armorStand of the Gui to a player that should not see it.
|
||||
*/
|
||||
@Override
|
||||
public void onPacketSending(PacketEvent event) {
|
||||
|
||||
PacketContainer packet = event.getPacket();
|
||||
Entity entity = ProtocolLibrary.getProtocolManager()
|
||||
.getEntityFromID(event.getPlayer().getWorld(), packet.getIntegers().read(0));
|
||||
if (entity instanceof ArmorStand armorStand) {
|
||||
if (true) {
|
||||
|
||||
if (armorStands.values().contains(armorStand)) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
private class InteractListener extends TemporaryListener {
|
||||
|
||||
public InteractListener() {
|
||||
super(MMOCore.plugin, PlayerInteractAtEntityEvent.getHandlerList()
|
||||
, PlayerMoveEvent.getHandlerList(), PlayerInteractEvent.getHandlerList(), PlayerInteractAtEntityEvent.getHandlerList());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onMove(PlayerMoveEvent e) {
|
||||
if (e.getPlayer().equals(generated.getPlayer())) {
|
||||
if (!e.getFrom().getBlock().getLocation().equals(e.getTo().getBlock().getLocation()))
|
||||
ThreeDimAdaptor.this.close();
|
||||
else {
|
||||
int closest = -1;
|
||||
double closestScalar = 1;
|
||||
for (int n : armorStands.keySet()) {
|
||||
ArmorStand as = armorStands.get(n);
|
||||
Location asLocation = as.getLocation().add(new Vector(0, 0.25 * as.getHeight(), 0));
|
||||
|
||||
|
||||
double scalar = generated.getPlayer().getLocation().getDirection().normalize().dot(
|
||||
asLocation.subtract(generated.getPlayer().getLocation()).toVector().normalize());
|
||||
|
||||
if (scalar > interactSensitivity && scalar < closestScalar) {
|
||||
closestScalar = scalar;
|
||||
closest = n;
|
||||
}
|
||||
}
|
||||
|
||||
if (closest != zoomed) {
|
||||
if (zoomed != -1) {
|
||||
removeLore();
|
||||
armorStands.get(zoomed).teleport(getLocation(zoomed, 1));
|
||||
}
|
||||
if (closest != -1) {
|
||||
armorStands.get(zoomed).teleport(getLocation(closest, 0.75));
|
||||
zoomed = closest;
|
||||
displayLore(closest);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onInteract(PlayerInteractAtEntityEvent event) {
|
||||
if (event.getPlayer().equals(generated.getPlayer()))
|
||||
if (event.getRightClicked() instanceof ArmorStand armorStand)
|
||||
event.setCancelled(true);
|
||||
|
||||
|
||||
/*
|
||||
if (armorStands.values().contains(armorStand)) {
|
||||
PersistentDataContainer container = armorStand.getPersistentDataContainer();
|
||||
int slot = container.get(new NamespacedKey(MMOCore.plugin, "slot"), PersistentDataType.INTEGER);
|
||||
ClickType clickType;
|
||||
if (event.getPlayer().isSneaking())
|
||||
clickType = ClickType.SHIFT_RIGHT;
|
||||
else
|
||||
clickType = ClickType.RIGHT;
|
||||
generated.whenClicked(new InventoryClickContext(slot, armorStand.getEquipment().getItem(EquipmentSlot.HEAD), clickType, event));
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onInteract(PlayerInteractEvent event) {
|
||||
if (event.getPlayer().equals(generated.getPlayer())) {
|
||||
Player player = event.getPlayer();
|
||||
for (ArmorStand armorStand : armorStands.values()) {
|
||||
//Little offset for the armorStand to have the location match the location of the itemstack
|
||||
if (player.getLocation().getDirection().normalize()
|
||||
.dot(armorStand.getLocation().add(new Vector(0, 0.25 * armorStand.getHeight(), 0)).subtract(player.getLocation()).toVector().normalize()) > 0.96) {
|
||||
|
||||
PersistentDataContainer container = armorStand.getPersistentDataContainer();
|
||||
int slot = container.get(new NamespacedKey(MMOCore.plugin, "slot"), PersistentDataType.INTEGER);
|
||||
ClickType clickType;
|
||||
if (event.getAction() == Action.LEFT_CLICK_AIR) {
|
||||
if (event.getPlayer().isSneaking())
|
||||
clickType = ClickType.SHIFT_LEFT;
|
||||
else
|
||||
clickType = ClickType.LEFT;
|
||||
|
||||
} else if (event.getAction() == Action.RIGHT_CLICK_AIR) {
|
||||
|
||||
if (event.getPlayer().isSneaking())
|
||||
clickType = ClickType.SHIFT_RIGHT;
|
||||
else
|
||||
clickType = ClickType.RIGHT;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
generated.whenClicked(new InventoryClickContext(slot, armorStand.getEquipment().getItem(EquipmentSlot.HEAD), clickType, event));
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onDamage(EntityDamageByEntityEvent event) {
|
||||
if (event.getDamager() instanceof Player player)
|
||||
if (player.equals(generated.getPlayer()))
|
||||
if (event.getEntity() instanceof ArmorStand armorStand)
|
||||
if (armorStands.values().contains(armorStand))
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
PersistentDataContainer container = armorStand.getPersistentDataContainer();
|
||||
int slot = container.get(new NamespacedKey(MMOCore.plugin, "slot"), PersistentDataType.INTEGER);
|
||||
ClickType clickType;
|
||||
if(player.isSneaking())
|
||||
clickType =ClickType.SHIFT_LEFT;
|
||||
else
|
||||
clickType =ClickType.LEFT;
|
||||
|
||||
ItemStack itemStack = armorStand.getEquipment().getItem(EquipmentSlot.HEAD);
|
||||
generated.whenClicked(new
|
||||
|
||||
InventoryClickContext(slot, itemStack, clickType, event));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
|
||||
@Override
|
||||
public void whenClosed() {
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -1,203 +0,0 @@
|
||||
package net.Indyuce.mmocore.gui.api.item;
|
||||
|
||||
import com.mojang.authlib.GameProfile;
|
||||
import com.mojang.authlib.properties.Property;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.gui.api.GeneratedInventory;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemFlag;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.inventory.meta.SkullMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.logging.Level;
|
||||
|
||||
public abstract class InventoryItem<T extends GeneratedInventory> {
|
||||
private final String id, function;
|
||||
private final List<Integer> slots = new ArrayList<>();
|
||||
|
||||
@Nullable
|
||||
private final InventoryItem<?> parent;
|
||||
|
||||
private final Material material;
|
||||
private final String name, texture;
|
||||
private final List<String> lore;
|
||||
private final int modelData;
|
||||
private final boolean hideFlags;
|
||||
|
||||
public InventoryItem(ConfigurationSection config) {
|
||||
this((InventoryItem) null, config);
|
||||
}
|
||||
|
||||
public InventoryItem(@Nullable InventoryItem<?> parent, ConfigurationSection config) {
|
||||
this(parent, Material.valueOf(config.getString("item", "").toUpperCase().replace(" ", "_").replace("-", "_")), config);
|
||||
}
|
||||
|
||||
public InventoryItem(@NotNull Material material, ConfigurationSection config) {
|
||||
this(null, material, config);
|
||||
}
|
||||
|
||||
public InventoryItem(InventoryItem parent, Material material, ConfigurationSection config) {
|
||||
this.id = config.getName();
|
||||
this.function = config.getString("function", "");
|
||||
this.parent = parent;
|
||||
|
||||
this.material = material;
|
||||
this.name = config.getString("name");
|
||||
this.lore = config.getStringList("lore");
|
||||
this.hideFlags = config.getBoolean("hide-flags");
|
||||
this.texture = config.getString("texture");
|
||||
this.modelData = config.getInt("custom-model-data");
|
||||
|
||||
config.getStringList("slots").forEach(str -> slots.add(Integer.parseInt(str)));
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String getFunction() {
|
||||
return parent == null ? function : parent.function;
|
||||
}
|
||||
|
||||
public boolean hasFunction() {
|
||||
return !getFunction().isEmpty();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public List<Integer> getSlots() {
|
||||
return parent == null ? slots : parent.slots;
|
||||
}
|
||||
|
||||
public Material getMaterial() {
|
||||
return material;
|
||||
}
|
||||
|
||||
public boolean hideFlags() {
|
||||
return hideFlags;
|
||||
}
|
||||
|
||||
public boolean hasName() {
|
||||
return name != null;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public boolean hasLore() {
|
||||
return lore != null && !lore.isEmpty();
|
||||
}
|
||||
|
||||
public List<String> getLore() {
|
||||
return lore;
|
||||
}
|
||||
|
||||
public int getModelData() {
|
||||
return modelData;
|
||||
}
|
||||
|
||||
public void setDisplayed(Inventory inv, T generated) {
|
||||
generated.addLoaded(this);
|
||||
|
||||
if (!hasDifferentDisplay()) {
|
||||
ItemStack display = display(generated);
|
||||
for (int slot : getSlots())
|
||||
inv.setItem(slot, display);
|
||||
} else for (int j = 0; j < slots.size(); j++)
|
||||
inv.setItem(slots.get(j), display(generated, j));
|
||||
|
||||
}
|
||||
|
||||
public boolean hasDifferentDisplay() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean canDisplay(T inv) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public ItemStack display(T inv) {
|
||||
return display(inv, modelData);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public ItemStack display(T inv, int n) {
|
||||
return display(inv, n, material);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public ItemStack display(T inv, int n, Material specificMaterial) {
|
||||
return display(inv, n, specificMaterial, modelData);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public ItemStack display(T inv, int n, Material material, int modelData) {
|
||||
|
||||
final Placeholders placeholders = getPlaceholders(inv, n);
|
||||
final OfflinePlayer effectivePlayer = getEffectivePlayer(inv, n);
|
||||
|
||||
final ItemStack item = new ItemStack(material);
|
||||
final ItemMeta meta = item.getItemMeta();
|
||||
meta.setCustomModelData(modelData);
|
||||
if (texture != null && meta instanceof SkullMeta) applyTexture(texture, (SkullMeta) meta);
|
||||
|
||||
if (hasName()) meta.setDisplayName(placeholders.apply(effectivePlayer, getName()));
|
||||
|
||||
if (hideFlags()) meta.addItemFlags(ItemFlag.values());
|
||||
|
||||
if (hasLore()) {
|
||||
List<String> lore = new ArrayList<>();
|
||||
getLore().forEach(line -> lore.add(ChatColor.GRAY + placeholders.apply(effectivePlayer, line)));
|
||||
meta.setLore(lore);
|
||||
}
|
||||
|
||||
item.setItemMeta(meta);
|
||||
return item;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param inv Inventory being generated
|
||||
* @param n Index of item being generated
|
||||
* @return Player relative to which placeholders are computed when the item is
|
||||
* being displayed in the inventory. Most of the time, it's just
|
||||
* the player opening the inventory, but for friends or party members,
|
||||
* being able to parse placeholders based on other players is great too.
|
||||
*/
|
||||
@NotNull
|
||||
public OfflinePlayer getEffectivePlayer(T inv, int n) {
|
||||
return inv.getPlayer();
|
||||
}
|
||||
|
||||
private void applyTexture(String value, SkullMeta meta) {
|
||||
try {
|
||||
GameProfile profile = new GameProfile(UUID.randomUUID(), null);
|
||||
profile.getProperties().put("textures", new Property("textures", value));
|
||||
|
||||
Field profileField = meta.getClass().getDeclaredField("profile");
|
||||
profileField.setAccessible(true);
|
||||
profileField.set(meta, profile);
|
||||
} catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException exception) {
|
||||
MMOCore.log(Level.WARNING, "Could not apply item texture value of " + getId());
|
||||
}
|
||||
}
|
||||
|
||||
public Placeholders getPlaceholders(T inv) {
|
||||
return getPlaceholders(inv, 0);
|
||||
}
|
||||
|
||||
public abstract Placeholders getPlaceholders(T inv, int n);
|
||||
}
|
@ -1,55 +0,0 @@
|
||||
package net.Indyuce.mmocore.gui.api.item;
|
||||
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class Placeholders {
|
||||
private final Map<String, String> placeholders = new HashMap<>();
|
||||
|
||||
public void register(String path, Object obj) {
|
||||
placeholders.put(path, obj.toString());
|
||||
}
|
||||
|
||||
public String apply(OfflinePlayer player, String str) {
|
||||
|
||||
// Remove conditions first
|
||||
str = removeCondition(str);
|
||||
|
||||
/*
|
||||
* For MMOCore not to loop on unparsable placeholders, it keeps
|
||||
* track of the "last placeholder" parsed. The 'explored' string
|
||||
* has NO parsed placeholder.
|
||||
*/
|
||||
String explored = str;
|
||||
|
||||
// Internal placeholders
|
||||
while (explored.contains("{") && explored.substring(explored.indexOf("{")).contains("}")) {
|
||||
final int begin = explored.indexOf("{"), end = explored.indexOf("}");
|
||||
final String holder = explored.substring(begin + 1, end);
|
||||
@Nullable String found = placeholders.get(holder);
|
||||
|
||||
/*
|
||||
* Do NOT replace the placeholder unless a corresponding value has
|
||||
* been found. This simple workaround fixes an issue with PAPI
|
||||
* math expansions which interferes with MMOCore placeholders since
|
||||
* it uses {....} as well.
|
||||
*/
|
||||
if (found != null)
|
||||
str = str.replace("{" + holder + "}", found);
|
||||
|
||||
// Increase counter
|
||||
explored = explored.substring(end + 1);
|
||||
}
|
||||
|
||||
// External placeholders
|
||||
return MMOCore.plugin.placeholderParser.parse(player, str);
|
||||
}
|
||||
|
||||
private String removeCondition(String str) {
|
||||
return str.startsWith("{") && str.contains("}") ? str.substring(str.indexOf("}") + 1) : str;
|
||||
}
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
package net.Indyuce.mmocore.gui.api.item;
|
||||
|
||||
import net.Indyuce.mmocore.gui.api.GeneratedInventory;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
|
||||
public class SimplePlaceholderItem<T extends GeneratedInventory> extends InventoryItem<T> {
|
||||
public SimplePlaceholderItem(InventoryItem<?> parent, ConfigurationSection config) {
|
||||
super(parent, config);
|
||||
}
|
||||
|
||||
public SimplePlaceholderItem(ConfigurationSection config) {
|
||||
super(config);
|
||||
}
|
||||
|
||||
public SimplePlaceholderItem(Material material, ConfigurationSection config) {
|
||||
super(material, config);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Placeholders getPlaceholders(T inv, int n) {
|
||||
return new Placeholders();
|
||||
}
|
||||
}
|
@ -1,9 +1,11 @@
|
||||
package net.Indyuce.mmocore.gui.api.item;
|
||||
|
||||
import io.lumine.mythic.lib.api.MMOLineConfig;
|
||||
import io.lumine.mythic.lib.gui.framework.GeneratedInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.item.InventoryItem;
|
||||
import io.lumine.mythic.lib.gui.framework.item.Placeholders;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.quest.trigger.Trigger;
|
||||
import net.Indyuce.mmocore.gui.api.GeneratedInventory;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
|
||||
public class TriggerItem extends InventoryItem {
|
||||
|
@ -0,0 +1,46 @@
|
||||
package net.Indyuce.mmocore.gui.api.packets;
|
||||
/*
|
||||
import com.comphenix.protocol.PacketType;
|
||||
import com.comphenix.protocol.ProtocolLibrary;
|
||||
import com.comphenix.protocol.events.PacketContainer;
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import net.Indyuce.mmocore.gui.api.EditableInventory;
|
||||
import net.Indyuce.mmocore.gui.api.GeneratedInventory;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.Arrays;
|
||||
|
||||
public abstract class FullGeneratedInventory extends GeneratedInventory {
|
||||
|
||||
public FullGeneratedInventory(PlayerData playerData, EditableInventory editable) {
|
||||
super(playerData, editable);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void open() {
|
||||
super.open();
|
||||
resetPlayerInventory();
|
||||
}
|
||||
|
||||
private void resetPlayerInventory() {
|
||||
// Create an empty inventory with 36 empty slots
|
||||
ItemStack[] emptyInventory = new ItemStack[45];
|
||||
for (int i = 9; i < emptyInventory.length; i++) {
|
||||
emptyInventory[i] = new ItemStack(Material.AIR);
|
||||
}
|
||||
|
||||
// Create a WINDOW_ITEMS packet to update the player's inventory
|
||||
PacketContainer packet = new PacketContainer(PacketType.Play.Server.WINDOW_ITEMS);
|
||||
packet.getIntegers().write(0, 0); // Window ID, 0 for player inventory
|
||||
packet.getItemListModifier().write(0, Arrays.asList(emptyInventory));
|
||||
|
||||
// Send the packet to the player
|
||||
try {
|
||||
ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet);
|
||||
} catch (InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}*/
|
@ -0,0 +1,108 @@
|
||||
package net.Indyuce.mmocore.gui.api.packets;
|
||||
|
||||
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import com.comphenix.protocol.PacketType;
|
||||
import com.comphenix.protocol.ProtocolLibrary;
|
||||
import com.comphenix.protocol.events.PacketAdapter;
|
||||
import com.comphenix.protocol.events.PacketEvent;
|
||||
import com.comphenix.protocol.wrappers.WrappedChatComponent;
|
||||
|
||||
public class InventoryPacketListener {
|
||||
|
||||
|
||||
public InventoryPacketListener() {
|
||||
|
||||
ProtocolLibrary.getProtocolManager()
|
||||
.addPacketListener(new PacketAdapter(MMOCore.plugin, PacketType.Play.Server.OPEN_WINDOW) {
|
||||
|
||||
@Override
|
||||
public void onPacketSending(PacketEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
|
||||
// Check if the packet's title contains the specific keyword
|
||||
WrappedChatComponent title = event.getPacket().getChatComponents().read(0);
|
||||
if (title != null) {
|
||||
Bukkit.broadcastMessage("IN");
|
||||
Bukkit.broadcastMessage("is null" + (player.getOpenInventory().getTopInventory().getHolder() == null));
|
||||
Bukkit.broadcastMessage("is generated" + (player.getOpenInventory().getTopInventory().getHolder() instanceof PluginInventory));
|
||||
Bukkit.broadcastMessage("Window Id" + event.getPacket().getIntegers().read(0));
|
||||
Bukkit.getScheduler().runTaskLater(MMOCore.plugin, () -> {
|
||||
Bukkit.broadcastMessage("is generated" + (player.getOpenInventory().getTopInventory().getHolder() instanceof PluginInventory));
|
||||
}, 1);
|
||||
|
||||
// The packet is related to the aquatic shop extension
|
||||
// You can modify the packet as needed
|
||||
event.getPacket().getChatComponents().write(0, WrappedChatComponent.fromText("Modified Title"));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
/*addPacketListener(new PacketAdapter(this, PacketType.Play.Server.WINDOW_ITEMS) {
|
||||
|
||||
@Override
|
||||
public void onPacketSending(PacketEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
|
||||
// Check if the player is in a specific state (e.g., searching)
|
||||
if (!plugin.getSearchHandler().isSearch(player.getUniqueId(), player.getOpenInventory().getTopInventory())) {
|
||||
// Player is not in the expected state, allow the packet to be sent as-is
|
||||
return;
|
||||
}
|
||||
|
||||
// Modify or cancel the packet as needed for the specific use case
|
||||
event.setCancelled(true); // Cancelling the packet prevents it from being sent
|
||||
}
|
||||
});
|
||||
/*
|
||||
boolean existed = plugin.getShopSessionHandler().getSessions().containsKey(player.getUniqueId());
|
||||
ShopSession session = plugin.getShopSessionHandler().getOrCreateSession(player);
|
||||
if (existed) {
|
||||
session.setInventory(holder.getInventory());
|
||||
}
|
||||
String category;
|
||||
String[] strs = holder.getTitle().split("%aquaticshopextension%");
|
||||
if (strs.length < 2) {
|
||||
category = "Blocks";
|
||||
} else {
|
||||
category = strs[1];
|
||||
}
|
||||
StringBuilder title = new StringBuilder();
|
||||
|
||||
title.append("§f");
|
||||
title.append("\uF000".repeat(106));
|
||||
title.append("\uF042");
|
||||
title.append("\uF041");
|
||||
if (ShopExtensionPlugin.subCategories.contains(category)) {
|
||||
title.append("\uF000".repeat(214)).append("\uF053");
|
||||
category = session.getSelectedCategory();
|
||||
} else {
|
||||
session.setPreviousCategory(null);
|
||||
}
|
||||
|
||||
session.setSelectedCategory(category);
|
||||
|
||||
plugin.updateInventory(player,invHolder.getInventory(),session);
|
||||
PacketCDH.super.write(ctx, new ClientboundOpenScreenPacket(packet.getContainerId(),packet.getType(),Component.literal(title.toString())),promise);
|
||||
}
|
||||
} catch (Exception ignored) {
|
||||
PacketCDH.super.write(ctx,packetObj,promise);
|
||||
}
|
||||
} else if(pkt instanceof ClientboundContainerSetContentPacket packet) {
|
||||
if (!plugin.getSearchHandler().isSearch(player.getUniqueId(),player.getOpenInventory().getTopInventory())) {
|
||||
super.write(ctx,packetObj,promise);
|
||||
return;
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
super.write(ctx,packetObj,promise);
|
||||
}*/
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2,16 +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.framework.PluginInventory;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
|
||||
import net.Indyuce.mmocore.gui.api.InventoryClickContext;
|
||||
import net.Indyuce.mmocore.util.item.SimpleItemBuilder;
|
||||
import net.Indyuce.mmocore.gui.api.PluginInventory;
|
||||
import net.milkbowl.vault.economy.EconomyResponse;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
@ -30,7 +30,7 @@ public class DepositMenu extends PluginInventory {
|
||||
private BukkitRunnable updateRunnable;
|
||||
|
||||
public DepositMenu(Player player) {
|
||||
super(player);
|
||||
super(PlayerData.get(player));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -41,9 +41,9 @@ public class DepositMenu extends PluginInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void whenClicked(InventoryClickContext event) {
|
||||
public void whenClicked(InventoryClickEvent event) {
|
||||
|
||||
if (event.getClickedItem().isSimilar(depositItem)) {
|
||||
if (event.getCurrentItem().isSimilar(depositItem)) {
|
||||
event.setCancelled(true);
|
||||
|
||||
updateDeposit(event.getInventory());
|
||||
@ -61,7 +61,7 @@ public class DepositMenu extends PluginInventory {
|
||||
return;
|
||||
}
|
||||
|
||||
int worth = NBTItem.get(event.getClickedItem()).getInteger("RpgWorth");
|
||||
int worth = NBTItem.get(event.getCurrentItem()).getInteger("RpgWorth");
|
||||
if (worth < 1)
|
||||
event.setCancelled(true);
|
||||
else
|
||||
|
@ -3,8 +3,6 @@ package net.Indyuce.mmocore.gui.eco;
|
||||
import io.lumine.mythic.lib.api.item.ItemTag;
|
||||
import io.lumine.mythic.lib.api.item.NBTItem;
|
||||
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
|
||||
import net.Indyuce.mmocore.gui.api.InventoryClickContext;
|
||||
import net.Indyuce.mmocore.gui.api.PluginInventory;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
@ -33,32 +31,32 @@ public class GoldPouch extends PluginInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void whenClicked(InventoryClickContext context) {
|
||||
public void whenClicked(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,7 +69,7 @@ public class GoldPouch extends PluginInventory {
|
||||
* contents
|
||||
*/
|
||||
if (nbt.hasTag("RpgPouchInventory"))
|
||||
context.setCancelled(true);
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -2,6 +2,11 @@ package net.Indyuce.mmocore.gui.skilltree;
|
||||
|
||||
import io.lumine.mythic.lib.MythicLib;
|
||||
import io.lumine.mythic.lib.UtilityMethods;
|
||||
import io.lumine.mythic.lib.gui.framework.EditableInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.GeneratedInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.item.InventoryItem;
|
||||
import io.lumine.mythic.lib.gui.framework.item.Placeholders;
|
||||
import io.lumine.mythic.lib.gui.framework.item.SimpleItem;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
|
||||
import java.util.logging.Level;
|
||||
@ -9,12 +14,6 @@ import java.util.logging.Level;
|
||||
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.gui.skilltree.display.*;
|
||||
import net.Indyuce.mmocore.skilltree.*;
|
||||
import net.Indyuce.mmocore.skilltree.tree.SkillTree;
|
||||
@ -25,6 +24,7 @@ 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;
|
||||
@ -36,7 +36,7 @@ import org.jetbrains.annotations.Nullable;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class SkillTreeViewer extends EditableInventory {
|
||||
public class SkillTreeViewer extends EditableInventory<PlayerData> {
|
||||
protected final Map<DisplayInfo, Icon> icons = new HashMap<>();
|
||||
protected final Map<SkillTreeStatus, String> statusNames = new HashMap<>();
|
||||
|
||||
@ -85,18 +85,18 @@ public class SkillTreeViewer extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public InventoryItem load(String function, ConfigurationSection config) {
|
||||
public InventoryItem loadItem(String function, ConfigurationSection config) {
|
||||
if (function.equals("skill-tree")) {
|
||||
return new SkillTreeItem(config);
|
||||
}
|
||||
if (function.equals("up"))
|
||||
return new SimplePlaceholderItem(config);
|
||||
return new SimpleItem(config);
|
||||
if (function.equals("left"))
|
||||
return new SimplePlaceholderItem(config);
|
||||
return new SimpleItem(config);
|
||||
if (function.equals("down"))
|
||||
return new SimplePlaceholderItem(config);
|
||||
return new SimpleItem(config);
|
||||
if (function.equals("right"))
|
||||
return new SimplePlaceholderItem(config);
|
||||
return new SimpleItem(config);
|
||||
|
||||
if (function.equals("reallocation"))
|
||||
return new InventoryItem<SkillTreeInventory>(config) {
|
||||
@ -127,7 +127,7 @@ public class SkillTreeViewer extends EditableInventory {
|
||||
}
|
||||
|
||||
|
||||
public SkillTreeInventory newInventory(PlayerData playerData) {
|
||||
public SkillTreeInventory generate(PlayerData playerData) {
|
||||
return new SkillTreeInventory(playerData, this, defaultSkillTree);
|
||||
}
|
||||
|
||||
@ -147,14 +147,14 @@ 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);
|
||||
}
|
||||
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, n, skillTree.getItem());
|
||||
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
|
||||
@ -192,26 +192,26 @@ public class SkillTreeViewer extends EditableInventory {
|
||||
}
|
||||
}
|
||||
|
||||
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 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 boolean isDisplayed(SkillTreeInventory inv) {
|
||||
return inv.getTreeListPage() > 0;
|
||||
}
|
||||
}
|
||||
@ -240,11 +240,11 @@ 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.getCustomModelData());
|
||||
ItemStack item = super.getDisplayedItem(inv, n, icon.getMaterial(), icon.getCustomModelData());
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
Placeholders holders = getPlaceholders(inv, n);
|
||||
if (inv.getSkillTree().isNode(coordinates)) {
|
||||
@ -324,7 +324,7 @@ public class SkillTreeViewer extends EditableInventory {
|
||||
}
|
||||
|
||||
|
||||
public class SkillTreeInventory extends GeneratedInventory {
|
||||
public class SkillTreeInventory extends GeneratedInventory<PlayerData> {
|
||||
private int x, y;
|
||||
//width and height correspond to the the size of the 'board' representing the skill tree
|
||||
private int minSlot, maxSlot;
|
||||
@ -435,8 +435,7 @@ public class SkillTreeViewer extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void whenClicked(InventoryClickContext event, InventoryItem item) {
|
||||
|
||||
public void whenClicked(InventoryClickEvent event, InventoryItem item) {
|
||||
|
||||
if (item.getFunction().equals("next-tree-list-page")) {
|
||||
treeListPage++;
|
||||
@ -493,7 +492,7 @@ public class SkillTreeViewer extends EditableInventory {
|
||||
}
|
||||
|
||||
if (item.getFunction().equals("skill-tree")) {
|
||||
String id = event.getClickedItem().getItemMeta().getPersistentDataContainer().get(
|
||||
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(player);
|
||||
skillTree = MMOCore.plugin.skillTreeManager.get(id);
|
||||
@ -502,8 +501,8 @@ public class SkillTreeViewer extends EditableInventory {
|
||||
}
|
||||
|
||||
if (item.getFunction().equals("skill-tree-node")) {
|
||||
if (event.getClickType() == ClickType.LEFT) {
|
||||
PersistentDataContainer container = event.getClickedItem().getItemMeta().getPersistentDataContainer();
|
||||
if (event.getClick() == ClickType.LEFT) {
|
||||
PersistentDataContainer container = event.getCurrentItem().getItemMeta().getPersistentDataContainer();
|
||||
int x = container.get(new NamespacedKey(MMOCore.plugin, "coordinates.x"), PersistentDataType.INTEGER);
|
||||
int y = container.get(new NamespacedKey(MMOCore.plugin, "coordinates.y"), PersistentDataType.INTEGER);
|
||||
if (!skillTree.isNode(new IntegerCoordinates(x, y))) {
|
||||
|
@ -1,7 +1,7 @@
|
||||
package net.Indyuce.mmocore.gui.skilltree.display;
|
||||
|
||||
/**
|
||||
* The information needed to determine the display of a node/path depending on its context.
|
||||
* The information needed to determine the display of a node/path depending on its event.
|
||||
*/
|
||||
public interface DisplayInfo {
|
||||
}
|
||||
|
@ -1,17 +1,16 @@
|
||||
package net.Indyuce.mmocore.gui.social.friend;
|
||||
|
||||
import io.lumine.mythic.lib.gui.framework.EditableInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.GeneratedInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.item.InventoryItem;
|
||||
import io.lumine.mythic.lib.gui.framework.item.Placeholders;
|
||||
import io.lumine.mythic.lib.gui.framework.item.SimpleItem;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.player.PlayerActivity;
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import net.Indyuce.mmocore.gui.api.InventoryClickContext;
|
||||
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.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;
|
||||
@ -21,15 +20,17 @@ 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;
|
||||
|
||||
public class EditableFriendList extends EditableInventory {
|
||||
public class EditableFriendList extends EditableInventory<PlayerData> {
|
||||
private static final NamespacedKey UUID_NAMESPACEDKEY = new NamespacedKey(MMOCore.plugin, "Uuid");
|
||||
|
||||
public EditableFriendList() {
|
||||
@ -37,37 +38,39 @@ public class EditableFriendList extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public InventoryItem load(String function, ConfigurationSection config) {
|
||||
public InventoryItem loadItem(String function, ConfigurationSection config) {
|
||||
|
||||
if (function.equals("friend"))
|
||||
return new FriendItem(config);
|
||||
|
||||
if (function.equals("previous"))
|
||||
return new SimplePlaceholderItem<FriendListInventory>(config) {
|
||||
return new SimpleItem<FriendListInventory>(config) {
|
||||
|
||||
@Override
|
||||
public boolean canDisplay(FriendListInventory inv) {
|
||||
public boolean isDisplayed(FriendListInventory inv) {
|
||||
return inv.page > 0;
|
||||
}
|
||||
};
|
||||
|
||||
if (function.equals("next"))
|
||||
return new SimplePlaceholderItem<FriendListInventory>(config) {
|
||||
return new SimpleItem<FriendListInventory>(config) {
|
||||
|
||||
@Override
|
||||
public boolean canDisplay(FriendListInventory inv) {
|
||||
public boolean isDisplayed(FriendListInventory inv) {
|
||||
return inv.getEditable().getByFunction("friend").getSlots().size() * inv.page < inv.getPlayerData().getFriends().size();
|
||||
}
|
||||
};
|
||||
|
||||
return new SimplePlaceholderItem(config);
|
||||
return new SimpleItem(config);
|
||||
}
|
||||
|
||||
public GeneratedInventory newInventory(PlayerData data) {
|
||||
return new FriendListInventory(data, this);
|
||||
@Override
|
||||
public GeneratedInventory generate(PlayerData playerData, @Nullable GeneratedInventory generatedInventory) {
|
||||
return new FriendListInventory(playerData, this);
|
||||
}
|
||||
|
||||
public static class OfflineFriendItem extends InventoryItem {
|
||||
|
||||
public static class OfflineFriendItem extends InventoryItem<FriendListInventory> {
|
||||
public OfflineFriendItem(FriendItem parent, ConfigurationSection config) {
|
||||
super(parent, config);
|
||||
}
|
||||
@ -79,12 +82,12 @@ public class EditableFriendList extends EditableInventory {
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public OfflinePlayer getEffectivePlayer(GeneratedInventory inv, int n) {
|
||||
public OfflinePlayer getEffectivePlayer(FriendListInventory inv, int n) {
|
||||
return Bukkit.getOfflinePlayer(inv.getPlayerData().getFriends().get(n));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Placeholders getPlaceholders(GeneratedInventory inv, int n) {
|
||||
public Placeholders getPlaceholders(FriendListInventory inv, int n) {
|
||||
OfflinePlayer friend = getEffectivePlayer(inv, n);
|
||||
|
||||
Placeholders holders = new Placeholders();
|
||||
@ -94,7 +97,7 @@ public class EditableFriendList extends EditableInventory {
|
||||
}
|
||||
}
|
||||
|
||||
public static class OnlineFriendItem extends SimplePlaceholderItem {
|
||||
public static class OnlineFriendItem extends SimpleItem<FriendListInventory> {
|
||||
public OnlineFriendItem(FriendItem parent, ConfigurationSection config) {
|
||||
super(parent, config);
|
||||
}
|
||||
@ -106,13 +109,13 @@ public class EditableFriendList extends EditableInventory {
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public OfflinePlayer getEffectivePlayer(GeneratedInventory inv, int n) {
|
||||
public OfflinePlayer getEffectivePlayer(FriendListInventory inv, int n) {
|
||||
return Bukkit.getOfflinePlayer(inv.getPlayerData().getFriends().get(n));
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public Placeholders getPlaceholders(GeneratedInventory inv, int n) {
|
||||
public Placeholders getPlaceholders(FriendListInventory inv, int n) {
|
||||
final PlayerData friendData = PlayerData.get(getEffectivePlayer(inv, n));
|
||||
|
||||
Placeholders holders = new Placeholders();
|
||||
@ -125,7 +128,7 @@ public class EditableFriendList extends EditableInventory {
|
||||
}
|
||||
}
|
||||
|
||||
public static class FriendItem extends SimplePlaceholderItem {
|
||||
public static class FriendItem extends SimpleItem<FriendListInventory> {
|
||||
private final OnlineFriendItem online;
|
||||
private final OfflineFriendItem offline;
|
||||
|
||||
@ -140,12 +143,12 @@ public class EditableFriendList extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack display(GeneratedInventory inv, int n) {
|
||||
public ItemStack getDisplayedItem(FriendListInventory inv, int n) {
|
||||
if (inv.getPlayerData().getFriends().size() <= n)
|
||||
return super.display(inv, 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);
|
||||
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)
|
||||
@ -164,12 +167,12 @@ public class EditableFriendList extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canDisplay(GeneratedInventory inv) {
|
||||
public boolean isDisplayed(FriendListInventory inv) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public class FriendListInventory extends GeneratedInventory {
|
||||
public class FriendListInventory extends GeneratedInventory<PlayerData> {
|
||||
private int page;
|
||||
|
||||
public FriendListInventory(PlayerData playerData, EditableInventory editable) {
|
||||
@ -177,12 +180,12 @@ public class EditableFriendList extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String calculateName() {
|
||||
return getName();
|
||||
public String applyNamePlaceholders(String s) {
|
||||
return s;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void whenClicked(InventoryClickContext context, InventoryItem item) {
|
||||
public void whenClicked(InventoryClickEvent event, InventoryItem item) {
|
||||
if (item.getFunction().equals("previous")) {
|
||||
page--;
|
||||
open();
|
||||
@ -204,7 +207,7 @@ public class EditableFriendList extends EditableInventory {
|
||||
return;
|
||||
}
|
||||
|
||||
new ChatInput(player, InputType.FRIEND_REQUEST, context.getInventoryHolder(), input -> {
|
||||
new ChatInput(player, InputType.FRIEND_REQUEST, this, input -> {
|
||||
Player target = Bukkit.getPlayer(input);
|
||||
if (target == null) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("not-online-player", "player", input).send(player);
|
||||
@ -234,8 +237,8 @@ public class EditableFriendList extends EditableInventory {
|
||||
});
|
||||
}
|
||||
|
||||
if (item.getFunction().equals("friend") && context.getClickType() == ClickType.RIGHT) {
|
||||
String tag = context.getClickedItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING);
|
||||
if (item.getFunction().equals("friend") && event.getClick() == ClickType.RIGHT) {
|
||||
String tag = event.getCurrentItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING);
|
||||
if (tag == null || tag.isEmpty())
|
||||
return;
|
||||
|
||||
|
@ -1,24 +1,24 @@
|
||||
package net.Indyuce.mmocore.gui.social.friend;
|
||||
|
||||
import io.lumine.mythic.lib.gui.framework.EditableInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.GeneratedInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.item.InventoryItem;
|
||||
import io.lumine.mythic.lib.gui.framework.item.Placeholders;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import net.Indyuce.mmocore.gui.api.InventoryClickContext;
|
||||
import net.Indyuce.mmocore.gui.api.GeneratedInventory;
|
||||
import net.Indyuce.mmocore.gui.api.item.InventoryItem;
|
||||
import net.Indyuce.mmocore.manager.data.OfflinePlayerData;
|
||||
import net.Indyuce.mmocore.gui.api.EditableInventory;
|
||||
import net.Indyuce.mmocore.gui.api.item.Placeholders;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
|
||||
public class EditableFriendRemoval extends EditableInventory {
|
||||
public EditableFriendRemoval() {
|
||||
super("friend-removal");
|
||||
}
|
||||
public class EditableFriendRemoval extends EditableInventory<PlayerData> {
|
||||
public EditableFriendRemoval() {
|
||||
super("friend-removal");
|
||||
}
|
||||
|
||||
@Override
|
||||
public InventoryItem load(String function, ConfigurationSection config) {
|
||||
@Override
|
||||
public InventoryItem loadItem(String function, ConfigurationSection config) {
|
||||
|
||||
return new InventoryItem<ClassConfirmationInventory>(config) {
|
||||
|
||||
@ -31,38 +31,43 @@ public class EditableFriendRemoval extends EditableInventory {
|
||||
};
|
||||
}
|
||||
|
||||
public GeneratedInventory newInventory(PlayerData data, OfflinePlayer friend, GeneratedInventory last) {
|
||||
return new ClassConfirmationInventory(data, this, friend, last);
|
||||
}
|
||||
public GeneratedInventory newInventory(PlayerData data, OfflinePlayer friend, GeneratedInventory last) {
|
||||
return new ClassConfirmationInventory(data, this, friend, last);
|
||||
}
|
||||
|
||||
public class ClassConfirmationInventory extends GeneratedInventory {
|
||||
private final OfflinePlayer friend;
|
||||
private final GeneratedInventory last;
|
||||
public class ClassConfirmationInventory extends GeneratedInventory<PlayerData> {
|
||||
private final OfflinePlayer friend;
|
||||
private final GeneratedInventory last;
|
||||
|
||||
public ClassConfirmationInventory(PlayerData playerData, EditableInventory editable, OfflinePlayer friend, GeneratedInventory last) {
|
||||
super(playerData, editable);
|
||||
public ClassConfirmationInventory(PlayerData playerData, EditableInventory editable, OfflinePlayer friend, GeneratedInventory last) {
|
||||
super(playerData, editable);
|
||||
|
||||
this.friend = friend;
|
||||
this.last = last;
|
||||
}
|
||||
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);
|
||||
MMOCore.plugin.configManager.getSimpleMessage("no-longer-friends", "unfriend", friend.getName()).send(player);
|
||||
last.open();
|
||||
}
|
||||
@Override
|
||||
public String applyNamePlaceholders(String s) {
|
||||
return s;
|
||||
}
|
||||
|
||||
if (item.getFunction().equals("back"))
|
||||
last.open();
|
||||
}
|
||||
@Override
|
||||
public void whenClicked(InventoryClickEvent event, 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);
|
||||
MMOCore.plugin.configManager.getSimpleMessage("no-longer-friends", "unfriend", friend.getName()).send(player);
|
||||
last.open();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String calculateName() {
|
||||
return getName();
|
||||
}
|
||||
}
|
||||
if (item.getFunction().equals("back"))
|
||||
last.open();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String calculateName() {
|
||||
return getName();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,16 +1,15 @@
|
||||
package net.Indyuce.mmocore.gui.social.guild;
|
||||
|
||||
import io.lumine.mythic.lib.gui.framework.EditableInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.GeneratedInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.item.InventoryItem;
|
||||
import io.lumine.mythic.lib.gui.framework.item.Placeholders;
|
||||
import io.lumine.mythic.lib.gui.framework.item.SimpleItem;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import net.Indyuce.mmocore.api.util.math.format.DelayFormat;
|
||||
import net.Indyuce.mmocore.gui.api.InventoryClickContext;
|
||||
import net.Indyuce.mmocore.api.util.input.ChatInput;
|
||||
import net.Indyuce.mmocore.api.util.input.PlayerInput;
|
||||
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 net.Indyuce.mmocore.gui.api.item.Placeholders;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.NamespacedKey;
|
||||
@ -19,183 +18,189 @@ 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.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
public class EditableGuildAdmin extends EditableInventory {
|
||||
private static final NamespacedKey UUID_NAMESPACEDKEY = new NamespacedKey(MMOCore.plugin, "Uuid");
|
||||
public class EditableGuildAdmin extends EditableInventory<PlayerData> {
|
||||
private static final NamespacedKey UUID_NAMESPACEDKEY = new NamespacedKey(MMOCore.plugin, "Uuid");
|
||||
|
||||
public EditableGuildAdmin() {
|
||||
super("guild-admin");
|
||||
}
|
||||
public EditableGuildAdmin() {
|
||||
super("guild-admin");
|
||||
}
|
||||
|
||||
@Override
|
||||
public InventoryItem load(String function, ConfigurationSection config) {
|
||||
return function.equals("member") ? new MemberItem(config) : new SimplePlaceholderItem(config);
|
||||
}
|
||||
@Override
|
||||
public GeneratedInventory generate(PlayerData playerData, @Nullable GeneratedInventory generatedInventory) {
|
||||
return new GuildViewInventory(playerData, this);
|
||||
|
||||
public GeneratedInventory newInventory(PlayerData data) {
|
||||
return new GuildViewInventory(data, this);
|
||||
}
|
||||
}
|
||||
|
||||
public static class MemberDisplayItem extends InventoryItem<GuildViewInventory> {
|
||||
public MemberDisplayItem(MemberItem memberItem, ConfigurationSection config) {
|
||||
super(memberItem, config);
|
||||
}
|
||||
@Override
|
||||
public InventoryItem loadItem(String function, ConfigurationSection config) {
|
||||
return function.equals("member") ? new MemberItem(config) : new SimpleItem(config);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasDifferentDisplay() {
|
||||
return true;
|
||||
}
|
||||
public static class MemberDisplayItem extends InventoryItem<GuildViewInventory> {
|
||||
public MemberDisplayItem(MemberItem memberItem, ConfigurationSection config) {
|
||||
super(memberItem, config);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Placeholders getPlaceholders(GuildViewInventory inv, int n) {
|
||||
PlayerData member = PlayerData.get(inv.members.get(n));
|
||||
@Override
|
||||
public boolean hasDifferentDisplay() {
|
||||
return true;
|
||||
}
|
||||
|
||||
Placeholders holders = new Placeholders();
|
||||
@Override
|
||||
public Placeholders getPlaceholders(GuildViewInventory inv, int n) {
|
||||
PlayerData member = PlayerData.get(inv.members.get(n));
|
||||
|
||||
if (member.isOnline())
|
||||
holders.register("name", member.getPlayer().getName());
|
||||
holders.register("class", member.getProfess().getName());
|
||||
holders.register("level", "" + member.getLevel());
|
||||
holders.register("since", new DelayFormat(2).format(System.currentTimeMillis() - member.getLastLogin()));
|
||||
return holders;
|
||||
}
|
||||
Placeholders holders = new Placeholders();
|
||||
|
||||
@Override
|
||||
public ItemStack display(GuildViewInventory inv, int n) {
|
||||
UUID uuid = inv.members.get(n);
|
||||
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(uuid);
|
||||
if (member.isOnline())
|
||||
holders.register("name", member.getPlayer().getName());
|
||||
holders.register("class", member.getProfess().getName());
|
||||
holders.register("level", "" + member.getLevel());
|
||||
holders.register("since", new DelayFormat(2).format(System.currentTimeMillis() - member.getLastLogin()));
|
||||
return holders;
|
||||
}
|
||||
|
||||
ItemStack disp = super.display(inv, n);
|
||||
ItemMeta meta = disp.getItemMeta();
|
||||
meta.getPersistentDataContainer().set(UUID_NAMESPACEDKEY, PersistentDataType.STRING, uuid.toString());
|
||||
@Override
|
||||
public ItemStack getDisplayedItem(GuildViewInventory inv, int n) {
|
||||
UUID uuid = inv.members.get(n);
|
||||
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(uuid);
|
||||
|
||||
if (meta instanceof SkullMeta && offlinePlayer != null)
|
||||
inv.dynamicallyUpdateItem(this, n, disp, current -> {
|
||||
((SkullMeta) meta).setOwningPlayer(offlinePlayer);
|
||||
current.setItemMeta(meta);
|
||||
});
|
||||
ItemStack disp = super.getDisplayedItem(inv, n);
|
||||
ItemMeta meta = disp.getItemMeta();
|
||||
meta.getPersistentDataContainer().set(UUID_NAMESPACEDKEY, PersistentDataType.STRING, uuid.toString());
|
||||
|
||||
disp.setItemMeta(meta);
|
||||
return disp;
|
||||
}
|
||||
}
|
||||
if (meta instanceof SkullMeta && offlinePlayer != null)
|
||||
inv.dynamicallyUpdateItem(this, n, disp, current -> {
|
||||
((SkullMeta) meta).setOwningPlayer(offlinePlayer);
|
||||
current.setItemMeta(meta);
|
||||
});
|
||||
|
||||
public static class MemberItem extends SimplePlaceholderItem<GuildViewInventory> {
|
||||
private final InventoryItem empty;
|
||||
private final MemberDisplayItem member;
|
||||
disp.setItemMeta(meta);
|
||||
return disp;
|
||||
}
|
||||
}
|
||||
|
||||
public MemberItem(ConfigurationSection config) {
|
||||
super(config);
|
||||
public static class MemberItem extends SimpleItem<GuildViewInventory> {
|
||||
private final InventoryItem empty;
|
||||
private final MemberDisplayItem member;
|
||||
|
||||
Validate.notNull(config.contains("empty"), "Could not load empty config");
|
||||
Validate.notNull(config.contains("member"), "Could not load member config");
|
||||
public MemberItem(ConfigurationSection config) {
|
||||
super(config);
|
||||
|
||||
empty = new SimplePlaceholderItem(config.getConfigurationSection("empty"));
|
||||
member = new MemberDisplayItem(this, config.getConfigurationSection("member"));
|
||||
}
|
||||
Validate.notNull(config.contains("empty"), "Could not load empty config");
|
||||
Validate.notNull(config.contains("member"), "Could not load member config");
|
||||
|
||||
@Override
|
||||
public ItemStack display(GuildViewInventory inv, int n) {
|
||||
return inv.getPlayerData().getGuild().countMembers() > n ? member.display(inv, n) : empty.display(inv, n);
|
||||
}
|
||||
empty = new SimpleItem(config.getConfigurationSection("empty"));
|
||||
member = new MemberDisplayItem(this, config.getConfigurationSection("member"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasDifferentDisplay() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public ItemStack getDisplayedItem(GuildViewInventory inv, int n) {
|
||||
return inv.getPlayerData().getGuild().countMembers() > n ? member.getDisplayedItem(inv, n) : empty.getDisplayedItem(inv, n);
|
||||
}
|
||||
|
||||
public class GuildViewInventory extends GeneratedInventory {
|
||||
private final int max;
|
||||
@Override
|
||||
public boolean hasDifferentDisplay() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private List<UUID> members;
|
||||
public class GuildViewInventory extends GeneratedInventory<PlayerData> {
|
||||
private final int max;
|
||||
|
||||
public GuildViewInventory(PlayerData playerData, EditableInventory editable) {
|
||||
super(playerData, editable);
|
||||
private List<UUID> members;
|
||||
|
||||
max = editable.getByFunction("member").getSlots().size();
|
||||
}
|
||||
public GuildViewInventory(PlayerData playerData, EditableInventory editable) {
|
||||
super(playerData, editable);
|
||||
|
||||
@Override
|
||||
public void open() {
|
||||
members = playerData.getGuild().listMembers();
|
||||
super.open();
|
||||
}
|
||||
max = editable.getByFunction("member").getSlots().size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String calculateName() {
|
||||
return getName().replace("{max}", "" + max).replace("{players}", "" + getPlayerData().getGuild().countMembers());
|
||||
}
|
||||
@Override
|
||||
public void open() {
|
||||
members = playerData.getGuild().listMembers();
|
||||
super.open();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void whenClicked(InventoryClickContext context, InventoryItem item) {
|
||||
@Override
|
||||
public String applyNamePlaceholders(String s) {
|
||||
return s.replace("{max}", "" + max)
|
||||
.replace("{players}", "" + getPlayerData().getGuild().countMembers());
|
||||
|
||||
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")) {
|
||||
@Override
|
||||
public void whenClicked(InventoryClickEvent event, InventoryItem item) {
|
||||
|
||||
if (playerData.getGuild().countMembers() >= max) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("guild-is-full").send(player);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1);
|
||||
return;
|
||||
}
|
||||
if (item.getFunction().equals("leave")) {
|
||||
playerData.getGuild().removeMember(playerData.getUniqueId());
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1);
|
||||
player.closeInventory();
|
||||
return;
|
||||
}
|
||||
|
||||
new ChatInput(player, PlayerInput.InputType.GUILD_INVITE, context.getInventoryHolder(), input -> {
|
||||
Player target = Bukkit.getPlayer(input);
|
||||
if (target == null) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("not-online-player", "player", input).send(player);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1);
|
||||
open();
|
||||
return;
|
||||
}
|
||||
if (item.getFunction().equals("invite")) {
|
||||
|
||||
long remaining = playerData.getGuild().getLastInvite(target) + 60 * 2 * 1000 - System.currentTimeMillis();
|
||||
if (remaining > 0) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("guild-invite-cooldown", "player", target.getName(), "cooldown",
|
||||
new DelayFormat().format(remaining)).send(player);
|
||||
open();
|
||||
return;
|
||||
}
|
||||
if (playerData.getGuild().countMembers() >= max) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("guild-is-full").send(player);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
PlayerData targetData = PlayerData.get(target);
|
||||
if (playerData.getGuild().hasMember(target.getUniqueId())) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("already-in-guild", "player", target.getName()).send(player);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1);
|
||||
open();
|
||||
return;
|
||||
}
|
||||
new ChatInput(player, PlayerInput.InputType.GUILD_INVITE, this, input -> {
|
||||
Player target = Bukkit.getPlayer(input);
|
||||
if (target == null) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("not-online-player", "player", input).send(player);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1);
|
||||
open();
|
||||
return;
|
||||
}
|
||||
|
||||
playerData.getGuild().sendGuildInvite(playerData, targetData);
|
||||
MMOCore.plugin.configManager.getSimpleMessage("sent-guild-invite", "player", target.getName()).send(player);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1);
|
||||
open();
|
||||
});
|
||||
}
|
||||
long remaining = playerData.getGuild().getLastInvite(target) + 60 * 2 * 1000 - System.currentTimeMillis();
|
||||
if (remaining > 0) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("guild-invite-cooldown", "player", target.getName(), "cooldown",
|
||||
new DelayFormat().format(remaining)).send(player);
|
||||
open();
|
||||
return;
|
||||
}
|
||||
|
||||
if (item.getFunction().equals("member") && context.getClickType() == ClickType.RIGHT) {
|
||||
if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId()))
|
||||
return;
|
||||
PlayerData targetData = PlayerData.get(target);
|
||||
if (playerData.getGuild().hasMember(target.getUniqueId())) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("already-in-guild", "player", target.getName()).send(player);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1);
|
||||
open();
|
||||
return;
|
||||
}
|
||||
|
||||
OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(context.getClickedItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING)));
|
||||
if (target.equals(player))
|
||||
return;
|
||||
playerData.getGuild().sendGuildInvite(playerData, targetData);
|
||||
MMOCore.plugin.configManager.getSimpleMessage("sent-guild-invite", "player", target.getName()).send(player);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1);
|
||||
open();
|
||||
});
|
||||
}
|
||||
|
||||
playerData.getGuild().removeMember(target.getUniqueId());
|
||||
MMOCore.plugin.configManager.getSimpleMessage("kick-from-guild", "player", target.getName()).send(player);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (item.getFunction().equals("member") && event.getClick() == ClickType.RIGHT) {
|
||||
if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId()))
|
||||
return;
|
||||
|
||||
OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(event.getCurrentItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING)));
|
||||
if (target.equals(player))
|
||||
return;
|
||||
|
||||
playerData.getGuild().removeMember(target.getUniqueId());
|
||||
MMOCore.plugin.configManager.getSimpleMessage("kick-from-guild", "player", target.getName()).send(player);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,90 +1,93 @@
|
||||
package net.Indyuce.mmocore.gui.social.guild;
|
||||
|
||||
import io.lumine.mythic.lib.gui.framework.EditableInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.GeneratedInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.item.InventoryItem;
|
||||
import io.lumine.mythic.lib.gui.framework.item.SimpleItem;
|
||||
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.manager.data.GuildDataManager;
|
||||
import net.Indyuce.mmocore.api.util.input.ChatInput;
|
||||
import net.Indyuce.mmocore.api.util.input.PlayerInput;
|
||||
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.entity.Player;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class EditableGuildCreation extends EditableInventory {
|
||||
public EditableGuildCreation() {
|
||||
super("guild-creation");
|
||||
}
|
||||
|
||||
@Override
|
||||
public InventoryItem load(String function, ConfigurationSection config) {
|
||||
return new SimplePlaceholderItem(config);
|
||||
public class EditableGuildCreation extends EditableInventory<PlayerData> {
|
||||
public EditableGuildCreation() {
|
||||
super("guild-creation");
|
||||
}
|
||||
|
||||
public GeneratedInventory newInventory(PlayerData data) {
|
||||
return new GuildCreationInventory(data, this);
|
||||
}
|
||||
@Override
|
||||
public GeneratedInventory generate(PlayerData playerData, @Nullable GeneratedInventory generatedInventory) {
|
||||
return new GuildCreationInventory(playerData, this);
|
||||
|
||||
public class GuildCreationInventory extends GeneratedInventory {
|
||||
public GuildCreationInventory(PlayerData playerData, EditableInventory editable) {
|
||||
super(playerData, editable);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void whenClicked(InventoryClickContext context, InventoryItem item) {
|
||||
|
||||
if (item.getFunction().equals("create")) {
|
||||
new ChatInput(player, PlayerInput.InputType.GUILD_CREATION_TAG, context.getInventoryHolder(), input -> {
|
||||
if(MMOCore.plugin.dataProvider.getGuildManager().getConfig().shouldUppercaseTags())
|
||||
input = input.toUpperCase();
|
||||
|
||||
if(check(player, input, MMOCore.plugin.dataProvider.getGuildManager().getConfig().getTagRules())) {
|
||||
String tag = input;
|
||||
@Override
|
||||
public InventoryItem loadItem(String function, ConfigurationSection config) {
|
||||
return new SimpleItem(config);
|
||||
}
|
||||
|
||||
new ChatInput(player, PlayerInput.InputType.GUILD_CREATION_NAME, context.getInventoryHolder(), name -> {
|
||||
if(check(player, name, MMOCore.plugin.dataProvider.getGuildManager().getConfig().getNameRules())) {
|
||||
MMOCore.plugin.dataProvider.getGuildManager().newRegisteredGuild(playerData.getUniqueId(), name, tag);
|
||||
MMOCore.plugin.dataProvider.getGuildManager().getGuild(tag.toLowerCase()).addMember(playerData.getUniqueId());
|
||||
public class GuildCreationInventory extends GeneratedInventory<PlayerData> {
|
||||
public GuildCreationInventory(PlayerData playerData, EditableInventory editable) {
|
||||
super(playerData, editable);
|
||||
}
|
||||
|
||||
InventoryManager.GUILD_VIEW.newInventory(playerData).open();
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
@Override
|
||||
public String applyNamePlaceholders(String s) {
|
||||
return s;
|
||||
}
|
||||
|
||||
if (item.getFunction().equals("back"))
|
||||
player.closeInventory();
|
||||
}
|
||||
@Override
|
||||
public void whenClicked(InventoryClickEvent event, InventoryItem item) {
|
||||
|
||||
@Override
|
||||
public String calculateName() {
|
||||
return getName();
|
||||
}
|
||||
}
|
||||
if (item.getFunction().equals("create")) {
|
||||
new ChatInput(player, PlayerInput.InputType.GUILD_CREATION_TAG, this, input -> {
|
||||
if (MMOCore.plugin.dataProvider.getGuildManager().getConfig().shouldUppercaseTags())
|
||||
input = input.toUpperCase();
|
||||
|
||||
public boolean check(Player player, String input, GuildDataManager.GuildConfiguration.NamingRules rules) {
|
||||
String reason;
|
||||
|
||||
if(input.length() <= rules.getMax() && input.length() >= rules.getMin())
|
||||
if(input.matches(rules.getRegex()))
|
||||
if(!MMOCore.plugin.dataProvider.getGuildManager().isRegistered(input))
|
||||
return true;
|
||||
else
|
||||
reason = MMOCore.plugin.configManager.getSimpleMessage("guild-creation.reasons.already-taken").message();
|
||||
else
|
||||
reason = MMOCore.plugin.configManager.getSimpleMessage("guild-creation.reasons.invalid-characters").message();
|
||||
else
|
||||
reason = MMOCore.plugin.configManager.getSimpleMessage("guild-creation.reasons.invalid-length", "min", "" + rules.getMin(), "max", "" + rules.getMax()).message();
|
||||
|
||||
MMOCore.plugin.configManager.getSimpleMessage("guild-creation.failed", "reason", reason).send(player);
|
||||
return false;
|
||||
}
|
||||
if (check(player, input, MMOCore.plugin.dataProvider.getGuildManager().getConfig().getTagRules())) {
|
||||
String tag = input;
|
||||
|
||||
new ChatInput(player, PlayerInput.InputType.GUILD_CREATION_NAME, this, name -> {
|
||||
if (check(player, name, MMOCore.plugin.dataProvider.getGuildManager().getConfig().getNameRules())) {
|
||||
MMOCore.plugin.dataProvider.getGuildManager().newRegisteredGuild(playerData.getUniqueId(), name, tag);
|
||||
MMOCore.plugin.dataProvider.getGuildManager().getGuild(tag.toLowerCase()).addMember(playerData.getUniqueId());
|
||||
|
||||
InventoryManager.GUILD_VIEW.generate(playerData, this).open();
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (item.getFunction().equals("back"))
|
||||
player.closeInventory();
|
||||
}
|
||||
}
|
||||
|
||||
public boolean check(Player player, String input, GuildDataManager.GuildConfiguration.NamingRules rules) {
|
||||
String reason;
|
||||
|
||||
if (input.length() <= rules.getMax() && input.length() >= rules.getMin())
|
||||
if (input.matches(rules.getRegex()))
|
||||
if (!MMOCore.plugin.dataProvider.getGuildManager().isRegistered(input))
|
||||
return true;
|
||||
else
|
||||
reason = MMOCore.plugin.configManager.getSimpleMessage("guild-creation.reasons.already-taken").message();
|
||||
else
|
||||
reason = MMOCore.plugin.configManager.getSimpleMessage("guild-creation.reasons.invalid-characters").message();
|
||||
else
|
||||
reason = MMOCore.plugin.configManager.getSimpleMessage("guild-creation.reasons.invalid-length", "min", "" + rules.getMin(), "max", "" + rules.getMax()).message();
|
||||
|
||||
MMOCore.plugin.configManager.getSimpleMessage("guild-creation.failed", "reason", reason).send(player);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -1,257 +1,266 @@
|
||||
package net.Indyuce.mmocore.gui.social.guild;
|
||||
|
||||
import io.lumine.mythic.lib.gui.framework.EditableInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.GeneratedInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.item.InventoryItem;
|
||||
import io.lumine.mythic.lib.gui.framework.item.Placeholders;
|
||||
import io.lumine.mythic.lib.gui.framework.item.SimpleItem;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import net.Indyuce.mmocore.api.util.math.format.DelayFormat;
|
||||
import net.Indyuce.mmocore.gui.api.InventoryClickContext;
|
||||
import net.Indyuce.mmocore.api.util.input.ChatInput;
|
||||
import net.Indyuce.mmocore.api.util.input.PlayerInput;
|
||||
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.manager.data.OfflinePlayerData;
|
||||
import net.Indyuce.mmocore.gui.api.EditableInventory;
|
||||
import net.Indyuce.mmocore.gui.api.item.Placeholders;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.*;
|
||||
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.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
public class EditableGuildView extends EditableInventory {
|
||||
private static final NamespacedKey UUID_NAMESPACEDKEY = new NamespacedKey(MMOCore.plugin, "Uuid");
|
||||
public class EditableGuildView extends EditableInventory<PlayerData> {
|
||||
private static final NamespacedKey UUID_NAMESPACEDKEY = new NamespacedKey(MMOCore.plugin, "Uuid");
|
||||
|
||||
public EditableGuildView() {
|
||||
super("guild-view");
|
||||
}
|
||||
public EditableGuildView() {
|
||||
super("guild-view");
|
||||
}
|
||||
|
||||
@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);
|
||||
}
|
||||
@Override
|
||||
public GeneratedInventory generate(PlayerData playerData, @Nullable GeneratedInventory generatedInventory) {
|
||||
return new GuildViewInventory(playerData, this);
|
||||
}
|
||||
|
||||
public static class MemberDisplayItem extends InventoryItem<GuildViewInventory> {
|
||||
public MemberDisplayItem(MemberItem memberItem, ConfigurationSection config) {
|
||||
super(memberItem, config);
|
||||
}
|
||||
@Override
|
||||
public InventoryItem loadItem(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 SimpleItem(config);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasDifferentDisplay() {
|
||||
return true;
|
||||
}
|
||||
public static class MemberDisplayItem extends InventoryItem<GuildViewInventory> {
|
||||
public MemberDisplayItem(MemberItem memberItem, ConfigurationSection config) {
|
||||
super(memberItem, config);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Placeholders getPlaceholders(GuildViewInventory inv, int n) {
|
||||
UUID uuid = inv.members.get(n);
|
||||
Placeholders holders = new Placeholders();
|
||||
/*
|
||||
* Will never be null since a players name will always be recorded
|
||||
* if they've been in a guild
|
||||
*/
|
||||
holders.register("name", Bukkit.getOfflinePlayer(uuid).getName());
|
||||
@Override
|
||||
public boolean hasDifferentDisplay() {
|
||||
return true;
|
||||
}
|
||||
|
||||
OfflinePlayerData offline = OfflinePlayerData.get(uuid);
|
||||
holders.register("class", offline.getProfess().getName());
|
||||
holders.register("level", offline.getLevel());
|
||||
holders.register("since", new DelayFormat(2).format(System.currentTimeMillis() - offline.getLastLogin()));
|
||||
@Override
|
||||
public Placeholders getPlaceholders(GuildViewInventory inv, int n) {
|
||||
UUID uuid = inv.members.get(n);
|
||||
Placeholders holders = new Placeholders();
|
||||
/*
|
||||
* Will never be null since a players name will always be recorded
|
||||
* if they've been in a guild
|
||||
*/
|
||||
holders.register("name", Bukkit.getOfflinePlayer(uuid).getName());
|
||||
|
||||
return holders;
|
||||
}
|
||||
OfflinePlayerData offline = OfflinePlayerData.get(uuid);
|
||||
holders.register("class", offline.getProfess().getName());
|
||||
holders.register("level", offline.getLevel());
|
||||
holders.register("since", new DelayFormat(2).format(System.currentTimeMillis() - offline.getLastLogin()));
|
||||
|
||||
@Override
|
||||
public ItemStack display(GuildViewInventory inv, int n) {
|
||||
UUID uuid = inv.members.get(n);
|
||||
return holders;
|
||||
}
|
||||
|
||||
ItemStack disp = super.display(inv, n);
|
||||
ItemMeta meta = disp.getItemMeta();
|
||||
meta.getPersistentDataContainer().set(UUID_NAMESPACEDKEY, PersistentDataType.STRING, uuid.toString());
|
||||
@Override
|
||||
public ItemStack getDisplayedItem(GuildViewInventory inv, int n) {
|
||||
UUID uuid = inv.members.get(n);
|
||||
|
||||
if (meta instanceof SkullMeta)
|
||||
inv.dynamicallyUpdateItem(this, n, disp, current -> {
|
||||
((SkullMeta) meta).setOwningPlayer(Bukkit.getOfflinePlayer(uuid));
|
||||
current.setItemMeta(meta);
|
||||
});
|
||||
ItemStack disp = super.getDisplayedItem(inv, n);
|
||||
ItemMeta meta = disp.getItemMeta();
|
||||
meta.getPersistentDataContainer().set(UUID_NAMESPACEDKEY, PersistentDataType.STRING, uuid.toString());
|
||||
|
||||
disp.setItemMeta(meta);
|
||||
return disp;
|
||||
}
|
||||
}
|
||||
if (meta instanceof SkullMeta)
|
||||
inv.dynamicallyUpdateItem(this, n, disp, current -> {
|
||||
((SkullMeta) meta).setOwningPlayer(Bukkit.getOfflinePlayer(uuid));
|
||||
current.setItemMeta(meta);
|
||||
});
|
||||
|
||||
public class MemberItem extends SimplePlaceholderItem<GuildViewInventory> {
|
||||
private final InventoryItem empty;
|
||||
private final MemberDisplayItem member;
|
||||
disp.setItemMeta(meta);
|
||||
return disp;
|
||||
}
|
||||
}
|
||||
|
||||
public MemberItem(ConfigurationSection config) {
|
||||
super(Material.BARRIER, config);
|
||||
public class MemberItem extends SimpleItem<GuildViewInventory> {
|
||||
private final InventoryItem empty;
|
||||
private final MemberDisplayItem member;
|
||||
|
||||
Validate.notNull(config.contains("empty"), "Could not load empty config");
|
||||
Validate.notNull(config.contains("member"), "Could not load member config");
|
||||
public MemberItem(ConfigurationSection config) {
|
||||
super(Material.BARRIER, config);
|
||||
|
||||
empty = new SimplePlaceholderItem(config.getConfigurationSection("empty"));
|
||||
member = new MemberDisplayItem(this, config.getConfigurationSection("member"));
|
||||
}
|
||||
Validate.notNull(config.contains("empty"), "Could not load empty config");
|
||||
Validate.notNull(config.contains("member"), "Could not load member config");
|
||||
|
||||
@Override
|
||||
public ItemStack display(GuildViewInventory inv, int n) {
|
||||
int index = n * inv.getPage();
|
||||
return inv.getPlayerData().getGuild().countMembers() > index ? member.display(inv, index) : empty.display(inv, index);
|
||||
}
|
||||
empty = new SimpleItem(config.getConfigurationSection("empty"));
|
||||
member = new MemberDisplayItem(this, config.getConfigurationSection("member"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasDifferentDisplay() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public ItemStack getDisplayedItem(GuildViewInventory inv, int n) {
|
||||
int index = n * inv.getPage();
|
||||
return inv.getPlayerData().getGuild().countMembers() > index ? member.getDisplayedItem(inv, index) : empty.getDisplayedItem(inv, index);
|
||||
}
|
||||
|
||||
public class ConditionalItem extends SimplePlaceholderItem<GuildViewInventory> {
|
||||
private final String function;
|
||||
@Override
|
||||
public boolean hasDifferentDisplay() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public ConditionalItem(String func, ConfigurationSection config) {
|
||||
super(config);
|
||||
this.function = func;
|
||||
}
|
||||
public class ConditionalItem extends SimpleItem<GuildViewInventory> {
|
||||
private final String function;
|
||||
|
||||
@Override
|
||||
public ItemStack display(GuildViewInventory inv, int n) {
|
||||
public ConditionalItem(String func, ConfigurationSection config) {
|
||||
super(config);
|
||||
this.function = func;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public ItemStack getDisplayedItem(GuildViewInventory inv, int n) {
|
||||
|
||||
public GeneratedInventory newInventory(PlayerData data) {
|
||||
return new GuildViewInventory(data, this);
|
||||
}
|
||||
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.getDisplayedItem(inv, n);
|
||||
}
|
||||
}
|
||||
|
||||
public class GuildViewInventory extends GeneratedInventory {
|
||||
private final int maxpages;
|
||||
|
||||
private int page = 1;
|
||||
private List<UUID> members;
|
||||
public class GuildViewInventory extends GeneratedInventory<PlayerData> {
|
||||
private final int maxpages;
|
||||
|
||||
public GuildViewInventory(PlayerData playerData, EditableInventory editable) {
|
||||
super(playerData, editable);
|
||||
private int page = 1;
|
||||
private List<UUID> members;
|
||||
|
||||
maxpages = (playerData.getGuild().countMembers() + 20) / editable.getByFunction("member").getSlots().size();
|
||||
}
|
||||
public GuildViewInventory(PlayerData playerData, EditableInventory editable) {
|
||||
super(playerData, editable);
|
||||
|
||||
@Override
|
||||
public void open() {
|
||||
members = playerData.getGuild().listMembers();
|
||||
super.open();
|
||||
}
|
||||
maxpages = (playerData.getGuild().countMembers() + 20) / editable.getByFunction("member").getSlots().size();
|
||||
}
|
||||
|
||||
@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 open() {
|
||||
members = playerData.getGuild().listMembers();
|
||||
super.open();
|
||||
}
|
||||
|
||||
@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;
|
||||
}
|
||||
@Override
|
||||
public String applyNamePlaceholders(String s) {
|
||||
return s.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());
|
||||
}
|
||||
|
||||
if (item.getFunction().equals("next") && page != maxpages) {
|
||||
page++;
|
||||
open();
|
||||
return;
|
||||
}
|
||||
@Override
|
||||
public void whenClicked(InventoryClickEvent event, 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("previous") && page != 1) {
|
||||
page--;
|
||||
open();
|
||||
return;
|
||||
}
|
||||
if (item.getFunction().equals("next") && page != maxpages) {
|
||||
page++;
|
||||
open();
|
||||
return;
|
||||
}
|
||||
|
||||
if (item.getFunction().equals("disband")) {
|
||||
if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId()))
|
||||
return;
|
||||
MMOCore.plugin.dataProvider.getGuildManager().unregisterGuild(playerData.getGuild());
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1);
|
||||
player.closeInventory();
|
||||
return;
|
||||
}
|
||||
if (item.getFunction().equals("previous") && page != 1) {
|
||||
page--;
|
||||
open();
|
||||
return;
|
||||
}
|
||||
|
||||
if (item.getFunction().equals("invite")) {
|
||||
if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId()))
|
||||
return;
|
||||
if (item.getFunction().equals("disband")) {
|
||||
if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId()))
|
||||
return;
|
||||
MMOCore.plugin.dataProvider.getGuildManager().unregisterGuild(playerData.getGuild());
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1);
|
||||
player.closeInventory();
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* if (playerData.getGuild().getMembers().count() >= max) {
|
||||
* MMOCore.plugin.configManager.getSimpleMessage("guild-is-full").send(player);
|
||||
* player.playSound(player.getLocation(),
|
||||
* Sound.ENTITY_VILLAGER_NO, 1, 1); return; }
|
||||
*/
|
||||
if (item.getFunction().equals("invite")) {
|
||||
if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId()))
|
||||
return;
|
||||
|
||||
new ChatInput(player, PlayerInput.InputType.GUILD_INVITE, context.getInventoryHolder(), input -> {
|
||||
Player target = Bukkit.getPlayer(input);
|
||||
if (target == null) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("not-online-player", "player", input).send(player);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1);
|
||||
open();
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* if (playerData.getGuild().getMembers().count() >= max) {
|
||||
* MMOCore.plugin.configManager.getSimpleMessage("guild-is-full").send(player);
|
||||
* player.playSound(player.getLocation(),
|
||||
* Sound.ENTITY_VILLAGER_NO, 1, 1); return; }
|
||||
*/
|
||||
|
||||
long remaining = playerData.getGuild().getLastInvite(target) + 60 * 2 * 1000 - System.currentTimeMillis();
|
||||
if (remaining > 0) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("guild-invite-cooldown", "player", target.getName(), "cooldown", new DelayFormat().format(remaining)).send(player);
|
||||
open();
|
||||
return;
|
||||
}
|
||||
new ChatInput(player, PlayerInput.InputType.GUILD_INVITE, this, input -> {
|
||||
Player target = Bukkit.getPlayer(input);
|
||||
if (target == null) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("not-online-player", "player", input).send(player);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1);
|
||||
open();
|
||||
return;
|
||||
}
|
||||
|
||||
PlayerData targetData = PlayerData.get(target);
|
||||
if (playerData.getGuild().hasMember(targetData.getUniqueId())) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("already-in-guild", "player", target.getName()).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) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("guild-invite-cooldown", "player", target.getName(), "cooldown", new DelayFormat().format(remaining)).send(player);
|
||||
open();
|
||||
return;
|
||||
}
|
||||
|
||||
playerData.getGuild().sendGuildInvite(playerData, targetData);
|
||||
MMOCore.plugin.configManager.getSimpleMessage("sent-guild-invite", "player", target.getName()).send(player);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1);
|
||||
open();
|
||||
});
|
||||
}
|
||||
PlayerData targetData = PlayerData.get(target);
|
||||
if (playerData.getGuild().hasMember(targetData.getUniqueId())) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("already-in-guild", "player", target.getName()).send(player);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1);
|
||||
open();
|
||||
return;
|
||||
}
|
||||
|
||||
if (item.getFunction().equals("member") && context.getClickType() == ClickType.RIGHT) {
|
||||
if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId()))
|
||||
return;
|
||||
playerData.getGuild().sendGuildInvite(playerData, targetData);
|
||||
MMOCore.plugin.configManager.getSimpleMessage("sent-guild-invite", "player", target.getName()).send(player);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1);
|
||||
open();
|
||||
});
|
||||
}
|
||||
|
||||
String tag = context.getClickedItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING);
|
||||
if (tag == null || tag.isEmpty())
|
||||
return;
|
||||
if (item.getFunction().equals("member") && event.getClick() == ClickType.RIGHT) {
|
||||
if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId()))
|
||||
return;
|
||||
|
||||
OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(tag));
|
||||
if (target.equals(player))
|
||||
return;
|
||||
String tag = event.getCurrentItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING);
|
||||
if (tag == null || tag.isEmpty())
|
||||
return;
|
||||
|
||||
playerData.getGuild().removeMember(target.getUniqueId());
|
||||
MMOCore.plugin.configManager.getSimpleMessage("kick-from-guild", "player", target.getName()).send(player);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1);
|
||||
}
|
||||
}
|
||||
OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(tag));
|
||||
if (target.equals(player))
|
||||
return;
|
||||
|
||||
public int getPage() {
|
||||
return page;
|
||||
}
|
||||
}
|
||||
playerData.getGuild().removeMember(target.getUniqueId());
|
||||
MMOCore.plugin.configManager.getSimpleMessage("kick-from-guild", "player", target.getName()).send(player);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
public int getPage() {
|
||||
return page;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,52 +1,54 @@
|
||||
package net.Indyuce.mmocore.gui.social.party;
|
||||
|
||||
import io.lumine.mythic.lib.gui.framework.EditableInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.GeneratedInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.item.InventoryItem;
|
||||
import io.lumine.mythic.lib.gui.framework.item.SimpleItem;
|
||||
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.Nullable;
|
||||
|
||||
public class EditablePartyCreation extends EditableInventory {
|
||||
public EditablePartyCreation() {
|
||||
super("party-creation");
|
||||
}
|
||||
|
||||
@Override
|
||||
public InventoryItem load(String function, ConfigurationSection config) {
|
||||
return new SimplePlaceholderItem(config);
|
||||
public class EditablePartyCreation extends EditableInventory<PlayerData> {
|
||||
public EditablePartyCreation() {
|
||||
super("party-creation");
|
||||
}
|
||||
|
||||
public GeneratedInventory newInventory(PlayerData data) {
|
||||
return new ClassConfirmationInventory(data, this);
|
||||
}
|
||||
@Override
|
||||
public GeneratedInventory generate(PlayerData playerData, @Nullable GeneratedInventory generatedInventory) {
|
||||
return new ClassConfirmationInventory(playerData, this);
|
||||
}
|
||||
|
||||
public class ClassConfirmationInventory extends GeneratedInventory {
|
||||
public ClassConfirmationInventory(PlayerData playerData, EditableInventory editable) {
|
||||
super(playerData, editable);
|
||||
}
|
||||
@Override
|
||||
public InventoryItem loadItem(String function, ConfigurationSection config) {
|
||||
return new SimpleItem(config);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void whenClicked(InventoryClickContext context, InventoryItem item) {
|
||||
public class ClassConfirmationInventory extends GeneratedInventory<PlayerData> {
|
||||
public ClassConfirmationInventory(PlayerData playerData, EditableInventory editable) {
|
||||
super(playerData, editable);
|
||||
}
|
||||
|
||||
if (item.getFunction().equals("create")) {
|
||||
@Override
|
||||
public String applyNamePlaceholders(String s) {
|
||||
return s;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void whenClicked(InventoryClickEvent event, InventoryItem item) {
|
||||
|
||||
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);
|
||||
}
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1);
|
||||
}
|
||||
|
||||
if (item.getFunction().equals("back"))
|
||||
player.closeInventory();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String calculateName() {
|
||||
return getName();
|
||||
}
|
||||
}
|
||||
if (item.getFunction().equals("back"))
|
||||
player.closeInventory();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,43 +1,52 @@
|
||||
package net.Indyuce.mmocore.gui.social.party;
|
||||
|
||||
import io.lumine.mythic.lib.gui.framework.EditableInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.GeneratedInventory;
|
||||
import io.lumine.mythic.lib.gui.framework.item.InventoryItem;
|
||||
import io.lumine.mythic.lib.gui.framework.item.Placeholders;
|
||||
import io.lumine.mythic.lib.gui.framework.item.SimpleItem;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import net.Indyuce.mmocore.api.util.math.format.DelayFormat;
|
||||
import net.Indyuce.mmocore.gui.api.InventoryClickContext;
|
||||
import net.Indyuce.mmocore.party.provided.Party;
|
||||
import net.Indyuce.mmocore.api.util.input.ChatInput;
|
||||
import net.Indyuce.mmocore.api.util.input.PlayerInput;
|
||||
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 net.Indyuce.mmocore.gui.api.item.Placeholders;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.*;
|
||||
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;
|
||||
|
||||
public class EditablePartyView extends EditableInventory {
|
||||
public class EditablePartyView extends EditableInventory<PlayerData> {
|
||||
private static final NamespacedKey UUID_NAMESPACEDKEY = new NamespacedKey(MMOCore.plugin, "Uuid");
|
||||
|
||||
public EditablePartyView() {
|
||||
super("party-view");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public InventoryItem load(String function, ConfigurationSection config) {
|
||||
return function.equals("member") ? new MemberItem(config) : new SimplePlaceholderItem(config);
|
||||
public InventoryItem loadItem(String function, ConfigurationSection config) {
|
||||
return function.equals("member") ? new MemberItem(config) : new SimpleItem(config);
|
||||
}
|
||||
|
||||
public static class MemberDisplayItem extends InventoryItem {
|
||||
@Override
|
||||
public GeneratedInventory generate(PlayerData playerData, @Nullable GeneratedInventory generatedInventory) {
|
||||
return new PartyViewInventory(playerData, this);
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static class MemberDisplayItem extends InventoryItem<PartyViewInventory> {
|
||||
public MemberDisplayItem(MemberItem memberItem, ConfigurationSection config) {
|
||||
super(memberItem, config);
|
||||
}
|
||||
@ -48,7 +57,7 @@ public class EditablePartyView extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Placeholders getPlaceholders(GeneratedInventory inv, int n) {
|
||||
public Placeholders getPlaceholders(PartyViewInventory inv, int n) {
|
||||
Party party = (Party) inv.getPlayerData().getParty();
|
||||
PlayerData member = party.getMembers().get(n);
|
||||
|
||||
@ -63,22 +72,23 @@ public class EditablePartyView extends EditableInventory {
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Player getEffectivePlayer(GeneratedInventory inv, int n) {
|
||||
public Player getEffectivePlayer(PartyViewInventory inv, int n) {
|
||||
return ((Party) inv.getPlayerData().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());
|
||||
|
||||
if (meta instanceof SkullMeta)
|
||||
inv.dynamicallyUpdateItem(this, n, disp, current -> {
|
||||
((SkullMeta) meta).setOwningPlayer(member);
|
||||
current.setItemMeta(meta);
|
||||
current.47
|
||||
setItemMeta(meta);
|
||||
});
|
||||
|
||||
disp.setItemMeta(meta);
|
||||
@ -86,7 +96,7 @@ public class EditablePartyView extends EditableInventory {
|
||||
}
|
||||
}
|
||||
|
||||
public static class MemberItem extends SimplePlaceholderItem {
|
||||
public static class MemberItem extends SimpleItem<PartyViewInventory> {
|
||||
private final InventoryItem empty;
|
||||
private final MemberDisplayItem member;
|
||||
|
||||
@ -96,14 +106,14 @@ public class EditablePartyView 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(GeneratedInventory inv, int n) {
|
||||
public ItemStack getDisplayedItem(PartyViewInventory inv, int n) {
|
||||
Party party = (Party) inv.getPlayerData().getParty();
|
||||
return party.getMembers().size() > n ? member.display(inv, n) : empty.display(inv, n);
|
||||
return party.getMembers().size() > n ? member.getDisplayedItem(inv, n) : empty.getDisplayedItem(inv, n);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -112,29 +122,28 @@ public class EditablePartyView extends EditableInventory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canDisplay(GeneratedInventory inv) {
|
||||
public boolean isDisplayed(PartyViewInventory inv) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public GeneratedInventory newInventory(PlayerData data) {
|
||||
return new PartyViewInventory(data, this);
|
||||
}
|
||||
|
||||
public class PartyViewInventory extends GeneratedInventory {
|
||||
public class PartyViewInventory extends GeneratedInventory<PlayerData> {
|
||||
|
||||
public PartyViewInventory(PlayerData playerData, EditableInventory editable) {
|
||||
super(playerData, editable);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String calculateName() {
|
||||
public String applyNamePlaceholders(String s) {
|
||||
Party party = (Party) getPlayerData().getParty();
|
||||
return getName().replace("{max}", "" + MMOCore.plugin.configManager.maxPartyPlayers).replace("{players}", "" + party.getMembers().size());
|
||||
return s.replace("{max}", "" + MMOCore.plugin.configManager.maxPartyPlayers)
|
||||
.replace("{players}", "" + party.getMembers().size());
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void whenClicked(InventoryClickContext context, InventoryItem item) {
|
||||
public void whenClicked(InventoryClickEvent event, InventoryItem item) {
|
||||
Party party = (Party) playerData.getParty();
|
||||
|
||||
if (item.getFunction().equals("leave")) {
|
||||
@ -152,7 +161,7 @@ public class EditablePartyView extends EditableInventory {
|
||||
return;
|
||||
}
|
||||
|
||||
new ChatInput(player, PlayerInput.InputType.PARTY_INVITE, context.getInventoryHolder(), input -> {
|
||||
new ChatInput(player, PlayerInput.InputType.PARTY_INVITE, this, input -> {
|
||||
Player target = Bukkit.getPlayer(input);
|
||||
if (target == null) {
|
||||
MMOCore.plugin.configManager.getSimpleMessage("not-online-player", "player", input).send(player);
|
||||
@ -191,11 +200,11 @@ public class EditablePartyView extends EditableInventory {
|
||||
});
|
||||
}
|
||||
|
||||
if (item.getFunction().equals("member") && context.getClickType() == ClickType.RIGHT) {
|
||||
if (item.getFunction().equals("member") && event.getClick() == ClickType.RIGHT) {
|
||||
if (!party.getOwner().equals(playerData))
|
||||
return;
|
||||
|
||||
OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(context.getClickedItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING)));
|
||||
OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(event.getCurrentItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING)));
|
||||
if (target.equals(player))
|
||||
return;
|
||||
|
||||
|
@ -1,11 +1,9 @@
|
||||
package net.Indyuce.mmocore.guild.provided;
|
||||
|
||||
import io.lumine.mythic.lib.comp.interaction.relation.Relationship;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.ConfigMessage;
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import net.Indyuce.mmocore.api.player.social.Request;
|
||||
import net.Indyuce.mmocore.gui.api.PluginInventory;
|
||||
import net.Indyuce.mmocore.gui.social.guild.EditableGuildView;
|
||||
import net.Indyuce.mmocore.guild.AbstractGuild;
|
||||
import net.Indyuce.mmocore.manager.InventoryManager;
|
||||
|
@ -41,7 +41,7 @@ public class CastingParticle {
|
||||
display = (loc) -> loc.getWorld().spawnParticle(particle, loc, 0);
|
||||
}
|
||||
|
||||
public void display(Location loc) {
|
||||
public void getDisplayedItem(Location loc) {
|
||||
display.accept(loc);
|
||||
}
|
||||
}
|
||||
|
@ -1,11 +1,11 @@
|
||||
package net.Indyuce.mmocore.manager;
|
||||
|
||||
import io.lumine.mythic.lib.MythicLib;
|
||||
import io.lumine.mythic.lib.gui.framework.item.Placeholders;
|
||||
import io.lumine.mythic.lib.manager.StatManager;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.player.PlayerActivity;
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import net.Indyuce.mmocore.gui.api.item.Placeholders;
|
||||
import net.md_5.bungee.api.ChatMessageType;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.attribute.Attribute;
|
||||
|
@ -1,10 +1,10 @@
|
||||
package net.Indyuce.mmocore.manager;
|
||||
|
||||
import io.lumine.mythic.lib.UtilityMethods;
|
||||
import io.lumine.mythic.lib.gui.framework.EditableInventory;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.ConfigFile;
|
||||
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;
|
||||
@ -12,7 +12,6 @@ import net.Indyuce.mmocore.gui.social.guild.EditableGuildCreation;
|
||||
import net.Indyuce.mmocore.gui.social.guild.EditableGuildView;
|
||||
import net.Indyuce.mmocore.gui.social.party.EditablePartyCreation;
|
||||
import net.Indyuce.mmocore.gui.social.party.EditablePartyView;
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.function.BiFunction;
|
||||
|
@ -19,7 +19,7 @@ import java.util.logging.Level;
|
||||
public class RestrictionManager implements MMOCoreManager {
|
||||
|
||||
/**
|
||||
* Using {@link ItemType#display()} instead of an ItemType as
|
||||
* Using {@link ItemType#getDisplayedItem()} instead of an ItemType as
|
||||
* map key to utilize the HashMap O(1) time complexity of the
|
||||
* get function instead of iterating through the key set.
|
||||
*/
|
||||
@ -51,12 +51,12 @@ public class RestrictionManager implements MMOCoreManager {
|
||||
try {
|
||||
perms.postLoad();
|
||||
} catch (IllegalArgumentException exception) {
|
||||
MMOCore.log(Level.WARNING, "Could not post-load perm set '" + perms.getTool().display() + "': " + exception.getMessage());
|
||||
MMOCore.log(Level.WARNING, "Could not post-load perm set '" + perms.getTool().getDisplayedItem() + "': " + exception.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void register(ToolPermissions perms) {
|
||||
map.put(perms.getTool().display(), perms);
|
||||
map.put(perms.getTool().getDisplayedItem(), perms);
|
||||
|
||||
if (perms.isDefault()) {
|
||||
Validate.isTrue(defaultPermissions == null, "There is already a default tool permission set");
|
||||
@ -74,7 +74,7 @@ public class RestrictionManager implements MMOCoreManager {
|
||||
*/
|
||||
@Nullable
|
||||
public ToolPermissions getPermissions(ItemStack item) {
|
||||
String mapKey = ItemType.fromItemStack(item).display();
|
||||
String mapKey = ItemType.fromItemStack(item).getDisplayedItem();
|
||||
ToolPermissions found = map.get(mapKey);
|
||||
return found == null ? defaultPermissions : found;
|
||||
}
|
||||
|
@ -1,7 +1,6 @@
|
||||
package net.Indyuce.mmocore.party.provided;
|
||||
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.gui.api.PluginInventory;
|
||||
import net.Indyuce.mmocore.gui.social.party.EditablePartyView;
|
||||
import net.Indyuce.mmocore.manager.InventoryManager;
|
||||
import net.Indyuce.mmocore.api.ConfigMessage;
|
||||
|
@ -1,6 +1,5 @@
|
||||
package net.Indyuce.mmocore.skill;
|
||||
|
||||
import io.lumine.mythic.lib.MythicLib;
|
||||
import io.lumine.mythic.lib.api.player.EquipmentSlot;
|
||||
import io.lumine.mythic.lib.player.cooldown.CooldownObject;
|
||||
import io.lumine.mythic.lib.player.modifier.ModifierSource;
|
||||
@ -9,7 +8,6 @@ import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import net.Indyuce.mmocore.api.util.math.formula.IntegerLinearValue;
|
||||
import net.Indyuce.mmocore.api.util.math.formula.LinearValue;
|
||||
import net.Indyuce.mmocore.gui.api.item.Placeholders;
|
||||
import net.Indyuce.mmocore.player.Unlockable;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
|
@ -49,7 +49,7 @@ public abstract class SkillCastingInstance extends BukkitRunnable implements Lis
|
||||
for (int k = 0; k < 2; k++) {
|
||||
double a = (double) j++ / 5;
|
||||
caster.getProfess().getCastParticle()
|
||||
.display(caster.getPlayer().getLocation().add(Math.cos(a), 1 + Math.sin(a / 3) / 1.3, Math.sin(a)));
|
||||
.getDisplayedItem(caster.getPlayer().getLocation().add(Math.cos(a), 1 + Math.sin(a / 3) / 1.3, Math.sin(a)));
|
||||
}
|
||||
|
||||
// Apply casting mode-specific effects
|
||||
|
@ -10,7 +10,6 @@ import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.SoundObject;
|
||||
import net.Indyuce.mmocore.api.event.PlayerKeyPressEvent;
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import net.Indyuce.mmocore.gui.api.item.Placeholders;
|
||||
import net.Indyuce.mmocore.skill.cast.*;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
|
@ -1,6 +1,7 @@
|
||||
package net.Indyuce.mmocore.skilltree;
|
||||
|
||||
import io.lumine.mythic.lib.MythicLib;
|
||||
import io.lumine.mythic.lib.gui.framework.item.Placeholders;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
|
||||
@ -8,7 +9,6 @@ import net.Indyuce.mmocore.experience.EXPSource;
|
||||
import net.Indyuce.mmocore.experience.ExpCurve;
|
||||
import net.Indyuce.mmocore.experience.ExperienceObject;
|
||||
import net.Indyuce.mmocore.experience.droptable.ExperienceTable;
|
||||
import net.Indyuce.mmocore.gui.api.item.Placeholders;
|
||||
import net.Indyuce.mmocore.gui.skilltree.display.Icon;
|
||||
import net.Indyuce.mmocore.gui.skilltree.display.NodeType;
|
||||
import net.Indyuce.mmocore.skilltree.tree.ParentInformation;
|
||||
|
@ -7,8 +7,6 @@ import net.Indyuce.mmocore.MMOCore;
|
||||
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.gui.api.InventoryClickContext;
|
||||
import net.Indyuce.mmocore.gui.api.PluginInventory;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
@ -28,7 +26,7 @@ public class PlayerListener implements Listener {
|
||||
@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()));
|
||||
((PluginInventory) event.getInventory().getHolder()).whenClicked(new InventoryClickEvent(event.getRawSlot(), event.getCurrentItem(), event.getClick(), event, event.getInventory(), (PluginInventory) event.getInventory().getHolder()));
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user