diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/StateRegistry.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/StateRegistry.java
index 41d444a3..f0e045fe 100644
--- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/StateRegistry.java
+++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/StateRegistry.java
@@ -49,42 +49,7 @@ import static com.velocitypowered.proxy.protocol.ProtocolUtils.Direction.SERVERB
import com.velocitypowered.api.network.ProtocolState;
import com.velocitypowered.api.network.ProtocolVersion;
-import com.velocitypowered.proxy.protocol.packet.AvailableCommandsPacket;
-import com.velocitypowered.proxy.protocol.packet.BossBarPacket;
-import com.velocitypowered.proxy.protocol.packet.BundleDelimiterPacket;
-import com.velocitypowered.proxy.protocol.packet.ClientSettingsPacket;
-import com.velocitypowered.proxy.protocol.packet.ClientboundCookieRequestPacket;
-import com.velocitypowered.proxy.protocol.packet.ClientboundStoreCookiePacket;
-import com.velocitypowered.proxy.protocol.packet.DisconnectPacket;
-import com.velocitypowered.proxy.protocol.packet.EncryptionRequestPacket;
-import com.velocitypowered.proxy.protocol.packet.EncryptionResponsePacket;
-import com.velocitypowered.proxy.protocol.packet.HandshakePacket;
-import com.velocitypowered.proxy.protocol.packet.HeaderAndFooterPacket;
-import com.velocitypowered.proxy.protocol.packet.JoinGamePacket;
-import com.velocitypowered.proxy.protocol.packet.KeepAlivePacket;
-import com.velocitypowered.proxy.protocol.packet.LegacyPlayerListItemPacket;
-import com.velocitypowered.proxy.protocol.packet.LoginAcknowledgedPacket;
-import com.velocitypowered.proxy.protocol.packet.LoginPluginMessagePacket;
-import com.velocitypowered.proxy.protocol.packet.LoginPluginResponsePacket;
-import com.velocitypowered.proxy.protocol.packet.PingIdentifyPacket;
-import com.velocitypowered.proxy.protocol.packet.PluginMessagePacket;
-import com.velocitypowered.proxy.protocol.packet.RemovePlayerInfoPacket;
-import com.velocitypowered.proxy.protocol.packet.RemoveResourcePackPacket;
-import com.velocitypowered.proxy.protocol.packet.ResourcePackRequestPacket;
-import com.velocitypowered.proxy.protocol.packet.ResourcePackResponsePacket;
-import com.velocitypowered.proxy.protocol.packet.RespawnPacket;
-import com.velocitypowered.proxy.protocol.packet.ServerDataPacket;
-import com.velocitypowered.proxy.protocol.packet.ServerLoginPacket;
-import com.velocitypowered.proxy.protocol.packet.ServerLoginSuccessPacket;
-import com.velocitypowered.proxy.protocol.packet.ServerboundCookieResponsePacket;
-import com.velocitypowered.proxy.protocol.packet.SetCompressionPacket;
-import com.velocitypowered.proxy.protocol.packet.StatusPingPacket;
-import com.velocitypowered.proxy.protocol.packet.StatusRequestPacket;
-import com.velocitypowered.proxy.protocol.packet.StatusResponsePacket;
-import com.velocitypowered.proxy.protocol.packet.TabCompleteRequestPacket;
-import com.velocitypowered.proxy.protocol.packet.TabCompleteResponsePacket;
-import com.velocitypowered.proxy.protocol.packet.TransferPacket;
-import com.velocitypowered.proxy.protocol.packet.UpsertPlayerInfoPacket;
+import com.velocitypowered.proxy.protocol.packet.*;
import com.velocitypowered.proxy.protocol.packet.chat.ChatAcknowledgementPacket;
import com.velocitypowered.proxy.protocol.packet.chat.PlayerChatCompletionPacket;
import com.velocitypowered.proxy.protocol.packet.chat.SystemChatPacket;
@@ -670,6 +635,21 @@ public enum StateRegistry {
map(0x7A, MINECRAFT_1_21, false));
clientbound.register(ClientboundServerLinksPacket.class, ClientboundServerLinksPacket::new,
map(0x7B, MINECRAFT_1_21, false));
+ clientbound.register(UpdateTeamsPacket.class, UpdateTeamsPacket::new,
+ map(0x41, ProtocolVersion.MINECRAFT_1_9, true),
+ map(0x43, ProtocolVersion.MINECRAFT_1_12, true),
+ map(0x44, ProtocolVersion.MINECRAFT_1_12_1, true),
+ map(0x47, ProtocolVersion.MINECRAFT_1_13, true),
+ map(0x4B, ProtocolVersion.MINECRAFT_1_14, true),
+ map(0x4C, ProtocolVersion.MINECRAFT_1_15, true),
+ map(0x55, ProtocolVersion.MINECRAFT_1_17, true),
+ map(0x58, ProtocolVersion.MINECRAFT_1_19_1, true),
+ map(0x56, ProtocolVersion.MINECRAFT_1_19_3, true),
+ map(0x5A, ProtocolVersion.MINECRAFT_1_19_4, true),
+ map(0x5C, ProtocolVersion.MINECRAFT_1_20_2, true),
+ map(0x5E, ProtocolVersion.MINECRAFT_1_20_3, true),
+ map(0x60, ProtocolVersion.MINECRAFT_1_20_5, true)
+ );
}
},
LOGIN {
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/UpdateTeamsPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/UpdateTeamsPacket.java
new file mode 100644
index 00000000..54ec071d
--- /dev/null
+++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/UpdateTeamsPacket.java
@@ -0,0 +1,232 @@
+/*
+ * This file is a part of the SteamWar software.
+ *
+ * Copyright (C) 2024 SteamWar.de-Serverteam
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package com.velocitypowered.proxy.protocol.packet;
+
+import com.velocitypowered.api.network.ProtocolVersion;
+import com.velocitypowered.api.proxy.Player;
+import com.velocitypowered.proxy.connection.MinecraftSessionHandler;
+import com.velocitypowered.proxy.protocol.MinecraftPacket;
+import com.velocitypowered.proxy.protocol.ProtocolUtils;
+import com.velocitypowered.proxy.protocol.packet.chat.ComponentHolder;
+import io.netty.buffer.ByteBuf;
+import net.kyori.adventure.text.Component;
+
+import java.util.List;
+
+public class UpdateTeamsPacket implements MinecraftPacket {
+ private String name;
+ private Mode mode;
+
+ private Component displayName;
+ private Component prefix;
+ private Component suffix;
+ private NameTagVisibility nameTagVisibility;
+ private CollisionRule collisionRule;
+ private int color;
+ private byte friendlyFlags;
+
+ private List players;
+
+ public UpdateTeamsPacket(String name, Mode mode, Component displayName, Component prefix, Component suffix, NameTagVisibility nameTagVisibility, CollisionRule collisionRule, int color, byte friendlyFlags, List players) {
+ this.name = name;
+ this.mode = mode;
+ this.displayName = displayName;
+ this.prefix = prefix;
+ this.suffix = suffix;
+ this.nameTagVisibility = nameTagVisibility;
+ this.collisionRule = collisionRule;
+ this.color = color;
+ this.friendlyFlags = friendlyFlags;
+ this.players = players;
+ }
+
+ public UpdateTeamsPacket() {
+ }
+
+ @Override
+ public void decode(ByteBuf byteBuf, ProtocolUtils.Direction direction, ProtocolVersion protocolVersion) {
+ throw new UnsupportedOperationException("Packet is not implemented");
+ }
+
+ @Override
+ public boolean handle(MinecraftSessionHandler minecraftSessionHandler) {
+ return false;
+ }
+
+ @Override
+ public void encode(ByteBuf byteBuf, ProtocolUtils.Direction direction, ProtocolVersion protocolVersion) {
+ ProtocolUtils.writeString(byteBuf, name);
+ byteBuf.writeByte(mode.ordinal());
+
+ switch (mode) {
+ case CREATE, UPDATE:
+ new ComponentHolder(protocolVersion, displayName).write(byteBuf);
+ if (protocolVersion.lessThan(ProtocolVersion.MINECRAFT_1_13)) {
+ new ComponentHolder(protocolVersion, prefix).write(byteBuf);
+ new ComponentHolder(protocolVersion, suffix).write(byteBuf);
+ }
+ byteBuf.writeByte(friendlyFlags);
+ ProtocolUtils.writeString(byteBuf, nameTagVisibility.getValue());
+ ProtocolUtils.writeString(byteBuf, collisionRule.getValue());
+ if (protocolVersion.greaterThan(ProtocolVersion.MINECRAFT_1_12_2)) {
+ ProtocolUtils.writeVarInt(byteBuf, color);
+ new ComponentHolder(protocolVersion, prefix).write(byteBuf);
+ new ComponentHolder(protocolVersion, suffix).write(byteBuf);
+ } else {
+ byteBuf.writeByte((byte) color);
+ }
+ ProtocolUtils.writeVarInt(byteBuf, players.size());
+ for (Player player : players) {
+ ProtocolUtils.writeString(byteBuf, player.getUsername());
+ }
+ break;
+ case ADD_PLAYER, REMOVE_PLAYER:
+ ProtocolUtils.writeVarInt(byteBuf, players.size());
+ for (Player player : players) {
+ ProtocolUtils.writeString(byteBuf, player.getUsername());
+ }
+ break;
+ case REMOVE:
+ break;
+ }
+ }
+
+ public enum Mode {
+ CREATE,
+ REMOVE,
+ UPDATE,
+ ADD_PLAYER,
+ REMOVE_PLAYER,
+ }
+
+ public enum NameTagVisibility {
+ ALWAYS("always"),
+ NEVER("never"),
+ HIDE_FOR_OTHER_TEAMS("hideForOtherTeams"),
+ HIDE_FOR_OWN_TEAM("hideForOwnTeam");
+
+ private final String value;
+
+ NameTagVisibility(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+ }
+
+ public enum CollisionRule {
+ ALWAYS("always"),
+ NEVER("never"),
+ PUSH_OTHER_TEAMS("pushOtherTeams"),
+ PUSH_OWN_TEAM("pushOwnTeam");
+
+ private final String value;
+
+ CollisionRule(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Mode getMode() {
+ return mode;
+ }
+
+ public Component getDisplayName() {
+ return displayName;
+ }
+
+ public Component getPrefix() {
+ return prefix;
+ }
+
+ public Component getSuffix() {
+ return suffix;
+ }
+
+ public NameTagVisibility getNameTagVisibility() {
+ return nameTagVisibility;
+ }
+
+ public CollisionRule getCollisionRule() {
+ return collisionRule;
+ }
+
+ public int getColor() {
+ return color;
+ }
+
+ public byte getFriendlyFlags() {
+ return friendlyFlags;
+ }
+
+ public List getPlayers() {
+ return players;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setMode(Mode mode) {
+ this.mode = mode;
+ }
+
+ public void setDisplayName(Component displayName) {
+ this.displayName = displayName;
+ }
+
+ public void setPrefix(Component prefix) {
+ this.prefix = prefix;
+ }
+
+ public void setSuffix(Component suffix) {
+ this.suffix = suffix;
+ }
+
+ public void setNameTagVisibility(NameTagVisibility nameTagVisibility) {
+ this.nameTagVisibility = nameTagVisibility;
+ }
+
+ public void setCollisionRule(CollisionRule collisionRule) {
+ this.collisionRule = collisionRule;
+ }
+
+ public void setColor(int color) {
+ this.color = color;
+ }
+
+ public void setFriendlyFlags(byte friendlyFlags) {
+ this.friendlyFlags = friendlyFlags;
+ }
+
+ public void setPlayers(List players) {
+ this.players = players;
+ }
+}