diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/Protocol1_20_2To1_20.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/Protocol1_20_2To1_20.java index d4b388809..139a4bdd0 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/Protocol1_20_2To1_20.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/Protocol1_20_2To1_20.java @@ -48,10 +48,10 @@ import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.rewriter.EntityP import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.storage.ConfigurationState; import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.storage.ConfigurationState.BridgePhase; import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.storage.LastResourcePack; +import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.storage.LastTags; import com.viaversion.viaversion.rewriter.SoundRewriter; -import org.checkerframework.checker.nullness.qual.Nullable; - import java.util.UUID; +import org.checkerframework.checker.nullness.qual.Nullable; public final class Protocol1_20_2To1_20 extends AbstractProtocol { @@ -95,6 +95,10 @@ public final class Protocol1_20_2To1_20 extends AbstractProtocol wrapper.user().put(new LastTags(wrapper))); + registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_2.UPDATE_TAGS.getId(), ClientboundConfigurationPackets1_20_2.UPDATE_TAGS.getId(), + wrapper -> wrapper.user().put(new LastTags(wrapper))); + registerClientbound(ClientboundPackets1_19_4.DISPLAY_SCOREBOARD, wrapper -> { final byte slot = wrapper.read(Type.BYTE); wrapper.write(Type.VAR_INT, (int) slot); @@ -220,7 +224,13 @@ public final class Protocol1_20_2To1_20 extends AbstractProtocol. + */ +package com.viaversion.viaversion.protocols.protocol1_20_2to1_20.storage; + +import com.viaversion.viaversion.api.connection.StorableObject; +import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; +import com.viaversion.viaversion.api.type.Type; +import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.Protocol1_20_2To1_20; +import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.ClientboundConfigurationPackets1_20_2; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class LastTags implements StorableObject { + + private final List registryTags = new ArrayList<>(); + + public LastTags(final PacketWrapper wrapper) throws Exception { + final int length = wrapper.passthrough(Type.VAR_INT); + for (int i = 0; i < length; i++) { + final List tags = new ArrayList<>(); + final String registryKey = wrapper.passthrough(Type.STRING); + final int tagsSize = wrapper.passthrough(Type.VAR_INT); + for (int j = 0; j < tagsSize; j++) { + final String key = wrapper.passthrough(Type.STRING); + final int[] ids = wrapper.passthrough(Type.VAR_INT_ARRAY_PRIMITIVE); + tags.add(new Tag(key, ids)); + } + + this.registryTags.add(new RegistryTags(registryKey, tags)); + } + } + + public void sendLastTags(final UserConnection connection) throws Exception { + if (registryTags.isEmpty()) { + return; + } + + final PacketWrapper packet = PacketWrapper.create(ClientboundConfigurationPackets1_20_2.UPDATE_TAGS, connection); + packet.write(Type.VAR_INT, registryTags.size()); + for (final RegistryTags registryTag : registryTags) { + packet.write(Type.STRING, registryTag.registryKey); + packet.write(Type.VAR_INT, registryTag.tags.size()); + for (final Tag tag : registryTag.tags) { + packet.write(Type.STRING, tag.key); + packet.write(Type.VAR_INT_ARRAY_PRIMITIVE, Arrays.copyOf(tag.ids, tag.ids.length)); + } + } + packet.send(Protocol1_20_2To1_20.class); + } + + private static final class RegistryTags { + private final String registryKey; + private final List tags; + + private RegistryTags(final String registryKey, final List tags) { + this.registryKey = registryKey; + this.tags = tags; + } + } + + private static final class Tag { + private final String key; + private final int[] ids; + + private Tag(final String key, final int[] ids) { + this.key = key; + this.ids = ids; + } + } +}