Send empty tags packet if not sent early enough when leaving config stage

Some tags are required before the client finalizes its registries, this lets Via fill them up early enough in later protocols
This commit is contained in:
Nassim Jahnke committed 2026-03-25 16:21:09 +01:00
1 parent 219d374d7c
commit 8d3c36de06
2 files changed
+17 -3

No files matched your search

@@ -25,6 +25,8 @@ import com.viaversion.viaversion.api.connection.ProtocolInfo;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.data.MappingData;
import com.viaversion.viaversion.api.data.MappingDataBase;
import com.viaversion.viaversion.api.minecraft.RegistryType;
import com.viaversion.viaversion.api.minecraft.TagData;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_19_4;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viaversion.api.protocol.packet.Direction;
@@ -57,6 +59,8 @@ import com.viaversion.viaversion.rewriter.ParticleRewriter;
import com.viaversion.viaversion.rewriter.SoundRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
import com.viaversion.viaversion.util.Key;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import org.checkerframework.checker.nullness.qual.Nullable;
@@ -344,15 +348,24 @@ public final class Protocol1_20To1_20_2 extends AbstractProtocol<ClientboundPack
// The client includes vanilla as the default feature when initially leaving the login phase
final LastTags lastTags = connection.get(LastTags.class);
boolean sentTags = false;
if (lastTags != null) {
if (lastTags.sentDuringConfigPhase()) {
lastTags.setSentDuringConfigPhase(false);
sentTags = true;
} else {
// The server might still follow up with a tags packet, but we wouldn't know
lastTags.sendLastTags(connection);
sentTags = lastTags.sendLastTags(connection);
}
}
if (!sentTags) {
// Send an empty tags packet to allow adding to it in later protocols
final PacketWrapper packet = PacketWrapper.create(ClientboundConfigurationPackets1_20_2.UPDATE_TAGS, connection);
packet.write(Types.VAR_INT, 0);
packet.send(Protocol1_20To1_20_2.class);
}
if (lastResourcePack != null && connection.getProtocolInfo().protocolVersion() == ProtocolVersion.v1_20_2) {
// The client for some reason drops the resource pack when reentering the configuration state
final PacketWrapper resourcePackPacket = PacketWrapper.create(ClientboundConfigurationPackets1_20_2.RESOURCE_PACK, connection);
@@ -48,9 +48,9 @@ public class LastTags implements StorableObject {
}
}
public void sendLastTags(final UserConnection connection) {
public boolean sendLastTags(final UserConnection connection) {
if (registryTags.isEmpty()) {
return;
return false;
}
final PacketWrapper packet = PacketWrapper.create(ClientboundConfigurationPackets1_20_2.UPDATE_TAGS, connection);
@@ -64,6 +64,7 @@ public class LastTags implements StorableObject {
}
}
packet.send(Protocol1_20To1_20_2.class);
return true;
}
public void setSentDuringConfigPhase(final boolean sentDuringConfigPhase) {