From 135a473dc585eced4d85b0a5d1094de2a945f56a Mon Sep 17 00:00:00 2001 From: NEZNAMY Date: Thu, 1 Jul 2021 11:14:41 +0200 Subject: [PATCH] more abstraction to remove duplications --- .../tab/platforms/bukkit/BukkitTabPlayer.java | 2 +- .../tab/platforms/bukkit/nms/NMSStorage.java | 2 +- .../bungeecord/BungeePlaceholderRegistry.java | 25 +------- .../platforms/bungeecord/BungeePlatform.java | 31 ++-------- .../platforms/bungeecord/BungeeTabPlayer.java | 23 ++----- .../tab/platforms/bungeecord/Main.java | 4 +- .../shared/command/level1/GroupCommand.java | 16 +---- .../shared/command/level1/PlayerCommand.java | 9 +-- .../command/level1/PlayerUUIDCommand.java | 9 +-- .../command/level1/PropertyCommand.java | 25 ++++++++ .../tab/shared/features/BelowName.java | 60 ++++++++++--------- .../shared/packets/IChatBaseComponent.java | 6 +- .../proxy/ProxyPlaceholderRegistry.java | 37 ++++++++++++ .../tab/shared/proxy/ProxyPlatform.java | 37 ++++++++++++ .../tab/shared/proxy/ProxyTabPlayer.java | 33 ++++++++++ .../me/neznamy/tab/shared/rgb/RGBUtils.java | 22 +++++-- .../tab/shared/rgb/gradient/CMIGradient.java | 45 -------------- .../shared/rgb/gradient/CommonGradient.java | 57 ++++++++++++++++++ .../tab/shared/rgb/gradient/HtmlGradient.java | 45 -------------- .../rgb/gradient/IridescentGradient.java | 45 -------------- .../tab/platforms/velocity/v1_1_0/Main.java | 12 ++-- .../v1_1_0/VelocityPlaceholderRegistry.java | 28 +-------- .../velocity/v1_1_0/VelocityPlatform.java | 30 ++-------- .../velocity/v1_1_0/VelocityTabPlayer.java | 26 +------- 24 files changed, 273 insertions(+), 356 deletions(-) create mode 100644 shared/src/main/java/me/neznamy/tab/shared/command/level1/PropertyCommand.java create mode 100644 shared/src/main/java/me/neznamy/tab/shared/proxy/ProxyPlaceholderRegistry.java create mode 100644 shared/src/main/java/me/neznamy/tab/shared/proxy/ProxyPlatform.java create mode 100644 shared/src/main/java/me/neznamy/tab/shared/proxy/ProxyTabPlayer.java delete mode 100644 shared/src/main/java/me/neznamy/tab/shared/rgb/gradient/CMIGradient.java create mode 100644 shared/src/main/java/me/neznamy/tab/shared/rgb/gradient/CommonGradient.java delete mode 100644 shared/src/main/java/me/neznamy/tab/shared/rgb/gradient/HtmlGradient.java delete mode 100644 shared/src/main/java/me/neznamy/tab/shared/rgb/gradient/IridescentGradient.java diff --git a/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/BukkitTabPlayer.java b/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/BukkitTabPlayer.java index e62f8c9d2..9bfc34539 100644 --- a/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/BukkitTabPlayer.java +++ b/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/BukkitTabPlayer.java @@ -204,7 +204,7 @@ public class BukkitTabPlayer extends ITabPlayer { if (vanished) return true; } List metadata = player.getMetadata("vanished"); - return metadata != null && !metadata.isEmpty() && metadata.get(0).asBoolean(); + return !metadata.isEmpty() && metadata.get(0).asBoolean(); } catch (Exception e) { TAB.getInstance().getErrorManager().printError("Failed to check vanish status of " + player.getName(), e); } diff --git a/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/nms/NMSStorage.java b/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/nms/NMSStorage.java index ba900f9ee..f4654f169 100644 --- a/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/nms/NMSStorage.java +++ b/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/nms/NMSStorage.java @@ -71,7 +71,6 @@ public class NMSStorage { fields.put("CHANNEL", getFields(getClass("NetworkManager"), Channel.class).get(0)); methods.put("getProfile", getClass("EntityPlayer").getMethod("getProfile")); } - initializeEnums(); initializeChatComponents(); initializeChatPacket(); initializeDataWatcher(); @@ -81,6 +80,7 @@ public class NMSStorage { initializeOtherEntityPackets(); initializePlayerInfoPacket(); initializeScoreboardPackets(); + initializeEnums(); } /** diff --git a/bungeecord/src/main/java/me/neznamy/tab/platforms/bungeecord/BungeePlaceholderRegistry.java b/bungeecord/src/main/java/me/neznamy/tab/platforms/bungeecord/BungeePlaceholderRegistry.java index fbe81d16d..48df70865 100644 --- a/bungeecord/src/main/java/me/neznamy/tab/platforms/bungeecord/BungeePlaceholderRegistry.java +++ b/bungeecord/src/main/java/me/neznamy/tab/platforms/bungeecord/BungeePlaceholderRegistry.java @@ -1,15 +1,14 @@ package me.neznamy.tab.platforms.bungeecord; -import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; import me.neznamy.tab.api.TabPlayer; import me.neznamy.tab.shared.TAB; import me.neznamy.tab.shared.placeholders.Placeholder; -import me.neznamy.tab.shared.placeholders.PlaceholderRegistry; import me.neznamy.tab.shared.placeholders.PlayerPlaceholder; import me.neznamy.tab.shared.placeholders.ServerPlaceholder; +import me.neznamy.tab.shared.proxy.ProxyPlaceholderRegistry; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; @@ -17,29 +16,11 @@ import net.md_5.bungee.api.connection.ProxiedPlayer; /** * Bungeecord registry to register bungeecord-only placeholders */ -public class BungeePlaceholderRegistry implements PlaceholderRegistry { +public class BungeePlaceholderRegistry extends ProxyPlaceholderRegistry { @Override public List registerPlaceholders() { - List placeholders = new ArrayList<>(); - placeholders.add(new PlayerPlaceholder("%canseeonline%", 2000) { - public String get(TabPlayer p) { - int count = 0; - for (TabPlayer all : TAB.getInstance().getPlayers()){ - if (!all.isVanished() || p.hasPermission("tab.seevanished")) count++; - } - return String.valueOf(count); - } - }); - placeholders.add(new PlayerPlaceholder("%canseestaffonline%", 2000) { - public String get(TabPlayer p) { - int count = 0; - for (TabPlayer all : TAB.getInstance().getPlayers()){ - if (all.isStaff() && (!all.isVanished() || p.hasPermission("tab.seevanished"))) count++; - } - return String.valueOf(count); - } - }); + List placeholders = super.registerPlaceholders(); placeholders.add(new PlayerPlaceholder("%displayname%", 500) { public String get(TabPlayer p) { return ((ProxiedPlayer) p.getPlayer()).getDisplayName(); diff --git a/bungeecord/src/main/java/me/neznamy/tab/platforms/bungeecord/BungeePlatform.java b/bungeecord/src/main/java/me/neznamy/tab/platforms/bungeecord/BungeePlatform.java index 5d174081d..43eace85f 100644 --- a/bungeecord/src/main/java/me/neznamy/tab/platforms/bungeecord/BungeePlatform.java +++ b/bungeecord/src/main/java/me/neznamy/tab/platforms/bungeecord/BungeePlatform.java @@ -2,15 +2,13 @@ package me.neznamy.tab.platforms.bungeecord; import java.io.File; -import me.neznamy.tab.api.TabPlayer; import me.neznamy.tab.api.event.BungeeTABLoadEvent; -import me.neznamy.tab.shared.Platform; import me.neznamy.tab.shared.TAB; import me.neznamy.tab.shared.features.BelowName; import me.neznamy.tab.shared.features.GlobalPlayerlist; import me.neznamy.tab.shared.features.NameTag; import me.neznamy.tab.shared.features.PingSpoof; -import me.neznamy.tab.shared.features.PlaceholderManager; +import me.neznamy.tab.shared.features.PluginMessageHandler; import me.neznamy.tab.shared.features.SpectatorFix; import me.neznamy.tab.shared.features.TabObjective; import me.neznamy.tab.shared.features.scoreboard.ScoreboardManager; @@ -18,8 +16,8 @@ import me.neznamy.tab.shared.permission.LuckPerms; import me.neznamy.tab.shared.permission.PermissionPlugin; import me.neznamy.tab.shared.permission.UltraPermissions; import me.neznamy.tab.shared.permission.VaultBridge; -import me.neznamy.tab.shared.placeholders.PlayerPlaceholder; import me.neznamy.tab.shared.placeholders.UniversalPlaceholderRegistry; +import me.neznamy.tab.shared.proxy.ProxyPlatform; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Plugin; @@ -27,7 +25,7 @@ import net.md_5.bungee.api.plugin.Plugin; /** * Bungeecord implementation of Platform */ -public class BungeePlatform implements Platform { +public class BungeePlatform extends ProxyPlatform { //instance of plugin private Plugin plugin; @@ -36,7 +34,8 @@ public class BungeePlatform implements Platform { * Constructs new instance with given parameter * @param plugin - main class */ - public BungeePlatform(Plugin plugin) { + public BungeePlatform(Plugin plugin, PluginMessageHandler plm) { + super(plm); this.plugin = plugin; } @@ -79,26 +78,6 @@ public class BungeePlatform implements Platform { ProxyServer.getInstance().getConsole().sendMessage(translateColors ? message.replace('&', '\u00a7') : message); } - @Override - public void registerUnknownPlaceholder(String identifier) { - if (identifier.startsWith("%rel_")) return; - if (identifier.contains("_")) { - String expansion = identifier.split("_")[0].replace("%", "").toLowerCase(); - if (expansion.equals("some")) return; - TAB.getInstance().debug("Detected used PlaceholderAPI placeholder " + identifier); - PlaceholderManager pl = TAB.getInstance().getPlaceholderManager(); - int refresh = pl.getDefaultRefresh(); - if (pl.getPlayerPlaceholderRefreshIntervals().containsKey(identifier)) refresh = pl.getPlayerPlaceholderRefreshIntervals().get(identifier); - if (pl.getServerPlaceholderRefreshIntervals().containsKey(identifier)) refresh = pl.getServerPlaceholderRefreshIntervals().get(identifier); - TAB.getInstance().getPlaceholderManager().registerPlaceholder(new PlayerPlaceholder(identifier, TAB.getInstance().getErrorManager().fixPlaceholderInterval(identifier, refresh)){ - public String get(TabPlayer p) { - Main.getInstance().getPluginMessageHandler().requestPlaceholder(p, identifier); - return getLastValues().get(p.getName()); - } - }); - } - } - @Override public String getServerVersion() { return ProxyServer.getInstance().getVersion(); diff --git a/bungeecord/src/main/java/me/neznamy/tab/platforms/bungeecord/BungeeTabPlayer.java b/bungeecord/src/main/java/me/neznamy/tab/platforms/bungeecord/BungeeTabPlayer.java index ee66f83bc..2da839829 100644 --- a/bungeecord/src/main/java/me/neznamy/tab/platforms/bungeecord/BungeeTabPlayer.java +++ b/bungeecord/src/main/java/me/neznamy/tab/platforms/bungeecord/BungeeTabPlayer.java @@ -4,9 +4,9 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import de.myzelyam.api.vanish.BungeeVanishAPI; -import me.neznamy.tab.shared.ITabPlayer; import me.neznamy.tab.shared.ProtocolVersion; import me.neznamy.tab.shared.TAB; +import me.neznamy.tab.shared.proxy.ProxyTabPlayer; import net.md_5.bungee.UserConnection; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.connection.ProxiedPlayer; @@ -19,7 +19,7 @@ import net.md_5.bungee.protocol.Protocol; /** * TabPlayer for BungeeCord */ -public class BungeeTabPlayer extends ITabPlayer { +public class BungeeTabPlayer extends ProxyTabPlayer { //bungee internals to get player channel private static Field wrapperField; @@ -53,6 +53,7 @@ public class BungeeTabPlayer extends ITabPlayer { * @throws IllegalArgumentException */ public BungeeTabPlayer(ProxiedPlayer p) throws IllegalArgumentException, IllegalAccessException { + super (Main.getInstance().getPluginMessageHandler()); player = p; if (p.getServer() != null) { world = p.getServer().getInfo().getName(); @@ -127,23 +128,7 @@ public class BungeeTabPlayer extends ITabPlayer { @Override public boolean isVanished() { if (ProxyServer.getInstance().getPluginManager().getPlugin("PremiumVanish") != null && BungeeVanishAPI.isInvisible(player)) return true; - return getAttribute("vanished"); - } - - @Override - public boolean isDisguised() { - return getAttribute("disguised"); - } - - @Override - public boolean hasInvisibilityPotion() { - return getAttribute("invisible"); - } - - private boolean getAttribute(String name) { - Main.getInstance().getPluginMessageHandler().requestAttribute(this, name); - if (!attributes.containsKey(name)) return false; - return Boolean.parseBoolean(attributes.get(name)); + return super.isVanished(); } @Override diff --git a/bungeecord/src/main/java/me/neznamy/tab/platforms/bungeecord/Main.java b/bungeecord/src/main/java/me/neznamy/tab/platforms/bungeecord/Main.java index 203c93d63..ecf1cf3b3 100644 --- a/bungeecord/src/main/java/me/neznamy/tab/platforms/bungeecord/Main.java +++ b/bungeecord/src/main/java/me/neznamy/tab/platforms/bungeecord/Main.java @@ -34,11 +34,11 @@ public class Main extends Plugin { ProxyServer.getInstance().getConsole().sendMessage("\u00a7c[TAB] The plugin requires BungeeCord build #1330 and up to work. Get it at https://ci.md-5.net/job/BungeeCord/"); return; } - TAB.setInstance(new TAB(new BungeePlatform(this), new BungeePacketBuilder(), ProtocolVersion.values()[1])); + plm = new BungeePluginMessageHandler(this); + TAB.setInstance(new TAB(new BungeePlatform(this, plm), new BungeePacketBuilder(), ProtocolVersion.values()[1])); getProxy().getPluginManager().registerListener(this, new BungeeEventListener()); if (getProxy().getPluginManager().getPlugin("PremiumVanish") != null) getProxy().getPluginManager().registerListener(this, new PremiumVanishListener()); getProxy().getPluginManager().registerCommand(this, new BTABCommand()); - plm = new BungeePluginMessageHandler(this); TAB.getInstance().load(); Metrics metrics = new Metrics(this, 10535); metrics.addCustomChart(new SimplePie("permission_system", () -> TAB.getInstance().getPermissionPlugin().getName())); diff --git a/shared/src/main/java/me/neznamy/tab/shared/command/level1/GroupCommand.java b/shared/src/main/java/me/neznamy/tab/shared/command/level1/GroupCommand.java index def02be28..21feaa624 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/command/level1/GroupCommand.java +++ b/shared/src/main/java/me/neznamy/tab/shared/command/level1/GroupCommand.java @@ -1,17 +1,14 @@ package me.neznamy.tab.shared.command.level1; -import java.util.ArrayList; import java.util.Arrays; -import java.util.List; import me.neznamy.tab.api.TabPlayer; import me.neznamy.tab.shared.TAB; -import me.neznamy.tab.shared.command.SubCommand; /** * Handler for "/tab group" subcommand */ -public class GroupCommand extends SubCommand { +public class GroupCommand extends PropertyCommand { /** * Constructs new instance @@ -82,15 +79,4 @@ public class GroupCommand extends SubCommand { } } } - - @Override - public List complete(TabPlayer sender, String[] arguments) { - List suggestions = new ArrayList<>(); - if (arguments.length == 2) { - for (String property : getAllProperties()) { - if (property.startsWith(arguments[1].toLowerCase())) suggestions.add(property); - } - } - return suggestions; - } } \ No newline at end of file diff --git a/shared/src/main/java/me/neznamy/tab/shared/command/level1/PlayerCommand.java b/shared/src/main/java/me/neznamy/tab/shared/command/level1/PlayerCommand.java index 0e8854868..7e7a4f401 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/command/level1/PlayerCommand.java +++ b/shared/src/main/java/me/neznamy/tab/shared/command/level1/PlayerCommand.java @@ -1,6 +1,5 @@ package me.neznamy.tab.shared.command.level1; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -84,12 +83,6 @@ public class PlayerCommand extends SubCommand { @Override public List complete(TabPlayer sender, String[] arguments) { if (arguments.length == 1) return getPlayers(arguments[0]); - List suggestions = new ArrayList<>(); - if (arguments.length == 2) { - for (String property : getAllProperties()) { - if (property.startsWith(arguments[1].toLowerCase())) suggestions.add(property); - } - } - return suggestions; + return super.complete(sender, arguments); } } \ No newline at end of file diff --git a/shared/src/main/java/me/neznamy/tab/shared/command/level1/PlayerUUIDCommand.java b/shared/src/main/java/me/neznamy/tab/shared/command/level1/PlayerUUIDCommand.java index 86279c998..f493f2ffb 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/command/level1/PlayerUUIDCommand.java +++ b/shared/src/main/java/me/neznamy/tab/shared/command/level1/PlayerUUIDCommand.java @@ -1,6 +1,5 @@ package me.neznamy.tab.shared.command.level1; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -83,12 +82,6 @@ public class PlayerUUIDCommand extends SubCommand { @Override public List complete(TabPlayer sender, String[] arguments) { if (arguments.length == 1) return getPlayers(arguments[0]); - List suggestions = new ArrayList<>(); - if (arguments.length == 2) { - for (String property : getAllProperties()) { - if (property.startsWith(arguments[1].toLowerCase())) suggestions.add(property); - } - } - return suggestions; + return super.complete(sender, arguments); } } \ No newline at end of file diff --git a/shared/src/main/java/me/neznamy/tab/shared/command/level1/PropertyCommand.java b/shared/src/main/java/me/neznamy/tab/shared/command/level1/PropertyCommand.java new file mode 100644 index 000000000..397cc3125 --- /dev/null +++ b/shared/src/main/java/me/neznamy/tab/shared/command/level1/PropertyCommand.java @@ -0,0 +1,25 @@ +package me.neznamy.tab.shared.command.level1; + +import java.util.ArrayList; +import java.util.List; + +import me.neznamy.tab.api.TabPlayer; +import me.neznamy.tab.shared.command.SubCommand; + +public abstract class PropertyCommand extends SubCommand { + + protected PropertyCommand(String name, String permission) { + super(name, permission); + } + + @Override + public List complete(TabPlayer sender, String[] arguments) { + List suggestions = new ArrayList<>(); + if (arguments.length == 2) { + for (String property : getAllProperties()) { + if (property.startsWith(arguments[1].toLowerCase())) suggestions.add(property); + } + } + return suggestions; + } +} \ No newline at end of file diff --git a/shared/src/main/java/me/neznamy/tab/shared/features/BelowName.java b/shared/src/main/java/me/neznamy/tab/shared/features/BelowName.java index 227705fcb..aa4175245 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/features/BelowName.java +++ b/shared/src/main/java/me/neznamy/tab/shared/features/BelowName.java @@ -42,35 +42,7 @@ public class BelowName implements Loadable, JoinEventListener, WorldChangeListen disabledWorlds = tab.getConfiguration().getConfig().getStringList("disable-features-in-"+tab.getPlatform().getSeparatorType()+"s.belowname", Arrays.asList("disabled" + tab.getPlatform().getSeparatorType())); refreshUsedPlaceholders(); tab.debug(String.format("Loaded BelowName feature with parameters number=%s, text=%s, disabledWorlds=%s", rawNumber, rawText, disabledWorlds)); - tab.getFeatureManager().registerFeature("belowname-text-refresher", new Refreshable() { - - private List usedPlaceholders; - - { - refreshUsedPlaceholders(); - } - - @Override - public void refresh(TabPlayer refreshed, boolean force) { - if (isDisabledWorld(disabledWorlds, refreshed.getWorldName())) return; - refreshed.sendCustomPacket(new PacketPlayOutScoreboardObjective(2, OBJECTIVE_NAME, refreshed.getProperty(TEXT_PROPERTY).updateAndGet(), EnumScoreboardHealthDisplay.INTEGER), TabFeature.BELOWNAME_TEXT); - } - - @Override - public List getUsedPlaceholders() { - return usedPlaceholders; - } - - @Override - public void refreshUsedPlaceholders() { - usedPlaceholders = tab.getPlaceholderManager().getUsedPlaceholderIdentifiersRecursive(rawText); - } - - @Override - public TabFeature getFeatureType() { - return TabFeature.BELOWNAME_TEXT; - } - }); + tab.getFeatureManager().registerFeature("belowname-text-refresher", new TextRefresher()); } @Override @@ -165,4 +137,34 @@ public class BelowName implements Loadable, JoinEventListener, WorldChangeListen } return false; } + + public class TextRefresher implements Refreshable { + + private List usedPlaceholders; + + public TextRefresher(){ + refreshUsedPlaceholders(); + } + + @Override + public void refresh(TabPlayer refreshed, boolean force) { + if (isDisabledWorld(disabledWorlds, refreshed.getWorldName())) return; + refreshed.sendCustomPacket(new PacketPlayOutScoreboardObjective(2, OBJECTIVE_NAME, refreshed.getProperty(TEXT_PROPERTY).updateAndGet(), EnumScoreboardHealthDisplay.INTEGER), TabFeature.BELOWNAME_TEXT); + } + + @Override + public List getUsedPlaceholders() { + return usedPlaceholders; + } + + @Override + public void refreshUsedPlaceholders() { + usedPlaceholders = tab.getPlaceholderManager().getUsedPlaceholderIdentifiersRecursive(rawText); + } + + @Override + public TabFeature getFeatureType() { + return TabFeature.BELOWNAME_TEXT; + } + } } \ No newline at end of file diff --git a/shared/src/main/java/me/neznamy/tab/shared/packets/IChatBaseComponent.java b/shared/src/main/java/me/neznamy/tab/shared/packets/IChatBaseComponent.java index 46c61a648..240497958 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/packets/IChatBaseComponent.java +++ b/shared/src/main/java/me/neznamy/tab/shared/packets/IChatBaseComponent.java @@ -706,11 +706,7 @@ public class IChatBaseComponent { builder.append(color.getLegacyColor().getFormat()); } } - if (isBold()) builder.append(EnumChatFormat.BOLD.getFormat()); - if (isItalic()) builder.append(EnumChatFormat.ITALIC.getFormat()); - if (isUnderlined()) builder.append(EnumChatFormat.UNDERLINE.getFormat()); - if (isStrikethrough()) builder.append(EnumChatFormat.STRIKETHROUGH.getFormat()); - if (isObfuscated()) builder.append(EnumChatFormat.OBFUSCATED.getFormat()); + appendMagicCodes(builder); return builder.toString(); } diff --git a/shared/src/main/java/me/neznamy/tab/shared/proxy/ProxyPlaceholderRegistry.java b/shared/src/main/java/me/neznamy/tab/shared/proxy/ProxyPlaceholderRegistry.java new file mode 100644 index 000000000..fed2ece58 --- /dev/null +++ b/shared/src/main/java/me/neznamy/tab/shared/proxy/ProxyPlaceholderRegistry.java @@ -0,0 +1,37 @@ +package me.neznamy.tab.shared.proxy; + +import java.util.ArrayList; +import java.util.List; + +import me.neznamy.tab.api.TabPlayer; +import me.neznamy.tab.shared.TAB; +import me.neznamy.tab.shared.placeholders.Placeholder; +import me.neznamy.tab.shared.placeholders.PlaceholderRegistry; +import me.neznamy.tab.shared.placeholders.PlayerPlaceholder; + +public abstract class ProxyPlaceholderRegistry implements PlaceholderRegistry { + + @Override + public List registerPlaceholders() { + List placeholders = new ArrayList<>(); + placeholders.add(new PlayerPlaceholder("%canseeonline%", 2000) { + public String get(TabPlayer p) { + int count = 0; + for (TabPlayer all : TAB.getInstance().getPlayers()){ + if (!all.isVanished() || p.hasPermission("tab.seevanished")) count++; + } + return String.valueOf(count); + } + }); + placeholders.add(new PlayerPlaceholder("%canseestaffonline%", 2000) { + public String get(TabPlayer p) { + int count = 0; + for (TabPlayer all : TAB.getInstance().getPlayers()){ + if (all.isStaff() && (!all.isVanished() || p.hasPermission("tab.seevanished"))) count++; + } + return String.valueOf(count); + } + }); + return placeholders; + } +} \ No newline at end of file diff --git a/shared/src/main/java/me/neznamy/tab/shared/proxy/ProxyPlatform.java b/shared/src/main/java/me/neznamy/tab/shared/proxy/ProxyPlatform.java new file mode 100644 index 000000000..b45375954 --- /dev/null +++ b/shared/src/main/java/me/neznamy/tab/shared/proxy/ProxyPlatform.java @@ -0,0 +1,37 @@ +package me.neznamy.tab.shared.proxy; + +import me.neznamy.tab.api.TabPlayer; +import me.neznamy.tab.shared.Platform; +import me.neznamy.tab.shared.TAB; +import me.neznamy.tab.shared.features.PlaceholderManager; +import me.neznamy.tab.shared.features.PluginMessageHandler; +import me.neznamy.tab.shared.placeholders.PlayerPlaceholder; + +public abstract class ProxyPlatform implements Platform { + + private PluginMessageHandler plm; + + public ProxyPlatform(PluginMessageHandler plm) { + this.plm = plm; + } + + @Override + public void registerUnknownPlaceholder(String identifier) { + if (identifier.startsWith("%rel_")) return; + if (identifier.contains("_")) { + String expansion = identifier.split("_")[0].replace("%", "").toLowerCase(); + if (expansion.equals("some")) return; + TAB.getInstance().debug("Detected used PlaceholderAPI placeholder " + identifier); + PlaceholderManager pl = TAB.getInstance().getPlaceholderManager(); + int refresh = pl.getDefaultRefresh(); + if (pl.getPlayerPlaceholderRefreshIntervals().containsKey(identifier)) refresh = pl.getPlayerPlaceholderRefreshIntervals().get(identifier); + if (pl.getServerPlaceholderRefreshIntervals().containsKey(identifier)) refresh = pl.getServerPlaceholderRefreshIntervals().get(identifier); + TAB.getInstance().getPlaceholderManager().registerPlaceholder(new PlayerPlaceholder(identifier, TAB.getInstance().getErrorManager().fixPlaceholderInterval(identifier, refresh)){ + public String get(TabPlayer p) { + plm.requestPlaceholder(p, identifier); + return getLastValues().get(p.getName()); + } + }); + } + } +} diff --git a/shared/src/main/java/me/neznamy/tab/shared/proxy/ProxyTabPlayer.java b/shared/src/main/java/me/neznamy/tab/shared/proxy/ProxyTabPlayer.java new file mode 100644 index 000000000..05d81bc78 --- /dev/null +++ b/shared/src/main/java/me/neznamy/tab/shared/proxy/ProxyTabPlayer.java @@ -0,0 +1,33 @@ +package me.neznamy.tab.shared.proxy; + +import me.neznamy.tab.shared.ITabPlayer; +import me.neznamy.tab.shared.features.PluginMessageHandler; + +public abstract class ProxyTabPlayer extends ITabPlayer { + + private PluginMessageHandler plm; + + public ProxyTabPlayer(PluginMessageHandler plm) { + this.plm = plm; + } + + @Override + public boolean isVanished() { + return getAttribute("vanished"); + } + + @Override + public boolean isDisguised() { + return getAttribute("disguised"); + } + @Override + public boolean hasInvisibilityPotion() { + return getAttribute("invisible"); + } + + private boolean getAttribute(String name) { + plm.requestAttribute(this, name); + if (!attributes.containsKey(name)) return false; + return Boolean.parseBoolean(attributes.get(name)); + } +} \ No newline at end of file diff --git a/shared/src/main/java/me/neznamy/tab/shared/rgb/RGBUtils.java b/shared/src/main/java/me/neznamy/tab/shared/rgb/RGBUtils.java index 17c6b700f..d1db03d47 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/rgb/RGBUtils.java +++ b/shared/src/main/java/me/neznamy/tab/shared/rgb/RGBUtils.java @@ -13,10 +13,8 @@ import me.neznamy.tab.shared.rgb.format.CMIFormat; import me.neznamy.tab.shared.rgb.format.HtmlFormat; import me.neznamy.tab.shared.rgb.format.RGBFormatter; import me.neznamy.tab.shared.rgb.format.UnnamedFormat1; -import me.neznamy.tab.shared.rgb.gradient.CMIGradient; +import me.neznamy.tab.shared.rgb.gradient.CommonGradient; import me.neznamy.tab.shared.rgb.gradient.GradientPattern; -import me.neznamy.tab.shared.rgb.gradient.HtmlGradient; -import me.neznamy.tab.shared.rgb.gradient.IridescentGradient; import me.neznamy.tab.shared.rgb.gradient.KyoriGradient; /** @@ -43,9 +41,21 @@ public class RGBUtils { registerRGBFormatter(new UnnamedFormat1()); registerRGBFormatter(new HtmlFormat()); - registerGradient(new CMIGradient()); - registerGradient(new HtmlGradient()); - registerGradient(new IridescentGradient()); + //{#RRGGBB>}text{#RRGGBB<} + registerGradient(new CommonGradient(Pattern.compile("\\{#[0-9a-fA-F]{6}>\\}[^\\{]*\\{#[0-9a-fA-F]{6}<\\}"), + Pattern.compile("\\{#[0-9a-fA-F]{6}\\|.>\\}[^\\{]*\\{#[0-9a-fA-F]{6}<\\}"), + "{#", 9, 1, 10, 9)); + + //<#RRGGBB>Text + registerGradient(new CommonGradient(Pattern.compile("<#[0-9a-fA-F]{6}>[^<]*"), + Pattern.compile("<#[0-9a-fA-F]{6}\\|.>[^<]*"), + "<#", 9, 1, 9, 8)); + + //<$#RRGGBB>Text<$#RRGGBB> + registerGradient(new CommonGradient(Pattern.compile("<\\$#[0-9a-fA-F]{6}>[^<]*<\\$#[0-9a-fA-F]{6}>"), + Pattern.compile("<\\$#[0-9a-fA-F]{6}\\|.>[^<]*<\\$#[0-9a-fA-F]{6}>"), + "<$", 10, 2, 10, 8)); + registerGradient(new KyoriGradient()); } diff --git a/shared/src/main/java/me/neznamy/tab/shared/rgb/gradient/CMIGradient.java b/shared/src/main/java/me/neznamy/tab/shared/rgb/gradient/CMIGradient.java deleted file mode 100644 index 393183986..000000000 --- a/shared/src/main/java/me/neznamy/tab/shared/rgb/gradient/CMIGradient.java +++ /dev/null @@ -1,45 +0,0 @@ -package me.neznamy.tab.shared.rgb.gradient; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import me.neznamy.tab.shared.packets.EnumChatFormat; -import me.neznamy.tab.shared.rgb.TextColor; - -/** - * Gradient applier for {#RRGGBB>}text{#RRGGBB<} and {#RRGGBB|L>}text{#RRGGBB<} - */ -public class CMIGradient extends GradientPattern { - - private Pattern pattern = Pattern.compile("\\{#[0-9a-fA-F]{6}>\\}[^\\{]*\\{#[0-9a-fA-F]{6}<\\}"); - - private Pattern patternLegacy = Pattern.compile("\\{#[0-9a-fA-F]{6}\\|.>\\}[^\\{]*\\{#[0-9a-fA-F]{6}<\\}"); - - @Override - public String applyPattern(String text, boolean ignorePlaceholders) { - if (!text.contains("{#")) return text; - String replaced = text; - Matcher m = patternLegacy.matcher(replaced); - while (m.find()) { - String format = m.group(); - EnumChatFormat legacyColor = EnumChatFormat.getByChar(format.charAt(9)); - if ((ignorePlaceholders && format.contains("%")) || legacyColor == null) continue; - TextColor start = new TextColor(format.substring(1, 8), legacyColor); - String message = format.substring(12, format.length()-10); - TextColor end = new TextColor(format.substring(format.length()-9, format.length()-2)); - String applied = asGradient(start, message, end); - replaced = replaced.replace(format, applied); - } - m = pattern.matcher(replaced); - while (m.find()) { - String format = m.group(); - if (ignorePlaceholders && format.contains("%")) continue; - TextColor start = new TextColor(format.substring(1, 8)); - String message = format.substring(10, format.length()-10); - TextColor end = new TextColor(format.substring(format.length()-9, format.length()-2)); - String applied = asGradient(start, message, end); - replaced = replaced.replace(format, applied); - } - return replaced; - } -} \ No newline at end of file diff --git a/shared/src/main/java/me/neznamy/tab/shared/rgb/gradient/CommonGradient.java b/shared/src/main/java/me/neznamy/tab/shared/rgb/gradient/CommonGradient.java new file mode 100644 index 000000000..ca570d1ca --- /dev/null +++ b/shared/src/main/java/me/neznamy/tab/shared/rgb/gradient/CommonGradient.java @@ -0,0 +1,57 @@ +package me.neznamy.tab.shared.rgb.gradient; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import me.neznamy.tab.shared.packets.EnumChatFormat; +import me.neznamy.tab.shared.rgb.TextColor; + +public class CommonGradient extends GradientPattern { + + private Pattern pattern; + private Pattern legacyPattern; + private String containCheck; + private int legacyCharPosition; + private int startColorStart; + private int messageStart; + private int endColorStartSub; + + public CommonGradient(Pattern pattern, Pattern legacyPattern, String containCheck, int legacyCharPosition, + int startColorStart, int messageStart, int endColorStartSub) { + this.pattern = pattern; + this.legacyPattern = legacyPattern; + this.containCheck = containCheck; + this.legacyCharPosition = legacyCharPosition; + this.startColorStart = startColorStart; + this.messageStart = messageStart; + this.endColorStartSub = endColorStartSub; + } + + @Override + public String applyPattern(String text, boolean ignorePlaceholders) { + if (!text.contains(containCheck)) return text; + String replaced = text; + Matcher m = legacyPattern.matcher(replaced); + while (m.find()) { + String format = m.group(); + EnumChatFormat legacyColor = EnumChatFormat.getByChar(format.charAt(legacyCharPosition)); + if ((ignorePlaceholders && format.contains("%")) || legacyColor == null) continue; + TextColor start = new TextColor(format.substring(startColorStart, startColorStart+7), legacyColor); + String message = format.substring(messageStart+2, format.length()-10); + TextColor end = new TextColor(format.substring(format.length()-endColorStartSub, format.length()-endColorStartSub+7)); + String applied = asGradient(start, message, end); + replaced = replaced.replace(format, applied); + } + m = pattern.matcher(replaced); + while (m.find()) { + String format = m.group(); + if (ignorePlaceholders && format.contains("%")) continue; + TextColor start = new TextColor(format.substring(startColorStart, startColorStart+7)); + String message = format.substring(messageStart, format.length()-10); + TextColor end = new TextColor(format.substring(format.length()-endColorStartSub, format.length()-endColorStartSub+7)); + String applied = asGradient(start, message, end); + replaced = replaced.replace(format, applied); + } + return replaced; + } +} diff --git a/shared/src/main/java/me/neznamy/tab/shared/rgb/gradient/HtmlGradient.java b/shared/src/main/java/me/neznamy/tab/shared/rgb/gradient/HtmlGradient.java deleted file mode 100644 index ceb51c953..000000000 --- a/shared/src/main/java/me/neznamy/tab/shared/rgb/gradient/HtmlGradient.java +++ /dev/null @@ -1,45 +0,0 @@ -package me.neznamy.tab.shared.rgb.gradient; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import me.neznamy.tab.shared.packets.EnumChatFormat; -import me.neznamy.tab.shared.rgb.TextColor; - -/** - * Gradient applier for <#RRGGBB>Text and <#RRGGBB|L>Text - */ -public class HtmlGradient extends GradientPattern { - - private Pattern pattern = Pattern.compile("<#[0-9a-fA-F]{6}>[^<]*"); - - private Pattern patternLegacy = Pattern.compile("<#[0-9a-fA-F]{6}\\|.>[^<]*"); - - @Override - public String applyPattern(String text, boolean ignorePlaceholders) { - if (!text.contains("<#")) return text; - String replaced = text; - Matcher m = patternLegacy.matcher(replaced); - while (m.find()) { - String format = m.group(); - EnumChatFormat legacyColor = EnumChatFormat.getByChar(format.charAt(9)); - if ((ignorePlaceholders && format.contains("%")) || legacyColor == null) continue; - TextColor start = new TextColor(format.substring(1, 8), legacyColor); - String message = format.substring(11, format.length()-10); - TextColor end = new TextColor(format.substring(format.length()-8, format.length()-1)); - String applied = asGradient(start, message, end); - replaced = replaced.replace(format, applied); - } - m = pattern.matcher(replaced); - while (m.find()) { - String format = m.group(); - if (ignorePlaceholders && format.contains("%")) continue; - TextColor start = new TextColor(format.substring(1, 8)); - String message = format.substring(9, format.length()-10); - TextColor end = new TextColor(format.substring(format.length()-8, format.length()-1)); - String applied = asGradient(start, message, end); - replaced = replaced.replace(format, applied); - } - return replaced; - } -} \ No newline at end of file diff --git a/shared/src/main/java/me/neznamy/tab/shared/rgb/gradient/IridescentGradient.java b/shared/src/main/java/me/neznamy/tab/shared/rgb/gradient/IridescentGradient.java deleted file mode 100644 index 13f59b4bf..000000000 --- a/shared/src/main/java/me/neznamy/tab/shared/rgb/gradient/IridescentGradient.java +++ /dev/null @@ -1,45 +0,0 @@ -package me.neznamy.tab.shared.rgb.gradient; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import me.neznamy.tab.shared.packets.EnumChatFormat; -import me.neznamy.tab.shared.rgb.TextColor; - -/** - * Gradient applier for <$#RRGGBB>Text<$#RRGGBB> and <$#RRGGBB|L>Text<$#RRGGBB> - */ -public class IridescentGradient extends GradientPattern { - - private final Pattern pattern = Pattern.compile("<\\$#[0-9a-fA-F]{6}>[^<]*<\\$#[0-9a-fA-F]{6}>"); - - private final Pattern patternLegacy = Pattern.compile("<\\$#[0-9a-fA-F]{6}\\|.>[^<]*<\\$#[0-9a-fA-F]{6}>"); - - @Override - public String applyPattern(String text, boolean ignorePlaceholders) { - if (!text.contains("<$")) return text; - String replaced = text; - Matcher m = patternLegacy.matcher(replaced); - while (m.find()) { - String format = m.group(); - EnumChatFormat legacyColor = EnumChatFormat.getByChar(format.charAt(10)); - if ((ignorePlaceholders && format.contains("%")) || legacyColor == null) continue; - TextColor start = new TextColor(format.substring(2, 9), legacyColor); - String message = format.substring(12, format.length()-10); - TextColor end = new TextColor(format.substring(format.length()-8, format.length()-1)); - String applied = asGradient(start, message, end); - replaced = replaced.replace(format, applied); - } - m = pattern.matcher(replaced); - while (m.find()) { - String format = m.group(); - if (ignorePlaceholders && format.contains("%")) continue; - TextColor start = new TextColor(format.substring(2, 9)); - String message = format.substring(10, format.length()-10); - TextColor end = new TextColor(format.substring(format.length()-8, format.length()-1)); - String applied = asGradient(start, message, end); - replaced = replaced.replace(format, applied); - } - return replaced; - } -} \ No newline at end of file diff --git a/velocity-1.1.0/src/main/java/me/neznamy/tab/platforms/velocity/v1_1_0/Main.java b/velocity-1.1.0/src/main/java/me/neznamy/tab/platforms/velocity/v1_1_0/Main.java index ab8ae02a5..c5aaf6970 100644 --- a/velocity-1.1.0/src/main/java/me/neznamy/tab/platforms/velocity/v1_1_0/Main.java +++ b/velocity-1.1.0/src/main/java/me/neznamy/tab/platforms/velocity/v1_1_0/Main.java @@ -61,17 +61,17 @@ public class Main { server.getConsoleCommandSource().sendMessage(Identity.nil(), Component.text("\u00a7c[TAB] The plugin requires Velocity 1.1.0 and up to work. Get it at https://velocitypowered.com/downloads")); return; } - if (getServer().getConfiguration().isOnlineMode()) { + if (server.getConfiguration().isOnlineMode()) { server.getConsoleCommandSource().sendMessage(Identity.nil(), Component.text("\u00a76[TAB] If you experience tablist prefix/suffix not working and global playerlist duplicating players, toggle " + "\"use-online-uuid-in-tablist\" option in config.yml (set it to opposite value).")); } instance = this; - TAB.setInstance(new TAB(new VelocityPlatform(getServer()), new VelocityPacketBuilder(), ProtocolVersion.values()[1])); - getServer().getEventManager().register(this, new VelocityEventListener()); - VelocityTABCommand cmd = new VelocityTABCommand(); - getServer().getCommandManager().register(getServer().getCommandManager().metaBuilder("btab").build(), cmd); - getServer().getCommandManager().register(getServer().getCommandManager().metaBuilder("vtab").build(), cmd); plm = new VelocityPluginMessageHandler(this); + TAB.setInstance(new TAB(new VelocityPlatform(server, plm), new VelocityPacketBuilder(), ProtocolVersion.values()[1])); + server.getEventManager().register(this, new VelocityEventListener()); + VelocityTABCommand cmd = new VelocityTABCommand(); + server.getCommandManager().register(server.getCommandManager().metaBuilder("btab").build(), cmd); + server.getCommandManager().register(server.getCommandManager().metaBuilder("vtab").build(), cmd); TAB.getInstance().load(); Metrics metrics = metricsFactory.make(this, 10533); metrics.addCustomChart(new SimplePie("global_playerlist_enabled", () -> TAB.getInstance().getFeatureManager().isFeatureEnabled("globalplayerlist") ? "Yes" : "No")); diff --git a/velocity-1.1.0/src/main/java/me/neznamy/tab/platforms/velocity/v1_1_0/VelocityPlaceholderRegistry.java b/velocity-1.1.0/src/main/java/me/neznamy/tab/platforms/velocity/v1_1_0/VelocityPlaceholderRegistry.java index af0791a0c..fc3e44296 100644 --- a/velocity-1.1.0/src/main/java/me/neznamy/tab/platforms/velocity/v1_1_0/VelocityPlaceholderRegistry.java +++ b/velocity-1.1.0/src/main/java/me/neznamy/tab/platforms/velocity/v1_1_0/VelocityPlaceholderRegistry.java @@ -1,22 +1,18 @@ package me.neznamy.tab.platforms.velocity.v1_1_0; -import java.util.ArrayList; import java.util.List; import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.server.RegisteredServer; -import me.neznamy.tab.api.TabPlayer; -import me.neznamy.tab.shared.TAB; import me.neznamy.tab.shared.placeholders.Placeholder; -import me.neznamy.tab.shared.placeholders.PlaceholderRegistry; -import me.neznamy.tab.shared.placeholders.PlayerPlaceholder; import me.neznamy.tab.shared.placeholders.ServerPlaceholder; +import me.neznamy.tab.shared.proxy.ProxyPlaceholderRegistry; /** * Velocity registry to register velocity-only placeholders */ -public class VelocityPlaceholderRegistry implements PlaceholderRegistry { +public class VelocityPlaceholderRegistry extends ProxyPlaceholderRegistry { //instance of proxyserver private ProxyServer server; @@ -31,7 +27,7 @@ public class VelocityPlaceholderRegistry implements PlaceholderRegistry { @Override public List registerPlaceholders() { - List placeholders = new ArrayList<>(); + List placeholders = super.registerPlaceholders(); for (RegisteredServer rServer : server.getAllServers()) { placeholders.add(new ServerPlaceholder("%online_" + rServer.getServerInfo().getName() + "%", 1000) { public String get() { @@ -39,24 +35,6 @@ public class VelocityPlaceholderRegistry implements PlaceholderRegistry { } }); } - placeholders.add(new PlayerPlaceholder("%canseeonline%", 2000) { - public String get(TabPlayer p) { - int count = 0; - for (TabPlayer all : TAB.getInstance().getPlayers()){ - if (!all.isVanished() || p.hasPermission("tab.seevanished")) count++; - } - return String.valueOf(count); - } - }); - placeholders.add(new PlayerPlaceholder("%canseestaffonline%", 2000) { - public String get(TabPlayer p) { - int count = 0; - for (TabPlayer all : TAB.getInstance().getPlayers()){ - if (all.isStaff() && (!all.isVanished() || p.hasPermission("tab.seevanished"))) count++; - } - return String.valueOf(count); - } - }); return placeholders; } } \ No newline at end of file diff --git a/velocity-1.1.0/src/main/java/me/neznamy/tab/platforms/velocity/v1_1_0/VelocityPlatform.java b/velocity-1.1.0/src/main/java/me/neznamy/tab/platforms/velocity/v1_1_0/VelocityPlatform.java index 8f8a9a33e..89213ea44 100644 --- a/velocity-1.1.0/src/main/java/me/neznamy/tab/platforms/velocity/v1_1_0/VelocityPlatform.java +++ b/velocity-1.1.0/src/main/java/me/neznamy/tab/platforms/velocity/v1_1_0/VelocityPlatform.java @@ -7,23 +7,21 @@ import com.velocitypowered.api.plugin.PluginContainer; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; -import me.neznamy.tab.api.TabPlayer; -import me.neznamy.tab.shared.Platform; import me.neznamy.tab.shared.TAB; import me.neznamy.tab.shared.features.GlobalPlayerlist; -import me.neznamy.tab.shared.features.PlaceholderManager; +import me.neznamy.tab.shared.features.PluginMessageHandler; import me.neznamy.tab.shared.permission.LuckPerms; import me.neznamy.tab.shared.permission.PermissionPlugin; import me.neznamy.tab.shared.permission.VaultBridge; -import me.neznamy.tab.shared.placeholders.PlayerPlaceholder; import me.neznamy.tab.shared.placeholders.UniversalPlaceholderRegistry; +import me.neznamy.tab.shared.proxy.ProxyPlatform; import net.kyori.adventure.identity.Identity; import net.kyori.adventure.text.Component; /** * Velocity implementation of Platform */ -public class VelocityPlatform implements Platform { +public class VelocityPlatform extends ProxyPlatform { //instance of proxyserver private ProxyServer server; @@ -32,7 +30,8 @@ public class VelocityPlatform implements Platform { * Constructs new instance with given parameter * @param server - instance of proxyserver */ - public VelocityPlatform(ProxyServer server) { + public VelocityPlatform(ProxyServer server, PluginMessageHandler plm) { + super(plm); this.server = server; } @@ -66,25 +65,6 @@ public class VelocityPlatform implements Platform { server.getConsoleCommandSource().sendMessage(Identity.nil(), Component.text(translateColors ? message.replace('&', '\u00a7') : message)); } - @Override - public void registerUnknownPlaceholder(String identifier) { - if (identifier.contains("_")) { - String plugin = identifier.split("_")[0].replace("%", "").toLowerCase(); - if (plugin.equals("some")) return; - TAB.getInstance().debug("Detected used PlaceholderAPI placeholder " + identifier); - PlaceholderManager pl = TAB.getInstance().getPlaceholderManager(); - int refresh = pl.getDefaultRefresh(); - if (pl.getPlayerPlaceholderRefreshIntervals().containsKey(identifier)) refresh = pl.getPlayerPlaceholderRefreshIntervals().get(identifier); - if (pl.getServerPlaceholderRefreshIntervals().containsKey(identifier)) refresh = pl.getServerPlaceholderRefreshIntervals().get(identifier); - TAB.getInstance().getPlaceholderManager().registerPlaceholder(new PlayerPlaceholder(identifier, TAB.getInstance().getErrorManager().fixPlaceholderInterval(identifier, refresh)){ - public String get(TabPlayer p) { - Main.getInstance().getPluginMessageHandler().requestPlaceholder(p, identifier); - return getLastValues().get(p.getName()); - } - }); - } - } - @Override public String getServerVersion() { return server.getVersion().getName() + " v" + server.getVersion().getVersion(); diff --git a/velocity-1.1.0/src/main/java/me/neznamy/tab/platforms/velocity/v1_1_0/VelocityTabPlayer.java b/velocity-1.1.0/src/main/java/me/neznamy/tab/platforms/velocity/v1_1_0/VelocityTabPlayer.java index b922db27e..9d968dc00 100644 --- a/velocity-1.1.0/src/main/java/me/neznamy/tab/platforms/velocity/v1_1_0/VelocityTabPlayer.java +++ b/velocity-1.1.0/src/main/java/me/neznamy/tab/platforms/velocity/v1_1_0/VelocityTabPlayer.java @@ -15,7 +15,6 @@ import com.velocitypowered.api.proxy.player.TabListEntry; import com.velocitypowered.api.util.GameProfile; import com.velocitypowered.api.util.GameProfile.Property; -import me.neznamy.tab.shared.ITabPlayer; import me.neznamy.tab.shared.ProtocolVersion; import me.neznamy.tab.shared.TAB; import me.neznamy.tab.shared.packets.IChatBaseComponent; @@ -24,6 +23,7 @@ import me.neznamy.tab.shared.packets.PacketPlayOutChat; import me.neznamy.tab.shared.packets.PacketPlayOutPlayerInfo; import me.neznamy.tab.shared.packets.PacketPlayOutPlayerInfo.PlayerInfoData; import me.neznamy.tab.shared.packets.PacketPlayOutPlayerListHeaderFooter; +import me.neznamy.tab.shared.proxy.ProxyTabPlayer; import net.kyori.adventure.audience.MessageType; import net.kyori.adventure.bossbar.BossBar; import net.kyori.adventure.bossbar.BossBar.Color; @@ -34,7 +34,7 @@ import net.kyori.adventure.identity.Identity; /** * TabPlayer for Velocity */ -public class VelocityTabPlayer extends ITabPlayer { +public class VelocityTabPlayer extends ProxyTabPlayer { //the velocity player private Player player; @@ -50,6 +50,7 @@ public class VelocityTabPlayer extends ITabPlayer { * @param p - velocity player */ public VelocityTabPlayer(Player p) { + super (Main.getInstance().getPluginMessageHandler()); player = p; Optional server = p.getCurrentServer(); if (server.isPresent()) { @@ -203,27 +204,6 @@ public class VelocityTabPlayer extends ITabPlayer { public UUID getTablistUUID() { return tablistId; } - - @Override - public boolean isVanished() { - return getAttribute("vanished"); - } - - @Override - public boolean isDisguised() { - return getAttribute("disguised"); - } - - @Override - public boolean hasInvisibilityPotion() { - return getAttribute("invisible"); - } - - private boolean getAttribute(String name) { - Main.getInstance().getPluginMessageHandler().requestAttribute(this, name); - if (!attributes.containsKey(name)) return false; - return Boolean.parseBoolean(attributes.get(name)); - } @Override public boolean isOnline() {