more abstraction to remove duplications

This commit is contained in:
NEZNAMY committed 2021-07-01 11:14:41 +02:00
1 parent a8b53b07e4
commit 135a473dc5
24 files changed
+273 -356

No files matched your search

@@ -204,7 +204,7 @@ public class BukkitTabPlayer extends ITabPlayer {
if (vanished) return true;
}
List<MetadataValue> 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);
}
@@ -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();
}
/**
@@ -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<Placeholder> registerPlaceholders() {
List<Placeholder> 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<Placeholder> placeholders = super.registerPlaceholders();
placeholders.add(new PlayerPlaceholder("%displayname%", 500) {
public String get(TabPlayer p) {
return ((ProxiedPlayer) p.getPlayer()).getDisplayName();
@@ -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();
@@ -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
@@ -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()));
@@ -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<String> complete(TabPlayer sender, String[] arguments) {
List<String> suggestions = new ArrayList<>();
if (arguments.length == 2) {
for (String property : getAllProperties()) {
if (property.startsWith(arguments[1].toLowerCase())) suggestions.add(property);
}
}
return suggestions;
}
}
@@ -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<String> complete(TabPlayer sender, String[] arguments) {
if (arguments.length == 1) return getPlayers(arguments[0]);
List<String> 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);
}
}
@@ -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<String> complete(TabPlayer sender, String[] arguments) {
if (arguments.length == 1) return getPlayers(arguments[0]);
List<String> 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);
}
}
@@ -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<String> complete(TabPlayer sender, String[] arguments) {
List<String> suggestions = new ArrayList<>();
if (arguments.length == 2) {
for (String property : getAllProperties()) {
if (property.startsWith(arguments[1].toLowerCase())) suggestions.add(property);
}
}
return suggestions;
}
}
@@ -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<String> 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<String> 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<String> 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<String> getUsedPlaceholders() {
return usedPlaceholders;
}
@Override
public void refreshUsedPlaceholders() {
usedPlaceholders = tab.getPlaceholderManager().getUsedPlaceholderIdentifiersRecursive(rawText);
}
@Override
public TabFeature getFeatureType() {
return TabFeature.BELOWNAME_TEXT;
}
}
}
@@ -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();
}
@@ -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<Placeholder> registerPlaceholders() {
List<Placeholder> 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;
}
}
@@ -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());
}
});
}
}
}
@@ -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));
}
}
@@ -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</#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, 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());
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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 HtmlGradient 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(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;
}
}
@@ -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;
}
}
@@ -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"));
@@ -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<Placeholder> registerPlaceholders() {
List<Placeholder> placeholders = new ArrayList<>();
List<Placeholder> 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;
}
}
@@ -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();
@@ -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<ServerConnection> 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() {