Huge refactor to centralize GUI API into MythicLib

This commit is contained in:
Ka0rX 2023-09-12 15:41:11 +01:00
parent c04d46d662
commit ed17756842
47 changed files with 1175 additions and 2230 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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