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]