diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/FullIdentityMappings.java b/api/src/main/java/com/viaversion/viaversion/api/data/FullIdentityMappings.java new file mode 100644 index 000000000..5d16a9519 --- /dev/null +++ b/api/src/main/java/com/viaversion/viaversion/api/data/FullIdentityMappings.java @@ -0,0 +1,123 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2026 ViaVersion and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.viaversion.viaversion.api.data; + +import com.google.common.base.Preconditions; +import com.viaversion.viaversion.api.data.MappingDataLoader.IdentifiersPair; +import com.viaversion.viaversion.util.Key; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import org.checkerframework.checker.nullness.qual.Nullable; + +public class FullIdentityMappings implements FullMappings { + private static final String[] EMPTY_ARRAY = new String[0]; + private final Object2IntMap stringToId; + private final String[] idToString; + private final Mappings mappings; + + public FullIdentityMappings(final IdentifiersPair identifiersPair, final Mappings mappings) { + Preconditions.checkNotNull(mappings, "Mappings cannot be null"); + this.mappings = mappings; + this.stringToId = FullMappingsBase.toInverseMap(identifiersPair.unmapped()); + this.idToString = identifiersPair.unmapped().toArray(EMPTY_ARRAY); + } + + private FullIdentityMappings(final Object2IntMap stringToId, final String[] idToString, final Mappings mappings) { + this.stringToId = stringToId; + this.idToString = idToString; + this.mappings = mappings; + } + + @Override + public int id(final String identifier) { + return stringToId.getInt(Key.stripMinecraftNamespace(identifier)); + } + + @Override + public int mappedId(final String mappedIdentifier) { + return id(mappedIdentifier); + } + + @Override + public String identifier(final int id) { + if (id < 0 || id >= idToString.length) { + return null; + } + final String identifier = idToString[id]; + return Key.namespaced(identifier); + } + + @Override + public @Nullable String identifier(final String mappedIdentifier) { + final int mappedId = mappedId(mappedIdentifier); + if (mappedId == -1) { + return null; + } + final int id = mappings.inverse().getNewId(mappedId); + return id != -1 ? identifier(id) : null; + } + + @Override + public @Nullable String mappedIdentifier(final int mappedId) { + return identifier(mappedId); + } + + @Override + public @Nullable String mappedIdentifier(final String identifier) { + return identifier(identifier); + } + + @Override + public int getNewId(int id) { + return mappings.getNewId(id); + } + + @Override + public void setNewId(int id, int mappedId) { + mappings.setNewId(id, mappedId); + } + + @Override + public int size() { + return mappings.size(); + } + + @Override + public int mappedSize() { + return mappings.mappedSize(); + } + + @Override + public boolean isIdentity() { + return true; + } + + @Override + public boolean isIntIdIdentity() { + return true; + } + + @Override + public FullMappings inverse() { + return new FullIdentityMappings(stringToId, idToString, mappings.inverse()); + } +} diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/FullMappings.java b/api/src/main/java/com/viaversion/viaversion/api/data/FullMappings.java index 3f410e5af..3bf6435ff 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/FullMappings.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/FullMappings.java @@ -77,6 +77,14 @@ public interface FullMappings extends BiMappings { */ @Nullable String mappedIdentifier(String identifier); + /** + * Returns whether the int id mappings are identity mappings. + * + * @return whether the int id mappings are identity mappings + * @see #isIdentity() + */ + boolean isIntIdIdentity(); + @Override FullMappings inverse(); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/FullMappingsBase.java b/api/src/main/java/com/viaversion/viaversion/api/data/FullMappingsBase.java index ee034c392..34d563a55 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/FullMappingsBase.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/FullMappingsBase.java @@ -23,6 +23,7 @@ package com.viaversion.viaversion.api.data; import com.google.common.base.Preconditions; +import com.viaversion.viaversion.api.data.MappingDataLoader.IdentifiersPair; import com.viaversion.viaversion.util.Key; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; @@ -37,13 +38,13 @@ public class FullMappingsBase implements FullMappings { private final String[] mappedIdToString; private final Mappings mappings; - public FullMappingsBase(final List unmappedIdentifiers, final List mappedIdentifiers, final Mappings mappings) { + public FullMappingsBase(final IdentifiersPair identifiersPair, final Mappings mappings) { Preconditions.checkNotNull(mappings, "Mappings cannot be null"); this.mappings = mappings; - this.stringToId = toInverseMap(unmappedIdentifiers); - this.mappedStringToId = toInverseMap(mappedIdentifiers); - this.idToString = unmappedIdentifiers.toArray(EMPTY_ARRAY); - this.mappedIdToString = mappedIdentifiers.toArray(EMPTY_ARRAY); + this.stringToId = toInverseMap(identifiersPair.unmapped()); + this.idToString = identifiersPair.unmapped().toArray(EMPTY_ARRAY); + this.mappedStringToId = toInverseMap(identifiersPair.mapped()); + this.mappedIdToString = identifiersPair.mapped().toArray(EMPTY_ARRAY); } private FullMappingsBase(final Object2IntMap stringToId, final Object2IntMap mappedStringToId, final String[] idToString, final String[] mappedIdToString, final Mappings mappings) { @@ -54,7 +55,11 @@ public class FullMappingsBase implements FullMappings { this.mappings = mappings; } - private static Object2IntMap toInverseMap(final List list) { + public static FullMappings of(final IdentifiersPair identifiersPair, final Mappings mappings) { + return mappings.isIdentity() && identifiersPair.identity() ? new FullIdentityMappings(identifiersPair, mappings) : new FullMappingsBase(identifiersPair, mappings); + } + + static Object2IntMap toInverseMap(final List list) { final Object2IntMap map = new Object2IntOpenHashMap<>(list.size()); map.defaultReturnValue(-1); for (int i = 0; i < list.size(); i++) { @@ -135,6 +140,11 @@ public class FullMappingsBase implements FullMappings { return mappings.mappedSize(); } + @Override + public boolean isIntIdIdentity() { + return mappings.isIdentity(); + } + @Override public FullMappings inverse() { return new FullMappingsBase(mappedStringToId, stringToId, mappedIdToString, idToString, mappings.inverse()); diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/IdentityMappings.java b/api/src/main/java/com/viaversion/viaversion/api/data/IdentityMappings.java index 6d45fab30..42f21d2ba 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/IdentityMappings.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/IdentityMappings.java @@ -38,4 +38,9 @@ public record IdentityMappings(int size, int mappedSize) implements Mappings { public Mappings inverse() { return new IdentityMappings(mappedSize, size); } + + @Override + public boolean isIdentity() { + return true; + } } diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataBase.java b/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataBase.java index 2b95c8e1d..6e51f588e 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataBase.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataBase.java @@ -26,6 +26,7 @@ import com.viaversion.nbt.tag.CompoundTag; import com.viaversion.nbt.tag.IntArrayTag; import com.viaversion.nbt.tag.Tag; import com.viaversion.viaversion.api.Via; +import com.viaversion.viaversion.api.data.MappingDataLoader.IdentifiersPair; import com.viaversion.viaversion.api.minecraft.RegistryType; import com.viaversion.viaversion.api.minecraft.TagData; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; @@ -96,14 +97,13 @@ public class MappingDataBase implements MappingData { attributeMappings = loadFullMappings(data, unmappedIdentifierData, mappedIdentifierData, "attributes"); blockEntityMappings = loadFullMappings(data, unmappedIdentifierData, mappedIdentifierData, "blockentities"); - final List unmappedParticles = identifiersFromGlobalIds(unmappedIdentifierData, "particles"); - final List mappedParticles = identifiersFromGlobalIds(mappedIdentifierData, "particles"); - if (unmappedParticles != null && mappedParticles != null) { + final IdentifiersPair particleIdentifiers = identifiersFromGlobalIds(unmappedIdentifierData, mappedIdentifierData, "particles"); + if (particleIdentifiers != null) { Mappings particleMappings = loadMappings(data, "particles"); if (particleMappings == null) { - particleMappings = new IdentityMappings(unmappedParticles.size(), mappedParticles.size()); + particleMappings = new IdentityMappings(particleIdentifiers.unmapped().size(), particleIdentifiers.mapped().size()); } - this.particleMappings = new ParticleMappings(unmappedParticles, mappedParticles, particleMappings); + this.particleMappings = new ParticleMappings(particleIdentifiers, particleMappings); } } else { // Might not have identifiers in older versions @@ -132,6 +132,10 @@ public class MappingDataBase implements MappingData { return MappingDataLoader.INSTANCE.identifiersFromGlobalIds(mappingsTag, key); } + protected @Nullable IdentifiersPair identifiersFromGlobalIds(final CompoundTag unmappedTag, final CompoundTag mappedTag, final String key) { + return MappingDataLoader.INSTANCE.identifiersFromGlobalIds(unmappedTag, mappedTag, key); + } + protected @Nullable CompoundTag readMappingsFile(final String name) { return MappingDataLoader.INSTANCE.loadNBT(name); } @@ -158,14 +162,12 @@ public class MappingDataBase implements MappingData { return null; } - final List unmappedIdentifiers = identifiersFromGlobalIds(unmappedIdentifiersTag, key); - final List mappedIdentifiers = identifiersFromGlobalIds(mappedIdentifiersTag, key); + final IdentifiersPair identifiersPair = identifiersFromGlobalIds(unmappedIdentifiersTag, mappedIdentifiersTag, key); Mappings mappings = loadBiMappings(data, key); // Load as bi-mappings to keep the inverse cached if (mappings == null) { - mappings = new IdentityMappings(unmappedIdentifiers.size(), mappedIdentifiers.size()); + mappings = new IdentityMappings(identifiersPair.unmapped().size(), identifiersPair.mapped().size()); } - - return new FullMappingsBase(unmappedIdentifiers, mappedIdentifiers, mappings); + return FullMappingsBase.of(identifiersPair, mappings); } protected @Nullable BiMappings loadBiMappings(final CompoundTag data, final String key) { diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataLoader.java b/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataLoader.java index c23015baa..eeb168eaa 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataLoader.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataLoader.java @@ -272,13 +272,60 @@ public class MappingDataLoader { public @Nullable List identifiersFromGlobalIds(final CompoundTag mappingsTag, final String key) { final Mappings mappings = loadMappings(mappingsTag, key); - if (mappings == null) { + return mappings != null ? identifiers(mappings, key) : null; + + } + + /** + * Returns a pair of identifier lists, also keeping track of whether the two lists are equal. + * + * @param unmappedTag unmapped mappings tag + * @param mappedTag mapped mappings tag + * @param key mappings key + * @return pair of identifier lists + */ + public @Nullable IdentifiersPair identifiersFromGlobalIds(final CompoundTag unmappedTag, final CompoundTag mappedTag, final String key) { + final Mappings unmapped = loadMappings(unmappedTag, key); + if (unmapped == null) { return null; } + final Mappings mapped = loadMappings(mappedTag, key); + if (mapped == null) { + return null; + } + + final int size = unmapped.size(); + if (size != mapped.size()) { + return new IdentifiersPair(identifiers(unmapped, key), identifiers(mapped, key), false); + } + + // Small optimization to only load one array and reduce loading for full mappings + final List unmappedIdentifiers = new ArrayList<>(size); + final List mappedIdentifiers = new ArrayList<>(size); + boolean identity = true; + for (int i = 0; i < size; i++) { + final int unmappedGlobalId = unmapped.getNewId(i); + final int mappedGlobalId = mapped.getNewId(i); + final String unmappedIdentifier = identifierFromGlobalId(key, unmappedGlobalId); + if (unmappedGlobalId == mappedGlobalId) { + unmappedIdentifiers.add(unmappedIdentifier); + mappedIdentifiers.add(unmappedIdentifier); + continue; + } + + identity = false; + unmappedIdentifiers.add(unmappedIdentifier); + mappedIdentifiers.add(identifierFromGlobalId(key, mappedGlobalId)); + } + return identity ? new IdentifiersPair(unmappedIdentifiers) : new IdentifiersPair(unmappedIdentifiers, mappedIdentifiers); + } + + private List identifiers(final Mappings mappings, final String key) { final List identifiers = new ArrayList<>(mappings.size()); for (int i = 0; i < mappings.size(); i++) { - identifiers.add(identifierFromGlobalId(key, mappings.getNewId(i))); + final int globalId = mappings.getNewId(i); + identifiers.add(identifierFromGlobalId(key, globalId)); } return identifiers; } @@ -342,4 +389,15 @@ public class MappingDataLoader { T create(V mappings, int mappedSize); } + + public record IdentifiersPair(List unmapped, List mapped, boolean identity) { + + public IdentifiersPair(final List unmapped, final List mapped) { + this(unmapped, mapped, false); + } + + public IdentifiersPair(final List identifiers) { + this(identifiers, identifiers, true); + } + } } diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/Mappings.java b/api/src/main/java/com/viaversion/viaversion/api/data/Mappings.java index 24566b4c1..9ba112e3e 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/Mappings.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/Mappings.java @@ -22,6 +22,8 @@ */ package com.viaversion.viaversion.api.data; +import org.checkerframework.checker.nullness.qual.Nullable; + public interface Mappings { /** @@ -84,4 +86,40 @@ public interface Mappings { * @return mappings with keys and values swapped */ Mappings inverse(); + + + /** + * Returns whether the mappings are unchanged identity mappings. + * + * @return whether the mappings are unchanged identity mappings + */ + default boolean isIdentity() { + return false; + } + + /** + * Returns whether the mappings null or identity mappings. + * + * @param mappings mappings + * @return whether the mappings are identity mappings + * @see #isFullIdentity(Mappings) + */ + static boolean isIntIdIdentity(@Nullable final Mappings mappings) { + if (mappings == null) { + return true; + } + return mappings instanceof FullMappings fullMappings ? fullMappings.isIntIdIdentity() : mappings.isIdentity(); + } + + /** + * Returns whether the mappings null or full identity mappings. + * Stronger than {@link #isIntIdIdentity(Mappings)}, but equal to that if not {@link FullMappings}. + * + * @param mappings mappings + * @return whether the mappings are full identity mappings + * @see #isIntIdIdentity(Mappings) + */ + static boolean isFullIdentity(@Nullable final Mappings mappings) { + return mappings == null || mappings.isIdentity(); + } } diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/ParticleMappings.java b/api/src/main/java/com/viaversion/viaversion/api/data/ParticleMappings.java index 626a4dff1..07d968d98 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/ParticleMappings.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/ParticleMappings.java @@ -22,16 +22,16 @@ */ package com.viaversion.viaversion.api.data; +import com.viaversion.viaversion.api.data.MappingDataLoader.IdentifiersPair; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; -import java.util.List; public class ParticleMappings extends FullMappingsBase { private final IntList itemParticleIds = new IntArrayList(4); private final IntList blockParticleIds = new IntArrayList(4); - public ParticleMappings(final List unmappedIdentifiers, final List mappedIdentifiers, final Mappings mappings) { - super(unmappedIdentifiers, mappedIdentifiers, mappings); + public ParticleMappings(final IdentifiersPair identifiersPair, final Mappings mappings) { + super(identifiersPair, mappings); addBlockParticle("block"); addBlockParticle("falling_dust"); addBlockParticle("block_marker"); diff --git a/api/src/main/java/com/viaversion/viaversion/api/protocol/AbstractSimpleProtocol.java b/api/src/main/java/com/viaversion/viaversion/api/protocol/AbstractSimpleProtocol.java deleted file mode 100644 index 658901cae..000000000 --- a/api/src/main/java/com/viaversion/viaversion/api/protocol/AbstractSimpleProtocol.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion - * Copyright (C) 2016-2026 ViaVersion and contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.viaversion.viaversion.api.protocol; - -/** - * A simple protocol which does not have any packet types. - *

- * {@link AbstractProtocol} should be preferred over this class in most cases. - */ -public abstract class AbstractSimpleProtocol extends AbstractProtocol implements SimpleProtocol { - - protected AbstractSimpleProtocol() { - super(null, null, null, null); - } -} diff --git a/api/src/main/java/com/viaversion/viaversion/api/protocol/Protocol.java b/api/src/main/java/com/viaversion/viaversion/api/protocol/Protocol.java index 308b3b055..d814765da 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/protocol/Protocol.java +++ b/api/src/main/java/com/viaversion/viaversion/api/protocol/Protocol.java @@ -260,6 +260,22 @@ public interface Protocol> dependsOn() { + return null; + } } diff --git a/api/src/main/java/com/viaversion/viaversion/api/protocol/packet/mapping/PacketIdMapping.java b/api/src/main/java/com/viaversion/viaversion/api/protocol/packet/mapping/PacketIdMapping.java index f98ec421a..a97f89086 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/protocol/packet/mapping/PacketIdMapping.java +++ b/api/src/main/java/com/viaversion/viaversion/api/protocol/packet/mapping/PacketIdMapping.java @@ -50,6 +50,11 @@ final class PacketIdMapping implements PacketMapping { } } + @Override + public void setHandler(@Nullable final PacketHandler handler) { + this.handler = handler; + } + @Override public @Nullable PacketHandler handler() { return handler; diff --git a/api/src/main/java/com/viaversion/viaversion/api/protocol/packet/mapping/PacketMapping.java b/api/src/main/java/com/viaversion/viaversion/api/protocol/packet/mapping/PacketMapping.java index a812cddf7..51e7cc684 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/protocol/packet/mapping/PacketMapping.java +++ b/api/src/main/java/com/viaversion/viaversion/api/protocol/packet/mapping/PacketMapping.java @@ -39,6 +39,13 @@ public interface PacketMapping { */ void applyType(PacketWrapper wrapper); + /** + * Replaces the current packet handler. + * + * @param handler packet transformer + */ + void setHandler(@Nullable PacketHandler handler); + /** * Returns a packet transformer to transform a packet from one protocol version to another. * diff --git a/api/src/main/java/com/viaversion/viaversion/api/protocol/packet/mapping/PacketTypeMapping.java b/api/src/main/java/com/viaversion/viaversion/api/protocol/packet/mapping/PacketTypeMapping.java index ff2c7af60..025bd5fe8 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/protocol/packet/mapping/PacketTypeMapping.java +++ b/api/src/main/java/com/viaversion/viaversion/api/protocol/packet/mapping/PacketTypeMapping.java @@ -52,6 +52,11 @@ final class PacketTypeMapping implements PacketMapping { } } + @Override + public void setHandler(@Nullable final PacketHandler handler) { + this.handler = handler; + } + @Override public @Nullable PacketHandler handler() { return handler; diff --git a/api/src/main/java/com/viaversion/viaversion/api/rewriter/ComponentRewriter.java b/api/src/main/java/com/viaversion/viaversion/api/rewriter/ComponentRewriter.java index d6d3578cb..b256aa280 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/rewriter/ComponentRewriter.java +++ b/api/src/main/java/com/viaversion/viaversion/api/rewriter/ComponentRewriter.java @@ -26,6 +26,7 @@ import com.google.gson.JsonElement; import com.viaversion.nbt.tag.CompoundTag; import com.viaversion.nbt.tag.Tag; import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import org.checkerframework.checker.nullness.qual.Nullable; public interface ComponentRewriter { @@ -37,4 +38,6 @@ public interface ComponentRewriter { JsonElement processText(UserConnection connection, @Nullable String json); void handleShowItem(UserConnection connection, CompoundTag itemTag); + + void passthroughAndProcess(PacketWrapper wrapper); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/rewriter/EntityRewriter.java b/api/src/main/java/com/viaversion/viaversion/api/rewriter/EntityRewriter.java index c2262f94a..c44bb35c2 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/rewriter/EntityRewriter.java +++ b/api/src/main/java/com/viaversion/viaversion/api/rewriter/EntityRewriter.java @@ -28,6 +28,7 @@ import com.viaversion.viaversion.api.minecraft.entities.EntityType; import com.viaversion.viaversion.api.minecraft.entitydata.EntityData; import com.viaversion.viaversion.api.protocol.Protocol; import java.util.List; +import org.checkerframework.checker.nullness.qual.Nullable; public interface EntityRewriter> extends Rewriter { @@ -39,6 +40,11 @@ public interface EntityRewriter> extends Rewriter */ EntityType typeFromId(int type); + default @Nullable EntityType typeFromId(final String type) { + final int id = protocol().getMappingData().getEntityMappings().id(type); + return id == -1 ? null : typeFromId(id); + } + /** * Returns the entity type from the given id. * From 1.14 and onwards, this is the same exact value as {@link #typeFromId(int)}. diff --git a/api/src/main/java/com/viaversion/viaversion/api/rewriter/RegistryDataRewriter.java b/api/src/main/java/com/viaversion/viaversion/api/rewriter/RegistryDataRewriter.java index edbabadb8..146fe5bd0 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/rewriter/RegistryDataRewriter.java +++ b/api/src/main/java/com/viaversion/viaversion/api/rewriter/RegistryDataRewriter.java @@ -23,16 +23,21 @@ package com.viaversion.viaversion.api.rewriter; import com.viaversion.nbt.tag.CompoundTag; +import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.util.KeyMappings; import org.checkerframework.checker.nullness.qual.Nullable; public interface RegistryDataRewriter { + void handle(PacketWrapper wrapper); + @Nullable KeyMappings getMappings(String registryKey); boolean shouldRemoveRegistry(String registryKey); + boolean hasRegistriesToRemove(); + void updateDialog(UserConnection connection, CompoundTag tag); } diff --git a/bukkit/src/main/java/com/viaversion/viaversion/bukkit/platform/BukkitViaInjector.java b/bukkit/src/main/java/com/viaversion/viaversion/bukkit/platform/BukkitViaInjector.java index 23846c834..5589f825a 100644 --- a/bukkit/src/main/java/com/viaversion/viaversion/bukkit/platform/BukkitViaInjector.java +++ b/bukkit/src/main/java/com/viaversion/viaversion/bukkit/platform/BukkitViaInjector.java @@ -105,7 +105,8 @@ public class BukkitViaInjector extends LegacyViaInjector { // Grab the ping class and find the field to access it Class pingClazz = NMSUtil.nms( "ServerPing", - "net.minecraft.network.protocol.status.ServerPing" + "net.minecraft.network.protocol.status.ServerPing", + "net.minecraft.network.protocol.status.ServerStatus" ); Object ping = null; for (Field field : serverClazz.getDeclaredFields()) { @@ -120,7 +121,8 @@ public class BukkitViaInjector extends LegacyViaInjector { // Now get the ServerData inside ServerPing Class serverDataClass = NMSUtil.nms( "ServerPing$ServerData", - "net.minecraft.network.protocol.status.ServerPing$ServerData" + "net.minecraft.network.protocol.status.ServerPing$ServerData", + "net.minecraft.network.protocol.status.ServerStatus$Version" ); Object serverData = null; for (Field field : pingClazz.getDeclaredFields()) { @@ -155,7 +157,8 @@ public class BukkitViaInjector extends LegacyViaInjector { ); Class connectionClass = NMSUtil.nms( "ServerConnection", - "net.minecraft.server.network.ServerConnection" + "net.minecraft.server.network.ServerConnection", + "net.minecraft.server.network.ServerConnectionListener" ); Object server = ReflectionUtil.invokeStatic(serverClass, "getServer"); diff --git a/api/src/main/java/com/viaversion/viaversion/api/protocol/AbstractProtocol.java b/common/src/main/java/com/viaversion/viaversion/api/protocol/AbstractProtocol.java similarity index 83% rename from api/src/main/java/com/viaversion/viaversion/api/protocol/AbstractProtocol.java rename to common/src/main/java/com/viaversion/viaversion/api/protocol/AbstractProtocol.java index fa5279a74..c38201b8a 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/protocol/AbstractProtocol.java +++ b/common/src/main/java/com/viaversion/viaversion/api/protocol/AbstractProtocol.java @@ -2,23 +2,18 @@ * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion * Copyright (C) 2016-2026 ViaVersion and contributors * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ package com.viaversion.viaversion.api.protocol; @@ -39,10 +34,15 @@ import com.viaversion.viaversion.api.protocol.packet.provider.PacketTypeMap; import com.viaversion.viaversion.api.protocol.packet.provider.PacketTypesProvider; import com.viaversion.viaversion.api.protocol.packet.provider.SimplePacketTypesProvider; import com.viaversion.viaversion.api.protocol.remapper.PacketHandler; +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import com.viaversion.viaversion.api.rewriter.MappingDataListener; import com.viaversion.viaversion.api.rewriter.Rewriter; import com.viaversion.viaversion.exception.CancelException; import com.viaversion.viaversion.exception.InformativeException; +import com.viaversion.viaversion.protocol.shared_registration.SharedRegistrations; +import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter; +import com.viaversion.viaversion.rewriter.TagRewriter; +import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase; import com.viaversion.viaversion.util.ProtocolLogger; import com.viaversion.viaversion.util.ProtocolUtil; import java.util.HashMap; @@ -74,6 +74,8 @@ public abstract class AbstractProtocol, Object> storedObjects = new HashMap<>(); private boolean initialized; private ProtocolLogger logger; + private ProtocolVersion serverVersion; + private ProtocolVersion clientVersion; @Deprecated protected AbstractProtocol() { @@ -104,6 +106,11 @@ public abstract class AbstractProtocol void registerPacketIdChanges( Map> unmappedPacketTypes, Map> mappedPacketTypes, @@ -214,6 +242,7 @@ public abstract class AbstractProtocol getTagRewriter() { + return null; + } + + @Override + public @Nullable ComponentRewriterBase getComponentRewriter() { + return null; + } + + @Override + public com.viaversion.viaversion.rewriter.@Nullable ParticleRewriter getParticleRewriter() { + return null; + } + + @Override + public com.viaversion.viaversion.rewriter.@Nullable EntityRewriter getEntityRewriter() { + return null; + } + + @Override + public com.viaversion.viaversion.rewriter.@Nullable ItemRewriter getItemRewriter() { + return null; + } + + public com.viaversion.viaversion.rewriter.@Nullable BlockRewriter getBlockRewriter() { + return null; + } + + public @Nullable RecipeDisplayRewriter getRecipeRewriter() { + return null; + } + private void printRemapError(Direction direction, State state, int unmappedPacketId, int mappedPacketId, InformativeException e) { // Don't print errors during handshake/login/status if (state != State.PLAY && direction == Direction.SERVERBOUND && !Via.getManager().debugHandler().enabled()) { diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/AbstractSimpleProtocol.java b/common/src/main/java/com/viaversion/viaversion/protocol/AbstractSimpleProtocol.java new file mode 100644 index 000000000..8950d34a3 --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocol/AbstractSimpleProtocol.java @@ -0,0 +1,34 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.viaversion.viaversion.protocol; + +import com.viaversion.viaversion.api.protocol.AbstractProtocol; +import com.viaversion.viaversion.api.protocol.SimpleProtocol; + +/** + * A simple protocol which does not have any packet types. + *

+ * {@link AbstractProtocol} should be preferred over this class in most cases. + */ +public abstract class AbstractSimpleProtocol extends AbstractProtocol implements SimpleProtocol { + + protected AbstractSimpleProtocol() { + super(null, null, null, null); + } +} diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolManagerImpl.java b/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolManagerImpl.java index e158286be..485e612cb 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolManagerImpl.java +++ b/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolManagerImpl.java @@ -23,6 +23,7 @@ import com.google.common.collect.Range; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.data.MappingDataLoader; +import com.viaversion.viaversion.api.protocol.AbstractProtocol; import com.viaversion.viaversion.api.protocol.Protocol; import com.viaversion.viaversion.api.protocol.ProtocolManager; import com.viaversion.viaversion.api.protocol.ProtocolPathEntry; @@ -38,6 +39,7 @@ import com.viaversion.viaversion.api.protocol.version.ServerProtocolVersion; import com.viaversion.viaversion.api.protocol.version.VersionType; import com.viaversion.viaversion.protocol.packet.PacketWrapperImpl; import com.viaversion.viaversion.protocol.packet.VersionedPacketTransformerImpl; +import com.viaversion.viaversion.protocol.shared_registration.def.DefaultRegistrations; import com.viaversion.viaversion.protocols.base.InitialBaseProtocol; import com.viaversion.viaversion.protocols.base.v1_16.ClientboundBaseProtocol1_16; import com.viaversion.viaversion.protocols.base.v1_7.ClientboundBaseProtocol1_7; @@ -146,6 +148,8 @@ public class ProtocolManagerImpl implements ProtocolManager { worker.setName("Via-Mappingloader-" + threadIndex.incrementAndGet()); return worker; }, ForkJoinWorkerThread.getDefaultUncaughtExceptionHandler(), true); + + DefaultRegistrations.apply(); } public void registerProtocols() { @@ -225,8 +229,11 @@ public class ProtocolManagerImpl implements ProtocolManager { @Override public void registerProtocol(Protocol protocol, List supportedClientVersion, ProtocolVersion serverVersion) { - // Register the protocol's handlers - protocol.initialize(); + // Set the server version on AbstractProtocol instances before initialization + if (protocol instanceof AbstractProtocol abstractProtocol) { + abstractProtocol.setServerVersion(serverVersion); + abstractProtocol.setClientVersion(supportedClientVersion.stream().max(ProtocolVersion::compareTo).orElseThrow()); + } // Clear cache as this may make new routes. if (!pathCache.isEmpty()) { @@ -248,14 +255,22 @@ public class ProtocolManagerImpl implements ProtocolManager { refreshVersions(); } - if (protocol.hasMappingDataToLoad()) { - if (mappingLoaderExecutor != null) { - // Submit mapping data loading - addMappingLoaderFuture(protocol.getClass(), protocol::loadMappingData); + // Load mapping data and register the protocol's handlers + if (!protocol.hasMappingDataToLoad()) { + protocol.initialize(); + return; + } + + // Submit mapping data loading + if (mappingLoaderExecutor != null) { + if (protocol.dependsOn() != null) { + addMappingLoaderFuture(protocol.getClass(), protocol.dependsOn(), protocol::loadMappingData); } else { - // Late protocol adding - just do it on the current thread - protocol.loadMappingData(); + addMappingLoaderFuture(protocol.getClass(), protocol::loadMappingData); } + } else { + // Late protocol adding - just do it on the current thread + protocol.loadMappingData(); } } @@ -573,7 +588,7 @@ public class ProtocolManagerImpl implements ProtocolManager { private Function mappingLoaderThrowable(Class protocolClass) { return throwable -> { - Via.getPlatform().getLogger().log(Level.SEVERE, "Error during mapping loading of " + protocolClass.getSimpleName(), throwable); + Via.getPlatform().getLogger().log(Level.SEVERE, "Error during loading of " + protocolClass.getSimpleName(), throwable); return null; }; } diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/PacketBound.java b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/PacketBound.java new file mode 100644 index 000000000..7f306630e --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/PacketBound.java @@ -0,0 +1,23 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.viaversion.viaversion.protocol.shared_registration; + +public enum PacketBound { + ADDED_AT_MIN, + REMOVED_AT_MAX +} diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/RegistrationBuilder.java b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/RegistrationBuilder.java new file mode 100644 index 000000000..7d8a975fd --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/RegistrationBuilder.java @@ -0,0 +1,151 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.viaversion.viaversion.protocol.shared_registration; + +import com.google.common.base.Preconditions; +import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; +import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType; +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; +import com.viaversion.viaversion.api.protocol.version.VersionType; +import com.viaversion.viaversion.protocol.shared_registration.SharedRegistrations.RegistrationAction; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; + +public final class RegistrationBuilder { + private final List groups = new ArrayList<>(); + private final SharedRegistrations registrations; + private VersionType versionType; + + RegistrationBuilder(final SharedRegistrations registrations) { + this.registrations = registrations; + } + + /** + * Adds a registration for an open-ended version range. + * + * @param min minimum version, inclusive + * @param action registration action + * @return this + */ + public RegistrationBuilder since(final ProtocolVersion min, final RegistrationAction action) { + checkVersionType(min); + groups.add(new VersionedTemplateGroup(action, min, null)); + return this; + } + + /** + * Adds a registration for a version range. + * + * @param min minimum version, inclusive + * @param max maximum version, exclusive + * @param action registration action + * @return this + */ + public RegistrationBuilder range(final ProtocolVersion min, final ProtocolVersion max, final RegistrationAction action) { + checkVersionType(min); + checkVersionType(max); + groups.add(new VersionedTemplateGroup(action, min, max)); + return this; + } + + public RegistrationBuilder ranges( + final ProtocolVersion min, final Consumer> consumer + ) { + consumer.accept(new RangesBuilder<>(min)); + return this; + } + + public RegistrationBuilder ranges( + final Function, R> adapter, final ProtocolVersion min, + final Consumer> consumer + ) { + consumer.accept(new TypedRangesBuilder<>(adapter, min)); + return this; + } + + public void register() { + registrations.register(versionType, groups); + } + + private void checkVersionType(final ProtocolVersion version) { + if (versionType == null) { + versionType = version.getVersionType(); + } else if (versionType != version.getVersionType()) { + throw new IllegalArgumentException("Cannot mix different version types in the same registration builder"); + } + } + + public class RangesBuilder { + private ProtocolVersion currentMin; + private boolean completed; + + private RangesBuilder(final ProtocolVersion min) { + this.currentMin = min; + } + + public RangesBuilder to(final ProtocolVersion max, final RegistrationAction action) { + Preconditions.checkState(!completed, "Range chain already completed"); + RegistrationBuilder.this.range(currentMin, max, action); + currentMin = max; + return this; + } + + public RegistrationBuilder since(final RegistrationAction action) { + Preconditions.checkState(!completed, "Range chain already completed"); + completed = true; + return RegistrationBuilder.this.since(currentMin, action); + } + } + + public final class TypedRangesBuilder extends RangesBuilder { + private final Function, R> adapter; + + private TypedRangesBuilder(final Function, R> adapter, final ProtocolVersion min) { + super(min); + this.adapter = adapter; + } + + public TypedRangesBuilder to(final ProtocolVersion max, final TypedRegistrationAction action) { + to(max, wrapAction(action)); + return this; + } + + public TypedRangesBuilder since(final TypedRegistrationAction action) { + since(wrapAction(action)); + return this; + } + + private RegistrationAction wrapAction(final TypedRegistrationAction action) { + return ctx -> { + final R rewriter = adapter.apply(ctx); + if (rewriter != null) { + action.accept(ctx, rewriter); + } + }; + } + } + + @FunctionalInterface + public interface TypedRegistrationAction { + + void accept(RegistrationContext ctx, R r); + } + +} diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/RegistrationContext.java b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/RegistrationContext.java new file mode 100644 index 000000000..bd701b7fe --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/RegistrationContext.java @@ -0,0 +1,127 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.viaversion.viaversion.protocol.shared_registration; + +import com.google.common.base.Preconditions; +import com.viaversion.viaversion.api.protocol.AbstractProtocol; +import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; +import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType; +import com.viaversion.viaversion.api.protocol.remapper.PacketHandler; +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; +import java.util.function.Consumer; +import org.checkerframework.checker.nullness.qual.Nullable; + +public record RegistrationContext( + AbstractProtocol protocol, + ProtocolVersion min, + @Nullable ProtocolVersion max +) { + + public

> P protocol(@SuppressWarnings("unused") final Class

protocolClass) { + //noinspection unchecked + return (P) protocol; + } + + public

> P castProtocol() { + //noinspection unchecked + return (P) protocol; + } + + public void clientbound(final ClientboundPacketType type, final Consumer action) { + action.accept(clientboundPacketType(type)); + } + + public void clientbound(final ClientboundPacketType type, final Consumer action, final PacketBound... markers) { + if (!shouldSkip(markers)) { + action.accept(clientboundPacketType(type)); + } + } + + public void clientboundHandler(final ClientboundPacketType type, final PacketHandler handler) { + protocol.registerClientbound(clientboundPacketType(type), handler); + } + + public void clientboundHandler(final ClientboundPacketType type, final PacketHandler handler, final PacketBound... markers) { + if (!shouldSkip(markers)) { + protocol.registerClientbound(clientboundPacketType(type), handler); + } + } + + public void serverbound(final ServerboundPacketType type, final Consumer action) { + action.accept(serverboundPacketType(type)); + } + + public void serverbound(final ServerboundPacketType type, final Consumer action, final PacketBound... markers) { + if (!shouldSkip(markers)) { + action.accept(serverboundPacketType(type)); + } + } + + public void serverboundHandler(final ServerboundPacketType type, final PacketHandler handler) { + protocol.registerServerbound(serverboundPacketType(type), handler); + } + + public void serverboundHandler(final ServerboundPacketType type, final PacketHandler handler, final PacketBound... markers) { + if (!shouldSkip(markers)) { + protocol.registerServerbound(serverboundPacketType(type), handler); + } + } + + private boolean shouldSkip(final PacketBound... markers) { + if (markers.length == 0) { + return false; + } + + final ProtocolVersion serverVersion = protocol.getServerVersion(); + final ProtocolVersion clientVersion = protocol.getClientVersion(); + final ProtocolVersion lowerVersion = serverVersion.olderThan(clientVersion) ? serverVersion : clientVersion; + final ProtocolVersion higherVersion = serverVersion.newerThan(clientVersion) ? serverVersion : clientVersion; + for (final PacketBound marker : markers) { + switch (marker) { + case ADDED_AT_MIN -> { + if (lowerVersion.olderThan(min)) { + return true; + } + } + case REMOVED_AT_MAX -> { + Preconditions.checkArgument(max != null, "Cannot use REMOVED_AT_MAX in an open-ended range"); + if (higherVersion.newerThanOrEqualTo(max)) { + return true; + } + } + } + } + return false; + } + + private SU serverboundPacketType(final ServerboundPacketType genericPacketType) { + final SU type = protocol.getPacketTypesProvider().unmappedServerboundType(genericPacketType.state(), genericPacketType.getName()); + if (type == null) { + throw new IllegalArgumentException("Could not find serverbound packet type for " + genericPacketType.state() + " " + genericPacketType.getName()); + } + return type; + } + + private CU clientboundPacketType(final ClientboundPacketType genericPacketType) { + final CU type = protocol.getPacketTypesProvider().unmappedClientboundType(genericPacketType.state(), genericPacketType.getName()); + if (type == null) { + throw new IllegalArgumentException("Could not find clientbound packet type for " + genericPacketType.state() + " " + genericPacketType.getName() + " in " + protocol.getClass().getSimpleName()); + } + return type; + } +} diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/SharedRegistrations.java b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/SharedRegistrations.java new file mode 100644 index 000000000..8bcca449a --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/SharedRegistrations.java @@ -0,0 +1,102 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.viaversion.viaversion.protocol.shared_registration; + +import com.viaversion.viaversion.api.protocol.AbstractProtocol; +import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; +import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType; +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; +import com.viaversion.viaversion.api.protocol.version.VersionType; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.EnumMap; +import java.util.List; + +/** + * Central registry for shared packet registrations that are automatically applied + * to protocols based on their version range. + *

+ * Registrations are done BEFORE registerPackets in {@link AbstractProtocol}. + */ +public final class SharedRegistrations { + private static final SharedRegistrations DEFAULT_REGISTRATIONS = new SharedRegistrations(); + + private final EnumMap> versionedTemplates = new EnumMap<>(VersionType.class); + + /** + * Returns the default ViaVersion registration set. + */ + public static SharedRegistrations defaultRegistrations() { + return DEFAULT_REGISTRATIONS; + } + + /** + * Creates an independent shared registration set that external projects can populate and apply. + */ + public static SharedRegistrations create() { + return new SharedRegistrations(); + } + + public RegistrationBuilder registrations() { + return new RegistrationBuilder(this); + } + + /** + * Applies all shared registrations whose version range matches the given protocol. + * + * @param protocol the protocol to apply shared registrations to + */ + public void applyMatching(final AbstractProtocol protocol) { + if (protocol.isBaseProtocol()) { + return; + } + + final ProtocolVersion version = protocol.getServerVersion(); + final List groups = versionedTemplates.get(version.getVersionType()); + if (groups == null) { + return; + } + + for (final VersionedTemplateGroup group : groups) { + if (group.min().newerThan(version)) { // TODO binary search? + // Sorted by the minimum, so we can stop early if we're out + break; + } + + if (group.max() != null && version.newerThanOrEqualTo(group.max())) { + continue; + } + + final RegistrationContext context = new RegistrationContext<>(protocol, group.min(), group.max()); + //noinspection unchecked,rawtypes + ((RegistrationAction) group.action()).accept(context); + } + } + + @FunctionalInterface + public interface RegistrationAction { + + void accept(RegistrationContext context); + } + + void register(final VersionType versionType, final List toAdd) { + final List groups = versionedTemplates.computeIfAbsent(versionType, $ -> new ArrayList<>()); + groups.addAll(toAdd); + groups.sort(Comparator.comparing(VersionedTemplateGroup::min, Comparator.nullsFirst(Comparator.naturalOrder()))); + } +} diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/VersionedTemplateGroup.java b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/VersionedTemplateGroup.java new file mode 100644 index 000000000..47d23052e --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/VersionedTemplateGroup.java @@ -0,0 +1,32 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.viaversion.viaversion.protocol.shared_registration; + +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; +import com.viaversion.viaversion.protocol.shared_registration.SharedRegistrations.RegistrationAction; + +record VersionedTemplateGroup( + RegistrationAction action, + ProtocolVersion min, + ProtocolVersion max +) { + + public boolean contains(final ProtocolVersion version) { + return version.newerThanOrEqualTo(min) && (max == null || version.olderThan(max)); + } +} diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/BlockRegistrations.java b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/BlockRegistrations.java new file mode 100644 index 000000000..1dd592443 --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/BlockRegistrations.java @@ -0,0 +1,95 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.viaversion.viaversion.protocol.shared_registration.def; + +import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; +import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType; +import com.viaversion.viaversion.protocol.shared_registration.PacketBound; +import com.viaversion.viaversion.protocol.shared_registration.RegistrationContext; +import com.viaversion.viaversion.protocols.v1_12_2to1_13.packet.ClientboundPackets1_13; +import com.viaversion.viaversion.protocols.v1_14_3to1_14_4.packet.ClientboundPackets1_14_4; +import com.viaversion.viaversion.protocols.v1_16_1to1_16_2.packet.ClientboundPackets1_16_2; +import com.viaversion.viaversion.protocols.v1_17_1to1_18.packet.ClientboundPackets1_18; +import com.viaversion.viaversion.protocols.v1_18_2to1_19.packet.ClientboundPackets1_19; +import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.packet.ClientboundPackets1_19_4; +import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundPackets1_21; +import com.viaversion.viaversion.rewriter.BlockRewriter; +import org.checkerframework.checker.nullness.qual.Nullable; + +final class BlockRegistrations { + + static void registerBlockPackets1_13(final RegistrationContext ctx, final BlockRewriter br) { + common1_13(ctx, br); + ctx.clientbound(ClientboundPackets1_13.CHUNK_BLOCKS_UPDATE, br::registerChunkBlocksUpdate); + } + + private static void common1_13(RegistrationContext ctx, BlockRewriter br) { + ctx.clientbound(ClientboundPackets1_13.BLOCK_EVENT, br::registerBlockEvent); + ctx.clientbound(ClientboundPackets1_13.BLOCK_UPDATE, br::registerBlockUpdate); + ctx.clientbound(ClientboundPackets1_13.LEVEL_EVENT, br::registerLevelEvent1_13); + } + + static void registerBlockPackets1_14_4(final RegistrationContext ctx, final BlockRewriter br) { + common1_13(ctx, br); + ctx.clientbound(ClientboundPackets1_14_4.CHUNK_BLOCKS_UPDATE, br::registerChunkBlocksUpdate, PacketBound.REMOVED_AT_MAX); + ctx.clientbound(ClientboundPackets1_14_4.BLOCK_BREAK_ACK, br::registerBlockBreakAck, PacketBound.ADDED_AT_MIN); + } + + static void registerBlockPackets1_16_2(final RegistrationContext ctx, final BlockRewriter br) { + common1_13(ctx, br); + ctx.clientbound(ClientboundPackets1_16_2.BLOCK_BREAK_ACK, br::registerBlockBreakAck); + ctx.clientbound(ClientboundPackets1_16_2.SECTION_BLOCKS_UPDATE, br::registerSectionBlocksUpdate, PacketBound.ADDED_AT_MIN); + } + + static void registerBlockPackets1_18(final RegistrationContext ctx, final BlockRewriter br) { + common1_13(ctx, br); + ctx.clientbound(ClientboundPackets1_18.BLOCK_BREAK_ACK, br::registerBlockBreakAck, PacketBound.REMOVED_AT_MAX); + ctx.clientbound(ClientboundPackets1_18.LEVEL_CHUNK_WITH_LIGHT, br::registerLevelChunk1_18, PacketBound.ADDED_AT_MIN); + ctx.clientbound(ClientboundPackets1_18.SECTION_BLOCKS_UPDATE, br::registerSectionBlocksUpdate); + ctx.clientbound(ClientboundPackets1_18.BLOCK_ENTITY_DATA, br::registerBlockEntityData1_18); + } + + static void registerBlockPackets1_19(final RegistrationContext ctx, final BlockRewriter br) { + common1_19(ctx, br); + ctx.clientbound(ClientboundPackets1_19.LEVEL_EVENT, br::registerLevelEvent1_13); + ctx.clientbound(ClientboundPackets1_19.SECTION_BLOCKS_UPDATE, br::registerSectionBlocksUpdate); + } + + private static void common1_19(RegistrationContext ctx, BlockRewriter br) { + ctx.clientbound(ClientboundPackets1_19.BLOCK_EVENT, br::registerBlockEvent); + ctx.clientbound(ClientboundPackets1_19.BLOCK_UPDATE, br::registerBlockUpdate); + ctx.clientbound(ClientboundPackets1_19.LEVEL_CHUNK_WITH_LIGHT, br::registerLevelChunk1_18); + ctx.clientbound(ClientboundPackets1_19.BLOCK_ENTITY_DATA, br::registerBlockEntityData1_18); + } + + static void registerBlockPackets1_20(final RegistrationContext ctx, final BlockRewriter br) { + common1_19(ctx, br); + ctx.clientbound(ClientboundPackets1_19_4.LEVEL_EVENT, br::registerLevelEvent1_13); + ctx.clientbound(ClientboundPackets1_19_4.SECTION_BLOCKS_UPDATE, br::registerSectionBlocksUpdate1_20); + } + + static void registerBlockPackets1_21(final RegistrationContext ctx, final BlockRewriter br) { + common1_19(ctx, br); + ctx.clientbound(ClientboundPackets1_21.LEVEL_EVENT, br::registerLevelEvent1_21); + ctx.clientbound(ClientboundPackets1_21.SECTION_BLOCKS_UPDATE, br::registerSectionBlocksUpdate1_20); + } + + static @Nullable BlockRewriter block(final RegistrationContext ctx) { + return ctx.protocol().getBlockRewriter(); + } +} diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/DefaultRegistrations.java b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/DefaultRegistrations.java new file mode 100644 index 000000000..2d1b1de4f --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/DefaultRegistrations.java @@ -0,0 +1,111 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.viaversion.viaversion.protocol.shared_registration.def; + +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; +import com.viaversion.viaversion.protocol.shared_registration.SharedRegistrations; + +public final class DefaultRegistrations { + + public static void apply() { + SharedRegistrations.defaultRegistrations().registrations() + .ranges(EntityRegistrations::entity, ProtocolVersion.v1_13, b -> b + .to(ProtocolVersion.v1_14_4, EntityRegistrations::registerEntityPackets1_13) + .to(ProtocolVersion.v1_16_2, EntityRegistrations::registerEntityPackets1_14_4) + .to(ProtocolVersion.v1_17_1, EntityRegistrations::registerEntityPackets1_16_2) + .to(ProtocolVersion.v1_19, EntityRegistrations::registerEntityPackets1_17_1) + .to(ProtocolVersion.v1_20_5, EntityRegistrations::registerEntityPackets1_19) + .to(ProtocolVersion.v1_21_4, EntityRegistrations::registerEntityPackets1_20_5) + .to(ProtocolVersion.v1_21_9, EntityRegistrations::registerEntityPackets1_21_4) + .since(EntityRegistrations::registerEntityPackets1_21_9) + ) + + .ranges(ItemRegistrations::item, ProtocolVersion.v1_13, b -> b + .to(ProtocolVersion.v1_14, ItemRegistrations::registerItemPackets1_13) + .to(ProtocolVersion.v1_14_4, ItemRegistrations::registerItemPackets1_14) + .to(ProtocolVersion.v1_16, ItemRegistrations::registerItemPackets1_14_4) + .to(ProtocolVersion.v1_17_1, ItemRegistrations::registerItemPackets1_16) + .to(ProtocolVersion.v1_19_1, ItemRegistrations::registerItemPackets1_17_1) + .to(ProtocolVersion.v1_20_3, ItemRegistrations::registerItemPackets1_19_1) + .to(ProtocolVersion.v1_20_5, ItemRegistrations::registerItemPackets1_20_3) + .to(ProtocolVersion.v1_21, ItemRegistrations::registerItemPackets1_20_5) + .to(ProtocolVersion.v1_21_2, ItemRegistrations::registerItemPackets1_21) + .to(ProtocolVersion.v1_21_5, ItemRegistrations::registerItemPackets1_21_2) + ) + .ranges(ItemRegistrations::structuredItem, ProtocolVersion.v1_21_5, b -> b + .to(ProtocolVersion.v1_21_6, ItemRegistrations::registerItemPackets1_21_5) + .since(ItemRegistrations::registerItemPackets1_21_6) + ) + + .ranges(BlockRegistrations::block, ProtocolVersion.v1_13, steps -> steps + .to(ProtocolVersion.v1_14_4, BlockRegistrations::registerBlockPackets1_13) + .to(ProtocolVersion.v1_16_2, BlockRegistrations::registerBlockPackets1_14_4) + .to(ProtocolVersion.v1_18, BlockRegistrations::registerBlockPackets1_16_2) + .to(ProtocolVersion.v1_19, BlockRegistrations::registerBlockPackets1_18) + .to(ProtocolVersion.v1_20, BlockRegistrations::registerBlockPackets1_19) + .to(ProtocolVersion.v1_21, BlockRegistrations::registerBlockPackets1_20) + .since(BlockRegistrations::registerBlockPackets1_21) + ) + + .ranges(ParticleRegistrations::particle, ProtocolVersion.v1_13, steps -> steps + .to(ProtocolVersion.v1_15_2, ParticleRegistrations::registerParticlePackets1_13) + .to(ProtocolVersion.v1_19, ParticleRegistrations::registerParticlePackets1_15_2) + .to(ProtocolVersion.v1_20, ParticleRegistrations::registerParticlePackets1_19) + .to(ProtocolVersion.v1_20_5, ParticleRegistrations::registerParticlePackets1_20) + .to(ProtocolVersion.v1_21_2, ParticleRegistrations::registerParticlePackets1_20_5) + .to(ProtocolVersion.v1_21_4, ParticleRegistrations::registerParticlePackets1_21_2) + .to(ProtocolVersion.v1_21_9, ParticleRegistrations::registerParticlePackets1_21_4) + .since(ParticleRegistrations::registerParticlePackets1_21_9) + ) + + .ranges(TextComponentRegistrations::text, ProtocolVersion.v1_12_2, b -> b + .to(ProtocolVersion.v1_14, TextComponentRegistrations::registerComponents1_12_2) + .to(ProtocolVersion.v1_16_2, TextComponentRegistrations::registerComponents1_14) + .to(ProtocolVersion.v1_17, TextComponentRegistrations::registerComponents1_16_2) + .to(ProtocolVersion.v1_19, TextComponentRegistrations::registerComponents1_17) + .to(ProtocolVersion.v1_20_3, TextComponentRegistrations::registerComponents1_19) + .to(ProtocolVersion.v1_20_5, TextComponentRegistrations::registerComponents1_20_3) + .to(ProtocolVersion.v1_21, TextComponentRegistrations::registerComponents1_20_5) + .to(ProtocolVersion.v1_21_2, TextComponentRegistrations::registerComponents1_21) + .to(ProtocolVersion.v1_21_4, TextComponentRegistrations::registerComponents1_21_2) + .to(ProtocolVersion.v1_21_5, TextComponentRegistrations::registerComponents1_21_4) + ) + .ranges(TextComponentRegistrations::nbtText, ProtocolVersion.v1_21_5, b -> b + .since(TextComponentRegistrations::registerComponents1_21_5) + ) + + .ranges(ProtocolVersion.v1_17_1, sbeps -> sbeps + .to(ProtocolVersion.v1_20_2, RegistryRegistrations::registerTags1_17_1) + .since(RegistryRegistrations::registerTags1_20_2) + ) + + .ranges(ProtocolVersion.v1_10, b -> b + .to(ProtocolVersion.v1_14, RegistryRegistrations::registerSounds1_10) + .to(ProtocolVersion.v1_19_3, RegistryRegistrations::registerSounds1_14) + .since(RegistryRegistrations::registerSounds1_19_3) + ) + + .since(ProtocolVersion.v1_13, RegistryRegistrations::registerStatistics1_13) + .since(ProtocolVersion.v1_19, RegistryRegistrations::registerCommands1_19) + .since(ProtocolVersion.v1_21, RegistryRegistrations::registerRegistryData1_21) + .since(ProtocolVersion.v1_21, RegistryRegistrations::registerAttributes1_21) + .since(ProtocolVersion.v1_21_2, RegistryRegistrations::registerRecipePackets1_21_2) + + .register(); + } +} diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/EntityRegistrations.java b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/EntityRegistrations.java new file mode 100644 index 000000000..bc385df8c --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/EntityRegistrations.java @@ -0,0 +1,96 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.viaversion.viaversion.protocol.shared_registration.def; + +import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; +import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType; +import com.viaversion.viaversion.protocol.shared_registration.PacketBound; +import com.viaversion.viaversion.protocol.shared_registration.RegistrationContext; +import com.viaversion.viaversion.protocols.v1_12_2to1_13.packet.ClientboundPackets1_13; +import com.viaversion.viaversion.protocols.v1_14_3to1_14_4.packet.ClientboundPackets1_14_4; +import com.viaversion.viaversion.protocols.v1_18_2to1_19.packet.ClientboundPackets1_19; +import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ClientboundPackets1_20_5; +import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ClientboundPackets1_21_9; +import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPackets1_21_2; +import com.viaversion.viaversion.protocols.v1_8to1_9.packet.ClientboundPackets1_9; +import com.viaversion.viaversion.rewriter.EntityRewriter; +import org.checkerframework.checker.nullness.qual.Nullable; + +final class EntityRegistrations { + + static void registerEntityPackets1_13(final RegistrationContext ctx, final EntityRewriter er) { + ctx.clientbound(ClientboundPackets1_13.REMOVE_ENTITIES, er::registerRemoveEntities); + } + + static void registerEntityPackets1_14_4(final RegistrationContext ctx, final EntityRewriter er) { + ctx.clientbound(ClientboundPackets1_14_4.REMOVE_ENTITIES, er::registerRemoveEntities); + ctx.clientbound(ClientboundPackets1_14_4.ADD_ENTITY, er::registerTrackerWithData); + ctx.clientbound(ClientboundPackets1_14_4.ADD_MOB, er::registerTracker); + } + + static void registerEntityPackets1_16_2(final RegistrationContext ctx, final EntityRewriter er) { + // remove_entities got temporarily changed to only take a single entity... + ctx.clientbound(ClientboundPackets1_14_4.ADD_ENTITY, er::registerTrackerWithData); + ctx.clientbound(ClientboundPackets1_14_4.ADD_MOB, er::registerTracker); + } + + static void registerEntityPackets1_17_1(final RegistrationContext ctx, final EntityRewriter er) { + ctx.clientbound(ClientboundPackets1_14_4.REMOVE_ENTITIES, er::registerRemoveEntities); + ctx.clientbound(ClientboundPackets1_14_4.ADD_ENTITY, er::registerTrackerWithData); + ctx.clientbound(ClientboundPackets1_14_4.ADD_MOB, er::registerTracker, PacketBound.REMOVED_AT_MAX); + } + + static void registerEntityPackets1_19(final RegistrationContext ctx, final EntityRewriter er) { + ctx.clientbound(ClientboundPackets1_9.REMOVE_ENTITIES, er::registerRemoveEntities); + ctx.clientbound(ClientboundPackets1_19.ADD_ENTITY, er::registerTrackerWithData1_19); + } + + static void registerEntityPackets1_20_5(final RegistrationContext ctx, final EntityRewriter er) { + common1_20_5(ctx, er); + ctx.clientbound(ClientboundPackets1_19.ADD_ENTITY, er::registerTrackerWithData1_19); + } + + static void registerEntityPackets1_21_4(final RegistrationContext ctx, final EntityRewriter er) { + common1_20_5(ctx, er); + registerGameModeTrackers1_21_4(ctx, er); + ctx.clientbound(ClientboundPackets1_21_2.ADD_ENTITY, er::registerTrackerWithData1_19); + } + + static void registerEntityPackets1_21_9(final RegistrationContext ctx, final EntityRewriter er) { + common1_20_5(ctx, er); + registerGameModeTrackers1_21_4(ctx, er); + ctx.clientbound(ClientboundPackets1_21_9.ADD_ENTITY, er::registerTrackerWithData1_21_9); + } + + private static void common1_20_5(final RegistrationContext ctx, final EntityRewriter er) { + ctx.clientbound(ClientboundPackets1_20_5.SET_ENTITY_DATA, er::registerSetEntityData); + ctx.clientbound(ClientboundPackets1_20_5.REMOVE_ENTITIES, er::registerRemoveEntities); + ctx.clientbound(ClientboundPackets1_20_5.LOGIN, er::registerLogin1_20_5); + ctx.clientbound(ClientboundPackets1_20_5.RESPAWN, er::registerRespawn1_20_5); + } + + private static void registerGameModeTrackers1_21_4(final RegistrationContext ctx, final EntityRewriter er) { + ctx.clientbound(ClientboundPackets1_21_2.GAME_EVENT, er::registerGameEvent); + ctx.clientbound(ClientboundPackets1_21_2.PLAYER_ABILITIES, er::registerPlayerAbilities); + } + + + static @Nullable EntityRewriter entity(final RegistrationContext ctx) { + return ctx.protocol().getEntityRewriter(); + } +} diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/ItemRegistrations.java b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/ItemRegistrations.java new file mode 100644 index 000000000..74f4ae324 --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/ItemRegistrations.java @@ -0,0 +1,185 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.viaversion.viaversion.protocol.shared_registration.def; + +import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; +import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType; +import com.viaversion.viaversion.protocol.shared_registration.PacketBound; +import com.viaversion.viaversion.protocol.shared_registration.RegistrationContext; +import com.viaversion.viaversion.protocols.v1_12_2to1_13.packet.ClientboundPackets1_13; +import com.viaversion.viaversion.protocols.v1_12_2to1_13.packet.ServerboundPackets1_13; +import com.viaversion.viaversion.protocols.v1_13_2to1_14.packet.ClientboundPackets1_14; +import com.viaversion.viaversion.protocols.v1_14_3to1_14_4.packet.ClientboundPackets1_14_4; +import com.viaversion.viaversion.protocols.v1_15_2to1_16.packet.ClientboundPackets1_16; +import com.viaversion.viaversion.protocols.v1_16_4to1_17.packet.ServerboundPackets1_17; +import com.viaversion.viaversion.protocols.v1_17to1_17_1.packet.ClientboundPackets1_17_1; +import com.viaversion.viaversion.protocols.v1_19_1to1_19_3.packet.ServerboundPackets1_19_3; +import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.packet.ClientboundPackets1_19_4; +import com.viaversion.viaversion.protocols.v1_19to1_19_1.packet.ClientboundPackets1_19_1; +import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.packet.ClientboundPackets1_20_3; +import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.packet.ServerboundPackets1_20_3; +import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ClientboundPackets1_20_5; +import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundPackets1_20_5; +import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundPackets1_21; +import com.viaversion.viaversion.protocols.v1_20to1_20_2.packet.ClientboundPackets1_20_2; +import com.viaversion.viaversion.protocols.v1_20to1_20_2.packet.ServerboundPackets1_20_2; +import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ClientboundPackets1_21_5; +import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ServerboundPackets1_21_5; +import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundConfigurationPackets1_21_6; +import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPackets1_21_6; +import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPackets1_21_2; +import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ServerboundPackets1_21_2; +import com.viaversion.viaversion.rewriter.ItemRewriter; +import com.viaversion.viaversion.rewriter.StructuredItemRewriter; +import org.checkerframework.checker.nullness.qual.Nullable; + +final class ItemRegistrations { + + static void registerItemPackets1_13(final RegistrationContext ctx, final ItemRewriter ir) { + common1_13(ctx, ir); + ctx.clientbound(ClientboundPackets1_13.SET_EQUIPPED_ITEM, ir::registerSetEquippedItem); + } + + private static void common1_13(final RegistrationContext ctx, final ItemRewriter ir) { + ctx.clientbound(ClientboundPackets1_13.CONTAINER_SET_DATA, ir::registerContainerSetData); + ctx.clientbound(ClientboundPackets1_13.CONTAINER_SET_SLOT, ir::registerSetSlot); + ctx.clientbound(ClientboundPackets1_13.CONTAINER_SET_CONTENT, ir::registerSetContent); + ctx.clientbound(ClientboundPackets1_13.UPDATE_ADVANCEMENTS, ir::registerAdvancements); + ctx.clientbound(ClientboundPackets1_13.COOLDOWN, ir::registerCooldown); + ctx.serverbound(ServerboundPackets1_13.CONTAINER_CLICK, ir::registerContainerClick); + ctx.serverbound(ServerboundPackets1_13.SET_CREATIVE_MODE_SLOT, ir::registerSetCreativeModeSlot); + } + + static void registerItemPackets1_14(final RegistrationContext ctx, final ItemRewriter ir) { + common1_13(ctx, ir); + ctx.clientbound(ClientboundPackets1_14.SET_EQUIPPED_ITEM, ir::registerSetEquippedItem); + ctx.clientbound(ClientboundPackets1_14.OPEN_SCREEN, ir::registerOpenScreen); + } + + static void registerItemPackets1_14_4(final RegistrationContext ctx, final ItemRewriter ir) { + common1_13(ctx, ir); + ctx.clientbound(ClientboundPackets1_14_4.SET_EQUIPPED_ITEM, ir::registerSetEquippedItem, PacketBound.REMOVED_AT_MAX); + ctx.clientbound(ClientboundPackets1_14_4.OPEN_SCREEN, ir::registerOpenScreen); + ctx.clientbound(ClientboundPackets1_14_4.MERCHANT_OFFERS, ir::registerMerchantOffers1_14_4); + } + + static void registerItemPackets1_16(final RegistrationContext ctx, final ItemRewriter ir) { + common1_13(ctx, ir); + ctx.clientbound(ClientboundPackets1_16.SET_EQUIPMENT, ir::registerSetEquipment, PacketBound.ADDED_AT_MIN); + ctx.clientbound(ClientboundPackets1_16.OPEN_SCREEN, ir::registerOpenScreen); + ctx.clientbound(ClientboundPackets1_16.MERCHANT_OFFERS, ir::registerMerchantOffers1_14_4); + } + + static void registerItemPackets1_17_1(final RegistrationContext ctx, final ItemRewriter ir) { + ctx.clientbound(ClientboundPackets1_17_1.CONTAINER_SET_DATA, ir::registerContainerSetData); + ctx.clientbound(ClientboundPackets1_17_1.CONTAINER_SET_SLOT, ir::registerSetSlot1_17_1); + ctx.clientbound(ClientboundPackets1_17_1.CONTAINER_SET_CONTENT, ir::registerSetContent1_17_1); + ctx.clientbound(ClientboundPackets1_17_1.UPDATE_ADVANCEMENTS, ir::registerAdvancements); + ctx.clientbound(ClientboundPackets1_17_1.COOLDOWN, ir::registerCooldown); + ctx.serverbound(ServerboundPackets1_17.CONTAINER_CLICK, ir::registerContainerClick1_17_1); + ctx.serverbound(ServerboundPackets1_17.SET_CREATIVE_MODE_SLOT, ir::registerSetCreativeModeSlot); + ctx.clientbound(ClientboundPackets1_17_1.SET_EQUIPMENT, ir::registerSetEquipment); + ctx.clientbound(ClientboundPackets1_17_1.OPEN_SCREEN, ir::registerOpenScreen); + ctx.clientbound(ClientboundPackets1_17_1.MERCHANT_OFFERS, ir::registerMerchantOffers1_14_4); + } + + static void registerItemPackets1_19_1(final RegistrationContext ctx, final ItemRewriter ir) { + ctx.clientbound(ClientboundPackets1_19_1.CONTAINER_SET_DATA, ir::registerContainerSetData); + ctx.clientbound(ClientboundPackets1_19_1.CONTAINER_SET_SLOT, ir::registerSetSlot1_17_1); + ctx.clientbound(ClientboundPackets1_19_1.CONTAINER_SET_CONTENT, ir::registerSetContent1_17_1); + ctx.clientbound(ClientboundPackets1_19_1.UPDATE_ADVANCEMENTS, ir::registerAdvancements); + ctx.clientbound(ClientboundPackets1_19_1.COOLDOWN, ir::registerCooldown); + ctx.serverbound(ServerboundPackets1_19_3.CONTAINER_CLICK, ir::registerContainerClick1_17_1); + ctx.serverbound(ServerboundPackets1_19_3.SET_CREATIVE_MODE_SLOT, ir::registerSetCreativeModeSlot); + ctx.clientbound(ClientboundPackets1_19_1.SET_EQUIPMENT, ir::registerSetEquipment); + ctx.clientbound(ClientboundPackets1_19_1.OPEN_SCREEN, ir::registerOpenScreen); + ctx.clientbound(ClientboundPackets1_19_1.MERCHANT_OFFERS, ir::registerMerchantOffers1_19); + } + + static void registerItemPackets1_20_3(final RegistrationContext ctx, final ItemRewriter ir) { + ctx.clientbound(ClientboundPackets1_20_3.CONTAINER_SET_DATA, ir::registerContainerSetData); + ctx.clientbound(ClientboundPackets1_20_3.CONTAINER_SET_SLOT, ir::registerSetSlot1_17_1); + ctx.clientbound(ClientboundPackets1_20_3.CONTAINER_SET_CONTENT, ir::registerSetContent1_17_1); + ctx.clientbound(ClientboundPackets1_20_5.UPDATE_ADVANCEMENTS, ir::registerAdvancements1_20_3); + ctx.clientbound(ClientboundPackets1_20_3.COOLDOWN, ir::registerCooldown); + ctx.serverbound(ServerboundPackets1_20_3.CONTAINER_CLICK, ir::registerContainerClick1_17_1); + ctx.serverbound(ServerboundPackets1_20_2.SET_CREATIVE_MODE_SLOT, ir::registerSetCreativeModeSlot); + ctx.clientbound(ClientboundPackets1_20_5.SET_EQUIPMENT, ir::registerSetEquipment); + ctx.clientbound(ClientboundPackets1_19_4.OPEN_SCREEN, ir::registerOpenScreen); + ctx.clientbound(ClientboundPackets1_20_2.MERCHANT_OFFERS, ir::registerMerchantOffers1_19); + } + + static void registerItemPackets1_20_5(final RegistrationContext ctx, final ItemRewriter ir) { + ctx.clientbound(ClientboundPackets1_20_3.CONTAINER_SET_DATA, ir::registerContainerSetData); + registerItemPackets1_21(ctx, ir); + } + + static void registerItemPackets1_21(final RegistrationContext ctx, final ItemRewriter ir) { + ctx.clientbound(ClientboundPackets1_21.CONTAINER_SET_SLOT, ir::registerSetSlot1_17_1); + ctx.clientbound(ClientboundPackets1_21.CONTAINER_SET_CONTENT, ir::registerSetContent1_17_1); + ctx.clientbound(ClientboundPackets1_21.UPDATE_ADVANCEMENTS, ir::registerAdvancements1_20_3); + ctx.clientbound(ClientboundPackets1_21.COOLDOWN, ir::registerCooldown); + ctx.serverbound(ServerboundPackets1_20_5.CONTAINER_CLICK, ir::registerContainerClick1_17_1); + ctx.serverbound(ServerboundPackets1_20_5.SET_CREATIVE_MODE_SLOT, ir::registerSetCreativeModeSlot); + ctx.clientbound(ClientboundPackets1_21.SET_EQUIPMENT, ir::registerSetEquipment); + ctx.clientbound(ClientboundPackets1_21.OPEN_SCREEN, ir::registerOpenScreen); + ctx.clientbound(ClientboundPackets1_21.MERCHANT_OFFERS, ir::registerMerchantOffers1_20_5); + } + + static void registerItemPackets1_21_2(final RegistrationContext ctx, final ItemRewriter ir) { + ctx.clientbound(ClientboundPackets1_21_2.CONTAINER_SET_SLOT, ir::registerSetSlot1_21_2); + ctx.clientbound(ClientboundPackets1_21_2.CONTAINER_SET_CONTENT, ir::registerSetContent1_21_2); + ctx.clientbound(ClientboundPackets1_21_2.UPDATE_ADVANCEMENTS, ir::registerAdvancements1_20_3); + ctx.clientbound(ClientboundPackets1_21_2.COOLDOWN, ir::registerCooldown1_21_2); + ctx.serverbound(ServerboundPackets1_21_2.CONTAINER_CLICK, ir::registerContainerClick1_21_2); + ctx.serverbound(ServerboundPackets1_21_2.SET_CREATIVE_MODE_SLOT, ir::registerSetCreativeModeSlot); + ctx.clientbound(ClientboundPackets1_21_2.SET_EQUIPMENT, ir::registerSetEquipment); + ctx.clientbound(ClientboundPackets1_21_2.OPEN_SCREEN, ir::registerOpenScreen); + ctx.clientbound(ClientboundPackets1_21_2.MERCHANT_OFFERS, ir::registerMerchantOffers1_20_5); + ctx.clientbound(ClientboundPackets1_21_2.SET_PLAYER_INVENTORY, ir::registerSetPlayerInventory, PacketBound.ADDED_AT_MIN); + ctx.clientbound(ClientboundPackets1_21_2.SET_CURSOR_ITEM, ir::registerSetCursorItem, PacketBound.ADDED_AT_MIN); + } + + static void registerItemPackets1_21_5(final RegistrationContext ctx, final StructuredItemRewriter ir) { + ctx.clientbound(ClientboundPackets1_21_5.CONTAINER_SET_SLOT, ir::registerSetSlot1_21_2); + ctx.clientbound(ClientboundPackets1_21_5.CONTAINER_SET_CONTENT, ir::registerSetContent1_21_2); + ctx.clientbound(ClientboundPackets1_21_5.UPDATE_ADVANCEMENTS, ir::registerAdvancements1_20_3); + ctx.clientbound(ClientboundPackets1_21_5.COOLDOWN, ir::registerCooldown1_21_2); + ctx.serverbound(ServerboundPackets1_21_5.CONTAINER_CLICK, ir::registerContainerClick1_21_5); + ctx.serverbound(ServerboundPackets1_21_5.SET_CREATIVE_MODE_SLOT, ir::registerSetCreativeModeSlot1_21_5); + ctx.clientbound(ClientboundPackets1_21_5.SET_EQUIPMENT, ir::registerSetEquipment); + ctx.clientbound(ClientboundPackets1_21_5.OPEN_SCREEN, ir::registerOpenScreen); + ctx.clientbound(ClientboundPackets1_21_5.MERCHANT_OFFERS, ir::registerMerchantOffers1_20_5); + ctx.clientbound(ClientboundPackets1_21_5.SET_PLAYER_INVENTORY, ir::registerSetPlayerInventory); + ctx.clientbound(ClientboundPackets1_21_5.SET_CURSOR_ITEM, ir::registerSetCursorItem); + } + + static void registerItemPackets1_21_6(final RegistrationContext ctx, final StructuredItemRewriter ir) { + registerItemPackets1_21_5(ctx, ir); + ctx.clientbound(ClientboundPackets1_21_6.SHOW_DIALOG, ir::registerShowDialog, PacketBound.ADDED_AT_MIN); + ctx.clientbound(ClientboundConfigurationPackets1_21_6.SHOW_DIALOG, ir::registerShowDialogDirect, PacketBound.ADDED_AT_MIN); + } + + static @Nullable ItemRewriter item(final RegistrationContext ctx) { + return ctx.protocol().getItemRewriter(); + } + + static @Nullable StructuredItemRewriter structuredItem(final RegistrationContext ctx) { + return (StructuredItemRewriter) ctx.protocol().getItemRewriter(); + } +} diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/ParticleRegistrations.java b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/ParticleRegistrations.java new file mode 100644 index 000000000..3f3d51077 --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/ParticleRegistrations.java @@ -0,0 +1,74 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.viaversion.viaversion.protocol.shared_registration.def; + +import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; +import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType; +import com.viaversion.viaversion.api.type.Types; +import com.viaversion.viaversion.protocol.shared_registration.RegistrationContext; +import com.viaversion.viaversion.protocols.v1_12_2to1_13.packet.ClientboundPackets1_13; +import com.viaversion.viaversion.protocols.v1_14_4to1_15.packet.ClientboundPackets1_15; +import com.viaversion.viaversion.protocols.v1_18_2to1_19.packet.ClientboundPackets1_19; +import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ClientboundPackets1_20_5; +import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ClientboundPackets1_21_9; +import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPackets1_21_2; +import com.viaversion.viaversion.rewriter.ParticleRewriter; +import org.checkerframework.checker.nullness.qual.Nullable; + +final class ParticleRegistrations { + + static void registerParticlePackets1_13(final RegistrationContext ctx, final ParticleRewriter pr) { + ctx.clientbound(ClientboundPackets1_13.LEVEL_PARTICLES, type -> pr.registerLevelParticles1_13(type, Types.FLOAT)); + } + + static void registerParticlePackets1_15_2(final RegistrationContext ctx, final ParticleRewriter pr) { + ctx.clientbound(ClientboundPackets1_15.LEVEL_PARTICLES, type -> pr.registerLevelParticles1_13(type, Types.DOUBLE)); + } + + static void registerParticlePackets1_19(final RegistrationContext ctx, final ParticleRewriter pr) { + ctx.clientbound(ClientboundPackets1_19.LEVEL_PARTICLES, pr::registerLevelParticles1_19); + } + + static void registerParticlePackets1_20(final RegistrationContext ctx, final ParticleRewriter pr) { + ctx.clientbound(ClientboundPackets1_19.LEVEL_PARTICLES, pr::registerLevelParticles1_19); + } + + static void registerParticlePackets1_20_5(final RegistrationContext ctx, final ParticleRewriter pr) { + ctx.clientbound(ClientboundPackets1_20_5.LEVEL_PARTICLES, pr::registerLevelParticles1_20_5); + ctx.clientbound(ClientboundPackets1_20_5.EXPLODE, pr::registerExplode1_20_5); + } + + static void registerParticlePackets1_21_2(final RegistrationContext ctx, final ParticleRewriter pr) { + ctx.clientbound(ClientboundPackets1_21_2.LEVEL_PARTICLES, pr::registerLevelParticles1_20_5); + ctx.clientbound(ClientboundPackets1_21_2.EXPLODE, pr::registerExplode1_21_2); + } + + static void registerParticlePackets1_21_4(final RegistrationContext ctx, final ParticleRewriter pr) { + ctx.clientbound(ClientboundPackets1_21_2.LEVEL_PARTICLES, pr::registerLevelParticles1_21_4); + ctx.clientbound(ClientboundPackets1_21_2.EXPLODE, pr::registerExplode1_21_2); + } + + static void registerParticlePackets1_21_9(final RegistrationContext ctx, final ParticleRewriter pr) { + ctx.clientbound(ClientboundPackets1_21_9.LEVEL_PARTICLES, pr::registerLevelParticles1_21_4); + ctx.clientbound(ClientboundPackets1_21_9.EXPLODE, pr::registerExplode1_21_9); + } + + static @Nullable ParticleRewriter particle(final RegistrationContext ctx) { + return ctx.protocol().getParticleRewriter(); + } +} diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/RegistryRegistrations.java b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/RegistryRegistrations.java new file mode 100644 index 000000000..556e06721 --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/RegistryRegistrations.java @@ -0,0 +1,102 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.viaversion.viaversion.protocol.shared_registration.def; + +import com.viaversion.viaversion.api.data.Mappings; +import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; +import com.viaversion.viaversion.protocol.shared_registration.PacketBound; +import com.viaversion.viaversion.protocol.shared_registration.RegistrationContext; +import com.viaversion.viaversion.protocols.v1_12_2to1_13.packet.ClientboundPackets1_13; +import com.viaversion.viaversion.protocols.v1_13_2to1_14.packet.ClientboundPackets1_14; +import com.viaversion.viaversion.protocols.v1_17to1_17_1.packet.ClientboundPackets1_17_1; +import com.viaversion.viaversion.protocols.v1_19_1to1_19_3.packet.ClientboundPackets1_19_3; +import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.rewriter.CommandRewriter1_19_4; +import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundConfigurationPackets1_21; +import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundPackets1_21; +import com.viaversion.viaversion.protocols.v1_20to1_20_2.packet.ClientboundConfigurationPackets1_20_2; +import com.viaversion.viaversion.protocols.v1_20to1_20_2.packet.ClientboundPackets1_20_2; +import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPackets1_21_2; +import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3; +import com.viaversion.viaversion.rewriter.AttributeRewriter; +import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter; +import com.viaversion.viaversion.rewriter.SoundRewriter; +import com.viaversion.viaversion.rewriter.StatisticsRewriter; + +final class RegistryRegistrations { + + static void registerTags1_17_1(final RegistrationContext ctx) { + if (ctx.protocol().getTagRewriter() == null) return; + ctx.clientbound(ClientboundPackets1_17_1.UPDATE_TAGS, ctx.protocol().getTagRewriter()::registerGeneric); + } + + static void registerTags1_20_2(final RegistrationContext ctx) { + if (ctx.protocol().getTagRewriter() == null) return; + ctx.clientbound(ClientboundPackets1_20_2.UPDATE_TAGS, ctx.protocol().getTagRewriter()::registerGeneric); + ctx.clientbound(ClientboundConfigurationPackets1_20_2.UPDATE_TAGS, ctx.protocol().getTagRewriter()::registerGeneric, PacketBound.ADDED_AT_MIN); + } + + + static void registerRegistryData1_21(final RegistrationContext ctx) { + if (ctx.protocol().getRegistryDataRewriter() == null) return; + ctx.clientboundHandler(ClientboundConfigurationPackets1_21.REGISTRY_DATA, ctx.protocol().getRegistryDataRewriter()::handle); + } + + + static void registerRecipePackets1_21_2(final RegistrationContext ctx) { + final RecipeDisplayRewriter rr = ctx.protocol().getRecipeRewriter(); + if (rr == null) return; + ctx.clientbound(ClientboundPackets1_21_2.UPDATE_RECIPES, rr::registerUpdateRecipes); + ctx.clientbound(ClientboundPackets1_21_2.RECIPE_BOOK_ADD, rr::registerRecipeBookAdd, PacketBound.ADDED_AT_MIN); + ctx.clientbound(ClientboundPackets1_21_2.PLACE_GHOST_RECIPE, rr::registerPlaceGhostRecipe); + } + + + static void registerStatistics1_13(final RegistrationContext ctx) { + ctx.clientbound(ClientboundPackets1_13.AWARD_STATS, new StatisticsRewriter<>(ctx.protocol())::register); + } + + + static void registerSounds1_10(final RegistrationContext ctx) { + ctx.clientbound(ClientboundPackets1_9_3.SOUND, new SoundRewriter<>(ctx.protocol())::registerSound); + } + + static void registerSounds1_14(final RegistrationContext ctx) { + final SoundRewriter sr = new SoundRewriter<>(ctx.protocol()); + ctx.clientbound(ClientboundPackets1_14.SOUND, sr::registerSound); + ctx.clientbound(ClientboundPackets1_14.SOUND_ENTITY, sr::registerSound, PacketBound.ADDED_AT_MIN); + } + + static void registerSounds1_19_3(final RegistrationContext ctx) { + final SoundRewriter sr = new SoundRewriter<>(ctx.protocol()); + ctx.clientbound(ClientboundPackets1_19_3.SOUND, sr::registerSound1_19_3); + ctx.clientbound(ClientboundPackets1_19_3.SOUND_ENTITY, sr::registerSound1_19_3); + } + + + static void registerCommands1_19(final RegistrationContext ctx) { + if ((ctx.protocol().getMappingData() != null && !Mappings.isIntIdIdentity(ctx.protocol().getMappingData().getArgumentTypeMappings())) + || (ctx.protocol().getRegistryDataRewriter() != null && ctx.protocol().getRegistryDataRewriter().hasRegistriesToRemove())) { + ctx.clientbound(ClientboundPackets1_19_3.COMMANDS, new CommandRewriter1_19_4<>(ctx.protocol())::registerDeclareCommands1_19); + } + } + + + static void registerAttributes1_21(final RegistrationContext ctx) { + ctx.clientbound(ClientboundPackets1_21.UPDATE_ATTRIBUTES, new AttributeRewriter<>(ctx.protocol())::register1_21); + } +} diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/TextComponentRegistrations.java b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/TextComponentRegistrations.java new file mode 100644 index 000000000..81c7cf378 --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocol/shared_registration/def/TextComponentRegistrations.java @@ -0,0 +1,203 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.viaversion.viaversion.protocol.shared_registration.def; + +import com.viaversion.viaversion.api.minecraft.item.data.ChatType; +import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; +import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType; +import com.viaversion.viaversion.api.type.Type; +import com.viaversion.viaversion.api.type.Types; +import com.viaversion.viaversion.protocol.shared_registration.PacketBound; +import com.viaversion.viaversion.protocol.shared_registration.RegistrationContext; +import com.viaversion.viaversion.protocols.v1_12to1_12_1.packet.ClientboundPackets1_12_1; +import com.viaversion.viaversion.protocols.v1_15_2to1_16.packet.ClientboundPackets1_16; +import com.viaversion.viaversion.protocols.v1_16_1to1_16_2.packet.ClientboundPackets1_16_2; +import com.viaversion.viaversion.protocols.v1_17to1_17_1.packet.ClientboundPackets1_17_1; +import com.viaversion.viaversion.protocols.v1_18_2to1_19.packet.ClientboundPackets1_19; +import com.viaversion.viaversion.protocols.v1_19to1_19_1.packet.ClientboundPackets1_19_1; +import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.packet.ClientboundConfigurationPackets1_20_3; +import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.packet.ClientboundPackets1_20_3; +import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ClientboundConfigurationPackets1_20_5; +import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ClientboundPackets1_20_5; +import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundPackets1_21; +import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ClientboundPackets1_21_5; +import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPackets1_21_2; +import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase; +import com.viaversion.viaversion.rewriter.text.JsonNBTComponentRewriter; +import com.viaversion.viaversion.rewriter.text.NBTComponentRewriter; +import org.checkerframework.checker.nullness.qual.Nullable; + +final class TextComponentRegistrations { + + static void registerComponents1_12_2(final RegistrationContext ctx, final ComponentRewriterBase cr) { + ctx.clientbound(ClientboundPackets1_12_1.CHAT, cr::registerComponentPacket); + registerCombatAndTitle1_12_2(ctx, cr); + registerComponentsFrom1_12_2(ctx, cr); + } + + static void registerComponents1_14(final RegistrationContext ctx, final ComponentRewriterBase cr) { + ctx.clientbound(ClientboundPackets1_12_1.CHAT, cr::registerComponentPacket); + registerCombatAndTitle1_12_2(ctx, cr); + registerComponentsFrom1_12_2(ctx, cr); + ctx.clientbound(ClientboundPackets1_16_2.SET_OBJECTIVE, cr::registerSetObjective); + ctx.clientbound(ClientboundPackets1_16_2.SET_PLAYER_TEAM, cr::registerSetPlayerTeam1_13); + } + + static void registerComponents1_16_2(final RegistrationContext ctx, final ComponentRewriterBase cr) { + ctx.clientbound(ClientboundPackets1_16.CHAT, cr::registerComponentPacket); + registerComponentsFrom1_12_2(ctx, cr); + ctx.clientbound(ClientboundPackets1_16_2.SET_OBJECTIVE, cr::registerSetObjective); + ctx.clientbound(ClientboundPackets1_16_2.SET_PLAYER_TEAM, cr::registerSetPlayerTeam1_13); + if (!(cr instanceof final JsonNBTComponentRewriter jcr)) return; + ctx.clientbound(ClientboundPackets1_12_1.PLAYER_COMBAT, jcr::registerPlayerCombat, PacketBound.REMOVED_AT_MAX); + ctx.clientbound(ClientboundPackets1_12_1.SET_TITLES, jcr::registerTitle, PacketBound.REMOVED_AT_MAX); + } + + static void registerComponents1_17(final RegistrationContext ctx, final ComponentRewriterBase cr) { + ctx.clientbound(ClientboundPackets1_16.CHAT, cr::registerComponentPacket, PacketBound.REMOVED_AT_MAX); + registerComponentsFrom1_12_2(ctx, cr); + ctx.clientbound(ClientboundPackets1_17_1.SET_ACTION_BAR_TEXT, cr::registerComponentPacket, PacketBound.ADDED_AT_MIN); + ctx.clientbound(ClientboundPackets1_17_1.SET_TITLE_TEXT, cr::registerComponentPacket, PacketBound.ADDED_AT_MIN); + ctx.clientbound(ClientboundPackets1_17_1.SET_SUBTITLE_TEXT, cr::registerComponentPacket, PacketBound.ADDED_AT_MIN); + ctx.clientbound(ClientboundPackets1_16_2.SET_OBJECTIVE, cr::registerSetObjective); + if (cr instanceof final JsonNBTComponentRewriter jcr) { + ctx.clientbound(ClientboundPackets1_17_1.PLAYER_COMBAT_KILL, jcr::registerPlayerCombatKill, PacketBound.ADDED_AT_MIN); + } + ctx.clientbound(ClientboundPackets1_16_2.SET_PLAYER_TEAM, cr::registerSetPlayerTeam1_13); + } + + static void registerComponents1_19(final RegistrationContext ctx, final ComponentRewriterBase cr) { + registerComponentsFrom1_12_2(ctx, cr); + registerActionBarTitleSubtitle1_17_1(ctx, cr); + ctx.clientbound(ClientboundPackets1_16_2.SET_OBJECTIVE, cr::registerSetObjective); + if (cr instanceof final JsonNBTComponentRewriter jcr) { + ctx.clientbound(ClientboundPackets1_17_1.PLAYER_COMBAT_KILL, jcr::registerPlayerCombatKill); + } + ctx.clientbound(ClientboundPackets1_16_2.SET_PLAYER_TEAM, cr::registerSetPlayerTeam1_13); + ctx.clientbound(ClientboundPackets1_19.SYSTEM_CHAT, cr::registerComponentPacket, PacketBound.ADDED_AT_MIN); + ctx.clientbound(ClientboundPackets1_19.SERVER_DATA, cr::registerComponentPacket, PacketBound.ADDED_AT_MIN); + } + + static void registerComponents1_20_3(final RegistrationContext ctx, final ComponentRewriterBase cr) { + registerComponentsFrom1_12_2(ctx, cr); + registerActionBarTitleSubtitle1_17_1(ctx, cr); + ctx.clientbound(ClientboundPackets1_16_2.SET_OBJECTIVE, cr::registerSetObjective); + ctx.clientbound(ClientboundPackets1_19_1.SYSTEM_CHAT, cr::registerComponentPacket); + ctx.clientbound(ClientboundConfigurationPackets1_20_3.DISCONNECT, cr::registerComponentPacket); + ctx.clientbound(ClientboundPackets1_20_3.DISGUISED_CHAT, cr::registerComponentPacket); + ctx.clientbound(ClientboundPackets1_20_3.SET_SCORE, cr::registerSetScore1_20_3); + ctx.clientbound(ClientboundPackets1_20_3.PLAYER_COMBAT_KILL, cr::registerPlayerCombatKill1_20); + ctx.clientbound(ClientboundPackets1_20_5.SET_PLAYER_TEAM, cr::registerSetPlayerTeam1_13); + ctx.clientbound(ClientboundPackets1_19.SERVER_DATA, cr::registerComponentPacket); + if (cr instanceof final JsonNBTComponentRewriter jcr) { + ctx.clientbound(ClientboundPackets1_20_3.PLAYER_CHAT, cu -> jcr.registerPlayerChat(cu, Types.VAR_INT)); + ctx.clientbound(ClientboundPackets1_20_3.PLAYER_INFO_UPDATE, jcr::registerPlayerInfoUpdate1_20_3); + } + } + + static void registerCombatAndTitle1_12_2(final RegistrationContext ctx, final ComponentRewriterBase cr) { + if (!(cr instanceof final JsonNBTComponentRewriter jcr)) return; + ctx.clientbound(ClientboundPackets1_12_1.PLAYER_COMBAT, jcr::registerPlayerCombat); + ctx.clientbound(ClientboundPackets1_12_1.SET_TITLES, jcr::registerTitle); + } + + private static void registerComponentsFrom1_12_2(final RegistrationContext ctx, final ComponentRewriterBase cr) { + // not including set_score, player_info, update_advancements, and open_screen + ctx.clientbound(ClientboundPackets1_12_1.BOSS_EVENT, cr::registerBossEvent); + ctx.clientbound(ClientboundPackets1_12_1.DISCONNECT, cr::registerComponentPacket); + ctx.clientbound(ClientboundPackets1_12_1.TAB_LIST, cr::registerTabList); + cr.registerLoginDisconnect(); + } + + static void registerActionBarTitleSubtitle1_17_1(final RegistrationContext ctx, final ComponentRewriterBase cr) { + ctx.clientbound(ClientboundPackets1_17_1.SET_ACTION_BAR_TEXT, cr::registerComponentPacket); + ctx.clientbound(ClientboundPackets1_17_1.SET_TITLE_TEXT, cr::registerComponentPacket); + ctx.clientbound(ClientboundPackets1_17_1.SET_SUBTITLE_TEXT, cr::registerComponentPacket); + } + + static void registerComponents1_20_5(final RegistrationContext ctx, final ComponentRewriterBase cr) { + common1_20_5(ctx, cr); + ctx.clientbound(ClientboundPackets1_20_5.SET_PLAYER_TEAM, cr::registerSetPlayerTeam1_13); + ctx.clientbound(ClientboundPackets1_20_5.DISGUISED_CHAT, cr::registerComponentPacket); + if (cr instanceof final JsonNBTComponentRewriter jcr) { + ctx.clientbound(ClientboundPackets1_20_5.PLAYER_CHAT, cu -> jcr.registerPlayerChat(cu, Types.VAR_INT)); + ctx.clientbound(ClientboundPackets1_20_5.PLAYER_INFO_UPDATE, jcr::registerPlayerInfoUpdate1_20_3); + } + } + + private static void common1_20_5(final RegistrationContext ctx, final ComponentRewriterBase cr) { + ctx.clientbound(ClientboundConfigurationPackets1_20_5.DISCONNECT, cr::registerComponentPacket); + ctx.clientbound(ClientboundPackets1_20_5.DISCONNECT, cr::registerComponentPacket); + ctx.clientbound(ClientboundPackets1_20_5.SET_ACTION_BAR_TEXT, cr::registerComponentPacket); + ctx.clientbound(ClientboundPackets1_20_5.SET_TITLE_TEXT, cr::registerComponentPacket); + ctx.clientbound(ClientboundPackets1_20_5.SET_SUBTITLE_TEXT, cr::registerComponentPacket); + ctx.clientbound(ClientboundPackets1_20_5.BOSS_EVENT, cr::registerBossEvent); + ctx.clientbound(ClientboundPackets1_20_5.TAB_LIST, cr::registerTabList); + ctx.clientbound(ClientboundPackets1_20_5.SET_OBJECTIVE, cr::registerSetObjective); + ctx.clientbound(ClientboundPackets1_20_5.SET_SCORE, cr::registerSetScore1_20_3); + ctx.clientbound(ClientboundPackets1_20_5.SYSTEM_CHAT, cr::registerComponentPacket); + ctx.clientbound(ClientboundPackets1_20_5.PLAYER_COMBAT_KILL, cr::registerPlayerCombatKill1_20); + ctx.clientbound(ClientboundPackets1_20_5.SERVER_DATA, cr::registerComponentPacket); + cr.registerLoginDisconnect(); + } + + static void registerComponents1_21(final RegistrationContext ctx, final ComponentRewriterBase cr) { + common1_21_1(ctx, cr, Types.VAR_INT); + } + + private static void common1_21_1(final RegistrationContext ctx, final ComponentRewriterBase cr, final Type chatType) { + common1_20_5(ctx, cr); + ctx.clientbound(ClientboundPackets1_21.SET_PLAYER_TEAM, cr::registerSetPlayerTeam1_13); + ctx.clientbound(ClientboundPackets1_21.DISGUISED_CHAT, cr::registerDisguisedChat); + if (cr instanceof final JsonNBTComponentRewriter jcr) { + ctx.clientbound(ClientboundPackets1_21.PLAYER_CHAT, cu -> jcr.registerPlayerChat(cu, chatType)); + ctx.clientbound(ClientboundPackets1_21.PLAYER_INFO_UPDATE, jcr::registerPlayerInfoUpdate1_20_3); + } + } + + static void registerComponents1_21_2(final RegistrationContext ctx, final ComponentRewriterBase cr) { + common1_21_1(ctx, cr, ChatType.TYPE); + } + + static void registerComponents1_21_4(final RegistrationContext ctx, final ComponentRewriterBase cr) { + common1_20_5(ctx, cr); + ctx.clientbound(ClientboundPackets1_21_2.SET_PLAYER_TEAM, cr::registerSetPlayerTeam1_13); + ctx.clientbound(ClientboundPackets1_21_2.DISGUISED_CHAT, cr::registerDisguisedChat); + ctx.clientbound(ClientboundPackets1_21_2.PLAYER_INFO_UPDATE, cr::registerPlayerInfoUpdate1_21_4); + if (cr instanceof final JsonNBTComponentRewriter jcr) { + ctx.clientbound(ClientboundPackets1_21_2.PLAYER_CHAT, cu -> jcr.registerPlayerChat(cu, ChatType.TYPE)); + } + } + + static void registerComponents1_21_5(final RegistrationContext ctx, final NBTComponentRewriter cr) { + common1_20_5(ctx, cr); + ctx.clientbound(ClientboundPackets1_21_5.SET_PLAYER_TEAM, cr::registerSetPlayerTeam1_21_5); + ctx.clientbound(ClientboundPackets1_21_5.DISGUISED_CHAT, cr::registerDisguisedChat); + ctx.clientbound(ClientboundPackets1_21_5.PLAYER_INFO_UPDATE, cr::registerPlayerInfoUpdate1_21_4); + ctx.clientbound(ClientboundPackets1_21_5.PLAYER_CHAT, cr::registerPlayerChat1_21_5); + } + + static @Nullable ComponentRewriterBase text(final RegistrationContext ctx) { + return ctx.protocol().getComponentRewriter(); + } + + + static @Nullable NBTComponentRewriter nbtText(final RegistrationContext ctx) { + return (NBTComponentRewriter) ctx.protocol().getComponentRewriter(); + } +} diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/template/BlockItemPacketRewriter99_1.java b/common/src/main/java/com/viaversion/viaversion/protocols/template/BlockItemPacketRewriter99_1.java index 136659475..16e6babf7 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/template/BlockItemPacketRewriter99_1.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/template/BlockItemPacketRewriter99_1.java @@ -21,19 +21,11 @@ import com.viaversion.nbt.tag.CompoundTag; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.minecraft.data.StructuredDataContainer; import com.viaversion.viaversion.api.minecraft.item.Item; -import com.viaversion.viaversion.api.type.types.chunk.ChunkType26_1; import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ClientboundPacket26_1; -import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ClientboundPackets26_1; -import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.RecipeDisplayRewriter1_21_5; -import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ServerboundPackets1_21_6; import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ServerboundPacket1_21_9; -import com.viaversion.viaversion.rewriter.BlockRewriter; -import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter; import com.viaversion.viaversion.rewriter.StructuredItemRewriter; -import com.viaversion.viaversion.rewriter.block.BlockRewriter1_21_5; // To replace if needed: -// ChunkType26_1 // RecipeDisplayRewriter final class BlockItemPacketRewriter99_1 extends StructuredItemRewriter { @@ -43,37 +35,10 @@ final class BlockItemPacketRewriter99_1 extends StructuredItemRewriter blockRewriter = new BlockRewriter1_21_5<>(protocol); - blockRewriter.registerBlockEvent(ClientboundPackets26_1.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets26_1.BLOCK_UPDATE); - blockRewriter.registerSectionBlocksUpdate1_20(ClientboundPackets26_1.SECTION_BLOCKS_UPDATE); - blockRewriter.registerLevelEvent1_21(ClientboundPackets26_1.LEVEL_EVENT, 2001); - blockRewriter.registerLevelChunk1_19(ClientboundPackets26_1.LEVEL_CHUNK_WITH_LIGHT, ChunkType26_1::new); - blockRewriter.registerBlockEntityData(ClientboundPackets26_1.BLOCK_ENTITY_DATA); + // Common block, item, recipe, and entity registrations are handled by SharedRegistrations - // Registers item id changes - // Other places using item ids are: Entity data, tags, statistics, effect // registerOpenScreen(ClientboundPackets26_1.OPEN_SCREEN); If a new container type was added; also remove from the component rewriter registration - registerSetCursorItem(ClientboundPackets26_1.SET_CURSOR_ITEM); - registerSetPlayerInventory(ClientboundPackets26_1.SET_PLAYER_INVENTORY); - registerCooldown1_21_2(ClientboundPackets26_1.COOLDOWN); - registerSetContent1_21_2(ClientboundPackets26_1.CONTAINER_SET_CONTENT); - registerSetSlot1_21_2(ClientboundPackets26_1.CONTAINER_SET_SLOT); - registerAdvancements1_20_3(ClientboundPackets26_1.UPDATE_ADVANCEMENTS); - registerSetEquipment(ClientboundPackets26_1.SET_EQUIPMENT); - registerMerchantOffers1_20_5(ClientboundPackets26_1.MERCHANT_OFFERS); - registerContainerClick1_21_5(ServerboundPackets1_21_6.CONTAINER_CLICK); - registerSetCreativeModeSlot1_21_5(ServerboundPackets1_21_6.SET_CREATIVE_MODE_SLOT); - - final RecipeDisplayRewriter recipeRewriter = new RecipeDisplayRewriter1_21_5<>(protocol); - recipeRewriter.registerUpdateRecipes(ClientboundPackets26_1.UPDATE_RECIPES); - recipeRewriter.registerRecipeBookAdd(ClientboundPackets26_1.RECIPE_BOOK_ADD); - recipeRewriter.registerPlaceGhostRecipe(ClientboundPackets26_1.PLACE_GHOST_RECIPE); - // OR do this if serialization of recipes changed and override the relevant method - // Add new serializers to RecipeDisplayRewriter, or extend the last one for changes + // OR add new serializers to RecipeDisplayRewriter, or extend the last one for changes } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/template/EntityPacketRewriter99_1.java b/common/src/main/java/com/viaversion/viaversion/protocols/template/EntityPacketRewriter99_1.java index 0658810da..a91c0af84 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/template/EntityPacketRewriter99_1.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/template/EntityPacketRewriter99_1.java @@ -35,14 +35,8 @@ final class EntityPacketRewriter99_1 extends EntityRewriter { public static final MappingData MAPPINGS = new MappingDataBase("98.1", "99.1"); private final EntityPacketRewriter99_1 entityRewriter = new EntityPacketRewriter99_1(this); private final BlockItemPacketRewriter99_1 itemRewriter = new BlockItemPacketRewriter99_1(this); + private final BlockRewriter blockRewriter = new BlockRewriter1_21_5<>(this, ChunkType26_1::new); private final ParticleRewriter particleRewriter = new ParticleRewriter<>(this); private final TagRewriter tagRewriter = new TagRewriter<>(this); private final NBTComponentRewriter componentRewriter = new ComponentRewriter99_1(this); @@ -71,40 +73,9 @@ final class Protocol98_1To99_1 extends AbstractProtocol soundRewriter = new SoundRewriter<>(this); - soundRewriter.registerSound1_19_3(ClientboundPackets26_1.SOUND); - soundRewriter.registerSound1_19_3(ClientboundPackets26_1.SOUND_ENTITY); - - new StatisticsRewriter<>(this).register(ClientboundPackets26_1.AWARD_STATS); - new AttributeRewriter<>(this).register1_21(ClientboundPackets26_1.UPDATE_ATTRIBUTES); + // Common registrations (tags, components, particles, sounds, statistics, attributes) + // are automatically applied via SharedRegistrations based on the protocol's version range. + // Only protocol-specific registrations need to be added here. // Uncomment if an existing type changed serialization format. Mappings for argument type keys can also be defined in mapping files /*new CommandRewriter1_19_4<>(this) { @@ -173,6 +144,11 @@ final class Protocol98_1To99_1 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + @Override public RegistryDataRewriter getRegistryDataRewriter() { return registryDataRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_10to1_11/Protocol1_10To1_11.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_10to1_11/Protocol1_10To1_11.java index 79dbf7a22..7b4c198a2 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_10to1_11/Protocol1_10To1_11.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_10to1_11/Protocol1_10To1_11.java @@ -37,7 +37,6 @@ import com.viaversion.viaversion.protocols.v1_10to1_11.rewriter.ItemPacketRewrit import com.viaversion.viaversion.protocols.v1_10to1_11.storage.EntityTracker1_11; import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3; import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ServerboundPackets1_9_3; -import com.viaversion.viaversion.rewriter.SoundRewriter; public class Protocol1_10To1_11 extends AbstractProtocol { @@ -59,7 +58,15 @@ public class Protocol1_10To1_11 extends AbstractProtocol(this, this::getNewSoundId).registerSound(ClientboundPackets1_9_3.SOUND); + registerClientbound(ClientboundPackets1_9_3.SOUND, wrapper -> { + int soundId = wrapper.read(Types.VAR_INT); + int mappedId = getNewSoundId(soundId); + if (mappedId == -1) { + wrapper.cancel(); + } else { + wrapper.write(Types.VAR_INT, mappedId); + } + }); registerClientbound(ClientboundPackets1_9_3.SET_TITLES, new PacketHandlers() { @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_11_1to1_12/Protocol1_11_1To1_12.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_11_1to1_12/Protocol1_11_1To1_12.java index 18051e093..915ba52b3 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_11_1to1_12/Protocol1_11_1To1_12.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_11_1to1_12/Protocol1_11_1To1_12.java @@ -43,7 +43,6 @@ import com.viaversion.viaversion.protocols.v1_11_1to1_12.rewriter.EntityPacketRe import com.viaversion.viaversion.protocols.v1_11_1to1_12.rewriter.ItemPacketRewriter1_12; import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3; import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ServerboundPackets1_9_3; -import com.viaversion.viaversion.rewriter.SoundRewriter; public class Protocol1_11_1To1_12 extends AbstractProtocol { @@ -58,6 +57,16 @@ public class Protocol1_11_1To1_12 extends AbstractProtocol { + int soundId = wrapper.read(Types.VAR_INT); + int mappedId = getNewSoundId(soundId); + if (mappedId == -1) { + wrapper.cancel(); + } else { + wrapper.write(Types.VAR_INT, mappedId); + } + }); + registerClientbound(ClientboundPackets1_9_3.CHAT, wrapper -> { final JsonElement element = wrapper.passthrough(Types.COMPONENT); TranslateRewriter.toClient(wrapper.user(), element); @@ -96,9 +105,6 @@ public class Protocol1_11_1To1_12 extends AbstractProtocol(this, this::getNewSoundId).registerSound(ClientboundPackets1_9_3.SOUND); - - // New packet at 0x01 cancelServerbound(ServerboundPackets1_12.CRAFTING_RECIPE_PLACEMENT); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_12_2to1_13/Protocol1_12_2To1_13.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_12_2to1_13/Protocol1_12_2To1_13.java index 0e02ad75a..4b88e8cef 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_12_2to1_13/Protocol1_12_2To1_13.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_12_2to1_13/Protocol1_12_2To1_13.java @@ -40,7 +40,6 @@ import com.viaversion.viaversion.api.type.Types; import com.viaversion.viaversion.api.type.types.misc.ParticleType; import com.viaversion.viaversion.api.type.types.version.Types1_13; import com.viaversion.viaversion.data.entity.EntityTrackerBase; -import com.viaversion.viaversion.protocols.base.ClientboundLoginPackets; import com.viaversion.viaversion.protocols.base.ClientboundStatusPackets; import com.viaversion.viaversion.protocols.base.ServerboundLoginPackets; import com.viaversion.viaversion.protocols.v1_12_2to1_13.blockconnections.ConnectionData; @@ -181,10 +180,6 @@ public class Protocol1_12_2To1_13 extends AbstractProtocol { - componentRewriter.processText(wrapper.user(), wrapper.passthrough(Types.COMPONENT)); - }); - registerClientbound(State.STATUS, ClientboundStatusPackets.STATUS_RESPONSE, new PacketHandlers() { @Override public void register() { @@ -253,9 +248,6 @@ public class Protocol1_12_2To1_13 extends AbstractProtocol { wrapper.write(Types.VAR_INT, wrapper.user().get(TabCompleteTracker.class).getTransactionId()); @@ -329,8 +321,6 @@ public class Protocol1_12_2To1_13 extends AbstractProtocol(this).registerSound(ClientboundPackets1_12_1.SOUND); - - registerClientbound(ClientboundPackets1_12_1.TAB_LIST, wrapper -> { - componentRewriter.processText(wrapper.user(), wrapper.passthrough(Types.COMPONENT)); - componentRewriter.processText(wrapper.user(), wrapper.passthrough(Types.COMPONENT)); - }); - registerClientbound(ClientboundPackets1_12_1.UPDATE_ADVANCEMENTS, wrapper -> { wrapper.passthrough(Types.BOOLEAN); // Reset/clear int size = wrapper.passthrough(Types.VAR_INT); // Mapping size diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_13_2to1_14/Protocol1_13_2To1_14.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_13_2to1_14/Protocol1_13_2To1_14.java index e655321e3..5c1e0e8a5 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_13_2to1_14/Protocol1_13_2To1_14.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_13_2to1_14/Protocol1_13_2To1_14.java @@ -23,7 +23,6 @@ import com.viaversion.viaversion.api.minecraft.RegistryType; import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_14; import com.viaversion.viaversion.api.protocol.AbstractProtocol; import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers; -import com.viaversion.viaversion.api.type.Types; import com.viaversion.viaversion.api.type.types.misc.ParticleType; import com.viaversion.viaversion.api.type.types.version.Types1_13_2; import com.viaversion.viaversion.api.type.types.version.Types1_14; @@ -38,10 +37,9 @@ import com.viaversion.viaversion.protocols.v1_13_2to1_14.rewriter.ItemPacketRewr import com.viaversion.viaversion.protocols.v1_13_2to1_14.rewriter.PlayerPacketRewriter1_14; import com.viaversion.viaversion.protocols.v1_13_2to1_14.rewriter.WorldPacketRewriter1_14; import com.viaversion.viaversion.protocols.v1_13_2to1_14.storage.EntityTracker1_14; +import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.CommandRewriter; import com.viaversion.viaversion.rewriter.ParticleRewriter; -import com.viaversion.viaversion.rewriter.SoundRewriter; -import com.viaversion.viaversion.rewriter.StatisticsRewriter; import com.viaversion.viaversion.rewriter.TagRewriter; import com.viaversion.viaversion.rewriter.text.JsonNBTComponentRewriter; import com.viaversion.viaversion.util.ProtocolLogger; @@ -55,6 +53,7 @@ public class Protocol1_13_2To1_14 extends AbstractProtocol particleRewriter = new ParticleRewriter<>(this); private final TagRewriter tagRewriter = new TagRewriter<>(this); + private final BlockRewriter blockRewriter = BlockRewriter.for1_14(this); public Protocol1_13_2To1_14() { super(ClientboundPackets1_13.class, ClientboundPackets1_14.class, ServerboundPackets1_13.class, ServerboundPackets1_14.class); @@ -67,11 +66,6 @@ public class Protocol1_13_2To1_14 extends AbstractProtocol(this).registerSound(ClientboundPackets1_13.SOUND); - new StatisticsRewriter<>(this).register(ClientboundPackets1_13.AWARD_STATS); - - particleRewriter.registerLevelParticles1_13(ClientboundPackets1_13.LEVEL_PARTICLES, Types.FLOAT); - JsonNBTComponentRewriter componentRewriter = new ComponentRewriter1_14<>(this); componentRewriter.registerComponentPacket(ClientboundPackets1_13.CHAT); @@ -151,6 +145,11 @@ public class Protocol1_13_2To1_14 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + @Override public ParticleRewriter getParticleRewriter() { return particleRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_13_2to1_14/rewriter/EntityPacketRewriter1_14.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_13_2to1_14/rewriter/EntityPacketRewriter1_14.java index 294043e09..991fe063f 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_13_2to1_14/rewriter/EntityPacketRewriter1_14.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_13_2to1_14/rewriter/EntityPacketRewriter1_14.java @@ -252,7 +252,6 @@ public class EntityPacketRewriter1_14 extends EntityRewriter { Short windowId = wrapper.read(Types.UNSIGNED_BYTE); String type = wrapper.read(Types.STRING); @@ -112,9 +109,6 @@ public class ItemPacketRewriter1_14 extends ItemRewriter recipeRewriter = new RecipeRewriter<>(protocol); protocol.registerClientbound(ClientboundPackets1_13.UPDATE_RECIPES, wrapper -> { int size = wrapper.passthrough(Types.VAR_INT); @@ -188,8 +180,6 @@ public class ItemPacketRewriter1_14 extends ItemRewriter { // Selecting trade now moves the items, we need to resync the inventory PacketWrapper resyncPacket = wrapper.create(ServerboundPackets1_13.CONTAINER_CLICK); @@ -204,8 +194,6 @@ public class ItemPacketRewriter1_14 extends ItemRewriter blockRewriter = BlockRewriter.for1_14(protocol); - protocol.registerClientbound(ClientboundPackets1_13.BLOCK_DESTRUCTION, new PacketHandlers() { @Override public void register() { @@ -69,7 +66,7 @@ public class WorldPacketRewriter1_14 { map(Types.BLOCK_POSITION1_8, Types.BLOCK_POSITION1_14); } }); - protocol.registerClientbound(ClientboundPackets1_13.BLOCK_EVENT, new PacketHandlers() { + protocol.replaceClientbound(ClientboundPackets1_13.BLOCK_EVENT, new PacketHandlers() { @Override public void register() { map(Types.BLOCK_POSITION1_8, Types.BLOCK_POSITION1_14); // Location @@ -79,7 +76,7 @@ public class WorldPacketRewriter1_14 { handler(wrapper -> wrapper.set(Types.VAR_INT, 0, protocol.getMappingData().getNewBlockId(wrapper.get(Types.VAR_INT, 0)))); } }); - protocol.registerClientbound(ClientboundPackets1_13.BLOCK_UPDATE, new PacketHandlers() { + protocol.replaceClientbound(ClientboundPackets1_13.BLOCK_UPDATE, new PacketHandlers() { @Override public void register() { map(Types.BLOCK_POSITION1_8, Types.BLOCK_POSITION1_14); @@ -102,8 +99,6 @@ public class WorldPacketRewriter1_14 { } }); - blockRewriter.registerChunkBlocksUpdate(ClientboundPackets1_13.CHUNK_BLOCKS_UPDATE); - protocol.registerClientbound(ClientboundPackets1_13.EXPLODE, new PacketHandlers() { @Override public void register() { @@ -247,7 +242,7 @@ public class WorldPacketRewriter1_14 { } }); - protocol.registerClientbound(ClientboundPackets1_13.LEVEL_EVENT, new PacketHandlers() { + protocol.replaceClientbound(ClientboundPackets1_13.LEVEL_EVENT, new PacketHandlers() { @Override public void register() { map(Types.INT); // Effect Id diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_13to1_13_1/Protocol1_13To1_13_1.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_13to1_13_1/Protocol1_13To1_13_1.java index 42d3acc7f..0be86e0c4 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_13to1_13_1/Protocol1_13To1_13_1.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_13to1_13_1/Protocol1_13To1_13_1.java @@ -35,8 +35,8 @@ import com.viaversion.viaversion.protocols.v1_12_2to1_13.packet.ServerboundPacke import com.viaversion.viaversion.protocols.v1_13to1_13_1.rewriter.EntityPacketRewriter1_13_1; import com.viaversion.viaversion.protocols.v1_13to1_13_1.rewriter.ItemPacketRewriter1_13_1; import com.viaversion.viaversion.protocols.v1_13to1_13_1.rewriter.WorldPacketRewriter1_13_1; +import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.ParticleRewriter; -import com.viaversion.viaversion.rewriter.StatisticsRewriter; import com.viaversion.viaversion.rewriter.TagRewriter; public class Protocol1_13To1_13_1 extends AbstractProtocol { @@ -46,6 +46,7 @@ public class Protocol1_13To1_13_1 extends AbstractProtocol particleRewriter = new ParticleRewriter<>(this); private final TagRewriter tagRewriter = new TagRewriter<>(this); + private final BlockRewriter blockRewriter = BlockRewriter.legacy(this); public Protocol1_13To1_13_1() { super(ClientboundPackets1_13.class, ClientboundPackets1_13.class, ServerboundPackets1_13.class, ServerboundPackets1_13.class); @@ -130,9 +131,6 @@ public class Protocol1_13To1_13_1 extends AbstractProtocol(this).register(ClientboundPackets1_13.AWARD_STATS); } @Override @@ -156,6 +154,11 @@ public class Protocol1_13To1_13_1 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + @Override public ParticleRewriter getParticleRewriter() { return particleRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_13to1_13_1/rewriter/EntityPacketRewriter1_13_1.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_13to1_13_1/rewriter/EntityPacketRewriter1_13_1.java index 7793a7b5e..922ea4f61 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_13to1_13_1/rewriter/EntityPacketRewriter1_13_1.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_13to1_13_1/rewriter/EntityPacketRewriter1_13_1.java @@ -133,7 +133,6 @@ public class EntityPacketRewriter1_13_1 extends EntityRewriter recipeRewriter = new RecipeRewriter<>(protocol) { @Override protected Type itemType() { @@ -94,8 +87,5 @@ public class ItemPacketRewriter1_13_1 extends ItemRewriter blockRewriter = BlockRewriter.legacy(protocol); - protocol.registerClientbound(ClientboundPackets1_13.LEVEL_CHUNK, wrapper -> { ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_13To1_13_1.class); Chunk chunk = wrapper.passthrough(ChunkType1_13.forEnvironment(clientWorld.getEnvironment())); - blockRewriter.handleChunk(chunk); + protocol.getBlockRewriter().handleChunk(chunk); }); - blockRewriter.registerBlockEvent(ClientboundPackets1_13.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_13.BLOCK_UPDATE); - blockRewriter.registerChunkBlocksUpdate(ClientboundPackets1_13.CHUNK_BLOCKS_UPDATE); - - protocol.registerClientbound(ClientboundPackets1_13.LEVEL_EVENT, new PacketHandlers() { + protocol.replaceClientbound(ClientboundPackets1_13.LEVEL_EVENT, new PacketHandlers() { @Override public void register() { map(Types.INT); // Effect Id diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_14_4to1_15/Protocol1_14_4To1_15.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_14_4to1_15/Protocol1_14_4To1_15.java index 370641352..ffc0dce04 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_14_4to1_15/Protocol1_14_4To1_15.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_14_4to1_15/Protocol1_14_4To1_15.java @@ -32,9 +32,8 @@ import com.viaversion.viaversion.protocols.v1_14_4to1_15.packet.ClientboundPacke import com.viaversion.viaversion.protocols.v1_14_4to1_15.rewriter.EntityPacketRewriter1_15; import com.viaversion.viaversion.protocols.v1_14_4to1_15.rewriter.ItemPacketRewriter1_15; import com.viaversion.viaversion.protocols.v1_14_4to1_15.rewriter.WorldPacketRewriter1_15; +import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.ParticleRewriter; -import com.viaversion.viaversion.rewriter.SoundRewriter; -import com.viaversion.viaversion.rewriter.StatisticsRewriter; import com.viaversion.viaversion.rewriter.TagRewriter; public class Protocol1_14_4To1_15 extends AbstractProtocol { @@ -44,6 +43,7 @@ public class Protocol1_14_4To1_15 extends AbstractProtocol particleRewriter = new ParticleRewriter<>(this); private final TagRewriter tagRewriter = new TagRewriter<>(this); + private final BlockRewriter blockRewriter = BlockRewriter.for1_14(this); public Protocol1_14_4To1_15() { super(ClientboundPackets1_14_4.class, ClientboundPackets1_15.class, ServerboundPackets1_14.class, ServerboundPackets1_14.class); @@ -55,12 +55,6 @@ public class Protocol1_14_4To1_15 extends AbstractProtocol soundRewriter = new SoundRewriter<>(this); - soundRewriter.registerSound(ClientboundPackets1_14_4.SOUND_ENTITY); // Entity Sound Effect (added somewhere in 1.14) - soundRewriter.registerSound(ClientboundPackets1_14_4.SOUND); - - new StatisticsRewriter<>(this).register(ClientboundPackets1_14_4.AWARD_STATS); - registerServerbound(ServerboundPackets1_14.EDIT_BOOK, wrapper -> itemRewriter.handleItemToServer(wrapper.user(), wrapper.passthrough(Types.ITEM1_13_2))); tagRewriter.register(ClientboundPackets1_14_4.UPDATE_TAGS, RegistryType.ENTITY); @@ -99,6 +93,11 @@ public class Protocol1_14_4To1_15 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + @Override public ParticleRewriter getParticleRewriter() { return particleRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_14_4to1_15/rewriter/EntityPacketRewriter1_15.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_14_4to1_15/rewriter/EntityPacketRewriter1_15.java index 9191904e8..5b47fbafa 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_14_4to1_15/rewriter/EntityPacketRewriter1_15.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_14_4to1_15/rewriter/EntityPacketRewriter1_15.java @@ -40,9 +40,7 @@ public class EntityPacketRewriter1_15 extends EntityRewriter(protocol).register(ClientboundPackets1_14_4.UPDATE_RECIPES); - - registerContainerClick(ServerboundPackets1_14.CONTAINER_CLICK); - registerSetCreativeModeSlot(ServerboundPackets1_14.SET_CREATIVE_MODE_SLOT); } } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_14_4to1_15/rewriter/WorldPacketRewriter1_15.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_14_4to1_15/rewriter/WorldPacketRewriter1_15.java index ef62ab11e..05fba986d 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_14_4to1_15/rewriter/WorldPacketRewriter1_15.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_14_4to1_15/rewriter/WorldPacketRewriter1_15.java @@ -23,18 +23,11 @@ import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_14; import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_15; import com.viaversion.viaversion.protocols.v1_14_3to1_14_4.packet.ClientboundPackets1_14_4; import com.viaversion.viaversion.protocols.v1_14_4to1_15.Protocol1_14_4To1_15; -import com.viaversion.viaversion.rewriter.BlockRewriter; public final class WorldPacketRewriter1_15 { public static void register(Protocol1_14_4To1_15 protocol) { - BlockRewriter blockRewriter = BlockRewriter.for1_14(protocol); - - blockRewriter.registerBlockEvent(ClientboundPackets1_14_4.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_14_4.BLOCK_UPDATE); - blockRewriter.registerChunkBlocksUpdate(ClientboundPackets1_14_4.CHUNK_BLOCKS_UPDATE); - blockRewriter.registerBlockBreakAck(ClientboundPackets1_14_4.BLOCK_BREAK_ACK); - blockRewriter.registerLevelChunk(ClientboundPackets1_14_4.LEVEL_CHUNK, ChunkType1_14.TYPE, ChunkType1_15.TYPE, (connection, chunk) -> { + protocol.getBlockRewriter().registerLevelChunk(ClientboundPackets1_14_4.LEVEL_CHUNK, ChunkType1_14.TYPE, ChunkType1_15.TYPE, (connection, chunk) -> { if (chunk.isFullChunk()) { int[] biomeData = chunk.getBiomeData(); int[] newBiomeData = new int[1024]; @@ -58,8 +51,7 @@ public final class WorldPacketRewriter1_15 { } }); - blockRewriter.registerLevelEvent(ClientboundPackets1_14_4.LEVEL_EVENT, 1010, 2001); - protocol.registerClientbound(ClientboundPackets1_14_4.LEVEL_PARTICLES, new PacketHandlers() { + protocol.replaceClientbound(ClientboundPackets1_14_4.LEVEL_PARTICLES, new PacketHandlers() { @Override public void register() { map(Types.INT); // 0 - Particle ID diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_14to1_14_1/rewriter/EntityPacketRewriter1_14_1.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_14to1_14_1/rewriter/EntityPacketRewriter1_14_1.java index 7dc0d21c7..447b6d815 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_14to1_14_1/rewriter/EntityPacketRewriter1_14_1.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_14to1_14_1/rewriter/EntityPacketRewriter1_14_1.java @@ -55,8 +55,6 @@ public class EntityPacketRewriter1_14_1 extends EntityRewriter particleRewriter = new ParticleRewriter<>(this); private final ComponentRewriter1_16 componentRewriter = new ComponentRewriter1_16(this); private final TagRewriter tagRewriter = new TagRewriter<>(this); + private final BlockRewriter blockRewriter = BlockRewriter.for1_14(this); public Protocol1_15_2To1_16() { super(ClientboundPackets1_15.class, ClientboundPackets1_16.class, ServerboundPackets1_14.class, ServerboundPackets1_16.class); @@ -79,10 +79,6 @@ public class Protocol1_15_2To1_16 extends AbstractProtocol(this).register(ClientboundPackets1_15.AWARD_STATS); - // Login Success registerClientbound(State.LOGIN, ClientboundLoginPackets.LOGIN_FINISHED, wrapper -> { // Transform string to a uuid @@ -126,7 +122,7 @@ public class Protocol1_15_2To1_16 extends AbstractProtocol soundRewriter = new SoundRewriter<>(this); - soundRewriter.registerSound(ClientboundPackets1_15.SOUND); - soundRewriter.registerSound(ClientboundPackets1_15.SOUND_ENTITY); registerServerbound(ServerboundPackets1_16.INTERACT, wrapper -> { wrapper.passthrough(Types.VAR_INT); // Entity Id @@ -258,6 +247,11 @@ public class Protocol1_15_2To1_16 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + @Override public ParticleRewriter getParticleRewriter() { return particleRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_15_2to1_16/rewriter/EntityPacketRewriter1_16.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_15_2to1_16/rewriter/EntityPacketRewriter1_16.java index 8b0cc50ac..4669aef12 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_15_2to1_16/rewriter/EntityPacketRewriter1_16.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_15_2to1_16/rewriter/EntityPacketRewriter1_16.java @@ -107,11 +107,8 @@ public class EntityPacketRewriter1_16 extends EntityRewriter(protocol).register(ClientboundPackets1_15.UPDATE_RECIPES); - registerContainerClick(ServerboundPackets1_16.CONTAINER_CLICK); - registerSetCreativeModeSlot(ServerboundPackets1_16.SET_CREATIVE_MODE_SLOT); - protocol.registerServerbound(ServerboundPackets1_16.CONTAINER_CLOSE, wrapper -> { InventoryTracker1_16 inventoryTracker = wrapper.user().get(InventoryTracker1_16.class); inventoryTracker.setInventoryOpen(false); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_15_2to1_16/rewriter/WorldPacketRewriter1_16.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_15_2to1_16/rewriter/WorldPacketRewriter1_16.java index fa97d1d18..5e7fa3b21 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_15_2to1_16/rewriter/WorldPacketRewriter1_16.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_15_2to1_16/rewriter/WorldPacketRewriter1_16.java @@ -30,7 +30,6 @@ import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_15; import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_16; import com.viaversion.viaversion.protocols.v1_14_4to1_15.packet.ClientboundPackets1_15; import com.viaversion.viaversion.protocols.v1_15_2to1_16.Protocol1_15_2To1_16; -import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.util.CompactArrayUtil; import com.viaversion.viaversion.util.Key; import com.viaversion.viaversion.util.UUIDUtil; @@ -40,13 +39,7 @@ import java.util.UUID; public class WorldPacketRewriter1_16 { public static void register(Protocol1_15_2To1_16 protocol) { - BlockRewriter blockRewriter = BlockRewriter.for1_14(protocol); - - blockRewriter.registerBlockEvent(ClientboundPackets1_15.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_15.BLOCK_UPDATE); - blockRewriter.registerChunkBlocksUpdate(ClientboundPackets1_15.CHUNK_BLOCKS_UPDATE); - blockRewriter.registerBlockBreakAck(ClientboundPackets1_15.BLOCK_BREAK_ACK); - blockRewriter.registerLevelChunk(ClientboundPackets1_15.LEVEL_CHUNK, ChunkType1_15.TYPE, ChunkType1_16.TYPE, (connection, chunk) -> { + protocol.getBlockRewriter().registerLevelChunk(ClientboundPackets1_15.LEVEL_CHUNK, ChunkType1_15.TYPE, ChunkType1_16.TYPE, (connection, chunk) -> { chunk.setIgnoreOldLightData(chunk.isFullChunk()); CompoundTag heightMaps = chunk.getHeightMap(); @@ -78,8 +71,6 @@ public class WorldPacketRewriter1_16 { CompoundTag tag = wrapper.passthrough(Types.NAMED_COMPOUND_TAG); handleBlockEntity(protocol, wrapper.user(), tag); }); - - blockRewriter.registerLevelEvent(ClientboundPackets1_15.LEVEL_EVENT, 1010, 2001); } private static void handleBlockEntity(Protocol1_15_2To1_16 protocol, UserConnection connection, CompoundTag compoundTag) { diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_1to1_16_2/Protocol1_16_1To1_16_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_1to1_16_2/Protocol1_16_1To1_16_2.java index 35bd8c032..0d0c8f13a 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_1to1_16_2/Protocol1_16_1To1_16_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_1to1_16_2/Protocol1_16_1To1_16_2.java @@ -31,9 +31,8 @@ import com.viaversion.viaversion.protocols.v1_16_1to1_16_2.packet.ServerboundPac import com.viaversion.viaversion.protocols.v1_16_1to1_16_2.rewriter.EntityPacketRewriter1_16_2; import com.viaversion.viaversion.protocols.v1_16_1to1_16_2.rewriter.ItemPacketRewriter1_16_2; import com.viaversion.viaversion.protocols.v1_16_1to1_16_2.rewriter.WorldPacketRewriter1_16_2; +import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.ParticleRewriter; -import com.viaversion.viaversion.rewriter.SoundRewriter; -import com.viaversion.viaversion.rewriter.StatisticsRewriter; import com.viaversion.viaversion.rewriter.TagRewriter; public class Protocol1_16_1To1_16_2 extends AbstractProtocol { @@ -43,6 +42,7 @@ public class Protocol1_16_1To1_16_2 extends AbstractProtocol particleRewriter = new ParticleRewriter<>(this); private final TagRewriter tagRewriter = new TagRewriter<>(this); + private final BlockRewriter blockRewriter = BlockRewriter.for1_14(this); public Protocol1_16_1To1_16_2() { super(ClientboundPackets1_16.class, ClientboundPackets1_16_2.class, ServerboundPackets1_16.class, ServerboundPackets1_16_2.class); @@ -55,13 +55,6 @@ public class Protocol1_16_1To1_16_2 extends AbstractProtocol(this).register(ClientboundPackets1_16.AWARD_STATS); - - SoundRewriter soundRewriter = new SoundRewriter<>(this); - soundRewriter.registerSound(ClientboundPackets1_16.SOUND); - soundRewriter.registerSound(ClientboundPackets1_16.SOUND_ENTITY); // Recipe book data has been split into 2 separate packets registerServerbound(ServerboundPackets1_16_2.RECIPE_BOOK_CHANGE_SETTINGS, ServerboundPackets1_16.RECIPE_BOOK_UPDATE, wrapper -> { @@ -114,6 +107,11 @@ public class Protocol1_16_1To1_16_2 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + @Override public ParticleRewriter getParticleRewriter() { return particleRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_1to1_16_2/rewriter/EntityPacketRewriter1_16_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_1to1_16_2/rewriter/EntityPacketRewriter1_16_2.java index 93e16c76e..36ce1e5a2 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_1to1_16_2/rewriter/EntityPacketRewriter1_16_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_1to1_16_2/rewriter/EntityPacketRewriter1_16_2.java @@ -35,11 +35,8 @@ public class EntityPacketRewriter1_16_2 extends EntityRewriter { wrapper.passthrough(Types.VAR_INT); wrapper.passthrough(Types.BOOLEAN); // Open @@ -54,8 +47,6 @@ public class ItemPacketRewriter1_16_2 extends ItemRewriter(protocol).register(ClientboundPackets1_16.UPDATE_RECIPES); - registerContainerClick(ServerboundPackets1_16_2.CONTAINER_CLICK); - registerSetCreativeModeSlot(ServerboundPackets1_16_2.SET_CREATIVE_MODE_SLOT); protocol.registerServerbound(ServerboundPackets1_16_2.EDIT_BOOK, wrapper -> handleItemToServer(wrapper.user(), wrapper.passthrough(Types.ITEM1_13_2))); } } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_1to1_16_2/rewriter/WorldPacketRewriter1_16_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_1to1_16_2/rewriter/WorldPacketRewriter1_16_2.java index 8f1f9230e..f8fcf7db4 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_1to1_16_2/rewriter/WorldPacketRewriter1_16_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_1to1_16_2/rewriter/WorldPacketRewriter1_16_2.java @@ -35,12 +35,7 @@ public class WorldPacketRewriter1_16_2 { private static final BlockChangeRecord[] EMPTY_RECORDS = new BlockChangeRecord[0]; public static void register(Protocol1_16_1To1_16_2 protocol) { - BlockRewriter blockRewriter = BlockRewriter.for1_14(protocol); - - blockRewriter.registerBlockEvent(ClientboundPackets1_16.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_16.BLOCK_UPDATE); - blockRewriter.registerBlockBreakAck(ClientboundPackets1_16.BLOCK_BREAK_ACK); - blockRewriter.registerLevelChunk(ClientboundPackets1_16.LEVEL_CHUNK, ChunkType1_16.TYPE, ChunkType1_16_2.TYPE); + protocol.getBlockRewriter().registerLevelChunk(ClientboundPackets1_16.LEVEL_CHUNK, ChunkType1_16.TYPE, ChunkType1_16_2.TYPE); protocol.registerClientbound(ClientboundPackets1_16.CHUNK_BLOCKS_UPDATE, ClientboundPackets1_16_2.SECTION_BLOCKS_UPDATE, wrapper -> { wrapper.cancel(); @@ -78,7 +73,5 @@ public class WorldPacketRewriter1_16_2 { newPacket.send(Protocol1_16_1To1_16_2.class); } }); - - blockRewriter.registerLevelEvent(ClientboundPackets1_16.LEVEL_EVENT, 1010, 2001); } } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_4to1_17/Protocol1_16_4To1_17.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_4to1_17/Protocol1_16_4To1_17.java index f37a687ce..08574802d 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_4to1_17/Protocol1_16_4To1_17.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_4to1_17/Protocol1_16_4To1_17.java @@ -38,11 +38,9 @@ import com.viaversion.viaversion.protocols.v1_16_4to1_17.rewriter.ComponentRewri import com.viaversion.viaversion.protocols.v1_16_4to1_17.rewriter.EntityPacketRewriter1_17; import com.viaversion.viaversion.protocols.v1_16_4to1_17.rewriter.ItemPacketRewriter1_17; import com.viaversion.viaversion.protocols.v1_16_4to1_17.rewriter.WorldPacketRewriter1_17; +import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.ParticleRewriter; -import com.viaversion.viaversion.rewriter.SoundRewriter; -import com.viaversion.viaversion.rewriter.StatisticsRewriter; import com.viaversion.viaversion.rewriter.TagRewriter; -import org.checkerframework.checker.nullness.qual.Nullable; public final class Protocol1_16_4To1_17 extends AbstractProtocol { @@ -52,6 +50,7 @@ public final class Protocol1_16_4To1_17 extends AbstractProtocol particleRewriter = new ParticleRewriter<>(this); private final ComponentRewriter1_17 componentRewriter = new ComponentRewriter1_17(this); private final TagRewriter tagRewriter = new TagRewriter<>(this); + private final BlockRewriter blockRewriter = BlockRewriter.for1_14(this); public Protocol1_16_4To1_17() { super(ClientboundPackets1_16_2.class, ClientboundPackets1_17.class, ServerboundPackets1_16_2.class, ServerboundPackets1_17.class); @@ -85,23 +84,6 @@ public final class Protocol1_16_4To1_17 extends AbstractProtocol(this).register(ClientboundPackets1_16_2.AWARD_STATS); - - componentRewriter.registerComponentPacket(ClientboundPackets1_16_2.CHAT); - componentRewriter.registerBossEvent(ClientboundPackets1_16_2.BOSS_EVENT); - componentRewriter.registerComponentPacket(ClientboundPackets1_16_2.DISCONNECT); - componentRewriter.registerTabList(ClientboundPackets1_16_2.TAB_LIST); - componentRewriter.registerOpenScreen1_14(ClientboundPackets1_16_2.OPEN_SCREEN); - componentRewriter.registerSetPlayerTeam1_13(ClientboundPackets1_16_2.SET_PLAYER_TEAM); - componentRewriter.registerSetObjective(ClientboundPackets1_16_2.SET_OBJECTIVE); - componentRewriter.registerPing(); - - SoundRewriter soundRewriter = new SoundRewriter<>(this); - soundRewriter.registerSound(ClientboundPackets1_16_2.SOUND); - soundRewriter.registerSound(ClientboundPackets1_16_2.SOUND_ENTITY); - - particleRewriter.registerLevelParticles1_13(ClientboundPackets1_16_2.LEVEL_PARTICLES, Types.DOUBLE); - registerClientbound(ClientboundPackets1_16_2.RESOURCE_PACK, wrapper -> { wrapper.passthrough(Types.STRING); wrapper.passthrough(Types.STRING); @@ -227,13 +209,18 @@ public final class Protocol1_16_4To1_17 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + @Override public ParticleRewriter getParticleRewriter() { return particleRewriter; } @Override - public @Nullable ComponentRewriter1_17 getComponentRewriter() { + public ComponentRewriter1_17 getComponentRewriter() { return componentRewriter; } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_4to1_17/rewriter/EntityPacketRewriter1_17.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_4to1_17/rewriter/EntityPacketRewriter1_17.java index 131eed8b6..91946350b 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_4to1_17/rewriter/EntityPacketRewriter1_17.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_4to1_17/rewriter/EntityPacketRewriter1_17.java @@ -43,8 +43,6 @@ public final class EntityPacketRewriter1_17 extends EntityRewriter(protocol).register(ClientboundPackets1_16_2.UPDATE_RECIPES); - registerSetCreativeModeSlot(ServerboundPackets1_17.SET_CREATIVE_MODE_SLOT); - protocol.registerServerbound(ServerboundPackets1_17.EDIT_BOOK, wrapper -> handleItemToServer(wrapper.user(), wrapper.passthrough(Types.ITEM1_13_2))); - protocol.registerServerbound(ServerboundPackets1_17.CONTAINER_CLICK, new PacketHandlers() { + protocol.replaceServerbound(ServerboundPackets1_17.CONTAINER_CLICK, new PacketHandlers() { @Override public void register() { map(Types.BYTE); // Window Id diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_4to1_17/rewriter/WorldPacketRewriter1_17.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_4to1_17/rewriter/WorldPacketRewriter1_17.java index 22d5e2901..d19c29080 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_4to1_17/rewriter/WorldPacketRewriter1_17.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_16_4to1_17/rewriter/WorldPacketRewriter1_17.java @@ -32,7 +32,6 @@ import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_17; import com.viaversion.viaversion.protocols.v1_16_1to1_16_2.packet.ClientboundPackets1_16_2; import com.viaversion.viaversion.protocols.v1_16_4to1_17.Protocol1_16_4To1_17; import com.viaversion.viaversion.protocols.v1_16_4to1_17.packet.ClientboundPackets1_17; -import com.viaversion.viaversion.rewriter.BlockRewriter; import java.util.ArrayList; import java.util.BitSet; import java.util.List; @@ -40,13 +39,6 @@ import java.util.List; public final class WorldPacketRewriter1_17 { public static void register(Protocol1_16_4To1_17 protocol) { - BlockRewriter blockRewriter = BlockRewriter.for1_14(protocol); - - blockRewriter.registerBlockEvent(ClientboundPackets1_16_2.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_16_2.BLOCK_UPDATE); - blockRewriter.registerSectionBlocksUpdate(ClientboundPackets1_16_2.SECTION_BLOCKS_UPDATE); - blockRewriter.registerBlockBreakAck(ClientboundPackets1_16_2.BLOCK_BREAK_ACK); - protocol.registerClientbound(ClientboundPackets1_16_2.SET_BORDER, null, wrapper -> { // Border packet actions have been split into individual packets (the content hasn't changed) int type = wrapper.read(Types.VAR_INT); @@ -126,10 +118,8 @@ public final class WorldPacketRewriter1_17 { chunk.setChunkMask(BitSet.valueOf(new long[]{chunk.getBitmask()})); // Rewrite block state ids - blockRewriter.handleChunk(chunk); + protocol.getBlockRewriter().handleChunk(chunk); }); - - blockRewriter.registerLevelEvent(ClientboundPackets1_16_2.LEVEL_EVENT, 1010, 2001); } private static void writeMultiBlockChangePacket(PacketWrapper wrapper, Chunk chunk) { diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_17_1to1_18/Protocol1_17_1To1_18.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_17_1to1_18/Protocol1_17_1To1_18.java index bcbfd73f4..1d62f7de1 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_17_1to1_18/Protocol1_17_1To1_18.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_17_1to1_18/Protocol1_17_1To1_18.java @@ -37,8 +37,6 @@ import com.viaversion.viaversion.protocols.v1_17_1to1_18.rewriter.WorldPacketRew import com.viaversion.viaversion.protocols.v1_17_1to1_18.storage.ChunkLightStorage; import com.viaversion.viaversion.protocols.v1_17to1_17_1.packet.ClientboundPackets1_17_1; import com.viaversion.viaversion.rewriter.ParticleRewriter; -import com.viaversion.viaversion.rewriter.SoundRewriter; -import com.viaversion.viaversion.rewriter.StatisticsRewriter; import com.viaversion.viaversion.rewriter.TagRewriter; import com.viaversion.viaversion.util.ProtocolLogger; @@ -62,27 +60,6 @@ public final class Protocol1_17_1To1_18 extends AbstractProtocol soundRewriter = new SoundRewriter<>(this); - soundRewriter.registerSound(ClientboundPackets1_17_1.SOUND); - soundRewriter.registerSound(ClientboundPackets1_17_1.SOUND_ENTITY); - - tagRewriter.registerGeneric(ClientboundPackets1_17_1.UPDATE_TAGS); - - new StatisticsRewriter<>(this).register(ClientboundPackets1_17_1.AWARD_STATS); - - componentRewriter.registerComponentPacket(ClientboundPackets1_17_1.CHAT); - componentRewriter.registerComponentPacket(ClientboundPackets1_17_1.SET_ACTION_BAR_TEXT); - componentRewriter.registerComponentPacket(ClientboundPackets1_17_1.SET_TITLE_TEXT); - componentRewriter.registerComponentPacket(ClientboundPackets1_17_1.SET_SUBTITLE_TEXT); - componentRewriter.registerBossEvent(ClientboundPackets1_17_1.BOSS_EVENT); - componentRewriter.registerComponentPacket(ClientboundPackets1_17_1.DISCONNECT); - componentRewriter.registerTabList(ClientboundPackets1_17_1.TAB_LIST); - componentRewriter.registerOpenScreen1_14(ClientboundPackets1_17_1.OPEN_SCREEN); - componentRewriter.registerPlayerCombatKill(ClientboundPackets1_17_1.PLAYER_COMBAT_KILL); - componentRewriter.registerSetPlayerTeam1_13(ClientboundPackets1_17_1.SET_PLAYER_TEAM); - componentRewriter.registerSetObjective(ClientboundPackets1_17_1.SET_OBJECTIVE); - componentRewriter.registerPing(); - registerServerbound(ServerboundPackets1_17.CLIENT_INFORMATION, new PacketHandlers() { @Override public void register() { diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_17_1to1_18/rewriter/ItemPacketRewriter1_18.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_17_1to1_18/rewriter/ItemPacketRewriter1_18.java index 21deaff6a..bff5e84eb 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_17_1to1_18/rewriter/ItemPacketRewriter1_18.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_17_1to1_18/rewriter/ItemPacketRewriter1_18.java @@ -34,30 +34,7 @@ public final class ItemPacketRewriter1_18 extends ItemRewriter { - int id = wrapper.get(Types.INT, 0); - int data = wrapper.get(Types.INT, 1); - if (id == 1010) { // Play record - wrapper.set(Types.INT, 1, protocol.getMappingData().getNewItemId(data)); - } - }); - } - }); - - protocol.registerClientbound(ClientboundPackets1_17_1.LEVEL_PARTICLES, new PacketHandlers() { + protocol.replaceClientbound(ClientboundPackets1_17_1.LEVEL_PARTICLES, new PacketHandlers() { @Override public void register() { map(Types.INT); // Particle id @@ -98,8 +75,5 @@ public final class ItemPacketRewriter1_18 extends ItemRewriter(protocol).register(ClientboundPackets1_17_1.UPDATE_RECIPES); - - registerContainerClick1_17_1(ServerboundPackets1_17.CONTAINER_CLICK); - registerSetCreativeModeSlot(ServerboundPackets1_17.SET_CREATIVE_MODE_SLOT); } } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_17to1_17_1/rewriter/ItemPacketRewriter1_17_1.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_17to1_17_1/rewriter/ItemPacketRewriter1_17_1.java index bb37120b6..a342458a2 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_17to1_17_1/rewriter/ItemPacketRewriter1_17_1.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_17to1_17_1/rewriter/ItemPacketRewriter1_17_1.java @@ -42,22 +42,16 @@ public final class ItemPacketRewriter1_17_1 extends ItemRewriter(protocol).register(ClientboundPackets1_17.UPDATE_RECIPES); - registerSetCreativeModeSlot(ServerboundPackets1_17.SET_CREATIVE_MODE_SLOT); - - protocol.registerClientbound(ClientboundPackets1_17.CONTAINER_SET_SLOT, wrapper -> { + protocol.replaceClientbound(ClientboundPackets1_17.CONTAINER_SET_SLOT, wrapper -> { wrapper.passthrough(Types.BYTE); // Container id wrapper.write(Types.VAR_INT, 0); // Add arbitrary state id wrapper.passthrough(Types.SHORT); // Slot id passthroughClientboundItem(wrapper); }); - protocol.registerClientbound(ClientboundPackets1_17.CONTAINER_SET_CONTENT, wrapper -> { + protocol.replaceClientbound(ClientboundPackets1_17.CONTAINER_SET_CONTENT, wrapper -> { wrapper.passthrough(Types.UNSIGNED_BYTE); // Container id wrapper.write(Types.VAR_INT, 0); // Add arbitrary state id // Length encoded as var int now @@ -70,7 +64,7 @@ public final class ItemPacketRewriter1_17_1 extends ItemRewriter { + protocol.replaceServerbound(ServerboundPackets1_17.CONTAINER_CLICK, wrapper -> { wrapper.passthrough(Types.BYTE); // Container id wrapper.read(Types.VAR_INT); // Remove state id wrapper.passthrough(Types.SHORT); // Slot diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_18_2to1_19/Protocol1_18_2To1_19.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_18_2to1_19/Protocol1_18_2To1_19.java index 8689767f8..fbad84b07 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_18_2to1_19/Protocol1_18_2To1_19.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_18_2to1_19/Protocol1_18_2To1_19.java @@ -28,6 +28,7 @@ import com.viaversion.viaversion.api.protocol.packet.State; import com.viaversion.viaversion.api.protocol.remapper.PacketHandler; import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers; import com.viaversion.viaversion.api.type.Types; +import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_18; import com.viaversion.viaversion.api.type.types.misc.ParticleType; import com.viaversion.viaversion.api.type.types.version.Types1_19; import com.viaversion.viaversion.data.entity.EntityTrackerBase; @@ -46,10 +47,10 @@ import com.viaversion.viaversion.protocols.v1_18_2to1_19.rewriter.WorldPacketRew import com.viaversion.viaversion.protocols.v1_18_2to1_19.storage.DimensionRegistryStorage; import com.viaversion.viaversion.protocols.v1_18_2to1_19.storage.NonceStorage1_19; import com.viaversion.viaversion.protocols.v1_18_2to1_19.storage.SequenceStorage; +import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.CommandRewriter; import com.viaversion.viaversion.rewriter.ParticleRewriter; import com.viaversion.viaversion.rewriter.SoundRewriter; -import com.viaversion.viaversion.rewriter.StatisticsRewriter; import com.viaversion.viaversion.rewriter.TagRewriter; import com.viaversion.viaversion.util.CipherUtil; import com.viaversion.viaversion.util.ComponentUtil; @@ -63,6 +64,7 @@ public final class Protocol1_18_2To1_19 extends AbstractProtocol particleRewriter = new ParticleRewriter<>(this); private final ComponentRewriter1_19 componentRewriter = new ComponentRewriter1_19(this); private final TagRewriter tagRewriter = new TagRewriter<>(this); + private final BlockRewriter blockRewriter = BlockRewriter.for1_18(this, ChunkType1_18::new); public Protocol1_18_2To1_19() { super(ClientboundPackets1_18.class, ClientboundPackets1_19.class, ServerboundPackets1_17.class, ServerboundPackets1_19.class); @@ -70,16 +72,13 @@ public final class Protocol1_18_2To1_19 extends AbstractProtocol soundRewriter = new SoundRewriter<>(this); - registerClientbound(ClientboundPackets1_18.SOUND, new PacketHandlers() { + replaceClientbound(ClientboundPackets1_18.SOUND, new PacketHandlers() { @Override public void register() { map(Types.VAR_INT); // Sound id @@ -93,7 +92,7 @@ public final class Protocol1_18_2To1_19 extends AbstractProtocol(this).register(ClientboundPackets1_18.AWARD_STATS); - final PacketHandler singleNullTextComponentMapper = wrapper -> wrapper.write(Types.COMPONENT, mapTextComponentIfNull(wrapper.user(), wrapper.read(Types.COMPONENT))); registerClientbound(ClientboundPackets1_18.SET_TITLE_TEXT, singleNullTextComponentMapper); registerClientbound(ClientboundPackets1_18.SET_SUBTITLE_TEXT, singleNullTextComponentMapper); @@ -146,13 +143,6 @@ public final class Protocol1_18_2To1_19 extends AbstractProtocol { final int action = wrapper.passthrough(Types.VAR_INT); final int entries = wrapper.passthrough(Types.VAR_INT); @@ -392,6 +382,11 @@ public final class Protocol1_18_2To1_19 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + @Override public ParticleRewriter getParticleRewriter() { return particleRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_18_2to1_19/rewriter/EntityPacketRewriter1_19.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_18_2to1_19/rewriter/EntityPacketRewriter1_19.java index e90dc5427..88c3846b2 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_18_2to1_19/rewriter/EntityPacketRewriter1_19.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_18_2to1_19/rewriter/EntityPacketRewriter1_19.java @@ -60,9 +60,8 @@ public final class EntityPacketRewriter1_19 extends EntityRewriter blockRewriter = BlockRewriter.for1_14(protocol); - blockRewriter.registerBlockEvent(ClientboundPackets1_18.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_18.BLOCK_UPDATE); - blockRewriter.registerSectionBlocksUpdate(ClientboundPackets1_18.SECTION_BLOCKS_UPDATE); - blockRewriter.registerLevelEvent(ClientboundPackets1_18.LEVEL_EVENT, 1010, 2001); - blockRewriter.registerLevelChunk1_19(ClientboundPackets1_18.LEVEL_CHUNK_WITH_LIGHT, ChunkType1_18::new); - protocol.cancelClientbound(ClientboundPackets1_18.BLOCK_BREAK_ACK); protocol.registerServerbound(ServerboundPackets1_19.SET_BEACON, wrapper -> { diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_1to1_19_3/Protocol1_19_1To1_19_3.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_1to1_19_3/Protocol1_19_1To1_19_3.java index 1a551b70d..44980f72f 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_1to1_19_3/Protocol1_19_1To1_19_3.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_1to1_19_3/Protocol1_19_1To1_19_3.java @@ -38,6 +38,7 @@ import com.viaversion.viaversion.api.protocol.packet.State; import com.viaversion.viaversion.api.protocol.remapper.PacketHandler; import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers; import com.viaversion.viaversion.api.type.Types; +import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_18; import com.viaversion.viaversion.api.type.types.misc.ParticleType; import com.viaversion.viaversion.api.type.types.version.Types1_19_3; import com.viaversion.viaversion.data.entity.EntityTrackerBase; @@ -52,9 +53,9 @@ import com.viaversion.viaversion.protocols.v1_19_1to1_19_3.storage.NonceStorage1 import com.viaversion.viaversion.protocols.v1_19_1to1_19_3.storage.ReceivedMessagesStorage; import com.viaversion.viaversion.protocols.v1_19to1_19_1.packet.ClientboundPackets1_19_1; import com.viaversion.viaversion.protocols.v1_19to1_19_1.packet.ServerboundPackets1_19_1; +import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.CommandRewriter; import com.viaversion.viaversion.rewriter.ParticleRewriter; -import com.viaversion.viaversion.rewriter.StatisticsRewriter; import com.viaversion.viaversion.rewriter.TagRewriter; import com.viaversion.viaversion.util.ComponentUtil; import com.viaversion.viaversion.util.Pair; @@ -73,6 +74,7 @@ public final class Protocol1_19_1To1_19_3 extends AbstractProtocol particleRewriter = new ParticleRewriter<>(this); private final ComponentRewriter1_19_3 componentRewriter = new ComponentRewriter1_19_3(this); private final TagRewriter tagRewriter = new TagRewriter<>(this); + private final BlockRewriter blockRewriter = BlockRewriter.for1_18(this, ChunkType1_18::new); public Protocol1_19_1To1_19_3() { super(ClientboundPackets1_19_1.class, ClientboundPackets1_19_3.class, ServerboundPackets1_19_1.class, ServerboundPackets1_19_3.class); @@ -80,12 +82,7 @@ public final class Protocol1_19_1To1_19_3 extends AbstractProtocol { @@ -98,28 +95,13 @@ public final class Protocol1_19_1To1_19_3 extends AbstractProtocol { final String soundIdentifier = wrapper.read(Types.STRING); wrapper.write(Types.SOUND_EVENT, Holder.of(new SoundEvent(soundIdentifier, null))); }); - new StatisticsRewriter<>(this).register(ClientboundPackets1_19_1.AWARD_STATS); - - componentRewriter.registerComponentPacket(ClientboundPackets1_19_1.SYSTEM_CHAT); - componentRewriter.registerComponentPacket(ClientboundPackets1_19_1.SET_ACTION_BAR_TEXT); - componentRewriter.registerComponentPacket(ClientboundPackets1_19_1.SET_TITLE_TEXT); - componentRewriter.registerComponentPacket(ClientboundPackets1_19_1.SET_SUBTITLE_TEXT); - componentRewriter.registerBossEvent(ClientboundPackets1_19_1.BOSS_EVENT); - componentRewriter.registerComponentPacket(ClientboundPackets1_19_1.DISCONNECT); - componentRewriter.registerTabList(ClientboundPackets1_19_1.TAB_LIST); - componentRewriter.registerOpenScreen1_14(ClientboundPackets1_19_1.OPEN_SCREEN); - componentRewriter.registerPlayerCombatKill(ClientboundPackets1_19_1.PLAYER_COMBAT_KILL); - componentRewriter.registerSetPlayerTeam1_13(ClientboundPackets1_19_1.SET_PLAYER_TEAM); - componentRewriter.registerSetObjective(ClientboundPackets1_19_1.SET_OBJECTIVE); - componentRewriter.registerPing(); - final CommandRewriter commandRewriter = new CommandRewriter<>(this) { @Override public void handleArgument(final PacketWrapper wrapper, final String argumentType) { @@ -131,9 +113,9 @@ public final class Protocol1_19_1To1_19_3 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + @Override public ParticleRewriter getParticleRewriter() { return particleRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_1to1_19_3/rewriter/EntityPacketRewriter1_19_3.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_1to1_19_3/rewriter/EntityPacketRewriter1_19_3.java index 7b7475825..54aa02456 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_1to1_19_3/rewriter/EntityPacketRewriter1_19_3.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_1to1_19_3/rewriter/EntityPacketRewriter1_19_3.java @@ -41,11 +41,9 @@ public final class EntityPacketRewriter1_19_3 extends EntityRewriter blockRewriter = BlockRewriter.for1_14(protocol); - blockRewriter.registerBlockEvent(ClientboundPackets1_19_1.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_19_1.BLOCK_UPDATE); - blockRewriter.registerSectionBlocksUpdate(ClientboundPackets1_19_1.SECTION_BLOCKS_UPDATE); - blockRewriter.registerLevelEvent(ClientboundPackets1_19_1.LEVEL_EVENT, 1010, 2001); - blockRewriter.registerLevelChunk1_19(ClientboundPackets1_19_1.LEVEL_CHUNK_WITH_LIGHT, ChunkType1_18::new); - blockRewriter.registerBlockEntityData(ClientboundPackets1_19_1.BLOCK_ENTITY_DATA); - - registerCooldown(ClientboundPackets1_19_1.COOLDOWN); - registerSetContent1_17_1(ClientboundPackets1_19_1.CONTAINER_SET_CONTENT); - registerSetSlot1_17_1(ClientboundPackets1_19_1.CONTAINER_SET_SLOT); - registerAdvancements(ClientboundPackets1_19_1.UPDATE_ADVANCEMENTS); - registerSetEquipment(ClientboundPackets1_19_1.SET_EQUIPMENT); - registerContainerClick1_17_1(ServerboundPackets1_19_3.CONTAINER_CLICK); - registerMerchantOffers1_19(ClientboundPackets1_19_1.MERCHANT_OFFERS); - registerSetCreativeModeSlot(ServerboundPackets1_19_3.SET_CREATIVE_MODE_SLOT); - registerContainerSetData(ClientboundPackets1_19_1.CONTAINER_SET_DATA); - final RecipeRewriter recipeRewriter = new RecipeRewriter<>(protocol); protocol.registerClientbound(ClientboundPackets1_19_1.UPDATE_RECIPES, wrapper -> { final int size = wrapper.passthrough(Types.VAR_INT); @@ -99,9 +79,12 @@ public final class ItemPacketRewriter1_19_3 extends ItemRewriter wrapper.write(Types.VAR_INT, MISC_CRAFTING_BOOK_CATEGORY); default -> recipeRewriter.handleRecipeType(wrapper, type); } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_3to1_19_4/Protocol1_19_3To1_19_4.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_3to1_19_4/Protocol1_19_3To1_19_4.java index 0ce5094f8..09581c856 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_3to1_19_4/Protocol1_19_3To1_19_4.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_3to1_19_4/Protocol1_19_3To1_19_4.java @@ -23,6 +23,7 @@ import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_19_4; import com.viaversion.viaversion.api.protocol.AbstractProtocol; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.type.Types; +import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_18; import com.viaversion.viaversion.api.type.types.misc.ParticleType; import com.viaversion.viaversion.api.type.types.version.Types1_19_4; import com.viaversion.viaversion.data.entity.EntityTrackerBase; @@ -34,10 +35,9 @@ import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.packet.ServerboundPac import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.rewriter.EntityPacketRewriter1_19_4; import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.rewriter.ItemPacketRewriter1_19_4; import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.storage.PlayerVehicleTracker; +import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.CommandRewriter; import com.viaversion.viaversion.rewriter.ParticleRewriter; -import com.viaversion.viaversion.rewriter.SoundRewriter; -import com.viaversion.viaversion.rewriter.StatisticsRewriter; import com.viaversion.viaversion.rewriter.TagRewriter; import com.viaversion.viaversion.util.ComponentUtil; import java.nio.charset.StandardCharsets; @@ -50,6 +50,7 @@ public final class Protocol1_19_3To1_19_4 extends AbstractProtocol particleRewriter = new ParticleRewriter<>(this); private final TagRewriter tagRewriter = new TagRewriter<>(this); + private final BlockRewriter blockRewriter = BlockRewriter.for1_18(this, ChunkType1_18::new); public Protocol1_19_3To1_19_4() { super(ClientboundPackets1_19_3.class, ClientboundPackets1_19_4.class, ServerboundPackets1_19_3.class, ServerboundPackets1_19_4.class); @@ -59,16 +60,7 @@ public final class Protocol1_19_3To1_19_4 extends AbstractProtocol(this).register(ClientboundPackets1_19_3.AWARD_STATS); - - final SoundRewriter soundRewriter = new SoundRewriter<>(this); - soundRewriter.registerSound1_19_3(ClientboundPackets1_19_3.SOUND_ENTITY); - soundRewriter.registerSound1_19_3(ClientboundPackets1_19_3.SOUND); - - new CommandRewriter<>(this) { + final CommandRewriter commandRewriter = new CommandRewriter<>(this) { @Override public void handleArgument(final PacketWrapper wrapper, final String argumentType) { if (argumentType.equals("minecraft:time")) { @@ -78,7 +70,8 @@ public final class Protocol1_19_3To1_19_4 extends AbstractProtocol { JsonElement element = wrapper.read(Types.OPTIONAL_COMPONENT); @@ -136,6 +129,11 @@ public final class Protocol1_19_3To1_19_4 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + @Override public ParticleRewriter getParticleRewriter() { return particleRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_3to1_19_4/rewriter/EntityPacketRewriter1_19_4.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_3to1_19_4/rewriter/EntityPacketRewriter1_19_4.java index b8e8ec999..f50540475 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_3to1_19_4/rewriter/EntityPacketRewriter1_19_4.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_3to1_19_4/rewriter/EntityPacketRewriter1_19_4.java @@ -206,8 +206,6 @@ public final class EntityPacketRewriter1_19_4 extends EntityRewriter { @@ -36,14 +34,7 @@ public final class ItemPacketRewriter1_19_4 extends ItemRewriter blockRewriter = BlockRewriter.for1_14(protocol); - blockRewriter.registerBlockEvent(ClientboundPackets1_19_3.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_19_3.BLOCK_UPDATE); - blockRewriter.registerSectionBlocksUpdate(ClientboundPackets1_19_3.SECTION_BLOCKS_UPDATE); - blockRewriter.registerLevelChunk1_19(ClientboundPackets1_19_3.LEVEL_CHUNK_WITH_LIGHT, ChunkType1_18::new); - blockRewriter.registerBlockEntityData(ClientboundPackets1_19_3.BLOCK_ENTITY_DATA); - - protocol.registerClientbound(ClientboundPackets1_19_3.LEVEL_EVENT, new PacketHandlers() { + protocol.replaceClientbound(ClientboundPackets1_19_3.LEVEL_EVENT, new PacketHandlers() { @Override public void register() { map(Types.INT); // Effect Id @@ -83,16 +74,6 @@ public final class ItemPacketRewriter1_19_4 extends ItemRewriter(protocol) { @Override public void handleCraftingShaped(final PacketWrapper wrapper) { diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_4to1_20/Protocol1_19_4To1_20.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_4to1_20/Protocol1_19_4To1_20.java index 98afb79cc..65dc5adea 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_4to1_20/Protocol1_19_4To1_20.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_4to1_20/Protocol1_19_4To1_20.java @@ -29,11 +29,11 @@ import com.viaversion.viaversion.api.type.types.version.Types1_20; import com.viaversion.viaversion.data.entity.EntityTrackerBase; import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.packet.ClientboundPackets1_19_4; import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.packet.ServerboundPackets1_19_4; +import com.viaversion.viaversion.protocols.v1_19_4to1_20.rewriter.BlockPacketRewriter1_20; import com.viaversion.viaversion.protocols.v1_19_4to1_20.rewriter.EntityPacketRewriter1_20; import com.viaversion.viaversion.protocols.v1_19_4to1_20.rewriter.ItemPacketRewriter1_20; +import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.ParticleRewriter; -import com.viaversion.viaversion.rewriter.SoundRewriter; -import com.viaversion.viaversion.rewriter.StatisticsRewriter; import com.viaversion.viaversion.rewriter.TagRewriter; public final class Protocol1_19_4To1_20 extends AbstractProtocol { @@ -43,6 +43,7 @@ public final class Protocol1_19_4To1_20 extends AbstractProtocol particleRewriter = new ParticleRewriter<>(this); private final TagRewriter tagRewriter = new TagRewriter<>(this); + private final BlockRewriter blockRewriter = new BlockPacketRewriter1_20(this); public Protocol1_19_4To1_20() { super(ClientboundPackets1_19_4.class, ClientboundPackets1_19_4.class, ServerboundPackets1_19_4.class, ServerboundPackets1_19_4.class); @@ -52,15 +53,6 @@ public final class Protocol1_19_4To1_20 extends AbstractProtocol soundRewriter = new SoundRewriter<>(this); - soundRewriter.registerSound1_19_3(ClientboundPackets1_19_4.SOUND); - soundRewriter.registerSound1_19_3(ClientboundPackets1_19_4.SOUND_ENTITY); - - new StatisticsRewriter<>(this).register(ClientboundPackets1_19_4.AWARD_STATS); - registerClientbound(ClientboundPackets1_19_4.PLAYER_COMBAT_END, wrapper -> { wrapper.passthrough(Types.VAR_INT); // Duration wrapper.read(Types.INT); // Killer ID @@ -111,6 +103,11 @@ public final class Protocol1_19_4To1_20 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + @Override public ParticleRewriter getParticleRewriter() { return particleRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_4to1_20/rewriter/BlockPacketRewriter1_20.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_4to1_20/rewriter/BlockPacketRewriter1_20.java index c6c91f152..e2c19cf3b 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_4to1_20/rewriter/BlockPacketRewriter1_20.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_4to1_20/rewriter/BlockPacketRewriter1_20.java @@ -24,6 +24,7 @@ import com.viaversion.nbt.tag.Tag; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.minecraft.blockentity.BlockEntity; import com.viaversion.viaversion.api.type.Types; +import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_18; import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.packet.ClientboundPackets1_19_4; import com.viaversion.viaversion.protocols.v1_19_4to1_20.Protocol1_19_4To1_20; import com.viaversion.viaversion.rewriter.BlockRewriter; @@ -32,7 +33,7 @@ import com.viaversion.viaversion.util.ComponentUtil; public final class BlockPacketRewriter1_20 extends BlockRewriter { public BlockPacketRewriter1_20(final Protocol1_19_4To1_20 protocol) { - super(protocol, Types.BLOCK_POSITION1_14, Types.NAMED_COMPOUND_TAG); + super(protocol, Types.BLOCK_POSITION1_14, Types.NAMED_COMPOUND_TAG, ChunkType1_18::new, null); } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_4to1_20/rewriter/EntityPacketRewriter1_20.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_4to1_20/rewriter/EntityPacketRewriter1_20.java index 4b7e0dc8d..0f979a67d 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_4to1_20/rewriter/EntityPacketRewriter1_20.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_19_4to1_20/rewriter/EntityPacketRewriter1_20.java @@ -46,9 +46,7 @@ public final class EntityPacketRewriter1_20 extends EntityRewriter blockRewriter = new BlockPacketRewriter1_20(protocol); - blockRewriter.registerBlockEvent(ClientboundPackets1_19_4.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_19_4.BLOCK_UPDATE); - blockRewriter.registerLevelEvent(ClientboundPackets1_19_4.LEVEL_EVENT, 1010, 2001); - blockRewriter.registerBlockEntityData(ClientboundPackets1_19_4.BLOCK_ENTITY_DATA); - - registerOpenScreen(ClientboundPackets1_19_4.OPEN_SCREEN); - registerCooldown(ClientboundPackets1_19_4.COOLDOWN); - registerSetContent1_17_1(ClientboundPackets1_19_4.CONTAINER_SET_CONTENT); - registerSetSlot1_17_1(ClientboundPackets1_19_4.CONTAINER_SET_SLOT); - registerSetEquipment(ClientboundPackets1_19_4.SET_EQUIPMENT); - registerContainerClick1_17_1(ServerboundPackets1_19_4.CONTAINER_CLICK); - registerMerchantOffers1_19(ClientboundPackets1_19_4.MERCHANT_OFFERS); - registerSetCreativeModeSlot(ServerboundPackets1_19_4.SET_CREATIVE_MODE_SLOT); - registerContainerSetData(ClientboundPackets1_19_4.CONTAINER_SET_DATA); - - protocol.registerClientbound(ClientboundPackets1_19_4.UPDATE_ADVANCEMENTS, wrapper -> { + protocol.replaceClientbound(ClientboundPackets1_19_4.UPDATE_ADVANCEMENTS, wrapper -> { wrapper.passthrough(Types.BOOLEAN); // Reset/clear int size = wrapper.passthrough(Types.VAR_INT); // Mapping size for (int i = 0; i < size; i++) { @@ -99,12 +81,12 @@ public final class ItemPacketRewriter1_20 extends ItemRewriter { - final Chunk chunk = blockRewriter.handleChunk1_19(wrapper, ChunkType1_18::new); - blockRewriter.handleBlockEntities(chunk, wrapper.user()); + final Chunk chunk = protocol.getBlockRewriter().handleChunk1_18(wrapper); + protocol.getBlockRewriter().handleBlockEntities(chunk, wrapper.user()); }); read(Types.BOOLEAN); // Trust edges } @@ -116,7 +98,7 @@ public final class ItemPacketRewriter1_20 extends ItemRewriter particleRewriter = new ParticleRewriter<>(this); private final EntityPacketRewriter1_20_3 entityRewriter = new EntityPacketRewriter1_20_3(this); private final TagRewriter tagRewriter = new TagRewriter<>(this); + private final BlockRewriter blockRewriter = BlockRewriter.for1_20_2(this, ChunkType1_20_2::new); public Protocol1_20_2To1_20_3() { super(ClientboundPacket1_20_2.class, ClientboundPacket1_20_3.class, ServerboundPacket1_20_2.class, ServerboundPacket1_20_3.class); @@ -76,16 +76,6 @@ public final class Protocol1_20_2To1_20_3 extends AbstractProtocol soundRewriter = new SoundRewriter<>(this); - soundRewriter.registerSound1_19_3(ClientboundPackets1_20_2.SOUND); - soundRewriter.registerSound1_19_3(ClientboundPackets1_20_2.SOUND_ENTITY); - - new StatisticsRewriter<>(this).register(ClientboundPackets1_20_2.AWARD_STATS); - new CommandRewriter1_19_4<>(this).registerDeclareCommands1_19(ClientboundPackets1_20_2.COMMANDS); - registerClientbound(ClientboundPackets1_20_2.SET_SCORE, wrapper -> { wrapper.passthrough(Types.STRING); // Owner @@ -132,7 +122,7 @@ public final class Protocol1_20_2To1_20_3 extends AbstractProtocol { + replaceClientbound(ClientboundPackets1_20_2.UPDATE_ADVANCEMENTS, wrapper -> { wrapper.passthrough(Types.BOOLEAN); // Reset/clear final int size = wrapper.passthrough(Types.VAR_INT); // Mapping size for (int i = 0; i < size; i++) { @@ -250,7 +240,7 @@ public final class Protocol1_20_2To1_20_3 extends AbstractProtocol { + replaceClientbound(ClientboundPackets1_20_2.OPEN_SCREEN, wrapper -> { wrapper.passthrough(Types.VAR_INT); // Container id final int containerTypeId = wrapper.read(Types.VAR_INT); @@ -377,6 +367,11 @@ public final class Protocol1_20_2To1_20_3 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + @Override public ParticleRewriter getParticleRewriter() { return particleRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_2to1_20_3/rewriter/BlockItemPacketRewriter1_20_3.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_2to1_20_3/rewriter/BlockItemPacketRewriter1_20_3.java index 6e728a44d..211e4bc69 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_2to1_20_3/rewriter/BlockItemPacketRewriter1_20_3.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_2to1_20_3/rewriter/BlockItemPacketRewriter1_20_3.java @@ -29,15 +29,12 @@ import com.viaversion.viaversion.api.minecraft.item.Item; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers; import com.viaversion.viaversion.api.type.Types; -import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2; import com.viaversion.viaversion.api.type.types.version.Types1_20_3; import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.Protocol1_20_2To1_20_3; import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.packet.ServerboundPacket1_20_3; -import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.packet.ServerboundPackets1_20_3; import com.viaversion.viaversion.protocols.v1_20to1_20_2.packet.ClientboundPacket1_20_2; import com.viaversion.viaversion.protocols.v1_20to1_20_2.packet.ClientboundPackets1_20_2; import com.viaversion.viaversion.protocols.v1_20to1_20_2.rewriter.RecipeRewriter1_20_2; -import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.ItemRewriter; import com.viaversion.viaversion.util.ComponentUtil; import com.viaversion.viaversion.util.Key; @@ -54,24 +51,7 @@ public final class BlockItemPacketRewriter1_20_3 extends ItemRewriter blockRewriter = BlockRewriter.for1_20_2(protocol); - blockRewriter.registerBlockEvent(ClientboundPackets1_20_2.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_20_2.BLOCK_UPDATE); - blockRewriter.registerSectionBlocksUpdate1_20(ClientboundPackets1_20_2.SECTION_BLOCKS_UPDATE); - blockRewriter.registerLevelEvent(ClientboundPackets1_20_2.LEVEL_EVENT, 1010, 2001); - blockRewriter.registerLevelChunk1_19(ClientboundPackets1_20_2.LEVEL_CHUNK_WITH_LIGHT, ChunkType1_20_2::new); - blockRewriter.registerBlockEntityData(ClientboundPackets1_20_2.BLOCK_ENTITY_DATA); - - registerCooldown(ClientboundPackets1_20_2.COOLDOWN); - registerSetContent1_17_1(ClientboundPackets1_20_2.CONTAINER_SET_CONTENT); - registerSetSlot1_17_1(ClientboundPackets1_20_2.CONTAINER_SET_SLOT); - registerSetEquipment(ClientboundPackets1_20_2.SET_EQUIPMENT); - registerContainerClick1_17_1(ServerboundPackets1_20_3.CONTAINER_CLICK); - registerMerchantOffers1_19(ClientboundPackets1_20_2.MERCHANT_OFFERS); - registerSetCreativeModeSlot(ServerboundPackets1_20_3.SET_CREATIVE_MODE_SLOT); - registerContainerSetData(ClientboundPackets1_20_2.CONTAINER_SET_DATA); - - protocol.registerClientbound(ClientboundPackets1_20_2.LEVEL_PARTICLES, new PacketHandlers() { + protocol.replaceClientbound(ClientboundPackets1_20_2.LEVEL_PARTICLES, new PacketHandlers() { @Override public void register() { map(Types.VAR_INT); // 0 - Particle ID diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_2to1_20_3/rewriter/EntityPacketRewriter1_20_3.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_2to1_20_3/rewriter/EntityPacketRewriter1_20_3.java index 8a562fbca..0a7263da4 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_2to1_20_3/rewriter/EntityPacketRewriter1_20_3.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_2to1_20_3/rewriter/EntityPacketRewriter1_20_3.java @@ -44,9 +44,7 @@ public final class EntityPacketRewriter1_20_3 extends EntityRewriter tagRewriter = new TagRewriter<>(this); private final ComponentRewriter1_20_5 componentRewriter = new ComponentRewriter1_20_5<>(this, VersionedTypes.V1_20_5.structuredData); + private final BlockRewriter blockRewriter = BlockRewriter.for1_20_2(this, ChunkType1_20_2::new); public Protocol1_20_3To1_20_5() { super(ClientboundPacket1_20_3.class, ClientboundPacket1_20_5.class, ServerboundPacket1_20_3.class, ServerboundPacket1_20_5.class); @@ -89,34 +89,6 @@ public final class Protocol1_20_3To1_20_5 extends AbstractProtocol soundRewriter = new SoundRewriter<>(this); - soundRewriter.registerSound1_19_3(ClientboundPackets1_20_3.SOUND); - soundRewriter.registerSound1_19_3(ClientboundPackets1_20_3.SOUND_ENTITY); - - new StatisticsRewriter<>(this).register(ClientboundPackets1_20_3.AWARD_STATS); - - componentRewriter.registerComponentPacket(ClientboundPackets1_20_3.SYSTEM_CHAT); - componentRewriter.registerComponentPacket(ClientboundPackets1_20_3.DISGUISED_CHAT); - componentRewriter.registerPlayerChat(ClientboundPackets1_20_3.PLAYER_CHAT, Types.VAR_INT); - componentRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_20_3.PLAYER_COMBAT_KILL); - - // People add item hovers to all sorts of weird places... - componentRewriter.registerOpenScreen1_14(ClientboundPackets1_20_3.OPEN_SCREEN); - componentRewriter.registerComponentPacket(ClientboundPackets1_20_3.SET_ACTION_BAR_TEXT); - componentRewriter.registerComponentPacket(ClientboundPackets1_20_3.SET_TITLE_TEXT); - componentRewriter.registerComponentPacket(ClientboundPackets1_20_3.SET_SUBTITLE_TEXT); - componentRewriter.registerBossEvent(ClientboundPackets1_20_3.BOSS_EVENT); - componentRewriter.registerComponentPacket(ClientboundPackets1_20_3.DISCONNECT); - componentRewriter.registerComponentPacket(ClientboundConfigurationPackets1_20_3.DISCONNECT); - componentRewriter.registerTabList(ClientboundPackets1_20_3.TAB_LIST); - componentRewriter.registerPlayerInfoUpdate1_20_3(ClientboundPackets1_20_3.PLAYER_INFO_UPDATE); - componentRewriter.registerSetObjective(ClientboundPackets1_20_3.SET_OBJECTIVE); - componentRewriter.registerSetScore1_20_3(ClientboundPackets1_20_3.SET_SCORE); - componentRewriter.registerPing(); - registerClientbound(State.LOGIN, ClientboundLoginPackets.HELLO, wrapper -> { wrapper.passthrough(Types.STRING); // Server ID wrapper.passthrough(Types.BYTE_ARRAY_PRIMITIVE); // Public key @@ -124,8 +96,8 @@ public final class Protocol1_20_3To1_20_5 extends AbstractProtocol { - wrapper.passthrough(Types.TRUSTED_TAG); // MOTD + replaceClientbound(ClientboundPackets1_20_3.SERVER_DATA, wrapper -> { + componentRewriter.passthroughAndProcess(wrapper); // MOTD wrapper.passthrough(Types.OPTIONAL_BYTE_ARRAY_PRIMITIVE); // Icon // Moved to join game @@ -220,8 +192,6 @@ public final class Protocol1_20_3To1_20_5 extends AbstractProtocol wrapper.user().put(new AcknowledgedMessagesStorage())); - new CommandRewriter1_19_4<>(this).registerDeclareCommands1_19(ClientboundPackets1_20_3.COMMANDS); - registerClientbound(State.LOGIN, ClientboundLoginPackets.LOGIN_FINISHED, wrapper -> { wrapper.passthrough(Types.UUID); // UUID wrapper.passthrough(Types.STRING); // Name @@ -229,7 +199,7 @@ public final class Protocol1_20_3To1_20_5 extends AbstractProtocol { + replaceClientbound(ClientboundPackets1_20_3.SET_PLAYER_TEAM, wrapper -> { final ScoreboardTeamStorage storage = wrapper.user().get(ScoreboardTeamStorage.class); final String teamName = wrapper.passthrough(Types.STRING); @@ -377,6 +347,11 @@ public final class Protocol1_20_3To1_20_5 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + @Override public ParticleRewriter1_20_5 getParticleRewriter() { return particleRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/BlockItemPacketRewriter1_20_5.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/BlockItemPacketRewriter1_20_5.java index a0568517b..320efda7b 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/BlockItemPacketRewriter1_20_5.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/BlockItemPacketRewriter1_20_5.java @@ -78,7 +78,6 @@ import com.viaversion.viaversion.api.minecraft.item.data.WritableBook; import com.viaversion.viaversion.api.minecraft.item.data.WrittenBook; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import com.viaversion.viaversion.api.type.Types; -import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2; import com.viaversion.viaversion.api.type.types.version.Types1_20_3; import com.viaversion.viaversion.api.type.types.version.VersionedTypes; import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.packet.ClientboundPacket1_20_3; @@ -99,7 +98,6 @@ import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundPac import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.storage.ArmorTrimStorage; import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.storage.BannerPatternStorage; import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.storage.TagKeys; -import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.ItemRewriter; import com.viaversion.viaversion.util.ComponentUtil; import com.viaversion.viaversion.util.Either; @@ -136,13 +134,8 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter blockRewriter = BlockRewriter.for1_20_2(protocol); - blockRewriter.registerBlockEvent(ClientboundPackets1_20_3.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_20_3.BLOCK_UPDATE); - blockRewriter.registerSectionBlocksUpdate1_20(ClientboundPackets1_20_3.SECTION_BLOCKS_UPDATE); - blockRewriter.registerLevelEvent(ClientboundPackets1_20_3.LEVEL_EVENT, 1010, 2001); - protocol.registerClientbound(ClientboundPackets1_20_3.LEVEL_CHUNK_WITH_LIGHT, wrapper -> { - final Chunk chunk = blockRewriter.handleChunk1_19(wrapper, ChunkType1_20_2::new); + protocol.replaceClientbound(ClientboundPackets1_20_3.LEVEL_CHUNK_WITH_LIGHT, wrapper -> { + final Chunk chunk = protocol.getBlockRewriter().handleChunk1_18(wrapper); for (int i = 0; i < chunk.blockEntities().size(); i++) { final BlockEntity blockEntity = chunk.blockEntities().get(i); if (isUnknownBlockEntity(blockEntity.typeId())) { @@ -154,7 +147,7 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter { + protocol.replaceClientbound(ClientboundPackets1_20_3.BLOCK_ENTITY_DATA, wrapper -> { wrapper.passthrough(Types.BLOCK_POSITION1_14); // Position final int typeId = wrapper.passthrough(Types.VAR_INT); @@ -173,13 +166,6 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter { final byte containerId = wrapper.read(Types.VAR_INT).byteValue(); final byte buttonId = wrapper.read(Types.VAR_INT).byteValue(); @@ -187,7 +173,7 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter { + protocol.replaceClientbound(ClientboundPackets1_20_3.UPDATE_ADVANCEMENTS, wrapper -> { wrapper.passthrough(Types.BOOLEAN); // Reset/clear int size = wrapper.passthrough(Types.VAR_INT); // Mapping size for (int i = 0; i < size; i++) { @@ -220,7 +206,7 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter { + protocol.replaceClientbound(ClientboundPackets1_20_3.LEVEL_PARTICLES, wrapper -> { final int particleId = wrapper.read(Types.VAR_INT); wrapper.passthrough(Types.BOOLEAN); // Long Distance @@ -317,7 +303,7 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter { + protocol.replaceClientbound(ClientboundPackets1_20_3.MERCHANT_OFFERS, wrapper -> { wrapper.passthrough(Types.VAR_INT); // Container id final int size = wrapper.passthrough(Types.VAR_INT); for (int i = 0; i < size; i++) { diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/EntityPacketRewriter1_20_5.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/EntityPacketRewriter1_20_5.java index cb54151be..ba55ea49e 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/EntityPacketRewriter1_20_5.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/EntityPacketRewriter1_20_5.java @@ -74,11 +74,9 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter { + protocol.replaceClientbound(ClientboundPackets1_20_3.SET_EQUIPMENT, wrapper -> { final int entityId = wrapper.passthrough(Types.VAR_INT); // Entity id final EntityType type = tracker(wrapper.user()).entityType(entityId); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_5to1_21/Protocol1_20_5To1_21.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_5to1_21/Protocol1_20_5To1_21.java index 55845aef0..e1c1b5491 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_5to1_21/Protocol1_20_5To1_21.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_5to1_21/Protocol1_20_5To1_21.java @@ -23,14 +23,15 @@ import com.viaversion.viaversion.api.minecraft.RegistryType; import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey; import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_20_5; import com.viaversion.viaversion.api.minecraft.item.data.ChatType; -import com.viaversion.viaversion.api.protocol.AbstractProtocol; import com.viaversion.viaversion.api.protocol.packet.provider.PacketTypesProvider; import com.viaversion.viaversion.api.protocol.packet.provider.SimplePacketTypesProvider; import com.viaversion.viaversion.api.type.Types; +import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2; import com.viaversion.viaversion.api.type.types.misc.ParticleType; import com.viaversion.viaversion.api.type.types.version.VersionedTypes; import com.viaversion.viaversion.api.type.types.version.VersionedTypesHolder; import com.viaversion.viaversion.data.entity.EntityTrackerBase; +import com.viaversion.viaversion.api.protocol.AbstractProtocol; import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ClientboundConfigurationPackets1_20_5; import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ClientboundPacket1_20_5; import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ClientboundPackets1_20_5; @@ -47,9 +48,8 @@ import com.viaversion.viaversion.protocols.v1_20_5to1_21.rewriter.ComponentRewri import com.viaversion.viaversion.protocols.v1_20_5to1_21.rewriter.EntityPacketRewriter1_21; import com.viaversion.viaversion.protocols.v1_20_5to1_21.storage.EfficiencyAttributeStorage; import com.viaversion.viaversion.protocols.v1_20_5to1_21.storage.PlayerPositionStorage; +import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.ParticleRewriter; -import com.viaversion.viaversion.rewriter.SoundRewriter; -import com.viaversion.viaversion.rewriter.StatisticsRewriter; import com.viaversion.viaversion.rewriter.TagRewriter; import com.viaversion.viaversion.rewriter.text.JsonNBTComponentRewriter; import com.viaversion.viaversion.util.Key; @@ -67,6 +67,7 @@ public final class Protocol1_20_5To1_21 extends AbstractProtocol particleRewriter = new ParticleRewriter<>(this); private final TagRewriter tagRewriter = new TagRewriter<>(this); private final JsonNBTComponentRewriter componentRewriter = new ComponentRewriter1_21(this); + private final BlockRewriter blockRewriter = BlockRewriter.for1_20_2(this, ChunkType1_20_2::new); public Protocol1_20_5To1_21() { super(ClientboundPacket1_20_5.class, ClientboundPacket1_21.class, ServerboundPacket1_20_5.class, ServerboundPacket1_20_5.class); @@ -76,36 +77,14 @@ public final class Protocol1_20_5To1_21 extends AbstractProtocol soundRewriter = new SoundRewriter<>(this); - soundRewriter.registerSound1_19_3(ClientboundPackets1_20_5.SOUND); - soundRewriter.registerSound1_19_3(ClientboundPackets1_20_5.SOUND_ENTITY); - - new StatisticsRewriter<>(this).register(ClientboundPackets1_20_5.AWARD_STATS); - - componentRewriter.registerOpenScreen1_14(ClientboundPackets1_20_5.OPEN_SCREEN); - componentRewriter.registerComponentPacket(ClientboundPackets1_20_5.SET_ACTION_BAR_TEXT); - componentRewriter.registerComponentPacket(ClientboundPackets1_20_5.SET_TITLE_TEXT); - componentRewriter.registerComponentPacket(ClientboundPackets1_20_5.SET_SUBTITLE_TEXT); - componentRewriter.registerBossEvent(ClientboundPackets1_20_5.BOSS_EVENT); - componentRewriter.registerComponentPacket(ClientboundPackets1_20_5.DISCONNECT); - componentRewriter.registerTabList(ClientboundPackets1_20_5.TAB_LIST); - componentRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_20_5.PLAYER_COMBAT_KILL); - componentRewriter.registerComponentPacket(ClientboundPackets1_20_5.SYSTEM_CHAT); - - particleRewriter.registerLevelParticles1_20_5(ClientboundPackets1_20_5.LEVEL_PARTICLES); - particleRewriter.registerExplode1_20_5(ClientboundPackets1_20_5.EXPLODE); // Rewrites the included sound and particles - - registerClientbound(ClientboundPackets1_20_5.DISGUISED_CHAT, wrapper -> { + replaceClientbound(ClientboundPackets1_20_5.DISGUISED_CHAT, wrapper -> { componentRewriter.processTag(wrapper.user(), wrapper.passthrough(Types.TRUSTED_TAG)); // Message // Holder time final int chatType = wrapper.read(Types.VAR_INT); wrapper.write(ChatType.TYPE, Holder.of(chatType)); }); - registerClientbound(ClientboundPackets1_20_5.PLAYER_CHAT, wrapper -> { + replaceClientbound(ClientboundPackets1_20_5.PLAYER_CHAT, wrapper -> { wrapper.passthrough(Types.UUID); // Sender wrapper.passthrough(Types.VAR_INT); // Index wrapper.passthrough(Types.OPTIONAL_SIGNATURE_BYTES); // Signature @@ -254,6 +233,11 @@ public final class Protocol1_20_5To1_21 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + @Override public ParticleRewriter getParticleRewriter() { return particleRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_5to1_21/rewriter/BlockItemPacketRewriter1_21.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_5to1_21/rewriter/BlockItemPacketRewriter1_21.java index 0f4c865ed..af090d9e4 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_5to1_21/rewriter/BlockItemPacketRewriter1_21.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_5to1_21/rewriter/BlockItemPacketRewriter1_21.java @@ -62,16 +62,7 @@ public final class BlockItemPacketRewriter1_21 extends StructuredItemRewriter blockRewriter = BlockRewriter.for1_20_2(protocol); - blockRewriter.registerBlockEvent(ClientboundPackets1_20_5.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_20_5.BLOCK_UPDATE); - blockRewriter.registerSectionBlocksUpdate1_20(ClientboundPackets1_20_5.SECTION_BLOCKS_UPDATE); - blockRewriter.registerLevelChunk1_19(ClientboundPackets1_20_5.LEVEL_CHUNK_WITH_LIGHT, ChunkType1_20_2::new); - blockRewriter.registerBlockEntityData(ClientboundPackets1_20_5.BLOCK_ENTITY_DATA); - - registerCooldown(ClientboundPackets1_20_5.COOLDOWN); - registerSetContent1_17_1(ClientboundPackets1_20_5.CONTAINER_SET_CONTENT); - protocol.registerClientbound(ClientboundPackets1_20_5.CONTAINER_SET_SLOT, wrapper -> { + protocol.replaceClientbound(ClientboundPackets1_20_5.CONTAINER_SET_SLOT, wrapper -> { final byte containerId = wrapper.passthrough(Types.BYTE); wrapper.passthrough(Types.VAR_INT); // State id final short slotId = wrapper.passthrough(Types.SHORT); @@ -94,11 +85,6 @@ public final class BlockItemPacketRewriter1_21 extends StructuredItemRewriter { wrapper.passthrough(Types.UNSIGNED_BYTE); // Container id @@ -108,7 +94,7 @@ public final class BlockItemPacketRewriter1_21 extends StructuredItemRewriter { + protocol.replaceClientbound(ClientboundPackets1_20_5.LEVEL_EVENT, wrapper -> { final int id = wrapper.passthrough(Types.INT); wrapper.passthrough(Types.BLOCK_POSITION1_14); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_5to1_21/rewriter/EntityPacketRewriter1_21.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_5to1_21/rewriter/EntityPacketRewriter1_21.java index 964a7a870..1f37c1c37 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_5to1_21/rewriter/EntityPacketRewriter1_21.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_5to1_21/rewriter/EntityPacketRewriter1_21.java @@ -52,10 +52,6 @@ public final class EntityPacketRewriter1_21 extends EntityRewriter { wrapper.user().get(EfficiencyAttributeStorage.class).onLoginSent(wrapper.get(Types.INT, 0), wrapper.user()); }); - protocol.registerClientbound(ClientboundPackets1_20_5.RESPAWN, wrapper -> { - final int dimensionId = wrapper.passthrough(Types.VAR_INT); - final String world = wrapper.passthrough(Types.STRING); - trackWorldDataByKey1_20_5(wrapper.user(), dimensionId, world); // Tracks world height and name for chunk data and entity (un)tracking - + protocol.appendClientbound(ClientboundPackets1_20_5.RESPAWN, wrapper -> { // Resend attribute modifiers from items wrapper.user().get(EfficiencyAttributeStorage.class).onRespawn(wrapper.user()); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20to1_20_2/Protocol1_20To1_20_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20to1_20_2/Protocol1_20To1_20_2.java index c9b397d05..e94a69176 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20to1_20_2/Protocol1_20To1_20_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20to1_20_2/Protocol1_20To1_20_2.java @@ -25,8 +25,6 @@ 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; @@ -35,8 +33,6 @@ import com.viaversion.viaversion.api.protocol.packet.State; import com.viaversion.viaversion.api.protocol.remapper.PacketHandler; import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; -import com.viaversion.viaversion.api.rewriter.EntityRewriter; -import com.viaversion.viaversion.api.rewriter.ItemRewriter; import com.viaversion.viaversion.api.type.Types; import com.viaversion.viaversion.data.entity.EntityTrackerBase; import com.viaversion.viaversion.exception.CancelException; @@ -50,17 +46,16 @@ import com.viaversion.viaversion.protocols.v1_20to1_20_2.packet.ClientboundPacke import com.viaversion.viaversion.protocols.v1_20to1_20_2.packet.ServerboundConfigurationPackets1_20_2; import com.viaversion.viaversion.protocols.v1_20to1_20_2.packet.ServerboundPackets1_20_2; import com.viaversion.viaversion.protocols.v1_20to1_20_2.rewriter.BlockItemPacketRewriter1_20_2; +import com.viaversion.viaversion.protocols.v1_20to1_20_2.rewriter.BlockRewriter1_20_2; import com.viaversion.viaversion.protocols.v1_20to1_20_2.rewriter.EntityPacketRewriter1_20_2; import com.viaversion.viaversion.protocols.v1_20to1_20_2.storage.ConfigurationState; import com.viaversion.viaversion.protocols.v1_20to1_20_2.storage.ConfigurationState.BridgePhase; import com.viaversion.viaversion.protocols.v1_20to1_20_2.storage.LastResourcePack; import com.viaversion.viaversion.protocols.v1_20to1_20_2.storage.LastTags; +import com.viaversion.viaversion.rewriter.BlockRewriter; 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; @@ -71,6 +66,7 @@ public final class Protocol1_20To1_20_2 extends AbstractProtocol particleRewriter = new ParticleRewriter<>(this); private final TagRewriter tagRewriter = new TagRewriter<>(this); + private final BlockRewriter blockRewriter = new BlockRewriter1_20_2(this); public Protocol1_20To1_20_2() { super(ClientboundPackets1_19_4.class, ClientboundPackets1_20_2.class, ServerboundPackets1_19_4.class, ServerboundPackets1_20_2.class); @@ -81,12 +77,6 @@ public final class Protocol1_20To1_20_2 extends AbstractProtocol soundRewriter = new SoundRewriter<>(this); - soundRewriter.registerSound1_19_3(ClientboundPackets1_19_4.SOUND); - soundRewriter.registerSound1_19_3(ClientboundPackets1_19_4.SOUND_ENTITY); - - particleRewriter.registerLevelParticles1_19(ClientboundPackets1_19_4.LEVEL_PARTICLES); - registerClientbound(ClientboundPackets1_19_4.CUSTOM_PAYLOAD, new PacketHandlers() { @Override protected void register() { @@ -123,7 +113,7 @@ public final class Protocol1_20To1_20_2 extends AbstractProtocol { + replaceClientbound(ClientboundPackets1_19_4.UPDATE_TAGS, wrapper -> { tagRewriter.handleGeneric(wrapper); wrapper.resetReader(); wrapper.user().put(new LastTags(wrapper)); @@ -407,15 +397,20 @@ public final class Protocol1_20To1_20_2 extends AbstractProtocol getEntityRewriter() { + public EntityPacketRewriter1_20_2 getEntityRewriter() { return entityPacketRewriter; } @Override - public ItemRewriter getItemRewriter() { + public BlockItemPacketRewriter1_20_2 getItemRewriter() { return itemPacketRewriter; } + @Override + public BlockRewriter getBlockRewriter() { + return blockRewriter; + } + @Override public ParticleRewriter getParticleRewriter() { return particleRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20to1_20_2/rewriter/BlockItemPacketRewriter1_20_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20to1_20_2/rewriter/BlockItemPacketRewriter1_20_2.java index ec53d3461..365b89aec 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20to1_20_2/rewriter/BlockItemPacketRewriter1_20_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20to1_20_2/rewriter/BlockItemPacketRewriter1_20_2.java @@ -23,27 +23,19 @@ import com.viaversion.nbt.tag.NumberTag; import com.viaversion.nbt.tag.StringTag; import com.viaversion.nbt.tag.Tag; import com.viaversion.viaversion.api.connection.UserConnection; -import com.viaversion.viaversion.api.data.entity.EntityTracker; +import com.viaversion.viaversion.api.minecraft.BlockPosition; import com.viaversion.viaversion.api.minecraft.ChunkPosition; import com.viaversion.viaversion.api.minecraft.blockentity.BlockEntity; -import com.viaversion.viaversion.api.minecraft.chunks.Chunk; -import com.viaversion.viaversion.api.minecraft.chunks.ChunkSection; -import com.viaversion.viaversion.api.minecraft.chunks.DataPalette; -import com.viaversion.viaversion.api.minecraft.chunks.PaletteType; +import com.viaversion.viaversion.api.minecraft.blockentity.BlockEntityImpl; import com.viaversion.viaversion.api.minecraft.item.Item; -import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers; import com.viaversion.viaversion.api.type.Type; import com.viaversion.viaversion.api.type.Types; -import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_18; -import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2; import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.packet.ClientboundPackets1_19_4; import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.rewriter.RecipeRewriter1_19_4; import com.viaversion.viaversion.protocols.v1_20to1_20_2.Protocol1_20To1_20_2; import com.viaversion.viaversion.protocols.v1_20to1_20_2.data.PotionEffects1_20_2; import com.viaversion.viaversion.protocols.v1_20to1_20_2.packet.ServerboundPackets1_20_2; -import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.ItemRewriter; -import com.viaversion.viaversion.util.MathUtil; import org.checkerframework.checker.nullness.qual.Nullable; public final class BlockItemPacketRewriter1_20_2 extends ItemRewriter { @@ -54,18 +46,6 @@ public final class BlockItemPacketRewriter1_20_2 extends ItemRewriter blockRewriter = BlockRewriter.for1_14(protocol); - blockRewriter.registerBlockEvent(ClientboundPackets1_19_4.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_19_4.BLOCK_UPDATE); - blockRewriter.registerSectionBlocksUpdate1_20(ClientboundPackets1_19_4.SECTION_BLOCKS_UPDATE); - blockRewriter.registerLevelEvent(ClientboundPackets1_19_4.LEVEL_EVENT, 1010, 2001); - - registerSetContent1_17_1(ClientboundPackets1_19_4.CONTAINER_SET_CONTENT); - registerSetSlot1_17_1(ClientboundPackets1_19_4.CONTAINER_SET_SLOT); - registerContainerClick1_17_1(ServerboundPackets1_20_2.CONTAINER_CLICK); - registerMerchantOffers1_19(ClientboundPackets1_19_4.MERCHANT_OFFERS); - registerSetCreativeModeSlot(ServerboundPackets1_20_2.SET_CREATIVE_MODE_SLOT); - protocol.registerServerbound(ServerboundPackets1_20_2.SET_BEACON, wrapper -> { // Effects start at 1 before 1.20.2 if (wrapper.passthrough(Types.BOOLEAN)) { // Primary effect @@ -87,38 +67,17 @@ public final class BlockItemPacketRewriter1_20_2 extends ItemRewriter { - wrapper.passthrough(Types.BLOCK_POSITION1_14); // Position - wrapper.passthrough(Types.VAR_INT); // Type - wrapper.write(Types.TRUSTED_COMPOUND_TAG, handleBlockEntity(wrapper.read(Types.NAMED_COMPOUND_TAG))); + protocol.replaceClientbound(ClientboundPackets1_19_4.BLOCK_ENTITY_DATA, wrapper -> { + final BlockPosition position = wrapper.passthrough(Types.BLOCK_POSITION1_14); + final int typeId = wrapper.passthrough(Types.VAR_INT); + + final CompoundTag tag = wrapper.read(Types.NAMED_COMPOUND_TAG); + final BlockEntity blockEntity = new BlockEntityImpl(BlockEntity.pack(position.x(), position.z()), (short) position.y(), typeId, tag); + protocol.getBlockRewriter().handleBlockEntity(wrapper.user(), blockEntity); + wrapper.write(Types.TRUSTED_COMPOUND_TAG, blockEntity.tag()); }); - protocol.registerClientbound(ClientboundPackets1_19_4.LEVEL_CHUNK_WITH_LIGHT, wrapper -> { - final EntityTracker tracker = protocol.getEntityRewriter().tracker(wrapper.user()); - final Type chunkType = new ChunkType1_18(tracker.currentWorldSectionHeight(), - MathUtil.ceilLog2(protocol.getMappingData().getBlockStateMappings().size()), - MathUtil.ceilLog2(tracker.biomesSent())); - final Chunk chunk = wrapper.read(chunkType); - - final Type newChunkType = new ChunkType1_20_2(tracker.currentWorldSectionHeight(), - MathUtil.ceilLog2(protocol.getMappingData().getBlockStateMappings().mappedSize()), - MathUtil.ceilLog2(tracker.biomesSent())); - wrapper.write(newChunkType, chunk); - - for (final ChunkSection section : chunk.getSections()) { - final DataPalette blockPalette = section.palette(PaletteType.BLOCKS); - for (int i = 0; i < blockPalette.size(); i++) { - final int id = blockPalette.idByIndex(i); - blockPalette.setIdByIndex(i, protocol.getMappingData().getNewBlockStateId(id)); - } - } - - for (final BlockEntity blockEntity : chunk.blockEntities()) { - handleBlockEntity(blockEntity.tag()); - } - }); - - protocol.registerClientbound(ClientboundPackets1_19_4.UPDATE_ADVANCEMENTS, wrapper -> { + protocol.replaceClientbound(ClientboundPackets1_19_4.UPDATE_ADVANCEMENTS, wrapper -> { wrapper.passthrough(Types.BOOLEAN); // Reset/clear final int size = wrapper.passthrough(Types.VAR_INT); // Mapping size for (int i = 0; i < size; i++) { @@ -150,19 +109,6 @@ public final class BlockItemPacketRewriter1_20_2 extends ItemRewriter { - byte slot; - do { - slot = wrapper.passthrough(Types.BYTE); - wrapper.write(Types.ITEM1_20_2, handleItemToClient(wrapper.user(), wrapper.read(Types.ITEM1_13_2))); - } while ((slot & 0xFFFFFF80) != 0); - }); - } - }); new RecipeRewriter1_19_4<>(protocol) { @Override @@ -266,21 +212,4 @@ public final class BlockItemPacketRewriter1_20_2 extends ItemRewriter. + */ +package com.viaversion.viaversion.protocols.v1_20to1_20_2.rewriter; + +import com.viaversion.nbt.tag.CompoundTag; +import com.viaversion.nbt.tag.NumberTag; +import com.viaversion.nbt.tag.StringTag; +import com.viaversion.nbt.tag.Tag; +import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.minecraft.blockentity.BlockEntity; +import com.viaversion.viaversion.api.protocol.Protocol; +import com.viaversion.viaversion.api.type.Types; +import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_18; +import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2; +import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.packet.ClientboundPackets1_19_4; +import com.viaversion.viaversion.protocols.v1_20to1_20_2.data.PotionEffects1_20_2; +import com.viaversion.viaversion.rewriter.BlockRewriter; + +public final class BlockRewriter1_20_2 extends BlockRewriter { + + public BlockRewriter1_20_2(final Protocol protocol) { + super(protocol, Types.BLOCK_POSITION1_14, Types.NAMED_COMPOUND_TAG, ChunkType1_18::new, ChunkType1_20_2::new); + } + + @Override + public void handleBlockEntity(final UserConnection connection, final BlockEntity blockEntity) { + final CompoundTag tag = blockEntity.tag(); + final Tag primaryEffect = tag.remove("Primary"); + if (primaryEffect instanceof NumberTag && ((NumberTag) primaryEffect).asInt() != 0) { + tag.put("primary_effect", new StringTag(PotionEffects1_20_2.idToKeyOrLuck(((NumberTag) primaryEffect).asInt() - 1))); + } + + final Tag secondaryEffect = tag.remove("Secondary"); + if (secondaryEffect instanceof NumberTag && ((NumberTag) secondaryEffect).asInt() != 0) { + tag.put("secondary_effect", new StringTag(PotionEffects1_20_2.idToKeyOrLuck(((NumberTag) secondaryEffect).asInt() - 1))); + } + } +} diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20to1_20_2/rewriter/EntityPacketRewriter1_20_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20to1_20_2/rewriter/EntityPacketRewriter1_20_2.java index 31381bb92..de7d69886 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20to1_20_2/rewriter/EntityPacketRewriter1_20_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20to1_20_2/rewriter/EntityPacketRewriter1_20_2.java @@ -39,9 +39,7 @@ public final class EntityPacketRewriter1_20_2 extends EntityRewriter { wrapper.passthrough(Types.VAR_INT); // Entity id diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_11to26_1/Protocol1_21_11To26_1.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_11to26_1/Protocol1_21_11To26_1.java index 8ded6186c..8b0a93f84 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_11to26_1/Protocol1_21_11To26_1.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_11to26_1/Protocol1_21_11To26_1.java @@ -34,6 +34,8 @@ import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.protocol.packet.provider.PacketTypesProvider; import com.viaversion.viaversion.api.protocol.packet.provider.SimplePacketTypesProvider; import com.viaversion.viaversion.api.type.Types; +import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_21_5; +import com.viaversion.viaversion.api.type.types.chunk.ChunkType26_1; import com.viaversion.viaversion.api.type.types.misc.ParticleType; import com.viaversion.viaversion.api.type.types.version.Types1_20_5; import com.viaversion.viaversion.api.type.types.version.VersionedTypes; @@ -48,18 +50,19 @@ import com.viaversion.viaversion.protocols.v1_21_11to26_1.rewriter.BlockItemPack import com.viaversion.viaversion.protocols.v1_21_11to26_1.rewriter.ComponentRewriter26_1; import com.viaversion.viaversion.protocols.v1_21_11to26_1.rewriter.EntityPacketRewriter26_1; import com.viaversion.viaversion.protocols.v1_21_11to26_1.storage.TagsSent; +import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.RecipeDisplayRewriter1_21_5; import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ServerboundPackets1_21_6; import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ClientboundConfigurationPackets1_21_9; import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ServerboundConfigurationPackets1_21_9; import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ServerboundPacket1_21_9; import com.viaversion.viaversion.protocols.v1_21_9to1_21_11.packet.ClientboundPacket1_21_11; import com.viaversion.viaversion.protocols.v1_21_9to1_21_11.packet.ClientboundPackets1_21_11; -import com.viaversion.viaversion.rewriter.AttributeRewriter; +import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.ParticleRewriter; +import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter; import com.viaversion.viaversion.rewriter.RegistryDataRewriter; -import com.viaversion.viaversion.rewriter.SoundRewriter; -import com.viaversion.viaversion.rewriter.StatisticsRewriter; import com.viaversion.viaversion.rewriter.TagRewriter; +import com.viaversion.viaversion.rewriter.block.BlockRewriter1_21_5; import com.viaversion.viaversion.rewriter.text.NBTComponentRewriter; import com.viaversion.viaversion.util.Key; import java.util.Map; @@ -75,6 +78,8 @@ public final class Protocol1_21_11To26_1 extends AbstractProtocol tagRewriter = new TagRewriter<>(this); private final NBTComponentRewriter componentRewriter = new ComponentRewriter26_1(this); private final RegistryDataRewriter registryDataRewriter = new RegistryDataRewriter(this); + private final RecipeDisplayRewriter recipeRewriter = new RecipeDisplayRewriter1_21_5<>(this); + private final BlockRewriter blockRewriter = new BlockRewriter1_21_5<>(this, ChunkType1_21_5::new, ChunkType26_1::new); public Protocol1_21_11To26_1() { super(ClientboundPacket1_21_11.class, ClientboundPacket26_1.class, ServerboundPacket1_21_9.class, ServerboundPacket26_1.class); @@ -142,36 +147,6 @@ public final class Protocol1_21_11To26_1 extends AbstractProtocol soundRewriter = new SoundRewriter<>(this); - soundRewriter.registerSound1_19_3(ClientboundPackets1_21_11.SOUND); - soundRewriter.registerSound1_19_3(ClientboundPackets1_21_11.SOUND_ENTITY); - - new StatisticsRewriter<>(this).register(ClientboundPackets1_21_11.AWARD_STATS); - new AttributeRewriter<>(this).register1_21(ClientboundPackets1_21_11.UPDATE_ATTRIBUTES); - registerClientbound(ClientboundPackets1_21_11.SET_TIME, wrapper -> { wrapper.passthrough(Types.LONG); // Game time @@ -185,6 +160,9 @@ public final class Protocol1_21_11To26_1 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + + @Override + public RecipeDisplayRewriter getRecipeRewriter() { + return recipeRewriter; + } + @Override public RegistryDataRewriter getRegistryDataRewriter() { return registryDataRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_11to26_1/rewriter/BlockItemPacketRewriter26_1.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_11to26_1/rewriter/BlockItemPacketRewriter26_1.java index fc5c7ba72..55f024cd4 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_11to26_1/rewriter/BlockItemPacketRewriter26_1.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_11to26_1/rewriter/BlockItemPacketRewriter26_1.java @@ -37,19 +37,11 @@ import com.viaversion.viaversion.api.minecraft.item.data.JukeboxPlayable; import com.viaversion.viaversion.api.minecraft.item.data.ProvidesBannerPatterns; import com.viaversion.viaversion.api.minecraft.item.data.ProvidesTrimMaterial; import com.viaversion.viaversion.api.protocol.Protocol; -import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_21_5; -import com.viaversion.viaversion.api.type.types.chunk.ChunkType26_1; import com.viaversion.viaversion.protocols.v1_21_11to26_1.Protocol1_21_11To26_1; import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ServerboundPacket26_1; -import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ServerboundPackets26_1; -import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.RecipeDisplayRewriter1_21_5; -import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ClientboundConfigurationPackets1_21_9; import com.viaversion.viaversion.protocols.v1_21_9to1_21_11.packet.ClientboundPacket1_21_11; import com.viaversion.viaversion.protocols.v1_21_9to1_21_11.packet.ClientboundPackets1_21_11; -import com.viaversion.viaversion.rewriter.BlockRewriter; -import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter; import com.viaversion.viaversion.rewriter.StructuredItemRewriter; -import com.viaversion.viaversion.rewriter.block.BlockRewriter1_21_5; import com.viaversion.viaversion.util.Either; import com.viaversion.viaversion.util.Key; import org.checkerframework.checker.nullness.qual.Nullable; @@ -62,14 +54,8 @@ public final class BlockItemPacketRewriter26_1 extends StructuredItemRewriter blockRewriter = new BlockRewriter1_21_5<>(protocol); - blockRewriter.registerBlockEvent(ClientboundPackets1_21_11.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_21_11.BLOCK_UPDATE); - blockRewriter.registerSectionBlocksUpdate1_20(ClientboundPackets1_21_11.SECTION_BLOCKS_UPDATE); - blockRewriter.registerLevelEvent1_21(ClientboundPackets1_21_11.LEVEL_EVENT, 2001); - blockRewriter.registerBlockEntityData(ClientboundPackets1_21_11.BLOCK_ENTITY_DATA); - protocol.registerClientbound(ClientboundPackets1_21_11.LEVEL_CHUNK_WITH_LIGHT, wrapper -> { - final Chunk chunk = blockRewriter.handleChunk1_19(wrapper, ChunkType1_21_5::new, ChunkType26_1::new); + protocol.replaceClientbound(ClientboundPackets1_21_11.LEVEL_CHUNK_WITH_LIGHT, wrapper -> { + final Chunk chunk = protocol.getBlockRewriter().handleChunk1_18(wrapper); for (final ChunkSection section : chunk.getSections()) { final DataPalette blockPalette = section.palette(PaletteType.BLOCKS); for (int i = 0; i < blockPalette.size(); i++) { @@ -80,26 +66,8 @@ public final class BlockItemPacketRewriter26_1 extends StructuredItemRewriter recipeRewriter = new RecipeDisplayRewriter1_21_5<>(protocol); - recipeRewriter.registerUpdateRecipes(ClientboundPackets1_21_11.UPDATE_RECIPES); - recipeRewriter.registerRecipeBookAdd(ClientboundPackets1_21_11.RECIPE_BOOK_ADD); - recipeRewriter.registerPlaceGhostRecipe(ClientboundPackets1_21_11.PLACE_GHOST_RECIPE); } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_11to26_1/rewriter/EntityPacketRewriter26_1.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_11to26_1/rewriter/EntityPacketRewriter26_1.java index 00cfd64cd..e7326389b 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_11to26_1/rewriter/EntityPacketRewriter26_1.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_11to26_1/rewriter/EntityPacketRewriter26_1.java @@ -38,14 +38,6 @@ public final class EntityPacketRewriter26_1 extends EntityRewriter { final int entityId = wrapper.passthrough(Types.VAR_INT); wrapper.write(Types.VAR_INT, 0); // Interact diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_2to1_21_4/Protocol1_21_2To1_21_4.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_2to1_21_4/Protocol1_21_2To1_21_4.java index 2192a3262..9736e788a 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_2to1_21_4/Protocol1_21_2To1_21_4.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_2to1_21_4/Protocol1_21_2To1_21_4.java @@ -23,9 +23,7 @@ import com.viaversion.viaversion.api.data.MappingDataBase; import com.viaversion.viaversion.api.minecraft.Particle; import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey; import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_4; -import com.viaversion.viaversion.api.minecraft.item.data.ChatType; import com.viaversion.viaversion.api.platform.providers.ViaProviders; -import com.viaversion.viaversion.api.protocol.AbstractProtocol; import com.viaversion.viaversion.api.protocol.packet.provider.PacketTypesProvider; import com.viaversion.viaversion.api.protocol.packet.provider.SimplePacketTypesProvider; import com.viaversion.viaversion.api.type.Types; @@ -33,12 +31,14 @@ import com.viaversion.viaversion.api.type.types.misc.ParticleType; import com.viaversion.viaversion.api.type.types.version.VersionedTypes; import com.viaversion.viaversion.api.type.types.version.VersionedTypesHolder; import com.viaversion.viaversion.data.entity.EntityTrackerBase; +import com.viaversion.viaversion.api.protocol.AbstractProtocol; import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundConfigurationPackets1_20_5; import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundConfigurationPackets1_21; import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPacket1_21_4; import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPackets1_21_4; import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.provider.PickItemProvider; import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.rewriter.BlockItemPacketRewriter1_21_4; +import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.rewriter.BlockPacketRewriter1_21_4; import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.rewriter.ComponentRewriter1_21_4; import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.rewriter.EntityPacketRewriter1_21_4; import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.rewriter.ParticleRewriter1_21_4; @@ -46,10 +46,10 @@ import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPacke import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPackets1_21_2; import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ServerboundPacket1_21_2; import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ServerboundPackets1_21_2; -import com.viaversion.viaversion.rewriter.AttributeRewriter; +import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.ParticleRewriter; -import com.viaversion.viaversion.rewriter.SoundRewriter; -import com.viaversion.viaversion.rewriter.StatisticsRewriter; +import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter; +import com.viaversion.viaversion.rewriter.RegistryDataRewriter; import com.viaversion.viaversion.rewriter.TagRewriter; import com.viaversion.viaversion.rewriter.text.JsonNBTComponentRewriter; import java.util.BitSet; @@ -64,6 +64,9 @@ public final class Protocol1_21_2To1_21_4 extends AbstractProtocol particleRewriter = new ParticleRewriter1_21_4(this); private final TagRewriter tagRewriter = new TagRewriter<>(this); private final JsonNBTComponentRewriter componentRewriter = new ComponentRewriter1_21_4(this); + private final BlockRewriter blockRewriter = new BlockPacketRewriter1_21_4(this); + private final RecipeDisplayRewriter recipeRewriter = new RecipeDisplayRewriter<>(this); + private final RegistryDataRewriter registryDataRewriter = new RegistryDataRewriter(this); public Protocol1_21_2To1_21_4() { super(ClientboundPacket1_21_2.class, ClientboundPacket1_21_2.class, ServerboundPacket1_21_2.class, ServerboundPacket1_21_4.class); @@ -73,28 +76,7 @@ public final class Protocol1_21_2To1_21_4 extends AbstractProtocol { + replaceClientbound(ClientboundPackets1_21_2.LEVEL_PARTICLES, wrapper -> { wrapper.passthrough(Types.BOOLEAN); // Override limiter wrapper.write(Types.BOOLEAN, false); // Always show wrapper.passthrough(Types.DOUBLE); // X @@ -110,14 +92,7 @@ public final class Protocol1_21_2To1_21_4 extends AbstractProtocol soundRewriter = new SoundRewriter<>(this); - soundRewriter.registerSound1_19_3(ClientboundPackets1_21_2.SOUND); - soundRewriter.registerSound1_19_3(ClientboundPackets1_21_2.SOUND_ENTITY); - - new StatisticsRewriter<>(this).register(ClientboundPackets1_21_2.AWARD_STATS); - new AttributeRewriter<>(this).register1_21(ClientboundPackets1_21_2.UPDATE_ATTRIBUTES); - - registerClientbound(ClientboundPackets1_21_2.PLAYER_INFO_UPDATE, wrapper -> { + replaceClientbound(ClientboundPackets1_21_2.PLAYER_INFO_UPDATE, wrapper -> { // Added "show hat" - true by default, keep it like that final BitSet actions = wrapper.passthroughAndMap(Types.PROFILE_ACTIONS_ENUM1_21_2, Types.PROFILE_ACTIONS_ENUM1_21_4); if (!actions.get(5)) { // Update display name @@ -215,6 +190,21 @@ public final class Protocol1_21_2To1_21_4 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + + @Override + public RecipeDisplayRewriter getRecipeRewriter() { + return recipeRewriter; + } + + @Override + public RegistryDataRewriter getRegistryDataRewriter() { + return registryDataRewriter; + } + @Override public ParticleRewriter getParticleRewriter() { return particleRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_2to1_21_4/rewriter/BlockItemPacketRewriter1_21_4.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_2to1_21_4/rewriter/BlockItemPacketRewriter1_21_4.java index 6fb6548ce..1f0a6bb28 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_2to1_21_4/rewriter/BlockItemPacketRewriter1_21_4.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_2to1_21_4/rewriter/BlockItemPacketRewriter1_21_4.java @@ -31,15 +31,12 @@ import com.viaversion.viaversion.api.minecraft.item.data.Consumable1_21_2; import com.viaversion.viaversion.api.minecraft.item.data.CustomModelData1_21_4; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import com.viaversion.viaversion.api.type.Types; -import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2; import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.Protocol1_21_2To1_21_4; import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPacket1_21_4; import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPackets1_21_4; import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.provider.PickItemProvider; import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPacket1_21_2; import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPackets1_21_2; -import com.viaversion.viaversion.rewriter.BlockRewriter; -import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter; import com.viaversion.viaversion.rewriter.StructuredItemRewriter; public final class BlockItemPacketRewriter1_21_4 extends StructuredItemRewriter { @@ -50,14 +47,6 @@ public final class BlockItemPacketRewriter1_21_4 extends StructuredItemRewriter< @Override public void registerPackets() { - final BlockRewriter blockRewriter = new BlockPacketRewriter1_21_4(protocol); - blockRewriter.registerBlockEvent(ClientboundPackets1_21_2.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_21_2.BLOCK_UPDATE); - blockRewriter.registerSectionBlocksUpdate1_20(ClientboundPackets1_21_2.SECTION_BLOCKS_UPDATE); - blockRewriter.registerLevelEvent1_21(ClientboundPackets1_21_2.LEVEL_EVENT, 2001); - blockRewriter.registerLevelChunk1_19(ClientboundPackets1_21_2.LEVEL_CHUNK_WITH_LIGHT, ChunkType1_20_2::new); - blockRewriter.registerBlockEntityData(ClientboundPackets1_21_2.BLOCK_ENTITY_DATA); - protocol.registerClientbound(ClientboundPackets1_21_2.SET_HELD_SLOT, wrapper -> { final byte slot = wrapper.read(Types.BYTE); wrapper.write(Types.VAR_INT, (int) slot); @@ -75,22 +64,6 @@ public final class BlockItemPacketRewriter1_21_4 extends StructuredItemRewriter< Via.getManager().getProviders().get(PickItemProvider.class).pickItemFromEntity(wrapper.user(), entityId, includeData); wrapper.cancel(); }); - - protocol.registerClientbound(ClientboundPackets1_21_2.SET_CURSOR_ITEM, this::passthroughClientboundItem); - registerSetPlayerInventory(ClientboundPackets1_21_2.SET_PLAYER_INVENTORY); - registerCooldown1_21_2(ClientboundPackets1_21_2.COOLDOWN); - registerSetContent1_21_2(ClientboundPackets1_21_2.CONTAINER_SET_CONTENT); - registerSetSlot1_21_2(ClientboundPackets1_21_2.CONTAINER_SET_SLOT); - registerAdvancements1_20_3(ClientboundPackets1_21_2.UPDATE_ADVANCEMENTS); - registerSetEquipment(ClientboundPackets1_21_2.SET_EQUIPMENT); - registerContainerClick1_21_2(ServerboundPackets1_21_4.CONTAINER_CLICK); - registerMerchantOffers1_20_5(ClientboundPackets1_21_2.MERCHANT_OFFERS); - registerSetCreativeModeSlot(ServerboundPackets1_21_4.SET_CREATIVE_MODE_SLOT); - - final RecipeDisplayRewriter recipeRewriter = new RecipeDisplayRewriter<>(protocol); - recipeRewriter.registerUpdateRecipes(ClientboundPackets1_21_2.UPDATE_RECIPES); - recipeRewriter.registerRecipeBookAdd(ClientboundPackets1_21_2.RECIPE_BOOK_ADD); - recipeRewriter.registerPlaceGhostRecipe(ClientboundPackets1_21_2.PLACE_GHOST_RECIPE); } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_2to1_21_4/rewriter/BlockPacketRewriter1_21_4.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_2to1_21_4/rewriter/BlockPacketRewriter1_21_4.java index 8e18532cc..759dee87b 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_2to1_21_4/rewriter/BlockPacketRewriter1_21_4.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_2to1_21_4/rewriter/BlockPacketRewriter1_21_4.java @@ -24,6 +24,7 @@ import com.viaversion.nbt.tag.NumberTag; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.minecraft.blockentity.BlockEntity; import com.viaversion.viaversion.api.type.Types; +import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2; import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.Protocol1_21_2To1_21_4; import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPacket1_21_2; import com.viaversion.viaversion.rewriter.BlockRewriter; @@ -32,7 +33,7 @@ import com.viaversion.viaversion.util.TagUtil; public final class BlockPacketRewriter1_21_4 extends BlockRewriter { public BlockPacketRewriter1_21_4(final Protocol1_21_2To1_21_4 protocol) { - super(protocol, Types.BLOCK_POSITION1_14, Types.COMPOUND_TAG); + super(protocol, Types.BLOCK_POSITION1_14, Types.COMPOUND_TAG, ChunkType1_20_2::new, null); } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_2to1_21_4/rewriter/EntityPacketRewriter1_21_4.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_2to1_21_4/rewriter/EntityPacketRewriter1_21_4.java index 6cab577bc..da75aa806 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_2to1_21_4/rewriter/EntityPacketRewriter1_21_4.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_2to1_21_4/rewriter/EntityPacketRewriter1_21_4.java @@ -27,7 +27,6 @@ import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundConfi import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.Protocol1_21_2To1_21_4; import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPackets1_21_4; import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPacket1_21_2; -import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPackets1_21_2; import com.viaversion.viaversion.rewriter.EntityRewriter; import com.viaversion.viaversion.rewriter.RegistryDataRewriter; @@ -39,12 +38,7 @@ public final class EntityPacketRewriter1_21_4 extends EntityRewriter { + protocol.getRegistryDataRewriter().addHandler("worldgen/biome", (key, biome) -> { final CompoundTag effectsTag = biome.getCompoundTag("effects"); final CompoundTag musicTag = effectsTag.getCompoundTag("music"); if (musicTag == null) { @@ -59,10 +53,6 @@ public final class EntityPacketRewriter1_21_4 extends EntityRewriter { wrapper.passthrough(Types.DOUBLE); // X diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_4to1_21_5/Protocol1_21_4To1_21_5.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_4to1_21_5/Protocol1_21_4To1_21_5.java index c2b94dfb3..91c9755ff 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_4to1_21_5/Protocol1_21_4To1_21_5.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_4to1_21_5/Protocol1_21_4To1_21_5.java @@ -21,11 +21,14 @@ import com.viaversion.nbt.tag.CompoundTag; 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.Holder; import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey; import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_4; import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_5; +import com.viaversion.viaversion.api.minecraft.item.data.ArmorTrimPattern; import com.viaversion.viaversion.api.minecraft.item.data.ChatType; import com.viaversion.viaversion.api.protocol.AbstractProtocol; +import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.protocol.packet.provider.PacketTypesProvider; import com.viaversion.viaversion.api.protocol.packet.provider.SimplePacketTypesProvider; import com.viaversion.viaversion.api.type.Types; @@ -33,7 +36,7 @@ import com.viaversion.viaversion.api.type.types.misc.ParticleType; import com.viaversion.viaversion.api.type.types.version.VersionedTypes; import com.viaversion.viaversion.api.type.types.version.VersionedTypesHolder; import com.viaversion.viaversion.data.entity.EntityTrackerBase; -import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.rewriter.CommandRewriter1_19_4; +import com.viaversion.viaversion.protocol.packet.PacketWrapperImpl; import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundConfigurationPackets1_20_5; import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundConfigurationPackets1_21; import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPacket1_21_4; @@ -43,17 +46,17 @@ import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ClientboundPac import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ServerboundPacket1_21_5; import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ServerboundPackets1_21_5; import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.BlockItemPacketRewriter1_21_5; +import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.BlockPacketRewriter1_21_5; import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.ComponentRewriter1_21_5; import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.EntityPacketRewriter1_21_5; import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.storage.ItemHashStorage1_21_5; import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.storage.MessageIndexStorage; import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPacket1_21_2; import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPackets1_21_2; -import com.viaversion.viaversion.rewriter.AttributeRewriter; +import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.ParticleRewriter; +import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter; import com.viaversion.viaversion.rewriter.RegistryDataRewriter; -import com.viaversion.viaversion.rewriter.SoundRewriter; -import com.viaversion.viaversion.rewriter.StatisticsRewriter; import com.viaversion.viaversion.rewriter.TagRewriter; import com.viaversion.viaversion.util.Limit; @@ -68,6 +71,22 @@ public final class Protocol1_21_4To1_21_5 extends AbstractProtocol tagRewriter = new TagRewriter<>(this); private final ComponentRewriter1_21_5 componentRewriter = new ComponentRewriter1_21_5(this); private final RegistryDataRewriter registryDataRewriter = new RegistryDataRewriter(this); + private final BlockRewriter blockRewriter = new BlockPacketRewriter1_21_5(this); + final RecipeDisplayRewriter recipeRewriter = new RecipeDisplayRewriter<>(this) { + @Override + protected void handleSmithingTrimSlotDisplay(final PacketWrapper wrapper) { + handleSlotDisplay(wrapper); // Base + handleSlotDisplay(wrapper); // Material + + // Read away the pattern + ((PacketWrapperImpl) wrapper).setAllActionsRead(true); + handleSlotDisplay(wrapper); + ((PacketWrapperImpl) wrapper).setAllActionsRead(false); + + // Pattern - can't really be inferred from data + wrapper.write(ArmorTrimPattern.TYPE1_21_5, Holder.of(0)); + } + }; public Protocol1_21_4To1_21_5() { super(ClientboundPacket1_21_2.class, ClientboundPacket1_21_5.class, ServerboundPacket1_21_4.class, ServerboundPacket1_21_5.class); @@ -85,43 +104,11 @@ public final class Protocol1_21_4To1_21_5 extends AbstractProtocol soundRewriter = new SoundRewriter<>(this); - soundRewriter.registerSound1_19_3(ClientboundPackets1_21_2.SOUND); - soundRewriter.registerSound1_19_3(ClientboundPackets1_21_2.SOUND_ENTITY); - - new StatisticsRewriter<>(this).register(ClientboundPackets1_21_2.AWARD_STATS); - new AttributeRewriter<>(this).register1_21(ClientboundPackets1_21_2.UPDATE_ATTRIBUTES); - - new CommandRewriter1_19_4<>(this).registerDeclareCommands1_19(ClientboundPackets1_21_2.COMMANDS); cancelServerbound(ServerboundPackets1_21_5.TEST_INSTANCE_BLOCK_ACTION); cancelServerbound(ServerboundPackets1_21_5.SET_TEST_BLOCK); - registerClientbound(ClientboundPackets1_21_2.PLAYER_CHAT, wrapper -> { + replaceClientbound(ClientboundPackets1_21_2.PLAYER_CHAT, wrapper -> { final MessageIndexStorage messageIndexStorage = wrapper.user().get(MessageIndexStorage.class); wrapper.write(Types.VAR_INT, messageIndexStorage.getAndIncrease()); @@ -243,6 +230,16 @@ public final class Protocol1_21_4To1_21_5 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + + @Override + public RecipeDisplayRewriter getRecipeRewriter() { + return recipeRewriter; + } + @Override public RegistryDataRewriter getRegistryDataRewriter() { return registryDataRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_4to1_21_5/rewriter/BlockItemPacketRewriter1_21_5.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_4to1_21_5/rewriter/BlockItemPacketRewriter1_21_5.java index 6b08fbffb..400948295 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_4to1_21_5/rewriter/BlockItemPacketRewriter1_21_5.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_4to1_21_5/rewriter/BlockItemPacketRewriter1_21_5.java @@ -117,19 +117,12 @@ public final class BlockItemPacketRewriter1_21_5 extends StructuredItemRewriter< @Override public void registerPackets() { - final BlockRewriter blockRewriter = new BlockPacketRewriter1_21_5(protocol); - blockRewriter.registerBlockEvent(ClientboundPackets1_21_2.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_21_2.BLOCK_UPDATE); - blockRewriter.registerSectionBlocksUpdate1_20(ClientboundPackets1_21_2.SECTION_BLOCKS_UPDATE); - blockRewriter.registerLevelEvent1_21(ClientboundPackets1_21_2.LEVEL_EVENT, 2001); - blockRewriter.registerBlockEntityData(ClientboundPackets1_21_2.BLOCK_ENTITY_DATA); - - protocol.registerClientbound(ClientboundPackets1_21_2.LEVEL_CHUNK_WITH_LIGHT, wrapper -> { + protocol.replaceClientbound(ClientboundPackets1_21_2.LEVEL_CHUNK_WITH_LIGHT, wrapper -> { final EntityTracker tracker = protocol.getEntityRewriter().tracker(wrapper.user()); final Mappings blockStateMappings = protocol.getMappingData().getBlockStateMappings(); final Type chunkType = new ChunkType1_20_2(tracker.currentWorldSectionHeight(), ceilLog2(blockStateMappings.size()), ceilLog2(tracker.biomesSent())); final Chunk chunk = wrapper.read(chunkType); - blockRewriter.handleChunk(chunk); + protocol.getBlockRewriter().handleChunk(chunk); final Type newChunkType = new ChunkType1_21_5(tracker.currentWorldSectionHeight(), ceilLog2(blockStateMappings.mappedSize()), ceilLog2(tracker.biomesSent())); final List heightmaps = new ArrayList<>(); @@ -146,7 +139,7 @@ public final class BlockItemPacketRewriter1_21_5 extends StructuredItemRewriter< } final Chunk mappedChunk = new Chunk1_21_5(chunk.getX(), chunk.getZ(), chunk.getSections(), heightmaps.toArray(EMPTY_HEIGHTMAPS), chunk.blockEntities()); - blockRewriter.handleBlockEntities(chunk, wrapper.user()); + protocol.getBlockRewriter().handleBlockEntities(chunk, wrapper.user()); wrapper.write(newChunkType, mappedChunk); }); @@ -163,15 +156,7 @@ public final class BlockItemPacketRewriter1_21_5 extends StructuredItemRewriter< } }); - registerSetCursorItem(ClientboundPackets1_21_2.SET_CURSOR_ITEM); - registerSetPlayerInventory(ClientboundPackets1_21_2.SET_PLAYER_INVENTORY); - registerCooldown1_21_2(ClientboundPackets1_21_2.COOLDOWN); - registerSetContent1_21_2(ClientboundPackets1_21_2.CONTAINER_SET_CONTENT); - registerSetSlot1_21_2(ClientboundPackets1_21_2.CONTAINER_SET_SLOT); - registerSetEquipment(ClientboundPackets1_21_2.SET_EQUIPMENT); - registerMerchantOffers1_20_5(ClientboundPackets1_21_2.MERCHANT_OFFERS); - - protocol.registerServerbound(ServerboundPackets1_21_5.SET_CREATIVE_MODE_SLOT, wrapper -> { + protocol.replaceServerbound(ServerboundPackets1_21_5.SET_CREATIVE_MODE_SLOT, wrapper -> { if (!protocol.getEntityRewriter().tracker(wrapper.user()).canInstaBuild()) { wrapper.cancel(); return; @@ -183,7 +168,7 @@ public final class BlockItemPacketRewriter1_21_5 extends StructuredItemRewriter< wrapper.write(itemType(), item); }); - protocol.registerServerbound(ServerboundPackets1_21_5.CONTAINER_CLICK, wrapper -> { + protocol.replaceServerbound(ServerboundPackets1_21_5.CONTAINER_CLICK, wrapper -> { wrapper.passthrough(Types.VAR_INT); // Container id wrapper.passthrough(Types.VAR_INT); // State id wrapper.passthrough(Types.SHORT); // Slot @@ -202,7 +187,7 @@ public final class BlockItemPacketRewriter1_21_5 extends StructuredItemRewriter< wrapper.write(VersionedTypes.V1_21_5.item, handleItemToServer(wrapper.user(), this.convertHashedItemToStructuredItem(wrapper.user(), carriedItem))); }); - protocol.registerClientbound(ClientboundPackets1_21_2.UPDATE_ADVANCEMENTS, wrapper -> { + protocol.replaceClientbound(ClientboundPackets1_21_2.UPDATE_ADVANCEMENTS, wrapper -> { wrapper.passthrough(Types.BOOLEAN); // Reset/clear int size = wrapper.passthrough(Types.VAR_INT); // Mapping size for (int i = 0; i < size; i++) { @@ -252,25 +237,6 @@ public final class BlockItemPacketRewriter1_21_5 extends StructuredItemRewriter< // Show advancements wrapper.write(Types.BOOLEAN, true); }); - - final RecipeDisplayRewriter recipeRewriter = new RecipeDisplayRewriter<>(protocol) { - @Override - protected void handleSmithingTrimSlotDisplay(final PacketWrapper wrapper) { - handleSlotDisplay(wrapper); // Base - handleSlotDisplay(wrapper); // Material - - // Read away the pattern - ((PacketWrapperImpl) wrapper).setAllActionsRead(true); - handleSlotDisplay(wrapper); - ((PacketWrapperImpl) wrapper).setAllActionsRead(false); - - // Pattern - can't really be inferred from data - wrapper.write(ArmorTrimPattern.TYPE1_21_5, Holder.of(0)); - } - }; - recipeRewriter.registerUpdateRecipes(ClientboundPackets1_21_2.UPDATE_RECIPES); - recipeRewriter.registerRecipeBookAdd(ClientboundPackets1_21_2.RECIPE_BOOK_ADD); - recipeRewriter.registerPlaceGhostRecipe(ClientboundPackets1_21_2.PLACE_GHOST_RECIPE); } private void convertClientAsset(final PacketWrapper wrapper) { diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_4to1_21_5/rewriter/BlockPacketRewriter1_21_5.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_4to1_21_5/rewriter/BlockPacketRewriter1_21_5.java index 9629a828e..e60b7d728 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_4to1_21_5/rewriter/BlockPacketRewriter1_21_5.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_4to1_21_5/rewriter/BlockPacketRewriter1_21_5.java @@ -23,6 +23,8 @@ import com.viaversion.nbt.tag.StringTag; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.minecraft.blockentity.BlockEntity; import com.viaversion.viaversion.api.type.Types; +import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2; +import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_21_5; import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.Protocol1_21_4To1_21_5; import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPacket1_21_2; import com.viaversion.viaversion.rewriter.BlockRewriter; @@ -34,7 +36,7 @@ public final class BlockPacketRewriter1_21_5 extends BlockRewriter { wrapper.passthrough(Types.VAR_INT); // Entity ID @@ -90,13 +84,11 @@ public final class EntityPacketRewriter1_21_5 extends EntityRewriter { wrapper.user().get(MessageIndexStorage.class).setIndex(0); }); - protocol.registerClientbound(ClientboundPackets1_21_2.SET_PLAYER_TEAM, wrapper -> { + protocol.replaceClientbound(ClientboundPackets1_21_2.SET_PLAYER_TEAM, wrapper -> { wrapper.passthrough(Types.STRING); // Team Name final byte action = wrapper.passthrough(Types.BYTE); // Mode if (action == 0 || action == 2) { diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_5to1_21_6/Protocol1_21_5To1_21_6.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_5to1_21_6/Protocol1_21_5To1_21_6.java index ac15631fe..4f4ece1bc 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_5to1_21_6/Protocol1_21_5To1_21_6.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_5to1_21_6/Protocol1_21_5To1_21_6.java @@ -27,18 +27,19 @@ import com.viaversion.viaversion.api.protocol.AbstractProtocol; import com.viaversion.viaversion.api.protocol.packet.provider.PacketTypesProvider; import com.viaversion.viaversion.api.protocol.packet.provider.SimplePacketTypesProvider; import com.viaversion.viaversion.api.type.Types; +import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_21_5; import com.viaversion.viaversion.api.type.types.misc.ParticleType; import com.viaversion.viaversion.api.type.types.version.VersionedTypes; import com.viaversion.viaversion.api.type.types.version.VersionedTypesHolder; import com.viaversion.viaversion.data.entity.EntityTrackerBase; import com.viaversion.viaversion.data.item.ItemHasherBase; -import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.rewriter.CommandRewriter1_19_4; import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundConfigurationPackets1_20_5; import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundConfigurationPackets1_21; import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ClientboundPacket1_21_5; import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ClientboundPackets1_21_5; import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ServerboundPacket1_21_5; import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ServerboundPackets1_21_5; +import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.RecipeDisplayRewriter1_21_5; import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundConfigurationPackets1_21_6; import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPacket1_21_6; import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPackets1_21_6; @@ -48,11 +49,10 @@ import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ServerboundPac import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.rewriter.BlockItemPacketRewriter1_21_6; import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.rewriter.EntityPacketRewriter1_21_6; import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.storage.SneakStorage; -import com.viaversion.viaversion.rewriter.AttributeRewriter; +import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.ParticleRewriter; +import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter; import com.viaversion.viaversion.rewriter.RegistryDataRewriter; -import com.viaversion.viaversion.rewriter.SoundRewriter; -import com.viaversion.viaversion.rewriter.StatisticsRewriter; import com.viaversion.viaversion.rewriter.TagRewriter; import com.viaversion.viaversion.rewriter.text.NBTComponentRewriter; import com.viaversion.viaversion.util.Key; @@ -69,6 +69,8 @@ public final class Protocol1_21_5To1_21_6 extends AbstractProtocol tagRewriter = new TagRewriter<>(this); private final NBTComponentRewriter componentRewriter = new NBTComponentRewriter<>(this); private final RegistryDataRewriter registryDataRewriter = new RegistryDataRewriter(this); + private final BlockRewriter blockRewriter = BlockRewriter.for1_20_2(this, ChunkType1_21_5::new); + private final RecipeDisplayRewriter recipeRewriter = new RecipeDisplayRewriter1_21_5<>(this); public Protocol1_21_5To1_21_6() { super(ClientboundPacket1_21_5.class, ClientboundPacket1_21_6.class, ServerboundPacket1_21_5.class, ServerboundPacket1_21_6.class); @@ -91,39 +93,6 @@ public final class Protocol1_21_5To1_21_6 extends AbstractProtocol soundRewriter = new SoundRewriter<>(this); - soundRewriter.registerSound1_19_3(ClientboundPackets1_21_5.SOUND); - soundRewriter.registerSound1_19_3(ClientboundPackets1_21_5.SOUND_ENTITY); - - new StatisticsRewriter<>(this).register(ClientboundPackets1_21_5.AWARD_STATS); - new AttributeRewriter<>(this).register1_21(ClientboundPackets1_21_5.UPDATE_ATTRIBUTES); - new CommandRewriter1_19_4<>(this).registerDeclareCommands1_19(ClientboundPackets1_21_5.COMMANDS); registerClientbound(ClientboundPackets1_21_5.CHANGE_DIFFICULTY, wrapper -> { final short difficulty = wrapper.read(Types.UNSIGNED_BYTE); @@ -212,6 +181,16 @@ public final class Protocol1_21_5To1_21_6 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + + @Override + public RecipeDisplayRewriter getRecipeRewriter() { + return recipeRewriter; + } + @Override public RegistryDataRewriter getRegistryDataRewriter() { return registryDataRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_5to1_21_6/rewriter/BlockItemPacketRewriter1_21_6.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_5to1_21_6/rewriter/BlockItemPacketRewriter1_21_6.java index a7966e17f..ba1321052 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_5to1_21_6/rewriter/BlockItemPacketRewriter1_21_6.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_5to1_21_6/rewriter/BlockItemPacketRewriter1_21_6.java @@ -21,15 +21,9 @@ import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.minecraft.data.StructuredDataContainer; import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey; import com.viaversion.viaversion.api.minecraft.item.Item; -import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_21_5; import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ClientboundPacket1_21_5; -import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ClientboundPackets1_21_5; -import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.RecipeDisplayRewriter1_21_5; import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.Protocol1_21_5To1_21_6; import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ServerboundPacket1_21_6; -import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ServerboundPackets1_21_6; -import com.viaversion.viaversion.rewriter.BlockRewriter; -import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter; import com.viaversion.viaversion.rewriter.StructuredItemRewriter; public final class BlockItemPacketRewriter1_21_6 extends StructuredItemRewriter { @@ -38,33 +32,6 @@ public final class BlockItemPacketRewriter1_21_6 extends StructuredItemRewriter< super(protocol); } - @Override - public void registerPackets() { - final BlockRewriter blockRewriter = BlockRewriter.for1_20_2(protocol); - blockRewriter.registerBlockEvent(ClientboundPackets1_21_5.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_21_5.BLOCK_UPDATE); - blockRewriter.registerSectionBlocksUpdate1_20(ClientboundPackets1_21_5.SECTION_BLOCKS_UPDATE); - blockRewriter.registerLevelEvent1_21(ClientboundPackets1_21_5.LEVEL_EVENT, 2001); - blockRewriter.registerLevelChunk1_19(ClientboundPackets1_21_5.LEVEL_CHUNK_WITH_LIGHT, ChunkType1_21_5::new); - blockRewriter.registerBlockEntityData(ClientboundPackets1_21_5.BLOCK_ENTITY_DATA); - - protocol.registerClientbound(ClientboundPackets1_21_5.SET_CURSOR_ITEM, this::passthroughClientboundItem); - registerSetPlayerInventory(ClientboundPackets1_21_5.SET_PLAYER_INVENTORY); - registerCooldown1_21_2(ClientboundPackets1_21_5.COOLDOWN); - registerSetContent1_21_2(ClientboundPackets1_21_5.CONTAINER_SET_CONTENT); - registerSetSlot1_21_2(ClientboundPackets1_21_5.CONTAINER_SET_SLOT); - registerAdvancements1_20_3(ClientboundPackets1_21_5.UPDATE_ADVANCEMENTS); - registerSetEquipment(ClientboundPackets1_21_5.SET_EQUIPMENT); - registerMerchantOffers1_20_5(ClientboundPackets1_21_5.MERCHANT_OFFERS); - registerContainerClick1_21_5(ServerboundPackets1_21_6.CONTAINER_CLICK); - registerSetCreativeModeSlot1_21_5(ServerboundPackets1_21_6.SET_CREATIVE_MODE_SLOT); - - final RecipeDisplayRewriter recipeRewriter = new RecipeDisplayRewriter1_21_5<>(protocol); - recipeRewriter.registerUpdateRecipes(ClientboundPackets1_21_5.UPDATE_RECIPES); - recipeRewriter.registerRecipeBookAdd(ClientboundPackets1_21_5.RECIPE_BOOK_ADD); - recipeRewriter.registerPlaceGhostRecipe(ClientboundPackets1_21_5.PLACE_GHOST_RECIPE); - } - @Override protected void handleItemDataComponentsToClient(final UserConnection connection, final Item item, final StructuredDataContainer container) { upgradeItemData(item); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_5to1_21_6/rewriter/EntityPacketRewriter1_21_6.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_5to1_21_6/rewriter/EntityPacketRewriter1_21_6.java index 7103c0d70..85707e66c 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_5to1_21_6/rewriter/EntityPacketRewriter1_21_6.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_5to1_21_6/rewriter/EntityPacketRewriter1_21_6.java @@ -42,14 +42,6 @@ public final class EntityPacketRewriter1_21_6 extends EntityRewriter { // send server links dialog as vanilla doesn't show server links by default otherwise final PacketWrapper dialogsPacket = PacketWrapper.create(ClientboundConfigurationPackets1_21.REGISTRY_DATA, wrapper.user()); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_6to1_21_7/Protocol1_21_6To1_21_7.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_6to1_21_7/Protocol1_21_6To1_21_7.java index 84275208b..0c16d46c6 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_6to1_21_7/Protocol1_21_6To1_21_7.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_6to1_21_7/Protocol1_21_6To1_21_7.java @@ -23,13 +23,15 @@ import com.viaversion.viaversion.api.data.MappingDataBase; import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys1_21_5; import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_6; import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_21_5; -import com.viaversion.viaversion.api.protocol.AbstractProtocol; import com.viaversion.viaversion.api.protocol.packet.provider.PacketTypesProvider; import com.viaversion.viaversion.api.protocol.packet.provider.SimplePacketTypesProvider; +import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_21_5; import com.viaversion.viaversion.api.type.types.version.Types1_20_5; import com.viaversion.viaversion.api.type.types.version.VersionedTypes; import com.viaversion.viaversion.data.entity.EntityTrackerBase; import com.viaversion.viaversion.data.item.ItemHasherBase; +import com.viaversion.viaversion.api.protocol.AbstractProtocol; +import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.RecipeDisplayRewriter1_21_5; import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundConfigurationPackets1_21_6; import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPacket1_21_6; import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPackets1_21_6; @@ -38,10 +40,10 @@ import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ServerboundPac import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ServerboundPackets1_21_6; import com.viaversion.viaversion.protocols.v1_21_6to1_21_7.rewriter.BlockItemPacketRewriter1_21_7; import com.viaversion.viaversion.protocols.v1_21_6to1_21_7.rewriter.EntityPacketRewriter1_21_7; +import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.ParticleRewriter; +import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter; import com.viaversion.viaversion.rewriter.RegistryDataRewriter; -import com.viaversion.viaversion.rewriter.SoundRewriter; -import com.viaversion.viaversion.rewriter.StatisticsRewriter; import com.viaversion.viaversion.rewriter.TagRewriter; import static com.viaversion.viaversion.util.ProtocolUtil.packetTypeMap; @@ -54,6 +56,8 @@ public final class Protocol1_21_6To1_21_7 extends AbstractProtocol particleRewriter = new ParticleRewriter<>(this); private final TagRewriter tagRewriter = new TagRewriter<>(this); private final RegistryDataRewriter registryDataRewriter = new RegistryDataRewriter(this); + private final BlockRewriter blockRewriter = BlockRewriter.for1_20_2(this, ChunkType1_21_5::new); + private final RecipeDisplayRewriter recipeRewriter = new RecipeDisplayRewriter1_21_5<>(this); public Protocol1_21_6To1_21_7() { super(ClientboundPacket1_21_6.class, ClientboundPacket1_21_6.class, ServerboundPacket1_21_6.class, ServerboundPacket1_21_6.class); @@ -62,20 +66,6 @@ public final class Protocol1_21_6To1_21_7 extends AbstractProtocol soundRewriter = new SoundRewriter<>(this); - soundRewriter.registerSound1_19_3(ClientboundPackets1_21_6.SOUND); - soundRewriter.registerSound1_19_3(ClientboundPackets1_21_6.SOUND_ENTITY); - - new StatisticsRewriter<>(this).register(ClientboundPackets1_21_6.AWARD_STATS); } @Override @@ -114,6 +104,16 @@ public final class Protocol1_21_6To1_21_7 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + + @Override + public RecipeDisplayRewriter getRecipeRewriter() { + return recipeRewriter; + } + @Override public RegistryDataRewriter getRegistryDataRewriter() { return registryDataRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_6to1_21_7/rewriter/BlockItemPacketRewriter1_21_7.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_6to1_21_7/rewriter/BlockItemPacketRewriter1_21_7.java index 1caf5cee8..3f6397726 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_6to1_21_7/rewriter/BlockItemPacketRewriter1_21_7.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_6to1_21_7/rewriter/BlockItemPacketRewriter1_21_7.java @@ -17,16 +17,9 @@ */ package com.viaversion.viaversion.protocols.v1_21_6to1_21_7.rewriter; -import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_21_5; -import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.RecipeDisplayRewriter1_21_5; -import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundConfigurationPackets1_21_6; import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPacket1_21_6; -import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPackets1_21_6; import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ServerboundPacket1_21_6; -import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ServerboundPackets1_21_6; import com.viaversion.viaversion.protocols.v1_21_6to1_21_7.Protocol1_21_6To1_21_7; -import com.viaversion.viaversion.rewriter.BlockRewriter; -import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter; import com.viaversion.viaversion.rewriter.StructuredItemRewriter; public final class BlockItemPacketRewriter1_21_7 extends StructuredItemRewriter { @@ -34,33 +27,4 @@ public final class BlockItemPacketRewriter1_21_7 extends StructuredItemRewriter< public BlockItemPacketRewriter1_21_7(final Protocol1_21_6To1_21_7 protocol) { super(protocol); } - - @Override - public void registerPackets() { - final BlockRewriter blockRewriter = BlockRewriter.for1_20_2(protocol); - blockRewriter.registerBlockEvent(ClientboundPackets1_21_6.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_21_6.BLOCK_UPDATE); - blockRewriter.registerSectionBlocksUpdate1_20(ClientboundPackets1_21_6.SECTION_BLOCKS_UPDATE); - blockRewriter.registerLevelEvent1_21(ClientboundPackets1_21_6.LEVEL_EVENT, 2001); - blockRewriter.registerLevelChunk1_19(ClientboundPackets1_21_6.LEVEL_CHUNK_WITH_LIGHT, ChunkType1_21_5::new); - blockRewriter.registerBlockEntityData(ClientboundPackets1_21_6.BLOCK_ENTITY_DATA); - - registerSetCursorItem(ClientboundPackets1_21_6.SET_CURSOR_ITEM); - registerSetPlayerInventory(ClientboundPackets1_21_6.SET_PLAYER_INVENTORY); - registerCooldown1_21_2(ClientboundPackets1_21_6.COOLDOWN); - registerSetContent1_21_2(ClientboundPackets1_21_6.CONTAINER_SET_CONTENT); - registerSetSlot1_21_2(ClientboundPackets1_21_6.CONTAINER_SET_SLOT); - registerAdvancements1_20_3(ClientboundPackets1_21_6.UPDATE_ADVANCEMENTS); - registerSetEquipment(ClientboundPackets1_21_6.SET_EQUIPMENT); - registerMerchantOffers1_20_5(ClientboundPackets1_21_6.MERCHANT_OFFERS); - registerContainerClick1_21_5(ServerboundPackets1_21_6.CONTAINER_CLICK); - registerSetCreativeModeSlot1_21_5(ServerboundPackets1_21_6.SET_CREATIVE_MODE_SLOT); - registerShowDialog(ClientboundPackets1_21_6.SHOW_DIALOG); - registerShowDialogDirect(ClientboundConfigurationPackets1_21_6.SHOW_DIALOG); - - final RecipeDisplayRewriter recipeRewriter = new RecipeDisplayRewriter1_21_5<>(protocol); - recipeRewriter.registerUpdateRecipes(ClientboundPackets1_21_6.UPDATE_RECIPES); - recipeRewriter.registerRecipeBookAdd(ClientboundPackets1_21_6.RECIPE_BOOK_ADD); - recipeRewriter.registerPlaceGhostRecipe(ClientboundPackets1_21_6.PLACE_GHOST_RECIPE); - } } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_6to1_21_7/rewriter/EntityPacketRewriter1_21_7.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_6to1_21_7/rewriter/EntityPacketRewriter1_21_7.java index 24a185e2a..5d2d75631 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_6to1_21_7/rewriter/EntityPacketRewriter1_21_7.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_6to1_21_7/rewriter/EntityPacketRewriter1_21_7.java @@ -21,7 +21,6 @@ import com.viaversion.viaversion.api.minecraft.entities.EntityType; import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_6; import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_21_5; import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPacket1_21_6; -import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPackets1_21_6; import com.viaversion.viaversion.protocols.v1_21_6to1_21_7.Protocol1_21_6To1_21_7; import com.viaversion.viaversion.rewriter.EntityRewriter; @@ -31,17 +30,6 @@ public final class EntityPacketRewriter1_21_7 extends EntityRewriter tagRewriter = new TagRewriter<>(this); private final NBTComponentRewriter componentRewriter = new ComponentRewriter1_21_9(this); private final RegistryDataRewriter registryDataRewriter = new RegistryDataRewriter1_21_9(this); + private final BlockRewriter blockRewriter = new BlockRewriter1_21_5<>(this, ChunkType1_21_5::new); + private final RecipeDisplayRewriter recipeRewriter = new RecipeDisplayRewriter1_21_5<>(this); public Protocol1_21_7To1_21_9() { super(ClientboundPacket1_21_6.class, ClientboundPacket1_21_9.class, ServerboundPacket1_21_6.class, ServerboundPacket1_21_9.class); @@ -80,30 +85,8 @@ public final class Protocol1_21_7To1_21_9 extends AbstractProtocol soundRewriter = new SoundRewriter<>(this); - particleRewriter.registerLevelParticles1_21_4(ClientboundPackets1_21_6.LEVEL_PARTICLES); - registerClientbound(ClientboundPackets1_21_6.EXPLODE, wrapper -> { + replaceClientbound(ClientboundPackets1_21_6.EXPLODE, wrapper -> { wrapper.passthrough(Types.DOUBLE); // X wrapper.passthrough(Types.DOUBLE); // Y wrapper.passthrough(Types.DOUBLE); // Z @@ -142,12 +125,6 @@ public final class Protocol1_21_7To1_21_9 extends AbstractProtocol(this).register(ClientboundPackets1_21_6.AWARD_STATS); - new AttributeRewriter<>(this).register1_21(ClientboundPackets1_21_6.UPDATE_ATTRIBUTES); - cancelServerbound(ServerboundConfigurationPackets1_21_9.ACCEPT_CODE_OF_CONDUCT); } @@ -223,6 +200,16 @@ public final class Protocol1_21_7To1_21_9 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + + @Override + public RecipeDisplayRewriter getRecipeRewriter() { + return recipeRewriter; + } + @Override public RegistryDataRewriter getRegistryDataRewriter() { return registryDataRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_7to1_21_9/rewriter/BlockItemPacketRewriter1_21_9.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_7to1_21_9/rewriter/BlockItemPacketRewriter1_21_9.java index b83a1451b..c2e2f02be 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_7to1_21_9/rewriter/BlockItemPacketRewriter1_21_9.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_7to1_21_9/rewriter/BlockItemPacketRewriter1_21_9.java @@ -29,19 +29,12 @@ import com.viaversion.viaversion.api.minecraft.item.data.BlockEntityData; import com.viaversion.viaversion.api.minecraft.item.data.EntityData; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.type.Types; -import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_21_5; -import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.RecipeDisplayRewriter1_21_5; -import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundConfigurationPackets1_21_6; import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPacket1_21_6; import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPackets1_21_6; -import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ServerboundPackets1_21_6; import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.Protocol1_21_7To1_21_9; import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ServerboundPacket1_21_9; import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.storage.DimensionScaleStorage; -import com.viaversion.viaversion.rewriter.BlockRewriter; -import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter; import com.viaversion.viaversion.rewriter.StructuredItemRewriter; -import com.viaversion.viaversion.rewriter.block.BlockRewriter1_21_5; public final class BlockItemPacketRewriter1_21_9 extends StructuredItemRewriter { @@ -51,32 +44,6 @@ public final class BlockItemPacketRewriter1_21_9 extends StructuredItemRewriter< @Override public void registerPackets() { - final BlockRewriter blockRewriter = new BlockRewriter1_21_5<>(protocol); - blockRewriter.registerBlockEvent(ClientboundPackets1_21_6.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_21_6.BLOCK_UPDATE); - blockRewriter.registerSectionBlocksUpdate1_20(ClientboundPackets1_21_6.SECTION_BLOCKS_UPDATE); - blockRewriter.registerLevelEvent1_21(ClientboundPackets1_21_6.LEVEL_EVENT, 2001); - blockRewriter.registerLevelChunk1_19(ClientboundPackets1_21_6.LEVEL_CHUNK_WITH_LIGHT, ChunkType1_21_5::new); - blockRewriter.registerBlockEntityData(ClientboundPackets1_21_6.BLOCK_ENTITY_DATA); - - registerSetCursorItem(ClientboundPackets1_21_6.SET_CURSOR_ITEM); - registerSetPlayerInventory(ClientboundPackets1_21_6.SET_PLAYER_INVENTORY); - registerCooldown1_21_2(ClientboundPackets1_21_6.COOLDOWN); - registerSetContent1_21_2(ClientboundPackets1_21_6.CONTAINER_SET_CONTENT); - registerSetSlot1_21_2(ClientboundPackets1_21_6.CONTAINER_SET_SLOT); - registerAdvancements1_20_3(ClientboundPackets1_21_6.UPDATE_ADVANCEMENTS); - registerSetEquipment(ClientboundPackets1_21_6.SET_EQUIPMENT); - registerMerchantOffers1_20_5(ClientboundPackets1_21_6.MERCHANT_OFFERS); - registerContainerClick1_21_5(ServerboundPackets1_21_6.CONTAINER_CLICK); - registerSetCreativeModeSlot1_21_5(ServerboundPackets1_21_6.SET_CREATIVE_MODE_SLOT); - registerShowDialog(ClientboundPackets1_21_6.SHOW_DIALOG); - registerShowDialogDirect(ClientboundConfigurationPackets1_21_6.SHOW_DIALOG); - - final RecipeDisplayRewriter recipeRewriter = new RecipeDisplayRewriter1_21_5<>(protocol); - recipeRewriter.registerUpdateRecipes(ClientboundPackets1_21_6.UPDATE_RECIPES); - recipeRewriter.registerRecipeBookAdd(ClientboundPackets1_21_6.RECIPE_BOOK_ADD); - recipeRewriter.registerPlaceGhostRecipe(ClientboundPackets1_21_6.PLACE_GHOST_RECIPE); - protocol.registerClientbound(ClientboundPackets1_21_6.INITIALIZE_BORDER, this::updateBorderCenter); protocol.registerClientbound(ClientboundPackets1_21_6.SET_BORDER_CENTER, this::updateBorderCenter); } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_7to1_21_9/rewriter/EntityPacketRewriter1_21_9.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_7to1_21_9/rewriter/EntityPacketRewriter1_21_9.java index 76152c03d..b1d1d8170 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_7to1_21_9/rewriter/EntityPacketRewriter1_21_9.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_7to1_21_9/rewriter/EntityPacketRewriter1_21_9.java @@ -27,7 +27,6 @@ import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1 import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_21_9; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.type.Types; -import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundConfigurationPackets1_21_6; import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPacket1_21_6; import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPackets1_21_6; import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.Protocol1_21_7To1_21_9; @@ -43,14 +42,7 @@ public final class EntityPacketRewriter1_21_9 extends EntityRewriter { + protocol.replaceClientbound(ClientboundPackets1_21_6.ADD_ENTITY, wrapper -> { final int entityId = wrapper.passthrough(Types.VAR_INT); wrapper.passthrough(Types.UUID); // Entity UUID final int entityTypeId = wrapper.passthrough(Types.VAR_INT); @@ -98,7 +90,6 @@ public final class EntityPacketRewriter1_21_9 extends EntityRewriter REMOVE_SKY_COLOR_FROM_BIOMES = Set.of("warped_forest", "basalt_deltas", "nether_wastes", "soul_sand_valley", "crimson_forest"); // rendered via the already defined fog instead private final EntityPacketRewriter1_21_11 entityRewriter = new EntityPacketRewriter1_21_11(this); private final BlockItemPacketRewriter1_21_11 itemRewriter = new BlockItemPacketRewriter1_21_11(this); + private final BlockRewriter blockRewriter = new BlockRewriter1_21_5<>(this, ChunkType1_21_5::new); private final ParticleRewriter particleRewriter = new ParticleRewriter<>(this); private final TagRewriter tagRewriter = new TagRewriter<>(this); private final NBTComponentRewriter componentRewriter = new ComponentRewriter1_21_11(this); private final RegistryDataRewriter registryDataRewriter = new RegistryDataRewriter(this); + private final RecipeDisplayRewriter recipeRewriter = new RecipeDisplayRewriter1_21_5<>(this); public Protocol1_21_9To1_21_11() { super(ClientboundPacket1_21_9.class, ClientboundPacket1_21_11.class, ServerboundPacket1_21_9.class, ServerboundPacket1_21_9.class); @@ -245,37 +249,6 @@ public final class Protocol1_21_9To1_21_11 extends AbstractProtocol soundRewriter = new SoundRewriter<>(this); - soundRewriter.registerSound1_19_3(ClientboundPackets1_21_9.SOUND); - soundRewriter.registerSound1_19_3(ClientboundPackets1_21_9.SOUND_ENTITY); - - new StatisticsRewriter<>(this).register(ClientboundPackets1_21_9.AWARD_STATS); - new AttributeRewriter<>(this).register1_21(ClientboundPackets1_21_9.UPDATE_ATTRIBUTES); } private void addAmbientCaveSound(final CompoundTag attributes) { @@ -387,6 +360,16 @@ public final class Protocol1_21_9To1_21_11 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + + @Override + public RecipeDisplayRewriter getRecipeRewriter() { + return recipeRewriter; + } + @Override public RegistryDataRewriter getRegistryDataRewriter() { return registryDataRewriter; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_9to1_21_11/rewriter/BlockItemPacketRewriter1_21_11.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_9to1_21_11/rewriter/BlockItemPacketRewriter1_21_11.java index 89fa02a63..cc88306d8 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_9to1_21_11/rewriter/BlockItemPacketRewriter1_21_11.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_9to1_21_11/rewriter/BlockItemPacketRewriter1_21_11.java @@ -25,19 +25,13 @@ import com.viaversion.viaversion.api.minecraft.item.Item; import com.viaversion.viaversion.api.minecraft.item.data.AttackRange; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import com.viaversion.viaversion.api.type.Types; -import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_21_5; -import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.RecipeDisplayRewriter1_21_5; import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ServerboundPackets1_21_6; -import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ClientboundConfigurationPackets1_21_9; import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ClientboundPacket1_21_9; import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ClientboundPackets1_21_9; import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ServerboundPacket1_21_9; import com.viaversion.viaversion.protocols.v1_21_9to1_21_11.Protocol1_21_9To1_21_11; import com.viaversion.viaversion.protocols.v1_21_9to1_21_11.storage.GameTimeStorage; -import com.viaversion.viaversion.rewriter.BlockRewriter; -import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter; import com.viaversion.viaversion.rewriter.StructuredItemRewriter; -import com.viaversion.viaversion.rewriter.block.BlockRewriter1_21_5; public final class BlockItemPacketRewriter1_21_11 extends StructuredItemRewriter { @@ -47,32 +41,6 @@ public final class BlockItemPacketRewriter1_21_11 extends StructuredItemRewriter @Override public void registerPackets() { - final BlockRewriter blockRewriter = new BlockRewriter1_21_5<>(protocol); - blockRewriter.registerBlockEvent(ClientboundPackets1_21_9.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_21_9.BLOCK_UPDATE); - blockRewriter.registerSectionBlocksUpdate1_20(ClientboundPackets1_21_9.SECTION_BLOCKS_UPDATE); - blockRewriter.registerLevelEvent1_21(ClientboundPackets1_21_9.LEVEL_EVENT, 2001); - blockRewriter.registerLevelChunk1_19(ClientboundPackets1_21_9.LEVEL_CHUNK_WITH_LIGHT, ChunkType1_21_5::new); - blockRewriter.registerBlockEntityData(ClientboundPackets1_21_9.BLOCK_ENTITY_DATA); - - registerSetCursorItem(ClientboundPackets1_21_9.SET_CURSOR_ITEM); - registerSetPlayerInventory(ClientboundPackets1_21_9.SET_PLAYER_INVENTORY); - registerCooldown1_21_2(ClientboundPackets1_21_9.COOLDOWN); - registerSetContent1_21_2(ClientboundPackets1_21_9.CONTAINER_SET_CONTENT); - registerSetSlot1_21_2(ClientboundPackets1_21_9.CONTAINER_SET_SLOT); - registerAdvancements1_20_3(ClientboundPackets1_21_9.UPDATE_ADVANCEMENTS); - registerSetEquipment(ClientboundPackets1_21_9.SET_EQUIPMENT); - registerMerchantOffers1_20_5(ClientboundPackets1_21_9.MERCHANT_OFFERS); - registerContainerClick1_21_5(ServerboundPackets1_21_6.CONTAINER_CLICK); - registerSetCreativeModeSlot1_21_5(ServerboundPackets1_21_6.SET_CREATIVE_MODE_SLOT); - registerShowDialog(ClientboundPackets1_21_9.SHOW_DIALOG); - registerShowDialogDirect(ClientboundConfigurationPackets1_21_9.SHOW_DIALOG); - - final RecipeDisplayRewriter recipeRewriter = new RecipeDisplayRewriter1_21_5<>(protocol); - recipeRewriter.registerUpdateRecipes(ClientboundPackets1_21_9.UPDATE_RECIPES); - recipeRewriter.registerRecipeBookAdd(ClientboundPackets1_21_9.RECIPE_BOOK_ADD); - recipeRewriter.registerPlaceGhostRecipe(ClientboundPackets1_21_9.PLACE_GHOST_RECIPE); - protocol.registerClientbound(ClientboundPackets1_21_9.SET_BORDER_LERP_SIZE, wrapper -> { wrapper.passthrough(Types.DOUBLE); // oldSize wrapper.passthrough(Types.DOUBLE); // newSize diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_9to1_21_11/rewriter/EntityPacketRewriter1_21_11.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_9to1_21_11/rewriter/EntityPacketRewriter1_21_11.java index 48c94208e..8ba62dffc 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_9to1_21_11/rewriter/EntityPacketRewriter1_21_11.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_9to1_21_11/rewriter/EntityPacketRewriter1_21_11.java @@ -39,14 +39,6 @@ public final class EntityPacketRewriter1_21_11 extends EntityRewriter { final int action = wrapper.passthrough(Types.VAR_INT); // cancel spear "stab" packets sent by the client diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21to1_21_2/Protocol1_21To1_21_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21to1_21_2/Protocol1_21To1_21_2.java index 386836ad7..f72ddf612 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21to1_21_2/Protocol1_21To1_21_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21to1_21_2/Protocol1_21To1_21_2.java @@ -17,23 +17,24 @@ */ package com.viaversion.viaversion.protocols.v1_21to1_21_2; +import com.viaversion.nbt.tag.CompoundTag; 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.RegistryEntry; import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey; import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_2; -import com.viaversion.viaversion.api.minecraft.item.data.ChatType; -import com.viaversion.viaversion.api.protocol.AbstractProtocol; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.protocol.packet.State; import com.viaversion.viaversion.api.protocol.packet.provider.PacketTypesProvider; import com.viaversion.viaversion.api.protocol.packet.provider.SimplePacketTypesProvider; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; -import com.viaversion.viaversion.api.rewriter.ComponentRewriter; import com.viaversion.viaversion.api.type.Types; +import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2; import com.viaversion.viaversion.api.type.types.misc.ParticleType; import com.viaversion.viaversion.api.type.types.version.VersionedTypes; import com.viaversion.viaversion.api.type.types.version.VersionedTypesHolder; +import com.viaversion.viaversion.api.protocol.AbstractProtocol; import com.viaversion.viaversion.protocols.base.ClientboundLoginPackets; import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundConfigurationPackets1_20_5; import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundPacket1_20_5; @@ -56,9 +57,9 @@ import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.GroundFlagTrack import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.LastExplosionPowerStorage; import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.PlayerPositionStorage; import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.TeleportAckCancelStorage; -import com.viaversion.viaversion.rewriter.AttributeRewriter; +import com.viaversion.viaversion.rewriter.BlockRewriter; +import com.viaversion.viaversion.rewriter.RegistryDataRewriter; import com.viaversion.viaversion.rewriter.SoundRewriter; -import com.viaversion.viaversion.rewriter.StatisticsRewriter; import com.viaversion.viaversion.rewriter.TagRewriter; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; @@ -78,6 +79,8 @@ public final class Protocol1_21To1_21_2 extends AbstractProtocol tagRewriter = new TagRewriter<>(this); private final ComponentRewriter1_21_2 componentRewriter = new ComponentRewriter1_21_2(this); private final SoundRewriter soundRewriter = new SoundRewriter<>(this); + private final BlockRewriter blockRewriter = BlockRewriter.for1_20_2(this, ChunkType1_20_2::new); + private final RegistryDataRewriter registryDataRewriter = registryDataRewriter(); public Protocol1_21To1_21_2() { super(ClientboundPacket1_21.class, ClientboundPacket1_21_2.class, ServerboundPacket1_20_5.class, ServerboundPacket1_21_2.class); @@ -87,34 +90,6 @@ public final class Protocol1_21To1_21_2 extends AbstractProtocol(this).register(ClientboundPackets1_21.AWARD_STATS); - new AttributeRewriter<>(this).register1_21(ClientboundPackets1_21.UPDATE_ATTRIBUTES); - registerServerbound(ServerboundPackets1_21_2.CLIENT_INFORMATION, this::clientInformation); registerServerbound(ServerboundConfigurationPackets1_20_5.CLIENT_INFORMATION, this::clientInformation); @@ -140,7 +115,7 @@ public final class Protocol1_21To1_21_2 extends AbstractProtocol { + replaceClientbound(ClientboundPackets1_21.PLAYER_INFO_UPDATE, wrapper -> { final BitSet actions = wrapper.passthroughAndMap(Types.PROFILE_ACTIONS_ENUM1_19_3, Types.PROFILE_ACTIONS_ENUM1_21_2); if (!actions.get(5)) { // Update display name return; @@ -314,6 +289,16 @@ public final class Protocol1_21To1_21_2 extends AbstractProtocol getBlockRewriter() { + return blockRewriter; + } + + @Override + public RegistryDataRewriter getRegistryDataRewriter() { + return registryDataRewriter; + } + @Override public ParticleRewriter1_21_2 getParticleRewriter() { return particleRewriter; @@ -325,7 +310,7 @@ public final class Protocol1_21To1_21_2 extends AbstractProtocol tag.putString("type", "change_item_damage")); + return registryDataRewriter; + } } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21to1_21_2/rewriter/BlockItemPacketRewriter1_21_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21to1_21_2/rewriter/BlockItemPacketRewriter1_21_2.java index c455debbf..b0ffc2e5a 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21to1_21_2/rewriter/BlockItemPacketRewriter1_21_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21to1_21_2/rewriter/BlockItemPacketRewriter1_21_2.java @@ -49,7 +49,6 @@ import com.viaversion.viaversion.api.minecraft.item.data.LockCode; import com.viaversion.viaversion.api.minecraft.item.data.PotionEffect; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.type.Types; -import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2; import com.viaversion.viaversion.api.type.types.version.VersionedTypes; import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundPacket1_21; import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundPackets1_21; @@ -60,7 +59,6 @@ import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ServerboundPacke import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.BundleStateTracker; import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.ChunkLoadTracker; import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.LastExplosionPowerStorage; -import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.StructuredItemRewriter; import com.viaversion.viaversion.util.ComponentUtil; import com.viaversion.viaversion.util.Key; @@ -96,26 +94,14 @@ public final class BlockItemPacketRewriter1_21_2 extends StructuredItemRewriter< @Override public void registerPackets() { - final BlockRewriter blockRewriter = BlockRewriter.for1_20_2(protocol); - blockRewriter.registerBlockEvent(ClientboundPackets1_21.BLOCK_EVENT); - blockRewriter.registerBlockUpdate(ClientboundPackets1_21.BLOCK_UPDATE); - blockRewriter.registerSectionBlocksUpdate1_20(ClientboundPackets1_21.SECTION_BLOCKS_UPDATE); - blockRewriter.registerLevelEvent1_21(ClientboundPackets1_21.LEVEL_EVENT, 2001); - blockRewriter.registerBlockEntityData(ClientboundPackets1_21.BLOCK_ENTITY_DATA); - - registerAdvancements1_20_3(ClientboundPackets1_21.UPDATE_ADVANCEMENTS); - registerSetEquipment(ClientboundPackets1_21.SET_EQUIPMENT); - registerMerchantOffers1_20_5(ClientboundPackets1_21.MERCHANT_OFFERS); - registerSetCreativeModeSlot(ServerboundPackets1_21_2.SET_CREATIVE_MODE_SLOT); - - protocol.registerClientbound(ClientboundPackets1_21.COOLDOWN, wrapper -> { + protocol.replaceClientbound(ClientboundPackets1_21.COOLDOWN, wrapper -> { final MappingData mappingData = protocol.getMappingData(); final int itemId = wrapper.read(Types.VAR_INT); final int mappedItemId = mappingData.getNewItemId(itemId); wrapper.write(Types.STRING, mappingData.getFullItemMappings().mappedIdentifier(mappedItemId)); }); - protocol.registerClientbound(ClientboundPackets1_21.CONTAINER_SET_CONTENT, wrapper -> { + protocol.replaceClientbound(ClientboundPackets1_21.CONTAINER_SET_CONTENT, wrapper -> { unsignedByteToVarInt(wrapper); wrapper.passthrough(Types.VAR_INT); // State id final Item[] items = wrapper.read(itemArrayType()); @@ -125,7 +111,7 @@ public final class BlockItemPacketRewriter1_21_2 extends StructuredItemRewriter< } passthroughClientboundItem(wrapper); }); - protocol.registerClientbound(ClientboundPackets1_21.CONTAINER_SET_SLOT, wrapper -> { + protocol.replaceClientbound(ClientboundPackets1_21.CONTAINER_SET_SLOT, wrapper -> { byteToVarInt(wrapper); final int containerId = wrapper.get(Types.VAR_INT, 0); if (containerId == -1) { // cursor item @@ -151,7 +137,7 @@ public final class BlockItemPacketRewriter1_21_2 extends StructuredItemRewriter< protocol.registerClientbound(ClientboundPackets1_21.HORSE_SCREEN_OPEN, this::unsignedByteToVarInt); protocol.registerClientbound(ClientboundPackets1_21.SET_CARRIED_ITEM, ClientboundPackets1_21_2.SET_HELD_SLOT); protocol.registerServerbound(ServerboundPackets1_21_2.CONTAINER_CLOSE, this::varIntToByte); - protocol.registerServerbound(ServerboundPackets1_21_2.CONTAINER_CLICK, wrapper -> { + protocol.replaceServerbound(ServerboundPackets1_21_2.CONTAINER_CLICK, wrapper -> { varIntToByte(wrapper); wrapper.passthrough(Types.VAR_INT); // State id wrapper.passthrough(Types.SHORT); // Slot @@ -194,7 +180,7 @@ public final class BlockItemPacketRewriter1_21_2 extends StructuredItemRewriter< wrapper.read(Types.BOOLEAN); // World border hit }); - protocol.registerClientbound(ClientboundPackets1_21.EXPLODE, wrapper -> { + protocol.replaceClientbound(ClientboundPackets1_21.EXPLODE, wrapper -> { final int centerX = (int) Math.floor(wrapper.passthrough(Types.DOUBLE)); // Center X final int centerY = (int) Math.floor(wrapper.passthrough(Types.DOUBLE)); // Center Y final int centerZ = (int) Math.floor(wrapper.passthrough(Types.DOUBLE)); // Center Z @@ -368,8 +354,8 @@ public final class BlockItemPacketRewriter1_21_2 extends StructuredItemRewriter< wrapper.write(Types.BOOLEAN, state == RECIPE_INIT); // Replace }); - protocol.registerClientbound(ClientboundPackets1_21.LEVEL_CHUNK_WITH_LIGHT, wrapper -> { - final Chunk chunk = blockRewriter.handleChunk1_19(wrapper, ChunkType1_20_2::new); + protocol.replaceClientbound(ClientboundPackets1_21.LEVEL_CHUNK_WITH_LIGHT, wrapper -> { + final Chunk chunk = protocol.getBlockRewriter().handleChunk1_18(wrapper); final Mappings blockEntityMappings = protocol.getMappingData().getBlockEntityMappings(); if (blockEntityMappings != null) { final List blockEntities = chunk.blockEntities(); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21to1_21_2/rewriter/EntityPacketRewriter1_21_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21to1_21_2/rewriter/EntityPacketRewriter1_21_2.java index e72f5100f..ae39a4e80 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_21to1_21_2/rewriter/EntityPacketRewriter1_21_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_21to1_21_2/rewriter/EntityPacketRewriter1_21_2.java @@ -44,7 +44,6 @@ import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.GroundFlagTrack import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.PlayerPositionStorage; import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.TeleportAckCancelStorage; import com.viaversion.viaversion.rewriter.EntityRewriter; -import com.viaversion.viaversion.rewriter.RegistryDataRewriter; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -72,10 +71,6 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter { final int entityType = wrapper.get(Types.VAR_INT, 1); @@ -118,10 +113,7 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter { + protocol.replaceClientbound(ClientboundPackets1_21.RESPAWN, wrapper -> { final int dimensionId = wrapper.passthrough(Types.VAR_INT); final String world = wrapper.passthrough(Types.STRING); wrapper.passthrough(Types.LONG); // Seed @@ -452,27 +444,6 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter tag.putString("type", "change_item_damage")); - return registryDataRewriter; - } - private void handleOnGround(final PacketWrapper wrapper) { final GroundFlagTracker tracker = wrapper.user().get(GroundFlagTracker.class); diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/AttributeRewriter.java b/common/src/main/java/com/viaversion/viaversion/rewriter/AttributeRewriter.java index 5427b1ffd..49549d49c 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/AttributeRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/AttributeRewriter.java @@ -17,6 +17,7 @@ */ package com.viaversion.viaversion.rewriter; +import com.viaversion.viaversion.api.data.Mappings; import com.viaversion.viaversion.api.protocol.Protocol; import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; import com.viaversion.viaversion.api.type.Types; @@ -29,6 +30,9 @@ public class AttributeRewriter { } public void register1_21(C packetType) { + if (protocol.getMappingData() == null || Mappings.isIntIdIdentity(protocol.getMappingData().getAttributeMappings())) { + return; + } protocol.registerClientbound(packetType, wrapper -> { wrapper.passthrough(Types.VAR_INT); // Entity ID diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/BlockRewriter.java b/common/src/main/java/com/viaversion/viaversion/rewriter/BlockRewriter.java index c2e6488e7..0d34e7ebe 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/BlockRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/BlockRewriter.java @@ -48,32 +48,51 @@ public class BlockRewriter { protected final Protocol protocol; private final Type positionType; private final Type compoundTagType; + private final ChunkTypeSupplier chunkTypeSupplier; + private final ChunkTypeSupplier mappedChunkTypeSupplier; - public BlockRewriter(Protocol protocol, Type positionType, Type compoundTagType) { + public BlockRewriter( + final Protocol protocol, + final Type positionType, final Type compoundTagType, + final ChunkTypeSupplier chunkTypeSupplier, @Nullable final ChunkTypeSupplier mappedChunkTypeSupplier + ) { this.protocol = protocol; this.positionType = positionType; this.compoundTagType = compoundTagType; + this.chunkTypeSupplier = chunkTypeSupplier; + this.mappedChunkTypeSupplier = mappedChunkTypeSupplier; } public static BlockRewriter legacy(final Protocol protocol) { - return new BlockRewriter<>(protocol, Types.BLOCK_POSITION1_8, Types.NAMED_COMPOUND_TAG); + return new BlockRewriter<>(protocol, Types.BLOCK_POSITION1_8, Types.NAMED_COMPOUND_TAG, null, null); } public static BlockRewriter for1_14(final Protocol protocol) { - return new BlockRewriter<>(protocol, Types.BLOCK_POSITION1_14, Types.NAMED_COMPOUND_TAG); + return new BlockRewriter<>(protocol, Types.BLOCK_POSITION1_14, Types.NAMED_COMPOUND_TAG, null, null); } - public static BlockRewriter for1_20_2(final Protocol protocol) { - return new BlockRewriter<>(protocol, Types.BLOCK_POSITION1_14, Types.COMPOUND_TAG); + public static BlockRewriter for1_18(final Protocol protocol, final ChunkTypeSupplier chunkTypeSupplier) { + return for1_18(protocol, chunkTypeSupplier, null); + } + + public static BlockRewriter for1_18(final Protocol protocol, final ChunkTypeSupplier chunkTypeSupplier, final ChunkTypeSupplier mappedChunkTypeSupplier) { + return new BlockRewriter<>(protocol, Types.BLOCK_POSITION1_14, Types.NAMED_COMPOUND_TAG, chunkTypeSupplier, mappedChunkTypeSupplier); + } + + public static BlockRewriter for1_20_2(final Protocol protocol, final ChunkTypeSupplier chunkTypeSupplier) { + return for1_20_2(protocol, chunkTypeSupplier, null); + } + + public static BlockRewriter for1_20_2(final Protocol protocol, final ChunkTypeSupplier chunkTypeSupplier, final ChunkTypeSupplier mappedChunkTypeSupplier) { + return new BlockRewriter<>(protocol, Types.BLOCK_POSITION1_14, Types.COMPOUND_TAG, chunkTypeSupplier, mappedChunkTypeSupplier); } // See the block package for more recent versions public void registerBlockEvent(C packetType) { + if (Mappings.isIntIdIdentity(protocol.getMappingData().getBlockMappings())) { + return; + } protocol.registerClientbound(packetType, wrapper -> { - if (protocol.getMappingData().getBlockMappings() == null) { - return; - } - wrapper.passthrough(positionType); // Location wrapper.passthrough(Types.UNSIGNED_BYTE); // Action id wrapper.passthrough(Types.UNSIGNED_BYTE); // Action param @@ -91,6 +110,9 @@ public class BlockRewriter { } public void registerBlockUpdate(C packetType) { + if (Mappings.isIntIdIdentity(protocol.getMappingData().getBlockStateMappings())) { + return; + } protocol.registerClientbound(packetType, wrapper -> { wrapper.passthrough(positionType); @@ -100,6 +122,9 @@ public class BlockRewriter { } public void registerChunkBlocksUpdate(C packetType) { + if (Mappings.isIntIdIdentity(protocol.getMappingData().getBlockStateMappings())) { + return; + } protocol.registerClientbound(packetType, wrapper -> { wrapper.passthrough(Types.INT); // Chunk X wrapper.passthrough(Types.INT); // Chunk Z @@ -110,6 +135,9 @@ public class BlockRewriter { } public void registerSectionBlocksUpdate(C packetType) { + if (Mappings.isIntIdIdentity(protocol.getMappingData().getBlockStateMappings())) { + return; + } protocol.registerClientbound(packetType, wrapper -> { wrapper.passthrough(Types.LONG); // Chunk position wrapper.passthrough(Types.BOOLEAN); // Suppress light updates @@ -120,6 +148,9 @@ public class BlockRewriter { } public void registerSectionBlocksUpdate1_20(C packetType) { + if (Mappings.isIntIdIdentity(protocol.getMappingData().getBlockStateMappings())) { + return; + } protocol.registerClientbound(packetType, wrapper -> { wrapper.passthrough(Types.LONG); // Chunk position for (BlockChangeRecord record : wrapper.passthrough(Types.VAR_LONG_BLOCK_CHANGE_ARRAY)) { @@ -133,13 +164,25 @@ public class BlockRewriter { registerBlockUpdate(packetType); } - public void registerLevelEvent(C packetType, int playRecordId, int blockBreakId) { + public void registerLevelEvent1_13(C packetType) { + registerLevelEvent(packetType, 1010, 2001); + } + + public void registerLevelEvent1_21(C packetType) { + registerLevelEvent(packetType, -1, 2001); + } + + private void registerLevelEvent(C packetType, int playRecordId, int blockBreakId) { + final MappingData mappingData = protocol.getMappingData(); + if (mappingData == null + || Mappings.isIntIdIdentity(mappingData.getItemMappings()) && Mappings.isIntIdIdentity(mappingData.getBlockStateMappings())) { + return; + } protocol.registerClientbound(packetType, wrapper -> { final int id = wrapper.passthrough(Types.INT); wrapper.passthrough(positionType); final int data = wrapper.read(Types.INT); - final MappingData mappingData = protocol.getMappingData(); if (playRecordId != -1 && id == playRecordId && mappingData.getItemMappings() != null) { wrapper.write(Types.INT, mappingData.getNewItemId(data)); } else if (id == blockBreakId && mappingData.getBlockStateMappings() != null) { @@ -150,10 +193,6 @@ public class BlockRewriter { }); } - public void registerLevelEvent1_21(C packetType, int blockBreakId) { - registerLevelEvent(packetType, -1, blockBreakId); - } - public void registerLevelChunk(C packetType, Type chunkType, Type newChunkType) { registerLevelChunk(packetType, chunkType, newChunkType, null); } @@ -185,9 +224,9 @@ public class BlockRewriter { } } - public void registerLevelChunk1_19(C packetType, ChunkTypeSupplier chunkTypeSupplier) { + public void registerLevelChunk1_18(C packetType) { protocol.registerClientbound(packetType, wrapper -> { - final Chunk chunk = handleChunk1_19(wrapper, chunkTypeSupplier); + final Chunk chunk = handleChunk1_18(wrapper); handleBlockEntities(chunk, wrapper.user()); }); } @@ -230,21 +269,19 @@ public class BlockRewriter { } } - public Chunk handleChunk1_19(PacketWrapper wrapper, ChunkTypeSupplier chunkTypeSupplier) { - return handleChunk1_19(wrapper, chunkTypeSupplier, null); - } - - public Chunk handleChunk1_19(PacketWrapper wrapper, ChunkTypeSupplier chunkTypeSupplier, @Nullable ChunkTypeSupplier mappedChunkTypeSupplier) { + public Chunk handleChunk1_18(PacketWrapper wrapper) { final EntityTracker tracker = protocol.getEntityRewriter().tracker(wrapper.user()); Preconditions.checkArgument(tracker.biomesSent() != -1, "Biome count not set"); Preconditions.checkArgument(tracker.currentWorldSectionHeight() != -1, "Section height not set"); - final Type chunkType = chunkTypeSupplier.supply(tracker.currentWorldSectionHeight(), - MathUtil.ceilLog2(protocol.getMappingData().getBlockStateMappings().mappedSize()), - MathUtil.ceilLog2(tracker.biomesSent())); - final Type mappedChunkType = mappedChunkTypeSupplier != null ? mappedChunkTypeSupplier.supply(tracker.currentWorldSectionHeight(), - MathUtil.ceilLog2(protocol.getMappingData().getBlockStateMappings().mappedSize()), - MathUtil.ceilLog2(tracker.biomesSent())) : chunkType; + final Type chunkType = createChunkType(chunkTypeSupplier, tracker, false); + final Type mappedChunkType = mappedChunkTypeSupplier != null + ? createChunkType(mappedChunkTypeSupplier, tracker, true) + : chunkType; final Chunk chunk = wrapper.passthroughAndMap(chunkType, mappedChunkType); + if (Mappings.isIntIdIdentity(protocol.getMappingData().getBlockStateMappings())) { + return chunk; + } + for (final ChunkSection section : chunk.getSections()) { final DataPalette blockPalette = section.palette(PaletteType.BLOCKS); for (int i = 0; i < blockPalette.size(); i++) { @@ -255,7 +292,16 @@ public class BlockRewriter { return chunk; } - public void registerBlockEntityData(C packetType) { + protected Type createChunkType(ChunkTypeSupplier supplier, EntityTracker tracker, boolean mapped) { + final Mappings mappings = protocol.getMappingData().getBlockStateMappings(); + return supplier.supply( + tracker.currentWorldSectionHeight(), + MathUtil.ceilLog2(mapped ? mappings.mappedSize() : mappings.size()), + MathUtil.ceilLog2(tracker.biomesSent()) + ); + } + + public void registerBlockEntityData1_18(C packetType) { protocol.registerClientbound(packetType, wrapper -> { final BlockPosition position = wrapper.passthrough(positionType); diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/CommandRewriter.java b/common/src/main/java/com/viaversion/viaversion/rewriter/CommandRewriter.java index 7ad1d9e67..90da5271f 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/CommandRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/CommandRewriter.java @@ -19,6 +19,7 @@ package com.viaversion.viaversion.rewriter; import com.google.common.base.Preconditions; import com.viaversion.viaversion.api.data.FullMappings; +import com.viaversion.viaversion.api.data.Mappings; import com.viaversion.viaversion.api.protocol.Protocol; import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; @@ -108,62 +109,65 @@ public class CommandRewriter { } public void registerDeclareCommands1_19(C packetType) { - protocol.registerClientbound(packetType, wrapper -> { - int size = wrapper.passthrough(Types.VAR_INT); - for (int i = 0; i < size; i++) { - byte flags = wrapper.passthrough(Types.BYTE); - wrapper.passthrough(Types.VAR_INT_ARRAY_PRIMITIVE); // Children indices - if ((flags & 0x08) != 0) { - wrapper.passthrough(Types.VAR_INT); // Redirect node index - } + // Don't check for identity mappings here, since overrides may be needed outside of id remapping + protocol.registerClientbound(packetType, this::handle1_19); + } - byte nodeType = (byte) (flags & 0x03); - if (nodeType == 1 || nodeType == 2) { // Literal/argument node - wrapper.passthrough(Types.STRING); // Name - } - - if (nodeType == 2) { // Argument node - int argumentTypeId = wrapper.read(Types.VAR_INT); - String argumentType = argumentType(argumentTypeId); - if (argumentType == null) { - // Modded servers may send unknown argument types that are ignored by the client - // Adjust the id to the hopefully still assumed out-of-bounds pos... - wrapper.write(Types.VAR_INT, mapInvalidArgumentType(argumentTypeId)); - continue; - } - - String newArgumentType = handleArgumentType(argumentType); - Preconditions.checkNotNull(newArgumentType, "No mapping for argument type %s", argumentType); - - boolean removedRegistryArgument = false; - if (protocol.getRegistryDataRewriter() != null && REGISTRY_ARGUMENT_TYPES.contains(Key.stripMinecraftNamespace(newArgumentType))) { - final String registry = wrapper.read(Types.STRING); - if (protocol.getRegistryDataRewriter().shouldRemoveRegistry(registry)) { - // Map removed registry arguments to a plain quotable string - removedRegistryArgument = true; - wrapper.write(Types.VAR_INT, mappedArgumentTypeId("brigadier:string")); - wrapper.write(Types.VAR_INT, 1); - } else { - // Keep reading - wrapper.write(Types.STRING, registry); - wrapper.rewindReader(1); - } - } - - if (!removedRegistryArgument) { - wrapper.write(Types.VAR_INT, mappedArgumentTypeId(newArgumentType)); - // Call the handler using the previous name - handleArgument(wrapper, argumentType); - } - - if ((flags & 0x10) != 0) { - wrapper.passthrough(Types.STRING); // Suggestion type - } - } + public void handle1_19(PacketWrapper wrapper) { + int size = wrapper.passthrough(Types.VAR_INT); + for (int i = 0; i < size; i++) { + byte flags = wrapper.passthrough(Types.BYTE); + wrapper.passthrough(Types.VAR_INT_ARRAY_PRIMITIVE); // Children indices + if ((flags & 0x08) != 0) { + wrapper.passthrough(Types.VAR_INT); // Redirect node index } - wrapper.passthrough(Types.VAR_INT); // Root node index - }); + byte nodeType = (byte) (flags & 0x03); + if (nodeType == 1 || nodeType == 2) { // Literal/argument node + wrapper.passthrough(Types.STRING); // Name + } + + if (nodeType == 2) { // Argument node + int argumentTypeId = wrapper.read(Types.VAR_INT); + String argumentType = argumentType(argumentTypeId); + if (argumentType == null) { + // Modded servers may send unknown argument types that are ignored by the client + // Adjust the id to the hopefully still assumed out-of-bounds pos... + wrapper.write(Types.VAR_INT, mapInvalidArgumentType(argumentTypeId)); + continue; + } + + String newArgumentType = handleArgumentType(argumentType); + Preconditions.checkNotNull(newArgumentType, "No mapping for argument type %s", argumentType); + + boolean removedRegistryArgument = false; + if (protocol.getRegistryDataRewriter() != null && REGISTRY_ARGUMENT_TYPES.contains(Key.stripMinecraftNamespace(newArgumentType))) { + final String registry = wrapper.read(Types.STRING); + if (protocol.getRegistryDataRewriter().shouldRemoveRegistry(registry)) { + // Map removed registry arguments to a plain quotable string + removedRegistryArgument = true; + wrapper.write(Types.VAR_INT, mappedArgumentTypeId("brigadier:string")); + wrapper.write(Types.VAR_INT, 1); + } else { + // Keep reading + wrapper.write(Types.STRING, registry); + wrapper.rewindReader(1); + } + } + + if (!removedRegistryArgument) { + wrapper.write(Types.VAR_INT, mappedArgumentTypeId(newArgumentType)); + // Call the handler using the previous name + handleArgument(wrapper, argumentType); + } + + if ((flags & 0x10) != 0) { + wrapper.passthrough(Types.STRING); // Suggestion type + } + } + } + + wrapper.passthrough(Types.VAR_INT); // Root node index } public void handleArgument(PacketWrapper wrapper, String argumentType) { diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/EntityRewriter.java b/common/src/main/java/com/viaversion/viaversion/rewriter/EntityRewriter.java index 033394116..4becb361a 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/EntityRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/EntityRewriter.java @@ -155,6 +155,10 @@ public abstract class EntityRewriter { int entityId = wrapper.get(Types.VAR_INT, 0); EntityType entityType = tracker(wrapper.user()).entityType(entityId); - if (entityType == fallingBlockType) { + if (entityType == typeFromId("falling_block")) { wrapper.set(Types.INT, 0, protocol.getMappingData().getNewBlockStateId(wrapper.get(Types.INT, 0))); } }); @@ -292,7 +296,7 @@ public abstract class EntityRewriter { final int entityId = wrapper.passthrough(Types.VAR_INT); wrapper.passthrough(Types.UUID); // Entity UUID @@ -306,14 +310,14 @@ public abstract class EntityRewriter { final int entityId = wrapper.passthrough(Types.VAR_INT); wrapper.passthrough(Types.UUID); // Entity UUID @@ -327,7 +331,7 @@ public abstract class EntityRewriter { - wrapper.passthrough(Types.VAR_INT); // Container id - handleMenuType(wrapper); - }); - } - - public void handleMenuType(final PacketWrapper wrapper) { - final int windowType = wrapper.read(Types.VAR_INT); - final int mappedId = protocol.getMappingData().getMenuMappings().getNewId(windowType); - if (mappedId == -1) { - wrapper.cancel(); + if ((protocol.getMappingData() == null || Mappings.isIntIdIdentity(protocol.getMappingData().getMenuMappings())) + && protocol.getComponentRewriter() == null) { return; } + protocol.registerClientbound(packetType, wrapper -> { + wrapper.passthrough(Types.VAR_INT); // Container id - wrapper.write(Types.VAR_INT, mappedId); + int windowType = wrapper.read(Types.VAR_INT); + if (protocol.getMappingData() != null && protocol.getMappingData().getMenuMappings() != null) { + windowType = protocol.getMappingData().getMenuMappings().getNewId(windowType); + if (windowType == -1) { + wrapper.cancel(); + return; + } + } + wrapper.write(Types.VAR_INT, windowType); + + if (protocol.getComponentRewriter() != null) { + protocol.getComponentRewriter().passthroughAndProcess(wrapper); + } + }); } public void registerSetSlot(C packetType) { @@ -304,6 +312,9 @@ public class ItemRewriter { int itemId = wrapper.read(Types.VAR_INT); wrapper.write(Types.VAR_INT, protocol.getMappingData().getNewItemId(itemId)); @@ -311,6 +322,9 @@ public class ItemRewriter { String itemIdentifier = wrapper.read(Types.STRING); if (itemIdentifier != null) { @@ -354,8 +368,7 @@ public class ItemRewriter { wrapper.passthrough(Types.VAR_INT); int size = wrapper.passthrough(Types.UNSIGNED_BYTE); @@ -512,17 +525,15 @@ public class ItemRewriter { wrapper.passthrough(Types.UNSIGNED_BYTE); // Container id - Mappings mappings = protocol.getMappingData().getEnchantmentMappings(); - if (mappings == null) { - return; - } - short property = wrapper.passthrough(Types.SHORT); if (property >= 4 && property <= 6) { // Enchantment id - short enchantmentId = (short) mappings.getNewId(wrapper.read(Types.SHORT)); + short enchantmentId = (short) protocol.getMappingData().getEnchantmentMappings().getNewId(wrapper.read(Types.SHORT)); wrapper.write(Types.SHORT, enchantmentId); } }); diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/RecipeDisplayRewriter.java b/common/src/main/java/com/viaversion/viaversion/rewriter/RecipeDisplayRewriter.java index e660b8e12..ed0a2f330 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/RecipeDisplayRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/RecipeDisplayRewriter.java @@ -18,6 +18,8 @@ package com.viaversion.viaversion.rewriter; import com.viaversion.viaversion.api.data.FullMappings; +import com.viaversion.viaversion.api.data.MappingData; +import com.viaversion.viaversion.api.data.Mappings; import com.viaversion.viaversion.api.minecraft.HolderSet; import com.viaversion.viaversion.api.minecraft.item.Item; import com.viaversion.viaversion.api.protocol.Protocol; @@ -215,8 +217,9 @@ public class RecipeDisplayRewriter { } protected int rewriteItemId(final int id) { - if (protocol.getMappingData() != null && protocol.getMappingData().getItemMappings() != null) { - return protocol.getMappingData().getItemMappings().getNewIdOrDefault(id, id); + final MappingData mappingData = protocol.getMappingData(); + if (mappingData != null && mappingData.getItemMappings() != null) { + return mappingData.getItemMappings().getNewIdOrDefault(id, id); } return id; } diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/RegistryDataRewriter.java b/common/src/main/java/com/viaversion/viaversion/rewriter/RegistryDataRewriter.java index 39b819bd9..38493258f 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/RegistryDataRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/RegistryDataRewriter.java @@ -24,6 +24,7 @@ import com.viaversion.nbt.tag.Tag; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.data.FullMappings; import com.viaversion.viaversion.api.data.MappingData; +import com.viaversion.viaversion.api.data.Mappings; import com.viaversion.viaversion.api.data.entity.DimensionData; import com.viaversion.viaversion.api.minecraft.RegistryEntry; import com.viaversion.viaversion.api.protocol.Protocol; @@ -58,6 +59,7 @@ public class RegistryDataRewriter implements com.viaversion.viaversion.api.rewri this.protocol = protocol; } + @Override public void handle(final PacketWrapper wrapper) { final String registryKey = Key.stripMinecraftNamespace(wrapper.passthrough(Types.STRING)); RegistryEntry[] entries = wrapper.read(Types.REGISTRY_ENTRY_ARRAY); @@ -209,15 +211,13 @@ public class RegistryDataRewriter implements com.viaversion.viaversion.api.rewri } public void updateEnchantments(final UserConnection connection, final RegistryEntry[] entries) { - final List identifiers = new ArrayList<>(entries.length); for (final RegistryEntry entry : entries) { - identifiers.add(entry.key()); if (entry.tag() == null) { continue; } final CompoundTag tag = (CompoundTag) entry.tag(); - if (protocol.getMappingData().getFullItemMappings() != null) { + if (!Mappings.isFullIdentity(protocol.getMappingData().getFullItemMappings())) { updateItemList(tag.getListTag("supported_items", StringTag.class)); updateItemList(tag.getListTag("primary_items", StringTag.class)); } @@ -250,7 +250,7 @@ public class RegistryDataRewriter implements com.viaversion.viaversion.api.rewri } public void updateTrimMaterials(final RegistryEntry[] entries) { - if (protocol.getMappingData().getFullItemMappings() == null) { + if (Mappings.isFullIdentity(protocol.getMappingData().getFullItemMappings())) { return; } @@ -364,7 +364,7 @@ public class RegistryDataRewriter implements com.viaversion.viaversion.api.rewri protected void updateType(final CompoundTag tag, final String key, final FullMappings mappings) { final Tag typeTag = tag.get(key); - if (typeTag == null || mappings == null) { + if (typeTag == null || Mappings.isFullIdentity(mappings)) { return; } @@ -425,4 +425,9 @@ public class RegistryDataRewriter implements com.viaversion.viaversion.api.rewri public boolean shouldRemoveRegistry(final String registryKey) { return this.toRemove.contains(Key.stripMinecraftNamespace(registryKey)); } + + @Override + public boolean hasRegistriesToRemove() { + return !this.toRemove.isEmpty(); + } } diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/SoundRewriter.java b/common/src/main/java/com/viaversion/viaversion/rewriter/SoundRewriter.java index a347de492..9d2c05f32 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/SoundRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/SoundRewriter.java @@ -17,28 +17,26 @@ */ package com.viaversion.viaversion.rewriter; +import com.viaversion.viaversion.api.data.Mappings; import com.viaversion.viaversion.api.minecraft.Holder; import com.viaversion.viaversion.api.minecraft.SoundEvent; import com.viaversion.viaversion.api.protocol.Protocol; import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; +import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.protocol.remapper.PacketHandler; import com.viaversion.viaversion.api.type.Types; public class SoundRewriter { protected final Protocol protocol; - protected final IdRewriteFunction idRewriter; public SoundRewriter(Protocol protocol) { this.protocol = protocol; - this.idRewriter = id -> protocol.getMappingData().getSoundMappings().getNewId(id); - } - - public SoundRewriter(Protocol protocol, IdRewriteFunction idRewriter) { - this.protocol = protocol; - this.idRewriter = idRewriter; } public void registerSound(C packetType) { + if (protocol.getMappingData() == null || Mappings.isIntIdIdentity(protocol.getMappingData().getSoundMappings())) { + return; + } protocol.registerClientbound(packetType, wrapper -> { wrapper.passthrough(Types.VAR_INT); // Sound id getSoundHandler().handle(wrapper); @@ -46,7 +44,9 @@ public class SoundRewriter { } public void registerSound1_19_3(C packetType) { - protocol.registerClientbound(packetType, soundHolderHandler()); + if (protocol.getMappingData() != null && !Mappings.isFullIdentity(protocol.getMappingData().getFullSoundMappings())) { + protocol.registerClientbound(packetType, soundHolderHandler()); + } } public PacketHandler soundHolderHandler() { @@ -54,11 +54,11 @@ public class SoundRewriter { Holder soundEventHolder = wrapper.read(Types.SOUND_EVENT); if (soundEventHolder.isDirect()) { // Is followed by the resource loation - wrapper.write(Types.SOUND_EVENT, soundEventHolder); + wrapper.write(Types.SOUND_EVENT, rewriteSoundEvent(wrapper, soundEventHolder)); return; } - final int mappedId = idRewriter.rewrite(soundEventHolder.id()); + final int mappedId = protocol.getMappingData().getSoundMappings().getNewId(soundEventHolder.id()); if (mappedId == -1) { wrapper.cancel(); return; @@ -72,10 +72,22 @@ public class SoundRewriter { }; } + public Holder rewriteSoundEvent(final PacketWrapper wrapper, final Holder soundEventHolder) { + final SoundEvent soundEvent = soundEventHolder.value(); + final String mappedIdentifier = protocol.getMappingData().getFullSoundMappings().mappedIdentifier(soundEvent.identifier()); + if (mappedIdentifier != null) { + if (!mappedIdentifier.isEmpty()) { + return Holder.of(soundEvent.withIdentifier(mappedIdentifier)); + } + wrapper.cancel(); + } + return soundEventHolder; + } + public PacketHandler getSoundHandler() { return wrapper -> { int soundId = wrapper.get(Types.VAR_INT, 0); - int mappedId = idRewriter.rewrite(soundId); + int mappedId = protocol.getMappingData().getSoundMappings().getNewId(soundId); if (mappedId == -1) { wrapper.cancel(); } else if (soundId != mappedId) { diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/StatisticsRewriter.java b/common/src/main/java/com/viaversion/viaversion/rewriter/StatisticsRewriter.java index 5bc99ec5c..957efee3d 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/StatisticsRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/StatisticsRewriter.java @@ -17,6 +17,8 @@ */ package com.viaversion.viaversion.rewriter; +import com.viaversion.viaversion.api.data.MappingData; +import com.viaversion.viaversion.api.data.Mappings; import com.viaversion.viaversion.api.minecraft.RegistryType; import com.viaversion.viaversion.api.protocol.Protocol; import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; @@ -32,6 +34,14 @@ public class StatisticsRewriter { } public void register(C packetType) { + final MappingData mappingData = protocol.getMappingData(); + if (mappingData == null || Mappings.isIntIdIdentity(mappingData.getBlockMappings()) + && Mappings.isIntIdIdentity(mappingData.getItemMappings()) + && Mappings.isIntIdIdentity(mappingData.getEntityMappings()) + && Mappings.isIntIdIdentity(mappingData.getStatisticsMappings())) { + return; + } + protocol.registerClientbound(packetType, wrapper -> { int size = wrapper.passthrough(Types.VAR_INT); int newSize = size; @@ -39,9 +49,9 @@ public class StatisticsRewriter { int categoryId = wrapper.read(Types.VAR_INT); int statisticId = wrapper.read(Types.VAR_INT); int value = wrapper.read(Types.VAR_INT); - if (categoryId == CUSTOM_STATS_CATEGORY && protocol.getMappingData().getStatisticsMappings() != null) { + if (categoryId == CUSTOM_STATS_CATEGORY && mappingData.getStatisticsMappings() != null) { // Rewrite custom statistics id - statisticId = protocol.getMappingData().getStatisticsMappings().getNewId(statisticId); + statisticId = mappingData.getStatisticsMappings().getNewId(statisticId); if (statisticId == -1) { // Remove entry newSize--; diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/TagRewriter.java b/common/src/main/java/com/viaversion/viaversion/rewriter/TagRewriter.java index 7ab59a4ca..2499cf501 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/TagRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/TagRewriter.java @@ -18,6 +18,7 @@ package com.viaversion.viaversion.rewriter; import com.viaversion.viaversion.api.data.MappingData; +import com.viaversion.viaversion.api.data.Mappings; import com.viaversion.viaversion.api.minecraft.RegistryType; import com.viaversion.viaversion.api.minecraft.TagData; import com.viaversion.viaversion.api.minecraft.entities.EntityType; @@ -293,10 +294,10 @@ public class TagRewriter implements com.viavers public @Nullable IdRewriteFunction getRewriter(RegistryType tagType) { MappingData mappingData = protocol.getMappingData(); return switch (tagType) { - case BLOCK -> mappingData != null && mappingData.getBlockMappings() != null ? mappingData::getNewBlockId : null; - case ITEM -> mappingData != null && mappingData.getItemMappings() != null ? mappingData::getNewItemId : null; - case ENTITY -> protocol.getEntityRewriter() != null ? id -> protocol.getEntityRewriter().newEntityId(id) : null; - case ENCHANTMENT -> mappingData != null && mappingData.getEnchantmentMappings() != null ? id -> mappingData.getEnchantmentMappings().getNewId(id) : null; + case BLOCK -> mappingData != null && !Mappings.isIntIdIdentity(mappingData.getBlockMappings()) ? mappingData::getNewBlockId : null; + case ITEM -> mappingData != null && !Mappings.isIntIdIdentity(mappingData.getItemMappings())? mappingData::getNewItemId : null; + case ENCHANTMENT -> mappingData != null && !Mappings.isIntIdIdentity(mappingData.getEnchantmentMappings()) ? mappingData.getEnchantmentMappings()::getNewId : null; + case ENTITY -> protocol.getEntityRewriter() != null ? protocol.getEntityRewriter()::newEntityId : null; case FLUID, GAME_EVENT, DAMAGE_TYPE, BANNER_PATTERN -> null; }; } diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/block/BlockRewriter1_21_5.java b/common/src/main/java/com/viaversion/viaversion/rewriter/block/BlockRewriter1_21_5.java index b455f4289..5d3f6f686 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/block/BlockRewriter1_21_5.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/block/BlockRewriter1_21_5.java @@ -26,11 +26,16 @@ import com.viaversion.viaversion.api.protocol.Protocol; import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; import com.viaversion.viaversion.api.type.Types; import com.viaversion.viaversion.rewriter.BlockRewriter; +import org.checkerframework.checker.nullness.qual.Nullable; public class BlockRewriter1_21_5 extends BlockRewriter { - public BlockRewriter1_21_5(final Protocol protocol) { - super(protocol, Types.BLOCK_POSITION1_14, Types.COMPOUND_TAG); + public BlockRewriter1_21_5(final Protocol protocol, final ChunkTypeSupplier chunkTypeSupplier, @Nullable final ChunkTypeSupplier mappedChunkTypeSupplier) { + super(protocol, Types.BLOCK_POSITION1_14, Types.COMPOUND_TAG, chunkTypeSupplier, mappedChunkTypeSupplier); + } + + public BlockRewriter1_21_5(final Protocol protocol, final ChunkTypeSupplier chunkTypeSupplier) { + this(protocol, chunkTypeSupplier, null); } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/text/ComponentRewriterBase.java b/common/src/main/java/com/viaversion/viaversion/rewriter/text/ComponentRewriterBase.java index 7b2fcbb50..ed5fa7b4f 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/text/ComponentRewriterBase.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/text/ComponentRewriterBase.java @@ -29,6 +29,8 @@ import com.viaversion.nbt.tag.StringTag; import com.viaversion.nbt.tag.Tag; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.data.FullMappings; +import com.viaversion.viaversion.api.data.Mappings; import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey; import com.viaversion.viaversion.api.minecraft.item.data.ChatType; import com.viaversion.viaversion.api.protocol.Protocol; @@ -80,16 +82,16 @@ public abstract class ComponentRewriterBase imp }); } - public void registerPing() { + public void registerLoginDisconnect() { // Always json protocol.registerClientbound(State.LOGIN, ClientboundLoginPackets.LOGIN_DISCONNECT, wrapper -> processText(wrapper.user(), wrapper.passthrough(Types.COMPONENT))); } + // Usually called via item rewriters public void registerOpenScreen1_14(final C packetType) { protocol.registerClientbound(packetType, wrapper -> { wrapper.passthrough(Types.VAR_INT); // Id wrapper.passthrough(Types.VAR_INT); // Window Type - passthroughAndProcess(wrapper); }); } @@ -378,7 +380,8 @@ public abstract class ComponentRewriterBase imp } protected void handleAttributeModifiers(final CompoundTag tag) { - if (protocol.getMappingData().getAttributeMappings() == null) { + final FullMappings mappings = protocol.getMappingData().getAttributeMappings(); + if (Mappings.isFullIdentity(mappings)) { return; } @@ -393,7 +396,7 @@ public abstract class ComponentRewriterBase imp return false; } - final String mappedId = protocol.getMappingData().getAttributeMappings().mappedIdentifier(typeTag.getValue()); + final String mappedId = mappings.mappedIdentifier(typeTag.getValue()); if (mappedId != null) { typeTag.setValue(mappedId); return false; diff --git a/gradle.properties b/gradle.properties index f015a1d6f..0ba89b007 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ # Project properties - we put these here so they can be modified without causing a recompile of the build scripts -projectVersion=5.8.1 +projectVersion=5.9.0-SNAPSHOT # Smile emoji (note that modrinth may not have added the version on release yet) mcVersions=26.1, 1.21.11, 1.21.10, 1.21.9, 1.21.8, 1.21.7, 1.21.6, 1.21.5, 1.21.4, 1.21.3, 1.21.2, 1.21.1, 1.21, 1.20.6, 1.20.5, 1.20.4, 1.20.3, 1.20.2, 1.20.1, 1.20, 1.19.4, 1.19.3, 1.19.2, 1.19.1, 1.19, 1.18.2, 1.18.1, 1.18, 1.17.1, 1.17, 1.16.5, 1.16.4, 1.16.3, 1.16.2, 1.16.1, 1.16, 1.15.2, 1.15.1, 1.15, 1.14.4, 1.14.3, 1.14.2, 1.14.1, 1.14, 1.13.2, 1.13.1, 1.13, 1.12.2, 1.12.1, 1.12, 1.11.2, 1.11.1, 1.11, 1.10.2, 1.10.1, 1.10, 1.9.4, 1.9.3, 1.9.2, 1.9.1, 1.9, 1.8.9