Merge pull request #523 from Artuto/dev/1.1.0

Add support for retrieving the Player's client brand
This commit is contained in:
Andrew Steinborn
2021-06-12 23:11:41 +00:00
committed by GitHub
4 changed files with 27 additions and 5 deletions

View File

@@ -218,4 +218,11 @@ public interface Player extends CommandSource, Identified, InboundConnection,
*/
@Override
boolean sendPluginMessage(ChannelIdentifier identifier, byte[] data);
/**
* Gets the player's client brand.
*
* @return the player's client brand
*/
@Nullable String getClientBrand();
}

View File

@@ -230,6 +230,7 @@ public class ClientPlaySessionHandler implements MinecraftSessionHandler {
player.getKnownChannels().removeAll(PluginMessageUtil.getChannels(packet));
backendConn.write(packet.retain());
} else if (PluginMessageUtil.isMcBrand(packet)) {
player.setClientBrand(PluginMessageUtil.readBrandMessage(packet.content()));
backendConn.write(PluginMessageUtil
.rewriteMinecraftBrand(packet, server.getVersion(), player.getProtocolVersion()));
} else if (BungeeCordMessageResponder.isBungeeCordMessage(packet)) {

View File

@@ -136,6 +136,7 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
private final Queue<ResourcePackInfo> outstandingResourcePacks = new ArrayDeque<>();
private @Nullable ResourcePackInfo pendingResourcePack;
private @Nullable ResourcePackInfo appliedResourcePack;
private @Nullable String clientBrand;
ConnectedPlayer(VelocityServer server, GameProfile profile, MinecraftConnection connection,
@Nullable InetSocketAddress virtualHost, boolean onlineMode) {
@@ -753,6 +754,15 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
return true;
}
@Override
public String getClientBrand() {
return clientBrand;
}
void setClientBrand(String clientBrand) {
this.clientBrand = clientBrand;
}
@Override
public void spoofChatInput(String input) {
Preconditions.checkArgument(input.length() <= Chat.MAX_SERVERBOUND_MESSAGE_LENGTH,

View File

@@ -139,11 +139,15 @@ public final class PluginMessageUtil {
return new PluginMessage(message.getChannel(), rewrittenBuf);
}
private static String readBrandMessage(ByteBuf content) {
// Some clients (mostly poorly-implemented bots) do not send validly-formed brand messages.
// In order to accommodate their broken behavior, we'll first try to read in the 1.8 format, and
// if that fails, treat it as a 1.7-format message (which has no prefixed length). (The message
// Velocity sends will be in the correct format depending on the protocol.)
/**
* Some clients (mostly poorly-implemented bots) do not send validly-formed brand messages.
* In order to accommodate their broken behavior, we'll first try to read in the 1.8 format, and
* if that fails, treat it as a 1.7-format message (which has no prefixed length). (The message
* Velocity sends will be in the correct format depending on the protocol.)
* @param content the brand packet
* @return the client brand
*/
public static String readBrandMessage(ByteBuf content) {
try {
return ProtocolUtils.readString(content.slice());
} catch (Exception e) {