Mirror von
https://github.com/ViaVersion/ViaVersion.git
synchronisiert 2024-09-17 01:23:43 +02:00
Ursprung
11cb113619
Commit
0b93af88a3
@ -138,10 +138,28 @@ public final class Protocol1_20_2To1_20 extends AbstractProtocol<ClientboundPack
|
|||||||
configurationState.sendQueuedPackets(wrapper.user());
|
configurationState.sendQueuedPackets(wrapper.user());
|
||||||
configurationState.clear();
|
configurationState.clear();
|
||||||
});
|
});
|
||||||
registerServerbound(State.CONFIGURATION, ServerboundConfigurationPackets1_20_2.CLIENT_INFORMATION.getId(), -1, queueServerboundPacket(ServerboundPackets1_20_2.CLIENT_SETTINGS));
|
registerServerbound(State.CONFIGURATION, ServerboundConfigurationPackets1_20_2.CLIENT_INFORMATION.getId(), -1, wrapper -> {
|
||||||
|
final ConfigurationState.ClientInformation clientInformation = new ConfigurationState.ClientInformation(
|
||||||
|
wrapper.read(Type.STRING), // Language
|
||||||
|
wrapper.read(Type.BYTE), // View distance
|
||||||
|
wrapper.read(Type.VAR_INT), // Chat visibility
|
||||||
|
wrapper.read(Type.BOOLEAN), // Chat colors
|
||||||
|
wrapper.read(Type.UNSIGNED_BYTE), // Model customization
|
||||||
|
wrapper.read(Type.VAR_INT), // Main hand
|
||||||
|
wrapper.read(Type.BOOLEAN), // Text filtering enabled
|
||||||
|
wrapper.read(Type.BOOLEAN) // Allow listing in server list preview
|
||||||
|
);
|
||||||
|
|
||||||
|
// Store it to re-send it when another ClientboundLoginPacket is sent, since the client will only send it
|
||||||
|
// once per connection right after the handshake
|
||||||
|
final ConfigurationState configurationState = wrapper.user().get(ConfigurationState.class);
|
||||||
|
configurationState.setClientInformation(clientInformation);
|
||||||
|
wrapper.cancel();
|
||||||
|
});
|
||||||
registerServerbound(State.CONFIGURATION, ServerboundConfigurationPackets1_20_2.CUSTOM_PAYLOAD.getId(), -1, queueServerboundPacket(ServerboundPackets1_20_2.PLUGIN_MESSAGE));
|
registerServerbound(State.CONFIGURATION, ServerboundConfigurationPackets1_20_2.CUSTOM_PAYLOAD.getId(), -1, queueServerboundPacket(ServerboundPackets1_20_2.PLUGIN_MESSAGE));
|
||||||
registerServerbound(State.CONFIGURATION, ServerboundConfigurationPackets1_20_2.KEEP_ALIVE.getId(), -1, queueServerboundPacket(ServerboundPackets1_20_2.KEEP_ALIVE));
|
registerServerbound(State.CONFIGURATION, ServerboundConfigurationPackets1_20_2.KEEP_ALIVE.getId(), -1, queueServerboundPacket(ServerboundPackets1_20_2.KEEP_ALIVE));
|
||||||
registerServerbound(State.CONFIGURATION, ServerboundConfigurationPackets1_20_2.PONG.getId(), -1, queueServerboundPacket(ServerboundPackets1_20_2.PONG));
|
registerServerbound(State.CONFIGURATION, ServerboundConfigurationPackets1_20_2.PONG.getId(), -1, queueServerboundPacket(ServerboundPackets1_20_2.PONG));
|
||||||
|
|
||||||
// Cancel this, as it will always just be the response to a re-sent pack from us
|
// Cancel this, as it will always just be the response to a re-sent pack from us
|
||||||
registerServerbound(State.CONFIGURATION, ServerboundConfigurationPackets1_20_2.RESOURCE_PACK.getId(), -1, PacketWrapper::cancel);
|
registerServerbound(State.CONFIGURATION, ServerboundConfigurationPackets1_20_2.RESOURCE_PACK.getId(), -1, PacketWrapper::cancel);
|
||||||
|
|
||||||
|
@ -101,6 +101,7 @@ public final class EntityPacketRewriter1_20_2 extends EntityRewriter<Clientbound
|
|||||||
final ConfigurationState configurationBridge = wrapper.user().get(ConfigurationState.class);
|
final ConfigurationState configurationBridge = wrapper.user().get(ConfigurationState.class);
|
||||||
if (!configurationBridge.setLastDimensionRegistry(dimensionRegistry)) {
|
if (!configurationBridge.setLastDimensionRegistry(dimensionRegistry)) {
|
||||||
// No change, so no need to re-enter the configuration state - just let this one through
|
// No change, so no need to re-enter the configuration state - just let this one through
|
||||||
|
configurationBridge.sendClientInformation(wrapper.user());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,6 +22,8 @@ import com.viaversion.viaversion.api.connection.StorableObject;
|
|||||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||||
import com.viaversion.viaversion.api.protocol.packet.PacketType;
|
import com.viaversion.viaversion.api.protocol.packet.PacketType;
|
||||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||||
|
import com.viaversion.viaversion.api.type.Type;
|
||||||
|
import com.viaversion.viaversion.protocols.protocol1_19_4to1_19_3.ServerboundPackets1_19_4;
|
||||||
import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.Protocol1_20_2To1_20;
|
import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.Protocol1_20_2To1_20;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
@ -37,6 +39,7 @@ public class ConfigurationState implements StorableObject {
|
|||||||
private QueuedPacket joinGamePacket;
|
private QueuedPacket joinGamePacket;
|
||||||
private boolean queuedJoinGame;
|
private boolean queuedJoinGame;
|
||||||
private CompoundTag lastDimensionRegistry;
|
private CompoundTag lastDimensionRegistry;
|
||||||
|
private ClientInformation clientInformation;
|
||||||
|
|
||||||
public BridgePhase bridgePhase() {
|
public BridgePhase bridgePhase() {
|
||||||
return bridgePhase;
|
return bridgePhase;
|
||||||
@ -62,6 +65,10 @@ public class ConfigurationState implements StorableObject {
|
|||||||
return !equals;
|
return !equals;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setClientInformation(final ClientInformation clientInformation) {
|
||||||
|
this.clientInformation = clientInformation;
|
||||||
|
}
|
||||||
|
|
||||||
public void addPacketToQueue(final PacketWrapper wrapper, final boolean clientbound) throws Exception {
|
public void addPacketToQueue(final PacketWrapper wrapper, final boolean clientbound) throws Exception {
|
||||||
packetQueue.add(toQueuedPacket(wrapper, clientbound, false));
|
packetQueue.add(toQueuedPacket(wrapper, clientbound, false));
|
||||||
}
|
}
|
||||||
@ -104,6 +111,8 @@ public class ConfigurationState implements StorableObject {
|
|||||||
joinGamePacket = null;
|
joinGamePacket = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sendClientInformation(connection);
|
||||||
|
|
||||||
final ConfigurationState.QueuedPacket[] queuedPackets = packetQueue.toArray(new ConfigurationState.QueuedPacket[0]);
|
final ConfigurationState.QueuedPacket[] queuedPackets = packetQueue.toArray(new ConfigurationState.QueuedPacket[0]);
|
||||||
packetQueue.clear();
|
packetQueue.clear();
|
||||||
|
|
||||||
@ -142,6 +151,24 @@ public class ConfigurationState implements StorableObject {
|
|||||||
NONE, PROFILE_SENT, CONFIGURATION, REENTERING_CONFIGURATION
|
NONE, PROFILE_SENT, CONFIGURATION, REENTERING_CONFIGURATION
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void sendClientInformation(final UserConnection connection) throws Exception {
|
||||||
|
if (clientInformation == null) {
|
||||||
|
// Should never be null, but we also shouldn't error
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final PacketWrapper settingsPacket = PacketWrapper.create(ServerboundPackets1_19_4.CLIENT_SETTINGS, connection);
|
||||||
|
settingsPacket.write(Type.STRING, clientInformation.language);
|
||||||
|
settingsPacket.write(Type.BYTE, clientInformation.viewDistance);
|
||||||
|
settingsPacket.write(Type.VAR_INT, clientInformation.chatVisibility);
|
||||||
|
settingsPacket.write(Type.BOOLEAN, clientInformation.showChatColors);
|
||||||
|
settingsPacket.write(Type.UNSIGNED_BYTE, clientInformation.modelCustomization);
|
||||||
|
settingsPacket.write(Type.VAR_INT, clientInformation.mainHand);
|
||||||
|
settingsPacket.write(Type.BOOLEAN, clientInformation.textFiltering);
|
||||||
|
settingsPacket.write(Type.BOOLEAN, clientInformation.allowListing);
|
||||||
|
settingsPacket.sendToServer(Protocol1_20_2To1_20.class);
|
||||||
|
}
|
||||||
|
|
||||||
public static final class QueuedPacket {
|
public static final class QueuedPacket {
|
||||||
private final ByteBuf buf;
|
private final ByteBuf buf;
|
||||||
private final boolean clientbound;
|
private final boolean clientbound;
|
||||||
@ -189,4 +216,28 @@ public class ConfigurationState implements StorableObject {
|
|||||||
'}';
|
'}';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final class ClientInformation {
|
||||||
|
private final String language;
|
||||||
|
private final byte viewDistance;
|
||||||
|
private final int chatVisibility;
|
||||||
|
private final boolean showChatColors;
|
||||||
|
private final short modelCustomization;
|
||||||
|
private final int mainHand;
|
||||||
|
private final boolean textFiltering;
|
||||||
|
private final boolean allowListing;
|
||||||
|
|
||||||
|
public ClientInformation(final String language, final byte viewDistance, final int chatVisibility,
|
||||||
|
final boolean showChatColors, final short modelCustomization, final int mainHand,
|
||||||
|
final boolean textFiltering, final boolean allowListing) {
|
||||||
|
this.language = language;
|
||||||
|
this.viewDistance = viewDistance;
|
||||||
|
this.chatVisibility = chatVisibility;
|
||||||
|
this.showChatColors = showChatColors;
|
||||||
|
this.modelCustomization = modelCustomization;
|
||||||
|
this.mainHand = mainHand;
|
||||||
|
this.textFiltering = textFiltering;
|
||||||
|
this.allowListing = allowListing;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren