Compare commits

..
17 Commits
Author SHA1 Message Date
NEZNAMY ea79c9c5dd 5.0.7 2025-02-16 11:27:35 +01:00
NEZNAMY 650d13ed71 [Reloading] Fix plugin messages being ignored on Velocity on reload due to a check not working correctly 2025-02-15 09:11:50 +01:00
NEZNAMY 169b8b8e94 [Scoreboard] Fix scoreboard chain misconfiguration detection not working correctly 2025-02-14 16:57:15 +01:00
NEZNAMY 8cef4a5bcb [Fabric] Update to 25w07a 2025-02-13 19:16:32 +01:00
NEZNAMY 70b40802cc [Fabric] Remove redundant function split based on server version 2025-02-11 17:45:53 +01:00
NEZNAMY 416e707cda Revert "[Code style] Create a separate module for bossbar API"
This reverts commit 042ab6850b.
2025-02-11 16:32:05 +01:00
NEZNAMY 12578293bc [Bukkit] Delete paper submodule as it was not worth it 2025-02-10 17:14:46 +01:00
NEZNAMY 042ab6850b [Code style] Create a separate module for bossbar API 2025-02-09 20:03:17 +01:00
NEZNAMY 09fc042630 [Chat components] Fix magic codes not being assigned correctly when converting from an adventure component 2025-02-09 14:55:58 +01:00
NEZNAMY c73d351bf1 [Configuration] Update default config to avoid unwanted bold text caused by MiniMessage 2025-02-09 12:42:52 +01:00
NEZNAMY 4d4e0a9c2a [BungeeCord & Velocity] Make compatibility error message more visible 2025-02-08 13:03:25 +01:00
NEZNAMY 2fd29b2347 [Configuration] Disable SnakeYAML's max file size limit (layout skincache can exceed the default 3MB) 2025-02-08 12:45:19 +01:00
NEZNAMY f332068318 [Fabric] Fix 1.16.5 support 2025-02-08 12:28:52 +01:00
NEZNAMY 186c79f93c [Bukkit] Split component converter into multiple classes based on server version interval for better maintainability 2025-02-08 10:19:06 +01:00
NEZNAMY 3770066485 [Code style] Move component folder into a new separate module 2025-02-07 16:19:48 +01:00
NEZNAMY 17b0ffe52b [Bukkit] Fix component style magic codes conversion 2025-02-07 15:35:23 +01:00
NEZNAMY d259b5bb78 5.0.7-SNAPSHOT 2025-02-06 18:05:23 +01:00
138 changed files with 672 additions and 950 deletions

No files matched your search

