From e7d0b01eee607c6586a9183470d0854f589ee123 Mon Sep 17 00:00:00 2001 From: Nassim Jahnke Date: Thu, 19 Oct 2023 10:53:14 +1000 Subject: [PATCH] 23w42a --- .../api/protocol/AbstractProtocol.java | 2 +- .../api/protocol/version/ProtocolVersion.java | 2 +- .../api/type/types/version/Types1_20_3.java | 2 +- .../Protocol1_20_3To1_20_2.java | 65 +++++++++---- .../packet/ServerboundPackets1_20_3.java | 89 ++++++++++++++++++ .../BlockItemPacketRewriter1_20_3.java | 57 +++++++++++ .../rewriter/EntityPacketRewriter1_20_3.java | 81 ++++++++++++---- .../viaversion/rewriter/EntityRewriter.java | 8 ++ .../viaversion/rewriter/ItemRewriter.java | 4 + .../viaversion/data/identifiers-1.20.3.nbt | Bin 3269 -> 3282 bytes .../data/mappings-1.20.2to1.20.3.nbt | Bin 273 -> 492 bytes gradle.properties | 2 +- .../template/protocols/Protocol1_99To_98.java | 10 +- .../rewriter/BlockItemPacketRewriter1_99.java | 9 +- .../rewriter/EntityPacketRewriter1_99.java | 6 +- 15 files changed, 287 insertions(+), 50 deletions(-) create mode 100644 common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/packet/ServerboundPackets1_20_3.java create mode 100644 common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/BlockItemPacketRewriter1_20_3.java diff --git a/api/src/main/java/com/viaversion/viaversion/api/protocol/AbstractProtocol.java b/api/src/main/java/com/viaversion/viaversion/api/protocol/AbstractProtocol.java index 8552f3464..53a64fa13 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/protocol/AbstractProtocol.java +++ b/api/src/main/java/com/viaversion/viaversion/api/protocol/AbstractProtocol.java @@ -424,7 +424,7 @@ public abstract class AbstractProtocol" + toNiceHex(mappedPacketId)); + + " IN REMAP OF " + state + " " + toNiceHex(unmappedPacketId) + "->" + toNiceHex(mappedPacketId)); } throw e; } 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 eb9ee2959..848b40520 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 @@ -85,7 +85,7 @@ public class ProtocolVersion { public static final ProtocolVersion v1_19_4 = register(762, "1.19.4"); 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, 156, "1.20.3"); + public static final ProtocolVersion v1_20_3 = register(765, 157, "1.20.3"); 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/types/version/Types1_20_3.java b/api/src/main/java/com/viaversion/viaversion/api/type/types/version/Types1_20_3.java index 4c8e49bb8..0bc10f9bc 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/types/version/Types1_20_3.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/types/version/Types1_20_3.java @@ -32,7 +32,7 @@ import java.util.List; public final class Types1_20_3 { - public static final ParticleType PARTICLE = Types1_20.PARTICLE; // Only safe to use after protocol loading + public static final ParticleType PARTICLE = new ParticleType(); // Only safe to use after protocol loading public static final MetaTypes1_20_3 META_TYPES = new MetaTypes1_20_3(PARTICLE); public static final Type METADATA = new MetadataType(META_TYPES); public static final Type> METADATA_LIST = new MetaListType(METADATA); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/Protocol1_20_3To1_20_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/Protocol1_20_3To1_20_2.java index 54fed317f..2ca683e9f 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/Protocol1_20_3To1_20_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/Protocol1_20_3To1_20_2.java @@ -49,13 +49,19 @@ import com.viaversion.viaversion.api.protocol.remapper.PacketHandler; import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers; import com.viaversion.viaversion.api.type.Type; import com.viaversion.viaversion.api.type.types.UUIDIntArrayType; +import com.viaversion.viaversion.api.type.types.misc.ParticleType; +import com.viaversion.viaversion.api.type.types.version.Types1_20_3; import com.viaversion.viaversion.data.entity.EntityTrackerBase; import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.ClientboundConfigurationPackets1_20_2; 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_2to1_20.packet.ServerboundPackets1_20_2; +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.BlockItemPacketRewriter1_20_3; import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.rewriter.EntityPacketRewriter1_20_3; import com.viaversion.viaversion.rewriter.SoundRewriter; +import com.viaversion.viaversion.rewriter.StatisticsRewriter; +import com.viaversion.viaversion.rewriter.TagRewriter; import java.util.Arrays; import java.util.BitSet; import java.util.HashSet; @@ -64,7 +70,7 @@ import java.util.Set; import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; -public final class Protocol1_20_3To1_20_2 extends AbstractProtocol { +public final class Protocol1_20_3To1_20_2 extends AbstractProtocol { public static final MappingData MAPPINGS = new MappingDataBase("1.20.2", "1.20.3"); private static final Set BOOLEAN_TYPES = new HashSet<>(Arrays.asList( @@ -75,19 +81,27 @@ public final class Protocol1_20_3To1_20_2 extends AbstractProtocol tagRewriter = new TagRewriter<>(this); + tagRewriter.registerGeneric(ClientboundPackets1_20_2.TAGS); + final SoundRewriter soundRewriter = new SoundRewriter<>(this); soundRewriter.register1_19_3Sound(ClientboundPackets1_20_2.SOUND); - soundRewriter.registerEntitySound(ClientboundPackets1_20_2.ENTITY_SOUND); + soundRewriter.registerSound(ClientboundPackets1_20_2.ENTITY_SOUND); + + new StatisticsRewriter<>(this).register(ClientboundPackets1_20_2.STATISTICS); // Components are now (mostly) written as nbt instead of json strings registerClientbound(ClientboundPackets1_20_2.ADVANCEMENTS, wrapper -> { @@ -105,7 +119,7 @@ public final class Protocol1_20_3To1_20_2 extends AbstractProtocol convertComponent(wrapper)); - } + registerClientbound(ClientboundPackets1_20_2.OPEN_WINDOW, wrapper -> { + wrapper.passthrough(Type.VAR_INT); // Container id + + final int containerTypeId = wrapper.read(Type.VAR_INT); + wrapper.write(Type.VAR_INT, MAPPINGS.getMenuMappings().getNewId(containerTypeId)); + + convertComponent(wrapper); }); registerClientbound(ClientboundPackets1_20_2.TAB_LIST, wrapper -> { convertComponent(wrapper); @@ -480,6 +494,20 @@ public final class Protocol1_20_3To1_20_2 extends AbstractProtocol. + */ +package com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet; + +import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType; + +public enum ServerboundPackets1_20_3 implements ServerboundPacketType { + + TELEPORT_CONFIRM, // 0x00 + QUERY_BLOCK_NBT, // 0x01 + SET_DIFFICULTY, // 0x02 + CHAT_ACK, // 0x03 + CHAT_COMMAND, // 0x04 + CHAT_MESSAGE, // 0x05 + CHAT_SESSION_UPDATE, // 0x06 + CHUNK_BATCH_RECEIVED, // 0x07 + CLIENT_STATUS, // 0x08 + CLIENT_SETTINGS, // 0x09 + TAB_COMPLETE, // 0x0A + CONFIGURATION_ACKNOWLEDGED, // 0x0B + CLICK_WINDOW_BUTTON, // 0x0C + CLICK_WINDOW, // 0x0D + CLOSE_WINDOW, // 0x0E + CONTAINER_SLOT_STATE_CHANGED, // 0x0F + PLUGIN_MESSAGE, // 0x10 + EDIT_BOOK, // 0x11 + ENTITY_NBT_REQUEST, // 0x12 + INTERACT_ENTITY, // 0x13 + GENERATE_JIGSAW, // 0x14 + KEEP_ALIVE, // 0x15 + LOCK_DIFFICULTY, // 0x16 + PLAYER_POSITION, // 0x17 + PLAYER_POSITION_AND_ROTATION, // 0x18 + PLAYER_ROTATION, // 0x19 + PLAYER_MOVEMENT, // 0x1A + VEHICLE_MOVE, // 0x1B + STEER_BOAT, // 0x1C + PICK_ITEM, // 0x1D + PING_REQUEST, // 0x1E + CRAFT_RECIPE_REQUEST, // 0x1F + PLAYER_ABILITIES, // 0x20 + PLAYER_DIGGING, // 0x21 + ENTITY_ACTION, // 0x22 + STEER_VEHICLE, // 0x23 + PONG, // 0x24 + RECIPE_BOOK_DATA, // 0x25 + SEEN_RECIPE, // 0x26 + RENAME_ITEM, // 0x27 + RESOURCE_PACK_STATUS, // 0x28 + ADVANCEMENT_TAB, // 0x29 + SELECT_TRADE, // 0x2A + SET_BEACON_EFFECT, // 0x2B + HELD_ITEM_CHANGE, // 0x2C + UPDATE_COMMAND_BLOCK, // 0x2D + UPDATE_COMMAND_BLOCK_MINECART, // 0x2E + CREATIVE_INVENTORY_ACTION, // 0x2F + UPDATE_JIGSAW_BLOCK, // 0x30 + UPDATE_STRUCTURE_BLOCK, // 0x31 + UPDATE_SIGN, // 0x32 + ANIMATION, // 0x33 + SPECTATE, // 0x34 + PLAYER_BLOCK_PLACEMENT, // 0x35 + USE_ITEM; // 0x36 + + @Override + public int getId() { + return ordinal(); + } + + @Override + public String getName() { + return name(); + } +} diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/BlockItemPacketRewriter1_20_3.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/BlockItemPacketRewriter1_20_3.java new file mode 100644 index 000000000..fb7831f40 --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/BlockItemPacketRewriter1_20_3.java @@ -0,0 +1,57 @@ +/* + * 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_3to1_20_2.rewriter; + +import com.viaversion.viaversion.api.type.Type; +import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.ClientboundPackets1_20_2; +import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.rewriter.RecipeRewriter1_20_2; +import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.type.ChunkType1_20_2; +import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.Protocol1_20_3To1_20_2; +import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ServerboundPackets1_20_3; +import com.viaversion.viaversion.rewriter.BlockRewriter; +import com.viaversion.viaversion.rewriter.ItemRewriter; + +public final class BlockItemPacketRewriter1_20_3 extends ItemRewriter { + + public BlockItemPacketRewriter1_20_3(final Protocol1_20_3To1_20_2 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_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); + + registerSetCooldown(ClientboundPackets1_20_2.COOLDOWN); + registerWindowItems1_17_1(ClientboundPackets1_20_2.WINDOW_ITEMS); + registerSetSlot1_17_1(ClientboundPackets1_20_2.SET_SLOT); + registerEntityEquipmentArray(ClientboundPackets1_20_2.ENTITY_EQUIPMENT); + registerClickWindow1_17_1(ServerboundPackets1_20_3.CLICK_WINDOW); + registerTradeList1_19(ClientboundPackets1_20_2.TRADE_LIST); + registerCreativeInvAction(ServerboundPackets1_20_3.CREATIVE_INVENTORY_ACTION); + registerWindowPropertyEnchantmentHandler(ClientboundPackets1_20_2.WINDOW_PROPERTY); + registerSpawnParticle1_19(ClientboundPackets1_20_2.SPAWN_PARTICLE); + + new RecipeRewriter1_20_2<>(protocol).register(ClientboundPackets1_20_2.DECLARE_RECIPES); + } +} \ No newline at end of file diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/EntityPacketRewriter1_20_3.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/EntityPacketRewriter1_20_3.java index 37a08865d..1a78201f2 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/EntityPacketRewriter1_20_3.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/EntityPacketRewriter1_20_3.java @@ -17,13 +17,16 @@ */ package com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.rewriter; -import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_19_4; import com.viaversion.viaversion.api.minecraft.entities.EntityType; +import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_19_4; import com.viaversion.viaversion.api.minecraft.metadata.MetaType; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; +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_2; import com.viaversion.viaversion.api.type.types.version.Types1_20_3; +import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.ClientboundConfigurationPackets1_20_2; import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.ClientboundPackets1_20_2; import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.Protocol1_20_3To1_20_2; import com.viaversion.viaversion.rewriter.EntityRewriter; @@ -40,26 +43,54 @@ public final class EntityPacketRewriter1_20_3 extends EntityRewriter { - wrapper.send(Protocol1_20_3To1_20_2.class); - wrapper.cancel(); - - // Make sure the loading screen is closed, continues old client behavior - final PacketWrapper gameEventPacket = wrapper.create(ClientboundPackets1_20_2.GAME_EVENT); - gameEventPacket.write(Type.UNSIGNED_BYTE, (short) 13); - gameEventPacket.write(Type.FLOAT, 0F); - gameEventPacket.send(Protocol1_20_3To1_20_2.class); + protocol.registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_2.REGISTRY_DATA, new PacketHandlers() { + @Override + protected void register() { + map(Type.COMPOUND_TAG); // Registry data + handler(configurationDimensionDataHandler()); + handler(configurationBiomeSizeTracker()); + } }); - protocol.registerClientbound(ClientboundPackets1_20_2.RESPAWN, wrapper -> { - wrapper.send(Protocol1_20_3To1_20_2.class); - wrapper.cancel(); - // Make sure the loading screen is closed, continues old client behavior - final PacketWrapper gameEventPacket = wrapper.create(ClientboundPackets1_20_2.GAME_EVENT); - gameEventPacket.write(Type.UNSIGNED_BYTE, (short) 13); - gameEventPacket.write(Type.FLOAT, 0F); - gameEventPacket.send(Protocol1_20_3To1_20_2.class); + protocol.registerClientbound(ClientboundPackets1_20_2.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()); + handler(wrapper -> sendChunksSentGameEvent(wrapper)); + } }); + + protocol.registerClientbound(ClientboundPackets1_20_2.RESPAWN, new PacketHandlers() { + @Override + public void register() { + map(Type.STRING); // Dimension + map(Type.STRING); // World + handler(worldDataTrackerHandlerByKey()); + handler(wrapper -> sendChunksSentGameEvent(wrapper)); + } + }); + } + + private void sendChunksSentGameEvent(final PacketWrapper wrapper) throws Exception { + wrapper.send(Protocol1_20_3To1_20_2.class); + wrapper.cancel(); + + // Make sure the loading screen is closed, continues old client behavior + final PacketWrapper gameEventPacket = wrapper.create(ClientboundPackets1_20_2.GAME_EVENT); + gameEventPacket.write(Type.UNSIGNED_BYTE, (short) 13); + gameEventPacket.write(Type.FLOAT, 0F); + gameEventPacket.send(Protocol1_20_3To1_20_2.class); } @Override @@ -74,6 +105,20 @@ public final class EntityPacketRewriter1_20_3 extends EntityRewriter { + final int blockState = meta.value(); + meta.setValue(protocol.getMappingData().getNewBlockStateId(blockState)); + }); + + // TODO NEW ENTITY METADATA } @Override 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 f0a18808a..d70f963b1 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/EntityRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/EntityRewriter.java @@ -474,6 +474,10 @@ public abstract class EntityRewriter trackBiomeSize(wrapper.user(), wrapper.get(Type.NAMED_COMPOUND_TAG, 0)); } + public PacketHandler configurationBiomeSizeTracker() { + return wrapper -> trackBiomeSize(wrapper.user(), wrapper.get(Type.COMPOUND_TAG, 0)); + } + public void trackBiomeSize(final UserConnection connection, final CompoundTag registry) { final CompoundTag biomeRegistry = registry.get("minecraft:worldgen/biome"); final ListTag biomes = biomeRegistry.get("value"); @@ -484,6 +488,10 @@ public abstract class EntityRewriter cacheDimensionData(wrapper.user(), wrapper.get(Type.NAMED_COMPOUND_TAG, 0)); } + public PacketHandler configurationDimensionDataHandler() { + return wrapper -> cacheDimensionData(wrapper.user(), wrapper.get(Type.COMPOUND_TAG, 0)); + } + /** * Caches dimension data, later used to get height values and other important info. */ diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/ItemRewriter.java b/common/src/main/java/com/viaversion/viaversion/rewriter/ItemRewriter.java index 63ad46598..6c19894c7 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/ItemRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/ItemRewriter.java @@ -171,6 +171,10 @@ public class ItemRewriter type) { protocol.registerServerbound(packetType, new PacketHandlers() { @Override diff --git a/common/src/main/resources/assets/viaversion/data/identifiers-1.20.3.nbt b/common/src/main/resources/assets/viaversion/data/identifiers-1.20.3.nbt index 6aa0f1ad3f4dda110ed4e2d8e87430f9db93250e..01404fbcb7ff0d2bfe3b2d80e2b54247ca7c2bbf 100644 GIT binary patch delta 27 icmX>qc}a3ZI4fh~<_OkICU)-fjLeeM_|3c7xmW>%GziH6 delta 19 acmca4c~o*kI4fhq<_OkIrp@QrSy%x_kp@Em diff --git a/common/src/main/resources/assets/viaversion/data/mappings-1.20.2to1.20.3.nbt b/common/src/main/resources/assets/viaversion/data/mappings-1.20.2to1.20.3.nbt index cf1b42be7ef26e2c333ba11c95f400423a1fdd12..bd5039e504f6ca8e10a4babdf3381cf89d683a38 100644 GIT binary patch literal 492 zcmZY5Pig`&6bA4wW~SP4FYTN|(M9PAx+u6;qLW3a^9K`KD7{I&LVFW8;zlo^VDF$W z4uRoy@fP_)eta(pAklu;OKZvkfJo4tEz0?ub;@Zgk>skXbT&4h8kj}`Et3g}$lij< zu8Wp(^iTr5J)l0Q$qg@0jai#oOVLBM(ia-9$RT6+1^;=Kufz delta 75 zcmaFEJdtUF9#h { +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); @@ -51,7 +51,7 @@ 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); @@ -50,14 +50,15 @@ public final class BlockItemPacketRewriter1_99 extends ItemRewriter