diff --git a/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java b/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java index 44b80b5da..0732676eb 100644 --- a/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java +++ b/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java @@ -29,8 +29,10 @@ import com.nukkitx.protocol.bedrock.BedrockPong; import com.nukkitx.protocol.bedrock.BedrockServerEventHandler; import com.nukkitx.protocol.bedrock.BedrockServerSession; import com.nukkitx.protocol.bedrock.v361.Bedrock_v361; +import org.geysermc.api.Geyser; import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.configuration.GeyserConfiguration; +import org.geysermc.connector.console.GeyserLogger; import org.geysermc.connector.network.session.GeyserSession; import java.net.InetSocketAddress; @@ -51,7 +53,7 @@ public class ConnectorServerEventHandler implements BedrockServerEventHandler { @Override public BedrockPong onQuery(InetSocketAddress inetSocketAddress) { - System.out.println(inetSocketAddress + " has pinged you!"); + GeyserLogger.DEFAULT.info(inetSocketAddress + " has pinged you!"); GeyserConfiguration config = connector.getConfig(); BedrockPong pong = new BedrockPong(); pong.setEdition("MCPE"); @@ -63,6 +65,7 @@ public class ConnectorServerEventHandler implements BedrockServerEventHandler { pong.setNintendoLimited(false); pong.setProtocolVersion(GeyserConnector.BEDROCK_PACKET_CODEC.getProtocolVersion()); pong.setVersion("1.12.0"); + pong.setIpv4Port(19132); return pong; } @@ -71,7 +74,7 @@ public class ConnectorServerEventHandler implements BedrockServerEventHandler { public void onSessionCreation(BedrockServerSession bedrockServerSession) { bedrockServerSession.setLogging(true); bedrockServerSession.setPacketHandler(new UpstreamPacketHandler(connector, new GeyserSession(connector, bedrockServerSession))); - bedrockServerSession.addDisconnectHandler((x) -> System.out.println("Bedrock user with ip: " + bedrockServerSession.getAddress().getAddress() + " has disconected for reason " + x)); + bedrockServerSession.addDisconnectHandler((x) -> GeyserLogger.DEFAULT.warning("Bedrock user with ip: " + bedrockServerSession.getAddress().getAddress() + " has disconected for reason " + x)); bedrockServerSession.setPacketCodec(Bedrock_v361.V361_CODEC); } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/TranslatorsInit.java b/connector/src/main/java/org/geysermc/connector/network/translators/TranslatorsInit.java index 7498c8a70..623c56bff 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/TranslatorsInit.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/TranslatorsInit.java @@ -1,43 +1,57 @@ package org.geysermc.connector.network.translators; import com.flowpowered.math.vector.Vector2f; +import com.flowpowered.math.vector.Vector2i; import com.flowpowered.math.vector.Vector3f; import com.flowpowered.math.vector.Vector3i; import com.github.steveice10.mc.protocol.packet.ingame.server.ServerJoinGamePacket; import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.ServerPlayerAbilitiesPacket; +import com.nukkitx.nbt.NbtUtils; +import com.nukkitx.nbt.stream.NBTOutputStream; +import com.nukkitx.nbt.tag.CompoundTag; +import com.nukkitx.network.VarInts; import com.nukkitx.protocol.bedrock.data.GamePublishSetting; import com.nukkitx.protocol.bedrock.data.GameRule; import com.nukkitx.protocol.bedrock.packet.*; import com.nukkitx.protocol.bedrock.v340.serializer.FullChunkDataSerializer_v340; import com.nukkitx.protocol.bedrock.v340.serializer.ResourcePackChunkDataSerializer_v340; +import com.nukkitx.protocol.bedrock.v340.serializer.SetSpawnPositionSerializer_v340; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import org.geysermc.connector.console.GeyserLogger; +import org.geysermc.connector.utils.PositionSerializer; import org.geysermc.connector.utils.Toolbox; +import java.io.ByteArrayOutputStream; +import java.util.HashMap; + public class TranslatorsInit { public static void start() { addLoginPackets(); } private static void addLoginPackets() { - Registry.add(ServerJoinGamePacket.class, (x, y) -> { + Registry.add(ServerJoinGamePacket.class, (packet, session) -> { + for(byte b : Toolbox.EMPTY_CHUNK) { + GeyserLogger.DEFAULT.warning("" + b); + } AdventureSettingsPacket bedrockPacket = new AdventureSettingsPacket(); - bedrockPacket.setUniqueEntityId(x.getEntityId()); + bedrockPacket.setUniqueEntityId(packet.getEntityId()); - y.getUpstream().sendPacketImmediately(bedrockPacket); - - System.out.println(y.getUpstream().isClosed()); + session.getUpstream().sendPacketImmediately(bedrockPacket); StartGamePacket startGamePacket = new StartGamePacket(); - startGamePacket.setUniqueEntityId(x.getEntityId()); - startGamePacket.setRuntimeEntityId(x.getEntityId()); - startGamePacket.setPlayerGamemode(x.getGameMode().ordinal()); + startGamePacket.setUniqueEntityId(packet.getEntityId()); + startGamePacket.setRuntimeEntityId(packet.getEntityId()); + startGamePacket.setPlayerGamemode(packet.getGameMode().ordinal()); startGamePacket.setPlayerPosition(new Vector3f(0, 0, 0)); startGamePacket.setRotation(new Vector2f(1, 1)); startGamePacket.setSeed(1111); startGamePacket.setDimensionId(0); startGamePacket.setGeneratorId(0); - startGamePacket.setLevelGamemode(x.getGameMode().ordinal()); + startGamePacket.setLevelGamemode(packet.getGameMode().ordinal()); startGamePacket.setDifficulty(1); startGamePacket.setDefaultSpawn(new Vector3i(0, 0, 0)); startGamePacket.setAcheivementsDisabled(true); @@ -72,44 +86,56 @@ public class TranslatorsInit { startGamePacket.setEnchantmentSeed(1); startGamePacket.setMultiplayerCorrelationId(""); startGamePacket.setCachedPalette(Toolbox.CACHED_PALLETE); + startGamePacket.setItemEntries(Toolbox.ITEMS); - y.getUpstream().sendPacketImmediately(startGamePacket); - - System.out.println(y.getUpstream().isClosed()); + session.getUpstream().sendPacketImmediately(startGamePacket); Vector3f pos = new Vector3f(0, 0, 0); int chunkX = pos.getFloorX() >> 4; - int chunkZ = pos.getFloorX() >> 4; + int chunkZ = pos.getFloorZ() >> 4; - for (int x1 = -3; x1 < 3; x1++) { + for (int x = -3; x < 3; x++) { for (int z = -3; z < 3; z++) { LevelChunkPacket data = new LevelChunkPacket(); - - data.setChunkX(chunkX + x1); - + data.setChunkX(chunkX + x); data.setChunkZ(chunkZ + z); - data.setData(new byte[0]); + data.setData(Toolbox.EMPTY_CHUNK); - y.getUpstream().sendPacketImmediately(data); - - System.out.println(y.getUpstream().isClosed()); + session.getUpstream().sendPacketImmediately(data); } } - PlayStatusPacket packet = new PlayStatusPacket(); + PlayStatusPacket packet1 = new PlayStatusPacket(); - packet.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN); + packet1.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN); - y.getUpstream().sendPacket(packet); - - System.out.println(y.getUpstream().isClosed()); + session.getUpstream().sendPacket(packet1); }); } + + private static byte[] empty(byte[] b, Vector2i pos) { + ByteBuf by = Unpooled.buffer(); + + PositionSerializer.writePEChunkCoord(by, pos); + + return by.array(); + } + + private static class CanWriteToBB extends ByteArrayOutputStream { + + CanWriteToBB() { + super(8192); + } + + void writeTo(ByteBuf buf) { + buf.writeBytes(super.buf, 0, super.count); + } + } } diff --git a/connector/src/main/java/org/geysermc/connector/utils/ArraySerializer.java b/connector/src/main/java/org/geysermc/connector/utils/ArraySerializer.java new file mode 100644 index 000000000..c8b0ceabc --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/utils/ArraySerializer.java @@ -0,0 +1,272 @@ +package org.geysermc.connector.utils; + +import java.lang.reflect.Array; + +import java.util.List; + +import java.util.function.BiConsumer; + +import java.util.function.Consumer; + +import java.util.function.Function; + +import java.util.function.ToIntFunction; + + + +import io.netty.buffer.ByteBuf; + + + +public class ArraySerializer { + + + + public static ByteBuf readShortByteArraySlice(ByteBuf from, int limit) { + + int length = from.readShort(); + + MiscSerializer.checkLimit(length, limit); + + return from.readSlice(length); + + } + + + + @SuppressWarnings("unchecked") + + public static T[] readShortTArray(ByteBuf from, Class tclass, Function elementReader) { + + T[] array = (T[]) Array.newInstance(tclass, from.readShort()); + + for (int i = 0; i < array.length; i++) { + + array[i] = elementReader.apply(from); + + } + + return array; + + } + + + + + + public static byte[] readVarIntByteArray(ByteBuf from) { + + return MiscSerializer.readBytes(from, VarNumberSerializer.readVarInt(from)); + + } + + + + public static ByteBuf readVarIntByteArraySlice(ByteBuf from, int limit) { + + int length = VarNumberSerializer.readVarInt(from); + + MiscSerializer.checkLimit(length, limit); + + return from.readSlice(length); + + } + + + + public static ByteBuf readVarIntByteArraySlice(ByteBuf from) { + + return from.readSlice(VarNumberSerializer.readVarInt(from)); + + } + + + + @SuppressWarnings("unchecked") + + public static T[] readVarIntTArray(ByteBuf from, Class tclass, Function elementReader) { + + T[] array = (T[]) Array.newInstance(tclass, VarNumberSerializer.readVarInt(from)); + + for (int i = 0; i < array.length; i++) { + + array[i] = elementReader.apply(from); + + } + + return array; + + } + + + + public static int[] readVarIntVarIntArray(ByteBuf from) { + + int[] array = new int[VarNumberSerializer.readVarInt(from)]; + + for (int i = 0; i < array.length; i++) { + + array[i] = VarNumberSerializer.readVarInt(from); + + } + + return array; + + } + + + + + + public static void writeShortByteArray(ByteBuf to, ByteBuf data) { + + to.writeShort(data.readableBytes()); + + to.writeBytes(data); + + } + + + + public static void writeShortByteArray(ByteBuf to, byte[] data) { + + to.writeShort(data.length); + + to.writeBytes(data); + + } + + + + public static void writeShortByteArray(ByteBuf to, Consumer dataWriter) { + + MiscSerializer.writeLengthPrefixedBytes(to, (lTo, length) -> lTo.writeShort(length), dataWriter); + + } + + + + public static void writeShortTArray(ByteBuf to, T[] array, BiConsumer elementWriter) { + + to.writeShort(array.length); + + for (T element : array) { + + elementWriter.accept(to, element); + + } + + } + + + + + + public static void writeVarIntByteArray(ByteBuf to, ByteBuf data) { + + VarNumberSerializer.writeVarInt(to, data.readableBytes()); + + to.writeBytes(data); + + } + + + + public static void writeVarIntByteArray(ByteBuf to, byte[] data) { + + VarNumberSerializer.writeVarInt(to, data.length); + + to.writeBytes(data); + + } + + + + public static void writeVarIntByteArray(ByteBuf to, Consumer dataWriter) { + + MiscSerializer.writeLengthPrefixedBytes(to, VarNumberSerializer::writeFixedSizeVarInt, dataWriter); + + } + + + + public static void writeVarIntTArray(ByteBuf to, ToIntFunction arrayWriter) { + + MiscSerializer.writeSizePrefixedData(to, VarNumberSerializer::writeFixedSizeVarInt, arrayWriter); + + } + + + + public static void writeVarIntTArray(ByteBuf to, T[] array, BiConsumer elementWriter) { + + VarNumberSerializer.writeVarInt(to, array.length); + + for (T element : array) { + + elementWriter.accept(to, element); + + } + + } + + + + public static void writeVarIntTArray(ByteBuf to, List array, BiConsumer elementWriter) { + + VarNumberSerializer.writeVarInt(to, array.size()); + + for (T element : array) { + + elementWriter.accept(to, element); + + } + + } + + + + + public static void writeVarIntVarIntArray(ByteBuf to, int[] array) { + + VarNumberSerializer.writeVarInt(to, array.length); + + for (int element : array) { + + VarNumberSerializer.writeVarInt(to, element); + + } + + } + + + + public static void writeSVarIntSVarIntArray(ByteBuf to, int[] array) { + + VarNumberSerializer.writeSVarInt(to, array.length); + + for (int element : array) { + + VarNumberSerializer.writeSVarInt(to, element); + + } + + } + + + + public static void writeVarIntLongArray(ByteBuf to, long[] array) { + + VarNumberSerializer.writeVarInt(to, array.length); + + for (long element : array) { + + to.writeLong(element); + + } + + } + + + +} diff --git a/connector/src/main/java/org/geysermc/connector/utils/MiscSerializer.java b/connector/src/main/java/org/geysermc/connector/utils/MiscSerializer.java new file mode 100644 index 000000000..f928106de --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/utils/MiscSerializer.java @@ -0,0 +1,159 @@ +package org.geysermc.connector.utils; + +import java.text.MessageFormat; + +import java.util.UUID; + +import java.util.function.Consumer; + +import java.util.function.ObjIntConsumer; + +import java.util.function.ToIntFunction; + + + +import io.netty.buffer.ByteBuf; + +import io.netty.handler.codec.DecoderException; + + +public class MiscSerializer { + + + public static void writeVarIntEnum(ByteBuf to, Enum e) { + + VarNumberSerializer.writeVarInt(to, e.ordinal()); + + } + + + + public static void writeByteEnum(ByteBuf to, Enum e) { + + to.writeByte(e.ordinal()); + + } + + + + public static UUID readUUID(ByteBuf from) { + + return new UUID(from.readLong(), from.readLong()); + + } + + + + public static void writeUUID(ByteBuf to, UUID uuid) { + + to.writeLong(uuid.getMostSignificantBits()); + + to.writeLong(uuid.getLeastSignificantBits()); + + } + + + + public static void writePEUUID(ByteBuf to, UUID uuid) { + + to.writeLongLE(uuid.getMostSignificantBits()); + + to.writeLongLE(uuid.getLeastSignificantBits()); + + } + + + + public static byte[] readAllBytes(ByteBuf buf) { + + return MiscSerializer.readBytes(buf, buf.readableBytes()); + + } + + + + public static ByteBuf readAllBytesSlice(ByteBuf from) { + + return from.readSlice(from.readableBytes()); + + } + + + + public static ByteBuf readAllBytesSlice(ByteBuf buf, int limit) { + + checkLimit(buf.readableBytes(), limit); + + return readAllBytesSlice(buf); + + } + + + + public static byte[] readBytes(ByteBuf buf, int length) { + + byte[] result = new byte[length]; + + buf.readBytes(result); + + return result; + + } + + + + protected static void checkLimit(int length, int limit) { + + if (length > limit) { + + throw new DecoderException(MessageFormat.format("Size {0} is bigger than allowed {1}", length, limit)); + + } + + } + + + + public static void writeLengthPrefixedBytes(ByteBuf to, ObjIntConsumer lengthWriter, Consumer dataWriter) { + + int lengthWriterIndex = to.writerIndex(); + + lengthWriter.accept(to, 0); + + int writerIndexDataStart = to.writerIndex(); + + dataWriter.accept(to); + + int writerIndexDataEnd = to.writerIndex(); + + to.writerIndex(lengthWriterIndex); + + lengthWriter.accept(to, writerIndexDataEnd - writerIndexDataStart); + + to.writerIndex(writerIndexDataEnd); + + } + + + + public static void writeSizePrefixedData(ByteBuf to, ObjIntConsumer sizeWriter, ToIntFunction dataWriter) { + + int sizeWriterIndex = to.writerIndex(); + + sizeWriter.accept(to, 0); + + int size = dataWriter.applyAsInt(to); + + int writerIndexDataEnd = to.writerIndex(); + + to.writerIndex(sizeWriterIndex); + + sizeWriter.accept(to, size); + + to.writerIndex(writerIndexDataEnd); + + } + + + +} diff --git a/connector/src/main/java/org/geysermc/connector/utils/PSPEStuff.java b/connector/src/main/java/org/geysermc/connector/utils/PSPEStuff.java new file mode 100644 index 000000000..c513be3fd --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/utils/PSPEStuff.java @@ -0,0 +1,52 @@ +package org.geysermc.connector.utils; + +import io.netty.buffer.ByteBuf; + +public class PSPEStuff { + + public static final int FLAG_RUNTIME = 1; + + public static final int GLOBAL_PALETTE_BITS_PER_BLOCK = 14; + + public static final int SECTION_COUNT_BLOCKS = 16; + + public static final int SECTION_COUNT_LIGHT = 18; + + public static final int BLOCKS_IN_SECTION = 16 * 16 * 16; + + public static final int LIGHT_DATA_LENGTH = BLOCKS_IN_SECTION / 2; + + public static final int EMPTY_SUBCHUNK_BYTES = BLOCKS_IN_SECTION / 8; + + public static final int SUBCHUNK_VERSION = 8; + + public static void writeEmpty(ByteBuf to) { + + to.writeByte(storageHeader(1)); + + to.writeZero(EMPTY_SUBCHUNK_BYTES); + + } + + + + protected static final int storageHeader(int bitsPerBlock) { + + return (bitsPerBlock << 1) | FLAG_RUNTIME; + + } + + public static void writeEmptySubChunk(ByteBuf out) { + + out.writeByte(SUBCHUNK_VERSION); + + out.writeByte(1); //only blockstate storage + + writeEmpty(out); + + VarNumberSerializer.writeSVarInt(out, 1); //Palette size + + VarNumberSerializer.writeSVarInt(out, 0); //Palette: Air + + } +} diff --git a/connector/src/main/java/org/geysermc/connector/utils/PositionSerializer.java b/connector/src/main/java/org/geysermc/connector/utils/PositionSerializer.java new file mode 100644 index 000000000..9f8ba4754 --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/utils/PositionSerializer.java @@ -0,0 +1,191 @@ +package org.geysermc.connector.utils; + +import com.flowpowered.math.vector.Vector2d; +import com.flowpowered.math.vector.Vector2i; +import com.flowpowered.math.vector.Vector3d; +import com.flowpowered.math.vector.Vector3i; +import io.netty.buffer.ByteBuf; +import protocolsupport.protocol.types.Position; + +public class PositionSerializer { + + + + public static void skipPosition(ByteBuf from) { + + from.skipBytes(Long.BYTES); + + } + + + + public static Vector3d readPosition(ByteBuf from) { + + long l = from.readLong(); + + return new Vector3d( + + (int) (l >> 38), (int) (l & 0xFFF), (int) ((l << 26) >> 38) + + ); + + } + + + + public static void readPEPosition(ByteBuf from) { + + VarNumberSerializer.readSVarInt(from); + + VarNumberSerializer.readVarInt(from); + + VarNumberSerializer.readSVarInt(from); + + } + + + + + public static Vector3d readLegacyPositionI(ByteBuf from) { + + return new Vector3d(from.readInt(), from.readInt(), from.readInt()); + + } + + + + public static void writePosition(ByteBuf to, Vector3i position) { + + to.writeLong(((position.getX() & 0x3FFFFFFL) << 38) | ((position.getZ() & 0x3FFFFFFL) << 12) | (position.getY() & 0xFFFL)); + + } + + + + public static void writeLegacyPositionL(ByteBuf to, Position position) { + + to.writeLong(((position.getX() & 0x3FFFFFFL) << 38) | ((position.getY() & 0xFFFL) << 26) | (position.getZ() & 0x3FFFFFFL)); + + } + + + + public static void writePEPosition(ByteBuf to, Position position) { + + VarNumberSerializer.writeSVarInt(to, position.getX()); + + VarNumberSerializer.writeVarInt(to, position.getY()); + + VarNumberSerializer.writeSVarInt(to, position.getZ()); + + } + + + + public static void writeLegacyPositionB(ByteBuf to, Position position) { + + to.writeInt(position.getX()); + + to.writeByte(position.getY()); + + to.writeInt(position.getZ()); + + } + + + + public static void writeLegacyPositionS(ByteBuf to, Position position) { + + to.writeInt(position.getX()); + + to.writeShort(position.getY()); + + to.writeInt(position.getZ()); + + } + + + + public static void writeLegacyPositionI(ByteBuf to, Position position) { + + to.writeInt(position.getX()); + + to.writeInt(position.getY()); + + to.writeInt(position.getZ()); + + } + + + + public static Vector2i readIntChunkCoord(ByteBuf from) { + + return new Vector2i(from.readInt(), from.readInt()); + + } + + + + public static Vector2i readVarIntChunkCoord(ByteBuf from) { + + return new Vector2i(VarNumberSerializer.readVarInt(from), VarNumberSerializer.readVarInt(from)); + + } + + + + public static void writeIntChunkCoord(ByteBuf to, Vector2i chunk) { + + to.writeInt(chunk.getX()); + + to.writeInt(chunk.getY()); + + } + + + + public static Vector2i readPEChunkCoord(ByteBuf from) { + + return new Vector2i(VarNumberSerializer.readSVarInt(from), VarNumberSerializer.readSVarInt(from)); + + } + + + + public static void writePEChunkCoord(ByteBuf to, Vector2i chunk) { + + VarNumberSerializer.writeSVarInt(to, chunk.getX()); + + VarNumberSerializer.writeSVarInt(to, chunk.getY()); + + } + + + + public static int readLocalCoord(ByteBuf from) { + + return from.readUnsignedShort(); + + } + + + + public static void writeLocalCoord(ByteBuf to, int coord) { + + to.writeShort(coord); + + } + + + + public static void writeVarIntChunkCoord(ByteBuf to, Vector2i chunk) { + + VarNumberSerializer.writeVarInt(to, chunk.getX()); + + VarNumberSerializer.writeVarInt(to, chunk.getY()); + + } + + + +} \ No newline at end of file diff --git a/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java b/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java index 4875b5a3b..0b6fe955a 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java +++ b/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java @@ -4,15 +4,14 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.CollectionType; import com.nukkitx.network.VarInts; +import com.nukkitx.protocol.bedrock.packet.StartGamePacket; import com.nukkitx.protocol.bedrock.v361.BedrockUtils; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; +import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; +import java.util.*; public class Toolbox { static { @@ -40,8 +39,50 @@ public class Toolbox { CACHED_PALLETE = b; + + + + InputStream stream2 = Toolbox.class.getClassLoader().getResourceAsStream("items.json"); + if (stream2 == null) { + throw new AssertionError("Items Table not found"); + } + + ObjectMapper mapper2 = new ObjectMapper(); + + ArrayList s = new ArrayList<>(); + try { + s = mapper2.readValue(stream2, ArrayList.class); + } catch (Exception e) { + e.printStackTrace(); + } + + ArrayList l = new ArrayList<>(); + + for(HashMap e : s) { + l.add(new StartGamePacket.ItemEntry((String) e.get("name"), ((Integer) e.get("id")).shortValue())); + } + + ITEMS = l; + + ByteBuf serializer; + + serializer = Unpooled.buffer(); + serializer.writeShortLE(1); + ArraySerializer.writeVarIntByteArray(serializer, (chunkdata) -> { + PSPEStuff.writeEmptySubChunk(chunkdata); + chunkdata.writeZero(512); + chunkdata.writeZero(256); + chunkdata.writeByte(0); + }); + + EMPTY_CHUNK = MiscSerializer.readAllBytes(serializer); + } + public static final Collection ITEMS; + public static final ByteBuf CACHED_PALLETE; + public static final byte[] EMPTY_CHUNK; + } \ No newline at end of file diff --git a/connector/src/main/java/org/geysermc/connector/utils/VarNumberSerializer.java b/connector/src/main/java/org/geysermc/connector/utils/VarNumberSerializer.java new file mode 100644 index 000000000..02d055791 --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/utils/VarNumberSerializer.java @@ -0,0 +1,177 @@ +package org.geysermc.connector.utils; + +import io.netty.buffer.ByteBuf; + +import io.netty.handler.codec.DecoderException; + + + +public class VarNumberSerializer { + + + + public static final int MAX_LENGTH = 5; + + + + public static void writeFixedSizeVarInt(ByteBuf to, int i) { + + int writerIndex = to.writerIndex(); + + while ((i & 0xFFFFFF80) != 0x0) { + + to.writeByte(i | 0x80); + + i >>>= 7; + + } + + int paddingBytes = MAX_LENGTH - (to.writerIndex() - writerIndex) - 1; + + if (paddingBytes == 0) { + + to.writeByte(i); + + } else { + + to.writeByte(i | 0x80); + + while (--paddingBytes > 0) { + + to.writeByte(0x80); + + } + + to.writeByte(0); + + } + + } + + + + public static int readVarInt(ByteBuf from) { + + int value = 0; + + int length = 0; + + byte part; + + do { + + part = from.readByte(); + + value |= (part & 0x7F) << (length++ * 7); + + if (length > MAX_LENGTH) { + + throw new DecoderException("VarInt too big"); + + } + + } while (part < 0); + + return value; + + } + + + + public static void writeVarInt(ByteBuf to, int i) { + + while ((i & 0xFFFFFF80) != 0x0) { + + to.writeByte(i | 0x80); + + i >>>= 7; + + } + + to.writeByte(i); + + } + + + + public static int readSVarInt(ByteBuf from) { + + int varint = readVarInt(from); + + return (varint >> 1) ^ -(varint & 1); + + } + + + + public static void writeSVarInt(ByteBuf to, int varint) { + + writeVarInt(to, (varint << 1) ^ (varint >> 31)); + + } + + + + public static long readVarLong(ByteBuf from) { + + long varlong = 0L; + + int length = 0; + + byte part; + + do { + + part = from.readByte(); + + varlong |= (part & 0x7F) << (length++ * 7); + + if (length > 10) { + + throw new RuntimeException("VarLong too big"); + + } + + } while ((part & 0x80) == 0x80); + + return varlong; + + } + + + + public static void writeVarLong(ByteBuf to, long varlong) { + + while ((varlong & 0xFFFFFFFFFFFFFF80L) != 0x0L) { + + to.writeByte((int) (varlong & 0x7FL) | 0x80); + + varlong >>>= 7; + + } + + to.writeByte((int) varlong); + + } + + + + public static long readSVarLong(ByteBuf from) { + + long varlong = readVarLong(from); + + return (varlong >> 1) ^ -(varlong & 1); + + } + + + + public static void writeSVarLong(ByteBuf to, long varlong) { + + writeVarLong(to, (varlong << 1) ^ (varlong >> 63)); + + } + + + +} diff --git a/connector/src/main/resources/items.json b/connector/src/main/resources/items.json new file mode 100644 index 000000000..9e569199c --- /dev/null +++ b/connector/src/main/resources/items.json @@ -0,0 +1,2758 @@ +[ + { + "name": "minecraft:item.reeds", + "id": 83 + }, + { + "name": "minecraft:air", + "id": -158 + }, + { + "name": "minecraft:stripped_jungle_log", + "id": -7 + }, + { + "name": "minecraft:unlit_redstone_torch", + "id": 75 + }, + { + "name": "minecraft:item.birch_door", + "id": 194 + }, + { + "name": "minecraft:apple", + "id": 260 + }, + { + "name": "minecraft:cooked_porkchop", + "id": 320 + }, + { + "name": "minecraft:beacon", + "id": 138 + }, + { + "name": "minecraft:stone_stairs", + "id": 67 + }, + { + "name": "minecraft:appleenchanted", + "id": 466 + }, + { + "name": "minecraft:tripwire", + "id": 132 + }, + { + "name": "minecraft:leather_leggings", + "id": 300 + }, + { + "name": "minecraft:bread", + "id": 297 + }, + { + "name": "minecraft:porkchop", + "id": 319 + }, + { + "name": "minecraft:spruce_fence_gate", + "id": 183 + }, + { + "name": "minecraft:fish", + "id": 349 + }, + { + "name": "minecraft:element_52", + "id": -63 + }, + { + "name": "minecraft:diamond_sword", + "id": 276 + }, + { + "name": "minecraft:element_38", + "id": -49 + }, + { + "name": "minecraft:sandstone_stairs", + "id": 128 + }, + { + "name": "minecraft:acacia_sign", + "id": 475 + }, + { + "name": "minecraft:rabbit_stew", + "id": 413 + }, + { + "name": "minecraft:birch_sign", + "id": 473 + }, + { + "name": "minecraft:horsearmorgold", + "id": 418 + }, + { + "name": "minecraft:element_74", + "id": -85 + }, + { + "name": "minecraft:pufferfish", + "id": 462 + }, + { + "name": "minecraft:redstone_block", + "id": 152 + }, + { + "name": "minecraft:golden_apple", + "id": 322 + }, + { + "name": "minecraft:item.wooden_door", + "id": 64 + }, + { + "name": "minecraft:emerald", + "id": 388 + }, + { + "name": "minecraft:element_47", + "id": -58 + }, + { + "name": "minecraft:mushroom_stew", + "id": 282 + }, + { + "name": "minecraft:stone_axe", + "id": 275 + }, + { + "name": "minecraft:salmon", + "id": 460 + }, + { + "name": "minecraft:feather", + "id": 288 + }, + { + "name": "minecraft:clownfish", + "id": 461 + }, + { + "name": "minecraft:diamond", + "id": 264 + }, + { + "name": "minecraft:cooked_fish", + "id": 350 + }, + { + "name": "minecraft:element_32", + "id": -43 + }, + { + "name": "minecraft:double_stone_slab4", + "id": -166 + }, + { + "name": "minecraft:element_5", + "id": -16 + }, + { + "name": "minecraft:element_25", + "id": -36 + }, + { + "name": "minecraft:polished_granite_stairs", + "id": -172 + }, + { + "name": "minecraft:bowl", + "id": 281 + }, + { + "name": "minecraft:red_mushroom_block", + "id": 100 + }, + { + "name": "minecraft:mossy_stone_brick_stairs", + "id": -175 + }, + { + "name": "minecraft:cooked_salmon", + "id": 463 + }, + { + "name": "minecraft:element_87", + "id": -98 + }, + { + "name": "minecraft:pumpkin_seeds", + "id": 361 + }, + { + "name": "minecraft:element_53", + "id": -64 + }, + { + "name": "minecraft:dried_kelp", + "id": 464 + }, + { + "name": "minecraft:brewingstandblock", + "id": 117 + }, + { + "name": "minecraft:wooden_pickaxe", + "id": 270 + }, + { + "name": "minecraft:cookie", + "id": 357 + }, + { + "name": "minecraft:gold_ingot", + "id": 266 + }, + { + "name": "minecraft:sweet_berries", + "id": 477 + }, + { + "name": "minecraft:melon", + "id": 360 + }, + { + "name": "minecraft:iron_pickaxe", + "id": 257 + }, + { + "name": "minecraft:glow_stick", + "id": 166 + }, + { + "name": "minecraft:beef", + "id": 363 + }, + { + "name": "minecraft:stone_hoe", + "id": 291 + }, + { + "name": "minecraft:cooked_beef", + "id": 364 + }, + { + "name": "minecraft:lime_glazed_terracotta", + "id": 225 + }, + { + "name": "minecraft:chicken", + "id": 365 + }, + { + "name": "minecraft:element_31", + "id": -42 + }, + { + "name": "minecraft:cooked_chicken", + "id": 366 + }, + { + "name": "minecraft:rotten_flesh", + "id": 367 + }, + { + "name": "minecraft:darkoak_sign", + "id": 476 + }, + { + "name": "minecraft:stone_sword", + "id": 272 + }, + { + "name": "minecraft:spider_eye", + "id": 375 + }, + { + "name": "minecraft:diamond_axe", + "id": 279 + }, + { + "name": "minecraft:element_105", + "id": -116 + }, + { + "name": "minecraft:carrot", + "id": 391 + }, + { + "name": "minecraft:stripped_birch_log", + "id": -6 + }, + { + "name": "minecraft:potato", + "id": 392 + }, + { + "name": "minecraft:baked_potato", + "id": 393 + }, + { + "name": "minecraft:element_15", + "id": -26 + }, + { + "name": "minecraft:carpet", + "id": 171 + }, + { + "name": "minecraft:poisonous_potato", + "id": 394 + }, + { + "name": "minecraft:beetroot_seeds", + "id": 458 + }, + { + "name": "minecraft:noteblock", + "id": 25 + }, + { + "name": "minecraft:golden_carrot", + "id": 396 + }, + { + "name": "minecraft:pumpkin_pie", + "id": 400 + }, + { + "name": "minecraft:beetroot", + "id": 457 + }, + { + "name": "minecraft:coral_fan_dead", + "id": -134 + }, + { + "name": "minecraft:iron_ingot", + "id": 265 + }, + { + "name": "minecraft:beetroot_soup", + "id": 459 + }, + { + "name": "minecraft:rabbit", + "id": 411 + }, + { + "name": "minecraft:cooked_rabbit", + "id": 412 + }, + { + "name": "minecraft:iron_helmet", + "id": 306 + }, + { + "name": "minecraft:wheat_seeds", + "id": 295 + }, + { + "name": "minecraft:melon_seeds", + "id": 362 + }, + { + "name": "minecraft:lit_redstone_ore", + "id": 74 + }, + { + "name": "minecraft:nether_wart", + "id": 372 + }, + { + "name": "minecraft:record_strad", + "id": 508 + }, + { + "name": "minecraft:iron_sword", + "id": 267 + }, + { + "name": "minecraft:iron_shovel", + "id": 256 + }, + { + "name": "minecraft:stone_pickaxe", + "id": 274 + }, + { + "name": "minecraft:leather", + "id": 334 + }, + { + "name": "minecraft:command_block_minecart", + "id": 443 + }, + { + "name": "minecraft:stone_shovel", + "id": 273 + }, + { + "name": "minecraft:written_book", + "id": 387 + }, + { + "name": "minecraft:diorite_stairs", + "id": -170 + }, + { + "name": "minecraft:arrow", + "id": 262 + }, + { + "name": "minecraft:element_97", + "id": -108 + }, + { + "name": "minecraft:campfire", + "id": 720 + }, + { + "name": "minecraft:polished_andesite_stairs", + "id": -174 + }, + { + "name": "minecraft:acacia_stairs", + "id": 163 + }, + { + "name": "minecraft:iron_axe", + "id": 258 + }, + { + "name": "minecraft:flint_and_steel", + "id": 259 + }, + { + "name": "minecraft:bow", + "id": 261 + }, + { + "name": "minecraft:nautilus_shell", + "id": 465 + }, + { + "name": "minecraft:coal", + "id": 263 + }, + { + "name": "minecraft:bookshelf", + "id": 47 + }, + { + "name": "minecraft:wooden_sword", + "id": 268 + }, + { + "name": "minecraft:diamond_pickaxe", + "id": 278 + }, + { + "name": "minecraft:deadbush", + "id": 32 + }, + { + "name": "minecraft:ender_chest", + "id": 130 + }, + { + "name": "minecraft:record_stal", + "id": 507 + }, + { + "name": "minecraft:wooden_shovel", + "id": 269 + }, + { + "name": "minecraft:dark_oak_trapdoor", + "id": -147 + }, + { + "name": "minecraft:record_mall", + "id": 505 + }, + { + "name": "minecraft:wooden_axe", + "id": 271 + }, + { + "name": "minecraft:powered_comparator", + "id": 150 + }, + { + "name": "minecraft:diamond_shovel", + "id": 277 + }, + { + "name": "minecraft:golden_rail", + "id": 27 + }, + { + "name": "minecraft:lit_furnace", + "id": 62 + }, + { + "name": "minecraft:stick", + "id": 280 + }, + { + "name": "minecraft:slime_ball", + "id": 341 + }, + { + "name": "minecraft:element_58", + "id": -69 + }, + { + "name": "minecraft:golden_sword", + "id": 283 + }, + { + "name": "minecraft:golden_shovel", + "id": 284 + }, + { + "name": "minecraft:chest", + "id": 54 + }, + { + "name": "minecraft:golden_pickaxe", + "id": 285 + }, + { + "name": "minecraft:golden_axe", + "id": 286 + }, + { + "name": "minecraft:element_62", + "id": -73 + }, + { + "name": "minecraft:string", + "id": 287 + }, + { + "name": "minecraft:glowstone_dust", + "id": 348 + }, + { + "name": "minecraft:gunpowder", + "id": 289 + }, + { + "name": "minecraft:spawn_egg", + "id": 383 + }, + { + "name": "minecraft:fence", + "id": 85 + }, + { + "name": "minecraft:wooden_hoe", + "id": 290 + }, + { + "name": "minecraft:shulker_shell", + "id": 445 + }, + { + "name": "minecraft:iron_hoe", + "id": 292 + }, + { + "name": "minecraft:diamond_hoe", + "id": 293 + }, + { + "name": "minecraft:golden_hoe", + "id": 294 + }, + { + "name": "minecraft:turtle_shell_piece", + "id": 468 + }, + { + "name": "minecraft:sweet_berry_bush", + "id": -207 + }, + { + "name": "minecraft:info_update2", + "id": 249 + }, + { + "name": "minecraft:muttoncooked", + "id": 424 + }, + { + "name": "minecraft:wheat", + "id": 296 + }, + { + "name": "minecraft:dark_oak_door", + "id": 431 + }, + { + "name": "minecraft:grindstone", + "id": -195 + }, + { + "name": "minecraft:element_46", + "id": -57 + }, + { + "name": "minecraft:potion", + "id": 373 + }, + { + "name": "minecraft:leather_helmet", + "id": 298 + }, + { + "name": "minecraft:element_48", + "id": -59 + }, + { + "name": "minecraft:leather_chestplate", + "id": 299 + }, + { + "name": "minecraft:leather_boots", + "id": 301 + }, + { + "name": "minecraft:lectern", + "id": -194 + }, + { + "name": "minecraft:smithing_table", + "id": -202 + }, + { + "name": "minecraft:bedrock", + "id": 7 + }, + { + "name": "minecraft:chainmail_helmet", + "id": 302 + }, + { + "name": "minecraft:stonebrick", + "id": 98 + }, + { + "name": "minecraft:chainmail_chestplate", + "id": 303 + }, + { + "name": "minecraft:lit_blast_furnace", + "id": -214 + }, + { + "name": "minecraft:element_11", + "id": -22 + }, + { + "name": "minecraft:chainmail_leggings", + "id": 304 + }, + { + "name": "minecraft:saddle", + "id": 329 + }, + { + "name": "minecraft:purpur_block", + "id": 201 + }, + { + "name": "minecraft:chainmail_boots", + "id": 305 + }, + { + "name": "minecraft:ladder", + "id": 65 + }, + { + "name": "minecraft:iron_chestplate", + "id": 307 + }, + { + "name": "minecraft:diamond_helmet", + "id": 310 + }, + { + "name": "minecraft:iron_leggings", + "id": 308 + }, + { + "name": "minecraft:iron_boots", + "id": 309 + }, + { + "name": "minecraft:element_104", + "id": -115 + }, + { + "name": "minecraft:chorus_fruit_popped", + "id": 433 + }, + { + "name": "minecraft:diamond_chestplate", + "id": 311 + }, + { + "name": "minecraft:diamond_leggings", + "id": 312 + }, + { + "name": "minecraft:element_75", + "id": -86 + }, + { + "name": "minecraft:diamond_boots", + "id": 313 + }, + { + "name": "minecraft:acacia_button", + "id": -140 + }, + { + "name": "minecraft:standing_banner", + "id": 176 + }, + { + "name": "minecraft:golden_helmet", + "id": 314 + }, + { + "name": "minecraft:golden_chestplate", + "id": 315 + }, + { + "name": "minecraft:golden_leggings", + "id": 316 + }, + { + "name": "minecraft:golden_boots", + "id": 317 + }, + { + "name": "minecraft:item.hopper", + "id": 154 + }, + { + "name": "minecraft:shield", + "id": 513 + }, + { + "name": "minecraft:flint", + "id": 318 + }, + { + "name": "minecraft:painting", + "id": 321 + }, + { + "name": "minecraft:sign", + "id": 323 + }, + { + "name": "minecraft:wooden_door", + "id": 324 + }, + { + "name": "minecraft:bucket", + "id": 325 + }, + { + "name": "minecraft:minecart", + "id": 328 + }, + { + "name": "minecraft:prismarine_stairs", + "id": -2 + }, + { + "name": "minecraft:iron_door", + "id": 330 + }, + { + "name": "minecraft:tripwire_hook", + "id": 131 + }, + { + "name": "minecraft:redstone", + "id": 331 + }, + { + "name": "minecraft:andesite_stairs", + "id": -171 + }, + { + "name": "minecraft:sponge", + "id": 19 + }, + { + "name": "minecraft:snowball", + "id": 332 + }, + { + "name": "minecraft:boat", + "id": 333 + }, + { + "name": "minecraft:item.dark_oak_door", + "id": 197 + }, + { + "name": "minecraft:kelp", + "id": 335 + }, + { + "name": "minecraft:brick", + "id": 336 + }, + { + "name": "minecraft:clay_ball", + "id": 337 + }, + { + "name": "minecraft:real_double_stone_slab", + "id": 43 + }, + { + "name": "minecraft:reeds", + "id": 338 + }, + { + "name": "minecraft:dirt", + "id": 3 + }, + { + "name": "minecraft:magma", + "id": 213 + }, + { + "name": "minecraft:red_mushroom", + "id": 40 + }, + { + "name": "minecraft:paper", + "id": 339 + }, + { + "name": "minecraft:book", + "id": 340 + }, + { + "name": "minecraft:chest_minecart", + "id": 342 + }, + { + "name": "minecraft:flowing_lava", + "id": 10 + }, + { + "name": "minecraft:element_86", + "id": -97 + }, + { + "name": "minecraft:red_glazed_terracotta", + "id": 234 + }, + { + "name": "minecraft:crafting_table", + "id": 58 + }, + { + "name": "minecraft:egg", + "id": 344 + }, + { + "name": "minecraft:real_double_stone_slab4", + "id": -168 + }, + { + "name": "minecraft:end_gateway", + "id": 209 + }, + { + "name": "minecraft:compass", + "id": 345 + }, + { + "name": "minecraft:horsearmordiamond", + "id": 419 + }, + { + "name": "minecraft:sapling", + "id": 6 + }, + { + "name": "minecraft:fishing_rod", + "id": 346 + }, + { + "name": "minecraft:name_tag", + "id": 421 + }, + { + "name": "minecraft:clock", + "id": 347 + }, + { + "name": "minecraft:element_96", + "id": -107 + }, + { + "name": "minecraft:dye", + "id": 351 + }, + { + "name": "minecraft:anvil", + "id": 145 + }, + { + "name": "minecraft:conduit", + "id": -157 + }, + { + "name": "minecraft:bone", + "id": 352 + }, + { + "name": "minecraft:soul_sand", + "id": 88 + }, + { + "name": "minecraft:sugar", + "id": 353 + }, + { + "name": "minecraft:cake", + "id": 354 + }, + { + "name": "minecraft:element_113", + "id": -124 + }, + { + "name": "minecraft:mossy_cobblestone", + "id": 48 + }, + { + "name": "minecraft:bed", + "id": 355 + }, + { + "name": "minecraft:flowing_water", + "id": 8 + }, + { + "name": "minecraft:item.frame", + "id": 199 + }, + { + "name": "minecraft:repeater", + "id": 356 + }, + { + "name": "minecraft:map", + "id": 358 + }, + { + "name": "minecraft:shears", + "id": 359 + }, + { + "name": "minecraft:double_stone_slab2", + "id": 182 + }, + { + "name": "minecraft:element_3", + "id": -14 + }, + { + "name": "minecraft:element_23", + "id": -34 + }, + { + "name": "minecraft:skull", + "id": 397 + }, + { + "name": "minecraft:ender_pearl", + "id": 368 + }, + { + "name": "minecraft:carved_pumpkin", + "id": -155 + }, + { + "name": "minecraft:yellow_flower", + "id": 37 + }, + { + "name": "minecraft:shulker_box", + "id": 218 + }, + { + "name": "minecraft:blaze_rod", + "id": 369 + }, + { + "name": "minecraft:lit_pumpkin", + "id": 91 + }, + { + "name": "minecraft:ghast_tear", + "id": 370 + }, + { + "name": "minecraft:gold_nugget", + "id": 371 + }, + { + "name": "minecraft:glass_bottle", + "id": 374 + }, + { + "name": "minecraft:emptymap", + "id": 395 + }, + { + "name": "minecraft:fermented_spider_eye", + "id": 376 + }, + { + "name": "minecraft:element_81", + "id": -92 + }, + { + "name": "minecraft:monster_egg", + "id": 97 + }, + { + "name": "minecraft:blaze_powder", + "id": 377 + }, + { + "name": "minecraft:armor_stand", + "id": 425 + }, + { + "name": "minecraft:magma_cream", + "id": 378 + }, + { + "name": "minecraft:brewing_stand", + "id": 379 + }, + { + "name": "minecraft:darkoak_standing_sign", + "id": -192 + }, + { + "name": "minecraft:glowingobsidian", + "id": 246 + }, + { + "name": "minecraft:cauldron", + "id": 380 + }, + { + "name": "minecraft:nether_brick", + "id": 112 + }, + { + "name": "minecraft:ender_eye", + "id": 381 + }, + { + "name": "minecraft:experience_bottle", + "id": 384 + }, + { + "name": "minecraft:speckled_melon", + "id": 382 + }, + { + "name": "minecraft:coral", + "id": -131 + }, + { + "name": "minecraft:fireball", + "id": 385 + }, + { + "name": "minecraft:writable_book", + "id": 386 + }, + { + "name": "minecraft:frame", + "id": 389 + }, + { + "name": "minecraft:smoker", + "id": -198 + }, + { + "name": "minecraft:flower_pot", + "id": 390 + }, + { + "name": "minecraft:carrotonastick", + "id": 398 + }, + { + "name": "minecraft:netherstar", + "id": 399 + }, + { + "name": "minecraft:element_16", + "id": -27 + }, + { + "name": "minecraft:fireworks", + "id": 401 + }, + { + "name": "minecraft:element_30", + "id": -41 + }, + { + "name": "minecraft:fireworkscharge", + "id": 402 + }, + { + "name": "minecraft:trident", + "id": 455 + }, + { + "name": "minecraft:enchanted_book", + "id": 403 + }, + { + "name": "minecraft:comparator", + "id": 404 + }, + { + "name": "minecraft:netherbrick", + "id": 405 + }, + { + "name": "minecraft:concrete", + "id": 236 + }, + { + "name": "minecraft:element_73", + "id": -84 + }, + { + "name": "minecraft:quartz", + "id": 406 + }, + { + "name": "minecraft:tnt_minecart", + "id": 407 + }, + { + "name": "minecraft:leaves2", + "id": 161 + }, + { + "name": "minecraft:element_102", + "id": -113 + }, + { + "name": "minecraft:coral_fan_hang2", + "id": -136 + }, + { + "name": "minecraft:element_67", + "id": -78 + }, + { + "name": "minecraft:hopper_minecart", + "id": 408 + }, + { + "name": "minecraft:lead", + "id": 420 + }, + { + "name": "minecraft:sea_pickle", + "id": -156 + }, + { + "name": "minecraft:hopper", + "id": 410 + }, + { + "name": "minecraft:rabbit_foot", + "id": 414 + }, + { + "name": "minecraft:rabbit_hide", + "id": 415 + }, + { + "name": "minecraft:acacia_standing_sign", + "id": -190 + }, + { + "name": "minecraft:horsearmorleather", + "id": 416 + }, + { + "name": "minecraft:item.wheat", + "id": 59 + }, + { + "name": "minecraft:horsearmoriron", + "id": 417 + }, + { + "name": "minecraft:record_13", + "id": 500 + }, + { + "name": "minecraft:record_cat", + "id": 501 + }, + { + "name": "minecraft:element_89", + "id": -100 + }, + { + "name": "minecraft:stone_button", + "id": 77 + }, + { + "name": "minecraft:record_blocks", + "id": 502 + }, + { + "name": "minecraft:bamboo", + "id": -163 + }, + { + "name": "minecraft:element_72", + "id": -83 + }, + { + "name": "minecraft:record_chirp", + "id": 503 + }, + { + "name": "minecraft:frosted_ice", + "id": 207 + }, + { + "name": "minecraft:record_far", + "id": 504 + }, + { + "name": "minecraft:record_wait", + "id": 511 + }, + { + "name": "minecraft:spruce_door", + "id": 427 + }, + { + "name": "minecraft:record_mellohi", + "id": 506 + }, + { + "name": "minecraft:vine", + "id": 106 + }, + { + "name": "minecraft:record_ward", + "id": 509 + }, + { + "name": "minecraft:jungle_stairs", + "id": 136 + }, + { + "name": "minecraft:ice_bomb", + "id": 453 + }, + { + "name": "minecraft:record_11", + "id": 510 + }, + { + "name": "minecraft:prismarine_crystals", + "id": 422 + }, + { + "name": "minecraft:banner", + "id": 446 + }, + { + "name": "minecraft:glass_pane", + "id": 102 + }, + { + "name": "minecraft:muttonraw", + "id": 423 + }, + { + "name": "minecraft:end_crystal", + "id": 426 + }, + { + "name": "minecraft:element_55", + "id": -66 + }, + { + "name": "minecraft:birch_door", + "id": 428 + }, + { + "name": "minecraft:darkoak_wall_sign", + "id": -193 + }, + { + "name": "minecraft:jungle_door", + "id": 429 + }, + { + "name": "minecraft:acacia_door", + "id": 430 + }, + { + "name": "minecraft:element_116", + "id": -127 + }, + { + "name": "minecraft:chorus_fruit", + "id": 432 + }, + { + "name": "minecraft:cobblestone_wall", + "id": 139 + }, + { + "name": "minecraft:cobblestone", + "id": 4 + }, + { + "name": "minecraft:dragon_breath", + "id": 437 + }, + { + "name": "minecraft:cactus", + "id": 81 + }, + { + "name": "minecraft:splash_potion", + "id": 438 + }, + { + "name": "minecraft:spruce_stairs", + "id": 134 + }, + { + "name": "minecraft:loom", + "id": -204 + }, + { + "name": "minecraft:powered_repeater", + "id": 94 + }, + { + "name": "minecraft:lingering_potion", + "id": 441 + }, + { + "name": "minecraft:elytra", + "id": 444 + }, + { + "name": "minecraft:prismarine_shard", + "id": 409 + }, + { + "name": "minecraft:element_112", + "id": -123 + }, + { + "name": "minecraft:totem", + "id": 450 + }, + { + "name": "minecraft:iron_nugget", + "id": 452 + }, + { + "name": "minecraft:pumpkin_stem", + "id": 104 + }, + { + "name": "minecraft:element_50", + "id": -61 + }, + { + "name": "minecraft:lever", + "id": 69 + }, + { + "name": "minecraft:heart_of_the_sea", + "id": 467 + }, + { + "name": "minecraft:element_92", + "id": -103 + }, + { + "name": "minecraft:grass", + "id": 2 + }, + { + "name": "minecraft:turtle_helmet", + "id": 469 + }, + { + "name": "minecraft:wall_banner", + "id": 177 + }, + { + "name": "minecraft:spruce_button", + "id": -144 + }, + { + "name": "minecraft:phantom_membrane", + "id": 470 + }, + { + "name": "minecraft:crossbow", + "id": 471 + }, + { + "name": "minecraft:spruce_sign", + "id": 472 + }, + { + "name": "minecraft:quartz_stairs", + "id": 156 + }, + { + "name": "minecraft:daylight_detector_inverted", + "id": 178 + }, + { + "name": "minecraft:jungle_sign", + "id": 474 + }, + { + "name": "minecraft:red_flower", + "id": 38 + }, + { + "name": "minecraft:tallgrass", + "id": 31 + }, + { + "name": "minecraft:banner_pattern", + "id": 434 + }, + { + "name": "minecraft:compound", + "id": 499 + }, + { + "name": "minecraft:bleach", + "id": 451 + }, + { + "name": "minecraft:element_40", + "id": -51 + }, + { + "name": "minecraft:rapid_fertilizer", + "id": 449 + }, + { + "name": "minecraft:balloon", + "id": 448 + }, + { + "name": "minecraft:redstone_ore", + "id": 73 + }, + { + "name": "minecraft:stonecutter_block", + "id": -197 + }, + { + "name": "minecraft:medicine", + "id": 447 + }, + { + "name": "minecraft:gold_block", + "id": 41 + }, + { + "name": "minecraft:stripped_oak_log", + "id": -10 + }, + { + "name": "minecraft:blue_ice", + "id": -11 + }, + { + "name": "minecraft:sparkler", + "id": 442 + }, + { + "name": "minecraft:stone", + "id": 1 + }, + { + "name": "minecraft:sand", + "id": 12 + }, + { + "name": "minecraft:stained_hardened_clay", + "id": 159 + }, + { + "name": "minecraft:wool", + "id": 35 + }, + { + "name": "minecraft:unpowered_comparator", + "id": 149 + }, + { + "name": "minecraft:log", + "id": 17 + }, + { + "name": "minecraft:item.kelp", + "id": -138 + }, + { + "name": "minecraft:coral_block", + "id": -132 + }, + { + "name": "minecraft:element_54", + "id": -65 + }, + { + "name": "minecraft:double_stone_slab", + "id": 44 + }, + { + "name": "minecraft:double_stone_slab3", + "id": -162 + }, + { + "name": "minecraft:element_2", + "id": -13 + }, + { + "name": "minecraft:element_22", + "id": -33 + }, + { + "name": "minecraft:real_double_stone_slab2", + "id": 181 + }, + { + "name": "minecraft:real_double_stone_slab3", + "id": -167 + }, + { + "name": "minecraft:coral_fan", + "id": -133 + }, + { + "name": "minecraft:leaves", + "id": 18 + }, + { + "name": "minecraft:element_10", + "id": -21 + }, + { + "name": "minecraft:birch_button", + "id": -141 + }, + { + "name": "minecraft:sandstone", + "id": 24 + }, + { + "name": "minecraft:red_sandstone", + "id": 179 + }, + { + "name": "minecraft:element_91", + "id": -102 + }, + { + "name": "minecraft:wooden_slab", + "id": 158 + }, + { + "name": "minecraft:end_stone", + "id": 121 + }, + { + "name": "minecraft:double_plant", + "id": 175 + }, + { + "name": "minecraft:waterlily", + "id": 111 + }, + { + "name": "minecraft:snow_layer", + "id": 78 + }, + { + "name": "minecraft:black_glazed_terracotta", + "id": 235 + }, + { + "name": "minecraft:planks", + "id": 5 + }, + { + "name": "minecraft:redstone_torch", + "id": 76 + }, + { + "name": "minecraft:quartz_block", + "id": 155 + }, + { + "name": "minecraft:seagrass", + "id": -130 + }, + { + "name": "minecraft:brown_mushroom_block", + "id": 99 + }, + { + "name": "minecraft:log2", + "id": 162 + }, + { + "name": "minecraft:end_portal_frame", + "id": 120 + }, + { + "name": "minecraft:lantern", + "id": -208 + }, + { + "name": "minecraft:prismarine", + "id": 168 + }, + { + "name": "minecraft:sealantern", + "id": 169 + }, + { + "name": "minecraft:hard_stained_glass", + "id": 254 + }, + { + "name": "minecraft:concrete_powder", + "id": 237 + }, + { + "name": "minecraft:stained_glass", + "id": 241 + }, + { + "name": "minecraft:element_82", + "id": -93 + }, + { + "name": "minecraft:stained_glass_pane", + "id": 160 + }, + { + "name": "minecraft:quartz_ore", + "id": 153 + }, + { + "name": "minecraft:undyed_shulker_box", + "id": 205 + }, + { + "name": "minecraft:element_107", + "id": -118 + }, + { + "name": "minecraft:piston", + "id": 33 + }, + { + "name": "minecraft:sticky_piston", + "id": 29 + }, + { + "name": "minecraft:turtle_egg", + "id": -159 + }, + { + "name": "minecraft:acacia_fence_gate", + "id": 187 + }, + { + "name": "minecraft:colored_torch_bp", + "id": 204 + }, + { + "name": "minecraft:lava", + "id": 11 + }, + { + "name": "minecraft:scaffolding", + "id": -165 + }, + { + "name": "minecraft:blast_furnace", + "id": -196 + }, + { + "name": "minecraft:item.cauldron", + "id": 118 + }, + { + "name": "minecraft:barrel", + "id": -203 + }, + { + "name": "minecraft:bell", + "id": -206 + }, + { + "name": "minecraft:element_42", + "id": -53 + }, + { + "name": "minecraft:cartography_table", + "id": -200 + }, + { + "name": "minecraft:end_rod", + "id": 208 + }, + { + "name": "minecraft:fletching_table", + "id": -201 + }, + { + "name": "minecraft:wood", + "id": -212 + }, + { + "name": "minecraft:chemistry_table", + "id": 238 + }, + { + "name": "minecraft:element_70", + "id": -81 + }, + { + "name": "minecraft:tnt", + "id": 46 + }, + { + "name": "minecraft:hard_stained_glass_pane", + "id": 191 + }, + { + "name": "minecraft:colored_torch_rg", + "id": 202 + }, + { + "name": "minecraft:brown_mushroom", + "id": 39 + }, + { + "name": "minecraft:element_0", + "id": 36 + }, + { + "name": "minecraft:element_20", + "id": -31 + }, + { + "name": "minecraft:element_1", + "id": -12 + }, + { + "name": "minecraft:element_21", + "id": -32 + }, + { + "name": "minecraft:element_4", + "id": -15 + }, + { + "name": "minecraft:element_24", + "id": -35 + }, + { + "name": "minecraft:element_6", + "id": -17 + }, + { + "name": "minecraft:element_26", + "id": -37 + }, + { + "name": "minecraft:element_7", + "id": -18 + }, + { + "name": "minecraft:element_27", + "id": -38 + }, + { + "name": "minecraft:element_8", + "id": -19 + }, + { + "name": "minecraft:element_28", + "id": -39 + }, + { + "name": "minecraft:dark_oak_pressure_plate", + "id": -152 + }, + { + "name": "minecraft:element_9", + "id": -20 + }, + { + "name": "minecraft:element_29", + "id": -40 + }, + { + "name": "minecraft:item.spruce_door", + "id": 193 + }, + { + "name": "minecraft:element_12", + "id": -23 + }, + { + "name": "minecraft:cyan_glazed_terracotta", + "id": 229 + }, + { + "name": "minecraft:element_13", + "id": -24 + }, + { + "name": "minecraft:element_14", + "id": -25 + }, + { + "name": "minecraft:iron_ore", + "id": 15 + }, + { + "name": "minecraft:element_17", + "id": -28 + }, + { + "name": "minecraft:element_18", + "id": -29 + }, + { + "name": "minecraft:birch_pressure_plate", + "id": -151 + }, + { + "name": "minecraft:element_19", + "id": -30 + }, + { + "name": "minecraft:wooden_pressure_plate", + "id": 72 + }, + { + "name": "minecraft:element_33", + "id": -44 + }, + { + "name": "minecraft:element_34", + "id": -45 + }, + { + "name": "minecraft:element_35", + "id": -46 + }, + { + "name": "minecraft:composter", + "id": -213 + }, + { + "name": "minecraft:element_36", + "id": -47 + }, + { + "name": "minecraft:element_37", + "id": -48 + }, + { + "name": "minecraft:element_39", + "id": -50 + }, + { + "name": "minecraft:element_41", + "id": -52 + }, + { + "name": "minecraft:hay_block", + "id": 170 + }, + { + "name": "minecraft:element_43", + "id": -54 + }, + { + "name": "minecraft:lit_redstone_lamp", + "id": 124 + }, + { + "name": "minecraft:element_44", + "id": -55 + }, + { + "name": "minecraft:element_45", + "id": -56 + }, + { + "name": "minecraft:element_49", + "id": -60 + }, + { + "name": "minecraft:element_51", + "id": -62 + }, + { + "name": "minecraft:element_56", + "id": -67 + }, + { + "name": "minecraft:element_57", + "id": -68 + }, + { + "name": "minecraft:element_59", + "id": -70 + }, + { + "name": "minecraft:element_60", + "id": -71 + }, + { + "name": "minecraft:dropper", + "id": 125 + }, + { + "name": "minecraft:element_61", + "id": -72 + }, + { + "name": "minecraft:element_63", + "id": -74 + }, + { + "name": "minecraft:element_64", + "id": -75 + }, + { + "name": "minecraft:element_65", + "id": -76 + }, + { + "name": "minecraft:coral_fan_hang3", + "id": -137 + }, + { + "name": "minecraft:element_66", + "id": -77 + }, + { + "name": "minecraft:redstone_lamp", + "id": 123 + }, + { + "name": "minecraft:element_68", + "id": -79 + }, + { + "name": "minecraft:spruce_trapdoor", + "id": -149 + }, + { + "name": "minecraft:purple_glazed_terracotta", + "id": 219 + }, + { + "name": "minecraft:element_69", + "id": -80 + }, + { + "name": "minecraft:iron_block", + "id": 42 + }, + { + "name": "minecraft:element_71", + "id": -82 + }, + { + "name": "minecraft:element_76", + "id": -87 + }, + { + "name": "minecraft:element_77", + "id": -88 + }, + { + "name": "minecraft:water", + "id": 9 + }, + { + "name": "minecraft:element_78", + "id": -89 + }, + { + "name": "minecraft:element_79", + "id": -90 + }, + { + "name": "minecraft:element_80", + "id": -91 + }, + { + "name": "minecraft:netherreactor", + "id": 247 + }, + { + "name": "minecraft:element_83", + "id": -94 + }, + { + "name": "minecraft:element_84", + "id": -95 + }, + { + "name": "minecraft:jungle_wall_sign", + "id": -189 + }, + { + "name": "minecraft:end_brick_stairs", + "id": -178 + }, + { + "name": "minecraft:element_85", + "id": -96 + }, + { + "name": "minecraft:element_88", + "id": -99 + }, + { + "name": "minecraft:element_90", + "id": -101 + }, + { + "name": "minecraft:birch_standing_sign", + "id": -186 + }, + { + "name": "minecraft:gold_ore", + "id": 14 + }, + { + "name": "minecraft:element_93", + "id": -104 + }, + { + "name": "minecraft:element_94", + "id": -105 + }, + { + "name": "minecraft:element_95", + "id": -106 + }, + { + "name": "minecraft:glass", + "id": 20 + }, + { + "name": "minecraft:red_nether_brick", + "id": 215 + }, + { + "name": "minecraft:element_98", + "id": -109 + }, + { + "name": "minecraft:element_99", + "id": -110 + }, + { + "name": "minecraft:element_100", + "id": -111 + }, + { + "name": "minecraft:element_101", + "id": -112 + }, + { + "name": "minecraft:element_103", + "id": -114 + }, + { + "name": "minecraft:element_106", + "id": -117 + }, + { + "name": "minecraft:element_108", + "id": -119 + }, + { + "name": "minecraft:element_109", + "id": -120 + }, + { + "name": "minecraft:element_110", + "id": -121 + }, + { + "name": "minecraft:element_111", + "id": -122 + }, + { + "name": "minecraft:element_114", + "id": -125 + }, + { + "name": "minecraft:birch_fence_gate", + "id": 184 + }, + { + "name": "minecraft:element_115", + "id": -126 + }, + { + "name": "minecraft:element_117", + "id": -128 + }, + { + "name": "minecraft:slime", + "id": 165 + }, + { + "name": "minecraft:spruce_standing_sign", + "id": -181 + }, + { + "name": "minecraft:element_118", + "id": -129 + }, + { + "name": "minecraft:gravel", + "id": 13 + }, + { + "name": "minecraft:detector_rail", + "id": 28 + }, + { + "name": "minecraft:oak_stairs", + "id": 53 + }, + { + "name": "minecraft:coal_ore", + "id": 16 + }, + { + "name": "minecraft:diamond_block", + "id": 57 + }, + { + "name": "minecraft:item.cake", + "id": 92 + }, + { + "name": "minecraft:spruce_pressure_plate", + "id": -154 + }, + { + "name": "minecraft:diamond_ore", + "id": 56 + }, + { + "name": "minecraft:furnace", + "id": 61 + }, + { + "name": "minecraft:underwater_torch", + "id": 239 + }, + { + "name": "minecraft:web", + "id": 30 + }, + { + "name": "minecraft:jungle_standing_sign", + "id": -188 + }, + { + "name": "minecraft:standing_sign", + "id": 63 + }, + { + "name": "minecraft:lapis_ore", + "id": 21 + }, + { + "name": "minecraft:item.bed", + "id": 26 + }, + { + "name": "minecraft:lapis_block", + "id": 22 + }, + { + "name": "minecraft:stripped_acacia_log", + "id": -8 + }, + { + "name": "minecraft:dispenser", + "id": 23 + }, + { + "name": "minecraft:obsidian", + "id": 49 + }, + { + "name": "minecraft:brick_block", + "id": 45 + }, + { + "name": "minecraft:dried_kelp_block", + "id": -139 + }, + { + "name": "minecraft:structure_block", + "id": 252 + }, + { + "name": "minecraft:pistonarmcollision", + "id": 34 + }, + { + "name": "minecraft:green_glazed_terracotta", + "id": 233 + }, + { + "name": "minecraft:acacia_trapdoor", + "id": -145 + }, + { + "name": "minecraft:carrots", + "id": 141 + }, + { + "name": "minecraft:rail", + "id": 66 + }, + { + "name": "minecraft:torch", + "id": 50 + }, + { + "name": "minecraft:mob_spawner", + "id": 52 + }, + { + "name": "minecraft:lava_cauldron", + "id": -210 + }, + { + "name": "minecraft:redstone_wire", + "id": 55 + }, + { + "name": "minecraft:farmland", + "id": 60 + }, + { + "name": "minecraft:wall_sign", + "id": 68 + }, + { + "name": "minecraft:stone_pressure_plate", + "id": 70 + }, + { + "name": "minecraft:red_sandstone_stairs", + "id": 180 + }, + { + "name": "minecraft:item.iron_door", + "id": 71 + }, + { + "name": "minecraft:red_nether_brick_stairs", + "id": -184 + }, + { + "name": "minecraft:ice", + "id": 79 + }, + { + "name": "minecraft:snow", + "id": 80 + }, + { + "name": "minecraft:command_block", + "id": 137 + }, + { + "name": "minecraft:clay", + "id": 82 + }, + { + "name": "minecraft:jukebox", + "id": 84 + }, + { + "name": "minecraft:pumpkin", + "id": 86 + }, + { + "name": "minecraft:item.acacia_door", + "id": 196 + }, + { + "name": "minecraft:nether_brick_stairs", + "id": 114 + }, + { + "name": "minecraft:netherrack", + "id": 87 + }, + { + "name": "minecraft:glowstone", + "id": 89 + }, + { + "name": "minecraft:hard_glass", + "id": 253 + }, + { + "name": "minecraft:portal", + "id": 90 + }, + { + "name": "minecraft:item.beetroot", + "id": 244 + }, + { + "name": "minecraft:unpowered_repeater", + "id": 93 + }, + { + "name": "minecraft:invisiblebedrock", + "id": 95 + }, + { + "name": "minecraft:trapdoor", + "id": 96 + }, + { + "name": "minecraft:item.jungle_door", + "id": 195 + }, + { + "name": "minecraft:iron_bars", + "id": 101 + }, + { + "name": "minecraft:chain_command_block", + "id": 189 + }, + { + "name": "minecraft:melon_block", + "id": 103 + }, + { + "name": "minecraft:emerald_block", + "id": 133 + }, + { + "name": "minecraft:chemical_heat", + "id": 192 + }, + { + "name": "minecraft:melon_stem", + "id": 105 + }, + { + "name": "minecraft:fence_gate", + "id": 107 + }, + { + "name": "minecraft:brick_stairs", + "id": 108 + }, + { + "name": "minecraft:stone_brick_stairs", + "id": 109 + }, + { + "name": "minecraft:mycelium", + "id": 110 + }, + { + "name": "minecraft:smooth_stone", + "id": -183 + }, + { + "name": "minecraft:nether_brick_fence", + "id": 113 + }, + { + "name": "minecraft:item.nether_wart", + "id": 115 + }, + { + "name": "minecraft:enchanting_table", + "id": 116 + }, + { + "name": "minecraft:end_portal", + "id": 119 + }, + { + "name": "minecraft:dragon_egg", + "id": 122 + }, + { + "name": "minecraft:granite_stairs", + "id": -169 + }, + { + "name": "minecraft:podzol", + "id": 243 + }, + { + "name": "minecraft:activator_rail", + "id": 126 + }, + { + "name": "minecraft:cocoa", + "id": 127 + }, + { + "name": "minecraft:emerald_ore", + "id": 129 + }, + { + "name": "minecraft:brown_glazed_terracotta", + "id": 232 + }, + { + "name": "minecraft:pink_glazed_terracotta", + "id": 226 + }, + { + "name": "minecraft:observer", + "id": 251 + }, + { + "name": "minecraft:info_update", + "id": 248 + }, + { + "name": "minecraft:birch_stairs", + "id": 135 + }, + { + "name": "minecraft:coral_fan_hang", + "id": -135 + }, + { + "name": "minecraft:packed_ice", + "id": 174 + }, + { + "name": "minecraft:item.flower_pot", + "id": 140 + }, + { + "name": "minecraft:potatoes", + "id": 142 + }, + { + "name": "minecraft:wooden_button", + "id": 143 + }, + { + "name": "minecraft:item.skull", + "id": 144 + }, + { + "name": "minecraft:trapped_chest", + "id": 146 + }, + { + "name": "minecraft:light_weighted_pressure_plate", + "id": 147 + }, + { + "name": "minecraft:heavy_weighted_pressure_plate", + "id": 148 + }, + { + "name": "minecraft:daylight_detector", + "id": 151 + }, + { + "name": "minecraft:smooth_sandstone_stairs", + "id": -177 + }, + { + "name": "minecraft:repeating_command_block", + "id": 188 + }, + { + "name": "minecraft:double_wooden_slab", + "id": 157 + }, + { + "name": "minecraft:dark_oak_stairs", + "id": 164 + }, + { + "name": "minecraft:iron_trapdoor", + "id": 167 + }, + { + "name": "minecraft:hardened_clay", + "id": 172 + }, + { + "name": "minecraft:coal_block", + "id": 173 + }, + { + "name": "minecraft:purpur_stairs", + "id": 203 + }, + { + "name": "minecraft:jungle_fence_gate", + "id": 185 + }, + { + "name": "minecraft:dark_oak_fence_gate", + "id": 186 + }, + { + "name": "minecraft:grass_path", + "id": 198 + }, + { + "name": "minecraft:bone_block", + "id": 216 + }, + { + "name": "minecraft:normal_stone_stairs", + "id": -180 + }, + { + "name": "minecraft:chorus_flower", + "id": 200 + }, + { + "name": "minecraft:jungle_pressure_plate", + "id": -153 + }, + { + "name": "minecraft:end_bricks", + "id": 206 + }, + { + "name": "minecraft:blue_glazed_terracotta", + "id": 231 + }, + { + "name": "minecraft:movingblock", + "id": 250 + }, + { + "name": "minecraft:light_blue_glazed_terracotta", + "id": 223 + }, + { + "name": "minecraft:nether_wart_block", + "id": 214 + }, + { + "name": "minecraft:white_glazed_terracotta", + "id": 220 + }, + { + "name": "minecraft:orange_glazed_terracotta", + "id": 221 + }, + { + "name": "minecraft:magenta_glazed_terracotta", + "id": 222 + }, + { + "name": "minecraft:yellow_glazed_terracotta", + "id": 224 + }, + { + "name": "minecraft:barrier", + "id": -161 + }, + { + "name": "minecraft:gray_glazed_terracotta", + "id": 227 + }, + { + "name": "minecraft:silver_glazed_terracotta", + "id": 228 + }, + { + "name": "minecraft:chorus_plant", + "id": 240 + }, + { + "name": "minecraft:stonecutter", + "id": 245 + }, + { + "name": "minecraft:reserved6", + "id": 255 + }, + { + "name": "minecraft:dark_prismarine_stairs", + "id": -3 + }, + { + "name": "minecraft:prismarine_bricks_stairs", + "id": -4 + }, + { + "name": "minecraft:stripped_spruce_log", + "id": -5 + }, + { + "name": "minecraft:stripped_dark_oak_log", + "id": -9 + }, + { + "name": "minecraft:fire", + "id": 51 + }, + { + "name": "minecraft:hard_glass_pane", + "id": 190 + }, + { + "name": "minecraft:mossy_cobblestone_stairs", + "id": -179 + }, + { + "name": "minecraft:smooth_red_sandstone_stairs", + "id": -176 + }, + { + "name": "minecraft:bamboo_sapling", + "id": -164 + }, + { + "name": "minecraft:jungle_button", + "id": -143 + }, + { + "name": "minecraft:birch_wall_sign", + "id": -187 + }, + { + "name": "minecraft:spruce_wall_sign", + "id": -182 + }, + { + "name": "minecraft:jungle_trapdoor", + "id": -148 + }, + { + "name": "minecraft:dark_oak_button", + "id": -142 + }, + { + "name": "minecraft:birch_trapdoor", + "id": -146 + }, + { + "name": "minecraft:jigsaw", + "id": -211 + }, + { + "name": "minecraft:acacia_pressure_plate", + "id": -150 + }, + { + "name": "minecraft:bubble_column", + "id": -160 + }, + { + "name": "minecraft:polished_diorite_stairs", + "id": -173 + }, + { + "name": "minecraft:smooth_quartz_stairs", + "id": -185 + }, + { + "name": "minecraft:acacia_wall_sign", + "id": -191 + }, + { + "name": "minecraft:lit_smoker", + "id": -199 + }, + { + "name": "minecraft:item.campfire", + "id": -209 + } +] \ No newline at end of file