+2 -2
View File
@@ -4,7 +4,7 @@ plugins {
allprojects {
group = "me.neznamy"
version = "5.0.6"
version = "5.0.7"
description = "An all-in-one solution that works"
ext.set("id", "tab")
@@ -14,8 +14,8 @@ allprojects {
val platforms = setOf(
projects.bukkit,
projects.bukkit.paper,
projects.bungeecord,
projects.component,
projects.velocity,
projects.sponge7,
projects.sponge8,
-22
View File
@@ -1,22 +0,0 @@
plugins {
id("io.papermc.paperweight.userdev") version "2.0.0-beta.8"
}
repositories {
maven("https://jitpack.io") // YamlAssist
maven("https://repo.opencollab.dev/maven-snapshots/")
maven("https://repo.viaversion.com/")
maven("https://oss.sonatype.org/content/repositories/snapshots")
}
val version = "1.21.4-R0.1-SNAPSHOT"
dependencies {
implementation(projects.bukkit)
paperweight.paperDevBundle(version)
compileOnly("io.papermc.paper:paper-api:${version}")
}
tasks.compileJava {
options.release.set(21)
}
@@ -1,52 +0,0 @@
package me.neznamy.tab.platforms.paper;
import me.neznamy.tab.platforms.bukkit.nms.converter.ComponentConverter;
import me.neznamy.tab.shared.chat.ChatModifier;
import me.neznamy.tab.shared.chat.component.KeybindComponent;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.tab.shared.chat.component.TextComponent;
import me.neznamy.tab.shared.chat.component.TranslatableComponent;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.Style;
import net.minecraft.network.chat.TextColor;
import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.NotNull;
/**
* Component converter using direct mojang-mapped code for versions 1.21.4+.
*/
@SuppressWarnings("unused") // Used via reflection
public class PaperComponentConverter extends ComponentConverter {
@Override
@NotNull
public Component convert(@NotNull TabComponent component) {
// Component type
MutableComponent nmsComponent = switch (component) {
case TextComponent text -> Component.literal(text.getText());
case TranslatableComponent translatable -> Component.translatable(translatable.getKey());
case KeybindComponent keybind -> Component.keybind(keybind.getKeybind());
default -> throw new IllegalStateException("Unexpected component type: " + component.getClass().getName());
};
// Component style
ChatModifier modifier = component.getModifier();
Style style = Style.EMPTY
.withColor(modifier.getColor() == null ? null : TextColor.fromRgb(modifier.getColor().getRgb()))
.withBold(modifier.getBold())
.withItalic(modifier.getItalic())
.withUnderlined(modifier.getUnderlined())
.withStrikethrough(modifier.getStrikethrough())
.withObfuscated(modifier.getObfuscated())
.withFont(modifier.getFont() == null ? null : ResourceLocation.tryParse(modifier.getFont()));
if (modifier.getShadowColor() != null) style = style.withShadowColor(modifier.getShadowColor()); // withShadowColor takes int instead of Integer, bug?
nmsComponent.setStyle(style);
// Extra
for (TabComponent extra : component.getExtra()) {
nmsComponent.append(convert(extra));
}
return nmsComponent;
}
}
@@ -1,17 +0,0 @@
package me.neznamy.tab.platforms.paper;
import io.netty.channel.Channel;
import me.neznamy.tab.platforms.bukkit.BukkitTabPlayer;
import me.neznamy.tab.shared.util.function.FunctionWithException;
import org.bukkit.craftbukkit.entity.CraftPlayer;
/**
* Loader for 1.20.5+ Paper to speed up functions by using direct NMS code instead of reflection.
*/
@SuppressWarnings("unused") // Via reflection
public class PaperLoader {
/** Channel getter using direct NMS code */
public static final FunctionWithException<BukkitTabPlayer, Channel> getChannel =
player -> ((CraftPlayer)player.getPlayer()).getHandle().connection.connection.channel;
}
@@ -1,159 +0,0 @@
package me.neznamy.tab.platforms.paper;
import lombok.NonNull;
import lombok.SneakyThrows;
import me.neznamy.tab.platforms.bukkit.BukkitTabPlayer;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.platform.decorators.SafeScoreboard;
import me.neznamy.tab.shared.util.ReflectionUtils;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.numbers.FixedFormat;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.*;
import net.minecraft.world.scores.PlayerTeam;
import net.minecraft.world.scores.Scoreboard;
import net.minecraft.world.scores.criteria.ObjectiveCriteria;
import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.Optional;
/**
* Scoreboard implementation using direct mojang-mapped code for versions 1.20.5+.
*/
@SuppressWarnings("unused") // Used via reflection
public class PaperPacketScoreboard extends SafeScoreboard<BukkitTabPlayer> {
private static final ChatFormatting[] formats = ChatFormatting.values();
private static final net.minecraft.world.scores.Team.CollisionRule[] collisions = net.minecraft.world.scores.Team.CollisionRule.values();
private static final net.minecraft.world.scores.Team.Visibility[] visibilities = net.minecraft.world.scores.Team.Visibility.values();
private static final Scoreboard dummyScoreboard = new Scoreboard();
private static final Field method;
private static final Field players;
static {
try {
method = ReflectionUtils.setAccessible(ClientboundSetPlayerTeamPacket.class.getDeclaredField("method"));
players = ReflectionUtils.setAccessible(ClientboundSetPlayerTeamPacket.class.getDeclaredField("players"));
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
}
}
/**
* Constructs new instance with given player.
*
* @param player
* Player this scoreboard will belong to
*/
public PaperPacketScoreboard(@NotNull BukkitTabPlayer player) {
super(player);
}
@Override
public void registerObjective(@NonNull Objective objective) {
net.minecraft.world.scores.Objective obj = new net.minecraft.world.scores.Objective(
dummyScoreboard,
objective.getName(),
ObjectiveCriteria.DUMMY,
objective.getTitle().convert(),
ObjectiveCriteria.RenderType.values()[objective.getHealthDisplay().ordinal()],
false,
objective.getNumberFormat() == null ? null : objective.getNumberFormat().toFixedFormat(FixedFormat::new)
);
objective.setPlatformObjective(obj);
sendPacket(new ClientboundSetObjectivePacket(obj, ObjectiveAction.REGISTER));
sendPacket(new ClientboundSetDisplayObjectivePacket(net.minecraft.world.scores.DisplaySlot.values()[objective.getDisplaySlot().ordinal()], obj));
}
@Override
public void unregisterObjective(@NonNull Objective objective) {
sendPacket(new ClientboundSetObjectivePacket((net.minecraft.world.scores.Objective) objective.getPlatformObjective(), ObjectiveAction.UNREGISTER));
}
@Override
public void updateObjective(@NonNull Objective objective) {
net.minecraft.world.scores.Objective obj = (net.minecraft.world.scores.Objective) objective.getPlatformObjective();
obj.setDisplayName(objective.getTitle().convert());
obj.setRenderType(ObjectiveCriteria.RenderType.values()[objective.getHealthDisplay().ordinal()]);
sendPacket(new ClientboundSetObjectivePacket(obj, ObjectiveAction.UPDATE));
}
@Override
public void setScore(@NonNull Score score) {
sendPacket(
new ClientboundSetScorePacket(
score.getHolder(),
score.getObjective().getName(),
score.getValue(),
Optional.ofNullable(score.getDisplayName() == null ? null : score.getDisplayName().convert()),
Optional.ofNullable(score.getNumberFormat() == null ? null : score.getNumberFormat().toFixedFormat(FixedFormat::new))
)
);
}
@Override
public void removeScore(@NonNull Score score) {
sendPacket(new ClientboundResetScorePacket(score.getHolder(), score.getObjective().getName()));
}
@Override
@NotNull
public Object createTeam(@NonNull String name) {
return new PlayerTeam(dummyScoreboard, name);
}
@Override
public void registerTeam(@NonNull Team team) {
updateTeamProperties(team);
PlayerTeam t = (PlayerTeam) team.getPlatformTeam();
t.getPlayers().addAll(team.getPlayers());
sendPacket(ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(t, true));
}
@Override
public void unregisterTeam(@NonNull Team team) {
sendPacket(ClientboundSetPlayerTeamPacket.createRemovePacket((PlayerTeam) team.getPlatformTeam()));
}
@Override
public void updateTeam(@NonNull Team team) {
updateTeamProperties(team);
sendPacket(ClientboundSetPlayerTeamPacket.createAddOrModifyPacket((PlayerTeam) team.getPlatformTeam(), false));
}
private void updateTeamProperties(@NonNull Team team) {
PlayerTeam t = (PlayerTeam) team.getPlatformTeam();
t.setAllowFriendlyFire((team.getOptions() & 0x01) != 0);
t.setSeeFriendlyInvisibles((team.getOptions() & 0x02) != 0);
t.setColor(formats[team.getColor().getLegacyColor().ordinal()]);
t.setCollisionRule(collisions[team.getCollision().ordinal()]);
t.setNameTagVisibility(visibilities[team.getVisibility().ordinal()]);
t.setPlayerPrefix(team.getPrefix().convert());
t.setPlayerSuffix(team.getSuffix().convert());
}
@Override
@SneakyThrows
public void onPacketSend(@NonNull Object packet) {
if (isAntiOverrideScoreboard()) {
if (packet instanceof ClientboundSetDisplayObjectivePacket display) {
TAB.getInstance().getFeatureManager().onDisplayObjective(player, display.getSlot().ordinal(), display.getObjectiveName());
}
if (packet instanceof ClientboundSetObjectivePacket objective) {
TAB.getInstance().getFeatureManager().onObjective(player, objective.getMethod(), objective.getObjectiveName());
}
}
if (isAntiOverrideTeams() && packet instanceof ClientboundSetPlayerTeamPacket team) {
int action = method.getInt(team);
if (action == TeamAction.UPDATE) return;
players.set(team, onTeamPacket(action, team.getName(), team.getPlayers() == null ? Collections.emptyList() : team.getPlayers()));
}
}
private void sendPacket(@NotNull Packet<?> packet) {
((CraftPlayer)player.getPlayer()).getHandle().connection.sendPacket(packet);
}
}
@@ -1,179 +0,0 @@
package me.neznamy.tab.platforms.paper;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import lombok.NonNull;
import lombok.SneakyThrows;
import me.neznamy.tab.platforms.bukkit.BukkitTabPlayer;
import me.neznamy.tab.platforms.bukkit.tablist.TabListBase;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.TabList;
import me.neznamy.tab.shared.util.ReflectionUtils;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.ClientboundPlayerInfoRemovePacket;
import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket;
import net.minecraft.network.protocol.game.ClientboundTabListPacket;
import net.minecraft.world.level.GameType;
import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Field;
import java.util.*;
/**
* TabList implementation using direct mojang-mapped code for versions 1.21.4+.
*/
@SuppressWarnings("unused") // Used via reflection
public class PaperPacketTabList extends TabListBase<Component> {
private static final EnumSet<ClientboundPlayerInfoUpdatePacket.Action> updateDisplayName = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME);
private static final EnumSet<ClientboundPlayerInfoUpdatePacket.Action> updateLatency = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LATENCY);
private static final EnumSet<ClientboundPlayerInfoUpdatePacket.Action> updateGameMode = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE);
private static final EnumSet<ClientboundPlayerInfoUpdatePacket.Action> updateListed = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LISTED);
private static final EnumSet<ClientboundPlayerInfoUpdatePacket.Action> updateListOrder = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LIST_ORDER);
private static final EnumSet<ClientboundPlayerInfoUpdatePacket.Action> updateHat = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_HAT);
private static final EnumSet<ClientboundPlayerInfoUpdatePacket.Action> addPlayer = EnumSet.allOf(ClientboundPlayerInfoUpdatePacket.Action.class);
private static final Field entries;
static {
try {
entries = ReflectionUtils.setAccessible(ClientboundPlayerInfoUpdatePacket.class.getDeclaredField("entries"));
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
}
}
/**
* Constructs new instance.
*
* @param player
* Player this tablist will belong to
*/
public PaperPacketTabList(@NotNull BukkitTabPlayer player) {
super(player);
}
@Override
public void removeEntry(@NonNull UUID entry) {
sendPacket(new ClientboundPlayerInfoRemovePacket(Collections.singletonList(entry)));
}
@Override
public void updateDisplayName(@NonNull UUID entry, @Nullable Component displayName) {
sendPacket(new ClientboundPlayerInfoUpdatePacket(updateDisplayName, new ClientboundPlayerInfoUpdatePacket.Entry(
entry, null, false, 0, null, displayName, false, 0, null
)));
}
@Override
public void updateLatency(@NonNull UUID entry, int latency) {
sendPacket(new ClientboundPlayerInfoUpdatePacket(updateLatency, new ClientboundPlayerInfoUpdatePacket.Entry(
entry, null, false, latency, null, null, false, 0, null
)));
}
@Override
public void updateGameMode(@NonNull UUID entry, int gameMode) {
sendPacket(new ClientboundPlayerInfoUpdatePacket(updateGameMode, new ClientboundPlayerInfoUpdatePacket.Entry(
entry, null, false, 0, GameType.byId(gameMode), null, false, 0, null
)));
}
@Override
public void updateListed(@NonNull UUID entry, boolean listed) {
sendPacket(new ClientboundPlayerInfoUpdatePacket(updateListed, new ClientboundPlayerInfoUpdatePacket.Entry(
entry, null, listed, 0, null, null, false, 0, null
)));
}
@Override
public void updateListOrder(@NonNull UUID entry, int listOrder) {
sendPacket(new ClientboundPlayerInfoUpdatePacket(updateListOrder, new ClientboundPlayerInfoUpdatePacket.Entry(
entry, null, false, 0, null, null, false, listOrder, null
)));
}
@Override
public void updateHat(@NonNull UUID entry, boolean showHat) {
sendPacket(new ClientboundPlayerInfoUpdatePacket(updateHat, new ClientboundPlayerInfoUpdatePacket.Entry(
entry, null, false, 0, null, null, showHat, 0, null
)));
}
@Override
public void addEntry(@NonNull UUID id, @NonNull String name, @Nullable Skin skin, boolean listed, int latency,
int gameMode, @Nullable Component displayName, int listOrder, boolean showHat) {
sendPacket(new ClientboundPlayerInfoUpdatePacket(addPlayer, new ClientboundPlayerInfoUpdatePacket.Entry(
id, createProfile(id, name, skin), listed, latency, GameType.byId(gameMode), displayName, showHat, listOrder, null
)));
}
@Override
public void setPlayerListHeaderFooter(@NonNull TabComponent header, @NonNull TabComponent footer) {
sendPacket(new ClientboundTabListPacket(header.convert(), footer.convert()));
}
@Override
@SneakyThrows
public void onPacketSend(@NonNull Object packet) {
if (packet instanceof ClientboundPlayerInfoUpdatePacket info) {
EnumSet<ClientboundPlayerInfoUpdatePacket.Action> actions = info.actions();
List<ClientboundPlayerInfoUpdatePacket.Entry> updatedList = new ArrayList<>();
boolean rewritePacket = false;
for (ClientboundPlayerInfoUpdatePacket.Entry nmsData : info.entries()) {
boolean rewriteEntry = false;
Component displayName = nmsData.displayName();
int latency = nmsData.latency();
if (actions.contains(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME)) {
Component expectedDisplayName = getExpectedDisplayNames().get(nmsData.profileId());
if (expectedDisplayName != null) {
displayName = expectedDisplayName;
rewriteEntry = rewritePacket = true;
}
}
if (actions.contains(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LATENCY)) {
int newLatency = TAB.getInstance().getFeatureManager().onLatencyChange(player, nmsData.profileId(), latency);
if (newLatency != latency) {
latency = newLatency;
rewriteEntry = rewritePacket = true;
}
}
if (actions.contains(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER)) {
TAB.getInstance().getFeatureManager().onEntryAdd(player, nmsData.profileId(), nmsData.profile().getName());
}
updatedList.add(rewriteEntry ? new ClientboundPlayerInfoUpdatePacket.Entry(
nmsData.profileId(), nmsData.profile(), nmsData.listed(), latency, nmsData.gameMode(), displayName,
nmsData.showHat(), nmsData.listOrder(), nmsData.chatSession()
) : nmsData);
}
if (rewritePacket) entries.set(info, updatedList);
}
}
@Override
@Nullable
public Skin getSkin() {
Collection<Property> col = ((CraftPlayer)player.getPlayer()).getProfile().getProperties().get(TEXTURES_PROPERTY);
if (col.isEmpty()) return null; //offline mode
Property property = col.iterator().next();
return new TabList.Skin(property.value(), property.signature());
}
@NotNull
private GameProfile createProfile(@NotNull UUID id, @NotNull String name, @Nullable Skin skin) {
GameProfile profile = new GameProfile(id, name);
if (skin != null) {
profile.getProperties().put(TabList.TEXTURES_PROPERTY,
new Property(TabList.TEXTURES_PROPERTY, skin.getValue(), skin.getSignature()));
}
return profile;
}
private void sendPacket(@NotNull Packet<?> packet) {
((CraftPlayer)player.getPlayer()).getHandle().connection.sendPacket(packet);
}
}
@@ -4,32 +4,19 @@ import io.netty.channel.Channel;
import lombok.Setter;
import lombok.SneakyThrows;
import me.neznamy.tab.platforms.bukkit.nms.BukkitReflection;
import me.neznamy.tab.shared.ProtocolVersion;
import me.neznamy.tab.shared.features.injection.NettyPipelineInjector;
import me.neznamy.tab.shared.platform.TabPlayer;
import me.neznamy.tab.shared.util.function.FunctionWithException;
import me.neznamy.tab.shared.util.ReflectionUtils;
import me.neznamy.tab.shared.util.function.FunctionWithException;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Field;
import java.util.EnumSet;
/**
* Pipeline injection for Bukkit 1.8+.
*/
public class BukkitPipelineInjector extends NettyPipelineInjector {
/** Versions supported by paper module that uses direct mojang-mapped NMS for latest MC version */
private static final EnumSet<ProtocolVersion> paperNativeVersions = EnumSet.of(
ProtocolVersion.V1_20_5,
ProtocolVersion.V1_20_6,
ProtocolVersion.V1_21,
ProtocolVersion.V1_21_1,
ProtocolVersion.V1_21_2,
ProtocolVersion.V1_21_3,
ProtocolVersion.V1_21_4
);
/** Function for getting player's channel */
@Setter
private static FunctionWithException<BukkitTabPlayer, Channel> getChannel;
@@ -43,18 +30,10 @@ public class BukkitPipelineInjector extends NettyPipelineInjector {
/**
* Attempts to load required classes, fields and methods and marks class as available.
* If something fails, error message is printed and class is not marked as available.
*
* @param serverVersion
* Server version
* If something fails, an error message is printed and class is not marked as available.
*/
@SuppressWarnings("unchecked")
public static void tryLoad(@NotNull ProtocolVersion serverVersion) {
public static void tryLoad() {
try {
if (ReflectionUtils.classExists("org.bukkit.craftbukkit.CraftServer") && paperNativeVersions.contains(serverVersion)) {
getChannel = (FunctionWithException<BukkitTabPlayer, Channel>) Class.forName("me.neznamy.tab.platforms.paper.PaperLoader").getDeclaredField("getChannel").get(null);
return;
}
Class<?> NetworkManager = BukkitReflection.getClass("network.Connection", "network.NetworkManager", "NetworkManager");
Class<?> PlayerConnection = BukkitReflection.getClass("server.network.ServerGamePacketListenerImpl",
"server.network.PlayerConnection", "PlayerConnection");
@@ -3,7 +3,7 @@ package me.neznamy.tab.platforms.bukkit;
import me.neznamy.tab.platforms.bukkit.platform.BukkitPlatform;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.TabConstants;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.TabPlayer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@@ -8,7 +8,7 @@ import me.neznamy.tab.platforms.bukkit.nms.PingRetriever;
import me.neznamy.tab.platforms.bukkit.platform.BukkitPlatform;
import me.neznamy.tab.platforms.bukkit.tablist.TabListBase;
import me.neznamy.tab.shared.backend.BackendTabPlayer;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.TabList;
import org.bukkit.entity.Player;
import org.bukkit.metadata.MetadataValue;
@@ -1,9 +1,9 @@
package me.neznamy.tab.platforms.bukkit.bossbar;
import lombok.RequiredArgsConstructor;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.api.bossbar.BarColor;
import me.neznamy.tab.api.bossbar.BarStyle;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.tab.platforms.bukkit.BukkitTabPlayer;
import me.neznamy.tab.shared.platform.decorators.SafeBossBar;
import org.bukkit.Bukkit;
@@ -8,7 +8,7 @@ import lombok.RequiredArgsConstructor;
import me.neznamy.tab.api.bossbar.BarColor;
import me.neznamy.tab.api.bossbar.BarStyle;
import me.neznamy.tab.platforms.bukkit.BukkitTabPlayer;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.decorators.SafeBossBar;
import org.jetbrains.annotations.NotNull;
@@ -2,7 +2,7 @@ package me.neznamy.tab.platforms.bukkit.header;
import lombok.Getter;
import me.neznamy.tab.platforms.bukkit.BukkitTabPlayer;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.util.ReflectionUtils;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@@ -3,7 +3,7 @@ package me.neznamy.tab.platforms.bukkit.header;
import lombok.Getter;
import me.neznamy.tab.platforms.bukkit.BukkitTabPlayer;
import me.neznamy.tab.platforms.bukkit.BukkitUtils;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -5,7 +5,7 @@ import me.neznamy.tab.platforms.bukkit.BukkitTabPlayer;
import me.neznamy.tab.platforms.bukkit.nms.BukkitReflection;
import me.neznamy.tab.platforms.bukkit.nms.converter.ComponentConverter;
import me.neznamy.tab.platforms.bukkit.nms.PacketSender;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.util.function.BiFunctionWithException;
import me.neznamy.tab.shared.util.ReflectionUtils;
import org.jetbrains.annotations.NotNull;
@@ -2,7 +2,7 @@ package me.neznamy.tab.platforms.bukkit.header;
import lombok.Getter;
import me.neznamy.tab.platforms.bukkit.BukkitTabPlayer;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.util.ReflectionUtils;
import net.kyori.adventure.text.Component;
import org.bukkit.entity.Player;
@@ -1,24 +1,20 @@
package me.neznamy.tab.platforms.bukkit.nms.converter;
import me.neznamy.chat.ChatModifier;
import me.neznamy.chat.component.KeybindComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.chat.component.TextComponent;
import me.neznamy.chat.component.TranslatableComponent;
import me.neznamy.tab.platforms.bukkit.BukkitUtils;
import me.neznamy.tab.shared.ProtocolVersion;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.tab.shared.util.ReflectionUtils;
import me.neznamy.tab.platforms.bukkit.nms.BukkitReflection;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.EnumSet;
/**
* Interface for converting TAB components into NMS components (1.7+).
*/
public abstract class ComponentConverter {
/** Versions supported by paper module that uses direct mojang-mapped NMS */
private static final EnumSet<ProtocolVersion> paperNativeVersions = EnumSet.of(
ProtocolVersion.V1_21_4
);
/** Instance of this class */
@Nullable
public static ComponentConverter INSTANCE;
@@ -31,20 +27,94 @@ public abstract class ComponentConverter {
* @return Converted component
*/
@NotNull
public abstract Object convert(@NotNull TabComponent component);
public Object convert(@NotNull TabComponent component) {
// Component type
Object nmsComponent;
if (component instanceof TextComponent) {
nmsComponent = newTextComponent(((TextComponent) component).getText());
} else if (component instanceof TranslatableComponent) {
nmsComponent = newTranslatableComponent(((TranslatableComponent) component).getKey());
} else if (component instanceof KeybindComponent) {
nmsComponent = newKeybindComponent(((KeybindComponent)component).getKeybind());
} else {
throw new IllegalArgumentException("Unexpected component type: " + component.getClass().getName());
}
// Component style
applyStyle(nmsComponent, component.getModifier());
// Extra
for (TabComponent extra : component.getExtra()) {
addSibling(nmsComponent, convert(extra));
}
return nmsComponent;
}
/**
* Creates a new text component with given text.
*
* @param text
* Text to display
* @return Text component with given text
*/
@NotNull
public abstract Object newTextComponent(@NotNull String text);
/**
* Creates a new translatable component with the given key.
*
* @param key
* Key to translate
* @return Translatable component with the given key
*/
@NotNull
public abstract Object newTranslatableComponent(@NotNull String key);
/**
* Creates a new keybind component with given keybind.
*
* @param keybind
* Keybind to show
* @return Keybind component with given keybind
*/
@NotNull
public abstract Object newKeybindComponent(@NotNull String keybind);
/**
* Converts given chat modifier to minecraft style and applies it to the component.
*
* @param nmsComponent
* Component to apply style to
* @param style
* Style to convert and apply
*/
public abstract void applyStyle(@NotNull Object nmsComponent, @NotNull ChatModifier style);
/**
* Appends child to the given parent component.
*
* @param parent
* Parent to append the child to
* @param child
* Child component to append
*/
public abstract void addSibling(@NotNull Object parent, @NotNull Object child);
/**
* Attempts to load component converter.
*
* @param serverVersion
* Server version
*/
public static void tryLoad(@NotNull ProtocolVersion serverVersion) {
public static void tryLoad() {
try {
if (ReflectionUtils.classExists("org.bukkit.craftbukkit.CraftServer") && paperNativeVersions.contains(serverVersion)) {
INSTANCE = (ComponentConverter) Class.forName("me.neznamy.tab.platforms.paper.PaperComponentConverter").getConstructor().newInstance();
if (BukkitReflection.getMinorVersion() >= 19) {
// 1.19+
INSTANCE = new ModernComponentConverter();
} else if (BukkitReflection.getMinorVersion() >= 16) {
// 1.16 - 1.18.2
INSTANCE = new ModerateComponentConverter();
} else {
INSTANCE = new ReflectionComponentConverter();
// 1.7 - 1.15.2
INSTANCE = new LegacyComponentConverter();
}
} catch (Exception e) {
if (BukkitUtils.PRINT_EXCEPTIONS) {
@@ -0,0 +1,91 @@
package me.neznamy.tab.platforms.bukkit.nms.converter;
import lombok.SneakyThrows;
import me.neznamy.chat.ChatModifier;
import me.neznamy.tab.platforms.bukkit.nms.BukkitReflection;
import me.neznamy.tab.shared.util.ReflectionUtils;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
/**
* Class for converting TAB components into NMS components for versions 1.7 - 1.15.2.
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public class LegacyComponentConverter extends ComponentConverter {
private final Class<?> IChatBaseComponent = BukkitReflection.getClass("IChatBaseComponent");
private final Constructor<?> newTextComponent = BukkitReflection.getClass("ChatComponentText").getConstructor(String.class);
private final Constructor<?> newTranslatableComponent = BukkitReflection.getClass("ChatMessage").getConstructor(String.class, Object[].class);
private Constructor<?> newKeybindComponent;
private final Class<?> ChatModifierClass = BukkitReflection.getClass("ChatModifier");
private final Constructor<?> newChatModifier = ChatModifierClass.getConstructor();
private final Class<Enum> EnumChatFormat = (Class<Enum>) BukkitReflection.getClass("ChatFormatting", "EnumChatFormat");
private final Class<?> ChatBaseComponent = BukkitReflection.getClass("ChatBaseComponent");
private final Method ChatBaseComponent_addSibling = ReflectionUtils.getOnlyMethod(ChatBaseComponent, IChatBaseComponent, IChatBaseComponent);
private final Field Component_modifier = ReflectionUtils.getOnlyField(ChatBaseComponent, ChatModifierClass);
private final List<Field> magicCodes = ReflectionUtils.getFields(ChatModifierClass, Boolean.class);
private final Method ChatModifier_setColor = ReflectionUtils.getOnlyMethod(ChatModifierClass, ChatModifierClass, EnumChatFormat);
/**
* Constructs new instance and loads all NMS classes, constructors, and methods.
*
* @throws ReflectiveOperationException
* If something failed
*/
public LegacyComponentConverter() throws ReflectiveOperationException {
if (BukkitReflection.getMinorVersion() >= 12) {
newKeybindComponent = BukkitReflection.getClass("ChatComponentKeybind").getConstructor(String.class);
}
}
@Override
@NotNull
@SneakyThrows
public Object newTextComponent(@NotNull String text) {
return newTextComponent.newInstance(text);
}
@Override
@NotNull
@SneakyThrows
public Object newTranslatableComponent(@NotNull String key) {
return newTranslatableComponent.newInstance(key, new Object[0]);
}
@Override
@NotNull
@SneakyThrows
public Object newKeybindComponent(@NotNull String keybind) {
if (BukkitReflection.getMinorVersion() >= 12) {
return newKeybindComponent.newInstance(keybind);
}
throw new UnsupportedOperationException("Keybind components were added in 1.12");
}
@Override
@SneakyThrows
public void applyStyle(@NotNull Object nmsComponent, @NotNull ChatModifier style) {
Object nmsModifier = newChatModifier.newInstance();
if (style.getColor() != null) {
ChatModifier_setColor.invoke(nmsModifier, Enum.valueOf(EnumChatFormat, style.getColor().getLegacyColor().name()));
}
magicCodes.get(0).set(nmsModifier, style.getBold());
magicCodes.get(1).set(nmsModifier, style.getItalic());
magicCodes.get(2).set(nmsModifier, style.getStrikethrough());
magicCodes.get(3).set(nmsModifier, style.getUnderlined());
magicCodes.get(4).set(nmsModifier, style.getObfuscated());
Component_modifier.set(nmsComponent, nmsModifier);
}
@Override
@SneakyThrows
public void addSibling(@NotNull Object parent, @NotNull Object child) {
ChatBaseComponent_addSibling.invoke(parent, child);
}
}
@@ -0,0 +1,94 @@
package me.neznamy.tab.platforms.bukkit.nms.converter;
import lombok.SneakyThrows;
import me.neznamy.chat.ChatModifier;
import me.neznamy.tab.platforms.bukkit.nms.BukkitReflection;
import me.neznamy.tab.shared.util.ReflectionUtils;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* Class for converting TAB components into NMS components for versions 1.16 - 1.18.2.
*/
public class ModerateComponentConverter extends ComponentConverter {
private final Class<?> IChatBaseComponent = BukkitReflection.getClass("network.chat.Component", "network.chat.IChatBaseComponent", "IChatBaseComponent");
private final Class<?> ChatBaseComponent = BukkitReflection.getClass("network.chat.BaseComponent", "network.chat.ChatBaseComponent", "ChatBaseComponent");
private final Class<?> TextColor = BukkitReflection.getClass("network.chat.TextColor", "network.chat.ChatHexColor", "ChatHexColor");
private final Class<?> ResourceLocation = BukkitReflection.getClass("resources.ResourceLocation", "resources.MinecraftKey", "MinecraftKey");
private final Constructor<?> newTextComponent = BukkitReflection.getClass("network.chat.TextComponent", "network.chat.ChatComponentText", "ChatComponentText").getConstructor(String.class);
private final Constructor<?> newTranslatableComponent = BukkitReflection.getClass("network.chat.TranslatableComponent", "network.chat.ChatMessage", "ChatMessage").getConstructor(String.class, Object[].class);
private final Constructor<?> newKeybindComponent = BukkitReflection.getClass("network.chat.KeybindComponent", "network.chat.ChatComponentKeybind", "ChatComponentKeybind").getConstructor(String.class);
private final Class<?> ChatModifierClass = BukkitReflection.getClass("network.chat.Style", "network.chat.ChatModifier", "ChatModifier");
private final Constructor<?> newChatModifier = ReflectionUtils.setAccessible(ChatModifierClass.getDeclaredConstructor(
TextColor,
Boolean.class, Boolean.class, Boolean.class, Boolean.class, Boolean.class,
BukkitReflection.getClass("network.chat.ClickEvent", "network.chat.ChatClickable", "ChatClickable"),
BukkitReflection.getClass("network.chat.HoverEvent", "network.chat.ChatHoverable", "ChatHoverable"),
String.class,
ResourceLocation
));
private final Method ChatBaseComponent_addSibling = ReflectionUtils.getOnlyMethod(ChatBaseComponent, IChatBaseComponent, IChatBaseComponent);
private final Field Component_modifier = ReflectionUtils.getOnlyField(ChatBaseComponent, ChatModifierClass);
private final Method ChatHexColor_fromRGB = ReflectionUtils.getMethods(TextColor, TextColor, int.class).get(0); // There should only be 1, but some mods add more
private final Method ResourceLocation_tryParse = ReflectionUtils.getMethod(ResourceLocation, new String[]{"tryParse", "m_135820_", "a"}, String.class);
/**
* Constructs new instance and loads all NMS classes, constructors, and methods.
*
* @throws ReflectiveOperationException
* If something failed
*/
public ModerateComponentConverter() throws ReflectiveOperationException {
}
@Override
@NotNull
@SneakyThrows
public Object newTextComponent(@NotNull String text) {
return newTextComponent.newInstance(text);
}
@Override
@NotNull
@SneakyThrows
public Object newTranslatableComponent(@NotNull String key) {
return newTranslatableComponent.newInstance(key, new Object[0]);
}
@Override
@NotNull
@SneakyThrows
public Object newKeybindComponent(@NotNull String keybind) {
return newKeybindComponent.newInstance(keybind);
}
@Override
@SneakyThrows
public void applyStyle(@NotNull Object nmsComponent, @NotNull ChatModifier style) {
Component_modifier.set(nmsComponent, newChatModifier.newInstance(
style.getColor() == null ? null : ChatHexColor_fromRGB.invoke(null, style.getColor().getRgb()),
style.getBold(),
style.getItalic(),
style.getUnderlined(),
style.getStrikethrough(),
style.getObfuscated(),
null,
null,
null,
style.getFont() == null ? null : ResourceLocation_tryParse.invoke(null, style.getFont())
));
}
@Override
@SneakyThrows
public void addSibling(@NotNull Object parent, @NotNull Object child) {
ChatBaseComponent_addSibling.invoke(parent, child);
}
}
@@ -0,0 +1,114 @@
package me.neznamy.tab.platforms.bukkit.nms.converter;
import lombok.SneakyThrows;
import me.neznamy.chat.ChatModifier;
import me.neznamy.tab.platforms.bukkit.nms.BukkitReflection;
import me.neznamy.tab.shared.util.ReflectionUtils;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* Class for converting TAB components into NMS components for versions 1.19 and up.
*/
public class ModernComponentConverter extends ComponentConverter {
private final Class<?> IChatBaseComponent = BukkitReflection.getClass("network.chat.Component", "network.chat.IChatBaseComponent");
private final Class<?> IChatMutableComponent = BukkitReflection.getClass("network.chat.MutableComponent", "network.chat.IChatMutableComponent");
private final Class<?> TextColor = BukkitReflection.getClass("network.chat.TextColor", "network.chat.ChatHexColor");
private final Class<?> ResourceLocation = BukkitReflection.getClass("resources.ResourceLocation", "resources.MinecraftKey");
private final Method newTextComponent = ReflectionUtils.getMethod(IChatBaseComponent, new String[] {"b", "literal"}, String.class);
private final Method newTranslatableComponent = ReflectionUtils.getMethod(IChatBaseComponent, new String[] {"c", "translatable"}, String.class);
private final Method newKeybindComponent = ReflectionUtils.getMethod(IChatBaseComponent, new String[] {"d", "keybind"}, String.class);
private final Class<?> ChatModifierClass = BukkitReflection.getClass("network.chat.Style", "network.chat.ChatModifier");
private final Constructor<?> newChatModifier;
private final Method ChatBaseComponent_addSibling = ReflectionUtils.getOnlyMethod(IChatMutableComponent, IChatMutableComponent, IChatBaseComponent);
private final Field Component_modifier = ReflectionUtils.getOnlyField(IChatMutableComponent, ChatModifierClass);
private final Method ChatHexColor_fromRGB = ReflectionUtils.getMethods(TextColor, TextColor, int.class).get(0); // There should only be 1, but some mods add more
private final Method ResourceLocation_tryParse = ReflectionUtils.getMethod(ResourceLocation, new String[]{"tryParse", "m_135820_", "a"}, String.class);
/**
* Constructs new instance and loads all NMS classes, constructors, and methods.
*
* @throws ReflectiveOperationException
* If something failed
*/
public ModernComponentConverter() throws ReflectiveOperationException {
Class<?> chatClickable = BukkitReflection.getClass("network.chat.ClickEvent", "network.chat.ChatClickable");
Class<?> chatHoverable = BukkitReflection.getClass("network.chat.HoverEvent", "network.chat.ChatHoverable");
if (BukkitReflection.is1_21_4Plus()) {
// 1.21.4+
newChatModifier = ReflectionUtils.setAccessible(ChatModifierClass.getDeclaredConstructor(TextColor, Integer.class, Boolean.class, Boolean.class,
Boolean.class, Boolean.class, Boolean.class, chatClickable, chatHoverable, String.class, ResourceLocation));
} else {
// 1.21.3-
newChatModifier = ReflectionUtils.setAccessible(ChatModifierClass.getDeclaredConstructor(TextColor, Boolean.class, Boolean.class, Boolean.class,
Boolean.class, Boolean.class, chatClickable, chatHoverable, String.class, ResourceLocation));
}
}
@Override
@NotNull
@SneakyThrows
public Object newTextComponent(@NotNull String text) {
return newTextComponent.invoke(null, text);
}
@Override
@NotNull
@SneakyThrows
public Object newTranslatableComponent(@NotNull String key) {
return newTranslatableComponent.invoke(null, key);
}
@Override
@NotNull
@SneakyThrows
public Object newKeybindComponent(@NotNull String keybind) {
return newKeybindComponent.invoke(null, keybind);
}
@Override
@SneakyThrows
public void applyStyle(@NotNull Object nmsComponent, @NotNull ChatModifier style) {
if (BukkitReflection.is1_21_4Plus()) {
Component_modifier.set(nmsComponent, newChatModifier.newInstance(
style.getColor() == null ? null : ChatHexColor_fromRGB.invoke(null, style.getColor().getRgb()),
style.getShadowColor(),
style.getBold(),
style.getItalic(),
style.getUnderlined(),
style.getStrikethrough(),
style.getObfuscated(),
null,
null,
null,
style.getFont() == null ? null : ResourceLocation_tryParse.invoke(null, style.getFont())
));
} else {
Component_modifier.set(nmsComponent, newChatModifier.newInstance(
style.getColor() == null ? null : ChatHexColor_fromRGB.invoke(null, style.getColor().getRgb()),
style.getBold(),
style.getItalic(),
style.getUnderlined(),
style.getStrikethrough(),
style.getObfuscated(),
null,
null,
null,
style.getFont() == null ? null : ResourceLocation_tryParse.invoke(null, style.getFont())
));
}
}
@Override
@SneakyThrows
public void addSibling(@NotNull Object parent, @NotNull Object child) {
ChatBaseComponent_addSibling.invoke(parent, child);
}
}
@@ -1,171 +0,0 @@
package me.neznamy.tab.platforms.bukkit.nms.converter;
import lombok.SneakyThrows;
import me.neznamy.tab.platforms.bukkit.nms.BukkitReflection;
import me.neznamy.tab.shared.chat.ChatModifier;
import me.neznamy.tab.shared.chat.component.KeybindComponent;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.tab.shared.chat.component.TextComponent;
import me.neznamy.tab.shared.chat.component.TranslatableComponent;
import me.neznamy.tab.shared.util.ReflectionUtils;
import me.neznamy.tab.shared.util.function.FunctionWithException;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
/**
* Class for converting TAB components into NMS components (1.7+).
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public class ReflectionComponentConverter extends ComponentConverter {
private final FunctionWithException<String, Object> newTextComponent;
private final FunctionWithException<String, Object> newTranslatableComponent;
private final FunctionWithException<String, Object> newKeybindComponent;
private final Class<?> ChatModifier = BukkitReflection.getClass("network.chat.Style", "network.chat.ChatModifier", "ChatModifier");
private final Class<Enum> EnumChatFormat = (Class<Enum>) BukkitReflection.getClass("ChatFormatting", "EnumChatFormat");
private final Constructor<?> newChatModifier;
private final Method ChatBaseComponent_addSibling;
private final Field Component_modifier;
private final List<Field> magicCodes = ReflectionUtils.getFields(ChatModifier, Boolean.class);
// 1.15-
private Method ChatModifier_setColor;
// 1.16+
private Method ChatHexColor_fromRGB;
private Method ResourceLocation_tryParse;
/**
* Constructs new instance and loads all NMS classes, constructors, and methods.
*
* @throws ReflectiveOperationException
* If something failed
*/
public ReflectionComponentConverter() throws ReflectiveOperationException {
Class<?> IChatBaseComponent = BukkitReflection.getClass("network.chat.Component", "network.chat.IChatBaseComponent", "IChatBaseComponent");
if (BukkitReflection.getMinorVersion() >= 19) {
Method IChatBaseComponent_b = ReflectionUtils.getMethod(IChatBaseComponent, new String[] {"b", "literal"}, String.class);
newTextComponent = text -> IChatBaseComponent_b.invoke(null, text);
Method IChatBaseComponent_c = ReflectionUtils.getMethod(IChatBaseComponent, new String[] {"c", "translatable"}, String.class);
newTranslatableComponent = text -> IChatBaseComponent_c.invoke(null, text);
Method IChatBaseComponent_d = ReflectionUtils.getMethod(IChatBaseComponent, new String[] {"d", "keybind"}, String.class);
newKeybindComponent = text -> IChatBaseComponent_d.invoke(null, text);
Class<?> IChatMutableComponent = BukkitReflection.getClass("network.chat.MutableComponent", "network.chat.IChatMutableComponent", "IChatMutableComponent");
Component_modifier = ReflectionUtils.getOnlyField(IChatMutableComponent, ChatModifier);
ChatBaseComponent_addSibling = ReflectionUtils.getOnlyMethod(IChatMutableComponent, IChatMutableComponent, IChatBaseComponent);
} else {
Class<?> ChatComponentText = BukkitReflection.getClass("network.chat.TextComponent", "network.chat.ChatComponentText", "ChatComponentText");
Constructor<?> newChatComponentText = ChatComponentText.getConstructor(String.class);
newTextComponent = newChatComponentText::newInstance;
Class<?> ChatMessage = BukkitReflection.getClass("network.chat.TranslatableComponent", "network.chat.ChatMessage", "ChatMessage");
Constructor<?> newChatMessage = ChatMessage.getConstructor(String.class, Object[].class);
newTranslatableComponent = text -> newChatMessage.newInstance(text, new Object[0]);
newKeybindComponent = text -> {
throw new UnsupportedOperationException("Keybind component conversion is not implemented on < 1.19");
};
Class<?> ChatBaseComponent = BukkitReflection.getClass("network.chat.BaseComponent", "network.chat.ChatBaseComponent", "ChatBaseComponent");
Component_modifier = ReflectionUtils.getOnlyField(ChatBaseComponent, ChatModifier);
ChatBaseComponent_addSibling = ReflectionUtils.getOnlyMethod(ChatBaseComponent, IChatBaseComponent, IChatBaseComponent);
}
if (BukkitReflection.getMinorVersion() >= 16) {
Class<?> chatHexColor = BukkitReflection.getClass("network.chat.TextColor", "network.chat.ChatHexColor", "ChatHexColor");
Class<?> ResourceLocation = BukkitReflection.getClass("resources.ResourceLocation", "resources.MinecraftKey", "MinecraftKey");
Class<?> chatClickable = BukkitReflection.getClass("network.chat.ClickEvent", "network.chat.ChatClickable", "ChatClickable");
Class<?> chatHoverable = BukkitReflection.getClass("network.chat.HoverEvent", "network.chat.ChatHoverable", "ChatHoverable");
ResourceLocation_tryParse = ReflectionUtils.getMethod(ResourceLocation, new String[]{"tryParse", "m_135820_", "a"}, String.class);
ChatHexColor_fromRGB = ReflectionUtils.getMethods(chatHexColor, chatHexColor, int.class).get(0); // There should only be 1, but some mods add more
if (BukkitReflection.is1_21_4Plus()) {
// 1.21.4+
newChatModifier = ReflectionUtils.setAccessible(ChatModifier.getDeclaredConstructor(chatHexColor, Integer.class, Boolean.class, Boolean.class,
Boolean.class, Boolean.class, Boolean.class, chatClickable, chatHoverable, String.class, ResourceLocation));
} else {
// 1.21.3-
newChatModifier = ReflectionUtils.setAccessible(ChatModifier.getDeclaredConstructor(chatHexColor, Boolean.class, Boolean.class, Boolean.class,
Boolean.class, Boolean.class, chatClickable, chatHoverable, String.class, ResourceLocation));
}
} else {
newChatModifier = ChatModifier.getConstructor();
ChatModifier_setColor = ReflectionUtils.getOnlyMethod(ChatModifier, ChatModifier, EnumChatFormat);
}
}
@Override
@SneakyThrows
@NotNull
public Object convert(@NotNull TabComponent component) {
// Component type
Object nmsComponent;
if (component instanceof TextComponent) {
nmsComponent = newTextComponent.apply(((TextComponent) component).getText());
} else if (component instanceof TranslatableComponent) {
nmsComponent = newTranslatableComponent.apply(((TranslatableComponent) component).getKey());
} else if (component instanceof KeybindComponent) {
nmsComponent = newKeybindComponent.apply(((KeybindComponent) component).getKeybind());
} else {
throw new IllegalStateException("Unexpected component type: " + component.getClass().getName());
}
// Component style
Component_modifier.set(nmsComponent, convertStyle(component.getModifier()));
// Extra
for (TabComponent extra : component.getExtra()) {
ChatBaseComponent_addSibling.invoke(nmsComponent, convert(extra));
}
return nmsComponent;
}
@SneakyThrows
private Object convertStyle(@NotNull ChatModifier modifier) {
if (BukkitReflection.is1_21_4Plus()) {
return newChatModifier.newInstance(
modifier.getColor() == null ? null : ChatHexColor_fromRGB.invoke(null, modifier.getColor().getRgb()),
modifier.getShadowColor(),
modifier.getBold(),
modifier.getItalic(),
modifier.getItalic(),
modifier.getUnderlined(),
modifier.getObfuscated(),
null,
null,
null,
modifier.getFont() == null ? null : ResourceLocation_tryParse.invoke(null, modifier.getFont())
);
} else if (BukkitReflection.getMinorVersion() >= 16) {
return newChatModifier.newInstance(
modifier.getColor() == null ? null : ChatHexColor_fromRGB.invoke(null, modifier.getColor().getRgb()),
modifier.getBold(),
modifier.getItalic(),
modifier.getItalic(),
modifier.getUnderlined(),
modifier.getObfuscated(),
null,
null,
null,
modifier.getFont() == null ? null : ResourceLocation_tryParse.invoke(null, modifier.getFont())
);
} else {
Object nmsModifier = newChatModifier.newInstance();
if (modifier.getColor() != null) {
ChatModifier_setColor.invoke(nmsModifier, Enum.valueOf(EnumChatFormat, modifier.getColor().getLegacyColor().name()));
}
magicCodes.get(0).set(nmsModifier, modifier.getBold());
magicCodes.get(1).set(nmsModifier, modifier.getItalic());
magicCodes.get(2).set(nmsModifier, modifier.getStrikethrough());
magicCodes.get(3).set(nmsModifier, modifier.getUnderlined());
magicCodes.get(4).set(nmsModifier, modifier.getObfuscated());
return nmsModifier;
}
}
}
@@ -3,6 +3,7 @@ package me.neznamy.tab.platforms.bukkit.platform;
import lombok.Getter;
import lombok.SneakyThrows;
import me.clip.placeholderapi.PlaceholderAPI;
import me.neznamy.chat.component.*;
import me.neznamy.tab.platforms.bukkit.*;
import me.neznamy.tab.platforms.bukkit.bossbar.BukkitBossBar;
import me.neznamy.tab.platforms.bukkit.bossbar.ViaBossBar;
@@ -20,7 +21,6 @@ import me.neznamy.tab.shared.ProtocolVersion;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.TabConstants;
import me.neznamy.tab.shared.backend.BackendPlatform;
import me.neznamy.tab.shared.chat.component.*;
import me.neznamy.tab.shared.features.PerWorldPlayerListConfiguration;
import me.neznamy.tab.shared.features.PlaceholderManagerImpl;
import me.neznamy.tab.shared.features.injection.PipelineInjector;
@@ -98,12 +98,12 @@ public class BukkitPlatform implements BackendPlatform {
new BukkitPremiumVanishHook().register();
}
PingRetriever.tryLoad();
ComponentConverter.tryLoad(serverVersion);
ScoreboardLoader.findInstance(serverVersion);
TabListBase.findInstance(serverVersion);
ComponentConverter.tryLoad();
ScoreboardLoader.findInstance();
TabListBase.findInstance();
if (BukkitReflection.getMinorVersion() >= 8) {
HeaderFooter.findInstance();
BukkitPipelineInjector.tryLoad(serverVersion);
BukkitPipelineInjector.tryLoad();
}
BukkitUtils.sendCompatibilityMessage();
Bukkit.getConsoleSender().sendMessage("[TAB] §7Loaded NMS hook in " + (System.currentTimeMillis()-time) + "ms");
@@ -5,7 +5,7 @@ import me.clip.placeholderapi.PlaceholderAPI;
import me.neznamy.tab.platforms.bukkit.features.PerWorldPlayerList;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.TabConstants;
import me.neznamy.tab.shared.chat.component.SimpleTextComponent;
import me.neznamy.chat.component.SimpleTextComponent;
import me.neznamy.tab.shared.cpu.TimedCaughtTask;
import me.neznamy.tab.shared.placeholders.types.PlayerPlaceholderImpl;
import me.neznamy.tab.shared.platform.TabPlayer;
@@ -7,7 +7,7 @@ import me.neznamy.tab.platforms.bukkit.BukkitTabPlayer;
import me.neznamy.tab.platforms.bukkit.nms.BukkitReflection;
import me.neznamy.tab.shared.Limitations;
import me.neznamy.tab.shared.ProtocolVersion;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.decorators.SafeScoreboard;
import me.neznamy.tab.shared.util.ReflectionUtils;
import org.bukkit.Bukkit;
@@ -4,7 +4,7 @@ import lombok.Getter;
import lombok.NonNull;
import lombok.SneakyThrows;
import me.neznamy.tab.platforms.bukkit.BukkitTabPlayer;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.util.ReflectionUtils;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.ComponentLike;
@@ -3,20 +3,15 @@ package me.neznamy.tab.platforms.bukkit.scoreboard;
import com.google.common.collect.Lists;
import lombok.Getter;
import lombok.Setter;
import lombok.SneakyThrows;
import me.neznamy.tab.platforms.bukkit.BukkitTabPlayer;
import me.neznamy.tab.platforms.bukkit.BukkitUtils;
import me.neznamy.tab.platforms.bukkit.nms.BukkitReflection;
import me.neznamy.tab.platforms.bukkit.scoreboard.packet.PacketScoreboard;
import me.neznamy.tab.shared.ProtocolVersion;
import me.neznamy.tab.shared.platform.Scoreboard;
import me.neznamy.tab.shared.platform.impl.DummyScoreboard;
import me.neznamy.tab.shared.util.function.FunctionWithException;
import me.neznamy.tab.shared.util.ReflectionUtils;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Constructor;
import java.util.EnumSet;
import java.util.List;
/**
@@ -24,17 +19,6 @@ import java.util.List;
*/
public class ScoreboardLoader {
/** Versions supported by paper module that uses direct mojang-mapped NMS for latest MC version */
private static final EnumSet<ProtocolVersion> paperNativeVersions = EnumSet.of(
ProtocolVersion.V1_20_5,
ProtocolVersion.V1_20_6,
ProtocolVersion.V1_21,
ProtocolVersion.V1_21_1,
ProtocolVersion.V1_21_2,
ProtocolVersion.V1_21_3,
ProtocolVersion.V1_21_4
);
/** Instance function */
@Getter
@Setter
@@ -43,16 +27,9 @@ public class ScoreboardLoader {
/**
* Finds the best available instance for current server software.
*
* @param serverVersion
* Server version
*/
@SneakyThrows
public static void findInstance(@NotNull ProtocolVersion serverVersion) {
if (ReflectionUtils.classExists("org.bukkit.craftbukkit.CraftServer") && paperNativeVersions.contains(serverVersion)) {
Constructor<?> constructor = Class.forName("me.neznamy.tab.platforms.paper.PaperPacketScoreboard").getConstructor(BukkitTabPlayer.class);
instance = player -> (Scoreboard) constructor.newInstance(player);
} else if (PacketScoreboard.isAvailable()) {
public static void findInstance() {
if (PacketScoreboard.isAvailable()) {
instance = PacketScoreboard::new;
} else if (PaperScoreboard.isAvailable()) {
instance = PaperScoreboard::new;
@@ -9,7 +9,7 @@ import me.neznamy.tab.platforms.bukkit.nms.converter.ComponentConverter;
import me.neznamy.tab.platforms.bukkit.nms.PacketSender;
import me.neznamy.tab.shared.Limitations;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.decorators.SafeScoreboard;
import me.neznamy.tab.shared.util.ReflectionUtils;
import org.jetbrains.annotations.NotNull;
@@ -232,6 +232,12 @@ public class PacketScoreboard extends SafeScoreboard<BukkitTabPlayer> {
@SneakyThrows
private static Object toFixedFormat(@NonNull TabComponent component) {
if (newFixedFormat == null) return null;
return component.toFixedFormat(nmsComponent -> newFixedFormat.newInstance(nmsComponent));
return component.toFixedFormat(PacketScoreboard::convertFixedFormat);
}
@NotNull
@SneakyThrows
private static Object convertFixedFormat(@NotNull Object nmsComponent) {
return newFixedFormat.newInstance(nmsComponent);
}
}
@@ -2,7 +2,7 @@ package me.neznamy.tab.platforms.bukkit.tablist;
import lombok.NonNull;
import me.neznamy.tab.platforms.bukkit.BukkitTabPlayer;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.Nullable;
@@ -6,7 +6,7 @@ import me.neznamy.tab.platforms.bukkit.BukkitTabPlayer;
import me.neznamy.tab.platforms.bukkit.nms.BukkitReflection;
import me.neznamy.tab.platforms.bukkit.nms.PacketSender;
import me.neznamy.tab.shared.Limitations;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.util.ReflectionUtils;
import me.neznamy.tab.shared.util.function.TriFunctionWithException;
import org.jetbrains.annotations.NotNull;
@@ -3,20 +3,17 @@ package me.neznamy.tab.platforms.bukkit.tablist;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.platforms.bukkit.BukkitTabPlayer;
import me.neznamy.tab.platforms.bukkit.BukkitUtils;
import me.neznamy.tab.platforms.bukkit.header.HeaderFooter;
import me.neznamy.tab.platforms.bukkit.nms.BukkitReflection;
import me.neznamy.tab.shared.ProtocolVersion;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.decorators.TrackedTabList;
import me.neznamy.tab.shared.util.function.FunctionWithException;
import me.neznamy.tab.shared.util.ReflectionUtils;
import me.neznamy.tab.shared.util.function.FunctionWithException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Constructor;
import java.util.EnumSet;
import java.util.UUID;
/**
@@ -27,11 +24,6 @@ import java.util.UUID;
*/
public abstract class TabListBase<C> extends TrackedTabList<BukkitTabPlayer, C> {
/** Versions supported by paper module that uses direct mojang-mapped NMS for latest MC version */
private static final EnumSet<ProtocolVersion> paperNativeVersions = EnumSet.of(
ProtocolVersion.V1_21_4
);
/** Instance function */
@Getter
@Setter
@@ -52,16 +44,10 @@ public abstract class TabListBase<C> extends TrackedTabList<BukkitTabPlayer, C>
/**
* Finds the best available instance for current server software.
*
* @param serverVersion
* Server version
*/
public static void findInstance(@NotNull ProtocolVersion serverVersion) {
public static void findInstance() {
try {
if (ReflectionUtils.classExists("org.bukkit.craftbukkit.CraftServer") && paperNativeVersions.contains(serverVersion)) {
Constructor<?> constructor = Class.forName("me.neznamy.tab.platforms.paper.PaperPacketTabList").getConstructor(BukkitTabPlayer.class);
instance = player -> (TabListBase<?>) constructor.newInstance(player);
} else if (ReflectionUtils.classExists("net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket")) {
if (ReflectionUtils.classExists("net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket")) {
PacketTabList1193.loadNew();
instance = PacketTabList1193::new;
} else if (BukkitReflection.getMinorVersion() >= 8) {
@@ -3,7 +3,7 @@ package me.neznamy.tab.platforms.bungeecord;
import lombok.RequiredArgsConstructor;
import me.neznamy.tab.api.bossbar.BarColor;
import me.neznamy.tab.api.bossbar.BarStyle;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.decorators.SafeBossBar;
import net.md_5.bungee.protocol.packet.BossBar;
import org.jetbrains.annotations.NotNull;
@@ -10,8 +10,8 @@ import me.neznamy.tab.platforms.bungeecord.tablist.BungeeTabList18;
import me.neznamy.tab.shared.ProtocolVersion;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.TabConstants;
import me.neznamy.tab.shared.chat.ChatModifier;
import me.neznamy.tab.shared.chat.component.*;
import me.neznamy.chat.ChatModifier;
import me.neznamy.chat.component.*;
import me.neznamy.tab.shared.features.injection.PipelineInjector;
import me.neznamy.tab.shared.features.redis.RedisSupport;
import me.neznamy.tab.shared.platform.BossBar;
@@ -5,8 +5,8 @@ import lombok.NonNull;
import me.neznamy.tab.shared.Limitations;
import me.neznamy.tab.shared.ProtocolVersion;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.chat.component.SimpleTextComponent;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.SimpleTextComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.decorators.SafeScoreboard;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.protocol.Either;
@@ -14,9 +14,11 @@ public class BungeeTAB extends Plugin {
if (ReflectionUtils.classExists("net.md_5.bungee.protocol.packet.Team$NameTagVisibility")) {
TAB.create(new BungeePlatform(this));
} else {
getLogger().warning("§c====================================================================================================");
getLogger().warning("§cThe plugin requires BungeeCord build #1899 " +
"(released on February 1st, 2025) and up (or an equivalent fork) to work. If you are using a fork that did not" +
" update to the new BungeeCord version yet, stay on TAB v5.0.5, which supports older builds.");
getLogger().warning("§c====================================================================================================");
}
}
@@ -3,7 +3,7 @@ package me.neznamy.tab.platforms.bungeecord;
import me.neznamy.tab.shared.ProtocolVersion;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.TabConstants;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.TabPlayer;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.chat.BaseComponent;
@@ -1,7 +1,7 @@
package me.neznamy.tab.platforms.bungeecord;
import me.neznamy.tab.shared.TabConstants;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.TabList;
import me.neznamy.tab.shared.proxy.ProxyTabPlayer;
import net.md_5.bungee.UserConnection;
@@ -3,7 +3,7 @@ package me.neznamy.tab.platforms.bungeecord.hook;
import de.myzelyam.api.vanish.BungeeVanishAPI;
import me.neznamy.tab.api.TabPlayer;
import me.neznamy.tab.platforms.bungeecord.BungeeTabPlayer;
import me.neznamy.tab.shared.chat.component.SimpleTextComponent;
import me.neznamy.chat.component.SimpleTextComponent;
import me.neznamy.tab.shared.hook.PremiumVanishHook;
import me.neznamy.tab.shared.platform.Platform;
import me.neznamy.tab.shared.util.ReflectionUtils;
@@ -4,7 +4,7 @@ import lombok.NonNull;
import lombok.SneakyThrows;
import me.neznamy.tab.platforms.bungeecord.BungeeTabPlayer;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.decorators.TrackedTabList;
import me.neznamy.tab.shared.util.ReflectionUtils;
import net.md_5.bungee.UserConnection;
@@ -3,7 +3,7 @@ package me.neznamy.tab.platforms.bungeecord.tablist;
import lombok.NonNull;
import me.neznamy.tab.platforms.bungeecord.BungeeTabPlayer;
import me.neznamy.tab.shared.Limitations;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.protocol.packet.PlayerListItem;
@@ -107,7 +107,7 @@ public class BungeeTabList17 extends BungeeTabList {
String displayNameString = component.toLegacyText();
if (displayNameString.length() > Limitations.MAX_DISPLAY_NAME_LENGTH_1_7)
displayNameString = displayNameString.substring(0, Limitations.MAX_DISPLAY_NAME_LENGTH_1_7);
return player.getPlatform().transformComponent(new me.neznamy.tab.shared.chat.component.TextComponent(displayNameString), player.getVersion());
return player.getPlatform().transformComponent(new me.neznamy.chat.component.TextComponent(displayNameString), player.getVersion());
}
private void update(@NonNull PlayerListItem.Action action, @NonNull PlayerListItem.Item item) {
+3
View File
@@ -0,0 +1,3 @@
dependencies {
compileOnlyApi("net.kyori:adventure-api:4.18.0")
}
@@ -1,4 +1,4 @@
package me.neznamy.tab.shared.chat;
package me.neznamy.chat;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -18,9 +18,9 @@ public class ChatModifier {
@Nullable private Integer shadowColor; // ARGB
@Nullable private Boolean bold;
@Nullable private Boolean italic;
@Nullable private Boolean obfuscated;
@Nullable private Boolean strikethrough;
@Nullable private Boolean underlined;
@Nullable private Boolean strikethrough;
@Nullable private Boolean obfuscated;
@Nullable private String font;
/**
@@ -1,4 +1,4 @@
package me.neznamy.tab.shared.chat;
package me.neznamy.chat;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -1,4 +1,4 @@
package me.neznamy.tab.shared.chat;
package me.neznamy.chat;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -1,4 +1,4 @@
package me.neznamy.tab.shared.chat.component;
package me.neznamy.chat.component;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -1,6 +1,6 @@
package me.neznamy.tab.shared.chat.component;
package me.neznamy.chat.component;
import me.neznamy.tab.shared.chat.TextColor;
import me.neznamy.chat.TextColor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -1,16 +1,14 @@
package me.neznamy.tab.shared.chat.component;
package me.neznamy.chat.component;
import lombok.Getter;
import lombok.Setter;
import lombok.SneakyThrows;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.chat.ChatModifier;
import me.neznamy.tab.shared.chat.EnumChatFormat;
import me.neznamy.tab.shared.chat.TextColor;
import me.neznamy.tab.shared.chat.rgb.RGBUtils;
import me.neznamy.tab.shared.hook.AdventureHook;
import me.neznamy.tab.shared.util.function.FunctionWithException;
import me.neznamy.tab.shared.util.function.TriFunction;
import me.neznamy.chat.ChatModifier;
import me.neznamy.chat.EnumChatFormat;
import me.neznamy.chat.TextColor;
import me.neznamy.chat.hook.AdventureHook;
import me.neznamy.chat.rgb.RGBUtils;
import me.neznamy.chat.util.TriFunction;
import net.kyori.adventure.text.Component;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -27,6 +25,10 @@ import java.util.regex.Pattern;
*/
public abstract class TabComponent {
/** Function for converting this class into platform's actual component */
@Nullable
public static Function<TabComponent, Object> CONVERT_FUNCTION;
/** Formatter to convert gradient into TAB's #RRGGBB spam */
private static final TriFunction<TextColor, String, TextColor, String> TABGradientFormatter = (start, text, end) -> {
//lazy support for magic codes in gradients
@@ -122,7 +124,8 @@ public abstract class TabComponent {
@NotNull
@SuppressWarnings("unchecked")
public <T> T convert() {
if (converted == null) converted = TAB.getInstance().getPlatform().convertComponent(this);
if (CONVERT_FUNCTION == null) throw new IllegalStateException("Convert function is not initialized");
if (converted == null) converted = CONVERT_FUNCTION.apply(this);
return (T) converted;
}
@@ -150,7 +153,7 @@ public abstract class TabComponent {
*/
@SuppressWarnings("unchecked")
@SneakyThrows
public <F, C> F toFixedFormat(@NotNull FunctionWithException<C, F> createFunction) {
public <F, C> F toFixedFormat(@NotNull Function<C, F> createFunction) {
if (fixedFormat == null) fixedFormat = createFunction.apply(convert());
return (F) fixedFormat;
}
@@ -1,12 +1,12 @@
package me.neznamy.tab.shared.chat.component;
package me.neznamy.chat.component;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import me.neznamy.tab.shared.chat.ChatModifier;
import me.neznamy.tab.shared.chat.EnumChatFormat;
import me.neznamy.tab.shared.chat.TextColor;
import me.neznamy.chat.ChatModifier;
import me.neznamy.chat.EnumChatFormat;
import me.neznamy.chat.TextColor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -1,4 +1,4 @@
package me.neznamy.tab.shared.chat.component;
package me.neznamy.chat.component;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -1,11 +1,10 @@
package me.neznamy.tab.shared.hook;
package me.neznamy.chat.hook;
import me.neznamy.tab.shared.chat.ChatModifier;
import me.neznamy.tab.shared.chat.component.KeybindComponent;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.tab.shared.chat.component.TextComponent;
import me.neznamy.tab.shared.chat.component.TranslatableComponent;
import me.neznamy.tab.shared.util.ReflectionUtils;
import me.neznamy.chat.ChatModifier;
import me.neznamy.chat.component.KeybindComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.chat.component.TextComponent;
import me.neznamy.chat.component.TranslatableComponent;
import net.kyori.adventure.key.Key;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.Style;
@@ -24,7 +23,18 @@ import java.util.Map;
public class AdventureHook {
/** Flag for tracking presence of shadow color parameter in current included adventure library (added in 1.21.4) */
private static final boolean SHADOW_COLOR_AVAILABLE = ReflectionUtils.methodExists(Component.class, "shadowColor");
private static final boolean SHADOW_COLOR_AVAILABLE;
static {
boolean value;
try {
Component.class.getDeclaredMethod("shadowColor");
value = true;
} catch (Throwable t) {
value = false;
}
SHADOW_COLOR_AVAILABLE = value;
}
/**
* Converts TAB component to adventure component
@@ -97,7 +107,7 @@ public class AdventureHook {
// Component style
Map<TextDecoration, TextDecoration.State> decorations = component.style().decorations();
tabComponent.setModifier(new ChatModifier(
component.color() == null ? null : new me.neznamy.tab.shared.chat.TextColor(component.color().value()),
component.color() == null ? null : new me.neznamy.chat.TextColor(component.color().value()),
SHADOW_COLOR_AVAILABLE ? AdventureShadowHook.getShadowColor(component) : null,
getDecoration(decorations.get(TextDecoration.BOLD)),
getDecoration(decorations.get(TextDecoration.ITALIC)),
@@ -1,4 +1,4 @@
package me.neznamy.tab.shared.hook;
package me.neznamy.chat.hook;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.ShadowColor;
@@ -1,15 +1,15 @@
package me.neznamy.tab.shared.chat.rgb;
package me.neznamy.chat.rgb;
import lombok.Getter;
import me.neznamy.tab.shared.chat.TextColor;
import me.neznamy.tab.shared.chat.rgb.format.BukkitFormat;
import me.neznamy.tab.shared.chat.rgb.format.CommonFormatter;
import me.neznamy.tab.shared.chat.rgb.format.RGBFormatter;
import me.neznamy.tab.shared.chat.rgb.gradient.CMIGradient;
import me.neznamy.tab.shared.chat.rgb.gradient.CommonGradient;
import me.neznamy.tab.shared.chat.rgb.gradient.GradientPattern;
import me.neznamy.tab.shared.chat.rgb.gradient.NexEngineGradient;
import me.neznamy.tab.shared.util.function.TriFunction;
import me.neznamy.chat.TextColor;
import me.neznamy.chat.rgb.format.BukkitFormat;
import me.neznamy.chat.rgb.format.CommonFormatter;
import me.neznamy.chat.rgb.format.RGBFormatter;
import me.neznamy.chat.rgb.gradient.CMIGradient;
import me.neznamy.chat.rgb.gradient.CommonGradient;
import me.neznamy.chat.rgb.gradient.GradientPattern;
import me.neznamy.chat.rgb.gradient.NexEngineGradient;
import me.neznamy.chat.util.TriFunction;
import org.jetbrains.annotations.NotNull;
import java.util.function.Function;
@@ -1,6 +1,6 @@
package me.neznamy.tab.shared.chat.rgb.format;
package me.neznamy.chat.rgb.format;
import me.neznamy.tab.shared.chat.TextColor;
import me.neznamy.chat.TextColor;
import org.jetbrains.annotations.NotNull;
import java.util.function.Function;
@@ -1,7 +1,7 @@
package me.neznamy.tab.shared.chat.rgb.format;
package me.neznamy.chat.rgb.format;
import lombok.RequiredArgsConstructor;
import me.neznamy.tab.shared.chat.TextColor;
import me.neznamy.chat.TextColor;
import org.jetbrains.annotations.NotNull;
import java.util.function.Function;
@@ -1,6 +1,6 @@
package me.neznamy.tab.shared.chat.rgb.format;
package me.neznamy.chat.rgb.format;
import me.neznamy.tab.shared.chat.TextColor;
import me.neznamy.chat.TextColor;
import org.jetbrains.annotations.NotNull;
import java.util.function.Function;
@@ -1,7 +1,7 @@
package me.neznamy.tab.shared.chat.rgb.gradient;
package me.neznamy.chat.rgb.gradient;
import me.neznamy.tab.shared.chat.TextColor;
import me.neznamy.tab.shared.util.function.TriFunction;
import me.neznamy.chat.TextColor;
import me.neznamy.chat.util.TriFunction;
import org.jetbrains.annotations.NotNull;
import java.util.regex.Matcher;
@@ -1,8 +1,8 @@
package me.neznamy.tab.shared.chat.rgb.gradient;
package me.neznamy.chat.rgb.gradient;
import lombok.AllArgsConstructor;
import me.neznamy.tab.shared.chat.TextColor;
import me.neznamy.tab.shared.util.function.TriFunction;
import me.neznamy.chat.TextColor;
import me.neznamy.chat.util.TriFunction;
import org.jetbrains.annotations.NotNull;
import java.util.regex.Matcher;
@@ -1,7 +1,7 @@
package me.neznamy.tab.shared.chat.rgb.gradient;
package me.neznamy.chat.rgb.gradient;
import me.neznamy.tab.shared.chat.TextColor;
import me.neznamy.tab.shared.util.function.TriFunction;
import me.neznamy.chat.TextColor;
import me.neznamy.chat.util.TriFunction;
import org.jetbrains.annotations.NotNull;
/**
@@ -1,7 +1,7 @@
package me.neznamy.tab.shared.chat.rgb.gradient;
package me.neznamy.chat.rgb.gradient;
import me.neznamy.tab.shared.chat.TextColor;
import me.neznamy.tab.shared.util.function.TriFunction;
import me.neznamy.chat.TextColor;
import me.neznamy.chat.util.TriFunction;
import org.jetbrains.annotations.NotNull;
import java.util.regex.Matcher;
@@ -1,4 +1,4 @@
package me.neznamy.tab.shared.util.function;
package me.neznamy.chat.util;
/**
* An interface for a function with 3 input arguments.
+2 -2
View File
@@ -13,7 +13,7 @@ repositories {
dependencies {
api(projects.shared)
minecraft("com.mojang:minecraft:25w06a")
minecraft("com.mojang:minecraft:25w07a")
mappings(loom.officialMojangMappings())
modImplementation("me.lucko:fabric-permissions-api:0.2-SNAPSHOT")
modImplementation("eu.pb4:placeholder-api:2.5.0+1.21.2")
@@ -35,6 +35,6 @@ tasks {
options.release.set(17)
}
validateAccessWidener {
enabled = true
enabled = false
}
}
@@ -3,7 +3,7 @@ package me.neznamy.tab.platforms.fabric;
import lombok.RequiredArgsConstructor;
import me.neznamy.tab.api.bossbar.BarColor;
import me.neznamy.tab.api.bossbar.BarStyle;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.decorators.SafeBossBar;
import net.minecraft.server.level.ServerBossEvent;
import net.minecraft.world.BossEvent.BossBarColor;
@@ -6,8 +6,8 @@ import lombok.SneakyThrows;
import me.neznamy.tab.platforms.fabric.loader.Loader;
import me.neznamy.tab.platforms.fabric.loader.Loader_Latest;
import me.neznamy.tab.shared.ProtocolVersion;
import me.neznamy.tab.shared.chat.ChatModifier;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.ChatModifier;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.TabList;
import me.neznamy.tab.shared.platform.TabPlayer;
import net.minecraft.commands.CommandSourceStack;
@@ -66,19 +66,6 @@ public class FabricMultiVersion {
return loader1_14_4.getLevelName(level);
}
/**
* Adds sibling to a component.
*
* @param parent
* Parent to add sibling to
* @param child
* Sibling to add
*/
public static void addSibling(@NotNull Component parent, @NotNull Component child) {
if (serverVersion.getMinorVersion() >= 16) loaderLatest.addSibling(parent, child);
else loader1_14_4.addSibling(parent, child);
}
/**
* Converts TAB's ChatModifier class to Minecraft Style class.
*
@@ -9,10 +9,10 @@ import me.neznamy.tab.shared.ProtocolVersion;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.TabConstants;
import me.neznamy.tab.shared.backend.BackendPlatform;
import me.neznamy.tab.shared.chat.component.KeybindComponent;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.tab.shared.chat.component.TextComponent;
import me.neznamy.tab.shared.chat.component.TranslatableComponent;
import me.neznamy.chat.component.KeybindComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.chat.component.TextComponent;
import me.neznamy.chat.component.TranslatableComponent;
import me.neznamy.tab.shared.features.PerWorldPlayerListConfiguration;
import me.neznamy.tab.shared.features.PlaceholderManagerImpl;
import me.neznamy.tab.shared.features.injection.PipelineInjector;
@@ -153,7 +153,7 @@ public class FabricPlatform implements BackendPlatform {
// Extra
for (TabComponent extra : component.getExtra()) {
FabricMultiVersion.addSibling(nmsComponent, convertComponent(extra));
nmsComponent.getSiblings().add(convertComponent(extra));
}
return nmsComponent;
@@ -10,7 +10,7 @@ import com.mojang.brigadier.tree.LiteralCommandNode;
import me.neznamy.tab.platforms.fabric.hook.PermissionsAPIHook;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.TabConstants;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.TabPlayer;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
@@ -4,7 +4,7 @@ import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import lombok.*;
import me.neznamy.tab.shared.ProtocolVersion;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.TabList;
import me.neznamy.tab.shared.platform.decorators.TrackedTabList;
import net.minecraft.network.chat.Component;
@@ -3,7 +3,7 @@ package me.neznamy.tab.platforms.fabric;
import com.mojang.authlib.properties.Property;
import me.neznamy.tab.platforms.fabric.hook.PermissionsAPIHook;
import me.neznamy.tab.shared.backend.BackendTabPlayer;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.TabList;
import net.minecraft.network.protocol.Packet;
import net.minecraft.server.level.ServerPlayer;
@@ -4,8 +4,8 @@ import com.mojang.authlib.properties.Property;
import io.netty.channel.Channel;
import me.neznamy.tab.platforms.fabric.FabricScoreboard;
import me.neznamy.tab.platforms.fabric.FabricTabList;
import me.neznamy.tab.shared.chat.ChatModifier;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.ChatModifier;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.TabList;
import me.neznamy.tab.shared.platform.TabPlayer;
import net.minecraft.commands.CommandSourceStack;
@@ -106,18 +106,6 @@ public interface Loader {
throw new UnsupportedOperationException("Not implemented.");
}
/**
* Adds sibling to a component.
*
* @param parent
* Parent to add sibling to
* @param child
* Sibling to add
*/
default void addSibling(@NotNull Component parent, @NotNull Component child) {
throw new UnsupportedOperationException("Not implemented.");
}
/**
* Creates team register packet using given team.
*
@@ -6,8 +6,8 @@ import io.netty.channel.Channel;
import me.neznamy.tab.platforms.fabric.FabricScoreboard;
import me.neznamy.tab.platforms.fabric.FabricTabList;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.chat.ChatModifier;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.ChatModifier;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.Scoreboard;
import me.neznamy.tab.shared.platform.TabList;
import me.neznamy.tab.shared.platform.TabPlayer;
@@ -77,21 +77,19 @@ public class Loader_Latest implements Loader {
@Override
@NotNull
public Style convertModifier(@NotNull ChatModifier modifier) {
Style style = Style.EMPTY
.withColor(modifier.getColor() == null ? null : TextColor.fromRgb(modifier.getColor().getRgb()))
.withBold(modifier.getBold())
.withItalic(modifier.getItalic())
.withUnderlined(modifier.getUnderlined())
.withStrikethrough(modifier.getStrikethrough())
.withObfuscated(modifier.getObfuscated())
.withFont(modifier.getFont() == null ? null : ResourceLocation.tryParse(modifier.getFont()));
if (modifier.getShadowColor() != null) style = style.withShadowColor(modifier.getShadowColor());
return style;
}
@Override
public void addSibling(@NotNull Component parent, @NotNull Component child) {
parent.getSiblings().add(child);
return new Style(
modifier.getColor() == null ? null : TextColor.fromRgb(modifier.getColor().getRgb()),
modifier.getShadowColor(),
modifier.getBold(),
modifier.getItalic(),
modifier.getUnderlined(),
modifier.getStrikethrough(),
modifier.getObfuscated(),
null,
null,
null,
modifier.getFont() == null ? null : ResourceLocation.tryParse(modifier.getFont())
);
}
@Override
+1 -1
View File
@@ -21,7 +21,7 @@
"1.18", "1.18.1", "1.18.2",
"1.19", "1.19.1", "1.19.2", "1.19.3", "1.19.4",
"1.20", "1.20.1", "1.20.2", "1.20.3", "1.20.4", "1.20.5", "1.20.6",
"1.21", "1.21.1", "1.21.2", "1.21.3", "1.21.4", "1.21.5-alpha.25.2.a", "1.21.5-alpha.25.3.a", "1.21.5-alpha.25.4.a", "1.21.5-alpha.25.5.a", "1.21.5-alpha.25.6.a"
"1.21", "1.21.1", "1.21.2", "1.21.3", "1.21.4", "1.21.5-alpha.25.2.a", "1.21.5-alpha.25.3.a", "1.21.5-alpha.25.4.a", "1.21.5-alpha.25.5.a", "1.21.5-alpha.25.6.a", "1.21.5-alpha.25.7.a"
]
},
"recommends": {
@@ -5,6 +5,9 @@ accessible field net/minecraft/network/protocol/game/ClientboundSetObjectivePack
accessible field net/minecraft/network/protocol/game/ClientboundSetObjectivePacket method I
accessible field net/minecraft/network/protocol/game/ClientboundSetDisplayObjectivePacket objectiveName Ljava/lang/String;
# Style (1.16 - 1.21.3)
accessible method net/minecraft/network/chat/Style <init> (Lnet/minecraft/network/chat/TextColor;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Lnet/minecraft/network/chat/ClickEvent;Lnet/minecraft/network/chat/HoverEvent;Ljava/lang/String;Lnet/minecraft/resources/ResourceLocation;)V
# Team packet (1.17+)
accessible field net/minecraft/network/protocol/game/ClientboundSetPlayerTeamPacket method I
accessible field net/minecraft/network/protocol/game/ClientboundSetPlayerTeamPacket players Ljava/util/Collection;
@@ -19,4 +22,7 @@ mutable field net/minecraft/network/protocol/game/ClientboundPlayerInfoUpdatePac
# Channel (1.20.2+)
accessible field net/minecraft/server/network/ServerCommonPacketListenerImpl connection Lnet/minecraft/network/Connection;
accessible field net/minecraft/network/Connection channel Lio/netty/channel/Channel;
accessible field net/minecraft/network/Connection channel Lio/netty/channel/Channel;
# Style (1.21.4+)
accessible method net/minecraft/network/chat/Style <init> (Lnet/minecraft/network/chat/TextColor;Ljava/lang/Integer;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Lnet/minecraft/network/chat/ClickEvent;Lnet/minecraft/network/chat/HoverEvent;Ljava/lang/String;Lnet/minecraft/resources/ResourceLocation;)V
@@ -9,8 +9,8 @@ import me.neznamy.tab.platforms.fabric.FabricScoreboard;
import me.neznamy.tab.platforms.fabric.FabricTabList;
import me.neznamy.tab.shared.ProtocolVersion;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.chat.ChatModifier;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.ChatModifier;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.Scoreboard;
import me.neznamy.tab.shared.platform.TabList;
import me.neznamy.tab.shared.platform.TabPlayer;
@@ -96,11 +96,6 @@ public class Loader_1_14_4 implements Loader {
return style;
}
@Override
public void addSibling(@NotNull Component parent, @NotNull Component child) {
parent.append(child);
}
@Override
@NotNull
public Packet<?> registerTeam(@NotNull PlayerTeam team) {
@@ -5,7 +5,7 @@ import lombok.RequiredArgsConstructor;
import me.neznamy.tab.platforms.fabric.FabricTabList;
import me.neznamy.tab.shared.ProtocolVersion;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.TabList;
import me.neznamy.tab.shared.platform.TabPlayer;
import net.minecraft.network.chat.Component;
@@ -5,7 +5,7 @@ import lombok.RequiredArgsConstructor;
import me.neznamy.tab.platforms.fabric.FabricTabList;
import me.neznamy.tab.shared.ProtocolVersion;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.chat.ChatModifier;
import me.neznamy.chat.ChatModifier;
import me.neznamy.tab.shared.platform.TabList;
import me.neznamy.tab.shared.platform.TabPlayer;
import net.minecraft.network.chat.Component;
@@ -79,14 +79,18 @@ public class Loader_1_21_3 implements Loader {
@Override
@NotNull
public Style convertModifier(@NotNull ChatModifier modifier) {
return Style.EMPTY
.withColor(modifier.getColor() == null ? null : TextColor.fromRgb(modifier.getColor().getRgb()))
.withBold(modifier.getBold())
.withItalic(modifier.getItalic())
.withUnderlined(modifier.getUnderlined())
.withStrikethrough(modifier.getStrikethrough())
.withObfuscated(modifier.getObfuscated())
.withFont(modifier.getFont() == null ? null : ResourceLocation.tryParse(modifier.getFont()));
return new Style(
modifier.getColor() == null ? null : TextColor.fromRgb(modifier.getColor().getRgb()),
modifier.getBold(),
modifier.getItalic(),
modifier.getUnderlined(),
modifier.getStrikethrough(),
modifier.getObfuscated(),
null,
null,
null,
modifier.getFont() == null ? null : ResourceLocation.tryParse(modifier.getFont())
);
}
private static class Register1_19_3 {
-1
View File
@@ -6,7 +6,6 @@ plugins {
val platforms = setOf(
rootProject.projects.bukkit,
rootProject.projects.bukkit.paper,
rootProject.projects.bungeecord,
rootProject.projects.velocity,
rootProject.projects.sponge7,
+3 -3
View File
@@ -4,7 +4,7 @@ dependencyResolutionManagement {
repositories {
mavenCentral() // Netty, SnakeYaml, json-simple, Guava, Kyori event, bStats, AuthLib, LuckPerms
maven("https://repo.william278.net/releases/") // VelocityScoreboardAPI
maven("https://repo.papermc.io/repository/maven-public/") // paperweight, Velocity
maven("https://repo.papermc.io/repository/maven-public/") // Velocity
maven("https://repo.extendedclip.com/content/repositories/placeholderapi/") // PlaceholderAPI
maven("https://repo.viaversion.com/") // ViaVersion
maven("https://repo.opencollab.dev/maven-snapshots/") // Floodgate, Bungeecord-proxy
@@ -30,8 +30,8 @@ include(":api")
include(":shared")
include(":velocity")
include(":bukkit")
include(":bukkit:paper")
include(":bungeecord")
include(":component")
include(":sponge7")
include(":sponge8")
include(":fabric")
@@ -39,4 +39,4 @@ include(":fabric:v1_14_4")
include(":fabric:v1_18_2")
include(":fabric:v1_20_3")
include(":fabric:v1_21_3")
include(":jar")
include(":jar")
+1
View File
@@ -4,6 +4,7 @@ plugins {
dependencies {
api(projects.api)
api(projects.component)
api("org.yaml:snakeyaml:2.0")
api("com.github.NEZNAMY:yamlassist:1.0.8")
api("com.googlecode.json-simple:json-simple:1.1.1") {
@@ -2,7 +2,7 @@ package me.neznamy.tab.shared;
import lombok.Getter;
import me.neznamy.tab.api.event.TabEvent;
import me.neznamy.tab.shared.chat.component.SimpleTextComponent;
import me.neznamy.chat.component.SimpleTextComponent;
import me.neznamy.tab.shared.platform.TabPlayer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -6,8 +6,8 @@ import java.util.List;
import lombok.Getter;
import me.neznamy.tab.shared.features.PlaceholderManagerImpl;
import me.neznamy.tab.shared.features.types.RefreshableFeature;
import me.neznamy.tab.shared.chat.EnumChatFormat;
import me.neznamy.tab.shared.chat.rgb.RGBUtils;
import me.neznamy.chat.EnumChatFormat;
import me.neznamy.chat.rgb.RGBUtils;
import me.neznamy.tab.shared.placeholders.expansion.TabExpansion;
import me.neznamy.tab.shared.placeholders.types.RelationalPlaceholderImpl;
import me.neznamy.tab.shared.platform.TabPlayer;
@@ -2,6 +2,9 @@ package me.neznamy.tab.shared;
import lombok.Getter;
import lombok.Setter;
import me.neznamy.chat.TextColor;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.chat.component.TextComponent;
import me.neznamy.tab.api.TabAPI;
import me.neznamy.tab.api.bossbar.BossBarManager;
import me.neznamy.tab.api.scoreboard.ScoreboardManager;
@@ -9,8 +12,6 @@ import me.neznamy.tab.api.tablist.HeaderFooterManager;
import me.neznamy.tab.api.tablist.SortingManager;
import me.neznamy.tab.api.tablist.TabListFormatManager;
import me.neznamy.tab.api.tablist.layout.LayoutManager;
import me.neznamy.tab.shared.chat.TextColor;
import me.neznamy.tab.shared.chat.component.TextComponent;
import me.neznamy.tab.shared.command.DisabledCommand;
import me.neznamy.tab.shared.command.TabCommand;
import me.neznamy.tab.shared.config.Configs;
@@ -130,6 +131,7 @@ public class TAB extends TabAPI {
*/
private TAB(@NotNull Platform platform) {
this.platform = platform;
TabComponent.CONVERT_FUNCTION = platform::convertComponent;
dataFolder = platform.getDataFolder();
errorManager = new ErrorManager(dataFolder);
try {
@@ -178,12 +180,12 @@ public class TAB extends TabAPI {
groupManager = platform.detectPermissionPlugin();
platform.registerPlaceholders();
featureManager.loadFeaturesFromConfig();
pluginDisabled = false;
platform.loadPlayers();
command = new TabCommand();
featureManager.load();
for (TabPlayer p : onlinePlayers) p.markAsLoaded(false);
if (eventBus != null) eventBus.fire(TabLoadEventImpl.getInstance());
pluginDisabled = false;
cpu.enable();
configHelper.startup().printWarnCount();
platform.logInfo(new TextComponent("Enabled in " + (System.currentTimeMillis()-time) + "ms", TextColor.GREEN));
@@ -3,7 +3,7 @@ package me.neznamy.tab.shared.command;
import me.neznamy.tab.api.placeholder.Placeholder;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.TabConstants;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.cpu.CpuReport;
import me.neznamy.tab.shared.platform.TabPlayer;
import org.jetbrains.annotations.NotNull;
@@ -3,8 +3,8 @@ package me.neznamy.tab.shared.command;
import me.neznamy.tab.shared.Property;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.TabConstants;
import me.neznamy.tab.shared.chat.TextColor;
import me.neznamy.tab.shared.chat.component.TextComponent;
import me.neznamy.chat.TextColor;
import me.neznamy.chat.component.TextComponent;
import me.neznamy.tab.shared.config.file.ConfigurationFile;
import me.neznamy.tab.shared.features.sorting.Sorting;
import me.neznamy.tab.shared.platform.TabPlayer;
@@ -4,9 +4,9 @@ import me.neznamy.tab.api.placeholder.Placeholder;
import me.neznamy.tab.shared.Property;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.TabConstants;
import me.neznamy.tab.shared.chat.TextColor;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.tab.shared.chat.component.TextComponent;
import me.neznamy.chat.TextColor;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.chat.component.TextComponent;
import me.neznamy.tab.shared.platform.TabPlayer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -4,7 +4,7 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.TabConstants;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.config.MessageFile;
import me.neznamy.tab.shared.platform.TabPlayer;
import org.jetbrains.annotations.NotNull;
@@ -2,8 +2,8 @@ package me.neznamy.tab.shared.config;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.TabConstants;
import me.neznamy.tab.shared.chat.TextColor;
import me.neznamy.tab.shared.chat.component.TextComponent;
import me.neznamy.chat.TextColor;
import me.neznamy.chat.component.TextComponent;
import me.neznamy.tab.shared.config.file.ConfigurationFile;
import me.neznamy.tab.shared.config.file.YamlConfigurationFile;
import org.jetbrains.annotations.NotNull;
@@ -1,13 +1,14 @@
package me.neznamy.tab.shared.config.file;
import lombok.NonNull;
import me.neznamy.chat.TextColor;
import me.neznamy.chat.component.SimpleTextComponent;
import me.neznamy.chat.component.TextComponent;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.chat.TextColor;
import me.neznamy.tab.shared.chat.component.SimpleTextComponent;
import me.neznamy.tab.shared.chat.component.TextComponent;
import me.neznamy.yamlassist.YamlAssist;
import org.jetbrains.annotations.Nullable;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.LoaderOptions;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.error.YAMLException;
@@ -44,7 +45,10 @@ public class YamlConfigurationFile extends ConfigurationFile {
FileInputStream input = null;
try {
input = new FileInputStream(file);
values = new Yaml().load(input);
LoaderOptions loaderOptions = new LoaderOptions();
loaderOptions.setCodePointLimit(Integer.MAX_VALUE);
Yaml yaml = new Yaml(loaderOptions);
values = yaml.load(input);
if (values == null) values = new LinkedHashMap<>();
input.close();
} catch (YAMLException e) {
@@ -1,8 +1,8 @@
package me.neznamy.tab.shared.config.helper;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.chat.TextColor;
import me.neznamy.tab.shared.chat.component.TextComponent;
import me.neznamy.chat.TextColor;
import me.neznamy.chat.component.TextComponent;
import org.jetbrains.annotations.NotNull;
import java.io.File;
@@ -2,7 +2,7 @@ package me.neznamy.tab.shared.config.helper;
import me.neznamy.tab.api.bossbar.BossBar;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.chat.component.SimpleTextComponent;
import me.neznamy.chat.component.SimpleTextComponent;
import me.neznamy.tab.shared.features.sorting.types.SortingType;
import me.neznamy.tab.shared.platform.TabPlayer;
import me.neznamy.tab.shared.proxy.ProxyTabPlayer;
@@ -1,7 +1,7 @@
package me.neznamy.tab.shared.config.helper;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.chat.component.SimpleTextComponent;
import me.neznamy.chat.component.SimpleTextComponent;
import me.neznamy.tab.shared.features.sorting.types.SortingType;
import org.jetbrains.annotations.NotNull;
@@ -3,8 +3,8 @@ package me.neznamy.tab.shared.config.mysql;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.chat.TextColor;
import me.neznamy.tab.shared.chat.component.TextComponent;
import me.neznamy.chat.TextColor;
import me.neznamy.chat.component.TextComponent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -3,7 +3,7 @@ package me.neznamy.tab.shared.features;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.TabConstants;
import me.neznamy.tab.shared.TabConstants.CpuUsageCategory;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.cpu.CpuManager;
import me.neznamy.tab.shared.cpu.TimedCaughtTask;
import me.neznamy.tab.shared.features.belowname.BelowName;
@@ -4,7 +4,7 @@ import java.util.*;
import lombok.Getter;
import me.neznamy.tab.shared.TabConstants;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.cpu.ThreadExecutor;
import me.neznamy.tab.shared.cpu.TimedCaughtTask;
import me.neznamy.tab.shared.features.playerlist.PlayerList;
@@ -5,7 +5,7 @@ import me.neznamy.tab.api.tablist.HeaderFooterManager;
import me.neznamy.tab.shared.Property;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.TabConstants;
import me.neznamy.tab.shared.chat.component.SimpleTextComponent;
import me.neznamy.chat.component.SimpleTextComponent;
import me.neznamy.tab.shared.cpu.ThreadExecutor;
import me.neznamy.tab.shared.features.header.HeaderFooterConfiguration.HeaderFooterPair;
import me.neznamy.tab.shared.features.types.*;
@@ -4,7 +4,7 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor;
import me.neznamy.tab.shared.ProtocolVersion;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.chat.EnumChatFormat;
import me.neznamy.chat.EnumChatFormat;
import me.neznamy.tab.shared.config.file.ConfigurationSection;
import me.neznamy.tab.shared.platform.TabPlayer;
import org.jetbrains.annotations.NotNull;
@@ -1,7 +1,7 @@
package me.neznamy.tab.shared.features.layout;
import lombok.Getter;
import me.neznamy.tab.shared.chat.component.SimpleTextComponent;
import me.neznamy.chat.component.SimpleTextComponent;
import me.neznamy.tab.shared.features.layout.LayoutConfiguration.LayoutDefinition.GroupPattern;
import me.neznamy.tab.shared.placeholders.conditions.Condition;
import me.neznamy.tab.shared.platform.TabList;
@@ -2,7 +2,7 @@ package me.neznamy.tab.shared.features.layout;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import me.neznamy.tab.shared.chat.component.SimpleTextComponent;
import me.neznamy.chat.component.SimpleTextComponent;
import me.neznamy.tab.shared.features.playerlist.PlayerList;
import me.neznamy.tab.shared.platform.TabList;
import me.neznamy.tab.shared.platform.TabPlayer;
@@ -10,7 +10,7 @@ import me.neznamy.tab.api.nametag.NameTagManager;
import me.neznamy.tab.shared.Property;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.TabConstants;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.cpu.ThreadExecutor;
import me.neznamy.tab.shared.cpu.TimedCaughtTask;
import me.neznamy.tab.shared.features.redis.RedisPlayer;
@@ -11,8 +11,8 @@ import me.neznamy.tab.shared.Property;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.TabConstants;
import me.neznamy.tab.shared.TabConstants.CpuUsageCategory;
import me.neznamy.tab.shared.chat.component.SimpleTextComponent;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.SimpleTextComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.cpu.TimedCaughtTask;
import me.neznamy.tab.shared.features.layout.PlayerSlot;
import me.neznamy.tab.shared.features.redis.RedisPlayer;
@@ -8,8 +8,8 @@ import lombok.NoArgsConstructor;
import me.neznamy.tab.shared.Property;
import me.neznamy.tab.shared.TAB;
import me.neznamy.tab.shared.TabConstants;
import me.neznamy.tab.shared.chat.component.SimpleTextComponent;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.SimpleTextComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.cpu.ThreadExecutor;
import me.neznamy.tab.shared.cpu.TimedCaughtTask;
import me.neznamy.tab.shared.features.redis.RedisPlayer;
@@ -2,7 +2,7 @@ package me.neznamy.tab.shared.features.redis;
import lombok.*;
import me.neznamy.tab.shared.TabConstants.Permission;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.platform.Scoreboard;
import me.neznamy.tab.shared.platform.TabList;
import org.jetbrains.annotations.NotNull;
@@ -3,7 +3,7 @@ package me.neznamy.tab.shared.features.scoreboard;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import me.neznamy.tab.shared.Property;
import me.neznamy.tab.shared.chat.component.TabComponent;
import me.neznamy.chat.component.TabComponent;
import me.neznamy.tab.shared.cpu.ThreadExecutor;
import me.neznamy.tab.shared.features.scoreboard.lines.ScoreboardLine;
import me.neznamy.tab.shared.features.types.CustomThreaded;
@@ -66,14 +66,14 @@ public class ScoreboardConfiguration {
private static void checkChain(@NotNull ConfigurationSection section, Map<String, ScoreboardDefinition> scoreboards) {
String noConditionScoreboard = null;
for (Map.Entry<String, ScoreboardDefinition> entry : scoreboards.entrySet()) {
if (entry.getValue().displayCondition == null) {
noConditionScoreboard = entry.getKey();
} else if (noConditionScoreboard != null) {
if (noConditionScoreboard != null) {
section.startupWarn("Scoreboard \"" + noConditionScoreboard + "\" has no display condition set, however, there is" +
" another scoreboard in the chain (" + entry.getKey() + "). Scoreboards are checked from top to bottom" +
" until a scoreboard with meeting condition or no condition is found. Because of this, the scoreboard (" +
entry.getKey() + ") after the no-condition scoreboard (" + noConditionScoreboard + ") will never be displayed. " +
"Unless this is intentional to externally display the scoreboard (commands, API), this is a mistake.");
} else if (entry.getValue().displayCondition == null) {
noConditionScoreboard = entry.getKey();
}
}
}
Loaded 100 of 138 files, more files were not shown because too many files have changed in this diff. Show more