From dd6b96440527d33257e209d9ccb9aa081f79ecdf Mon Sep 17 00:00:00 2001 From: NEZNAMY Date: Sat, 1 Mar 2025 18:31:50 +0100 Subject: [PATCH] [Fabric] Remove support for all versions below 1.21.4 --- build.gradle.kts | 6 +- fabric/build.gradle.kts | 3 +- .../tab/platforms/fabric/FabricBossBar.java | 4 +- .../platforms/fabric/FabricEventListener.java | 20 +- .../platforms/fabric/FabricMultiVersion.java | 459 ------------------ .../fabric/FabricPipelineInjector.java | 2 +- .../tab/platforms/fabric/FabricPlatform.java | 47 +- .../platforms/fabric/FabricScoreboard.java | 42 +- .../tab/platforms/fabric/FabricTAB.java | 35 +- .../platforms/fabric/FabricTabCommand.java | 2 +- .../tab/platforms/fabric/FabricTabList.java | 137 +++--- .../tab/platforms/fabric/FabricTabPlayer.java | 13 +- .../fabric/hook/FabricTabExpansion.java | 4 +- .../tab/platforms/fabric/loader/Loader.java | 398 --------------- .../fabric/loader/Loader_Latest.java | 303 ------------ fabric/src/main/resources/fabric.mod.json | 12 +- .../resources/resources/tab.accesswidener | 13 +- fabric/v1_14_4/build.gradle.kts | 25 - .../fabric/loader/Loader_1_14_4.java | 268 ---------- fabric/v1_18_2/build.gradle.kts | 25 - .../fabric/loader/Loader_1_18_2.java | 89 ---- fabric/v1_20_3/build.gradle.kts | 33 -- .../fabric/loader/Loader_1_20_3.java | 110 ----- fabric/v1_21_3/build.gradle.kts | 33 -- .../fabric/loader/Loader_1_21_3.java | 112 ----- jar/build.gradle.kts | 13 +- settings.gradle.kts | 4 - 27 files changed, 182 insertions(+), 2030 deletions(-) delete mode 100644 fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricMultiVersion.java delete mode 100644 fabric/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader.java delete mode 100644 fabric/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_Latest.java delete mode 100644 fabric/v1_14_4/build.gradle.kts delete mode 100644 fabric/v1_14_4/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_1_14_4.java delete mode 100644 fabric/v1_18_2/build.gradle.kts delete mode 100644 fabric/v1_18_2/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_1_18_2.java delete mode 100644 fabric/v1_20_3/build.gradle.kts delete mode 100644 fabric/v1_20_3/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_1_20_3.java delete mode 100644 fabric/v1_21_3/build.gradle.kts delete mode 100644 fabric/v1_21_3/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_1_21_3.java diff --git a/build.gradle.kts b/build.gradle.kts index 8f1738fd6..a95eb6bf6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,11 +19,7 @@ val platforms = setOf( projects.velocity, projects.sponge7, projects.sponge8, - projects.fabric, - projects.fabric.v1144, - projects.fabric.v1182, - projects.fabric.v1203, - projects.fabric.v1213 + projects.fabric ).map { it.dependencyProject } val special = setOf( diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 901b5c803..468246428 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -22,7 +22,6 @@ dependencies { modImplementation(fabricApi.module("fabric-lifecycle-events-v1", version)) modImplementation(fabricApi.module("fabric-networking-api-v1", version)) modImplementation(fabricApi.module("fabric-entity-events-v1", version)) - modImplementation(fabricApi.module("fabric-command-api-v1", "0.77.0+1.18.2")) modImplementation(fabricApi.module("fabric-command-api-v2", version)) } @@ -35,6 +34,6 @@ tasks { options.release.set(17) } validateAccessWidener { - enabled = false + enabled = true } } diff --git a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricBossBar.java b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricBossBar.java index 803a4f3d8..6caac440f 100644 --- a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricBossBar.java +++ b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricBossBar.java @@ -28,7 +28,7 @@ public ServerBossEvent constructBossBar(@NotNull TabComponent title, float progr BossBarColor.valueOf(color.name()), BossBarOverlay.valueOf(style.name()) ); - bar.setProgress(progress); // Somehow the compiled method name is same despite method being renamed in 1.17 + bar.setProgress(progress); return bar; } @@ -44,7 +44,7 @@ public void updateTitle(@NotNull BossBarInfo bar) { @Override public void updateProgress(@NotNull BossBarInfo bar) { - bar.getBossBar().setProgress(bar.getProgress()); // Somehow the compiled method name is same despite method being renamed in 1.17 + bar.getBossBar().setProgress(bar.getProgress()); } @Override diff --git a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricEventListener.java b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricEventListener.java index de8a24e20..3e505cc5d 100644 --- a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricEventListener.java +++ b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricEventListener.java @@ -3,7 +3,6 @@ import me.neznamy.tab.shared.TAB; import me.neznamy.tab.shared.platform.EventListener; import me.neznamy.tab.shared.platform.TabPlayer; -import me.neznamy.tab.shared.util.ReflectionUtils; import net.fabricmc.fabric.api.entity.event.v1.ServerEntityWorldChangeEvents; import net.fabricmc.fabric.api.entity.event.v1.ServerPlayerEvents; import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; @@ -22,17 +21,14 @@ public void register() { ServerPlayConnectionEvents.DISCONNECT.register((connection, $) -> quit(connection.player.getUUID())); ServerPlayConnectionEvents.JOIN.register((connection, $, $$) -> join(connection.player)); //TODO command preprocess - if (ReflectionUtils.classExists("net.fabricmc.fabric.api.entity.event.v1.ServerPlayerEvents")) { - // Added in 1.16 - ServerPlayerEvents.AFTER_RESPAWN.register( - (oldPlayer, newPlayer, alive) -> { - replacePlayer(newPlayer.getUUID(), newPlayer); - // respawning from death & taking end portal in the end do not call world change event - worldChange(newPlayer.getUUID(), FabricMultiVersion.getLevelName(FabricMultiVersion.getLevel(newPlayer))); - }); - ServerEntityWorldChangeEvents.AFTER_PLAYER_CHANGE_WORLD.register( - (player, origin, destination) -> worldChange(player.getUUID(), FabricMultiVersion.getLevelName(destination))); - } // TODO else + ServerPlayerEvents.AFTER_RESPAWN.register( + (oldPlayer, newPlayer, alive) -> { + replacePlayer(newPlayer.getUUID(), newPlayer); + // respawning from death & taking end portal in the end does not call world change event + worldChange(newPlayer.getUUID(), FabricTAB.getLevelName(newPlayer.level())); + }); + ServerEntityWorldChangeEvents.AFTER_PLAYER_CHANGE_WORLD.register( + (player, origin, destination) -> worldChange(player.getUUID(), FabricTAB.getLevelName(destination))); } @Override diff --git a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricMultiVersion.java b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricMultiVersion.java deleted file mode 100644 index 2b8d4de49..000000000 --- a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricMultiVersion.java +++ /dev/null @@ -1,459 +0,0 @@ -package me.neznamy.tab.platforms.fabric; - -import com.mojang.authlib.properties.Property; -import io.netty.channel.Channel; -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.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; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Style; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientboundSetDisplayObjectivePacket; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.Level; -import net.minecraft.world.scores.Objective; -import net.minecraft.world.scores.PlayerTeam; -import net.minecraft.world.scores.criteria.ObjectiveCriteria.RenderType; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * Class managing cross-version code in shared module. - */ -public class FabricMultiVersion { - - /** Server version */ - private static final ProtocolVersion serverVersion = ProtocolVersion.fromFriendlyName(FabricTAB.minecraftVersion); - - /** Method loader using latest supported MC version */ - private static final Loader loaderLatest = new Loader_Latest(); - - /** Method loader using 1.21.2 - 1.21.3 */ - private static final Loader loader1_21_3 = createLoader("1_21_3"); - - /** Method loader using 1.20.3 - 1.21.1 */ - private static final Loader loader1_20_3 = createLoader("1_20_3"); - - /** Method loader using 1.17 - 1.18.2 */ - private static final Loader loader1_18_2 = createLoader("1_18_2"); - - /** Method loader using 1.14.4 */ - private static final Loader loader1_14_4 = createLoader("1_14_4"); - - @SneakyThrows - private static Loader createLoader(@NotNull String version) { - return (Loader) Class.forName("me.neznamy.tab.platforms.fabric.loader.Loader_" + version) - .getConstructor(ProtocolVersion.class).newInstance(serverVersion); - } - - /** - * Returns name of specified world. - * - * @param level - * World to get name of - * @return Name of the world - */ - @NotNull - public static String getLevelName(@NotNull Level level) { - if (serverVersion.getMinorVersion() >= 16) return loaderLatest.getLevelName(level); - return loader1_14_4.getLevelName(level); - } - - /** - * Converts TAB's ChatModifier class to Minecraft Style class. - * - * @param modifier - * Modifier to convert - * @return Converted style - */ - @NotNull - public static Style convertModifier(@NotNull ChatModifier modifier) { - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_21_4.getNetworkId()) return loaderLatest.convertModifier(modifier); - if (serverVersion.getMinorVersion() >= 16) return loader1_21_3.convertModifier(modifier); - return loader1_14_4.convertModifier(modifier); - } - - /** - * Creates new Header/Footer packet with given parameters. - * - * @param header - * Header to use - * @param footer - * Footer to use - * @return Packet with given parameters - */ - @NotNull - public static Packet newHeaderFooter(@NotNull Component header, @NotNull Component footer) { - if (serverVersion.getMinorVersion() >= 17) return loaderLatest.newHeaderFooter(header, footer); - return loader1_14_4.newHeaderFooter(header, footer); - } - - /** - * Checks outgoing team packet in pipeline to potentially remove players from it. - * - * @param packet - * Packet to check - * @param scoreboard - * Scoreboard of player who received the packet - */ - public static void checkTeamPacket(@NotNull Packet packet, @NotNull FabricScoreboard scoreboard) { - if (serverVersion.getMinorVersion() >= 17) loaderLatest.checkTeamPacket(packet, scoreboard); - else loader1_14_4.checkTeamPacket(packet, scoreboard); - } - - /** - * Creates team register packet using given team. - * - * @param team - * Team to register - * @return Team register packet using given team - */ - @NotNull - public static Packet registerTeam(@NotNull PlayerTeam team) { - if (serverVersion.getMinorVersion() >= 17) return loaderLatest.registerTeam(team); - return loader1_14_4.registerTeam(team); - } - - /** - * Creates team unregister packet using given team. - * - * @param team - * Team to unregister - * @return Team unregister packet using given team - */ - @NotNull - public static Packet unregisterTeam(@NotNull PlayerTeam team) { - if (serverVersion.getMinorVersion() >= 17) return loaderLatest.unregisterTeam(team); - return loader1_14_4.unregisterTeam(team); - } - - /** - * Creates team update packet using given team. - * - * @param team - * Team to update - * @return Team update packet using given team - */ - @NotNull - public static Packet updateTeam(@NotNull PlayerTeam team) { - if (serverVersion.getMinorVersion() >= 17) return loaderLatest.updateTeam(team); - return loader1_14_4.updateTeam(team); - } - - /** - * Logs console message as info. - * - * @param message - * Message to log - */ - public static void logInfo(@NotNull TabComponent message) { - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_18_2.getNetworkId()) loaderLatest.logInfo(message); - else loader1_14_4.logInfo(message); - } - - /** - * Logs console message as warn. - * - * @param message - * Message to log - */ - public static void logWarn(@NotNull TabComponent message) { - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_18_2.getNetworkId()) loaderLatest.logWarn(message); - else loader1_14_4.logWarn(message); - } - - /** - * Creates new text component using given text. - * - * @param text - * Component text - * @return Text component with given text - */ - @NotNull - public static Component newTextComponent(@NotNull String text) { - if (serverVersion.getMinorVersion() >= 19) return loaderLatest.newTextComponent(text); - return loader1_14_4.newTextComponent(text); - } - - /** - * Creates new translatable component using given text. - * - * @param text - * Component text - * @return Text component with given text - */ - @NotNull - public static Component newTranslatableComponent(@NotNull String text) { - if (serverVersion.getMinorVersion() >= 19) return loaderLatest.newTranslatableComponent(text); - return loader1_14_4.newTranslatableComponent(text); - } - - /** - * Creates new keybind component using given text. - * - * @param key - * Key bind - * @return Text component with given text - */ - @NotNull - public static Component newKeybindComponent(@NotNull String key) { - if (serverVersion.getMinorVersion() >= 19) return loaderLatest.newKeybindComponent(key); - return loader1_14_4.newKeybindComponent(key); - } - - /** - * Sends message to command source. - * - * @param source - * Command source to send message to - * @param message - * Message to send - */ - public static void sendMessage(@NotNull CommandSourceStack source, @NotNull Component message) { - if (serverVersion.getMinorVersion() >= 19) loaderLatest.sendMessage(source, message); - else loader1_14_4.sendMessage(source, message); - } - - /** - * Sets style in a component to specified style. - * - * @param component - * Component to change style of - * @param style - * Style to use - */ - public static void setStyle(@NotNull Component component, @NotNull Style style) { - if (serverVersion.getMinorVersion() >= 19) loaderLatest.setStyle(component, style); - else if (serverVersion.getMinorVersion() >= 16) loader1_18_2.setStyle(component, style); - else loader1_14_4.setStyle(component, style); - } - - /** - * Sends message to player. - * - * @param player - * Player to send message to - * @param message - * Message to send - */ - public static void sendMessage(@NotNull ServerPlayer player, @NotNull Component message) { - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_21_2.getNetworkId()) loaderLatest.sendMessage(player, message); - else if (serverVersion.getMinorVersion() >= 19) loader1_20_3.sendMessage(player, message); - else if (serverVersion.getMinorVersion() >= 16) loader1_18_2.sendMessage(player, message); - else loader1_14_4.sendMessage(player, message); - } - - /** - * Returns {@code true} if packet is player info packet, {@code false} if not. - * - * @param packet - * Packet to check - * @return {@code true} if packet is player info packet, {@code false} if not - */ - public static boolean isPlayerInfo(@NotNull Packet packet) { - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_19_3.getNetworkId()) return loaderLatest.isPlayerInfo(packet); - return loader1_14_4.isPlayerInfo(packet); - } - - /** - * Processed player info packet for anti-override and similar. - * - * @param receiver - * Player who received the packet - * @param packet - * Received packet - */ - public static void onPlayerInfo(@NotNull TabPlayer receiver, @NotNull Object packet) { - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_21_4.getNetworkId()) loaderLatest.onPlayerInfo(receiver, packet); - else if (serverVersion.getNetworkId() >= ProtocolVersion.V1_21_2.getNetworkId()) loader1_21_3.onPlayerInfo(receiver, packet); - else if (serverVersion.getNetworkId() >= ProtocolVersion.V1_19_3.getNetworkId()) loader1_20_3.onPlayerInfo(receiver, packet); - else if (serverVersion.getMinorVersion() >= 17) loader1_18_2.onPlayerInfo(receiver, packet); - else loader1_14_4.onPlayerInfo(receiver, packet); - } - - /** - * Creates tablist entry packet using given parameters. - * - * @param action - * Tablist action - * @param builder - * Entry data - * @return Tablist entry packet with given parameters - */ - @NotNull - public static Packet buildTabListPacket(@NotNull TabList.Action action, @NotNull FabricTabList.Builder builder) { - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_21_4.getNetworkId()) return loaderLatest.buildTabListPacket(action, builder); - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_21_2.getNetworkId()) return loader1_21_3.buildTabListPacket(action, builder); - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_19_3.getNetworkId()) return loader1_20_3.buildTabListPacket(action, builder); - if (serverVersion.getMinorVersion() >= 17) return loader1_18_2.buildTabListPacket(action, builder); - return loader1_14_4.buildTabListPacket(action, builder); - } - - /** - * Returns player's world - * - * @param player - * Player to get world of - * @return Player's world - */ - @NotNull - public static Level getLevel(@NotNull ServerPlayer player) { - if (serverVersion.getMinorVersion() >= 20) return loaderLatest.getLevel(player); - return loader1_14_4.getLevel(player); - } - - /** - * Converts minecraft property class into TAB skin class. - * - * @param property - * Property to convert - * @return Converted skin - */ - @NotNull - public static TabList.Skin propertyToSkin(@NotNull Property property) { - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_20_2.getNetworkId()) return loaderLatest.propertyToSkin(property); - return loader1_14_4.propertyToSkin(property); - } - - /** - * Returns player's ping. - * - * @param player - * Player to get ping of - * @return Player's ping - */ - public static int getPing(@NotNull ServerPlayer player) { - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_20_2.getNetworkId()) return loaderLatest.getPing(player); - return loader1_14_4.getPing(player); - } - - /** - * Returns display slot of given display objective packet. - * - * @param packet - * Display objective packet - * @return Display slot of packet - */ - public static int getDisplaySlot(@NotNull ClientboundSetDisplayObjectivePacket packet) { - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_20_2.getNetworkId()) return loaderLatest.getDisplaySlot(packet); - return loader1_14_4.getDisplaySlot(packet); - } - - /** - * Creates display objective packet with given parameters. - * - * @param slot - * Display slot - * @param objective - * Objective to display - * @return Display objective packet with given parameters - */ - @NotNull - public static Packet setDisplaySlot(int slot, @NotNull Objective objective) { - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_20_2.getNetworkId()) return loaderLatest.setDisplaySlot(slot, objective); - return loader1_14_4.setDisplaySlot(slot, objective); - } - - /** - * Returns player's network channel. - * - * @param player - * Player to get channel of - * @return Player's channel - */ - @NotNull - public static Channel getChannel(@NotNull ServerPlayer player) { - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_20_2.getNetworkId()) return loaderLatest.getChannel(player); - return loader1_14_4.getChannel(player); - } - - /** - * Returns server's current milliseconds per tick. - * - * @param server - * Server to get MSPT value from - * @return Server's milliseconds per tick - */ - public static float getMSPT(@NotNull MinecraftServer server) { - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_20_3.getNetworkId()) return loaderLatest.getMSPT(server); - return loader1_14_4.getMSPT(server); - } - - /** - * Creates new remove score packet with given parameters. - * - * @param objective - * Objective to remove score from - * @param holder - * Score holder to remove - * @return Remove score packet with given parameters - */ - @NotNull - public static Packet removeScore(@NotNull String objective, @NotNull String holder) { - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_20_3.getNetworkId()) return loaderLatest.removeScore(objective, holder); - return loader1_14_4.removeScore(objective, holder); - } - - /** - * Creates new objective with given parameters. - * - * @param name - * Objective name - * @param displayName - * Objective display name - * @param renderType - * Score render type - * @param numberFormat - * Score number format (1.20.3+) - * @return New objective with given parameters - */ - @NotNull - public static Objective newObjective(@NotNull String name, @NotNull Component displayName, - @NotNull RenderType renderType, @Nullable TabComponent numberFormat) { - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_20_3.getNetworkId()) return loaderLatest.newObjective(name, displayName, renderType, numberFormat); - return loader1_14_4.newObjective(name, displayName, renderType, numberFormat); - } - - /** - * Creates a new set score packet with given parameters. - * - * @param objective - * Objective to set score in - * @param holder - * Score holder - * @param score - * Score value - * @param displayName - * Display name of score holder (1.20.3+) - * @param numberFormat - * Number format of score value (1.20.3+) - * @return New set score packet with given parameters - */ - @NotNull - public static Packet setScore(@NotNull String objective, @NotNull String holder, int score, - @Nullable Component displayName, @Nullable TabComponent numberFormat) { - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_20_5.getNetworkId()) return loaderLatest.setScore(objective, holder, score, displayName, numberFormat); - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_20_3.getNetworkId()) return loader1_20_3.setScore(objective, holder, score, displayName, numberFormat); - return loader1_14_4.setScore(objective, holder, score, displayName, numberFormat); - } - - /** - * Creates command source stack from ServerPlayer. - * - * @param player - * Player to create command source stack from - * @return command source stack from player - */ - @NotNull - public static CommandSourceStack createCommandSourceStack(@NotNull ServerPlayer player) { - if (serverVersion.getNetworkId() >= ProtocolVersion.V1_21_2.getNetworkId()) return loaderLatest.createCommandSourceStack(player); - return loader1_14_4.createCommandSourceStack(player); - } -} diff --git a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricPipelineInjector.java b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricPipelineInjector.java index 361023173..b5e59ca09 100644 --- a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricPipelineInjector.java +++ b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricPipelineInjector.java @@ -20,6 +20,6 @@ public FabricPipelineInjector() { @Override @NotNull protected Channel getChannel(@NotNull TabPlayer player) { - return FabricMultiVersion.getChannel(((FabricTabPlayer)player).getPlayer()); + return ((FabricTabPlayer)player).getPlayer().connection.connection.channel; } } diff --git a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricPlatform.java b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricPlatform.java index 0ec04d9cc..d4adee98f 100644 --- a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricPlatform.java +++ b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricPlatform.java @@ -24,7 +24,12 @@ import me.neznamy.tab.shared.platform.TabList; import me.neznamy.tab.shared.platform.TabPlayer; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.SharedConstants; 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 net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import org.jetbrains.annotations.NotNull; @@ -45,7 +50,7 @@ public class FabricPlatform implements BackendPlatform { private final MinecraftServer server; /** Server version */ - private final ProtocolVersion serverVersion = ProtocolVersion.fromFriendlyName(FabricTAB.minecraftVersion); + private final ProtocolVersion serverVersion = ProtocolVersion.fromFriendlyName(SharedConstants.getCurrentVersion().getName()); @Override public void registerUnknownPlaceholder(@NotNull String identifier) { @@ -57,9 +62,9 @@ public void registerUnknownPlaceholder(@NotNull String identifier) { PlaceholderManagerImpl manager = TAB.getInstance().getPlaceholderManager(); manager.registerPlayerPlaceholder(identifier, p -> Placeholders.parseText( - FabricMultiVersion.newTextComponent(identifier), - PlaceholderContext.of((ServerPlayer) p.getPlayer()) - ).getString() + Component.literal(identifier), + PlaceholderContext.of((ServerPlayer) p.getPlayer()) + ).getString() ); } @@ -97,18 +102,18 @@ public TabFeature getPerWorldPlayerList(@NotNull PerWorldPlayerListConfiguration @Override public void logInfo(@NotNull TabComponent message) { - FabricMultiVersion.logInfo(message); + MinecraftServer.LOGGER.info("[TAB] " + message.toRawText()); } @Override public void logWarn(@NotNull TabComponent message) { - FabricMultiVersion.logWarn(message); + MinecraftServer.LOGGER.warn("[TAB] " + message.toRawText()); } @Override @NotNull public String getServerVersionInfo() { - return "[Fabric] " + FabricTAB.minecraftVersion; + return "[Fabric] " + SharedConstants.getCurrentVersion().getName(); } @Override @@ -136,19 +141,31 @@ public File getDataFolder() { @NotNull public Component convertComponent(@NotNull TabComponent component) { // Component type - Component nmsComponent; + MutableComponent nmsComponent; if (component instanceof TextComponent) { - nmsComponent = FabricMultiVersion.newTextComponent(((TextComponent) component).getText()); + nmsComponent = Component.literal(((TextComponent) component).getText()); } else if (component instanceof TranslatableComponent) { - nmsComponent = FabricMultiVersion.newTranslatableComponent(((TranslatableComponent) component).getKey()); + nmsComponent = Component.translatable(((TranslatableComponent) component).getKey()); } else if (component instanceof KeybindComponent) { - nmsComponent = FabricMultiVersion.newKeybindComponent(((KeybindComponent) component).getKeybind()); + nmsComponent = Component.keybind(((KeybindComponent) component).getKeybind()); } else { throw new IllegalStateException("Unexpected component type: " + component.getClass().getName()); } // Component style - FabricMultiVersion.setStyle(nmsComponent, FabricMultiVersion.convertModifier(component.getModifier())); + nmsComponent.setStyle(new Style( + component.getModifier().getColor() == null ? null : TextColor.fromRgb(component.getModifier().getColor().getRgb()), + component.getModifier().getShadowColor(), + component.getModifier().getBold(), + component.getModifier().getItalic(), + component.getModifier().getUnderlined(), + component.getModifier().getStrikethrough(), + component.getModifier().getObfuscated(), + null, + null, + null, + component.getModifier().getFont() == null ? null : ResourceLocation.tryParse(component.getModifier().getFont()) + )); // Extra for (TabComponent extra : component.getExtra()) { @@ -178,12 +195,12 @@ public TabList createTabList(@NotNull TabPlayer player) { @Override public boolean supportsNumberFormat() { - return serverVersion.getNetworkId() >= ProtocolVersion.V1_20_3.getNetworkId(); + return true; } @Override public boolean supportsListOrder() { - return serverVersion.getNetworkId() >= ProtocolVersion.V1_21_2.getNetworkId(); + return true; } @Override @@ -200,6 +217,6 @@ public double getTPS() { @Override public double getMSPT() { - return FabricMultiVersion.getMSPT(server); + return (float) server.getAverageTickTimeNanos() / 1000000; } } diff --git a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricScoreboard.java b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricScoreboard.java index 432155808..2e04f1842 100644 --- a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricScoreboard.java +++ b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricScoreboard.java @@ -4,14 +4,16 @@ import me.neznamy.tab.shared.TAB; import me.neznamy.tab.shared.platform.decorators.SafeScoreboard; import net.minecraft.ChatFormatting; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientboundSetDisplayObjectivePacket; -import net.minecraft.network.protocol.game.ClientboundSetObjectivePacket; +import net.minecraft.network.chat.numbers.FixedFormat; +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 net.minecraft.world.scores.criteria.ObjectiveCriteria.RenderType; import org.jetbrains.annotations.NotNull; +import java.util.Optional; + /** * Scoreboard implementation for Fabric using packets. */ @@ -34,15 +36,18 @@ public FabricScoreboard(FabricTabPlayer player) { @Override public void registerObjective(@NonNull Objective objective) { - net.minecraft.world.scores.Objective obj = FabricMultiVersion.newObjective( + net.minecraft.world.scores.Objective obj = new net.minecraft.world.scores.Objective( + dummyScoreboard, objective.getName(), + ObjectiveCriteria.DUMMY, objective.getTitle().convert(), RenderType.values()[objective.getHealthDisplay().ordinal()], - objective.getNumberFormat() + false, + objective.getNumberFormat() == null ? null : objective.getNumberFormat().toFixedFormat(FixedFormat::new) ); objective.setPlatformObjective(obj); player.sendPacket(new ClientboundSetObjectivePacket(obj, ObjectiveAction.REGISTER)); - player.sendPacket(FabricMultiVersion.setDisplaySlot(objective.getDisplaySlot().ordinal(), obj)); + player.sendPacket(new ClientboundSetDisplayObjectivePacket(net.minecraft.world.scores.DisplaySlot.values()[objective.getDisplaySlot().ordinal()], obj)); } @Override @@ -60,14 +65,18 @@ public void updateObjective(@NonNull Objective objective) { @Override public void setScore(@NonNull Score score) { - player.sendPacket(FabricMultiVersion.setScore(score.getObjective().getName(), score.getHolder(), score.getValue(), - score.getDisplayName() == null ? null : score.getDisplayName().convert(), - score.getNumberFormat())); + player.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) { - player.sendPacket(FabricMultiVersion.removeScore(score.getObjective().getName(), score.getHolder())); + player.sendPacket(new ClientboundResetScorePacket(score.getHolder(), score.getObjective().getName())); } @Override @@ -81,18 +90,18 @@ public void registerTeam(@NonNull Team team) { updateTeamProperties(team); PlayerTeam t = (PlayerTeam) team.getPlatformTeam(); t.getPlayers().addAll(team.getPlayers()); - player.sendPacket(FabricMultiVersion.registerTeam(t)); + player.sendPacket(ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(t, true)); } @Override public void unregisterTeam(@NonNull Team team) { - player.sendPacket(FabricMultiVersion.unregisterTeam((PlayerTeam) team.getPlatformTeam())); + player.sendPacket(ClientboundSetPlayerTeamPacket.createRemovePacket((PlayerTeam) team.getPlatformTeam())); } @Override public void updateTeam(@NonNull Team team) { updateTeamProperties(team); - player.sendPacket(FabricMultiVersion.updateTeam((PlayerTeam) team.getPlatformTeam())); + player.sendPacket(ClientboundSetPlayerTeamPacket.createAddOrModifyPacket((PlayerTeam) team.getPlatformTeam(), false)); } private void updateTeamProperties(@NonNull Team team) { @@ -110,14 +119,17 @@ private void updateTeamProperties(@NonNull Team team) { public void onPacketSend(@NonNull Object packet) { if (isAntiOverrideScoreboard()) { if (packet instanceof ClientboundSetDisplayObjectivePacket display) { - TAB.getInstance().getFeatureManager().onDisplayObjective(player, FabricMultiVersion.getDisplaySlot(display), display.objectiveName); + TAB.getInstance().getFeatureManager().onDisplayObjective(player, display.getSlot().ordinal(), display.objectiveName); } if (packet instanceof ClientboundSetObjectivePacket objective) { TAB.getInstance().getFeatureManager().onObjective(player, objective.method, objective.objectiveName); } } if (isAntiOverrideTeams()) { - FabricMultiVersion.checkTeamPacket((Packet) packet, this); + if (packet instanceof ClientboundSetPlayerTeamPacket team) { + if (team.method == TeamAction.UPDATE) return; + team.players = onTeamPacket(team.method, team.getName(), team.players); + } } } } diff --git a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricTAB.java b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricTAB.java index 26321a4a6..af04d6007 100644 --- a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricTAB.java +++ b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricTAB.java @@ -1,41 +1,32 @@ package me.neznamy.tab.platforms.fabric; -import lombok.SneakyThrows; import me.neznamy.tab.shared.TAB; -import me.neznamy.tab.shared.util.ReflectionUtils; import net.fabricmc.api.DedicatedServerModInitializer; +import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; -import net.minecraft.SharedConstants; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.storage.ServerLevelData; +import org.jetbrains.annotations.NotNull; /** * Main class for Fabric. */ public class FabricTAB implements DedicatedServerModInitializer { - /** Minecraft version string */ - public static final String minecraftVersion = getServerVersion(); - @Override public void onInitializeServer() { - if (ReflectionUtils.classExists("net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback")) { - net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback.EVENT.register((dispatcher, $, $$) -> new FabricTabCommand().onRegisterCommands(dispatcher)); - } else { - net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback.EVENT.register((dispatcher, $) -> new FabricTabCommand().onRegisterCommands(dispatcher)); - } + CommandRegistrationCallback.EVENT.register((dispatcher, $, $$) -> new FabricTabCommand().onRegisterCommands(dispatcher)); ServerLifecycleEvents.SERVER_STARTING.register(server -> TAB.create(new FabricPlatform(server))); ServerLifecycleEvents.SERVER_STOPPING.register($ -> TAB.getInstance().unload()); } - @SneakyThrows - private static String getServerVersion() { - try { - // 1.19.4+ - return SharedConstants.getCurrentVersion().getName(); - } catch (Throwable e) { - // 1.19.3- - @SuppressWarnings("JavaReflectionMemberAccess") // Fabric-mapped method name - Object gameVersion = SharedConstants.class.getMethod("method_16673").invoke(null); - return (String) gameVersion.getClass().getMethod("getName").invoke(gameVersion); - } + @NotNull + public static String getLevelName(@NotNull Level level) { + String path = level.dimension().location().getPath(); + return ((ServerLevelData)level.getLevelData()).getLevelName() + switch (path) { + case "overworld" -> ""; // No suffix for overworld + case "the_nether" -> "_nether"; + default -> "_" + path; // End + default behavior for other dimensions created by mods + }; } } diff --git a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricTabCommand.java b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricTabCommand.java index 765f391cd..005070a51 100644 --- a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricTabCommand.java +++ b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricTabCommand.java @@ -62,7 +62,7 @@ private int executeCommand(@NotNull CommandSourceStack source, @NotNull String[] boolean hasReloadPermission = PermissionsAPIHook.hasPermission(source, TabConstants.Permission.COMMAND_RELOAD); boolean hasAdminPermission = PermissionsAPIHook.hasPermission(source, TabConstants.Permission.COMMAND_ALL); for (String message : TAB.getInstance().getDisabledCommand().execute(args, hasReloadPermission, hasAdminPermission)) { - FabricMultiVersion.sendMessage(source, TabComponent.fromColoredText(message).convert()); + source.sendSystemMessage(TabComponent.fromColoredText(message).convert()); } } else { if (source.getEntity() == null) { diff --git a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricTabList.java b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricTabList.java index 6fe5247a4..f77de3f47 100644 --- a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricTabList.java +++ b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricTabList.java @@ -2,23 +2,34 @@ import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; -import lombok.*; -import me.neznamy.tab.shared.ProtocolVersion; +import lombok.NonNull; import me.neznamy.chat.component.TabComponent; +import me.neznamy.tab.shared.TAB; import me.neznamy.tab.shared.platform.TabList; import me.neznamy.tab.shared.platform.decorators.TrackedTabList; 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.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.UUID; +import java.util.*; /** * TabList implementation for Fabric using packets. */ public class FabricTabList extends TrackedTabList { + private static final EnumSet addPlayer = EnumSet.allOf(ClientboundPlayerInfoUpdatePacket.Action.class); + private static final EnumSet updateDisplayName = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME); + private static final EnumSet updateLatency = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LATENCY); + private static final EnumSet updateGameMode = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE); + private static final EnumSet updateListed = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LISTED); + private static final EnumSet updateListOrder = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LIST_ORDER); + private static final EnumSet updateHat = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_HAT); + /** * Constructs new instance. * @@ -31,62 +42,48 @@ public FabricTabList(@NotNull FabricTabPlayer player) { @Override public void removeEntry(@NonNull UUID entry) { - player.sendPacket(FabricMultiVersion.buildTabListPacket(Action.REMOVE_PLAYER, - new Builder(entry, "", null, false, 0, 0, null, 0, false))); + player.sendPacket(new ClientboundPlayerInfoRemovePacket(Collections.singletonList(entry))); } @Override public void updateDisplayName0(@NonNull UUID entry, @Nullable TabComponent displayName) { - player.sendPacket(FabricMultiVersion.buildTabListPacket(Action.UPDATE_DISPLAY_NAME, - new Builder(entry, "", null, false, 0, 0, displayName == null ? null : displayName.convert(), 0, false))); + sendPacket(updateDisplayName, entry, "", null, false, 0, 0, displayName, 0, false); } @Override public void updateLatency(@NonNull UUID entry, int latency) { - player.sendPacket(FabricMultiVersion.buildTabListPacket(Action.UPDATE_LATENCY, - new Builder(entry, "", null, false, latency, 0, null, 0, false))); + sendPacket(updateLatency, entry, "", null, false, latency, 0, null, 0, false); } @Override public void updateGameMode(@NonNull UUID entry, int gameMode) { - player.sendPacket(FabricMultiVersion.buildTabListPacket(Action.UPDATE_GAME_MODE, - new Builder(entry, "", null, false, 0, gameMode, null, 0, false))); + sendPacket(updateGameMode, entry, "", null, false, 0, gameMode, null, 0, false); } @Override public void updateListed(@NonNull UUID entry, boolean listed) { - if (player.getPlatform().getServerVersion().getNetworkId() >= ProtocolVersion.V1_19_3.getNetworkId()) { - player.sendPacket(FabricMultiVersion.buildTabListPacket(Action.UPDATE_LISTED, - new Builder(entry, "", null, listed, 0, 0, null, 0, false))); - } + sendPacket(updateListed, entry, "", null, listed, 0, 0, null, 0, false); } @Override public void updateListOrder(@NonNull UUID entry, int listOrder) { - if (player.getPlatform().getServerVersion().getNetworkId() >= ProtocolVersion.V1_21_2.getNetworkId()) { - player.sendPacket(FabricMultiVersion.buildTabListPacket(Action.UPDATE_LIST_ORDER, - new Builder(entry, "", null, false, 0, 0, null, listOrder, false))); - } + sendPacket(updateListOrder, entry, "", null, false, 0, 0, null, listOrder, false); } @Override public void updateHat(@NonNull UUID entry, boolean showHat) { - if (player.getPlatform().getServerVersion().getNetworkId() >= ProtocolVersion.V1_21_4.getNetworkId()) { - player.sendPacket(FabricMultiVersion.buildTabListPacket(Action.UPDATE_HAT, - new Builder(entry, "", null, false, 0, 0, null, 0, showHat))); - } + sendPacket(updateHat, entry, "", null, false, 0, 0, null, 0, showHat); } @Override public void addEntry0(@NonNull Entry entry) { - player.sendPacket(FabricMultiVersion.buildTabListPacket(Action.ADD_PLAYER, - new Builder(entry.getUniqueId(), entry.getName(), entry.getSkin(), entry.isListed(), entry.getLatency(), - entry.getGameMode(), entry.getDisplayName() == null ? null : entry.getDisplayName().convert(), entry.getListOrder(), entry.isShowHat()))); + sendPacket(addPlayer, entry.getUniqueId(), entry.getName(), entry.getSkin(), entry.isListed(), entry.getLatency(), + entry.getGameMode(), entry.getDisplayName(), entry.getListOrder(), entry.isShowHat()); } @Override public void setPlayerListHeaderFooter(@NonNull TabComponent header, @NonNull TabComponent footer) { - player.sendPacket(FabricMultiVersion.newHeaderFooter(header.convert(), footer.convert())); + player.sendPacket(new ClientboundTabListPacket(header.convert(), footer.convert())); } @Override @@ -96,41 +93,65 @@ public boolean containsEntry(@NonNull UUID entry) { @Override public void onPacketSend(@NonNull Object packet) { - if (FabricMultiVersion.isPlayerInfo((Packet) packet)) { - FabricMultiVersion.onPlayerInfo(player, packet); + if (packet instanceof ClientboundPlayerInfoUpdatePacket info) { + EnumSet actions = info.actions(); + List updatedList = new ArrayList<>(); + for (ClientboundPlayerInfoUpdatePacket.Entry nmsData : info.entries()) { + GameProfile profile = nmsData.profile(); + Component displayName = nmsData.displayName(); + int latency = nmsData.latency(); + if (actions.contains(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME)) { + TabComponent expectedDisplayName = ((TrackedTabList)player.getTabList()).getExpectedDisplayNames().get(nmsData.profileId()); + if (expectedDisplayName != null) displayName = expectedDisplayName.convert(); + } + if (actions.contains(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LATENCY)) { + latency = TAB.getInstance().getFeatureManager().onLatencyChange(player, nmsData.profileId(), latency); + } + if (actions.contains(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER)) { + TAB.getInstance().getFeatureManager().onEntryAdd(player, nmsData.profileId(), profile.getName()); + } + updatedList.add(new ClientboundPlayerInfoUpdatePacket.Entry(nmsData.profileId(), profile, nmsData.listed(), + latency, nmsData.gameMode(), displayName, nmsData.showHat(), nmsData.listOrder(), nmsData.chatSession())); + } + info.entries = updatedList; } } + + private void sendPacket(@NonNull EnumSet action, @NonNull UUID id, @NonNull String name, @Nullable Skin skin, + boolean listed, int latency, int gameMode, @Nullable TabComponent displayName, int listOrder, boolean showHat) { + ClientboundPlayerInfoUpdatePacket packet = new ClientboundPlayerInfoUpdatePacket(action, Collections.emptyList()); + packet.entries = Collections.singletonList(new ClientboundPlayerInfoUpdatePacket.Entry( + id, + action.contains(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER) ? createProfile(id, name, skin) : null, + listed, + latency, + GameType.byId(gameMode), + displayName == null ? null : displayName.convert(), + showHat, + listOrder, + null + )); + player.sendPacket(packet); + } /** - * TabList entry builder. + * Creates GameProfile from given parameters. + * + * @param id + * Profile ID + * @param name + * Profile name + * @param skin + * Player skin + * @return GameProfile from given parameters */ - @AllArgsConstructor - @Getter - public static class Builder { - - @NonNull private final UUID id; - @NonNull private String name; - @Nullable private Skin skin; - private boolean listed; - private int latency; - private int gameMode; - @Nullable private Component displayName; - private int listOrder; - private boolean showHat; - - /** - * Creates profile of this entry. - * - * @return Profile of this entry - */ - @NotNull - public GameProfile createProfile() { - 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; + @NotNull + private GameProfile createProfile(@NonNull UUID id, @NonNull 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; } } diff --git a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricTabPlayer.java b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricTabPlayer.java index 55c949f78..0d705496d 100644 --- a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricTabPlayer.java +++ b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/FabricTabPlayer.java @@ -27,22 +27,22 @@ public class FabricTabPlayer extends BackendTabPlayer { */ public FabricTabPlayer(@NotNull FabricPlatform platform, @NotNull ServerPlayer player) { super(platform, player, player.getUUID(), player.getGameProfile().getName(), - FabricMultiVersion.getLevelName(FabricMultiVersion.getLevel(player)), platform.getServerVersion().getNetworkId()); + FabricTAB.getLevelName(player.level()), platform.getServerVersion().getNetworkId()); } @Override public boolean hasPermission(@NotNull String permission) { - return PermissionsAPIHook.hasPermission(FabricMultiVersion.createCommandSourceStack(getPlayer()), permission); + return PermissionsAPIHook.hasPermission(getPlayer().createCommandSourceStack(), permission); } @Override public int getPing() { - return FabricMultiVersion.getPing(getPlayer()); + return getPlayer().connection.latency(); } @Override public void sendMessage(@NotNull TabComponent message) { - FabricMultiVersion.sendMessage(getPlayer(), message.convert()); + getPlayer().sendSystemMessage(message.convert()); } @Override @@ -60,7 +60,8 @@ public boolean isDisguised() { public TabList.Skin getSkin() { Collection properties = getPlayer().getGameProfile().getProperties().get(TabList.TEXTURES_PROPERTY); if (properties.isEmpty()) return null; // Offline mode - return FabricMultiVersion.propertyToSkin(properties.iterator().next()); + Property property = properties.iterator().next(); + return new TabList.Skin(property.value(), property.signature()); } @Override @@ -96,7 +97,7 @@ public String getDisplayName() { } /** - * Sends packet to the player + * Sends the packet to the player. * * @param packet * Packet to send diff --git a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/hook/FabricTabExpansion.java b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/hook/FabricTabExpansion.java index 7c2ca9b34..82e89af9d 100644 --- a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/hook/FabricTabExpansion.java +++ b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/hook/FabricTabExpansion.java @@ -5,12 +5,12 @@ import eu.pb4.placeholders.api.PlaceholderResult; import eu.pb4.placeholders.api.Placeholders; import lombok.Getter; -import me.neznamy.tab.platforms.fabric.FabricMultiVersion; import me.neznamy.tab.shared.TAB; import me.neznamy.tab.shared.TabConstants; import me.neznamy.tab.shared.features.PlaceholderManagerImpl; import me.neznamy.tab.shared.placeholders.expansion.TabExpansion; import me.neznamy.tab.shared.platform.TabPlayer; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; @@ -59,7 +59,7 @@ public FabricTabExpansion() { for (String placeholder : PlaceholderManagerImpl.detectPlaceholders(text)) { text = text.replace(placeholder, TAB.getInstance().getPlaceholderManager().findReplacement(placeholder, Placeholders.parseText( - FabricMultiVersion.newTextComponent(placeholder), + Component.literal(placeholder), PlaceholderContext.of(ctx.player()) ).getString())); } diff --git a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader.java b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader.java deleted file mode 100644 index 62f623cbb..000000000 --- a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader.java +++ /dev/null @@ -1,398 +0,0 @@ -package me.neznamy.tab.platforms.fabric.loader; - -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.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; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Style; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientboundSetDisplayObjectivePacket; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.Level; -import net.minecraft.world.scores.Objective; -import net.minecraft.world.scores.PlayerTeam; -import net.minecraft.world.scores.Scoreboard; -import net.minecraft.world.scores.criteria.ObjectiveCriteria.RenderType; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * Interface for executing methods that have changed over the versions. - * Each implementation of this interface is compiled for a different version of Minecraft. - * Then, internal logic is used to decide which implementation to use for each method - * based on server version. - */ -public interface Loader { - - /** Dummy scoreboard for objectives */ - Scoreboard dummyScoreboard = new Scoreboard(); - - /** - * Returns name of specified world. - * - * @param level - * World to get name of - * @return Name of the world - */ - @NotNull - default String getLevelName(@NotNull Level level) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Converts minecraft property class into TAB skin class. - * - * @param property - * Property to convert - * @return Converted skin - */ - @NotNull - default TabList.Skin propertyToSkin(@NotNull Property property) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Creates new text component using given text. - * - * @param text - * Component text - * @return Text component with given text - */ - @NotNull - default Component newTextComponent(@NotNull String text) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Creates new translatable component using given text. - * - * @param text - * Text to translate - * @return Text component with given text - */ - @NotNull - default Component newTranslatableComponent(@NotNull String text) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Creates new keybind component using given text. - * - * @param key - * Key bind - * @return Text component with given text - */ - @NotNull - default Component newKeybindComponent(@NotNull String key) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Converts TAB's ChatModifier class to Minecraft Style class. - * - * @param modifier - * Modifier to convert - * @return Converted style - */ - @NotNull - default Style convertModifier(@NotNull ChatModifier modifier) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Creates team register packet using given team. - * - * @param team - * Team to register - * @return Team register packet using given team - */ - @NotNull - default Packet registerTeam(@NotNull PlayerTeam team) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Creates team unregister packet using given team. - * - * @param team - * Team to unregister - * @return Team unregister packet using given team - */ - @NotNull - default Packet unregisterTeam(@NotNull PlayerTeam team) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Creates team update packet using given team. - * - * @param team - * Team to update - * @return Team update packet using given team - */ - @NotNull - default Packet updateTeam(@NotNull PlayerTeam team) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Sends message to player. - * - * @param player - * Player to send message to - * @param message - * Message to send - */ - default void sendMessage(@NotNull ServerPlayer player, @NotNull Component message) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Sends message to command source. - * - * @param source - * Command source to send message to - * @param message - * Message to send - */ - default void sendMessage(@NotNull CommandSourceStack source, @NotNull Component message) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Creates new Header/Footer packet with given parameters. - * - * @param header - * Header to use - * @param footer - * Footer to use - * @return Packet with given parameters - */ - @NotNull - default Packet newHeaderFooter(@NotNull Component header, @NotNull Component footer) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Checks outgoing team packet in pipeline to potentially remove players from it. - * - * @param packet - * Packet to check - * @param scoreboard - * Scoreboard of player who received the packet - */ - default void checkTeamPacket(@NotNull Packet packet, @NotNull FabricScoreboard scoreboard) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Returns {@code true} if packet is player info packet, {@code false} if not. - * - * @param packet - * Packet to check - * @return {@code true} if packet is player info packet, {@code false} if not - */ - default boolean isPlayerInfo(@NotNull Packet packet) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Processed player info packet for anti-override and similar. - * - * @param receiver - * Player who received the packet - * @param packet - * Received packet - */ - default void onPlayerInfo(@NotNull TabPlayer receiver, @NotNull Object packet) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Creates tablist entry packet using given parameters. - * - * @param action - * Tablist action - * @param builder - * Entry data - * @return Tablist entry packet with given parameters - */ - @NotNull - default Packet buildTabListPacket(@NotNull TabList.Action action, @NotNull FabricTabList.Builder builder) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Returns player's world - * - * @param player - * Player to get world of - * @return Player's world - */ - @NotNull - default Level getLevel(@NotNull ServerPlayer player) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Returns player's ping. - * - * @param player - * Player to get ping of - * @return Player's ping - */ - default int getPing(@NotNull ServerPlayer player) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Returns display slot of given display objective packet. - * - * @param packet - * Display objective packet - * @return Display slot of packet - */ - default int getDisplaySlot(@NotNull ClientboundSetDisplayObjectivePacket packet) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Creates display objective packet with given parameters. - * - * @param slot - * Display slot - * @param objective - * Objective to display - * @return Display objective packet with given parameters - */ - @NotNull - default Packet setDisplaySlot(int slot, @NotNull Objective objective) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Returns player's network channel. - * - * @param player - * Player to get channel of - * @return Player's channel - */ - @NotNull - default Channel getChannel(@NotNull ServerPlayer player) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Returns server's current milliseconds per tick. - * - * @param server - * Server to get MSPT value from - * @return Server's milliseconds per tick - */ - default float getMSPT(@NotNull MinecraftServer server) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Creates new remove score packet with given parameters. - * - * @param objective - * Objective to remove score from - * @param holder - * Score holder to remove - * @return Remove score packet with given parameters - */ - @NotNull - default Packet removeScore(@NotNull String objective, @NotNull String holder) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Creates new objective with given parameters. - * - * @param name - * Objective name - * @param displayName - * Objective display name - * @param renderType - * Score render type - * @param numberFormat - * Score number format (1.20.3+) - * @return New objective with given parameters - */ - @NotNull - default Objective newObjective(@NotNull String name, @NotNull Component displayName, @NotNull RenderType renderType, @Nullable TabComponent numberFormat) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Creates a new set score packet with given parameters. - * - * @param objective - * Objective to set score in - * @param holder - * Score holder - * @param score - * Score value - * @param displayName - * Display name of score holder (1.20.3+) - * @param numberFormat - * Number format of score value (1.20.3+) - * @return New set score packet with given parameters - */ - @NotNull - default Packet setScore(@NotNull String objective, @NotNull String holder, int score, @Nullable Component displayName, @Nullable TabComponent numberFormat) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Sets style in a component to specified style. - * - * @param component - * Component to change style of - * @param style - * Style to use - */ - default void setStyle(@NotNull Component component, @NotNull Style style) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Logs console message as info. - * - * @param message - * Message to log - */ - default void logInfo(@NotNull TabComponent message) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Logs console message as warn. - * - * @param message - * Message to log - */ - default void logWarn(@NotNull TabComponent message) { - throw new UnsupportedOperationException("Not implemented."); - } - - /** - * Creates command source stack from ServerPlayer. - * - * @param player - * Player to create command source stack from - * @return command source stack from player - */ - @NotNull - default CommandSourceStack createCommandSourceStack(@NotNull ServerPlayer player) { - throw new UnsupportedOperationException("Not implemented."); - } -} diff --git a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_Latest.java b/fabric/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_Latest.java deleted file mode 100644 index 90b7f7c6c..000000000 --- a/fabric/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_Latest.java +++ /dev/null @@ -1,303 +0,0 @@ -package me.neznamy.tab.platforms.fabric.loader; - -import com.mojang.authlib.GameProfile; -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.TAB; -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; -import me.neznamy.tab.shared.platform.decorators.TrackedTabList; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.network.chat.*; -import net.minecraft.network.chat.numbers.FixedFormat; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.*; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.GameType; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.storage.ServerLevelData; -import net.minecraft.world.scores.DisplaySlot; -import net.minecraft.world.scores.Objective; -import net.minecraft.world.scores.PlayerTeam; -import net.minecraft.world.scores.criteria.ObjectiveCriteria; -import net.minecraft.world.scores.criteria.ObjectiveCriteria.RenderType; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.*; - -/** - * Implementation containing methods in the state of the latest supported - * Minecraft version by the mod. - */ -@SuppressWarnings("DataFlowIssue") // Profile is not null on add action -public class Loader_Latest implements Loader { - - @Override - @NotNull - public String getLevelName(@NotNull Level level) { - String path = level.dimension().location().getPath(); - return ((ServerLevelData)level.getLevelData()).getLevelName() + switch (path) { - case "overworld" -> ""; // No suffix for overworld - case "the_nether" -> "_nether"; - default -> "_" + path; // End + default behavior for other dimensions created by mods - }; - } - - @Override - @NotNull - public TabList.Skin propertyToSkin(@NotNull Property property) { - return new TabList.Skin(property.value(), property.signature()); - } - - @Override - @NotNull - public Component newTextComponent(@NotNull String text) { - return Component.literal(text); - } - - @Override - @NotNull - public Component newTranslatableComponent(@NotNull String text) { - return Component.translatable(text); - } - - @Override - @NotNull - public Component newKeybindComponent(@NotNull String key) { - return Component.keybind(key); - } - - @Override - @NotNull - public Style convertModifier(@NotNull ChatModifier modifier) { - 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 - @NotNull - public Packet registerTeam(@NotNull PlayerTeam team) { - return ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(team, true); - } - - @Override - @NotNull - public Packet unregisterTeam(@NotNull PlayerTeam team) { - return ClientboundSetPlayerTeamPacket.createRemovePacket(team); - } - - @Override - @NotNull - public Packet updateTeam(@NotNull PlayerTeam team) { - return ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(team, false); - } - - @Override - public void sendMessage(@NotNull ServerPlayer player, @NotNull Component message) { - player.sendSystemMessage(message); - } - - @Override - public void sendMessage(@NotNull CommandSourceStack source, @NotNull Component message) { - source.sendSystemMessage(message); - } - - @Override - @NotNull - public Packet newHeaderFooter(@NotNull Component header, @NotNull Component footer) { - return new ClientboundTabListPacket(header, footer); - } - - @Override - public void checkTeamPacket(@NotNull Packet packet, @NotNull FabricScoreboard scoreboard) { - if (packet instanceof ClientboundSetPlayerTeamPacket team) { - if (team.method == Scoreboard.TeamAction.UPDATE) return; - team.players = scoreboard.onTeamPacket(team.method, team.getName(), team.players); - } - } - - @Override - public boolean isPlayerInfo(@NotNull Packet packet) { - return packet instanceof ClientboundPlayerInfoUpdatePacket; - } - - @Override - public void onPlayerInfo(@NotNull TabPlayer receiver, @NotNull Object packet0) { - ClientboundPlayerInfoUpdatePacket packet = (ClientboundPlayerInfoUpdatePacket) packet0; - EnumSet actions = packet.actions(); - List updatedList = new ArrayList<>(); - for (ClientboundPlayerInfoUpdatePacket.Entry nmsData : packet.entries()) { - GameProfile profile = nmsData.profile(); - Component displayName = nmsData.displayName(); - int latency = nmsData.latency(); - if (actions.contains(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME)) { - TabComponent expectedDisplayName = ((TrackedTabList)receiver.getTabList()).getExpectedDisplayNames().get(nmsData.profileId()); - if (expectedDisplayName != null) displayName = expectedDisplayName.convert(); - } - if (actions.contains(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LATENCY)) { - latency = TAB.getInstance().getFeatureManager().onLatencyChange(receiver, nmsData.profileId(), latency); - } - if (actions.contains(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER)) { - TAB.getInstance().getFeatureManager().onEntryAdd(receiver, nmsData.profileId(), profile.getName()); - } - updatedList.add(new ClientboundPlayerInfoUpdatePacket.Entry(nmsData.profileId(), profile, nmsData.listed(), - latency, nmsData.gameMode(), displayName, nmsData.showHat(), nmsData.listOrder(), nmsData.chatSession())); - } - packet.entries = updatedList; - } - - @Override - @NotNull - public Packet buildTabListPacket(@NotNull TabList.Action action, @NotNull FabricTabList.Builder entry) { - if (action == TabList.Action.REMOVE_PLAYER) { - return new ClientboundPlayerInfoRemovePacket(Collections.singletonList(entry.getId())); - } - ClientboundPlayerInfoUpdatePacket packet = new ClientboundPlayerInfoUpdatePacket(Register1_19_3.actionMap.get(action), Collections.emptyList()); - packet.entries = Collections.singletonList(new ClientboundPlayerInfoUpdatePacket.Entry( - entry.getId(), - action == TabList.Action.ADD_PLAYER ? entry.createProfile() : null, - entry.isListed(), - entry.getLatency(), - GameType.byId(entry.getGameMode()), - entry.getDisplayName(), - entry.isShowHat(), - entry.getListOrder(), - null - )); - return packet; - } - - @Override - @NotNull - public Level getLevel(@NotNull ServerPlayer player) { - return player.level(); - } - - @Override - public int getPing(@NotNull ServerPlayer player) { - return player.connection.latency(); - } - - @Override - public int getDisplaySlot(@NotNull ClientboundSetDisplayObjectivePacket packet) { - return packet.getSlot().ordinal(); - } - - @Override - @NotNull - public Packet setDisplaySlot(int slot, @NotNull Objective objective) { - return new ClientboundSetDisplayObjectivePacket(DisplaySlot.values()[slot], objective); - } - - @Override - @NotNull - public Channel getChannel(@NotNull ServerPlayer player) { - return player.connection.connection.channel; - } - - @Override - public float getMSPT(@NotNull MinecraftServer server) { - return (float) server.getAverageTickTimeNanos() / 1000000; - } - - @Override - @NotNull - public Packet removeScore(@NotNull String objective, @NotNull String holder) { - return new ClientboundResetScorePacket(holder, objective); - } - - @Override - @NotNull - public Objective newObjective(@NotNull String name, @NotNull Component displayName, - @NotNull RenderType renderType, @Nullable TabComponent numberFormat) { - return Register1_20_3.newObjective(name, displayName, renderType, numberFormat); - } - - @Override - @NotNull - public Packet setScore(@NotNull String objective, @NotNull String holder, int score, @Nullable Component displayName, @Nullable TabComponent numberFormat) { - return Register1_20_3.setScore(objective, holder, score, displayName, numberFormat); - } - - @Override - public void setStyle(@NotNull Component component, @NotNull Style style) { - ((MutableComponent)component).setStyle(style); - } - - @Override - public void logInfo(@NotNull TabComponent message) { - MinecraftServer.LOGGER.info("[TAB] " + message.toRawText()); - } - - @Override - public void logWarn(@NotNull TabComponent message) { - MinecraftServer.LOGGER.warn("[TAB] " + message.toRawText()); - } - - @NotNull - @Override - public CommandSourceStack createCommandSourceStack(@NotNull ServerPlayer player) { - return player.createCommandSourceStack(); - } - - /** - * Why is this needed? Because otherwise it throws error about a class - * not existing despite the code never running. - * Why? Nobody knows. - */ - public static class Register1_20_3 { - - @NotNull - public static Objective newObjective(@NotNull String name, @NotNull Component displayName, - @NotNull RenderType renderType, @Nullable TabComponent numberFormat) { - return new Objective(dummyScoreboard, name, ObjectiveCriteria.DUMMY, displayName, renderType, false, toFixedFormat(numberFormat)); - } - - @NotNull - public static Packet setScore(@NotNull String objective, @NotNull String holder, int score, @Nullable Component displayName, @Nullable TabComponent numberFormat) { - return new ClientboundSetScorePacket(holder, objective, score, Optional.ofNullable(displayName), Optional.ofNullable(toFixedFormat(numberFormat))); - } - - @Nullable - public static FixedFormat toFixedFormat(@Nullable TabComponent component) { - if (component == null) return null; - return component.toFixedFormat(FixedFormat::new); - } - } - - private static class Register1_19_3 { - - static final Map> actionMap = createActionMap(); - - private static Map> createActionMap() { - Map> actions = new EnumMap<>(TabList.Action.class); - actions.put(TabList.Action.ADD_PLAYER, EnumSet.allOf(ClientboundPlayerInfoUpdatePacket.Action.class)); - actions.put(TabList.Action.UPDATE_GAME_MODE, EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE)); - actions.put(TabList.Action.UPDATE_DISPLAY_NAME, EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME)); - actions.put(TabList.Action.UPDATE_LATENCY, EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LATENCY)); - actions.put(TabList.Action.UPDATE_LISTED, EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LISTED)); - actions.put(TabList.Action.UPDATE_LIST_ORDER, EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LIST_ORDER)); - actions.put(TabList.Action.UPDATE_HAT, EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_HAT)); - return actions; - } - } -} diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 65b5a401b..37cab4448 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -11,17 +11,9 @@ }, "depends": { "fabric-api-base": "*", - "fabric-networking-api-v1": "*", - "java": ">=17", "minecraft": [ - "1.14", "1.14.1", "1.14.2", "1.14.3", "1.14.4", - "1.15", "1.15.1", "1.15.2", - "1.16", "1.16.1", "1.16.2", "1.16.3", "1.16.4", "1.16.5", - "1.17", "1.17.1", - "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.5-alpha.25.7.a", "1.21.5-alpha.25.8.a", "1.21.5-alpha.25.9.a", "1.21.5-alpha.25.9.b" + "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", "1.21.5-alpha.25.8.a", "1.21.5-alpha.25.9.a", "1.21.5-alpha.25.9.b" ] }, "recommends": { diff --git a/fabric/src/main/resources/resources/tab.accesswidener b/fabric/src/main/resources/resources/tab.accesswidener index d49021b66..bbca81096 100644 --- a/fabric/src/main/resources/resources/tab.accesswidener +++ b/fabric/src/main/resources/resources/tab.accesswidener @@ -4,25 +4,20 @@ accessWidener v1 named accessible field net/minecraft/network/protocol/game/ClientboundSetObjectivePacket objectiveName Ljava/lang/String; 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 (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; mutable field net/minecraft/network/protocol/game/ClientboundSetPlayerTeamPacket players Ljava/util/Collection; -# Logger (1.18.2+) +# Logger accessible field net/minecraft/server/MinecraftServer LOGGER Lorg/slf4j/Logger; -# Tablist packet entries (1.19.3+) +# Tablist packet entries accessible field net/minecraft/network/protocol/game/ClientboundPlayerInfoUpdatePacket entries Ljava/util/List; mutable field net/minecraft/network/protocol/game/ClientboundPlayerInfoUpdatePacket entries Ljava/util/List; -# Channel (1.20.2+) +# Channel accessible field net/minecraft/server/network/ServerCommonPacketListenerImpl connection Lnet/minecraft/network/Connection; accessible field net/minecraft/network/Connection channel Lio/netty/channel/Channel; -# Style (1.21.4+) +# Style accessible method net/minecraft/network/chat/Style (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 diff --git a/fabric/v1_14_4/build.gradle.kts b/fabric/v1_14_4/build.gradle.kts deleted file mode 100644 index 76434b0c8..000000000 --- a/fabric/v1_14_4/build.gradle.kts +++ /dev/null @@ -1,25 +0,0 @@ -plugins { - id("fabric-loom") -} - -repositories { - // Gradle doesn't support combining settings and project repositories, so we have to re-declare all the settings repos we need - 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") - maven("https://maven.nucleoid.xyz/") -} - -dependencies { - implementation(projects.fabric) - minecraft("com.mojang:minecraft:1.14.4") - mappings(loom.officialMojangMappings()) - modImplementation("net.fabricmc:fabric-loader:0.15.9") // Not required, but causes warn if not present -} - -tasks { - compileJava { - options.release.set(17) - } -} diff --git a/fabric/v1_14_4/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_1_14_4.java b/fabric/v1_14_4/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_1_14_4.java deleted file mode 100644 index 9554c473b..000000000 --- a/fabric/v1_14_4/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_1_14_4.java +++ /dev/null @@ -1,268 +0,0 @@ -package me.neznamy.tab.platforms.fabric.loader; - -import com.mojang.authlib.GameProfile; -import com.mojang.authlib.properties.Property; -import io.netty.channel.Channel; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -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.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; -import me.neznamy.tab.shared.platform.decorators.TrackedTabList; -import me.neznamy.tab.shared.util.ReflectionUtils; -import net.minecraft.ChatFormatting; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.network.Connection; -import net.minecraft.network.chat.*; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.*; -import net.minecraft.network.protocol.game.ClientboundPlayerInfoPacket.PlayerUpdate; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.ServerScoreboard; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.network.ServerGamePacketListenerImpl; -import net.minecraft.world.level.GameType; -import net.minecraft.world.level.Level; -import net.minecraft.world.scores.Objective; -import net.minecraft.world.scores.PlayerTeam; -import net.minecraft.world.scores.criteria.ObjectiveCriteria; -import net.minecraft.world.scores.criteria.ObjectiveCriteria.RenderType; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.lang.reflect.Field; -import java.util.*; - -/** - * Implementation containing methods in the state of the oldest supported - * Minecraft version by the mod - 1.14.4. - */ -@SuppressWarnings({ - "unchecked", // Java generic types - "unused" // Actually used, just via reflection -}) -@RequiredArgsConstructor -public class Loader_1_14_4 implements Loader { - - private final ProtocolVersion serverVersion; - - @Override - @NotNull - public String getLevelName(@NotNull Level level) { - return level.getLevelData().getLevelName() + level.dimension.getType().getFileSuffix(); - } - - @Override - @NotNull - public TabList.Skin propertyToSkin(@NotNull Property property) { - return new TabList.Skin(property.getValue(), property.getSignature()); - } - - @Override - @NotNull - public Component newTextComponent(@NotNull String text) { - return new TextComponent(text); - } - - @Override - @NotNull - public Component newTranslatableComponent(@NotNull String text) { - return new TranslatableComponent(text); - } - - @Override - @NotNull - public Component newKeybindComponent(@NotNull String key) { - return new KeybindComponent(key); - } - - @Override - @NotNull - public Style convertModifier(@NotNull ChatModifier modifier) { - Style style = new Style(); - if (modifier.getColor() != null) { - style.setColor(ChatFormatting.valueOf(modifier.getColor().getLegacyColor().name())); - } - style.setBold(modifier.getBold()); - style.setItalic(modifier.getItalic()); - style.setStrikethrough(modifier.getStrikethrough()); - style.setUnderlined(modifier.getUnderlined()); - style.setObfuscated(modifier.getObfuscated()); - return style; - } - - @Override - @NotNull - public Packet registerTeam(@NotNull PlayerTeam team) { - return new ClientboundSetPlayerTeamPacket(team, 0); - } - - @Override - @NotNull - public Packet unregisterTeam(@NotNull PlayerTeam team) { - return new ClientboundSetPlayerTeamPacket(team, 1); - } - - @Override - @NotNull - public Packet updateTeam(@NotNull PlayerTeam team) { - return new ClientboundSetPlayerTeamPacket(team, 2); - } - - @Override - public void sendMessage(@NotNull ServerPlayer player, @NotNull Component message) { - player.sendMessage(message); - } - - @Override - public void sendMessage(@NotNull CommandSourceStack source, @NotNull Component message) { - source.sendSuccess(message, false); - } - - @Override - @NotNull - @SneakyThrows - public Packet newHeaderFooter(@NotNull Component header, @NotNull Component footer) { - ClientboundTabListPacket packet = ClientboundTabListPacket.class.getConstructor().newInstance(); - List fields = ReflectionUtils.getFields(ClientboundTabListPacket.class, Component.class); - fields.get(0).set(packet, header); - fields.get(1).set(packet, footer); - return packet; - } - - @Override - @SneakyThrows - public void checkTeamPacket(@NotNull Packet packet, @NotNull FabricScoreboard scoreboard) { - if (packet instanceof ClientboundSetPlayerTeamPacket) { - int action = ReflectionUtils.getInstanceFields(packet.getClass(), int.class).get(0).getInt(packet); - if (action == Scoreboard.TeamAction.UPDATE) return; - Field playersField = ReflectionUtils.getFields(packet.getClass(), Collection.class).get(0); - Collection players = (Collection) playersField.get(packet); - String teamName = String.valueOf(ReflectionUtils.getFields(packet.getClass(), String.class).get(0).get(packet)); - playersField.set(packet, scoreboard.onTeamPacket(action, teamName, players)); - } - } - - @Override - public boolean isPlayerInfo(@NotNull Packet packet) { - return packet instanceof ClientboundPlayerInfoPacket; - } - - @Override - @SneakyThrows - public void onPlayerInfo(@NotNull TabPlayer receiver, @NotNull Object packet) { - ClientboundPlayerInfoPacket.Action action = (ClientboundPlayerInfoPacket.Action) ReflectionUtils.getFields(packet.getClass(), ClientboundPlayerInfoPacket.Action.class).get(0).get(packet); - List players = (List) ReflectionUtils.getFields(packet.getClass(), List.class).get(0).get(packet); - for (PlayerUpdate nmsData : players) { - GameProfile profile = nmsData.getProfile(); - Field displayNameField = ReflectionUtils.getFields(PlayerUpdate.class, Component.class).get(0); - Field latencyField = ReflectionUtils.getFields(PlayerUpdate.class, int.class).get(0); - if (action.name().equals(TabList.Action.UPDATE_DISPLAY_NAME.name()) || action.name().equals(TabList.Action.ADD_PLAYER.name())) { - TabComponent expectedName = ((TrackedTabList)receiver.getTabList()).getExpectedDisplayNames().get(profile.getId()); - if (expectedName != null) displayNameField.set(nmsData, expectedName.convert()); - } - if (action.name().equals(TabList.Action.UPDATE_LATENCY.name()) || action.name().equals(TabList.Action.ADD_PLAYER.name())) { - latencyField.set(nmsData, TAB.getInstance().getFeatureManager().onLatencyChange(receiver, profile.getId(), latencyField.getInt(nmsData))); - } - if (action.name().equals(TabList.Action.ADD_PLAYER.name())) { - TAB.getInstance().getFeatureManager().onEntryAdd(receiver, profile.getId(), profile.getName()); - } - } - } - - @Override - @NotNull - @SneakyThrows - public Packet buildTabListPacket(TabList.@NotNull Action action, @NotNull FabricTabList.Builder entry) { - ClientboundPlayerInfoPacket packet = new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.valueOf(action.name())); - ReflectionUtils.getFields(ClientboundPlayerInfoPacket.class, List.class).get(0).set(packet, Collections.singletonList( - packet.new PlayerUpdate(entry.createProfile(), entry.getLatency(), GameType.byId(entry.getGameMode()), entry.getDisplayName()))); - return packet; - } - - @Override - @NotNull - public Level getLevel(@NotNull ServerPlayer player) { - return player.level; - } - - @Override - public int getPing(@NotNull ServerPlayer player) { - return player.latency; - } - - @Override - @SneakyThrows - public int getDisplaySlot(@NotNull ClientboundSetDisplayObjectivePacket packet) { - return ReflectionUtils.getFields(packet.getClass(), int.class).get(0).getInt(packet); - } - - @Override - @NotNull - public Packet setDisplaySlot(int slot, @NotNull Objective objective) { - return new ClientboundSetDisplayObjectivePacket(slot, objective); - } - - @Override - @NotNull - @SneakyThrows - public Channel getChannel(@NotNull ServerPlayer player) { - Connection c = (Connection) ReflectionUtils.getFields(ServerGamePacketListenerImpl.class, Connection.class).get(0).get(player.connection); - return (Channel) ReflectionUtils.getFields(Connection.class, Channel.class).get(0).get(c); - } - - @Override - public float getMSPT(@NotNull MinecraftServer server) { - return server.getAverageTickTime(); - } - - @Override - @NotNull - public Packet removeScore(@NotNull String objective, @NotNull String holder) { - return new ClientboundSetScorePacket(ServerScoreboard.Method.REMOVE, objective, holder, 0); - } - - @Override - @NotNull - public Objective newObjective(@NotNull String name, @NotNull Component displayName, - @NotNull RenderType renderType, @Nullable TabComponent numberFormat) { - return new Objective(dummyScoreboard, name, ObjectiveCriteria.DUMMY, displayName, renderType); - } - - @Override - @NotNull - public Packet setScore(@NotNull String objective, @NotNull String holder, int score, @Nullable Component displayName, @Nullable TabComponent numberFormat) { - return new ClientboundSetScorePacket(ServerScoreboard.Method.CHANGE, objective, holder, score); - } - - @Override - public void setStyle(@NotNull Component component, @NotNull Style style) { - component.setStyle(style); - } - - @Override - @SneakyThrows - public void logInfo(@NotNull TabComponent message) { - Object logger = ReflectionUtils.getFields(MinecraftServer.class, Class.forName("org.apache.logging.log4j.Logger")).get(0).get(null); - logger.getClass().getMethod("info", String.class).invoke(logger, "[TAB] " + message.toRawText()); - } - - @Override - @SneakyThrows - public void logWarn(@NotNull TabComponent message) { - Object logger = ReflectionUtils.getFields(MinecraftServer.class, Class.forName("org.apache.logging.log4j.Logger")).get(0).get(null); - logger.getClass().getMethod("warn", String.class).invoke(logger, "[TAB] " + message.toRawText()); - } - - @NotNull - @Override - public CommandSourceStack createCommandSourceStack(@NotNull ServerPlayer player) { - return player.createCommandSourceStack(); - } -} diff --git a/fabric/v1_18_2/build.gradle.kts b/fabric/v1_18_2/build.gradle.kts deleted file mode 100644 index 0a76bfb9e..000000000 --- a/fabric/v1_18_2/build.gradle.kts +++ /dev/null @@ -1,25 +0,0 @@ -plugins { - id("fabric-loom") -} - -repositories { - // Gradle doesn't support combining settings and project repositories, so we have to re-declare all the settings repos we need - 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") - maven("https://maven.nucleoid.xyz/") -} - -dependencies { - implementation(projects.fabric) - minecraft("com.mojang:minecraft:1.18.2") - mappings(loom.officialMojangMappings()) - modImplementation("net.fabricmc:fabric-loader:0.15.9") // Not required, but causes warn if not present -} - -tasks { - compileJava { - options.release.set(17) - } -} diff --git a/fabric/v1_18_2/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_1_18_2.java b/fabric/v1_18_2/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_1_18_2.java deleted file mode 100644 index e19e19cba..000000000 --- a/fabric/v1_18_2/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_1_18_2.java +++ /dev/null @@ -1,89 +0,0 @@ -package me.neznamy.tab.platforms.fabric.loader; - -import com.mojang.authlib.GameProfile; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import me.neznamy.chat.component.TabComponent; -import me.neznamy.tab.platforms.fabric.FabricTabList; -import me.neznamy.tab.shared.ProtocolVersion; -import me.neznamy.tab.shared.TAB; -import me.neznamy.tab.shared.platform.TabList; -import me.neznamy.tab.shared.platform.TabPlayer; -import me.neznamy.tab.shared.platform.decorators.TrackedTabList; -import me.neznamy.tab.shared.util.ReflectionUtils; -import net.minecraft.network.chat.BaseComponent; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Style; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientboundPlayerInfoPacket; -import net.minecraft.network.protocol.game.ClientboundPlayerInfoPacket.PlayerUpdate; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.GameType; -import org.jetbrains.annotations.NotNull; - -import java.lang.reflect.Field; -import java.util.Collections; -import java.util.List; -import java.util.UUID; - -/** - * Implementation containing some methods that have changed multiple times - * throughout the versions and need a separate module. This module implements - * a few methods in the state of Minecraft 1.17 - 1.18.2. - */ -@SuppressWarnings("unused") // Actually used, just via reflection -@RequiredArgsConstructor -public class Loader_1_18_2 implements Loader { - - private final ProtocolVersion serverVersion; - - @Override - public void sendMessage(@NotNull ServerPlayer player, @NotNull Component message) { - player.sendMessage(message, new UUID(0, 0)); - } - - @Override - public void setStyle(@NotNull Component component, @NotNull Style style) { - ((BaseComponent)component).setStyle(style); - } - - @Override - @NotNull - @SneakyThrows - public Packet buildTabListPacket(@NotNull TabList.Action action, @NotNull FabricTabList.Builder entry) { - PlayerUpdate update; - if (serverVersion.getMinorVersion() >= 19) { - // 1.19 - 1.19.2 - update = (PlayerUpdate) PlayerUpdate.class.getConstructors()[0].newInstance( - entry.createProfile(), entry.getLatency(), GameType.byId(entry.getGameMode()), entry.getDisplayName(), null); - } else { - update = new PlayerUpdate(entry.createProfile(), entry.getLatency(), GameType.byId(entry.getGameMode()), entry.getDisplayName()); - } - ClientboundPlayerInfoPacket packet = new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.valueOf(action.name())); - ReflectionUtils.getFields(ClientboundPlayerInfoPacket.class, List.class).get(0).set(packet, Collections.singletonList(update)); - return packet; - } - - @Override - @SneakyThrows - @SuppressWarnings("unchecked") - public void onPlayerInfo(@NotNull TabPlayer receiver, @NotNull Object packet) { - ClientboundPlayerInfoPacket.Action action = (ClientboundPlayerInfoPacket.Action) ReflectionUtils.getFields(packet.getClass(), ClientboundPlayerInfoPacket.Action.class).get(0).get(packet); - List players = (List) ReflectionUtils.getFields(packet.getClass(), List.class).get(0).get(packet); - for (PlayerUpdate nmsData : players) { - GameProfile profile = nmsData.getProfile(); - Field displayNameField = ReflectionUtils.getFields(PlayerUpdate.class, Component.class).get(0); - Field latencyField = ReflectionUtils.getFields(PlayerUpdate.class, int.class).get(0); - if (action.name().equals(TabList.Action.UPDATE_DISPLAY_NAME.name()) || action.name().equals(TabList.Action.ADD_PLAYER.name())) { - TabComponent expectedName = ((TrackedTabList)receiver.getTabList()).getExpectedDisplayNames().get(profile.getId()); - if (expectedName != null) displayNameField.set(nmsData, expectedName.convert()); - } - if (action.name().equals(TabList.Action.UPDATE_LATENCY.name()) || action.name().equals(TabList.Action.ADD_PLAYER.name())) { - latencyField.set(nmsData, TAB.getInstance().getFeatureManager().onLatencyChange(receiver, profile.getId(), latencyField.getInt(nmsData))); - } - if (action.name().equals(TabList.Action.ADD_PLAYER.name())) { - TAB.getInstance().getFeatureManager().onEntryAdd(receiver, profile.getId(), profile.getName()); - } - } - } -} diff --git a/fabric/v1_20_3/build.gradle.kts b/fabric/v1_20_3/build.gradle.kts deleted file mode 100644 index e271815a1..000000000 --- a/fabric/v1_20_3/build.gradle.kts +++ /dev/null @@ -1,33 +0,0 @@ -plugins { - id("fabric-loom") -} - -repositories { - // Gradle doesn't support combining settings and project repositories, so we have to re-declare all the settings repos we need - 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") - maven("https://maven.nucleoid.xyz/") -} - -dependencies { - implementation(projects.fabric) - minecraft("com.mojang:minecraft:1.20.3") - mappings(loom.officialMojangMappings()) - modImplementation("net.fabricmc:fabric-loader:0.15.9") // Not required, but causes warn if not present -} - -loom { - accessWidenerPath.set(file("../src/main/resources/resources/tab.accesswidener")) -} - -tasks { - compileJava { - options.release.set(17) - } - - validateAccessWidener { - enabled = false // Disable validation because the file is made for latest version, so some fields will throw error (the one we need has not changed) - } -} diff --git a/fabric/v1_20_3/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_1_20_3.java b/fabric/v1_20_3/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_1_20_3.java deleted file mode 100644 index 15cb147da..000000000 --- a/fabric/v1_20_3/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_1_20_3.java +++ /dev/null @@ -1,110 +0,0 @@ -package me.neznamy.tab.platforms.fabric.loader; - -import com.mojang.authlib.GameProfile; -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.chat.component.TabComponent; -import me.neznamy.tab.shared.platform.TabList; -import me.neznamy.tab.shared.platform.TabPlayer; -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.ClientboundSetScorePacket; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.GameType; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.*; - -/** - * Implementation containing some methods that have changed multiple times - * throughout the versions and need a separate module. This module implements - * a few methods in the state of Minecraft 1.20.3 - 1.20.4. - */ -@SuppressWarnings("unused") // Actually used, just via reflection -@RequiredArgsConstructor -public class Loader_1_20_3 implements Loader { - - private final ProtocolVersion serverVersion; - - @Override - public void onPlayerInfo(@NotNull TabPlayer receiver, @NotNull Object packet0) { - ClientboundPlayerInfoUpdatePacket packet = (ClientboundPlayerInfoUpdatePacket) packet0; - EnumSet actions = packet.actions(); - List updatedList = new ArrayList<>(); - for (ClientboundPlayerInfoUpdatePacket.Entry nmsData : packet.entries()) { - GameProfile profile = nmsData.profile(); - Component displayName = nmsData.displayName(); - int latency = nmsData.latency(); - if (actions.contains(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME)) { - TabComponent expectedDisplayName = ((FabricTabList)receiver.getTabList()).getExpectedDisplayNames().get(nmsData.profileId()); - if (expectedDisplayName != null) displayName = expectedDisplayName.convert(); - } - if (actions.contains(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LATENCY)) { - latency = TAB.getInstance().getFeatureManager().onLatencyChange(receiver, nmsData.profileId(), latency); - } - if (actions.contains(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER)) { - TAB.getInstance().getFeatureManager().onEntryAdd(receiver, nmsData.profileId(), profile.getName()); - } - updatedList.add(new ClientboundPlayerInfoUpdatePacket.Entry(nmsData.profileId(), profile, nmsData.listed(), latency, nmsData.gameMode(), displayName, nmsData.chatSession())); - } - packet.entries = updatedList; - } - - @Override - @NotNull - public Packet buildTabListPacket(@NotNull TabList.Action action, @NotNull FabricTabList.Builder entry) { - if (action == TabList.Action.REMOVE_PLAYER) { - return new ClientboundPlayerInfoRemovePacket(Collections.singletonList(entry.getId())); - } - ClientboundPlayerInfoUpdatePacket packet = new ClientboundPlayerInfoUpdatePacket(Register1_19_3.actionMap.get(action), Collections.emptyList()); - packet.entries = Collections.singletonList(new ClientboundPlayerInfoUpdatePacket.Entry( - entry.getId(), - action == TabList.Action.ADD_PLAYER ? entry.createProfile() : null, - entry.isListed(), - entry.getLatency(), - GameType.byId(entry.getGameMode()), - entry.getDisplayName(), - null - )); - return packet; - } - - @Override - public void sendMessage(@NotNull ServerPlayer player, @NotNull Component message) { - player.sendSystemMessage(message); - } - - private static class Register1_19_3 { - - static final Map> actionMap = createActionMap(); - - private static Map> createActionMap() { - Map> actions = new EnumMap<>(TabList.Action.class); - actions.put(TabList.Action.ADD_PLAYER, EnumSet.allOf(ClientboundPlayerInfoUpdatePacket.Action.class)); - actions.put(TabList.Action.UPDATE_GAME_MODE, EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE)); - actions.put(TabList.Action.UPDATE_DISPLAY_NAME, EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME)); - actions.put(TabList.Action.UPDATE_LATENCY, EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LATENCY)); - actions.put(TabList.Action.UPDATE_LISTED, EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LISTED)); - return actions; - } - } - - @Override - @NotNull - public Packet setScore(@NotNull String objective, @NotNull String holder, int score, @Nullable Component displayName, @Nullable TabComponent numberFormat) { - return Register1_20_3.setScore(objective, holder, score, displayName, numberFormat); - } - - private static class Register1_20_3 { - - @NotNull - public static Packet setScore(@NotNull String objective, @NotNull String holder, int score, @Nullable Component displayName, @Nullable TabComponent numberFormat) { - return new ClientboundSetScorePacket(holder, objective, score, displayName, Loader_Latest.Register1_20_3.toFixedFormat(numberFormat)); - } - } -} diff --git a/fabric/v1_21_3/build.gradle.kts b/fabric/v1_21_3/build.gradle.kts deleted file mode 100644 index edf97db9d..000000000 --- a/fabric/v1_21_3/build.gradle.kts +++ /dev/null @@ -1,33 +0,0 @@ -plugins { - id("fabric-loom") -} - -repositories { - // Gradle doesn't support combining settings and project repositories, so we have to re-declare all the settings repos we need - 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") - maven("https://maven.nucleoid.xyz/") -} - -dependencies { - implementation(projects.fabric) - minecraft("com.mojang:minecraft:1.21.3") - mappings(loom.officialMojangMappings()) - modImplementation("net.fabricmc:fabric-loader:0.15.9") // Not required, but causes warn if not present -} - -loom { - accessWidenerPath.set(file("../src/main/resources/resources/tab.accesswidener")) -} - -tasks { - compileJava { - options.release.set(17) - } - - validateAccessWidener { - enabled = false // Disable validation because the file is made for latest version, so some fields will throw error (the one we need has not changed) - } -} diff --git a/fabric/v1_21_3/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_1_21_3.java b/fabric/v1_21_3/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_1_21_3.java deleted file mode 100644 index a3be430fc..000000000 --- a/fabric/v1_21_3/src/main/java/me/neznamy/tab/platforms/fabric/loader/Loader_1_21_3.java +++ /dev/null @@ -1,112 +0,0 @@ -package me.neznamy.tab.platforms.fabric.loader; - -import com.mojang.authlib.GameProfile; -import lombok.RequiredArgsConstructor; -import me.neznamy.chat.ChatModifier; -import me.neznamy.chat.component.TabComponent; -import me.neznamy.tab.platforms.fabric.FabricTabList; -import me.neznamy.tab.shared.ProtocolVersion; -import me.neznamy.tab.shared.TAB; -import me.neznamy.tab.shared.platform.TabList; -import me.neznamy.tab.shared.platform.TabPlayer; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Style; -import net.minecraft.network.chat.TextColor; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientboundPlayerInfoRemovePacket; -import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.GameType; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -/** - * Implementation containing some methods that have changed multiple times - * throughout the versions and need a separate module. This module implements - * a few methods in the state of Minecraft 1.21.2 - 1.21.3. - */ -@SuppressWarnings("unused") // Actually used, just via reflection -@RequiredArgsConstructor -public class Loader_1_21_3 implements Loader { - - private final ProtocolVersion serverVersion; - - @Override - public void onPlayerInfo(@NotNull TabPlayer receiver, @NotNull Object packet0) { - ClientboundPlayerInfoUpdatePacket packet = (ClientboundPlayerInfoUpdatePacket) packet0; - EnumSet actions = packet.actions(); - List updatedList = new ArrayList<>(); - for (ClientboundPlayerInfoUpdatePacket.Entry nmsData : packet.entries()) { - GameProfile profile = nmsData.profile(); - Component displayName = nmsData.displayName(); - int latency = nmsData.latency(); - if (actions.contains(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME)) { - TabComponent expectedDisplayName = ((FabricTabList)receiver.getTabList()).getExpectedDisplayNames().get(nmsData.profileId()); - if (expectedDisplayName != null) displayName = expectedDisplayName.convert(); - } - if (actions.contains(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LATENCY)) { - latency = TAB.getInstance().getFeatureManager().onLatencyChange(receiver, nmsData.profileId(), latency); - } - if (actions.contains(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER)) { - TAB.getInstance().getFeatureManager().onEntryAdd(receiver, nmsData.profileId(), profile.getName()); - } - updatedList.add(new ClientboundPlayerInfoUpdatePacket.Entry(nmsData.profileId(), profile, nmsData.listed(), - latency, nmsData.gameMode(), displayName, nmsData.listOrder(), nmsData.chatSession())); - } - packet.entries = updatedList; - } - - @Override - @NotNull - public Packet buildTabListPacket(@NotNull TabList.Action action, @NotNull FabricTabList.Builder entry) { - if (action == TabList.Action.REMOVE_PLAYER) { - return new ClientboundPlayerInfoRemovePacket(Collections.singletonList(entry.getId())); - } - ClientboundPlayerInfoUpdatePacket packet = new ClientboundPlayerInfoUpdatePacket(Register1_19_3.actionMap.get(action), Collections.emptyList()); - packet.entries = Collections.singletonList(new ClientboundPlayerInfoUpdatePacket.Entry( - entry.getId(), - action == TabList.Action.ADD_PLAYER ? entry.createProfile() : null, - entry.isListed(), - entry.getLatency(), - GameType.byId(entry.getGameMode()), - entry.getDisplayName(), - entry.getListOrder(), - null - )); - return packet; - } - - @Override - @NotNull - public Style convertModifier(@NotNull ChatModifier modifier) { - 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 { - - static final Map> actionMap = createActionMap(); - - private static Map> createActionMap() { - Map> actions = new EnumMap<>(TabList.Action.class); - actions.put(TabList.Action.ADD_PLAYER, EnumSet.allOf(ClientboundPlayerInfoUpdatePacket.Action.class)); - actions.put(TabList.Action.UPDATE_GAME_MODE, EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE)); - actions.put(TabList.Action.UPDATE_DISPLAY_NAME, EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME)); - actions.put(TabList.Action.UPDATE_LATENCY, EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LATENCY)); - actions.put(TabList.Action.UPDATE_LISTED, EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LISTED)); - actions.put(TabList.Action.UPDATE_LIST_ORDER, EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LIST_ORDER)); - return actions; - } - } -} diff --git a/jar/build.gradle.kts b/jar/build.gradle.kts index 00ac21162..c32af2321 100644 --- a/jar/build.gradle.kts +++ b/jar/build.gradle.kts @@ -12,14 +12,6 @@ val platforms = setOf( rootProject.projects.sponge8 ).map { it.dependencyProject } -val fabrics = setOf( - rootProject.projects.fabric, - rootProject.projects.fabric.v1144, - rootProject.projects.fabric.v1182, - rootProject.projects.fabric.v1203, - rootProject.projects.fabric.v1213 -).map { it.dependencyProject } - tasks { shadowJar { archiveFileName.set("TAB-${project.version}.jar") @@ -35,9 +27,8 @@ tasks { registerPlatform(it, it.tasks.named("shadowJar").get()) } - fabrics.forEach { - registerPlatform(it, it.tasks.named("remapJar").get()) - } + registerPlatform(rootProject.projects.fabric.dependencyProject, rootProject.projects.fabric.dependencyProject.tasks.named("remapJar").get()) + } build { dependsOn(shadowJar) diff --git a/settings.gradle.kts b/settings.gradle.kts index d5b7b846b..2d841594f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -35,8 +35,4 @@ include(":component") include(":sponge7") include(":sponge8") include(":fabric") -include(":fabric:v1_14_4") -include(":fabric:v1_18_2") -include(":fabric:v1_20_3") -include(":fabric:v1_21_3") include(":jar")