diff --git a/pom.xml b/pom.xml index b44b198..9c7fe39 100644 --- a/pom.xml +++ b/pom.xml @@ -126,7 +126,7 @@ de.tr7zw item-nbt-api - 2.13.0 + 2.13.1-SNAPSHOT compile @@ -138,7 +138,7 @@ net.kyori adventure-text-minimessage - 4.13.0 + 4.17.0 provided diff --git a/resource/config.yml b/resource/config.yml index e6eb4b4..d9fb99f 100644 --- a/resource/config.yml +++ b/resource/config.yml @@ -16,7 +16,6 @@ config: stop-sound: true disabled-world-message: true panel-snooper: false - allow-unsafe-mini-message: false enable-import-command: false format: tag: '&6[&bCommandPanels&6] ' diff --git a/resource/plugin.yml b/resource/plugin.yml index 9053798..c8478c4 100644 --- a/resource/plugin.yml +++ b/resource/plugin.yml @@ -1,4 +1,4 @@ -version: 3.21.3.0 +version: 3.21.3.1 main: me.rockyhawk.commandpanels.CommandPanels name: CommandPanels author: RockyHawk diff --git a/src/me/rockyhawk/commandpanels/CommandPanels.java b/src/me/rockyhawk/commandpanels/CommandPanels.java index b903a91..cd56ba1 100644 --- a/src/me/rockyhawk/commandpanels/CommandPanels.java +++ b/src/me/rockyhawk/commandpanels/CommandPanels.java @@ -22,6 +22,7 @@ import me.rockyhawk.commandpanels.completetabs.UpdateTabComplete; import me.rockyhawk.commandpanels.customcommands.Commandpanelcustom; import me.rockyhawk.commandpanels.datamanager.DebugManager; import me.rockyhawk.commandpanels.datamanager.PanelDataLoader; +import me.rockyhawk.commandpanels.datamanager.PanelDataPlayerManager; import me.rockyhawk.commandpanels.editor.*; import me.rockyhawk.commandpanels.floodgatecp.OpenFloodgateGUI; import me.rockyhawk.commandpanels.generatepanels.Commandpanelsgenerate; @@ -90,6 +91,8 @@ public class CommandPanels extends JavaPlugin{ public CommandRunner commandRunner = new CommandRunner(this); public PanelDataLoader panelData = new PanelDataLoader(this); + public PanelDataPlayerManager panelDataPlayers = new PanelDataPlayerManager(this); + public Placeholders placeholders = new Placeholders(this); public DebugManager debug = new DebugManager(this); public CreateText tex = new CreateText(this); @@ -190,6 +193,7 @@ public class CommandPanels extends JavaPlugin{ } this.getServer().getPluginManager().registerEvents(inputUtils, this); + this.getServer().getPluginManager().registerEvents(panelDataPlayers, this); this.getServer().getPluginManager().registerEvents(new UtilsPanelsLoader(this), this); this.getServer().getPluginManager().registerEvents(new GenUtils(this), this); this.getServer().getPluginManager().registerEvents(new ItemFallManager(this), this); @@ -281,6 +285,9 @@ public class CommandPanels extends JavaPlugin{ //do hotbar items hotbar.reloadHotbarSlots(); + //load all known players for data + panelDataPlayers.reloadAllPlayers(); + //add custom charts bStats Metrics metrics = new Metrics(this, 5097); metrics.addCustomChart(new SingleLineChart("panels_amount", () -> { diff --git a/src/me/rockyhawk/commandpanels/classresources/placeholders/CreateText.java b/src/me/rockyhawk/commandpanels/classresources/placeholders/CreateText.java index 4e37ebc..e0e073a 100644 --- a/src/me/rockyhawk/commandpanels/classresources/placeholders/CreateText.java +++ b/src/me/rockyhawk/commandpanels/classresources/placeholders/CreateText.java @@ -74,7 +74,9 @@ public class CreateText { //change colour for(String temp : setpapi){ try { - setpapi.set(tempInt, plugin.hex.translateHexColorCodes(ChatColor.translateAlternateColorCodes('&', temp))); + setpapi.set(tempInt, + plugin.hex.translateHexColorCodes( + ChatColor.translateAlternateColorCodes('&', temp))); }catch(NullPointerException ignore){} tempInt += 1; } @@ -84,7 +86,8 @@ public class CreateText { //regular string papi, but only colours so Player doesn't need to be there public String colour(String setpapi) { try { - setpapi = plugin.hex.translateHexColorCodes(ChatColor.translateAlternateColorCodes('&', setpapi)); + setpapi = ChatColor.translateAlternateColorCodes('&', setpapi); + setpapi = plugin.hex.translateHexColorCodes(setpapi); return setpapi; }catch(NullPointerException e){ return setpapi; diff --git a/src/me/rockyhawk/commandpanels/classresources/placeholders/Placeholders.java b/src/me/rockyhawk/commandpanels/classresources/placeholders/Placeholders.java index dd426ca..d6aa405 100644 --- a/src/me/rockyhawk/commandpanels/classresources/placeholders/Placeholders.java +++ b/src/me/rockyhawk/commandpanels/classresources/placeholders/Placeholders.java @@ -329,7 +329,7 @@ public class Placeholders { if(dataPoint.contains(",")){ String dataName = dataPoint.split(",")[0]; String playerName = dataPoint.split(",")[1]; - return plugin.panelData.getUserData(Bukkit.getOfflinePlayer(playerName).getUniqueId(),dataName); + return plugin.panelData.getUserData(plugin.panelDataPlayers.getOffline(playerName),dataName); }else{ return plugin.panelData.getUserData(p.getUniqueId(),dataPoint); } @@ -338,10 +338,24 @@ public class Placeholders { return ""; } } + //returns if a player is found + if(identifier.startsWith("uuid-")) { + try { + String dataPoint = identifier.replace("uuid-", ""); + //get data from other user + if(plugin.panelDataPlayers.getOffline(dataPoint) == null){ + return "unknown"; + } + return plugin.panelDataPlayers.getOffline(dataPoint).toString(); + }catch (Exception ex){ + plugin.debug(ex,p); + return ""; + } + } //edits data via placeholder execution (will return empty output) if(identifier.startsWith("setdata-")) { try { - String point_value = identifier.replace("cp-setdata-", ""); + String point_value = identifier.replace("setdata-", ""); String command = "set-data= " + point_value.split(",")[0] + " " + point_value.split(",")[1]; plugin.commandRunner.runCommand(panel,position,p, command); return ""; diff --git a/src/me/rockyhawk/commandpanels/commands/Commandpanelsdata.java b/src/me/rockyhawk/commandpanels/commands/Commandpanelsdata.java index d335b59..b3e8a3f 100644 --- a/src/me/rockyhawk/commandpanels/commands/Commandpanelsdata.java +++ b/src/me/rockyhawk/commandpanels/commands/Commandpanelsdata.java @@ -36,11 +36,11 @@ public class Commandpanelsdata implements CommandExecutor { if (args[1].equalsIgnoreCase("all") || args[1].equalsIgnoreCase("online")) { for (OfflinePlayer player : Bukkit.getOfflinePlayers()) { if (args[1].equalsIgnoreCase("online") && !player.isOnline()) continue; - plugin.panelData.clearData(plugin.panelData.getOffline(player.getName())); + plugin.panelData.clearData(plugin.panelDataPlayers.getOffline(player.getName())); count++; } } else - plugin.panelData.clearData(plugin.panelData.getOffline(args[1])); + plugin.panelData.clearData(plugin.panelDataPlayers.getOffline(args[1])); if (sendPlayerMessage) { sender.sendMessage(plugin.tex.colour(plugin.tag + ChatColor.GREEN + "Cleared all data for " @@ -54,11 +54,11 @@ public class Commandpanelsdata implements CommandExecutor { if (args[1].equalsIgnoreCase("all") || args[1].equalsIgnoreCase("online")) { for (OfflinePlayer player : Bukkit.getOfflinePlayers()) { if (args[1].equalsIgnoreCase("online") && !player.isOnline()) continue; - plugin.panelData.delUserData(plugin.panelData.getOffline(player.getName()), args[2]); + plugin.panelData.delUserData(plugin.panelDataPlayers.getOffline(player.getName()), args[2]); count++; } } else - plugin.panelData.delUserData(plugin.panelData.getOffline(args[1]), args[2]); + plugin.panelData.delUserData(plugin.panelDataPlayers.getOffline(args[1]), args[2]); if (sendPlayerMessage) { sender.sendMessage(plugin.tex.colour(plugin.tag + ChatColor.GREEN + "Removed " @@ -71,7 +71,7 @@ public class Commandpanelsdata implements CommandExecutor { //for the get command sender.sendMessage(plugin.tex.colour(plugin.tag + ChatColor.GREEN + "Value of data is " - + ChatColor.WHITE + plugin.panelData.getUserData(plugin.panelData.getOffline(args[1]), args[2]))); + + ChatColor.WHITE + plugin.panelData.getUserData(plugin.panelDataPlayers.getOffline(args[1]), args[2]))); return true; } } else if (args.length == 4) { @@ -80,11 +80,11 @@ public class Commandpanelsdata implements CommandExecutor { if (args[1].equalsIgnoreCase("all") || args[1].equalsIgnoreCase("online")) { for (OfflinePlayer player : Bukkit.getOfflinePlayers()) { if (args[1].equalsIgnoreCase("online") && !player.isOnline()) continue; - plugin.panelData.setUserData(plugin.panelData.getOffline(player.getName()), args[2], args[3], true); + plugin.panelData.setUserData(plugin.panelDataPlayers.getOffline(player.getName()), args[2], args[3], true); count++; } } else { - plugin.panelData.setUserData(plugin.panelData.getOffline(args[1]), args[2], args[3], true); + plugin.panelData.setUserData(plugin.panelDataPlayers.getOffline(args[1]), args[2], args[3], true); } if (sendPlayerMessage) { sender.sendMessage(plugin.tex.colour(plugin.tag @@ -101,11 +101,11 @@ public class Commandpanelsdata implements CommandExecutor { for (OfflinePlayer player : Bukkit.getOfflinePlayers()) { if (args[1].equalsIgnoreCase("online") && !player.isOnline()) continue; - plugin.panelData.setUserData(plugin.panelData.getOffline(player.getName()), args[2], args[3], false); + plugin.panelData.setUserData(plugin.panelDataPlayers.getOffline(player.getName()), args[2], args[3], false); count++; } } else - plugin.panelData.setUserData(plugin.panelData.getOffline(args[1]), args[2], args[3], false); + plugin.panelData.setUserData(plugin.panelDataPlayers.getOffline(args[1]), args[2], args[3], false); if (sendPlayerMessage) { sender.sendMessage(plugin.tex.colour(plugin.tag + ChatColor.GREEN + "Set " diff --git a/src/me/rockyhawk/commandpanels/commands/Commandpanelsreload.java b/src/me/rockyhawk/commandpanels/commands/Commandpanelsreload.java index ecbc84d..aaa968c 100644 --- a/src/me/rockyhawk/commandpanels/commands/Commandpanelsreload.java +++ b/src/me/rockyhawk/commandpanels/commands/Commandpanelsreload.java @@ -8,11 +8,8 @@ import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; -import org.bukkit.scheduler.BukkitRunnable; import java.io.File; import java.io.IOException; @@ -40,6 +37,9 @@ public class Commandpanelsreload implements CommandExecutor { plugin.config = YamlConfiguration.loadConfiguration(new File(plugin.getDataFolder() + File.separator + "config.yml")); plugin.blockConfig = YamlConfiguration.loadConfiguration(new File(plugin.getDataFolder() + File.separator + "blocks.yml")); + //load all known player UUIDs for data + plugin.panelDataPlayers.reloadAllPlayers(); + //check for duplicates plugin.checkDuplicatePanel(sender); diff --git a/src/me/rockyhawk/commandpanels/commandtags/tags/other/DataTags.java b/src/me/rockyhawk/commandpanels/commandtags/tags/other/DataTags.java index 89221f7..b465ac4 100644 --- a/src/me/rockyhawk/commandpanels/commandtags/tags/other/DataTags.java +++ b/src/me/rockyhawk/commandpanels/commandtags/tags/other/DataTags.java @@ -16,7 +16,7 @@ public class DataTags implements Listener { if(e.name.equalsIgnoreCase("set-data=")){ e.commandTagUsed(); if(e.args.length == 3){ - plugin.panelData.setUserData(plugin.panelData.getOffline(plugin.tex.placeholdersNoColour(e.panel,e.pos,e.p,e.args[2])), + plugin.panelData.setUserData(plugin.panelDataPlayers.getOffline(plugin.tex.placeholdersNoColour(e.panel,e.pos,e.p,e.args[2])), plugin.tex.placeholdersNoColour(e.panel,e.pos,e.p,e.args[0]), plugin.tex.placeholdersNoColour(e.panel,e.pos,e.p,e.args[1]),true); return; @@ -30,7 +30,7 @@ public class DataTags implements Listener { if(e.name.equalsIgnoreCase("add-data=")){ e.commandTagUsed(); if(e.args.length == 3){ - plugin.panelData.setUserData(plugin.panelData.getOffline(plugin.tex.placeholdersNoColour(e.panel,e.pos,e.p,e.args[2])), + plugin.panelData.setUserData(plugin.panelDataPlayers.getOffline(plugin.tex.placeholdersNoColour(e.panel,e.pos,e.p,e.args[2])), plugin.tex.placeholdersNoColour(e.panel,e.pos,e.p,e.args[0]), plugin.tex.placeholdersNoColour(e.panel,e.pos,e.p,e.args[1]),false); return; @@ -44,7 +44,7 @@ public class DataTags implements Listener { if(e.name.equalsIgnoreCase("math-data=")){ e.commandTagUsed(); if(e.args.length == 3){ - plugin.panelData.doDataMath(plugin.panelData.getOffline(plugin.tex.placeholdersNoColour(e.panel,e.pos,e.p,e.args[2])), + plugin.panelData.doDataMath(plugin.panelDataPlayers.getOffline(plugin.tex.placeholdersNoColour(e.panel,e.pos,e.p,e.args[2])), plugin.tex.placeholdersNoColour(e.panel,e.pos,e.p,e.args[0]), plugin.tex.placeholdersNoColour(e.panel,e.pos,e.p,e.args[1])); return; @@ -58,13 +58,13 @@ public class DataTags implements Listener { if(e.name.equalsIgnoreCase("clear-data=")){ e.commandTagUsed(); //will clear all data for player clear-data= [playerName] - plugin.panelData.clearData(plugin.panelData.getOffline(plugin.tex.placeholdersNoColour(e.panel,e.pos,e.p,e.args[0]))); + plugin.panelData.clearData(plugin.panelDataPlayers.getOffline(plugin.tex.placeholdersNoColour(e.panel,e.pos,e.p,e.args[0]))); return; } if(e.name.equalsIgnoreCase("del-data=")){ e.commandTagUsed(); if(e.args.length == 2){ - plugin.panelData.delUserData(plugin.panelData.getOffline(plugin.tex.placeholdersNoColour(e.panel,e.pos,e.p,e.args[1])), + plugin.panelData.delUserData(plugin.panelDataPlayers.getOffline(plugin.tex.placeholdersNoColour(e.panel,e.pos,e.p,e.args[1])), plugin.tex.placeholdersNoColour(e.panel,e.pos,e.p,e.args[0])); return; } diff --git a/src/me/rockyhawk/commandpanels/commandtags/tags/standard/BasicTags.java b/src/me/rockyhawk/commandpanels/commandtags/tags/standard/BasicTags.java index ed42c34..0f094d9 100644 --- a/src/me/rockyhawk/commandpanels/commandtags/tags/standard/BasicTags.java +++ b/src/me/rockyhawk/commandpanels/commandtags/tags/standard/BasicTags.java @@ -137,12 +137,8 @@ public class BasicTags implements Listener { } if(e.name.equalsIgnoreCase("minimessage=")){ e.commandTagUsed(); - //get checks - boolean isVersionCompatible = plugin.legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_18); - boolean isPaper = Bukkit.getServer().getVersion().contains("Paper"); - boolean allowUnsafeMiniMessage = plugin.config.getBoolean("config.allow-unsafe-mini-message"); //do mini message if conditions are met - if (isVersionCompatible && (isPaper || allowUnsafeMiniMessage)) { + if (plugin.legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_18)) { Audience player = (Audience) e.p; // Needed because the basic Player from the Event can't send Paper's Components Component parsedText = SerializerUtils.serializeText(String.join(" ", e.args)); player.sendMessage(parsedText); diff --git a/src/me/rockyhawk/commandpanels/completetabs/DataTabComplete.java b/src/me/rockyhawk/commandpanels/completetabs/DataTabComplete.java index 1739db5..9ae765d 100644 --- a/src/me/rockyhawk/commandpanels/completetabs/DataTabComplete.java +++ b/src/me/rockyhawk/commandpanels/completetabs/DataTabComplete.java @@ -6,7 +6,6 @@ import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; -import org.bukkit.entity.Player; import java.util.*; @@ -47,13 +46,13 @@ public class DataTabComplete implements TabCompleter { try { if (!args[1].equalsIgnoreCase("all") && !args[1].equalsIgnoreCase("online")) - return new ArrayList<>(plugin.panelData.dataConfig.getConfigurationSection("playerData." + plugin.panelData.getOffline(args[1])).getKeys(false)); + return new ArrayList<>(plugin.panelData.dataConfig.getConfigurationSection("playerData." + plugin.panelDataPlayers.getOffline(args[1])).getKeys(false)); else { Set set = new HashSet<>(); for (OfflinePlayer player : Bukkit.getOfflinePlayers()) { if (!player.isOnline()&&args[1].equalsIgnoreCase("online")) continue; - set.addAll(plugin.panelData.dataConfig.getConfigurationSection("playerData." + plugin.panelData.getOffline(player.getName())).getKeys(false)); + set.addAll(plugin.panelData.dataConfig.getConfigurationSection("playerData." + plugin.panelDataPlayers.getOffline(player.getName())).getKeys(false)); } String[] finalArgs = args; diff --git a/src/me/rockyhawk/commandpanels/datamanager/PanelDataLoader.java b/src/me/rockyhawk/commandpanels/datamanager/PanelDataLoader.java index 03e2b21..4880fbc 100644 --- a/src/me/rockyhawk/commandpanels/datamanager/PanelDataLoader.java +++ b/src/me/rockyhawk/commandpanels/datamanager/PanelDataLoader.java @@ -1,7 +1,6 @@ package me.rockyhawk.commandpanels.datamanager; import me.rockyhawk.commandpanels.CommandPanels; -import org.bukkit.Bukkit; import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; @@ -96,10 +95,4 @@ public class PanelDataLoader { dataConfig.set("playerData." + playerUUID + "." + dataPoint, output.toPlainString()); } - - @SuppressWarnings("deprecation") - public UUID getOffline(String playerName){ - //making this a separate function as it is long and deprecated - return Bukkit.getOfflinePlayer(playerName).getUniqueId(); - } } diff --git a/src/me/rockyhawk/commandpanels/datamanager/PanelDataPlayerManager.java b/src/me/rockyhawk/commandpanels/datamanager/PanelDataPlayerManager.java new file mode 100644 index 0000000..b570efb --- /dev/null +++ b/src/me/rockyhawk/commandpanels/datamanager/PanelDataPlayerManager.java @@ -0,0 +1,40 @@ +package me.rockyhawk.commandpanels.datamanager; + +import me.rockyhawk.commandpanels.CommandPanels; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +import java.util.HashMap; +import java.util.UUID; + +public class PanelDataPlayerManager implements Listener { + private CommandPanels plugin; + + public PanelDataPlayerManager(CommandPanels pl) { + this.plugin = pl; + } + + //will return UUID if found or null + public UUID getOffline(String playerName){ + return knownPlayers.getOrDefault(playerName, null); + } + + //Bukkit.getOfflinePlayer uses MojangAPI and can be very slow if a player has never joined the server before + //Will get all players who have ever joined the server before and use them + private HashMap knownPlayers = new HashMap<>(); + public void reloadAllPlayers(){ + knownPlayers.clear(); + for(OfflinePlayer p : Bukkit.getOfflinePlayers()){ + knownPlayers.put(p.getName(), p.getUniqueId()); + } + } + + //Add players who have joined the server to known players + @EventHandler + public void onPlayerJoin(PlayerJoinEvent e) { + knownPlayers.put(e.getPlayer().getName(), e.getPlayer().getUniqueId()); + } +}