From 99f4833d26b64050f40cc3dca6ff489938a1e922 Mon Sep 17 00:00:00 2001 From: Diogo Correia Date: Sun, 17 Nov 2024 19:36:54 +0100 Subject: [PATCH] feat(core): handle scoreboard teams packet with packetevents Refreshing functionality is still not implemented. --- .../PacketEventsListener.java | 13 ++-- .../handlers/ScoreboardPacketHandler.java | 76 ++++++++++++++++++- 2 files changed, 82 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/rexcantor64/triton/packetinterceptor/PacketEventsListener.java b/core/src/main/java/com/rexcantor64/triton/packetinterceptor/PacketEventsListener.java index 7a019f01..0a59d8d4 100644 --- a/core/src/main/java/com/rexcantor64/triton/packetinterceptor/PacketEventsListener.java +++ b/core/src/main/java/com/rexcantor64/triton/packetinterceptor/PacketEventsListener.java @@ -6,11 +6,13 @@ import com.github.retrooper.packetevents.protocol.packettype.PacketTypeCommon; import com.rexcantor64.triton.Triton; import com.rexcantor64.triton.packetinterceptor.handlers.ScoreboardPacketHandler; +import com.rexcantor64.triton.player.LanguagePlayer; import lombok.val; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.function.BiConsumer; import java.util.function.Consumer; /** @@ -23,7 +25,7 @@ */ public class PacketEventsListener implements PacketListener { - private Map> receiveHandlers = Collections.emptyMap(); + private Map> receiveHandlers = Collections.emptyMap(); /** * Setup handlers according to what is enabled on config. @@ -31,11 +33,12 @@ public class PacketEventsListener implements PacketListener { * @since 4.0.0 */ public void setupHandlers() { + val parser = Triton.get().getMessageParser(); val config = Triton.get().getConfig(); - val updatedHandlers = new HashMap>(); + val updatedHandlers = new HashMap>(); if (config.isScoreboards()) { - val scoreboardHandler = new ScoreboardPacketHandler(); + val scoreboardHandler = new ScoreboardPacketHandler(parser, config); updatedHandlers.put(PacketType.Play.Server.TEAMS, scoreboardHandler::onTeamsPacket); } @@ -45,11 +48,11 @@ public void setupHandlers() { @Override public void onPacketSend(PacketSendEvent event) { val type = event.getPacketType(); - System.out.println("type = " + type); val handler = receiveHandlers.get(type); if (handler != null) { - handler.accept(event); + val languagePlayer = Triton.get().getPlayerManager().get(event.getUser().getUUID()); + handler.accept(event, languagePlayer); } } } diff --git a/core/src/main/java/com/rexcantor64/triton/packetinterceptor/handlers/ScoreboardPacketHandler.java b/core/src/main/java/com/rexcantor64/triton/packetinterceptor/handlers/ScoreboardPacketHandler.java index 6ff26700..2f114c7f 100644 --- a/core/src/main/java/com/rexcantor64/triton/packetinterceptor/handlers/ScoreboardPacketHandler.java +++ b/core/src/main/java/com/rexcantor64/triton/packetinterceptor/handlers/ScoreboardPacketHandler.java @@ -2,12 +2,84 @@ import com.github.retrooper.packetevents.event.PacketSendEvent; import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerTeams; +import com.rexcantor64.triton.config.MainConfig; +import com.rexcantor64.triton.language.parser.AdventureParser; +import com.rexcantor64.triton.player.LanguagePlayer; +import lombok.RequiredArgsConstructor; +import lombok.val; +import net.kyori.adventure.text.Component; +import org.jetbrains.annotations.NotNull; +@RequiredArgsConstructor public class ScoreboardPacketHandler { - public void onTeamsPacket(PacketSendEvent event) { + private final @NotNull AdventureParser parser; + private final @NotNull MainConfig.FeatureSyntax syntax; + + public ScoreboardPacketHandler(@NotNull AdventureParser parser, @NotNull MainConfig config) { + this.parser = parser; + this.syntax = config.getScoreboardSyntax(); + } + + public void onTeamsPacket(@NotNull PacketSendEvent event, @NotNull LanguagePlayer languagePlayer) { WrapperPlayServerTeams teams = new WrapperPlayServerTeams(event); - // TODO + + val action = teams.getTeamMode(); + if (action == WrapperPlayServerTeams.TeamMode.REMOVE) { + // TODO remove from cache + } + + if (action != WrapperPlayServerTeams.TeamMode.CREATE && action != WrapperPlayServerTeams.TeamMode.UPDATE) { + // we are only interested in new/update actions + return; + } + + val infoOpt = teams.getTeamInfo(); + if (!infoOpt.isPresent()) { + // this should never happen since we have filtered by the actions before + return; + } + val info = infoOpt.get(); + + // display name + parser.translateComponent( + info.getDisplayName(), + languagePlayer, + syntax + ) + .getResultOrToRemove(Component::empty) + .ifPresent(result -> { + info.setDisplayName(result); + event.markForReEncode(true); + }); + // prefix + parser.translateComponent( + info.getPrefix(), + languagePlayer, + syntax + ) + .getResultOrToRemove(Component::empty) + .ifPresent(result -> { + info.setPrefix(result); + event.markForReEncode(true); + }); + // suffix + parser.translateComponent( + info.getSuffix(), + languagePlayer, + syntax + ) + .getResultOrToRemove(Component::empty) + .ifPresent(result -> { + info.setSuffix(result); + event.markForReEncode(true); + }); + + if (event.needsReEncode()) { + // TODO save data to cache + } else { + // TODO remove team from cache if exists + } } }