Fixed an issue with player head in parties/guilds/friends

This commit is contained in:
Indyuce 2022-03-20 16:38:49 +01:00
parent 5660a31d86
commit 045b349183
8 changed files with 416 additions and 389 deletions

View File

@ -200,13 +200,15 @@ public class PlayerStats extends EditableInventory {
@Override
public ItemStack display(GeneratedInventory inv, int n) {
ItemStack item = super.display(inv, n);
if (item.getType() == VersionMaterial.PLAYER_HEAD.toMaterial()) {
SkullMeta meta = (SkullMeta) item.getItemMeta();
ItemStack disp = super.display(inv, n);
if (disp.getType() == VersionMaterial.PLAYER_HEAD.toMaterial()) {
SkullMeta meta = (SkullMeta) disp.getItemMeta();
inv.dynamicallyUpdateItem(this, n, disp, current -> {
meta.setOwningPlayer(inv.getPlayer());
item.setItemMeta(meta);
current.setItemMeta(meta);
});
}
return item;
return disp;
}
@Override

View File

@ -1,20 +1,25 @@
package net.Indyuce.mmocore.gui.api;
import io.lumine.mythic.lib.MythicLib;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.gui.api.item.InventoryItem;
import net.Indyuce.mmocore.gui.api.item.TriggerItem;
import org.bukkit.Bukkit;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
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 Inventory open;
public GeneratedInventory(PlayerData playerData, EditableInventory editable) {
super(playerData);
@ -71,7 +76,19 @@ public abstract class GeneratedInventory extends PluginInventory {
*/
loaded.clear();
getPlayer().openInventory(getInventory());
getPlayer().openInventory(open = getInventory());
}
/**
* @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) {
Bukkit.getScheduler().runTaskAsynchronously(MMOCore.plugin, () -> {
update.accept(placed);
open.setItem(item.getSlots().get(n), placed);
});
}
public void whenClicked(InventoryClickEvent event) {

View File

@ -13,6 +13,8 @@ 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;
@ -24,26 +26,37 @@ 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 placeholders, hideFlags;
private final boolean hideFlags;
public InventoryItem(ConfigurationSection config) {
this(Material.valueOf(config.getString("item", "").toUpperCase().replace(" ", "_").replace("-", "_")), config);
this((InventoryItem) null, config);
}
public InventoryItem(Material material, ConfigurationSection 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.placeholders = config.getBoolean("placeholders");
this.modelData = config.getInt("custom-model-data");
config.getStringList("slots").forEach(str -> slots.add(Integer.parseInt(str)));
@ -53,16 +66,18 @@ public abstract class InventoryItem<T extends GeneratedInventory> {
return id;
}
@NotNull
public String getFunction() {
return function;
return parent == null ? function : parent.function;
}
public boolean hasFunction() {
return !function.isEmpty();
return !getFunction().isEmpty();
}
@NotNull
public List<Integer> getSlots() {
return slots;
return parent == null ? slots : parent.slots;
}
public Material getMaterial() {

View File

@ -5,6 +5,10 @@ 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);
}

View File

@ -1,7 +1,5 @@
package net.Indyuce.mmocore.gui.social.friend;
import io.lumine.mythic.lib.api.item.ItemTag;
import io.lumine.mythic.lib.api.item.NBTItem;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerActivity;
import net.Indyuce.mmocore.api.player.PlayerData;
@ -15,6 +13,7 @@ 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.NamespacedKey;
import org.bukkit.OfflinePlayer;
import org.bukkit.Sound;
import org.bukkit.configuration.ConfigurationSection;
@ -24,10 +23,13 @@ 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 java.util.UUID;
public class EditableFriendList extends EditableInventory {
private static final NamespacedKey UUID_NAMESPACEDKEY = new NamespacedKey(MMOCore.plugin, "Uuid");
public EditableFriendList() {
super("friend-list");
}
@ -64,8 +66,8 @@ public class EditableFriendList extends EditableInventory {
}
public static class OfflineFriendItem extends InventoryItem {
public OfflineFriendItem(ConfigurationSection config) {
super(config);
public OfflineFriendItem(FriendItem parent, ConfigurationSection config) {
super(parent, config);
}
@Override
@ -82,27 +84,11 @@ public class EditableFriendList extends EditableInventory {
holders.register("last_seen", new DelayFormat(2).format(System.currentTimeMillis() - friend.getLastPlayed()));
return holders;
}
@Override
public ItemStack display(GeneratedInventory inv, int n) {
OfflinePlayer friend = Bukkit.getOfflinePlayer(inv.getPlayerData().getFriends().get(n));
ItemStack disp = super.display(inv, n);
ItemMeta meta = disp.getItemMeta();
if (meta instanceof SkullMeta)
Bukkit.getScheduler().runTaskAsynchronously(MMOCore.plugin, () -> {
((SkullMeta) meta).setOwningPlayer(friend);
disp.setItemMeta(meta);
});
return NBTItem.get(disp).addTag(new ItemTag("uuid", friend.getUniqueId().toString())).toItem();
}
}
public static class OnlineFriendItem extends SimplePlaceholderItem {
public OnlineFriendItem(ConfigurationSection config) {
super(config);
public OnlineFriendItem(FriendItem parent, ConfigurationSection config) {
super(parent, config);
}
@Override
@ -123,22 +109,6 @@ public class EditableFriendList extends EditableInventory {
holders.register("online_since", new DelayFormat(2).format(System.currentTimeMillis() - data.getLastLogin()));
return holders;
}
@Override
public ItemStack display(GeneratedInventory inv, int n) {
Player friend = Bukkit.getPlayer(inv.getPlayerData().getFriends().get(n));
ItemStack disp = super.display(inv, n);
ItemMeta meta = disp.getItemMeta();
if (meta instanceof SkullMeta)
Bukkit.getScheduler().runTaskAsynchronously(MMOCore.plugin, () -> {
((SkullMeta) meta).setOwningPlayer(friend);
disp.setItemMeta(meta);
});
return NBTItem.get(disp).addTag(new ItemTag("uuid", friend.getUniqueId().toString())).toItem();
}
}
public static class FriendItem extends SimplePlaceholderItem {
@ -151,14 +121,28 @@ public class EditableFriendList extends EditableInventory {
Validate.notNull(config.contains("online"), "Could not load online config");
Validate.notNull(config.contains("offline"), "Could not load offline config");
online = new OnlineFriendItem(config.getConfigurationSection("online"));
offline = new OfflineFriendItem(config.getConfigurationSection("offline"));
online = new OnlineFriendItem(this, config.getConfigurationSection("online"));
offline = new OfflineFriendItem(this, config.getConfigurationSection("offline"));
}
@Override
public ItemStack display(GeneratedInventory inv, int n) {
return inv.getPlayerData().getFriends().size() <= n ? super.display(inv, n)
: Bukkit.getOfflinePlayer(inv.getPlayerData().getFriends().get(n)).isOnline() ? online.display(inv, n) : offline.display(inv, n);
if (inv.getPlayerData().getFriends().size() <= n)
return super.display(inv, n);
ItemStack disp = Bukkit.getOfflinePlayer(inv.getPlayerData().getFriends().get(n)).isOnline() ? online.display(inv, n) : offline.display(inv, n);
Player friend = Bukkit.getPlayer(inv.getPlayerData().getFriends().get(n));
ItemMeta meta = disp.getItemMeta();
meta.getPersistentDataContainer().set(UUID_NAMESPACEDKEY, PersistentDataType.STRING, friend.getUniqueId().toString());
if (meta instanceof SkullMeta)
inv.dynamicallyUpdateItem(this, n, disp, current -> {
((SkullMeta) meta).setOwningPlayer(friend);
current.setItemMeta(meta);
});
disp.setItemMeta(meta);
return disp;
}
@Override
@ -238,7 +222,7 @@ public class EditableFriendList extends EditableInventory {
}
if (item.getFunction().equals("friend") && event.getAction() == InventoryAction.PICKUP_HALF) {
String tag = NBTItem.get(event.getCurrentItem()).getString("uuid");
String tag = event.getCurrentItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING);
if (tag == null || tag.isEmpty())
return;

View File

@ -13,6 +13,7 @@ import net.Indyuce.mmocore.gui.api.item.Placeholders;
import net.Indyuce.mmocore.gui.api.item.SimplePlaceholderItem;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey;
import org.bukkit.OfflinePlayer;
import org.bukkit.Sound;
import org.bukkit.configuration.ConfigurationSection;
@ -22,10 +23,13 @@ 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 java.util.UUID;
public class EditableGuildAdmin extends EditableInventory {
private static final NamespacedKey UUID_NAMESPACEDKEY = new NamespacedKey(MMOCore.plugin, "Uuid");
public EditableGuildAdmin() {
super("guild-admin");
}
@ -40,8 +44,8 @@ public class EditableGuildAdmin extends EditableInventory {
}
public static class MemberDisplayItem extends InventoryItem {
public MemberDisplayItem(ConfigurationSection config) {
super(config);
public MemberDisplayItem(MemberItem memberItem, ConfigurationSection config) {
super(memberItem, config);
}
@Override
@ -65,19 +69,21 @@ public class EditableGuildAdmin extends EditableInventory {
@Override
public ItemStack display(GeneratedInventory inv, int n) {
PlayerData member = PlayerData.get(inv.getPlayerData().getGuild().getMembers().get(n));
UUID uuid = inv.getPlayerData().getGuild().getMembers().get(n);
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(uuid);
ItemStack disp = super.display(inv, n);
ItemMeta meta = disp.getItemMeta();
meta.getPersistentDataContainer().set(UUID_NAMESPACEDKEY, PersistentDataType.STRING, uuid.toString());
if (meta instanceof SkullMeta)
Bukkit.getScheduler().runTaskAsynchronously(MMOCore.plugin, () -> {
if (!member.isOnline()) return;
((SkullMeta) meta).setOwningPlayer(member.getPlayer());
disp.setItemMeta(meta);
if (meta instanceof SkullMeta && offlinePlayer != null)
inv.dynamicallyUpdateItem(this, n, disp, current -> {
((SkullMeta) meta).setOwningPlayer(offlinePlayer);
current.setItemMeta(meta);
});
return NBTItem.get(disp).addTag(new ItemTag("uuid", member.getUniqueId().toString())).toItem();
disp.setItemMeta(meta);
return disp;
}
}
@ -92,7 +98,7 @@ public class EditableGuildAdmin extends EditableInventory {
Validate.notNull(config.contains("member"), "Could not load member config");
empty = new SimplePlaceholderItem(config.getConfigurationSection("empty"));
member = new MemberDisplayItem(config.getConfigurationSection("member"));
member = new MemberDisplayItem(this, config.getConfigurationSection("member"));
}
@Override
@ -174,7 +180,7 @@ public class EditableGuildAdmin extends EditableInventory {
if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId()))
return;
OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(NBTItem.get(event.getCurrentItem()).getString("uuid")));
OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(event.getCurrentItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING)));
if (target.equals(player))
return;

View File

@ -1,7 +1,5 @@
package net.Indyuce.mmocore.gui.social.guild;
import io.lumine.mythic.lib.api.item.ItemTag;
import io.lumine.mythic.lib.api.item.NBTItem;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.OfflinePlayerData;
import net.Indyuce.mmocore.api.player.PlayerData;
@ -13,10 +11,7 @@ import net.Indyuce.mmocore.gui.api.item.InventoryItem;
import net.Indyuce.mmocore.gui.api.item.Placeholders;
import net.Indyuce.mmocore.gui.api.item.SimplePlaceholderItem;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.Sound;
import org.bukkit.*;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryAction;
@ -24,10 +19,13 @@ 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 java.util.UUID;
public class EditableGuildView extends EditableInventory {
private static final NamespacedKey UUID_NAMESPACEDKEY = new NamespacedKey(MMOCore.plugin, "Uuid");
public EditableGuildView() {
super("guild-view");
}
@ -38,8 +36,8 @@ public class EditableGuildView extends EditableInventory {
}
public static class MemberDisplayItem extends InventoryItem {
public MemberDisplayItem(ConfigurationSection config) {
super(config);
public MemberDisplayItem(MemberItem memberItem, ConfigurationSection config) {
super(memberItem, config);
}
@Override
@ -71,14 +69,16 @@ public class EditableGuildView extends EditableInventory {
ItemStack disp = super.display(inv, n);
ItemMeta meta = disp.getItemMeta();
meta.getPersistentDataContainer().set(UUID_NAMESPACEDKEY, PersistentDataType.STRING, uuid.toString());
if (meta instanceof SkullMeta)
Bukkit.getScheduler().runTaskAsynchronously(MMOCore.plugin, () -> {
inv.dynamicallyUpdateItem(this, n, disp, current -> {
((SkullMeta) meta).setOwningPlayer(Bukkit.getOfflinePlayer(uuid));
disp.setItemMeta(meta);
current.setItemMeta(meta);
});
return NBTItem.get(disp).addTag(new ItemTag("uuid", uuid.toString())).toItem();
disp.setItemMeta(meta);
return disp;
}
}
@ -93,7 +93,7 @@ public class EditableGuildView extends EditableInventory {
Validate.notNull(config.contains("member"), "Could not load member config");
empty = new SimplePlaceholderItem(config.getConfigurationSection("empty"));
member = new MemberDisplayItem(config.getConfigurationSection("member"));
member = new MemberDisplayItem(this, config.getConfigurationSection("member"));
}
@Override
@ -223,11 +223,15 @@ public class EditableGuildView extends EditableInventory {
});
}
if (item.getFunction().equals("member") && event.getAction() == InventoryAction.PICKUP_HALF && !NBTItem.get(event.getCurrentItem()).getString("uuid").isEmpty()) {
if (item.getFunction().equals("member") && event.getAction() == InventoryAction.PICKUP_HALF) {
if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId()))
return;
OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(NBTItem.get(event.getCurrentItem()).getString("uuid")));
String tag = event.getCurrentItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING);
if (tag == null || tag.isEmpty())
return;
OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(tag));
if (target.equals(player))
return;

View File

@ -1,7 +1,5 @@
package net.Indyuce.mmocore.gui.social.party;
import io.lumine.mythic.lib.api.item.ItemTag;
import io.lumine.mythic.lib.api.item.NBTItem;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.input.PlayerInput.InputType;
@ -13,10 +11,7 @@ import net.Indyuce.mmocore.gui.api.item.Placeholders;
import net.Indyuce.mmocore.gui.api.item.SimplePlaceholderItem;
import net.Indyuce.mmocore.party.provided.Party;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.Sound;
import org.bukkit.*;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryAction;
@ -24,11 +19,13 @@ 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 java.util.UUID;
public class EditablePartyView extends EditableInventory {
private static final NamespacedKey UUID_NAMESPACEDKEY = new NamespacedKey(MMOCore.plugin, "Uuid");
public EditablePartyView() {
super("party-view");
}
@ -39,8 +36,8 @@ public class EditablePartyView extends EditableInventory {
}
public static class MemberDisplayItem extends InventoryItem {
public MemberDisplayItem(ConfigurationSection config) {
super(config);
public MemberDisplayItem(MemberItem memberItem, ConfigurationSection config) {
super(memberItem, config);
}
@Override
@ -69,18 +66,16 @@ public class EditablePartyView extends EditableInventory {
ItemStack disp = super.display(inv, n);
ItemMeta meta = disp.getItemMeta();
meta.getPersistentDataContainer().set(UUID_NAMESPACEDKEY, PersistentDataType.STRING, member.getUniqueId().toString());
/*
* run async to save performance
*/
if (meta instanceof SkullMeta)
Bukkit.getScheduler().runTaskAsynchronously(MMOCore.plugin, () -> {
if (!member.isOnline()) return;
inv.dynamicallyUpdateItem(this, n, disp, current -> {
((SkullMeta) meta).setOwningPlayer(member.getPlayer());
disp.setItemMeta(meta);
current.setItemMeta(meta);
});
return NBTItem.get(disp).addTag(new ItemTag("uuid", member.getUniqueId().toString())).toItem();
disp.setItemMeta(meta);
return disp;
}
}
@ -95,7 +90,7 @@ public class EditablePartyView extends EditableInventory {
Validate.notNull(config.contains("member"), "Could not load member config");
empty = new SimplePlaceholderItem(config.getConfigurationSection("empty"));
member = new MemberDisplayItem(config.getConfigurationSection("member"));
member = new MemberDisplayItem(this, config.getConfigurationSection("member"));
}
@Override
@ -188,7 +183,7 @@ public class EditablePartyView extends EditableInventory {
if (!party.getOwner().equals(playerData))
return;
OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(NBTItem.get(event.getCurrentItem()).getString("uuid")));
OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(event.getCurrentItem().getItemMeta().getPersistentDataContainer().get(UUID_NAMESPACEDKEY, PersistentDataType.STRING)));
if (target.equals(player))
return;