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 07397c7f6..e01b9256a 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 @@ -53,6 +53,7 @@ public class MappingDataBase implements MappingData { protected Mappings enchantmentMappings; protected Mappings paintingMappings; protected Mappings menuMappings; + protected Mappings attributeMappings; protected Map> tags; public MappingDataBase(final String unmappedVersion, final String mappedVersion) { @@ -75,6 +76,7 @@ public class MappingDataBase implements MappingData { menuMappings = loadMappings(data, "menus"); enchantmentMappings = loadMappings(data, "enchantments"); paintingMappings = loadMappings(data, "paintings"); + attributeMappings = loadMappings(data, "attributes"); itemMappings = loadBiMappings(data, "items"); final CompoundTag unmappedIdentifierData = MappingDataLoader.loadNBT("identifiers-" + unmappedVersion + ".nbt", true); diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/EntityTypes1_20_5.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/EntityTypes1_20_5.java new file mode 100644 index 000000000..8ae03fa0a --- /dev/null +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/EntityTypes1_20_5.java @@ -0,0 +1,284 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2023 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.minecraft.entities; + +import com.google.common.base.Preconditions; +import com.viaversion.viaversion.api.protocol.Protocol; +import com.viaversion.viaversion.util.EntityTypeUtil; +import java.util.Locale; +import org.checkerframework.checker.nullness.qual.Nullable; + +public enum EntityTypes1_20_5 implements EntityType { + + ENTITY(null, null), + + AREA_EFFECT_CLOUD(ENTITY), + END_CRYSTAL(ENTITY), + EVOKER_FANGS(ENTITY), + EXPERIENCE_ORB(ENTITY), + EYE_OF_ENDER(ENTITY), + FALLING_BLOCK(ENTITY), + FIREWORK_ROCKET(ENTITY), + ITEM(ENTITY), + LLAMA_SPIT(ENTITY), + TNT(ENTITY), + SHULKER_BULLET(ENTITY), + FISHING_BOBBER(ENTITY), + + LIVINGENTITY(ENTITY, null), + ARMOR_STAND(LIVINGENTITY), + MARKER(ENTITY), + PLAYER(LIVINGENTITY), + + DISPLAY(ENTITY, null), + BLOCK_DISPLAY(DISPLAY), + ITEM_DISPLAY(DISPLAY), + TEXT_DISPLAY(DISPLAY), + INTERACTION(ENTITY), + + ABSTRACT_INSENTIENT(LIVINGENTITY, null), + ENDER_DRAGON(ABSTRACT_INSENTIENT), + + BEE(ABSTRACT_INSENTIENT), + + ABSTRACT_CREATURE(ABSTRACT_INSENTIENT, null), + + ABSTRACT_AGEABLE(ABSTRACT_CREATURE, null), + VILLAGER(ABSTRACT_AGEABLE), + WANDERING_TRADER(ABSTRACT_AGEABLE), + + // Animals + ABSTRACT_ANIMAL(ABSTRACT_AGEABLE, null), + AXOLOTL(ABSTRACT_ANIMAL), + DOLPHIN(ABSTRACT_INSENTIENT), + CHICKEN(ABSTRACT_ANIMAL), + COW(ABSTRACT_ANIMAL), + MOOSHROOM(COW), + PANDA(ABSTRACT_INSENTIENT), + PIG(ABSTRACT_ANIMAL), + POLAR_BEAR(ABSTRACT_ANIMAL), + RABBIT(ABSTRACT_ANIMAL), + SHEEP(ABSTRACT_ANIMAL), + TURTLE(ABSTRACT_ANIMAL), + FOX(ABSTRACT_ANIMAL), + FROG(ABSTRACT_ANIMAL), + GOAT(ABSTRACT_ANIMAL), + SNIFFER(ABSTRACT_ANIMAL), + ARMADILLO(ABSTRACT_ANIMAL), + + ABSTRACT_TAMEABLE_ANIMAL(ABSTRACT_ANIMAL, null), + CAT(ABSTRACT_TAMEABLE_ANIMAL), + OCELOT(ABSTRACT_TAMEABLE_ANIMAL), + WOLF(ABSTRACT_TAMEABLE_ANIMAL), + + ABSTRACT_PARROT(ABSTRACT_TAMEABLE_ANIMAL, null), + PARROT(ABSTRACT_PARROT), + + // Horses + ABSTRACT_HORSE(ABSTRACT_ANIMAL, null), + CHESTED_HORSE(ABSTRACT_HORSE, null), + DONKEY(CHESTED_HORSE), + MULE(CHESTED_HORSE), + LLAMA(CHESTED_HORSE), + TRADER_LLAMA(CHESTED_HORSE), + HORSE(ABSTRACT_HORSE), + SKELETON_HORSE(ABSTRACT_HORSE), + ZOMBIE_HORSE(ABSTRACT_HORSE), + CAMEL(ABSTRACT_HORSE), + + // Golem + ABSTRACT_GOLEM(ABSTRACT_CREATURE, null), + SNOW_GOLEM(ABSTRACT_GOLEM), + IRON_GOLEM(ABSTRACT_GOLEM), + SHULKER(ABSTRACT_GOLEM), + + // Fish + ABSTRACT_FISHES(ABSTRACT_CREATURE, null), + COD(ABSTRACT_FISHES), + PUFFERFISH(ABSTRACT_FISHES), + SALMON(ABSTRACT_FISHES), + TROPICAL_FISH(ABSTRACT_FISHES), + + // Monsters + ABSTRACT_MONSTER(ABSTRACT_CREATURE, null), + BLAZE(ABSTRACT_MONSTER), + CREEPER(ABSTRACT_MONSTER), + ENDERMITE(ABSTRACT_MONSTER), + ENDERMAN(ABSTRACT_MONSTER), + GIANT(ABSTRACT_MONSTER), + SILVERFISH(ABSTRACT_MONSTER), + VEX(ABSTRACT_MONSTER), + WITCH(ABSTRACT_MONSTER), + WITHER(ABSTRACT_MONSTER), + RAVAGER(ABSTRACT_MONSTER), + BREEZE(ABSTRACT_MONSTER), + + ABSTRACT_PIGLIN(ABSTRACT_MONSTER, null), + + PIGLIN(ABSTRACT_PIGLIN), + PIGLIN_BRUTE(ABSTRACT_PIGLIN), + + HOGLIN(ABSTRACT_ANIMAL), + STRIDER(ABSTRACT_ANIMAL), + TADPOLE(ABSTRACT_FISHES), + ZOGLIN(ABSTRACT_MONSTER), + WARDEN(ABSTRACT_MONSTER), + + // Illagers + ABSTRACT_ILLAGER_BASE(ABSTRACT_MONSTER, null), + ABSTRACT_EVO_ILLU_ILLAGER(ABSTRACT_ILLAGER_BASE, null), + EVOKER(ABSTRACT_EVO_ILLU_ILLAGER), + ILLUSIONER(ABSTRACT_EVO_ILLU_ILLAGER), + VINDICATOR(ABSTRACT_ILLAGER_BASE), + PILLAGER(ABSTRACT_ILLAGER_BASE), + + // Skeletons + ABSTRACT_SKELETON(ABSTRACT_MONSTER, null), + SKELETON(ABSTRACT_SKELETON), + STRAY(ABSTRACT_SKELETON), + WITHER_SKELETON(ABSTRACT_SKELETON), + + // Guardians + GUARDIAN(ABSTRACT_MONSTER), + ELDER_GUARDIAN(GUARDIAN), + + // Spiders + SPIDER(ABSTRACT_MONSTER), + CAVE_SPIDER(SPIDER), + + // Zombies + ZOMBIE(ABSTRACT_MONSTER), + DROWNED(ZOMBIE), + HUSK(ZOMBIE), + ZOMBIFIED_PIGLIN(ZOMBIE), + ZOMBIE_VILLAGER(ZOMBIE), + + // Flying entities + ABSTRACT_FLYING(ABSTRACT_INSENTIENT, null), + GHAST(ABSTRACT_FLYING), + PHANTOM(ABSTRACT_FLYING), + + ABSTRACT_AMBIENT(ABSTRACT_INSENTIENT, null), + BAT(ABSTRACT_AMBIENT), + ALLAY(ABSTRACT_CREATURE), + + ABSTRACT_WATERMOB(ABSTRACT_INSENTIENT, null), + SQUID(ABSTRACT_WATERMOB), + GLOW_SQUID(SQUID), + + // Slimes + SLIME(ABSTRACT_INSENTIENT), + MAGMA_CUBE(SLIME), + + // Hangable objects + ABSTRACT_HANGING(ENTITY, null), + LEASH_KNOT(ABSTRACT_HANGING), + ITEM_FRAME(ABSTRACT_HANGING), + GLOW_ITEM_FRAME(ITEM_FRAME), + PAINTING(ABSTRACT_HANGING), + + ABSTRACT_LIGHTNING(ENTITY, null), + LIGHTNING_BOLT(ABSTRACT_LIGHTNING), + + // Arrows + ABSTRACT_ARROW(ENTITY, null), + ARROW(ABSTRACT_ARROW), + SPECTRAL_ARROW(ABSTRACT_ARROW), + TRIDENT(ABSTRACT_ARROW), + + // Fireballs + ABSTRACT_FIREBALL(ENTITY, null), + DRAGON_FIREBALL(ABSTRACT_FIREBALL), + FIREBALL(ABSTRACT_FIREBALL), + SMALL_FIREBALL(ABSTRACT_FIREBALL), + WITHER_SKULL(ABSTRACT_FIREBALL), + + // Projectiles + PROJECTILE_ABSTRACT(ENTITY, null), + SNOWBALL(PROJECTILE_ABSTRACT), + ENDER_PEARL(PROJECTILE_ABSTRACT), + EGG(PROJECTILE_ABSTRACT), + POTION(PROJECTILE_ABSTRACT), + EXPERIENCE_BOTTLE(PROJECTILE_ABSTRACT), + WIND_CHARGE(PROJECTILE_ABSTRACT), + + // Vehicles + MINECART_ABSTRACT(ENTITY, null), + CHESTED_MINECART_ABSTRACT(MINECART_ABSTRACT, null), + CHEST_MINECART(CHESTED_MINECART_ABSTRACT), + HOPPER_MINECART(CHESTED_MINECART_ABSTRACT), + MINECART(MINECART_ABSTRACT), + FURNACE_MINECART(MINECART_ABSTRACT), + COMMAND_BLOCK_MINECART(MINECART_ABSTRACT), + TNT_MINECART(MINECART_ABSTRACT), + SPAWNER_MINECART(MINECART_ABSTRACT), + BOAT(ENTITY), + CHEST_BOAT(BOAT); + + private static final EntityType[] TYPES = EntityTypeUtil.createSizedArray(values()); + private final EntityType parent; + private final String identifier; + private int id = -1; + + EntityTypes1_20_5(final EntityType parent) { + this.parent = parent; + this.identifier = "minecraft:" + name().toLowerCase(Locale.ROOT); + } + + EntityTypes1_20_5(final EntityType parent, @Nullable final String identifier) { + this.parent = parent; + this.identifier = identifier; + } + + @Override + public int getId() { + if (id == -1) { + throw new IllegalStateException("Ids have not been initialized yet (type " + name() + ")"); + } + return id; + } + + @Override + public String identifier() { + Preconditions.checkArgument(identifier != null, "Called identifier method on abstract type"); + return identifier; + } + + @Override + public @Nullable EntityType getParent() { + return parent; + } + + @Override + public boolean isAbstractType() { + return identifier == null; + } + + public static EntityType getTypeFromId(final int typeId) { + return EntityTypeUtil.getTypeFromId(TYPES, typeId, ENTITY); + } + + public static void initialize(final Protocol protocol) { + EntityTypeUtil.initialize(values(), TYPES, protocol, (type, id) -> type.id = id); + } +} diff --git a/api/src/main/java/com/viaversion/viaversion/api/protocol/version/ProtocolVersion.java b/api/src/main/java/com/viaversion/viaversion/api/protocol/version/ProtocolVersion.java index 83d20add5..c422007c5 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/protocol/version/ProtocolVersion.java +++ b/api/src/main/java/com/viaversion/viaversion/api/protocol/version/ProtocolVersion.java @@ -86,6 +86,7 @@ public class ProtocolVersion { public static final ProtocolVersion v1_20 = register(763, "1.20/1.20.1", new VersionRange("1.20", 0, 1)); public static final ProtocolVersion v1_20_2 = register(764, "1.20.2"); public static final ProtocolVersion v1_20_3 = register(765, "1.20.3/1.20.4", new VersionRange("1.20", 3, 4)); + public static final ProtocolVersion v1_20_5 = register(766, 169, "1.20.5"); public static final ProtocolVersion unknown = register(-1, "UNKNOWN"); public static ProtocolVersion register(int version, String name) { diff --git a/api/src/main/java/com/viaversion/viaversion/api/type/Type.java b/api/src/main/java/com/viaversion/viaversion/api/type/Type.java index e4b4be357..e23f05e97 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/Type.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/Type.java @@ -142,6 +142,7 @@ public abstract class Type implements ByteBufReader, ByteBufWriter { public static final Type QUATERNION = new QuaternionType(); public static final Type NAMED_COMPOUND_TAG = new NamedCompoundTagType(); + public static final Type OPTIONAL_NAMED_COMPOUND_TAG = new NamedCompoundTagType.OptionalNamedCompoundTagType(); public static final Type NAMED_COMPOUND_TAG_ARRAY = new ArrayType<>(Type.NAMED_COMPOUND_TAG); public static final Type COMPOUND_TAG = new CompoundTagType(); public static final Type OPTIONAL_COMPOUND_TAG = new CompoundTagType.OptionalCompoundTagType(); diff --git a/api/src/main/java/com/viaversion/viaversion/api/type/types/misc/NamedCompoundTagType.java b/api/src/main/java/com/viaversion/viaversion/api/type/types/misc/NamedCompoundTagType.java index 15dd03c27..c7f4ca422 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/types/misc/NamedCompoundTagType.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/types/misc/NamedCompoundTagType.java @@ -25,6 +25,7 @@ package com.viaversion.viaversion.api.type.types.misc; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.Tag; import com.github.steveice10.opennbt.tag.limiter.TagLimiter; +import com.viaversion.viaversion.api.type.OptionalType; import com.viaversion.viaversion.api.type.Type; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufInputStream; @@ -83,4 +84,11 @@ public class NamedCompoundTagType extends Type { } tag.write(out); } + + public static final class OptionalNamedCompoundTagType extends OptionalType { + + public OptionalNamedCompoundTagType() { + super(Type.NAMED_COMPOUND_TAG); + } + } } 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 fedb8c8e8..decb988df 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolManagerImpl.java +++ b/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolManagerImpl.java @@ -73,6 +73,7 @@ import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.Protocol1_19To1_ import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.Protocol1_20_2To1_20; import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.Protocol1_20_3To1_20_2; import com.viaversion.viaversion.protocols.protocol1_20to1_19_4.Protocol1_20To1_19_4; +import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.Protocol1_20_5To1_20_3; import com.viaversion.viaversion.protocols.protocol1_9_1to1_9.Protocol1_9_1To1_9; import com.viaversion.viaversion.protocols.protocol1_9_3to1_9_1_2.Protocol1_9_3To1_9_1_2; import com.viaversion.viaversion.protocols.protocol1_9to1_8.Protocol1_9To1_8; @@ -82,10 +83,6 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.ints.Int2ObjectSortedMap; -import java.util.logging.Level; -import org.checkerframework.checker.nullness.qual.Nullable; -import us.myles.ViaVersion.api.protocol.ProtocolRegistry; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -106,6 +103,9 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.Function; +import java.util.logging.Level; +import org.checkerframework.checker.nullness.qual.Nullable; +import us.myles.ViaVersion.api.protocol.ProtocolRegistry; public class ProtocolManagerImpl implements ProtocolManager { private static final Protocol BASE_PROTOCOL = new BaseProtocol(); @@ -185,6 +185,7 @@ public class ProtocolManagerImpl implements ProtocolManager { registerProtocol(new Protocol1_20To1_19_4(), ProtocolVersion.v1_20, ProtocolVersion.v1_19_4); registerProtocol(new Protocol1_20_2To1_20(), ProtocolVersion.v1_20_2, ProtocolVersion.v1_20); registerProtocol(new Protocol1_20_3To1_20_2(), ProtocolVersion.v1_20_3, ProtocolVersion.v1_20_2); + registerProtocol(new Protocol1_20_5To1_20_3(), ProtocolVersion.v1_20_5, ProtocolVersion.v1_20_3); } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/packets/EntityPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/packets/EntityPackets.java index 4c67e34f4..a98310831 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/packets/EntityPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/packets/EntityPackets.java @@ -187,7 +187,7 @@ public final class EntityPackets extends EntityRewriter { diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/Protocol1_20_5To1_20_3.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/Protocol1_20_5To1_20_3.java new file mode 100644 index 000000000..ad42b4fc6 --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/Protocol1_20_5To1_20_3.java @@ -0,0 +1,100 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2023 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.protocols.protocol1_20_5to1_20_3; + +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.entities.EntityTypes1_20_5; +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.packet.State; +import com.viaversion.viaversion.data.entity.EntityTrackerBase; +import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.ServerboundConfigurationPackets1_20_2; +import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundConfigurationPackets1_20_3; +import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundPackets1_20_3; +import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ServerboundPackets1_20_3; +import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.rewriter.BlockItemPacketRewriter1_20_5; +import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.rewriter.EntityPacketRewriter1_20_5; +import com.viaversion.viaversion.rewriter.SoundRewriter; +import com.viaversion.viaversion.rewriter.StatisticsRewriter; +import com.viaversion.viaversion.rewriter.TagRewriter; + +public final class Protocol1_20_5To1_20_3 extends AbstractProtocol { + + public static final MappingData MAPPINGS = new MappingDataBase("1.20.5", "1.20.3"); + private final EntityPacketRewriter1_20_5 entityRewriter = new EntityPacketRewriter1_20_5(this); + private final BlockItemPacketRewriter1_20_5 itemRewriter = new BlockItemPacketRewriter1_20_5(this); + + public Protocol1_20_5To1_20_3() { + super(ClientboundPackets1_20_3.class, ClientboundPackets1_20_3.class, ServerboundPackets1_20_3.class, ServerboundPackets1_20_3.class); + } + + @Override + protected void registerPackets() { + super.registerPackets(); + + final TagRewriter tagRewriter = new TagRewriter<>(this); + tagRewriter.registerGeneric(ClientboundPackets1_20_3.TAGS); + tagRewriter.registerGeneric(State.CONFIGURATION, ClientboundConfigurationPackets1_20_3.UPDATE_TAGS); + + final SoundRewriter soundRewriter = new SoundRewriter<>(this); + soundRewriter.register1_19_3Sound(ClientboundPackets1_20_3.SOUND); + soundRewriter.registerSound(ClientboundPackets1_20_3.ENTITY_SOUND); + + new StatisticsRewriter<>(this).register(ClientboundPackets1_20_3.STATISTICS); + } + + @Override + protected void onMappingDataLoaded() { + super.onMappingDataLoaded(); + + EntityTypes1_20_5.initialize(this); + } + + @Override + public void init(final UserConnection connection) { + addEntityTracker(connection, new EntityTrackerBase(connection, EntityTypes1_20_5.PLAYER)); + } + + @Override + public MappingData getMappingData() { + return MAPPINGS; + } + + @Override + public EntityPacketRewriter1_20_5 getEntityRewriter() { + return entityRewriter; + } + + @Override + public BlockItemPacketRewriter1_20_5 getItemRewriter() { + return itemRewriter; + } + + @Override + protected ClientboundPacketType clientboundFinishConfigurationPacket() { + return ClientboundConfigurationPackets1_20_3.FINISH_CONFIGURATION; + } + + @Override + protected ServerboundPacketType serverboundFinishConfigurationPacket() { + return ServerboundConfigurationPackets1_20_2.FINISH_CONFIGURATION; + } +} \ No newline at end of file diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/data/AttributeMappings.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/data/AttributeMappings.java new file mode 100644 index 000000000..611ce8c35 --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/data/AttributeMappings.java @@ -0,0 +1,36 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2023 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.protocols.protocol1_20_5to1_20_3.data; + +import org.checkerframework.checker.nullness.qual.Nullable; + +public final class AttributeMappings { + + private static final String[] ATTRIBUTES; + + static { + + } + + public @Nullable String attribute(final int id) { + return id >= 0 && id < ATTRIBUTES.length ? ATTRIBUTES[id] : null; + } + + public int id(final String attribute) { + } +} diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/rewriter/BlockItemPacketRewriter1_20_5.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/rewriter/BlockItemPacketRewriter1_20_5.java new file mode 100644 index 000000000..e93bfe9e9 --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/rewriter/BlockItemPacketRewriter1_20_5.java @@ -0,0 +1,61 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2023 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.protocols.protocol1_20_5to1_20_3.rewriter; + +import com.viaversion.viaversion.api.type.Type; +import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2; +import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundPackets1_20_3; +import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ServerboundPackets1_20_3; +import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.rewriter.RecipeRewriter1_20_3; +import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.Protocol1_20_5To1_20_3; +import com.viaversion.viaversion.rewriter.BlockRewriter; +import com.viaversion.viaversion.rewriter.ItemRewriter; + +public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter { + + public BlockItemPacketRewriter1_20_5(final Protocol1_20_5To1_20_3 protocol) { + super(protocol, Type.ITEM1_20_2, Type.ITEM1_20_2_ARRAY); + } + + @Override + public void registerPackets() { + final BlockRewriter blockRewriter = BlockRewriter.for1_20_2(protocol); + blockRewriter.registerBlockAction(ClientboundPackets1_20_3.BLOCK_ACTION); + blockRewriter.registerBlockChange(ClientboundPackets1_20_3.BLOCK_CHANGE); + blockRewriter.registerVarLongMultiBlockChange1_20(ClientboundPackets1_20_3.MULTI_BLOCK_CHANGE); + blockRewriter.registerEffect(ClientboundPackets1_20_3.EFFECT, 1010, 2001); + blockRewriter.registerChunkData1_19(ClientboundPackets1_20_3.CHUNK_DATA, ChunkType1_20_2::new); + blockRewriter.registerBlockEntityData(ClientboundPackets1_20_3.BLOCK_ENTITY_DATA); + + // registerOpenWindow(ClientboundPackets1_20_3.OPEN_WINDOW); + registerSetCooldown(ClientboundPackets1_20_3.COOLDOWN); + registerWindowItems1_17_1(ClientboundPackets1_20_3.WINDOW_ITEMS); + registerSetSlot1_17_1(ClientboundPackets1_20_3.SET_SLOT); + registerAdvancements1_20_3(ClientboundPackets1_20_3.ADVANCEMENTS); + registerEntityEquipmentArray(ClientboundPackets1_20_3.ENTITY_EQUIPMENT); + registerClickWindow1_17_1(ServerboundPackets1_20_3.CLICK_WINDOW); + registerTradeList1_19(ClientboundPackets1_20_3.TRADE_LIST); + registerCreativeInvAction(ServerboundPackets1_20_3.CREATIVE_INVENTORY_ACTION); + registerWindowPropertyEnchantmentHandler(ClientboundPackets1_20_3.WINDOW_PROPERTY); + registerSpawnParticle1_19(ClientboundPackets1_20_3.SPAWN_PARTICLE); + + // TODO Explosion contains particles now + + new RecipeRewriter1_20_3<>(protocol).register(ClientboundPackets1_20_3.DECLARE_RECIPES); + } +} \ No newline at end of file diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/rewriter/EntityPacketRewriter1_20_5.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/rewriter/EntityPacketRewriter1_20_5.java new file mode 100644 index 000000000..39b2a0251 --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/rewriter/EntityPacketRewriter1_20_5.java @@ -0,0 +1,142 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2023 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.protocols.protocol1_20_5to1_20_3.rewriter; + +import com.viaversion.viaversion.api.minecraft.entities.EntityType; +import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_20_5; +import com.viaversion.viaversion.api.protocol.packet.State; +import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers; +import com.viaversion.viaversion.api.type.Type; +import com.viaversion.viaversion.api.type.types.version.Types1_20_3; +import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundConfigurationPackets1_20_3; +import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundPackets1_20_3; +import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.Protocol1_20_5To1_20_3; +import com.viaversion.viaversion.rewriter.EntityRewriter; +import com.viaversion.viaversion.util.Key; + +public final class EntityPacketRewriter1_20_5 extends EntityRewriter { + + public EntityPacketRewriter1_20_5(final Protocol1_20_5To1_20_3 protocol) { + super(protocol); + } + + @Override + public void registerPackets() { + // Tracks entities, applies metadata rewrites registered below, untracks entities + registerTrackerWithData1_19(ClientboundPackets1_20_3.SPAWN_ENTITY, EntityTypes1_20_5.FALLING_BLOCK); + registerMetadataRewriter(ClientboundPackets1_20_3.ENTITY_METADATA, /*Types1_OLD.METADATA_LIST, */Types1_20_3.METADATA_LIST); + registerRemoveEntities(ClientboundPackets1_20_3.REMOVE_ENTITIES); + + protocol.registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_3.REGISTRY_DATA, new PacketHandlers() { + @Override + protected void register() { + map(Type.COMPOUND_TAG); // Registry data + handler(configurationDimensionDataHandler()); // Caches dimensions to access data like height later + handler(configurationBiomeSizeTracker()); // Tracks the amount of biomes sent for chunk data + } + }); + + protocol.registerClientbound(ClientboundPackets1_20_3.JOIN_GAME, new PacketHandlers() { + @Override + public void register() { + map(Type.INT); // Entity id + map(Type.BOOLEAN); // Hardcore + map(Type.STRING_ARRAY); // World List + map(Type.VAR_INT); // Max players + map(Type.VAR_INT); // View distance + map(Type.VAR_INT); // Simulation distance + map(Type.BOOLEAN); // Reduced debug info + map(Type.BOOLEAN); // Show death screen + map(Type.BOOLEAN); // Limited crafting + map(Type.STRING); // Dimension key + map(Type.STRING); // World + handler(worldDataTrackerHandlerByKey()); // Tracks world height and name for chunk data and entity (un)tracking + } + }); + + protocol.registerClientbound(ClientboundPackets1_20_3.RESPAWN, new PacketHandlers() { + @Override + public void register() { + map(Type.STRING); // Dimension + map(Type.STRING); // World + handler(worldDataTrackerHandlerByKey()); // Tracks world height and name for chunk data and entity (un)tracking + } + }); + + protocol.registerClientbound(ClientboundPackets1_20_3.ENTITY_EFFECT, wrapper -> { + wrapper.passthrough(Type.VAR_INT); // Entity id + wrapper.passthrough(Type.VAR_INT); // Effect id + wrapper.passthrough(Type.BYTE); // Amplifier + wrapper.passthrough(Type.VAR_INT); // Duration + wrapper.passthrough(Type.BYTE); // Flags + wrapper.read(Type.OPTIONAL_COMPOUND_TAG); // Remove factor data + }); + + protocol.registerClientbound(ClientboundPackets1_20_3.ENTITY_PROPERTIES, wrapper -> { + wrapper.passthrough(Type.VAR_INT); // Entity id + + final int size = wrapper.passthrough(Type.VAR_INT); + for (int i = 0; i < size; i++) { + final String attributeIdentifier = Key.namespaced(wrapper.read(Type.STRING)); + wrapper.write(Type.VAR_INT, protocol.getMappingData()); + + wrapper.passthrough(Type.DOUBLE); // Base + final int modifierSize = wrapper.passthrough(Type.VAR_INT); + for (int j = 0; j < modifierSize; j++) { + wrapper.passthrough(Type.UUID); // Id + wrapper.passthrough(Type.DOUBLE); // Amount + wrapper.passthrough(Type.BYTE); // Operation + } + } + }); + } + + @Override + protected void registerRewrites() { + /* Uncomment if metatype classes changed + filter().handler((event, meta) -> { + int id = meta.metaType().typeId(); + if (id >= SomeAddedIndex) { + id++; + } + meta.setMetaType(Types1_20_3.META_TYPES.byId(id)); + });*/ + + registerMetaTypeHandler( + Types1_20_3.META_TYPES.itemType, + Types1_20_3.META_TYPES.blockStateType, + Types1_20_3.META_TYPES.optionalBlockStateType, + Types1_20_3.META_TYPES.particleType + ); + + filter().filterFamily(EntityTypes1_20_5.MINECART_ABSTRACT).index(11).handler((event, meta) -> { + final int blockState = meta.value(); + meta.setValue(protocol.getMappingData().getNewBlockStateId(blockState)); + }); + } + + @Override + public void onMappingDataLoaded() { + mapTypes(); + } + + @Override + public EntityType typeFromId(final int type) { + return EntityTypes1_20_5.getTypeFromId(type); + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 679b81125..9d0681903 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=4.9.3-SNAPSHOT +projectVersion=4.10.0-23w51a-SNAPSHOT # Smile emoji mcVersions=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 diff --git a/template/src/main/java/com/viaversion/viaversion/template/protocols/Protocol1_99To_98.java b/template/src/main/java/com/viaversion/viaversion/template/protocols/Protocol1_99To_98.java index 324bf56ab..d9471724e 100644 --- a/template/src/main/java/com/viaversion/viaversion/template/protocols/Protocol1_99To_98.java +++ b/template/src/main/java/com/viaversion/viaversion/template/protocols/Protocol1_99To_98.java @@ -26,9 +26,9 @@ import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType; import com.viaversion.viaversion.api.protocol.packet.State; import com.viaversion.viaversion.data.entity.EntityTrackerBase; -import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.ClientboundPackets1_20_2; import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.ServerboundConfigurationPackets1_20_2; import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundConfigurationPackets1_20_3; +import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundPackets1_20_3; import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ServerboundPackets1_20_3; import com.viaversion.viaversion.rewriter.SoundRewriter; import com.viaversion.viaversion.rewriter.StatisticsRewriter; @@ -38,13 +38,13 @@ import com.viaversion.viaversion.template.protocols.rewriter.EntityPacketRewrite // Placeholders to replace (in the entire package): // Protocol1_99To_98, EntityPacketRewriter1_99, BlockItemPacketRewriter1_99 -// ClientboundPackets1_20_2 +// ClientboundPackets1_20_3 // ServerboundPackets1_20_3 // ClientboundConfigurationPackets1_20_3 // ServerboundConfigurationPackets1_20_2 // Entity1_19_4Types (MAPPED type) // 1.99, 1.98 -public final class Protocol1_99To_98 extends AbstractProtocol { +public final class Protocol1_99To_98 extends AbstractProtocol { public static final MappingData MAPPINGS = new MappingDataBase("1.98", "1.99"); private final EntityPacketRewriter1_99 entityRewriter = new EntityPacketRewriter1_99(this); @@ -52,7 +52,7 @@ public final class Protocol1_99To_98 extends AbstractProtocol tagRewriter = new TagRewriter<>(this); - tagRewriter.registerGeneric(ClientboundPackets1_20_2.TAGS); + final TagRewriter tagRewriter = new TagRewriter<>(this); + tagRewriter.registerGeneric(ClientboundPackets1_20_3.TAGS); tagRewriter.registerGeneric(State.CONFIGURATION, ClientboundConfigurationPackets1_20_3.UPDATE_TAGS); // Registers sound id changes - final SoundRewriter soundRewriter = new SoundRewriter<>(this); - soundRewriter.register1_19_3Sound(ClientboundPackets1_20_2.SOUND); - soundRewriter.registerSound(ClientboundPackets1_20_2.ENTITY_SOUND); + final SoundRewriter soundRewriter = new SoundRewriter<>(this); + soundRewriter.register1_19_3Sound(ClientboundPackets1_20_3.SOUND); + soundRewriter.registerSound(ClientboundPackets1_20_3.ENTITY_SOUND); // Registers registry type id changes as well as stat id changes if also included in the json mappings - new StatisticsRewriter<>(this).register(ClientboundPackets1_20_2.STATISTICS); + new StatisticsRewriter<>(this).register(ClientboundPackets1_20_3.STATISTICS); // Uncomment if an existing type changed serialization format. Mappings for argument type keys can also be defined in mapping files - /*final CommandRewriter1_19_4 commandRewriter = new CommandRewriter1_19_4(this) { + /*final CommandRewriter1_19_4 commandRewriter = new CommandRewriter1_19_4(this) { @Override public void handleArgument(final PacketWrapper wrapper, final String argumentType) throws Exception { if (argumentType.equals("minecraft:abc")) { @@ -83,7 +83,9 @@ public final class Protocol1_99To_98 extends AbstractProtocol { +public final class BlockItemPacketRewriter1_99 extends ItemRewriter { public BlockItemPacketRewriter1_99(final Protocol1_99To_98 protocol) { super(protocol, Type.ITEM1_20_2, Type.ITEM1_20_2_ARRAY); @@ -40,33 +40,33 @@ public final class BlockItemPacketRewriter1_99 extends ItemRewriter blockRewriter = BlockRewriter.for1_20_2(protocol); - blockRewriter.registerBlockAction(ClientboundPackets1_20_2.BLOCK_ACTION); - blockRewriter.registerBlockChange(ClientboundPackets1_20_2.BLOCK_CHANGE); - blockRewriter.registerVarLongMultiBlockChange1_20(ClientboundPackets1_20_2.MULTI_BLOCK_CHANGE); - blockRewriter.registerEffect(ClientboundPackets1_20_2.EFFECT, 1010, 2001); - blockRewriter.registerChunkData1_19(ClientboundPackets1_20_2.CHUNK_DATA, ChunkType1_20_2::new); - blockRewriter.registerBlockEntityData(ClientboundPackets1_20_2.BLOCK_ENTITY_DATA); + final BlockRewriter blockRewriter = BlockRewriter.for1_20_2(protocol); + blockRewriter.registerBlockAction(ClientboundPackets1_20_3.BLOCK_ACTION); + blockRewriter.registerBlockChange(ClientboundPackets1_20_3.BLOCK_CHANGE); + blockRewriter.registerVarLongMultiBlockChange1_20(ClientboundPackets1_20_3.MULTI_BLOCK_CHANGE); + blockRewriter.registerEffect(ClientboundPackets1_20_3.EFFECT, 1010, 2001); + blockRewriter.registerChunkData1_19(ClientboundPackets1_20_3.CHUNK_DATA, ChunkType1_20_2::new); + blockRewriter.registerBlockEntityData(ClientboundPackets1_20_3.BLOCK_ENTITY_DATA); // Registers item id changes // Other places using item ids are: Entity metadata, tags, statistics, effect - // registerOpenWindow(ClientboundPackets1_20_2.OPEN_WINDOW); - If a new container type was added - registerSetCooldown(ClientboundPackets1_20_2.COOLDOWN); - registerWindowItems1_17_1(ClientboundPackets1_20_2.WINDOW_ITEMS); - registerSetSlot1_17_1(ClientboundPackets1_20_2.SET_SLOT); - registerAdvancements1_20_3(ClientboundPackets1_20_2.ADVANCEMENTS); - registerEntityEquipmentArray(ClientboundPackets1_20_2.ENTITY_EQUIPMENT); + // registerOpenWindow(ClientboundPackets1_20_3.OPEN_WINDOW); - If a new container type was added + registerSetCooldown(ClientboundPackets1_20_3.COOLDOWN); + registerWindowItems1_17_1(ClientboundPackets1_20_3.WINDOW_ITEMS); + registerSetSlot1_17_1(ClientboundPackets1_20_3.SET_SLOT); + registerAdvancements1_20_3(ClientboundPackets1_20_3.ADVANCEMENTS); + registerEntityEquipmentArray(ClientboundPackets1_20_3.ENTITY_EQUIPMENT); registerClickWindow1_17_1(ServerboundPackets1_20_3.CLICK_WINDOW); - registerTradeList1_19(ClientboundPackets1_20_2.TRADE_LIST); + registerTradeList1_19(ClientboundPackets1_20_3.TRADE_LIST); registerCreativeInvAction(ServerboundPackets1_20_3.CREATIVE_INVENTORY_ACTION); - registerWindowPropertyEnchantmentHandler(ClientboundPackets1_20_2.WINDOW_PROPERTY); - registerSpawnParticle1_19(ClientboundPackets1_20_2.SPAWN_PARTICLE); + registerWindowPropertyEnchantmentHandler(ClientboundPackets1_20_3.WINDOW_PROPERTY); + registerSpawnParticle1_19(ClientboundPackets1_20_3.SPAWN_PARTICLE); // TODO Explosion contains particles now - new RecipeRewriter1_20_3<>(protocol).register(ClientboundPackets1_20_2.DECLARE_RECIPES); + new RecipeRewriter1_20_3<>(protocol).register(ClientboundPackets1_20_3.DECLARE_RECIPES); // OR do this if serialization of recipes changed and override the relevant method // Add new serializers to RecipeRewriter, or extend the last one for changes - // new RecipeRewriter1_20_3(this) {}.register(ClientboundPackets1_20_2.DECLARE_RECIPES); + // new RecipeRewriter1_20_3(this) {}.register(ClientboundPackets1_20_3.DECLARE_RECIPES); } } \ No newline at end of file diff --git a/template/src/main/java/com/viaversion/viaversion/template/protocols/rewriter/EntityPacketRewriter1_99.java b/template/src/main/java/com/viaversion/viaversion/template/protocols/rewriter/EntityPacketRewriter1_99.java index 06a10a50b..4b71574f3 100644 --- a/template/src/main/java/com/viaversion/viaversion/template/protocols/rewriter/EntityPacketRewriter1_99.java +++ b/template/src/main/java/com/viaversion/viaversion/template/protocols/rewriter/EntityPacketRewriter1_99.java @@ -23,15 +23,15 @@ import com.viaversion.viaversion.api.protocol.packet.State; import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers; import com.viaversion.viaversion.api.type.Type; import com.viaversion.viaversion.api.type.types.version.Types1_20_3; -import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.ClientboundPackets1_20_2; import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundConfigurationPackets1_20_3; +import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundPackets1_20_3; import com.viaversion.viaversion.rewriter.EntityRewriter; import com.viaversion.viaversion.template.protocols.Protocol1_99To_98; // Replace if needed // Types1_OLD // Types1_20_3 -public final class EntityPacketRewriter1_99 extends EntityRewriter { +public final class EntityPacketRewriter1_99 extends EntityRewriter { public EntityPacketRewriter1_99(final Protocol1_99To_98 protocol) { super(protocol); @@ -40,9 +40,9 @@ public final class EntityPacketRewriter1_99 extends EntityRewriter