Fix early sending of resource pack

Fixes #3476
This commit is contained in:
Nassim Jahnke 2023-10-15 18:12:39 +10:00
parent 0912e33358
commit 65158455cc
3 changed files with 50 additions and 8 deletions

View File

@ -119,6 +119,14 @@ public final class Protocol1_20_2To1_20_3 extends BackwardsProtocol<ClientboundP
}
}
});
registerClientbound(ClientboundPackets1_20_2.BOSSBAR, wrapper -> {
wrapper.passthrough(Type.UUID); // Id
final int action = wrapper.passthrough(Type.VAR_INT);
if (action == 0 || action == 3) {
convertComponent(wrapper);
}
});
registerClientbound(ClientboundPackets1_20_2.PLAYER_CHAT, wrapper -> {
wrapper.passthrough(Type.UUID); // Sender
wrapper.passthrough(Type.VAR_INT); // Index

View File

@ -111,9 +111,26 @@ public final class Protocol1_20To1_20_2 extends BackwardsProtocol<ClientboundPac
cancelClientbound(ClientboundPackets1_20_2.PONG_RESPONSE);
// Some can be directly remapped to play packets, others need to be queued
registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_2.DISCONNECT.getId(), ClientboundPackets1_19_4.DISCONNECT.getId());
registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_2.KEEP_ALIVE.getId(), ClientboundPackets1_19_4.KEEP_ALIVE.getId());
registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_2.RESOURCE_PACK.getId(), ClientboundPackets1_19_4.RESOURCE_PACK.getId());
// Set the packet type properly so the state on it is changed
registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_2.DISCONNECT.getId(), -1, wrapper -> {
wrapper.setPacketType(ClientboundPackets1_19_4.DISCONNECT);
});
registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_2.KEEP_ALIVE.getId(), -1, wrapper -> {
wrapper.setPacketType(ClientboundPackets1_19_4.KEEP_ALIVE);
});
registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_2.RESOURCE_PACK.getId(), -1, wrapper -> {
// Send after join. We have to pretend the client accepted, else the server won't continue...
wrapper.user().get(ConfigurationPacketStorage.class).setResourcePack(wrapper);
wrapper.cancel();
final PacketWrapper acceptedResponse = wrapper.create(ServerboundConfigurationPackets1_20_2.RESOURCE_PACK);
acceptedResponse.write(Type.VAR_INT, 3);
acceptedResponse.sendToServer(Protocol1_20To1_20_2.class);
final PacketWrapper downloadedResponse = wrapper.create(ServerboundConfigurationPackets1_20_2.RESOURCE_PACK);
downloadedResponse.write(Type.VAR_INT, 0);
downloadedResponse.sendToServer(Protocol1_20To1_20_2.class);
});
registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_2.REGISTRY_DATA.getId(), -1, wrapper -> {
wrapper.cancel();
@ -123,18 +140,17 @@ public final class Protocol1_20To1_20_2 extends BackwardsProtocol<ClientboundPac
wrapper.user().get(ConfigurationPacketStorage.class).setRegistry(registry);
});
registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_2.UPDATE_ENABLED_FEATURES.getId(), -1, wrapper -> {
wrapper.cancel();
final String[] enabledFeatures = wrapper.read(Type.STRING_ARRAY);
wrapper.user().get(ConfigurationPacketStorage.class).setEnabledFeatures(enabledFeatures);
wrapper.cancel();
});
registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_2.UPDATE_TAGS.getId(), -1, wrapper -> {
wrapper.cancel();
wrapper.user().get(ConfigurationPacketStorage.class).addRawPacket(wrapper, ClientboundPackets1_19_4.TAGS);
wrapper.cancel();
});
registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_2.CUSTOM_PAYLOAD.getId(), -1, wrapper -> {
wrapper.cancel();
wrapper.user().get(ConfigurationPacketStorage.class).addRawPacket(wrapper, ClientboundPackets1_19_4.PLUGIN_MESSAGE);
wrapper.cancel();
});
}

View File

@ -24,6 +24,7 @@ import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.protocol.packet.PacketType;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
import com.viaversion.viaversion.protocols.protocol1_19_4to1_19_3.ClientboundPackets1_19_4;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import java.util.ArrayList;
@ -35,6 +36,11 @@ public final class ConfigurationPacketStorage implements StorableObject {
private CompoundTag registry;
private String[] enabledFeatures;
private boolean finished;
private QueuedPacket resourcePack;
public void setResourcePack(final PacketWrapper wrapper) throws Exception {
resourcePack = toQueuedPacket(wrapper, ClientboundPackets1_19_4.RESOURCE_PACK);
}
public CompoundTag registry() {
Preconditions.checkNotNull(registry);
@ -55,15 +61,27 @@ public final class ConfigurationPacketStorage implements StorableObject {
}
public void addRawPacket(final PacketWrapper wrapper, final PacketType type) throws Exception {
rawPackets.add(toQueuedPacket(wrapper, type));
}
private QueuedPacket toQueuedPacket(final PacketWrapper wrapper, final PacketType type) throws Exception {
Preconditions.checkArgument(!wrapper.isCancelled(), "Wrapper should be cancelled AFTER calling toQueuedPacket");
// It's easier to just copy it to a byte array buffer than to manually read the data
final ByteBuf buf = Unpooled.buffer();
//noinspection deprecation
wrapper.setId(-1); // Don't write the packet id to the buffer
wrapper.writeToBuffer(buf);
rawPackets.add(new QueuedPacket(buf, type));
return new QueuedPacket(buf, type);
}
public void sendQueuedPackets(final UserConnection connection) throws Exception {
// Send resource pack at the end
if (resourcePack != null) {
rawPackets.add(resourcePack);
resourcePack = null;
}
for (final QueuedPacket queuedPacket : rawPackets) {
try {
final PacketWrapper packet = PacketWrapper.create(queuedPacket.packetType(), queuedPacket.buf(), connection);