From f145659dd08dac2fc0807e69e5091cda35487254 Mon Sep 17 00:00:00 2001 From: chickeneer Date: Sun, 29 Aug 2021 17:31:56 -0500 Subject: [PATCH] Improve cached bukkit locale lookup - #GH-342 --- .../co/aikar/commands/ACFBukkitListener.java | 9 +++++++-- .../co/aikar/commands/BukkitCommandManager.java | 17 ++++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/bukkit/src/main/java/co/aikar/commands/ACFBukkitListener.java b/bukkit/src/main/java/co/aikar/commands/ACFBukkitListener.java index 16d7ffef..4b030761 100644 --- a/bukkit/src/main/java/co/aikar/commands/ACFBukkitListener.java +++ b/bukkit/src/main/java/co/aikar/commands/ACFBukkitListener.java @@ -31,6 +31,8 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.server.PluginDisableEvent; import org.bukkit.plugin.Plugin; +import java.util.UUID; + class ACFBukkitListener implements Listener { private BukkitCommandManager manager; private final Plugin plugin; @@ -47,10 +49,11 @@ class ACFBukkitListener implements Listener { } manager.unregisterCommands(); } + @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); - if(this.manager.autoDetectFromClient) { + if (this.manager.autoDetectFromClient) { this.manager.readPlayerLocale(player); this.plugin.getServer().getScheduler().runTaskLater(this.plugin, () -> manager.readPlayerLocale(player), 20); } else { @@ -62,6 +65,8 @@ class ACFBukkitListener implements Listener { @EventHandler public void onPlayerQuit(PlayerQuitEvent quitEvent) { //cleanup - manager.issuersLocale.remove(quitEvent.getPlayer().getUniqueId()); + UUID playerUniqueId = quitEvent.getPlayer().getUniqueId(); + manager.issuersLocale.remove(playerUniqueId); + manager.issuersLocaleString.remove(playerUniqueId); } } diff --git a/bukkit/src/main/java/co/aikar/commands/BukkitCommandManager.java b/bukkit/src/main/java/co/aikar/commands/BukkitCommandManager.java index 8a7f0ddd..1e6c9de2 100755 --- a/bukkit/src/main/java/co/aikar/commands/BukkitCommandManager.java +++ b/bukkit/src/main/java/co/aikar/commands/BukkitCommandManager.java @@ -57,6 +57,8 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Matcher; @@ -86,6 +88,7 @@ public class BukkitCommandManager extends CommandManager< protected BukkitCommandCompletions completions; MCTiming commandTiming; protected BukkitLocales locales; + protected Map issuersLocaleString = new ConcurrentHashMap<>(); private boolean cantReadLocale = false; protected boolean autoDetectFromClient = true; @@ -315,11 +318,15 @@ public class BukkitCommandManager extends CommandManager< localeField.setAccessible(true); Object localeString = localeField.get(nmsPlayer); if (localeString instanceof String) { - String[] split = ACFPatterns.UNDERSCORE.split((String) localeString); - Locale locale = split.length > 1 ? new Locale(split[0], split[1]) : new Locale(split[0]); - Locale prev = issuersLocale.put(player.getUniqueId(), locale); - if (!Objects.equals(locale, prev)) { - this.notifyLocaleChange(getCommandIssuer(player), prev, locale); + UUID playerUniqueId = player.getUniqueId(); + if (!localeString.equals(issuersLocaleString.get(playerUniqueId))) { + String[] split = ACFPatterns.UNDERSCORE.split((String) localeString); + Locale locale = split.length > 1 ? new Locale(split[0], split[1]) : new Locale(split[0]); + Locale prev = issuersLocale.put(playerUniqueId, locale); + issuersLocaleString.put(playerUniqueId, (String) localeString); + if (!Objects.equals(locale, prev)) { + this.notifyLocaleChange(getCommandIssuer(player), prev, locale); + } } } }