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; + } +}