diff --git a/pom.xml b/pom.xml index 77cd1b9..7a50e78 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ org.spigotmc spigot-api - 1.20.6-R0.1-SNAPSHOT + 1.21.1-R0.1-SNAPSHOT provided diff --git a/src/main/java/pk/ajneb97/MainCommand.java b/src/main/java/pk/ajneb97/MainCommand.java index 262fe89..f10c7d4 100644 --- a/src/main/java/pk/ajneb97/MainCommand.java +++ b/src/main/java/pk/ajneb97/MainCommand.java @@ -114,7 +114,7 @@ public class MainCommand implements CommandExecutor, TabCompleter { sender.sendMessage(MessagesManager.getColoredMessage("&6/kit edit &8Edits a kit.")); sender.sendMessage(MessagesManager.getColoredMessage("&6/kit give &8Gives a kit to a player.")); sender.sendMessage(MessagesManager.getColoredMessage("&6/kit delete &8Deletes a kit.")); - sender.sendMessage(MessagesManager.getColoredMessage("&6/kit reset &8Resets kit data for a player.")); + sender.sendMessage(MessagesManager.getColoredMessage("&6/kit reset /* &8Resets kit data for a player.")); sender.sendMessage(MessagesManager.getColoredMessage("&6/kit preview &8Previews a kit.")); sender.sendMessage(MessagesManager.getColoredMessage("&6/kit open &8Opens a specific inventory for a player.")); sender.sendMessage(MessagesManager.getColoredMessage("&6/kit reload &8Reloads the config.")); @@ -168,12 +168,17 @@ public class MainCommand implements CommandExecutor, TabCompleter { String kitName = args[1]; String playerName = args[2]; - PlayerKitsMessageResult result = plugin.getPlayerDataManager().resetKitForPlayer(playerName,kitName); + PlayerKitsMessageResult result = plugin.getPlayerDataManager().resetKitForPlayer(playerName,kitName,playerName.equals("*")); if(result.isError()){ msgManager.sendMessage(sender, result.getMessage(), true); }else{ - msgManager.sendMessage(sender, messagesConfig.getString("kitResetCorrect") - .replace("%kit%",kitName).replace("%player%",playerName), true); + if(playerName.equals("*")){ + msgManager.sendMessage(sender, messagesConfig.getString("kitResetCorrectAll") + .replace("%kit%",kitName), true); + }else{ + msgManager.sendMessage(sender, messagesConfig.getString("kitResetCorrect") + .replace("%kit%",kitName).replace("%player%",playerName), true); + } } } @@ -430,6 +435,16 @@ public class MainCommand implements CommandExecutor, TabCompleter { } } return completions; + }else if(args[0].equalsIgnoreCase("reset")){ + for(Player p : Bukkit.getOnlinePlayers()) { + if(args[2].isEmpty() || p.getName().toLowerCase().startsWith(args[2].toLowerCase())){ + completions.add(p.getName()); + } + } + if(args[2].isEmpty() || "*".startsWith(args[2].toLowerCase())) { + completions.add("*"); + } + return completions; } } } diff --git a/src/main/java/pk/ajneb97/configs/MessagesConfigManager.java b/src/main/java/pk/ajneb97/configs/MessagesConfigManager.java index c15a8c7..bd66dba 100644 --- a/src/main/java/pk/ajneb97/configs/MessagesConfigManager.java +++ b/src/main/java/pk/ajneb97/configs/MessagesConfigManager.java @@ -58,6 +58,10 @@ public class MessagesConfigManager { Path pathConfig = Paths.get(configFile.getRoute()); try{ String text = new String(Files.readAllBytes(pathConfig)); + if(!text.contains("kitResetCorrectAll:")){ + getConfig().set("kitResetCorrectAll", "&aKit &7%kit% &areset for &7all players&a!"); + saveConfig(); + } if(!text.contains("commandOpenError:")){ getConfig().set("commandOpenError", "&cYou need to use: &7/kit open "); getConfig().set("inventoryNotExists", "&cThat inventory doesn't exists."); diff --git a/src/main/java/pk/ajneb97/database/MySQLConnection.java b/src/main/java/pk/ajneb97/database/MySQLConnection.java index 34c8b04..aefbe68 100644 --- a/src/main/java/pk/ajneb97/database/MySQLConnection.java +++ b/src/main/java/pk/ajneb97/database/MySQLConnection.java @@ -267,18 +267,27 @@ public class MySQLConnection { }.runTaskAsynchronously(plugin); } - public void resetKit(String uuid,String kitName){ + public void resetKit(String uuid,String kitName,boolean all){ new BukkitRunnable(){ @Override public void run() { try(Connection connection = getConnection()){ - PreparedStatement statement = connection.prepareStatement( - "DELETE FROM playerkits_players_kits " + - "WHERE UUID=? AND NAME=?"); + PreparedStatement statement; + if(all){ + statement = connection.prepareStatement( + "DELETE FROM playerkits_players_kits " + + "WHERE NAME=?"); + statement.setString(1, kitName); + }else{ + statement = connection.prepareStatement( + "DELETE FROM playerkits_players_kits " + + "WHERE UUID=? AND NAME=?"); - statement.setString(1, uuid); - statement.setString(2, kitName); + statement.setString(1, uuid); + statement.setString(2, kitName); + } statement.executeUpdate(); + } catch (SQLException e) { e.printStackTrace(); } diff --git a/src/main/java/pk/ajneb97/listeners/InventoryEditListener.java b/src/main/java/pk/ajneb97/listeners/InventoryEditListener.java index a2392b0..ea5be53 100644 --- a/src/main/java/pk/ajneb97/listeners/InventoryEditListener.java +++ b/src/main/java/pk/ajneb97/listeners/InventoryEditListener.java @@ -13,6 +13,7 @@ import org.bukkit.scheduler.BukkitRunnable; import pk.ajneb97.PlayerKits2; import pk.ajneb97.managers.edit.InventoryEditManager; import pk.ajneb97.model.inventory.InventoryPlayer; +import pk.ajneb97.utils.InventoryUtils; public class InventoryEditListener implements Listener { @@ -62,7 +63,7 @@ public class InventoryEditListener implements Listener { return; } - if(event.getClickedInventory().equals(player.getOpenInventory().getTopInventory())) { + if(event.getClickedInventory().equals(InventoryUtils.getTopInventory(player))) { invManager.clickInventory(inventoryPlayer,event.getCurrentItem(),event.getSlot(),clickType); } } diff --git a/src/main/java/pk/ajneb97/listeners/PlayerListener.java b/src/main/java/pk/ajneb97/listeners/PlayerListener.java index 8c8750a..ab4df73 100644 --- a/src/main/java/pk/ajneb97/listeners/PlayerListener.java +++ b/src/main/java/pk/ajneb97/listeners/PlayerListener.java @@ -11,6 +11,7 @@ import pk.ajneb97.PlayerKits2; import pk.ajneb97.managers.InventoryManager; import pk.ajneb97.managers.MessagesManager; import pk.ajneb97.model.inventory.InventoryPlayer; +import pk.ajneb97.utils.InventoryUtils; public class PlayerListener implements Listener { @@ -49,7 +50,7 @@ public class PlayerListener implements Listener { return; } - if(event.getClickedInventory().equals(player.getOpenInventory().getTopInventory())) { + if(event.getClickedInventory().equals(InventoryUtils.getTopInventory(player))) { ClickType clickType = event.getClick(); invManager.clickInventory(inventoryPlayer,event.getCurrentItem(),clickType); } diff --git a/src/main/java/pk/ajneb97/managers/KitItemManager.java b/src/main/java/pk/ajneb97/managers/KitItemManager.java index 48b1a25..00b99ca 100644 --- a/src/main/java/pk/ajneb97/managers/KitItemManager.java +++ b/src/main/java/pk/ajneb97/managers/KitItemManager.java @@ -224,7 +224,7 @@ public class KitItemManager { if (flag.equals("HIDE_ATTRIBUTES") && plugin.getDependencyManager().isPaper() && serverVersion.serverVersionGreaterEqualThan(serverVersion, ServerVersion.v1_21_R1)) { //Fix PAPER HIDE_ATTRIBUTES - ItemUtils.addDummyAttribute(meta); + ItemUtils.addDummyAttribute(meta,plugin); } meta.addItemFlags(ItemFlag.valueOf(flag)); } diff --git a/src/main/java/pk/ajneb97/managers/PlayerDataManager.java b/src/main/java/pk/ajneb97/managers/PlayerDataManager.java index d649533..ab2facf 100644 --- a/src/main/java/pk/ajneb97/managers/PlayerDataManager.java +++ b/src/main/java/pk/ajneb97/managers/PlayerDataManager.java @@ -130,18 +130,29 @@ public class PlayerDataManager { } } - public PlayerKitsMessageResult resetKitForPlayer(String name, String kitName){ + public PlayerKitsMessageResult resetKitForPlayer(String name, String kitName, boolean all){ PlayerData playerData = getPlayerByName(name); FileConfiguration messagesConfig = plugin.getConfigsManager().getMessagesConfigManager().getConfig(); - if(playerData == null){ + if(playerData == null && !all){ return PlayerKitsMessageResult.error(messagesConfig.getString("playerDataNotFound") .replace("%player%",name)); } - playerData.resetKit(kitName); - playerData.setModified(true); + if(all){ + for(PlayerData p : players){ + p.resetKit(kitName); + } + }else{ + playerData.resetKit(kitName); + } + if(plugin.getMySQLConnection() != null){ - plugin.getMySQLConnection().resetKit(playerData.getUuid(),kitName); + if(all){ + plugin.getMySQLConnection().resetKit(null,kitName,true); + }else{ + plugin.getMySQLConnection().resetKit(playerData.getUuid(),kitName,false); + } + } return PlayerKitsMessageResult.success(); diff --git a/src/main/java/pk/ajneb97/managers/edit/InventoryEditDisplayManager.java b/src/main/java/pk/ajneb97/managers/edit/InventoryEditDisplayManager.java index b5e5492..a9e7eea 100644 --- a/src/main/java/pk/ajneb97/managers/edit/InventoryEditDisplayManager.java +++ b/src/main/java/pk/ajneb97/managers/edit/InventoryEditDisplayManager.java @@ -13,6 +13,7 @@ import pk.ajneb97.model.KitAction; import pk.ajneb97.model.inventory.InventoryPlayer; import pk.ajneb97.model.item.KitItem; import pk.ajneb97.utils.InventoryItem; +import pk.ajneb97.utils.InventoryUtils; import pk.ajneb97.utils.OtherUtils; import java.util.ArrayList; @@ -104,7 +105,7 @@ public class InventoryEditDisplayManager { } public void saveKitItem(InventoryPlayer inventoryPlayer){ - Inventory inv = inventoryPlayer.getPlayer().getOpenInventory().getTopInventory(); + Inventory inv = InventoryUtils.getTopInventory(inventoryPlayer.getPlayer()); if(inv != null) { ItemStack item = inv.getItem(13); @@ -139,7 +140,7 @@ public class InventoryEditDisplayManager { if(event.getSlotType() == null || event.getClickedInventory() == null){ return; } - if(event.getClickedInventory().equals(inventoryPlayer.getPlayer().getOpenInventory().getTopInventory())){ + if(event.getClickedInventory().equals(InventoryUtils.getTopInventory(inventoryPlayer.getPlayer()))){ //Top inventory //Cancel unless is slot 13 if(slot != 13){ diff --git a/src/main/java/pk/ajneb97/managers/edit/InventoryEditKitItemsManager.java b/src/main/java/pk/ajneb97/managers/edit/InventoryEditKitItemsManager.java index ff6bdf0..c851ead 100644 --- a/src/main/java/pk/ajneb97/managers/edit/InventoryEditKitItemsManager.java +++ b/src/main/java/pk/ajneb97/managers/edit/InventoryEditKitItemsManager.java @@ -14,6 +14,7 @@ import pk.ajneb97.model.Kit; import pk.ajneb97.model.inventory.InventoryPlayer; import pk.ajneb97.model.item.KitItem; import pk.ajneb97.utils.InventoryItem; +import pk.ajneb97.utils.InventoryUtils; import pk.ajneb97.utils.ItemUtils; import pk.ajneb97.utils.OtherUtils; @@ -147,7 +148,7 @@ public class InventoryEditKitItemsManager { } public void saveKitItems(InventoryPlayer inventoryPlayer){ - Inventory inv = inventoryPlayer.getPlayer().getOpenInventory().getTopInventory(); + Inventory inv = InventoryUtils.getTopInventory(inventoryPlayer.getPlayer()); if(inv != null) { Kit kit = plugin.getKitsManager().getKitByName(inventoryPlayer.getKitName()); KitItemManager kitItemManager = plugin.getKitItemManager(); @@ -182,7 +183,7 @@ public class InventoryEditKitItemsManager { if(event.getSlotType() == null || event.getClickedInventory() == null){ return; } - if(event.getClickedInventory().equals(inventoryPlayer.getPlayer().getOpenInventory().getTopInventory())){ + if(event.getClickedInventory().equals(InventoryUtils.getTopInventory(inventoryPlayer.getPlayer()))){ //Top inventory //Cancel between 45 and 53 //Cancel if right click diff --git a/src/main/java/pk/ajneb97/managers/edit/InventoryEditPositionManager.java b/src/main/java/pk/ajneb97/managers/edit/InventoryEditPositionManager.java index 7eb4750..6e26748 100644 --- a/src/main/java/pk/ajneb97/managers/edit/InventoryEditPositionManager.java +++ b/src/main/java/pk/ajneb97/managers/edit/InventoryEditPositionManager.java @@ -16,6 +16,7 @@ import pk.ajneb97.model.inventory.InventoryPlayer; import pk.ajneb97.model.inventory.ItemKitInventory; import pk.ajneb97.model.inventory.KitInventory; import pk.ajneb97.utils.InventoryItem; +import pk.ajneb97.utils.InventoryUtils; import pk.ajneb97.utils.ItemUtils; import java.util.ArrayList; @@ -124,7 +125,7 @@ public class InventoryEditPositionManager { if(event.getSlotType() == null || event.getClickedInventory() == null){ return; } - if(event.getClickedInventory().equals(inventoryPlayer.getPlayer().getOpenInventory().getTopInventory())){ + if(event.getClickedInventory().equals(InventoryUtils.getTopInventory(inventoryPlayer.getPlayer()))){ //Should not be an item unless has open inventory tag if(item == null || item.getType().equals(Material.AIR)){ //Update position diff --git a/src/main/java/pk/ajneb97/model/PlayerData.java b/src/main/java/pk/ajneb97/model/PlayerData.java index e39c4c8..57c9dbe 100644 --- a/src/main/java/pk/ajneb97/model/PlayerData.java +++ b/src/main/java/pk/ajneb97/model/PlayerData.java @@ -132,6 +132,7 @@ public class PlayerData { for(int i=0;i players = inventoryManager.getPlayers(); for(InventoryPlayer player : players){ - Inventory inv = player.getPlayer().getOpenInventory().getTopInventory(); + Inventory inv = InventoryUtils.getTopInventory(player.getPlayer()); if(inv == null){ continue; } diff --git a/src/main/java/pk/ajneb97/utils/InventoryUtils.java b/src/main/java/pk/ajneb97/utils/InventoryUtils.java new file mode 100644 index 0000000..f42b25b --- /dev/null +++ b/src/main/java/pk/ajneb97/utils/InventoryUtils.java @@ -0,0 +1,42 @@ +package pk.ajneb97.utils; + +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryEvent; +import org.bukkit.inventory.Inventory; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class InventoryUtils { + /** + * Thanks to Rumsfield + * https://www.spigotmc.org/threads/inventoryview-changed-to-interface-backwards-compatibility.651754/ + * In API versions 1.20.6 and earlier, InventoryView is a class. + * In versions 1.21 and later, it is an interface. + * This method uses reflection to get the top Inventory object from the + * InventoryView associated with an InventoryEvent, to avoid runtime errors. + * @param event The generic InventoryEvent with an InventoryView to inspect. + * @return The top Inventory object from the event's InventoryView. + */ + public static Inventory getTopInventory(InventoryEvent event) { + try { + Object view = event.getView(); + Method getTopInventory = view.getClass().getMethod("getTopInventory"); + getTopInventory.setAccessible(true); + return (Inventory) getTopInventory.invoke(view); + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + public static Inventory getTopInventory(Player player) { + try { + Object view = player.getOpenInventory(); + Method getTopInventory = view.getClass().getMethod("getTopInventory"); + getTopInventory.setAccessible(true); + return (Inventory) getTopInventory.invoke(view); + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/pk/ajneb97/utils/ItemUtils.java b/src/main/java/pk/ajneb97/utils/ItemUtils.java index 505e51c..e884803 100644 --- a/src/main/java/pk/ajneb97/utils/ItemUtils.java +++ b/src/main/java/pk/ajneb97/utils/ItemUtils.java @@ -17,6 +17,7 @@ import org.bukkit.block.banner.Pattern; import org.bukkit.block.banner.PatternType; import org.bukkit.entity.Player; import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.EquipmentSlotGroup; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.*; import org.bukkit.inventory.meta.BookMeta.Generation; @@ -522,6 +523,9 @@ public class ItemUtils { return plugin.getNmsManager().getAttributes(item); }else { //1.13+ + ServerVersion serverVersion = PlayerKits2.serverVersion; + boolean newSystem = serverVersion.serverVersionGreaterEqualThan(serverVersion,ServerVersion.v1_21_R1); + ItemMeta meta = item.getItemMeta(); if(meta.hasAttributeModifiers()) { Multimap attributes = meta.getAttributeModifiers(); @@ -531,11 +535,18 @@ public class ItemUtils { for(Attribute a : set) { Collection listModifiers = attributes.get(a); for(AttributeModifier m : listModifiers) { - String line = a.name()+";"+m.getOperation().name()+";"+m.getAmount()+";"+m.getUniqueId(); - if(m.getSlot() != null) { - line=line+";"+m.getSlot().name(); + String line; + if(newSystem){ + line = a.name()+";"+m.getOperation().name()+";"+m.getAmount()+";"+m.getKey().getNamespace()+":"+m.getKey().getKey(); + line=line+";"+m.getSlotGroup().toString(); + }else{ + line = a.name()+";"+m.getOperation().name()+";"+m.getAmount()+";"+m.getUniqueId(); + if(m.getSlot() != null) { + line=line+";"+m.getSlot().name(); + } + line=line+";custom_name:"+m.getName(); } - line=line+";custom_name:"+m.getName(); + attributeList.add(line); } } @@ -555,41 +566,57 @@ public class ItemUtils { return plugin.getNmsManager().setAttributes(item,attributes); }else { //1.13+ - ItemMeta meta = item.getItemMeta(); - for(String a : attributes) { - String[] sep = a.split(";"); - String attribute = sep[0]; - AttributeModifier.Operation op = AttributeModifier.Operation.valueOf(sep[1]); - double amount = Double.valueOf(sep[2]); - UUID uuid = UUID.fromString(sep[3]); - String customName = attribute; - for(int i=0;i= 5) { - if(!sep[4].startsWith("custom_name:")){ - EquipmentSlot slot = EquipmentSlot.valueOf(sep[4]); - modifier = new AttributeModifier(uuid,customName,amount,op,slot); + ServerVersion serverVersion = PlayerKits2.serverVersion; + boolean newSystem = serverVersion.serverVersionGreaterEqualThan(serverVersion,ServerVersion.v1_21_R1); + + try{ + ItemMeta meta = item.getItemMeta(); + for(String a : attributes) { + String[] sep = a.split(";"); + String attribute = sep[0]; + AttributeModifier.Operation op = AttributeModifier.Operation.valueOf(sep[1]); + double amount = Double.valueOf(sep[2]); + + AttributeModifier modifier = null; + + if(newSystem){ + String[] id = sep[3].split(":"); + NamespacedKey namespacedKey = new NamespacedKey(id[0],id[1]); + modifier = new AttributeModifier(namespacedKey,amount,op,EquipmentSlotGroup.getByName(sep[4])); }else{ - modifier = new AttributeModifier(uuid,customName,amount,op); + String customName = attribute; + for(int i=0;i= 5) { + if(!sep[4].startsWith("custom_name:")){ + EquipmentSlot slot = EquipmentSlot.valueOf(sep[4]); + modifier = new AttributeModifier(uuid,customName,amount,op,slot); + }else{ + modifier = new AttributeModifier(uuid,customName,amount,op); + } + }else { + modifier = new AttributeModifier(uuid,customName,amount,op); + } } - }else { - modifier = new AttributeModifier(uuid,customName,amount,op); + + meta.addAttributeModifier(Attribute.valueOf(attribute), modifier); } - meta.addAttributeModifier(Attribute.valueOf(attribute), modifier); + item.setItemMeta(meta); + }catch(Exception e){ + } - - item.setItemMeta(meta); } return item; } - public static void addDummyAttribute(ItemMeta meta){ - AttributeModifier modifier = new AttributeModifier(UUID.randomUUID(),"",0,AttributeModifier.Operation.ADD_NUMBER,EquipmentSlot.FEET); + // 1.21+ only + public static void addDummyAttribute(ItemMeta meta,PlayerKits2 plugin){ + AttributeModifier modifier = new AttributeModifier(new NamespacedKey(plugin,"dummy_attribute"),0,AttributeModifier.Operation.ADD_NUMBER,EquipmentSlotGroup.FEET); meta.addAttributeModifier(Attribute.GENERIC_GRAVITY, modifier); } diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml index 2b2fc2e..35e3231 100644 --- a/src/main/resources/messages.yml +++ b/src/main/resources/messages.yml @@ -27,6 +27,7 @@ noPermissions: "&cYou don't have permissions for that." kitDeleted: "&aKit &7%kit% &adeleted correctly." playerDataNotFound: "&cNo data found for player &7%player%&c." kitResetCorrect: "&aKit &7%kit% &areset for &7%player%&a!" +kitResetCorrectAll: "&aKit &7%kit% &areset for &7all players&a!" cantPreviewError: "&cYou can't preview this kit." requirementsMessageStatusSymbolTrue: "&a&l✔" requirementsMessageStatusSymbolFalse: "&c&l✖" diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 4132321..2435d3c 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ main: pk.ajneb97.PlayerKits2 -version: 1.12.5 +version: 1.12.6 name: PlayerKits2 api-version: 1.13 softdepend: [Vault,PlaceholderAPI]