From e815f582654b090e0f00831dbd1668417028f68c Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Sun, 13 Oct 2019 14:41:49 -0500 Subject: [PATCH 01/50] Fix sprinting (for now) --- .../translators/bedrock/BedrockActionTranslator.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java index b8382b8c..f5d7d6af 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java @@ -68,13 +68,14 @@ public class BedrockActionTranslator extends PacketTranslator Date: Sun, 13 Oct 2019 15:28:03 -0500 Subject: [PATCH 02/50] Update to latest MCProtocolLib version --- connector/pom.xml | 2 +- .../connector/network/session/cache/ChunkCache.java | 4 ++-- .../connector/network/translators/item/ItemTranslator.java | 4 ++-- .../network/translators/java/JavaBossBarTranslator.java | 6 +++--- .../network/translators/java/JavaTitleTranslator.java | 4 ++-- .../java/entity/JavaEntityPositionRotationTranslator.java | 2 +- .../java/entity/JavaEntityPositionTranslator.java | 2 +- .../java/entity/JavaEntityRotationTranslator.java | 4 +++- .../entity/player/JavaPlayerSetExperienceTranslator.java | 2 +- .../java/entity/spawn/JavaSpawnPlayerTranslator.java | 4 ++-- .../java/scoreboard/JavaDisplayScoreboardTranslator.java | 2 +- .../main/java/org/geysermc/connector/utils/ChunkUtils.java | 4 +--- 12 files changed, 20 insertions(+), 20 deletions(-) diff --git a/connector/pom.xml b/connector/pom.xml index 25d52a00..7f46a9b2 100644 --- a/connector/pom.xml +++ b/connector/pom.xml @@ -105,7 +105,7 @@ com.github.steveice10 mcprotocollib - 1.14.4-SNAPSHOT + 1.14.4-2-SNAPSHOT compile diff --git a/connector/src/main/java/org/geysermc/connector/network/session/cache/ChunkCache.java b/connector/src/main/java/org/geysermc/connector/network/session/cache/ChunkCache.java index cc5590c7..44de2b00 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/cache/ChunkCache.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/cache/ChunkCache.java @@ -65,7 +65,7 @@ public class ChunkCache { Chunk chunk = column.getChunks()[position.getY() >> 4]; Position blockPosition = chunkPosition.getChunkBlock(position.getX(), position.getY(), position.getZ()); if (chunk != null) { - chunk.getBlocks().set(blockPosition.getX(), blockPosition.getY(), blockPosition.getZ(), block); + chunk.set(blockPosition.getX(), blockPosition.getY(), blockPosition.getZ(), block); } } @@ -78,7 +78,7 @@ public class ChunkCache { Chunk chunk = column.getChunks()[position.getY() >> 4]; Position blockPosition = chunkPosition.getChunkBlock(position.getX(), position.getY(), position.getZ()); if (chunk != null) { - BlockState blockState = chunk.getBlocks().get(blockPosition.getX(), blockPosition.getY(), blockPosition.getZ()); + BlockState blockState = chunk.get(blockPosition.getX(), blockPosition.getY(), blockPosition.getZ()); return TranslatorsInit.getBlockTranslator().getBedrockBlock(blockState); } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemTranslator.java index 437a8dc4..d66490f6 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemTranslator.java @@ -68,10 +68,10 @@ public class ItemTranslator { } ItemEntry bedrockItem = getItem(stack); - if (stack.getNBT() == null) { + if (stack.getNbt() == null) { return ItemData.of(bedrockItem.getBedrockId(), (short) bedrockItem.getBedrockData(), stack.getAmount()); } - return ItemData.of(bedrockItem.getBedrockId(), (short) bedrockItem.getBedrockData(), stack.getAmount(), translateToBedrockNBT(stack.getNBT())); + return ItemData.of(bedrockItem.getBedrockId(), (short) bedrockItem.getBedrockData(), stack.getAmount(), translateToBedrockNBT(stack.getNbt())); } public ItemEntry getItem(ItemStack stack) { diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaBossBarTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaBossBarTranslator.java index 3073e469..0d0e0050 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaBossBarTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaBossBarTranslator.java @@ -14,11 +14,11 @@ public class JavaBossBarTranslator extends PacketTranslator @Override public void translate(ServerBossBarPacket packet, GeyserSession session) { BossEventPacket bossEventPacket = new BossEventPacket(); - bossEventPacket.setBossUniqueEntityId(session.getEntityCache().getBossBar(packet.getUUID())); + bossEventPacket.setBossUniqueEntityId(session.getEntityCache().getBossBar(packet.getUuid())); switch (packet.getAction()) { case ADD: - long entityId = session.getEntityCache().addBossBar(packet.getUUID()); + long entityId = session.getEntityCache().addBossBar(packet.getUuid()); addBossEntity(session, entityId); bossEventPacket.setType(BossEventPacket.Type.SHOW); @@ -39,7 +39,7 @@ public class JavaBossBarTranslator extends PacketTranslator break; case REMOVE: bossEventPacket.setType(BossEventPacket.Type.HIDE); - removeBossEntity(session, session.getEntityCache().removeBossBar(packet.getUUID())); + removeBossEntity(session, session.getEntityCache().removeBossBar(packet.getUuid())); break; case UPDATE_STYLE: case UPDATE_FLAGS: diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaTitleTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaTitleTranslator.java index e3d9bbea..a7852ee9 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaTitleTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaTitleTranslator.java @@ -43,7 +43,7 @@ public class JavaTitleTranslator extends PacketTranslator { break; case SUBTITLE: titlePacket.setType(SetTitlePacket.Type.SET_SUBTITLE); - titlePacket.setText(packet.getSubtitle().getFullText()); + titlePacket.setText(packet.getTitle().getFullText()); break; case CLEAR: case RESET: @@ -52,7 +52,7 @@ public class JavaTitleTranslator extends PacketTranslator { break; case ACTION_BAR: titlePacket.setType(SetTitlePacket.Type.SET_ACTIONBAR_MESSAGE); - titlePacket.setText(packet.getActionBar().getFullText()); + titlePacket.setText(packet.getTitle().getFullText()); break; case TIMES: titlePacket.setFadeInTime(packet.getFadeIn()); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityPositionRotationTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityPositionRotationTranslator.java index 1c93c903..8ad46493 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityPositionRotationTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityPositionRotationTranslator.java @@ -41,7 +41,7 @@ public class JavaEntityPositionRotationTranslator extends PacketTranslator Date: Sun, 13 Oct 2019 15:28:46 -0500 Subject: [PATCH 03/50] Remove empty Remapper class from merge conflict --- .../src/main/java/org/geysermc/connector/utils/Remapper.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 connector/src/main/java/org/geysermc/connector/utils/Remapper.java diff --git a/connector/src/main/java/org/geysermc/connector/utils/Remapper.java b/connector/src/main/java/org/geysermc/connector/utils/Remapper.java deleted file mode 100644 index e69de29b..00000000 From 0ac89f4880dec5f6149fe45543065c6411c96d4d Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Tue, 15 Oct 2019 21:47:28 -0500 Subject: [PATCH 04/50] Implement dimension changing and debugize 'moved too quickly' messages --- .../org/geysermc/connector/entity/Entity.java | 2 ++ .../bedrock/BedrockMovePlayerTranslator.java | 9 ++--- .../java/JavaJoinGameTranslator.java | 1 - .../java/JavaRespawnTranslator.java | 34 ++++++++++++++++--- 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/entity/Entity.java b/connector/src/main/java/org/geysermc/connector/entity/Entity.java index af8e4e31..69dcaf0f 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/Entity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/Entity.java @@ -82,6 +82,7 @@ public class Entity { this.valid = false; this.movePending = false; + this.dimension = 0; } public void spawnEntity(GeyserSession session) { @@ -132,6 +133,7 @@ public class Entity { public void moveAbsolute(Vector3f position, Vector3f rotation) { setPosition(position); setRotation(rotation); + this.movePending = true; } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java index 2b85bcf2..51082170 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java @@ -31,6 +31,7 @@ import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.packet.MoveEntityAbsolutePacket; import com.nukkitx.protocol.bedrock.packet.MovePlayerPacket; import com.nukkitx.protocol.bedrock.packet.SetEntityDataPacket; +import org.geysermc.api.ChatColor; import org.geysermc.connector.entity.Entity; import org.geysermc.connector.entity.PlayerEntity; import org.geysermc.connector.entity.type.EntityType; @@ -39,12 +40,12 @@ import org.geysermc.connector.network.translators.PacketTranslator; import org.geysermc.connector.network.translators.block.BlockEntry; public class BedrockMovePlayerTranslator extends PacketTranslator { + @Override public void translate(MovePlayerPacket packet, GeyserSession session) { PlayerEntity entity = session.getPlayerEntity(); if (entity == null || !session.isSpawned()) return; - // can cause invalid moves when packet queue is not empty if (!session.getUpstream().isInitialized()) { MoveEntityAbsolutePacket moveEntityBack = new MoveEntityAbsolutePacket(); moveEntityBack.setRuntimeEntityId(entity.getGeyserId()); @@ -57,7 +58,7 @@ public class BedrockMovePlayerTranslator extends PacketTranslator 100) { - session.getConnector().getLogger().warning(session.getName() + " moved too quickly." + + session.getConnector().getLogger().debug(ChatColor.RED + session.getName() + " moved too quickly." + " current position: " + currentPosition + ", new position: " + newPosition); return false; @@ -122,7 +123,7 @@ public class BedrockMovePlayerTranslator extends PacketTranslator 32) session.setRenderDistance(32); // <3 u ViaVersion but I don't like crashing clients x) ChunkRadiusUpdatedPacket packet1 = new ChunkRadiusUpdatedPacket(); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaRespawnTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaRespawnTranslator.java index 30e2135b..f5f86e19 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaRespawnTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaRespawnTranslator.java @@ -26,7 +26,9 @@ package org.geysermc.connector.network.translators.java; import com.github.steveice10.mc.protocol.packet.ingame.server.ServerRespawnPacket; +import com.nukkitx.protocol.bedrock.packet.ChangeDimensionPacket; import com.nukkitx.protocol.bedrock.packet.PlayStatusPacket; +import com.nukkitx.protocol.bedrock.packet.SetPlayerGameTypePacket; import org.geysermc.connector.entity.Entity; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; @@ -39,10 +41,34 @@ public class JavaRespawnTranslator extends PacketTranslator if (entity == null) return; - if (entity.getDimension() == packet.getDimension()) { - PlayStatusPacket playStatusPacket = new PlayStatusPacket(); - playStatusPacket.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN); - session.getUpstream().sendPacket(playStatusPacket); + if (entity.getDimension() == getDimension(packet.getDimension())) + return; + + entity.setDimension(getDimension(packet.getDimension())); + + ChangeDimensionPacket changeDimensionPacket = new ChangeDimensionPacket(); + changeDimensionPacket.setDimension(getDimension(packet.getDimension())); + changeDimensionPacket.setRespawn(false); + changeDimensionPacket.setPosition(entity.getPosition()); + session.getUpstream().sendPacket(changeDimensionPacket); + + SetPlayerGameTypePacket playerGameTypePacket = new SetPlayerGameTypePacket(); + playerGameTypePacket.setGamemode(packet.getGamemode().ordinal()); + session.getUpstream().sendPacket(playerGameTypePacket); + + PlayStatusPacket playStatusPacket = new PlayStatusPacket(); + playStatusPacket.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN); + session.getUpstream().sendPacket(playStatusPacket); + } + + private int getDimension(int javaDimension) { + switch (javaDimension) { + case -1: + return 1; + case 1: + return 2; } + + return javaDimension; } } From eabbacaaad73d0b8e0bc0c3a6691daddd592ecae Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Tue, 15 Oct 2019 22:21:44 -0500 Subject: [PATCH 05/50] Remove unnecessary null checks for missing mappings "Missing mappings" are given placeholder values upon startup, so these null checks are pointless. --- .../network/translators/block/BlockTranslator.java | 9 +-------- .../network/translators/item/ItemTranslator.java | 8 +------- .../java/org/geysermc/connector/utils/ChunkUtils.java | 4 +--- 3 files changed, 3 insertions(+), 18 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockTranslator.java index 1712bfe1..c9a967da 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockTranslator.java @@ -1,18 +1,11 @@ package org.geysermc.connector.network.translators.block; import com.github.steveice10.mc.protocol.data.game.world.block.BlockState; -import org.geysermc.connector.console.GeyserLogger; import org.geysermc.connector.utils.Toolbox; public class BlockTranslator { public BlockEntry getBedrockBlock(BlockState state) { - BlockEntry bedrockItem = Toolbox.BLOCK_ENTRIES.get(state.getId()); - if (bedrockItem == null) { - GeyserLogger.DEFAULT.debug("Missing mapping for java block " + state.getId() + "/nPlease report this to Geyser."); - return Toolbox.BLOCK_ENTRIES.get(10); // so we can walk and not getting stuck x) - } - - return bedrockItem; + return Toolbox.BLOCK_ENTRIES.get(state.getId()); } } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemTranslator.java index d66490f6..b8d56ccf 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemTranslator.java @@ -75,13 +75,7 @@ public class ItemTranslator { } public ItemEntry getItem(ItemStack stack) { - ItemEntry item = Toolbox.ITEM_ENTRIES.get(stack.getId()); - if (item == null) { - GeyserLogger.DEFAULT.debug("Missing mapping for java item " + stack.getId()); - return ItemEntry.AIR; - } - - return item; + return Toolbox.ITEM_ENTRIES.get(stack.getId()); } public ItemEntry getItem(ItemData data) { diff --git a/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java b/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java index d744cfdb..6f2b6d3c 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java @@ -15,11 +15,9 @@ public class ChunkUtils { Chunk[] chunks = column.getChunks(); int chunkSectionCount = chunks.length; chunkData.sections = new ChunkSection[chunkSectionCount]; - for (int i = 0; i < chunkSectionCount; i++) { - chunkData.sections[i] = new ChunkSection(); - } for (int chunkY = 0; chunkY < chunkSectionCount; chunkY++) { + chunkData.sections[chunkY] = new ChunkSection(); Chunk chunk = chunks[chunkY]; if (chunk == null || chunk.isEmpty()) From 20dda985bcea9e1b063bb8cd6ba2ae05a77c90f7 Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Wed, 16 Oct 2019 13:10:27 -0500 Subject: [PATCH 06/50] Comment out unneeded collision code This may be handy in the future, but right now it serves no purpose. --- .../translators/bedrock/BedrockMovePlayerTranslator.java | 6 +++--- .../translators/java/world/JavaChunkDataTranslator.java | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java index 51082170..678956d7 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java @@ -25,7 +25,6 @@ package org.geysermc.connector.network.translators.bedrock; -import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerPositionRotationPacket; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.packet.MoveEntityAbsolutePacket; @@ -37,7 +36,6 @@ import org.geysermc.connector.entity.PlayerEntity; import org.geysermc.connector.entity.type.EntityType; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; -import org.geysermc.connector.network.translators.block.BlockEntry; public class BedrockMovePlayerTranslator extends PacketTranslator { @@ -75,6 +73,7 @@ public class BedrockMovePlayerTranslator extends PacketTranslator Date: Wed, 16 Oct 2019 13:55:05 -0500 Subject: [PATCH 07/50] Attempt to reduce memory usage and fix not being disconnected from Java --- api/src/main/java/org/geysermc/api/Connector.java | 2 +- api/src/main/java/org/geysermc/api/Geyser.java | 2 +- .../java/org/geysermc/connector/GeyserConnector.java | 12 +++++++----- .../network/ConnectorServerEventHandler.java | 7 ++++++- .../connector/network/session/GeyserSession.java | 2 +- .../connector/network/session/UpstreamSession.java | 6 ++++++ .../connector/network/session/cache/EntityCache.java | 7 +++++++ 7 files changed, 29 insertions(+), 9 deletions(-) diff --git a/api/src/main/java/org/geysermc/api/Connector.java b/api/src/main/java/org/geysermc/api/Connector.java index e2826f1d..708372e3 100644 --- a/api/src/main/java/org/geysermc/api/Connector.java +++ b/api/src/main/java/org/geysermc/api/Connector.java @@ -67,7 +67,7 @@ public interface Connector { * * @return a collection of the connected players */ - Collection getConnectedPlayers(); + Collection getConnectedPlayers(); /** * Shuts down the connector diff --git a/api/src/main/java/org/geysermc/api/Geyser.java b/api/src/main/java/org/geysermc/api/Geyser.java index 37099339..2fc9c190 100644 --- a/api/src/main/java/org/geysermc/api/Geyser.java +++ b/api/src/main/java/org/geysermc/api/Geyser.java @@ -97,7 +97,7 @@ public class Geyser { * * @return a collection of the connected players */ - public static Collection getConnectedPlayers() { + public static Collection getConnectedPlayers() { return connector.getConnectedPlayers(); } } diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java index 392afe52..430f0a9e 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -43,6 +43,7 @@ import org.geysermc.connector.console.GeyserLogger; import org.geysermc.connector.metrics.Metrics; import org.geysermc.connector.network.ConnectorServerEventHandler; import org.geysermc.connector.network.remote.RemoteJavaServer; +import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.TranslatorsInit; import org.geysermc.connector.plugin.GeyserPluginLoader; import org.geysermc.connector.plugin.GeyserPluginManager; @@ -71,7 +72,7 @@ public class GeyserConnector implements Connector { public static final String NAME = "Geyser"; public static final String VERSION = "1.0-SNAPSHOT"; - private final Map players = new HashMap<>(); + private final Map players = new HashMap<>(); private static GeyserConnector instance; @@ -165,8 +166,9 @@ public class GeyserConnector implements Connector { logger.info(String.format("Done (%ss)! Run /help for help!", new DecimalFormat("#.###").format(completeTime))); } - public Collection getConnectedPlayers() { - return new ArrayList<>(players.values()); + @Override + public Collection getConnectedPlayers() { + return players.values(); } public void shutdown() { @@ -182,13 +184,13 @@ public class GeyserConnector implements Connector { System.exit(0); } - public void addPlayer(Player player) { + public void addPlayer(GeyserSession player) { players.put(player.getAuthenticationData().getName(), player); players.put(player.getAuthenticationData().getUUID(), player); players.put(player.getSocketAddress(), player); } - public void removePlayer(Player player) { + public void removePlayer(GeyserSession player) { players.remove(player.getAuthenticationData().getName()); players.remove(player.getAuthenticationData().getUUID()); players.remove(player.getSocketAddress()); 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 2cc317b5..f9f12689 100644 --- a/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java +++ b/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java @@ -106,10 +106,15 @@ public class ConnectorServerEventHandler implements BedrockServerEventHandler { bedrockServerSession.addDisconnectHandler(disconnectReason -> { GeyserLogger.DEFAULT.info("Bedrock user with ip: " + bedrockServerSession.getAddress().getAddress() + " has disconnected for reason " + disconnectReason); - Player player = connector.getPlayers().get(bedrockServerSession.getAddress()); + GeyserSession player = connector.getPlayers().get(bedrockServerSession.getAddress()); if (player != null) { player.disconnect(disconnectReason.name()); connector.removePlayer(player); + + player.getEntityCache().clear(); + player.getInventoryCache().getInventories().clear(); + player.getWindowCache().getWindows().clear(); + player.getScoreboardCache().removeScoreboard(); } }); bedrockServerSession.setPacketCodec(GeyserConnector.BEDROCK_PACKET_CODEC); diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java index b907187d..a4f57c08 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java @@ -133,7 +133,6 @@ public class GeyserSession implements Player { public void authenticate(String username) { authenticate(username, ""); - connector.addPlayer(this); } public void authenticate(String username, String password) { @@ -182,6 +181,7 @@ public class GeyserSession implements Player { }); downstream.getSession().connect(); + connector.addPlayer(this); } catch (RequestException ex) { ex.printStackTrace(); } diff --git a/connector/src/main/java/org/geysermc/connector/network/session/UpstreamSession.java b/connector/src/main/java/org/geysermc/connector/network/session/UpstreamSession.java index f8691bea..d14ff752 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/UpstreamSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/UpstreamSession.java @@ -16,10 +16,16 @@ public class UpstreamSession { private boolean initialized = false; public void sendPacket(@NonNull BedrockPacket packet) { + if (isClosed()) + return; + session.sendPacket(packet); } public void sendPacketImmediately(@NonNull BedrockPacket packet) { + if (isClosed()) + return; + session.sendPacketImmediately(packet); } diff --git a/connector/src/main/java/org/geysermc/connector/network/session/cache/EntityCache.java b/connector/src/main/java/org/geysermc/connector/network/session/cache/EntityCache.java index 3bb702db..80b96500 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/cache/EntityCache.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/cache/EntityCache.java @@ -117,4 +117,11 @@ public class EntityCache { public long removeBossBar(UUID uuid) { return bossbars.remove(uuid); } + + public void clear() { + entities = null; + entityIdTranslations = null; + playerEntities = null; + bossbars = null; + } } From d548647367a3578fa5e7dd6baa3d63bd69006254 Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Wed, 16 Oct 2019 15:32:53 -0500 Subject: [PATCH 08/50] Fix/implement entity interaction and fix sprinting --- .../network/translators/TranslatorsInit.java | 1 + .../bedrock/BedrockActionTranslator.java | 19 +++++++------ .../bedrock/BedrockAnimateTranslator.java | 1 + .../bedrock/BedrockInteractTranslator.java | 27 +++++++++++-------- ...BedrockInventoryTransactionTranslator.java | 19 +++++++------ 5 files changed, 36 insertions(+), 31 deletions(-) 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 259a0841..d4bc5b45 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 @@ -151,6 +151,7 @@ public class TranslatorsInit { Registry.registerBedrock(MovePlayerPacket.class, new BedrockMovePlayerTranslator()); Registry.registerBedrock(PlayerActionPacket.class, new BedrockActionTranslator()); Registry.registerBedrock(SetLocalPlayerAsInitializedPacket.class, new BedrockPlayerInitializedTranslator()); + Registry.registerBedrock(InteractPacket.class, new BedrockInteractTranslator()); Registry.registerBedrock(TextPacket.class, new BedrockTextTranslator()); itemTranslator = new ItemTranslator(); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java index f5d7d6af..f0e63d2c 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java @@ -43,7 +43,7 @@ public class BedrockActionTranslator extends PacketTranslator { case SWING_ARM: ClientPlayerSwingArmPacket swingArmPacket = new ClientPlayerSwingArmPacket(Hand.MAIN_HAND); session.getDownstream().getSession().send(swingArmPacket); + break; } } } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInteractTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInteractTranslator.java index 9b206018..efd26307 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInteractTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInteractTranslator.java @@ -30,6 +30,8 @@ import com.github.steveice10.mc.protocol.data.game.entity.player.InteractAction; import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerInteractEntityPacket; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.packet.InteractPacket; +import org.geysermc.connector.entity.Entity; +import org.geysermc.connector.entity.PlayerEntity; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; @@ -37,18 +39,21 @@ public class BedrockInteractTranslator extends PacketTranslator @Override public void translate(InteractPacket packet, GeyserSession session) { - Vector3f vector = packet.getMousePosition(); - InteractAction action; + Entity entity = session.getEntityCache().getEntityByGeyserId(packet.getRuntimeEntityId()); + if (entity == null) + return; - if(packet.getAction() == 1) { - action = InteractAction.ATTACK; - } else { - action = InteractAction.INTERACT; + switch (packet.getAction()) { + case 1: + ClientPlayerInteractEntityPacket interactPacket = new ClientPlayerInteractEntityPacket((int) entity.getEntityId(), + InteractAction.INTERACT, Hand.MAIN_HAND); + session.getDownstream().getSession().send(interactPacket); + break; + case 2: + ClientPlayerInteractEntityPacket attackPacket = new ClientPlayerInteractEntityPacket((int) entity.getEntityId(), + InteractAction.ATTACK, Hand.MAIN_HAND); + session.getDownstream().getSession().send(attackPacket); + break; } - - ClientPlayerInteractEntityPacket entityPacket = new ClientPlayerInteractEntityPacket((int) packet.getRuntimeEntityId(), - action, vector.getX(), vector.getY(), vector.getZ(), Hand.MAIN_HAND); - - session.getDownstream().getSession().send(entityPacket); } } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java index 71cf0a45..1e6b44a9 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java @@ -35,6 +35,8 @@ import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlaye import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerUseItemPacket; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.packet.InventoryTransactionPacket; +import org.geysermc.connector.entity.Entity; +import org.geysermc.connector.entity.PlayerEntity; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; @@ -56,19 +58,16 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator Date: Wed, 16 Oct 2019 16:16:58 -0500 Subject: [PATCH 09/50] Fix colored titles --- .../network/translators/java/JavaTitleTranslator.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaTitleTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaTitleTranslator.java index a7852ee9..15824d65 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaTitleTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaTitleTranslator.java @@ -29,6 +29,7 @@ import com.github.steveice10.mc.protocol.packet.ingame.server.ServerTitlePacket; import com.nukkitx.protocol.bedrock.packet.SetTitlePacket; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; +import org.geysermc.connector.utils.MessageUtils; public class JavaTitleTranslator extends PacketTranslator { @@ -39,11 +40,11 @@ public class JavaTitleTranslator extends PacketTranslator { switch (packet.getAction()) { case TITLE: titlePacket.setType(SetTitlePacket.Type.SET_TITLE); - titlePacket.setText(packet.getTitle().getFullText()); + titlePacket.setText(MessageUtils.getBedrockMessage(packet.getTitle())); break; case SUBTITLE: titlePacket.setType(SetTitlePacket.Type.SET_SUBTITLE); - titlePacket.setText(packet.getTitle().getFullText()); + titlePacket.setText(MessageUtils.getBedrockMessage(packet.getTitle())); break; case CLEAR: case RESET: @@ -52,7 +53,7 @@ public class JavaTitleTranslator extends PacketTranslator { break; case ACTION_BAR: titlePacket.setType(SetTitlePacket.Type.SET_ACTIONBAR_MESSAGE); - titlePacket.setText(packet.getTitle().getFullText()); + titlePacket.setText(MessageUtils.getBedrockMessage(packet.getTitle())); break; case TIMES: titlePacket.setFadeInTime(packet.getFadeIn()); From a45fdc508d5ad053c413e8177c18d77d2b234824 Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Wed, 16 Oct 2019 16:26:41 -0500 Subject: [PATCH 10/50] Fix fishing bobbers --- .../java/org/geysermc/connector/entity/type/EntityType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java b/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java index 3bb1b82c..af95536c 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java +++ b/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java @@ -100,7 +100,7 @@ public enum EntityType { // TODO CAT (need to figure out how to deal with baby cats) https://github.com/NukkitX/Nukkit/blob/master/src/main/java/cn/nukkit/entity/passive/EntityCat.java SHULKER_BULLET(76, 0f), - FISHING_HOOK(77, 0f), + FISHING_BOBBER(77, 0f), CHALKBOARD(78, 0f), DRAGON_FIREBALL(79, 0f), ARROW(80, 0.25f, 0.25f), From 2bab0d1d19ac0d3118a5b9da1a9cbd2959148e05 Mon Sep 17 00:00:00 2001 From: AJ Ferguson Date: Thu, 17 Oct 2019 23:54:20 -0800 Subject: [PATCH 11/50] Calculate attribute modifiers and fix sprinting/sneaking --- .../org/geysermc/connector/entity/Entity.java | 36 +++++++++---------- .../bedrock/BedrockActionTranslator.java | 2 +- .../entity/JavaEntityMetadataTranslator.java | 12 +++++++ .../JavaEntityPropertiesTranslator.java | 15 ++++---- .../connector/utils/AttributeUtils.java | 24 +++++++++++++ 5 files changed, 61 insertions(+), 28 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/entity/Entity.java b/connector/src/main/java/org/geysermc/connector/entity/Entity.java index 69dcaf0f..8824c953 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/Entity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/Entity.java @@ -71,6 +71,7 @@ public class Entity { protected Set passengers = new HashSet<>(); protected Map attributes = new HashMap<>(); + protected EntityDataDictionary metadata = new EntityDataDictionary(); public Entity(long entityId, long geyserId, EntityType entityType, Vector3f position, Vector3f motion, Vector3f rotation) { this.entityId = entityId; @@ -83,6 +84,19 @@ public class Entity { this.valid = false; this.movePending = false; this.dimension = 0; + + metadata.put(EntityData.SCALE, 1f); + metadata.put(EntityData.MAX_AIR, (short) 400); + metadata.put(EntityData.AIR, (short) 0); + metadata.put(EntityData.LEAD_HOLDER_EID, -1L); + metadata.put(EntityData.BOUNDING_BOX_HEIGHT, entityType.getHeight()); + metadata.put(EntityData.BOUNDING_BOX_WIDTH, entityType.getWidth()); + EntityFlags flags = new EntityFlags(); + flags.setFlag(EntityFlag.HAS_GRAVITY, true); + flags.setFlag(EntityFlag.HAS_COLLISION, true); + flags.setFlag(EntityFlag.CAN_SHOW_NAME, true); + flags.setFlag(EntityFlag.CAN_CLIMB, true); + metadata.putFlags(flags); } public void spawnEntity(GeyserSession session) { @@ -94,7 +108,7 @@ public class Entity { addEntityPacket.setMotion(motion); addEntityPacket.setRotation(getBedrockRotation()); addEntityPacket.setEntityType(entityType.getType()); - addEntityPacket.getMetadata().putAll(getMetadata()); + addEntityPacket.getMetadata().putAll(metadata); valid = true; session.getUpstream().sendPacket(addEntityPacket); @@ -137,24 +151,6 @@ public class Entity { this.movePending = true; } - public EntityDataDictionary getMetadata() { - EntityFlags flags = new EntityFlags(); - flags.setFlag(EntityFlag.HAS_GRAVITY, true); - flags.setFlag(EntityFlag.HAS_COLLISION, true); - flags.setFlag(EntityFlag.CAN_SHOW_NAME, true); - flags.setFlag(EntityFlag.CAN_CLIMB, true); - - EntityDataDictionary dictionary = new EntityDataDictionary(); - dictionary.put(EntityData.SCALE, 1f); - dictionary.put(EntityData.MAX_AIR, (short) 400); - dictionary.put(EntityData.AIR, (short) 0); - dictionary.put(EntityData.LEAD_HOLDER_EID, -1L); - dictionary.put(EntityData.BOUNDING_BOX_HEIGHT, entityType.getHeight()); - dictionary.put(EntityData.BOUNDING_BOX_WIDTH, entityType.getWidth()); - dictionary.putFlags(flags); - return dictionary; - } - public void updateBedrockAttributes(GeyserSession session) { List attributes = new ArrayList<>(); for (Map.Entry entry : this.attributes.entrySet()) { @@ -171,7 +167,7 @@ public class Entity { SetEntityDataPacket entityDataPacket = new SetEntityDataPacket(); entityDataPacket.setRuntimeEntityId(geyserId); - entityDataPacket.getMetadata().putAll(getMetadata()); + entityDataPacket.getMetadata().putAll(metadata); session.getUpstream().sendPacket(entityDataPacket); } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java index f0e63d2c..0b5ad4ad 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java @@ -43,7 +43,7 @@ public class BedrockActionTranslator extends PacketTranslator { @@ -45,23 +46,23 @@ public class JavaEntityPropertiesTranslator extends PacketTranslator Date: Mon, 21 Oct 2019 19:23:39 -0500 Subject: [PATCH 12/50] Set 'auth-type' to online by default --- connector/src/main/resources/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/connector/src/main/resources/config.yml b/connector/src/main/resources/config.yml index 840614ea..f92d6d42 100644 --- a/connector/src/main/resources/config.yml +++ b/connector/src/main/resources/config.yml @@ -22,7 +22,7 @@ remote: port: 25565 # Authentication type. Can be offline, online, or hybrid (see the wiki). - auth-type: offline + auth-type: online ## the Xbox/MCPE username is the key for the Java server auth-info ## this allows automatic configuration/login to the remote Java server @@ -61,4 +61,4 @@ metrics: # If metrics should be enabled enabled: true # UUID of server, don't change! - uuid: generateduuid \ No newline at end of file + uuid: generateduuid From a65a14c2f23be97c100cc049d9894c47c54cda4f Mon Sep 17 00:00:00 2001 From: AJ Ferguson Date: Sun, 27 Oct 2019 01:56:47 -0800 Subject: [PATCH 13/50] Fix block breaking in creative --- .../geysermc/connector/network/session/GeyserSession.java | 5 ++--- .../translators/bedrock/BedrockActionTranslator.java | 8 +------- .../bedrock/BedrockInventoryTransactionTranslator.java | 7 ++++++- .../network/translators/java/JavaJoinGameTranslator.java | 1 + .../network/translators/java/JavaRespawnTranslator.java | 1 + .../java/world/JavaNotifyClientTranslator.java | 5 +++-- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java index a4f57c08..c3af7cd4 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java @@ -28,6 +28,7 @@ package org.geysermc.connector.network.session; import com.github.steveice10.mc.auth.data.GameProfile; import com.github.steveice10.mc.auth.exception.request.RequestException; import com.github.steveice10.mc.protocol.MinecraftProtocol; +import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode; import com.github.steveice10.mc.protocol.data.game.world.block.BlockFace; import com.github.steveice10.packetlib.Client; import com.github.steveice10.packetlib.event.session.ConnectedEvent; @@ -95,9 +96,7 @@ public class GeyserSession implements Player { private boolean closed; @Setter - private Vector3i blockDiggingPos = Vector3i.ZERO; - @Setter - private BlockFace blockDiggingFace = BlockFace.DOWN; + private GameMode gameMode = GameMode.SURVIVAL; public GeyserSession(GeyserConnector connector, BedrockServerSession bedrockServerSession) { this.connector = connector; diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java index 0b5ad4ad..33467934 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java @@ -93,12 +93,9 @@ public class BedrockActionTranslator extends PacketTranslator SetPlayerGameTypePacket playerGameTypePacket = new SetPlayerGameTypePacket(); playerGameTypePacket.setGamemode(packet.getGamemode().ordinal()); session.getUpstream().sendPacket(playerGameTypePacket); + session.setGameMode(packet.getGamemode()); PlayStatusPacket playStatusPacket = new PlayStatusPacket(); playStatusPacket.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaNotifyClientTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaNotifyClientTranslator.java index e32d2718..6c1b51ae 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaNotifyClientTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaNotifyClientTranslator.java @@ -57,10 +57,11 @@ public class JavaNotifyClientTranslator extends PacketTranslator Date: Wed, 30 Oct 2019 21:14:23 -0500 Subject: [PATCH 14/50] Start on 1.13 changes (not functional yet) Cached palette still needs fixing, therefore this build actually does nothing yet. --- connector/pom.xml | 4 +- .../geysermc/connector/GeyserConnector.java | 7 +- .../network/session/GeyserSession.java | 3 +- .../player/JavaPlayerHealthTranslator.java | 2 + .../geysermc/connector/utils/SkinUtils.java | 10 +- .../org/geysermc/connector/utils/Toolbox.java | 54 +- .../main/resources/bedrock/cached_palette.dat | Bin 0 -> 208936 bytes .../resources/bedrock/cached_palette.json | 16557 ---------------- 8 files changed, 45 insertions(+), 16592 deletions(-) create mode 100644 connector/src/main/resources/bedrock/cached_palette.dat delete mode 100644 connector/src/main/resources/bedrock/cached_palette.json diff --git a/connector/pom.xml b/connector/pom.xml index 7f46a9b2..052ea6c0 100644 --- a/connector/pom.xml +++ b/connector/pom.xml @@ -74,8 +74,8 @@ com.nukkitx.protocol - bedrock-v361 - 2.3.0 + bedrock-v388 + 2.4.0-SNAPSHOT compile diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java index 430f0a9e..0197874f 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -27,7 +27,8 @@ package org.geysermc.connector; import com.nukkitx.protocol.bedrock.BedrockPacketCodec; import com.nukkitx.protocol.bedrock.BedrockServer; -import com.nukkitx.protocol.bedrock.v361.Bedrock_v361; +import com.nukkitx.protocol.bedrock.v388.Bedrock_v388; + import lombok.Getter; import org.fusesource.jansi.AnsiConsole; import org.geysermc.api.Connector; @@ -55,7 +56,6 @@ import java.io.File; import java.io.IOException; import java.net.InetSocketAddress; import java.text.DecimalFormat; -import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -67,7 +67,7 @@ import java.util.concurrent.TimeUnit; @Getter public class GeyserConnector implements Connector { - public static final BedrockPacketCodec BEDROCK_PACKET_CODEC = Bedrock_v361.V361_CODEC; + public static final BedrockPacketCodec BEDROCK_PACKET_CODEC = Bedrock_v388.V388_CODEC; public static final String NAME = "Geyser"; public static final String VERSION = "1.0-SNAPSHOT"; @@ -130,6 +130,7 @@ public class GeyserConnector implements Connector { logger.setDebug(config.isDebugMode()); + Toolbox.init(); TranslatorsInit.start(); commandMap = new GeyserCommandMap(this); diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java index c3af7cd4..c7994858 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java @@ -296,8 +296,9 @@ public class GeyserSession implements Player { startGamePacket.setCurrentTick(0); startGamePacket.setEnchantmentSeed(0); startGamePacket.setMultiplayerCorrelationId(""); - startGamePacket.setCachedPalette(Toolbox.CACHED_PALLETE.retainedDuplicate()); + startGamePacket.setBlockPalette(Toolbox.CACHED_PALLETE); startGamePacket.setItemEntries(Toolbox.ITEMS); + startGamePacket.setMovementServerAuthoritative(true); upstream.sendPacket(startGamePacket); PlayStatusPacket playStatusPacket = new PlayStatusPacket(); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerHealthTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerHealthTranslator.java index c584c0ed..b5b655ea 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerHealthTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerHealthTranslator.java @@ -61,7 +61,9 @@ public class JavaPlayerHealthTranslator extends PacketTranslator ITEMS; - public static final ByteBuf CACHED_PALLETE; + public static ListTag CACHED_PALLETE; public static final TIntObjectMap ITEM_ENTRIES; public static final TIntObjectMap BLOCK_ENTRIES; static { - InputStream stream = Toolbox.class.getClassLoader().getResourceAsStream("bedrock/cached_palette.json"); - ObjectMapper mapper = new ObjectMapper(); - List> entries = new ArrayList<>(); - - try { - entries = mapper.readValue(stream, ArrayList.class); - } catch (Exception e) { - e.printStackTrace(); + InputStream stream = GeyserConnector.class.getClassLoader().getResourceAsStream("bedrock/cached_palette.dat"); + if (stream == null) { + throw new AssertionError("Unable to find cached_palette.dat"); } - ByteBuf cachedPalette = Unpooled.buffer(); - VarInts.writeUnsignedInt(cachedPalette, entries.size()); - Map blockIdToIdentifier = new HashMap<>(); + CompoundTag tag; - for (Map entry : entries) { - blockIdToIdentifier.put((String) entry.get("name"), (int) entry.get("id")); - - GlobalBlockPalette.registerMapping((int) entry.get("id") << 4 | (int) entry.get("data")); - BedrockUtils.writeString(cachedPalette, (String) entry.get("name")); - cachedPalette.writeShortLE((int) entry.get("data")); - cachedPalette.writeShortLE((int) entry.get("id")); + NBTInputStream nbtInputStream = NbtUtils.createNetworkReader(stream); + try { + tag = (CompoundTag) nbtInputStream.readTag(); + System.out.println(tag.getValue().values()); + System.out.println(tag.getAsList("Palette", CompoundTag.class)); + nbtInputStream.close(); + } catch (Exception ex) { + GeyserLogger.DEFAULT.warning("Failed to get blocks from cached palette, please report this error!"); + throw new AssertionError(ex); } - CACHED_PALLETE = cachedPalette; + List entries = tag.getAsList("Palette", CompoundTag.class); + for (CompoundTag entry : entries) { + String name = entry.getAsString("name"); + int id = entry.getAsShort("id"); + int data = entry.getAsShort("meta"); + blockIdToIdentifier.put(name, id); + GlobalBlockPalette.registerMapping(id << 4 | data); + } + + CACHED_PALLETE = new ListTag<>("Palette", CompoundTag.class, tag.getAsList("Palette", CompoundTag.class)); InputStream stream2 = Toolbox.class.getClassLoader().getResourceAsStream("bedrock/items.json"); if (stream2 == null) { throw new AssertionError("Items Table not found"); diff --git a/connector/src/main/resources/bedrock/cached_palette.dat b/connector/src/main/resources/bedrock/cached_palette.dat new file mode 100644 index 0000000000000000000000000000000000000000..32c993949174a90f34b2e4003f614796a4588f84 GIT binary patch literal 208936 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 literal 0 HcmV?d00001 diff --git a/connector/src/main/resources/bedrock/cached_palette.json b/connector/src/main/resources/bedrock/cached_palette.json deleted file mode 100644 index e30b417b..00000000 --- a/connector/src/main/resources/bedrock/cached_palette.json +++ /dev/null @@ -1,16557 +0,0 @@ -[ - { - "name": "minecraft:air", - "id": 0, - "data": 0 - }, - { - "name": "minecraft:stone", - "id": 1, - "data": 0 - }, - { - "name": "minecraft:stone", - "id": 1, - "data": 1 - }, - { - "name": "minecraft:stone", - "id": 1, - "data": 2 - }, - { - "name": "minecraft:stone", - "id": 1, - "data": 3 - }, - { - "name": "minecraft:stone", - "id": 1, - "data": 4 - }, - { - "name": "minecraft:stone", - "id": 1, - "data": 5 - }, - { - "name": "minecraft:stone", - "id": 1, - "data": 6 - }, - { - "name": "minecraft:stone", - "id": 1, - "data": 7 - }, - { - "name": "minecraft:grass", - "id": 2, - "data": 0 - }, - { - "name": "minecraft:dirt", - "id": 3, - "data": 0 - }, - { - "name": "minecraft:dirt", - "id": 3, - "data": 1 - }, - { - "name": "minecraft:cobblestone", - "id": 4, - "data": 0 - }, - { - "name": "minecraft:planks", - "id": 5, - "data": 0 - }, - { - "name": "minecraft:planks", - "id": 5, - "data": 1 - }, - { - "name": "minecraft:planks", - "id": 5, - "data": 2 - }, - { - "name": "minecraft:planks", - "id": 5, - "data": 3 - }, - { - "name": "minecraft:planks", - "id": 5, - "data": 4 - }, - { - "name": "minecraft:planks", - "id": 5, - "data": 5 - }, - { - "name": "minecraft:planks", - "id": 5, - "data": 6 - }, - { - "name": "minecraft:planks", - "id": 5, - "data": 7 - }, - { - "name": "minecraft:sapling", - "id": 6, - "data": 0 - }, - { - "name": "minecraft:sapling", - "id": 6, - "data": 1 - }, - { - "name": "minecraft:sapling", - "id": 6, - "data": 2 - }, - { - "name": "minecraft:sapling", - "id": 6, - "data": 3 - }, - { - "name": "minecraft:sapling", - "id": 6, - "data": 4 - }, - { - "name": "minecraft:sapling", - "id": 6, - "data": 5 - }, - { - "name": "minecraft:sapling", - "id": 6, - "data": 6 - }, - { - "name": "minecraft:sapling", - "id": 6, - "data": 7 - }, - { - "name": "minecraft:sapling", - "id": 6, - "data": 8 - }, - { - "name": "minecraft:sapling", - "id": 6, - "data": 9 - }, - { - "name": "minecraft:sapling", - "id": 6, - "data": 10 - }, - { - "name": "minecraft:sapling", - "id": 6, - "data": 11 - }, - { - "name": "minecraft:sapling", - "id": 6, - "data": 12 - }, - { - "name": "minecraft:sapling", - "id": 6, - "data": 13 - }, - { - "name": "minecraft:sapling", - "id": 6, - "data": 14 - }, - { - "name": "minecraft:sapling", - "id": 6, - "data": 15 - }, - { - "name": "minecraft:bedrock", - "id": 7, - "data": 0 - }, - { - "name": "minecraft:bedrock", - "id": 7, - "data": 1 - }, - { - "name": "minecraft:flowing_water", - "id": 8, - "data": 0 - }, - { - "name": "minecraft:flowing_water", - "id": 8, - "data": 1 - }, - { - "name": "minecraft:flowing_water", - "id": 8, - "data": 2 - }, - { - "name": "minecraft:flowing_water", - "id": 8, - "data": 3 - }, - { - "name": "minecraft:flowing_water", - "id": 8, - "data": 4 - }, - { - "name": "minecraft:flowing_water", - "id": 8, - "data": 5 - }, - { - "name": "minecraft:flowing_water", - "id": 8, - "data": 6 - }, - { - "name": "minecraft:flowing_water", - "id": 8, - "data": 7 - }, - { - "name": "minecraft:flowing_water", - "id": 8, - "data": 8 - }, - { - "name": "minecraft:flowing_water", - "id": 8, - "data": 9 - }, - { - "name": "minecraft:flowing_water", - "id": 8, - "data": 10 - }, - { - "name": "minecraft:flowing_water", - "id": 8, - "data": 11 - }, - { - "name": "minecraft:flowing_water", - "id": 8, - "data": 12 - }, - { - "name": "minecraft:flowing_water", - "id": 8, - "data": 13 - }, - { - "name": "minecraft:flowing_water", - "id": 8, - "data": 14 - }, - { - "name": "minecraft:flowing_water", - "id": 8, - "data": 15 - }, - { - "name": "minecraft:water", - "id": 9, - "data": 0 - }, - { - "name": "minecraft:water", - "id": 9, - "data": 1 - }, - { - "name": "minecraft:water", - "id": 9, - "data": 2 - }, - { - "name": "minecraft:water", - "id": 9, - "data": 3 - }, - { - "name": "minecraft:water", - "id": 9, - "data": 4 - }, - { - "name": "minecraft:water", - "id": 9, - "data": 5 - }, - { - "name": "minecraft:water", - "id": 9, - "data": 6 - }, - { - "name": "minecraft:water", - "id": 9, - "data": 7 - }, - { - "name": "minecraft:water", - "id": 9, - "data": 8 - }, - { - "name": "minecraft:water", - "id": 9, - "data": 9 - }, - { - "name": "minecraft:water", - "id": 9, - "data": 10 - }, - { - "name": "minecraft:water", - "id": 9, - "data": 11 - }, - { - "name": "minecraft:water", - "id": 9, - "data": 12 - }, - { - "name": "minecraft:water", - "id": 9, - "data": 13 - }, - { - "name": "minecraft:water", - "id": 9, - "data": 14 - }, - { - "name": "minecraft:water", - "id": 9, - "data": 15 - }, - { - "name": "minecraft:flowing_lava", - "id": 10, - "data": 0 - }, - { - "name": "minecraft:flowing_lava", - "id": 10, - "data": 1 - }, - { - "name": "minecraft:flowing_lava", - "id": 10, - "data": 2 - }, - { - "name": "minecraft:flowing_lava", - "id": 10, - "data": 3 - }, - { - "name": "minecraft:flowing_lava", - "id": 10, - "data": 4 - }, - { - "name": "minecraft:flowing_lava", - "id": 10, - "data": 5 - }, - { - "name": "minecraft:flowing_lava", - "id": 10, - "data": 6 - }, - { - "name": "minecraft:flowing_lava", - "id": 10, - "data": 7 - }, - { - "name": "minecraft:flowing_lava", - "id": 10, - "data": 8 - }, - { - "name": "minecraft:flowing_lava", - "id": 10, - "data": 9 - }, - { - "name": "minecraft:flowing_lava", - "id": 10, - "data": 10 - }, - { - "name": "minecraft:flowing_lava", - "id": 10, - "data": 11 - }, - { - "name": "minecraft:flowing_lava", - "id": 10, - "data": 12 - }, - { - "name": "minecraft:flowing_lava", - "id": 10, - "data": 13 - }, - { - "name": "minecraft:flowing_lava", - "id": 10, - "data": 14 - }, - { - "name": "minecraft:flowing_lava", - "id": 10, - "data": 15 - }, - { - "name": "minecraft:lava", - "id": 11, - "data": 0 - }, - { - "name": "minecraft:lava", - "id": 11, - "data": 1 - }, - { - "name": "minecraft:lava", - "id": 11, - "data": 2 - }, - { - "name": "minecraft:lava", - "id": 11, - "data": 3 - }, - { - "name": "minecraft:lava", - "id": 11, - "data": 4 - }, - { - "name": "minecraft:lava", - "id": 11, - "data": 5 - }, - { - "name": "minecraft:lava", - "id": 11, - "data": 6 - }, - { - "name": "minecraft:lava", - "id": 11, - "data": 7 - }, - { - "name": "minecraft:lava", - "id": 11, - "data": 8 - }, - { - "name": "minecraft:lava", - "id": 11, - "data": 9 - }, - { - "name": "minecraft:lava", - "id": 11, - "data": 10 - }, - { - "name": "minecraft:lava", - "id": 11, - "data": 11 - }, - { - "name": "minecraft:lava", - "id": 11, - "data": 12 - }, - { - "name": "minecraft:lava", - "id": 11, - "data": 13 - }, - { - "name": "minecraft:lava", - "id": 11, - "data": 14 - }, - { - "name": "minecraft:lava", - "id": 11, - "data": 15 - }, - { - "name": "minecraft:sand", - "id": 12, - "data": 0 - }, - { - "name": "minecraft:sand", - "id": 12, - "data": 1 - }, - { - "name": "minecraft:gravel", - "id": 13, - "data": 0 - }, - { - "name": "minecraft:gold_ore", - "id": 14, - "data": 0 - }, - { - "name": "minecraft:iron_ore", - "id": 15, - "data": 0 - }, - { - "name": "minecraft:coal_ore", - "id": 16, - "data": 0 - }, - { - "name": "minecraft:log", - "id": 17, - "data": 0 - }, - { - "name": "minecraft:log", - "id": 17, - "data": 1 - }, - { - "name": "minecraft:log", - "id": 17, - "data": 2 - }, - { - "name": "minecraft:log", - "id": 17, - "data": 3 - }, - { - "name": "minecraft:log", - "id": 17, - "data": 4 - }, - { - "name": "minecraft:log", - "id": 17, - "data": 5 - }, - { - "name": "minecraft:log", - "id": 17, - "data": 6 - }, - { - "name": "minecraft:log", - "id": 17, - "data": 7 - }, - { - "name": "minecraft:log", - "id": 17, - "data": 8 - }, - { - "name": "minecraft:log", - "id": 17, - "data": 9 - }, - { - "name": "minecraft:log", - "id": 17, - "data": 10 - }, - { - "name": "minecraft:log", - "id": 17, - "data": 11 - }, - { - "name": "minecraft:log", - "id": 17, - "data": 12 - }, - { - "name": "minecraft:log", - "id": 17, - "data": 13 - }, - { - "name": "minecraft:log", - "id": 17, - "data": 14 - }, - { - "name": "minecraft:log", - "id": 17, - "data": 15 - }, - { - "name": "minecraft:leaves", - "id": 18, - "data": 0 - }, - { - "name": "minecraft:leaves", - "id": 18, - "data": 1 - }, - { - "name": "minecraft:leaves", - "id": 18, - "data": 2 - }, - { - "name": "minecraft:leaves", - "id": 18, - "data": 3 - }, - { - "name": "minecraft:leaves", - "id": 18, - "data": 4 - }, - { - "name": "minecraft:leaves", - "id": 18, - "data": 5 - }, - { - "name": "minecraft:leaves", - "id": 18, - "data": 6 - }, - { - "name": "minecraft:leaves", - "id": 18, - "data": 7 - }, - { - "name": "minecraft:leaves", - "id": 18, - "data": 8 - }, - { - "name": "minecraft:leaves", - "id": 18, - "data": 9 - }, - { - "name": "minecraft:leaves", - "id": 18, - "data": 10 - }, - { - "name": "minecraft:leaves", - "id": 18, - "data": 11 - }, - { - "name": "minecraft:leaves", - "id": 18, - "data": 12 - }, - { - "name": "minecraft:leaves", - "id": 18, - "data": 13 - }, - { - "name": "minecraft:leaves", - "id": 18, - "data": 14 - }, - { - "name": "minecraft:leaves", - "id": 18, - "data": 15 - }, - { - "name": "minecraft:sponge", - "id": 19, - "data": 0 - }, - { - "name": "minecraft:sponge", - "id": 19, - "data": 1 - }, - { - "name": "minecraft:glass", - "id": 20, - "data": 0 - }, - { - "name": "minecraft:lapis_ore", - "id": 21, - "data": 0 - }, - { - "name": "minecraft:lapis_block", - "id": 22, - "data": 0 - }, - { - "name": "minecraft:dispenser", - "id": 23, - "data": 0 - }, - { - "name": "minecraft:dispenser", - "id": 23, - "data": 1 - }, - { - "name": "minecraft:dispenser", - "id": 23, - "data": 2 - }, - { - "name": "minecraft:dispenser", - "id": 23, - "data": 3 - }, - { - "name": "minecraft:dispenser", - "id": 23, - "data": 4 - }, - { - "name": "minecraft:dispenser", - "id": 23, - "data": 5 - }, - { - "name": "minecraft:dispenser", - "id": 23, - "data": 6 - }, - { - "name": "minecraft:dispenser", - "id": 23, - "data": 7 - }, - { - "name": "minecraft:dispenser", - "id": 23, - "data": 8 - }, - { - "name": "minecraft:dispenser", - "id": 23, - "data": 9 - }, - { - "name": "minecraft:dispenser", - "id": 23, - "data": 10 - }, - { - "name": "minecraft:dispenser", - "id": 23, - "data": 11 - }, - { - "name": "minecraft:dispenser", - "id": 23, - "data": 12 - }, - { - "name": "minecraft:dispenser", - "id": 23, - "data": 13 - }, - { - "name": "minecraft:dispenser", - "id": 23, - "data": 14 - }, - { - "name": "minecraft:dispenser", - "id": 23, - "data": 15 - }, - { - "name": "minecraft:sandstone", - "id": 24, - "data": 0 - }, - { - "name": "minecraft:sandstone", - "id": 24, - "data": 1 - }, - { - "name": "minecraft:sandstone", - "id": 24, - "data": 2 - }, - { - "name": "minecraft:sandstone", - "id": 24, - "data": 3 - }, - { - "name": "minecraft:noteblock", - "id": 25, - "data": 0 - }, - { - "name": "minecraft:bed", - "id": 26, - "data": 0 - }, - { - "name": "minecraft:bed", - "id": 26, - "data": 1 - }, - { - "name": "minecraft:bed", - "id": 26, - "data": 2 - }, - { - "name": "minecraft:bed", - "id": 26, - "data": 3 - }, - { - "name": "minecraft:bed", - "id": 26, - "data": 4 - }, - { - "name": "minecraft:bed", - "id": 26, - "data": 5 - }, - { - "name": "minecraft:bed", - "id": 26, - "data": 6 - }, - { - "name": "minecraft:bed", - "id": 26, - "data": 7 - }, - { - "name": "minecraft:bed", - "id": 26, - "data": 8 - }, - { - "name": "minecraft:bed", - "id": 26, - "data": 9 - }, - { - "name": "minecraft:bed", - "id": 26, - "data": 10 - }, - { - "name": "minecraft:bed", - "id": 26, - "data": 11 - }, - { - "name": "minecraft:bed", - "id": 26, - "data": 12 - }, - { - "name": "minecraft:bed", - "id": 26, - "data": 13 - }, - { - "name": "minecraft:bed", - "id": 26, - "data": 14 - }, - { - "name": "minecraft:bed", - "id": 26, - "data": 15 - }, - { - "name": "minecraft:golden_rail", - "id": 27, - "data": 0 - }, - { - "name": "minecraft:golden_rail", - "id": 27, - "data": 1 - }, - { - "name": "minecraft:golden_rail", - "id": 27, - "data": 2 - }, - { - "name": "minecraft:golden_rail", - "id": 27, - "data": 3 - }, - { - "name": "minecraft:golden_rail", - "id": 27, - "data": 4 - }, - { - "name": "minecraft:golden_rail", - "id": 27, - "data": 5 - }, - { - "name": "minecraft:golden_rail", - "id": 27, - "data": 6 - }, - { - "name": "minecraft:golden_rail", - "id": 27, - "data": 7 - }, - { - "name": "minecraft:golden_rail", - "id": 27, - "data": 8 - }, - { - "name": "minecraft:golden_rail", - "id": 27, - "data": 9 - }, - { - "name": "minecraft:golden_rail", - "id": 27, - "data": 10 - }, - { - "name": "minecraft:golden_rail", - "id": 27, - "data": 11 - }, - { - "name": "minecraft:golden_rail", - "id": 27, - "data": 12 - }, - { - "name": "minecraft:golden_rail", - "id": 27, - "data": 13 - }, - { - "name": "minecraft:golden_rail", - "id": 27, - "data": 14 - }, - { - "name": "minecraft:golden_rail", - "id": 27, - "data": 15 - }, - { - "name": "minecraft:detector_rail", - "id": 28, - "data": 0 - }, - { - "name": "minecraft:detector_rail", - "id": 28, - "data": 1 - }, - { - "name": "minecraft:detector_rail", - "id": 28, - "data": 2 - }, - { - "name": "minecraft:detector_rail", - "id": 28, - "data": 3 - }, - { - "name": "minecraft:detector_rail", - "id": 28, - "data": 4 - }, - { - "name": "minecraft:detector_rail", - "id": 28, - "data": 5 - }, - { - "name": "minecraft:detector_rail", - "id": 28, - "data": 6 - }, - { - "name": "minecraft:detector_rail", - "id": 28, - "data": 7 - }, - { - "name": "minecraft:detector_rail", - "id": 28, - "data": 8 - }, - { - "name": "minecraft:detector_rail", - "id": 28, - "data": 9 - }, - { - "name": "minecraft:detector_rail", - "id": 28, - "data": 10 - }, - { - "name": "minecraft:detector_rail", - "id": 28, - "data": 11 - }, - { - "name": "minecraft:detector_rail", - "id": 28, - "data": 12 - }, - { - "name": "minecraft:detector_rail", - "id": 28, - "data": 13 - }, - { - "name": "minecraft:detector_rail", - "id": 28, - "data": 14 - }, - { - "name": "minecraft:detector_rail", - "id": 28, - "data": 15 - }, - { - "name": "minecraft:sticky_piston", - "id": 29, - "data": 0 - }, - { - "name": "minecraft:sticky_piston", - "id": 29, - "data": 1 - }, - { - "name": "minecraft:sticky_piston", - "id": 29, - "data": 2 - }, - { - "name": "minecraft:sticky_piston", - "id": 29, - "data": 3 - }, - { - "name": "minecraft:sticky_piston", - "id": 29, - "data": 4 - }, - { - "name": "minecraft:sticky_piston", - "id": 29, - "data": 5 - }, - { - "name": "minecraft:sticky_piston", - "id": 29, - "data": 6 - }, - { - "name": "minecraft:sticky_piston", - "id": 29, - "data": 7 - }, - { - "name": "minecraft:web", - "id": 30, - "data": 0 - }, - { - "name": "minecraft:tallgrass", - "id": 31, - "data": 0 - }, - { - "name": "minecraft:tallgrass", - "id": 31, - "data": 1 - }, - { - "name": "minecraft:tallgrass", - "id": 31, - "data": 2 - }, - { - "name": "minecraft:tallgrass", - "id": 31, - "data": 3 - }, - { - "name": "minecraft:deadbush", - "id": 32, - "data": 0 - }, - { - "name": "minecraft:piston", - "id": 33, - "data": 0 - }, - { - "name": "minecraft:piston", - "id": 33, - "data": 1 - }, - { - "name": "minecraft:piston", - "id": 33, - "data": 2 - }, - { - "name": "minecraft:piston", - "id": 33, - "data": 3 - }, - { - "name": "minecraft:piston", - "id": 33, - "data": 4 - }, - { - "name": "minecraft:piston", - "id": 33, - "data": 5 - }, - { - "name": "minecraft:piston", - "id": 33, - "data": 6 - }, - { - "name": "minecraft:piston", - "id": 33, - "data": 7 - }, - { - "name": "minecraft:pistonArmCollision", - "id": 34, - "data": 0 - }, - { - "name": "minecraft:pistonArmCollision", - "id": 34, - "data": 1 - }, - { - "name": "minecraft:pistonArmCollision", - "id": 34, - "data": 2 - }, - { - "name": "minecraft:pistonArmCollision", - "id": 34, - "data": 3 - }, - { - "name": "minecraft:pistonArmCollision", - "id": 34, - "data": 4 - }, - { - "name": "minecraft:pistonArmCollision", - "id": 34, - "data": 5 - }, - { - "name": "minecraft:pistonArmCollision", - "id": 34, - "data": 6 - }, - { - "name": "minecraft:pistonArmCollision", - "id": 34, - "data": 7 - }, - { - "name": "minecraft:wool", - "id": 35, - "data": 0 - }, - { - "name": "minecraft:wool", - "id": 35, - "data": 1 - }, - { - "name": "minecraft:wool", - "id": 35, - "data": 2 - }, - { - "name": "minecraft:wool", - "id": 35, - "data": 3 - }, - { - "name": "minecraft:wool", - "id": 35, - "data": 4 - }, - { - "name": "minecraft:wool", - "id": 35, - "data": 5 - }, - { - "name": "minecraft:wool", - "id": 35, - "data": 6 - }, - { - "name": "minecraft:wool", - "id": 35, - "data": 7 - }, - { - "name": "minecraft:wool", - "id": 35, - "data": 8 - }, - { - "name": "minecraft:wool", - "id": 35, - "data": 9 - }, - { - "name": "minecraft:wool", - "id": 35, - "data": 10 - }, - { - "name": "minecraft:wool", - "id": 35, - "data": 11 - }, - { - "name": "minecraft:wool", - "id": 35, - "data": 12 - }, - { - "name": "minecraft:wool", - "id": 35, - "data": 13 - }, - { - "name": "minecraft:wool", - "id": 35, - "data": 14 - }, - { - "name": "minecraft:wool", - "id": 35, - "data": 15 - }, - { - "name": "minecraft:element_0", - "id": 36, - "data": 0 - }, - { - "name": "minecraft:yellow_flower", - "id": 37, - "data": 0 - }, - { - "name": "minecraft:red_flower", - "id": 38, - "data": 0 - }, - { - "name": "minecraft:red_flower", - "id": 38, - "data": 1 - }, - { - "name": "minecraft:red_flower", - "id": 38, - "data": 2 - }, - { - "name": "minecraft:red_flower", - "id": 38, - "data": 3 - }, - { - "name": "minecraft:red_flower", - "id": 38, - "data": 4 - }, - { - "name": "minecraft:red_flower", - "id": 38, - "data": 5 - }, - { - "name": "minecraft:red_flower", - "id": 38, - "data": 6 - }, - { - "name": "minecraft:red_flower", - "id": 38, - "data": 7 - }, - { - "name": "minecraft:red_flower", - "id": 38, - "data": 8 - }, - { - "name": "minecraft:red_flower", - "id": 38, - "data": 9 - }, - { - "name": "minecraft:red_flower", - "id": 38, - "data": 10 - }, - { - "name": "minecraft:red_flower", - "id": 38, - "data": 11 - }, - { - "name": "minecraft:red_flower", - "id": 38, - "data": 12 - }, - { - "name": "minecraft:red_flower", - "id": 38, - "data": 13 - }, - { - "name": "minecraft:red_flower", - "id": 38, - "data": 14 - }, - { - "name": "minecraft:red_flower", - "id": 38, - "data": 15 - }, - { - "name": "minecraft:brown_mushroom", - "id": 39, - "data": 0 - }, - { - "name": "minecraft:red_mushroom", - "id": 40, - "data": 0 - }, - { - "name": "minecraft:gold_block", - "id": 41, - "data": 0 - }, - { - "name": "minecraft:iron_block", - "id": 42, - "data": 0 - }, - { - "name": "minecraft:double_stone_slab", - "id": 43, - "data": 0 - }, - { - "name": "minecraft:double_stone_slab", - "id": 43, - "data": 1 - }, - { - "name": "minecraft:double_stone_slab", - "id": 43, - "data": 2 - }, - { - "name": "minecraft:double_stone_slab", - "id": 43, - "data": 3 - }, - { - "name": "minecraft:double_stone_slab", - "id": 43, - "data": 4 - }, - { - "name": "minecraft:double_stone_slab", - "id": 43, - "data": 5 - }, - { - "name": "minecraft:double_stone_slab", - "id": 43, - "data": 6 - }, - { - "name": "minecraft:double_stone_slab", - "id": 43, - "data": 7 - }, - { - "name": "minecraft:double_stone_slab", - "id": 43, - "data": 8 - }, - { - "name": "minecraft:double_stone_slab", - "id": 43, - "data": 9 - }, - { - "name": "minecraft:double_stone_slab", - "id": 43, - "data": 10 - }, - { - "name": "minecraft:double_stone_slab", - "id": 43, - "data": 11 - }, - { - "name": "minecraft:double_stone_slab", - "id": 43, - "data": 12 - }, - { - "name": "minecraft:double_stone_slab", - "id": 43, - "data": 13 - }, - { - "name": "minecraft:double_stone_slab", - "id": 43, - "data": 14 - }, - { - "name": "minecraft:double_stone_slab", - "id": 43, - "data": 15 - }, - { - "name": "minecraft:stone_slab", - "id": 44, - "data": 0 - }, - { - "name": "minecraft:stone_slab", - "id": 44, - "data": 1 - }, - { - "name": "minecraft:stone_slab", - "id": 44, - "data": 2 - }, - { - "name": "minecraft:stone_slab", - "id": 44, - "data": 3 - }, - { - "name": "minecraft:stone_slab", - "id": 44, - "data": 4 - }, - { - "name": "minecraft:stone_slab", - "id": 44, - "data": 5 - }, - { - "name": "minecraft:stone_slab", - "id": 44, - "data": 6 - }, - { - "name": "minecraft:stone_slab", - "id": 44, - "data": 7 - }, - { - "name": "minecraft:stone_slab", - "id": 44, - "data": 8 - }, - { - "name": "minecraft:stone_slab", - "id": 44, - "data": 9 - }, - { - "name": "minecraft:stone_slab", - "id": 44, - "data": 10 - }, - { - "name": "minecraft:stone_slab", - "id": 44, - "data": 11 - }, - { - "name": "minecraft:stone_slab", - "id": 44, - "data": 12 - }, - { - "name": "minecraft:stone_slab", - "id": 44, - "data": 13 - }, - { - "name": "minecraft:stone_slab", - "id": 44, - "data": 14 - }, - { - "name": "minecraft:stone_slab", - "id": 44, - "data": 15 - }, - { - "name": "minecraft:brick_block", - "id": 45, - "data": 0 - }, - { - "name": "minecraft:tnt", - "id": 46, - "data": 0 - }, - { - "name": "minecraft:tnt", - "id": 46, - "data": 1 - }, - { - "name": "minecraft:tnt", - "id": 46, - "data": 2 - }, - { - "name": "minecraft:tnt", - "id": 46, - "data": 3 - }, - { - "name": "minecraft:bookshelf", - "id": 47, - "data": 0 - }, - { - "name": "minecraft:mossy_cobblestone", - "id": 48, - "data": 0 - }, - { - "name": "minecraft:obsidian", - "id": 49, - "data": 0 - }, - { - "name": "minecraft:torch", - "id": 50, - "data": 0 - }, - { - "name": "minecraft:torch", - "id": 50, - "data": 1 - }, - { - "name": "minecraft:torch", - "id": 50, - "data": 2 - }, - { - "name": "minecraft:torch", - "id": 50, - "data": 3 - }, - { - "name": "minecraft:torch", - "id": 50, - "data": 4 - }, - { - "name": "minecraft:torch", - "id": 50, - "data": 5 - }, - { - "name": "minecraft:torch", - "id": 50, - "data": 6 - }, - { - "name": "minecraft:torch", - "id": 50, - "data": 7 - }, - { - "name": "minecraft:fire", - "id": 51, - "data": 0 - }, - { - "name": "minecraft:fire", - "id": 51, - "data": 1 - }, - { - "name": "minecraft:fire", - "id": 51, - "data": 2 - }, - { - "name": "minecraft:fire", - "id": 51, - "data": 3 - }, - { - "name": "minecraft:fire", - "id": 51, - "data": 4 - }, - { - "name": "minecraft:fire", - "id": 51, - "data": 5 - }, - { - "name": "minecraft:fire", - "id": 51, - "data": 6 - }, - { - "name": "minecraft:fire", - "id": 51, - "data": 7 - }, - { - "name": "minecraft:fire", - "id": 51, - "data": 8 - }, - { - "name": "minecraft:fire", - "id": 51, - "data": 9 - }, - { - "name": "minecraft:fire", - "id": 51, - "data": 10 - }, - { - "name": "minecraft:fire", - "id": 51, - "data": 11 - }, - { - "name": "minecraft:fire", - "id": 51, - "data": 12 - }, - { - "name": "minecraft:fire", - "id": 51, - "data": 13 - }, - { - "name": "minecraft:fire", - "id": 51, - "data": 14 - }, - { - "name": "minecraft:fire", - "id": 51, - "data": 15 - }, - { - "name": "minecraft:mob_spawner", - "id": 52, - "data": 0 - }, - { - "name": "minecraft:oak_stairs", - "id": 53, - "data": 0 - }, - { - "name": "minecraft:oak_stairs", - "id": 53, - "data": 1 - }, - { - "name": "minecraft:oak_stairs", - "id": 53, - "data": 2 - }, - { - "name": "minecraft:oak_stairs", - "id": 53, - "data": 3 - }, - { - "name": "minecraft:oak_stairs", - "id": 53, - "data": 4 - }, - { - "name": "minecraft:oak_stairs", - "id": 53, - "data": 5 - }, - { - "name": "minecraft:oak_stairs", - "id": 53, - "data": 6 - }, - { - "name": "minecraft:oak_stairs", - "id": 53, - "data": 7 - }, - { - "name": "minecraft:chest", - "id": 54, - "data": 0 - }, - { - "name": "minecraft:chest", - "id": 54, - "data": 1 - }, - { - "name": "minecraft:chest", - "id": 54, - "data": 2 - }, - { - "name": "minecraft:chest", - "id": 54, - "data": 3 - }, - { - "name": "minecraft:chest", - "id": 54, - "data": 4 - }, - { - "name": "minecraft:chest", - "id": 54, - "data": 5 - }, - { - "name": "minecraft:chest", - "id": 54, - "data": 6 - }, - { - "name": "minecraft:chest", - "id": 54, - "data": 7 - }, - { - "name": "minecraft:redstone_wire", - "id": 55, - "data": 0 - }, - { - "name": "minecraft:redstone_wire", - "id": 55, - "data": 1 - }, - { - "name": "minecraft:redstone_wire", - "id": 55, - "data": 2 - }, - { - "name": "minecraft:redstone_wire", - "id": 55, - "data": 3 - }, - { - "name": "minecraft:redstone_wire", - "id": 55, - "data": 4 - }, - { - "name": "minecraft:redstone_wire", - "id": 55, - "data": 5 - }, - { - "name": "minecraft:redstone_wire", - "id": 55, - "data": 6 - }, - { - "name": "minecraft:redstone_wire", - "id": 55, - "data": 7 - }, - { - "name": "minecraft:redstone_wire", - "id": 55, - "data": 8 - }, - { - "name": "minecraft:redstone_wire", - "id": 55, - "data": 9 - }, - { - "name": "minecraft:redstone_wire", - "id": 55, - "data": 10 - }, - { - "name": "minecraft:redstone_wire", - "id": 55, - "data": 11 - }, - { - "name": "minecraft:redstone_wire", - "id": 55, - "data": 12 - }, - { - "name": "minecraft:redstone_wire", - "id": 55, - "data": 13 - }, - { - "name": "minecraft:redstone_wire", - "id": 55, - "data": 14 - }, - { - "name": "minecraft:redstone_wire", - "id": 55, - "data": 15 - }, - { - "name": "minecraft:diamond_ore", - "id": 56, - "data": 0 - }, - { - "name": "minecraft:diamond_block", - "id": 57, - "data": 0 - }, - { - "name": "minecraft:crafting_table", - "id": 58, - "data": 0 - }, - { - "name": "minecraft:wheat", - "id": 59, - "data": 0 - }, - { - "name": "minecraft:wheat", - "id": 59, - "data": 1 - }, - { - "name": "minecraft:wheat", - "id": 59, - "data": 2 - }, - { - "name": "minecraft:wheat", - "id": 59, - "data": 3 - }, - { - "name": "minecraft:wheat", - "id": 59, - "data": 4 - }, - { - "name": "minecraft:wheat", - "id": 59, - "data": 5 - }, - { - "name": "minecraft:wheat", - "id": 59, - "data": 6 - }, - { - "name": "minecraft:wheat", - "id": 59, - "data": 7 - }, - { - "name": "minecraft:farmland", - "id": 60, - "data": 0 - }, - { - "name": "minecraft:farmland", - "id": 60, - "data": 1 - }, - { - "name": "minecraft:farmland", - "id": 60, - "data": 2 - }, - { - "name": "minecraft:farmland", - "id": 60, - "data": 3 - }, - { - "name": "minecraft:farmland", - "id": 60, - "data": 4 - }, - { - "name": "minecraft:farmland", - "id": 60, - "data": 5 - }, - { - "name": "minecraft:farmland", - "id": 60, - "data": 6 - }, - { - "name": "minecraft:farmland", - "id": 60, - "data": 7 - }, - { - "name": "minecraft:furnace", - "id": 61, - "data": 0 - }, - { - "name": "minecraft:furnace", - "id": 61, - "data": 1 - }, - { - "name": "minecraft:furnace", - "id": 61, - "data": 2 - }, - { - "name": "minecraft:furnace", - "id": 61, - "data": 3 - }, - { - "name": "minecraft:furnace", - "id": 61, - "data": 4 - }, - { - "name": "minecraft:furnace", - "id": 61, - "data": 5 - }, - { - "name": "minecraft:furnace", - "id": 61, - "data": 6 - }, - { - "name": "minecraft:furnace", - "id": 61, - "data": 7 - }, - { - "name": "minecraft:lit_furnace", - "id": 62, - "data": 0 - }, - { - "name": "minecraft:lit_furnace", - "id": 62, - "data": 1 - }, - { - "name": "minecraft:lit_furnace", - "id": 62, - "data": 2 - }, - { - "name": "minecraft:lit_furnace", - "id": 62, - "data": 3 - }, - { - "name": "minecraft:lit_furnace", - "id": 62, - "data": 4 - }, - { - "name": "minecraft:lit_furnace", - "id": 62, - "data": 5 - }, - { - "name": "minecraft:lit_furnace", - "id": 62, - "data": 6 - }, - { - "name": "minecraft:lit_furnace", - "id": 62, - "data": 7 - }, - { - "name": "minecraft:standing_sign", - "id": 63, - "data": 0 - }, - { - "name": "minecraft:standing_sign", - "id": 63, - "data": 1 - }, - { - "name": "minecraft:standing_sign", - "id": 63, - "data": 2 - }, - { - "name": "minecraft:standing_sign", - "id": 63, - "data": 3 - }, - { - "name": "minecraft:standing_sign", - "id": 63, - "data": 4 - }, - { - "name": "minecraft:standing_sign", - "id": 63, - "data": 5 - }, - { - "name": "minecraft:standing_sign", - "id": 63, - "data": 6 - }, - { - "name": "minecraft:standing_sign", - "id": 63, - "data": 7 - }, - { - "name": "minecraft:standing_sign", - "id": 63, - "data": 8 - }, - { - "name": "minecraft:standing_sign", - "id": 63, - "data": 9 - }, - { - "name": "minecraft:standing_sign", - "id": 63, - "data": 10 - }, - { - "name": "minecraft:standing_sign", - "id": 63, - "data": 11 - }, - { - "name": "minecraft:standing_sign", - "id": 63, - "data": 12 - }, - { - "name": "minecraft:standing_sign", - "id": 63, - "data": 13 - }, - { - "name": "minecraft:standing_sign", - "id": 63, - "data": 14 - }, - { - "name": "minecraft:standing_sign", - "id": 63, - "data": 15 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 0 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 1 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 2 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 3 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 4 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 5 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 6 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 7 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 8 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 9 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 10 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 11 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 12 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 13 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 14 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 15 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 16 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 17 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 18 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 19 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 20 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 21 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 22 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 23 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 24 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 25 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 26 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 27 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 28 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 29 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 30 - }, - { - "name": "minecraft:wooden_door", - "id": 64, - "data": 31 - }, - { - "name": "minecraft:ladder", - "id": 65, - "data": 0 - }, - { - "name": "minecraft:ladder", - "id": 65, - "data": 1 - }, - { - "name": "minecraft:ladder", - "id": 65, - "data": 2 - }, - { - "name": "minecraft:ladder", - "id": 65, - "data": 3 - }, - { - "name": "minecraft:ladder", - "id": 65, - "data": 4 - }, - { - "name": "minecraft:ladder", - "id": 65, - "data": 5 - }, - { - "name": "minecraft:ladder", - "id": 65, - "data": 6 - }, - { - "name": "minecraft:ladder", - "id": 65, - "data": 7 - }, - { - "name": "minecraft:rail", - "id": 66, - "data": 0 - }, - { - "name": "minecraft:rail", - "id": 66, - "data": 1 - }, - { - "name": "minecraft:rail", - "id": 66, - "data": 2 - }, - { - "name": "minecraft:rail", - "id": 66, - "data": 3 - }, - { - "name": "minecraft:rail", - "id": 66, - "data": 4 - }, - { - "name": "minecraft:rail", - "id": 66, - "data": 5 - }, - { - "name": "minecraft:rail", - "id": 66, - "data": 6 - }, - { - "name": "minecraft:rail", - "id": 66, - "data": 7 - }, - { - "name": "minecraft:rail", - "id": 66, - "data": 8 - }, - { - "name": "minecraft:rail", - "id": 66, - "data": 9 - }, - { - "name": "minecraft:rail", - "id": 66, - "data": 10 - }, - { - "name": "minecraft:rail", - "id": 66, - "data": 11 - }, - { - "name": "minecraft:rail", - "id": 66, - "data": 12 - }, - { - "name": "minecraft:rail", - "id": 66, - "data": 13 - }, - { - "name": "minecraft:rail", - "id": 66, - "data": 14 - }, - { - "name": "minecraft:rail", - "id": 66, - "data": 15 - }, - { - "name": "minecraft:stone_stairs", - "id": 67, - "data": 0 - }, - { - "name": "minecraft:stone_stairs", - "id": 67, - "data": 1 - }, - { - "name": "minecraft:stone_stairs", - "id": 67, - "data": 2 - }, - { - "name": "minecraft:stone_stairs", - "id": 67, - "data": 3 - }, - { - "name": "minecraft:stone_stairs", - "id": 67, - "data": 4 - }, - { - "name": "minecraft:stone_stairs", - "id": 67, - "data": 5 - }, - { - "name": "minecraft:stone_stairs", - "id": 67, - "data": 6 - }, - { - "name": "minecraft:stone_stairs", - "id": 67, - "data": 7 - }, - { - "name": "minecraft:wall_sign", - "id": 68, - "data": 0 - }, - { - "name": "minecraft:wall_sign", - "id": 68, - "data": 1 - }, - { - "name": "minecraft:wall_sign", - "id": 68, - "data": 2 - }, - { - "name": "minecraft:wall_sign", - "id": 68, - "data": 3 - }, - { - "name": "minecraft:wall_sign", - "id": 68, - "data": 4 - }, - { - "name": "minecraft:wall_sign", - "id": 68, - "data": 5 - }, - { - "name": "minecraft:wall_sign", - "id": 68, - "data": 6 - }, - { - "name": "minecraft:wall_sign", - "id": 68, - "data": 7 - }, - { - "name": "minecraft:lever", - "id": 69, - "data": 0 - }, - { - "name": "minecraft:lever", - "id": 69, - "data": 1 - }, - { - "name": "minecraft:lever", - "id": 69, - "data": 2 - }, - { - "name": "minecraft:lever", - "id": 69, - "data": 3 - }, - { - "name": "minecraft:lever", - "id": 69, - "data": 4 - }, - { - "name": "minecraft:lever", - "id": 69, - "data": 5 - }, - { - "name": "minecraft:lever", - "id": 69, - "data": 6 - }, - { - "name": "minecraft:lever", - "id": 69, - "data": 7 - }, - { - "name": "minecraft:lever", - "id": 69, - "data": 8 - }, - { - "name": "minecraft:lever", - "id": 69, - "data": 9 - }, - { - "name": "minecraft:lever", - "id": 69, - "data": 10 - }, - { - "name": "minecraft:lever", - "id": 69, - "data": 11 - }, - { - "name": "minecraft:lever", - "id": 69, - "data": 12 - }, - { - "name": "minecraft:lever", - "id": 69, - "data": 13 - }, - { - "name": "minecraft:lever", - "id": 69, - "data": 14 - }, - { - "name": "minecraft:lever", - "id": 69, - "data": 15 - }, - { - "name": "minecraft:stone_pressure_plate", - "id": 70, - "data": 0 - }, - { - "name": "minecraft:stone_pressure_plate", - "id": 70, - "data": 1 - }, - { - "name": "minecraft:stone_pressure_plate", - "id": 70, - "data": 2 - }, - { - "name": "minecraft:stone_pressure_plate", - "id": 70, - "data": 3 - }, - { - "name": "minecraft:stone_pressure_plate", - "id": 70, - "data": 4 - }, - { - "name": "minecraft:stone_pressure_plate", - "id": 70, - "data": 5 - }, - { - "name": "minecraft:stone_pressure_plate", - "id": 70, - "data": 6 - }, - { - "name": "minecraft:stone_pressure_plate", - "id": 70, - "data": 7 - }, - { - "name": "minecraft:stone_pressure_plate", - "id": 70, - "data": 8 - }, - { - "name": "minecraft:stone_pressure_plate", - "id": 70, - "data": 9 - }, - { - "name": "minecraft:stone_pressure_plate", - "id": 70, - "data": 10 - }, - { - "name": "minecraft:stone_pressure_plate", - "id": 70, - "data": 11 - }, - { - "name": "minecraft:stone_pressure_plate", - "id": 70, - "data": 12 - }, - { - "name": "minecraft:stone_pressure_plate", - "id": 70, - "data": 13 - }, - { - "name": "minecraft:stone_pressure_plate", - "id": 70, - "data": 14 - }, - { - "name": "minecraft:stone_pressure_plate", - "id": 70, - "data": 15 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 0 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 1 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 2 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 3 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 4 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 5 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 6 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 7 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 8 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 9 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 10 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 11 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 12 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 13 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 14 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 15 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 16 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 17 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 18 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 19 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 20 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 21 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 22 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 23 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 24 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 25 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 26 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 27 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 28 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 29 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 30 - }, - { - "name": "minecraft:iron_door", - "id": 71, - "data": 31 - }, - { - "name": "minecraft:wooden_pressure_plate", - "id": 72, - "data": 0 - }, - { - "name": "minecraft:wooden_pressure_plate", - "id": 72, - "data": 1 - }, - { - "name": "minecraft:wooden_pressure_plate", - "id": 72, - "data": 2 - }, - { - "name": "minecraft:wooden_pressure_plate", - "id": 72, - "data": 3 - }, - { - "name": "minecraft:wooden_pressure_plate", - "id": 72, - "data": 4 - }, - { - "name": "minecraft:wooden_pressure_plate", - "id": 72, - "data": 5 - }, - { - "name": "minecraft:wooden_pressure_plate", - "id": 72, - "data": 6 - }, - { - "name": "minecraft:wooden_pressure_plate", - "id": 72, - "data": 7 - }, - { - "name": "minecraft:wooden_pressure_plate", - "id": 72, - "data": 8 - }, - { - "name": "minecraft:wooden_pressure_plate", - "id": 72, - "data": 9 - }, - { - "name": "minecraft:wooden_pressure_plate", - "id": 72, - "data": 10 - }, - { - "name": "minecraft:wooden_pressure_plate", - "id": 72, - "data": 11 - }, - { - "name": "minecraft:wooden_pressure_plate", - "id": 72, - "data": 12 - }, - { - "name": "minecraft:wooden_pressure_plate", - "id": 72, - "data": 13 - }, - { - "name": "minecraft:wooden_pressure_plate", - "id": 72, - "data": 14 - }, - { - "name": "minecraft:wooden_pressure_plate", - "id": 72, - "data": 15 - }, - { - "name": "minecraft:redstone_ore", - "id": 73, - "data": 0 - }, - { - "name": "minecraft:lit_redstone_ore", - "id": 74, - "data": 0 - }, - { - "name": "minecraft:unlit_redstone_torch", - "id": 75, - "data": 0 - }, - { - "name": "minecraft:unlit_redstone_torch", - "id": 75, - "data": 1 - }, - { - "name": "minecraft:unlit_redstone_torch", - "id": 75, - "data": 2 - }, - { - "name": "minecraft:unlit_redstone_torch", - "id": 75, - "data": 3 - }, - { - "name": "minecraft:unlit_redstone_torch", - "id": 75, - "data": 4 - }, - { - "name": "minecraft:unlit_redstone_torch", - "id": 75, - "data": 5 - }, - { - "name": "minecraft:unlit_redstone_torch", - "id": 75, - "data": 6 - }, - { - "name": "minecraft:unlit_redstone_torch", - "id": 75, - "data": 7 - }, - { - "name": "minecraft:redstone_torch", - "id": 76, - "data": 0 - }, - { - "name": "minecraft:redstone_torch", - "id": 76, - "data": 1 - }, - { - "name": "minecraft:redstone_torch", - "id": 76, - "data": 2 - }, - { - "name": "minecraft:redstone_torch", - "id": 76, - "data": 3 - }, - { - "name": "minecraft:redstone_torch", - "id": 76, - "data": 4 - }, - { - "name": "minecraft:redstone_torch", - "id": 76, - "data": 5 - }, - { - "name": "minecraft:redstone_torch", - "id": 76, - "data": 6 - }, - { - "name": "minecraft:redstone_torch", - "id": 76, - "data": 7 - }, - { - "name": "minecraft:stone_button", - "id": 77, - "data": 0 - }, - { - "name": "minecraft:stone_button", - "id": 77, - "data": 1 - }, - { - "name": "minecraft:stone_button", - "id": 77, - "data": 2 - }, - { - "name": "minecraft:stone_button", - "id": 77, - "data": 3 - }, - { - "name": "minecraft:stone_button", - "id": 77, - "data": 4 - }, - { - "name": "minecraft:stone_button", - "id": 77, - "data": 5 - }, - { - "name": "minecraft:stone_button", - "id": 77, - "data": 6 - }, - { - "name": "minecraft:stone_button", - "id": 77, - "data": 7 - }, - { - "name": "minecraft:stone_button", - "id": 77, - "data": 8 - }, - { - "name": "minecraft:stone_button", - "id": 77, - "data": 9 - }, - { - "name": "minecraft:stone_button", - "id": 77, - "data": 10 - }, - { - "name": "minecraft:stone_button", - "id": 77, - "data": 11 - }, - { - "name": "minecraft:stone_button", - "id": 77, - "data": 12 - }, - { - "name": "minecraft:stone_button", - "id": 77, - "data": 13 - }, - { - "name": "minecraft:stone_button", - "id": 77, - "data": 14 - }, - { - "name": "minecraft:stone_button", - "id": 77, - "data": 15 - }, - { - "name": "minecraft:snow_layer", - "id": 78, - "data": 0 - }, - { - "name": "minecraft:snow_layer", - "id": 78, - "data": 1 - }, - { - "name": "minecraft:snow_layer", - "id": 78, - "data": 2 - }, - { - "name": "minecraft:snow_layer", - "id": 78, - "data": 3 - }, - { - "name": "minecraft:snow_layer", - "id": 78, - "data": 4 - }, - { - "name": "minecraft:snow_layer", - "id": 78, - "data": 5 - }, - { - "name": "minecraft:snow_layer", - "id": 78, - "data": 6 - }, - { - "name": "minecraft:snow_layer", - "id": 78, - "data": 7 - }, - { - "name": "minecraft:snow_layer", - "id": 78, - "data": 8 - }, - { - "name": "minecraft:snow_layer", - "id": 78, - "data": 9 - }, - { - "name": "minecraft:snow_layer", - "id": 78, - "data": 10 - }, - { - "name": "minecraft:snow_layer", - "id": 78, - "data": 11 - }, - { - "name": "minecraft:snow_layer", - "id": 78, - "data": 12 - }, - { - "name": "minecraft:snow_layer", - "id": 78, - "data": 13 - }, - { - "name": "minecraft:snow_layer", - "id": 78, - "data": 14 - }, - { - "name": "minecraft:snow_layer", - "id": 78, - "data": 15 - }, - { - "name": "minecraft:ice", - "id": 79, - "data": 0 - }, - { - "name": "minecraft:snow", - "id": 80, - "data": 0 - }, - { - "name": "minecraft:cactus", - "id": 81, - "data": 0 - }, - { - "name": "minecraft:cactus", - "id": 81, - "data": 1 - }, - { - "name": "minecraft:cactus", - "id": 81, - "data": 2 - }, - { - "name": "minecraft:cactus", - "id": 81, - "data": 3 - }, - { - "name": "minecraft:cactus", - "id": 81, - "data": 4 - }, - { - "name": "minecraft:cactus", - "id": 81, - "data": 5 - }, - { - "name": "minecraft:cactus", - "id": 81, - "data": 6 - }, - { - "name": "minecraft:cactus", - "id": 81, - "data": 7 - }, - { - "name": "minecraft:cactus", - "id": 81, - "data": 8 - }, - { - "name": "minecraft:cactus", - "id": 81, - "data": 9 - }, - { - "name": "minecraft:cactus", - "id": 81, - "data": 10 - }, - { - "name": "minecraft:cactus", - "id": 81, - "data": 11 - }, - { - "name": "minecraft:cactus", - "id": 81, - "data": 12 - }, - { - "name": "minecraft:cactus", - "id": 81, - "data": 13 - }, - { - "name": "minecraft:cactus", - "id": 81, - "data": 14 - }, - { - "name": "minecraft:cactus", - "id": 81, - "data": 15 - }, - { - "name": "minecraft:clay", - "id": 82, - "data": 0 - }, - { - "name": "minecraft:reeds", - "id": 83, - "data": 0 - }, - { - "name": "minecraft:reeds", - "id": 83, - "data": 1 - }, - { - "name": "minecraft:reeds", - "id": 83, - "data": 2 - }, - { - "name": "minecraft:reeds", - "id": 83, - "data": 3 - }, - { - "name": "minecraft:reeds", - "id": 83, - "data": 4 - }, - { - "name": "minecraft:reeds", - "id": 83, - "data": 5 - }, - { - "name": "minecraft:reeds", - "id": 83, - "data": 6 - }, - { - "name": "minecraft:reeds", - "id": 83, - "data": 7 - }, - { - "name": "minecraft:reeds", - "id": 83, - "data": 8 - }, - { - "name": "minecraft:reeds", - "id": 83, - "data": 9 - }, - { - "name": "minecraft:reeds", - "id": 83, - "data": 10 - }, - { - "name": "minecraft:reeds", - "id": 83, - "data": 11 - }, - { - "name": "minecraft:reeds", - "id": 83, - "data": 12 - }, - { - "name": "minecraft:reeds", - "id": 83, - "data": 13 - }, - { - "name": "minecraft:reeds", - "id": 83, - "data": 14 - }, - { - "name": "minecraft:reeds", - "id": 83, - "data": 15 - }, - { - "name": "minecraft:jukebox", - "id": 84, - "data": 0 - }, - { - "name": "minecraft:fence", - "id": 85, - "data": 0 - }, - { - "name": "minecraft:fence", - "id": 85, - "data": 1 - }, - { - "name": "minecraft:fence", - "id": 85, - "data": 2 - }, - { - "name": "minecraft:fence", - "id": 85, - "data": 3 - }, - { - "name": "minecraft:fence", - "id": 85, - "data": 4 - }, - { - "name": "minecraft:fence", - "id": 85, - "data": 5 - }, - { - "name": "minecraft:fence", - "id": 85, - "data": 6 - }, - { - "name": "minecraft:fence", - "id": 85, - "data": 7 - }, - { - "name": "minecraft:pumpkin", - "id": 86, - "data": 0 - }, - { - "name": "minecraft:pumpkin", - "id": 86, - "data": 1 - }, - { - "name": "minecraft:pumpkin", - "id": 86, - "data": 2 - }, - { - "name": "minecraft:pumpkin", - "id": 86, - "data": 3 - }, - { - "name": "minecraft:netherrack", - "id": 87, - "data": 0 - }, - { - "name": "minecraft:soul_sand", - "id": 88, - "data": 0 - }, - { - "name": "minecraft:glowstone", - "id": 89, - "data": 0 - }, - { - "name": "minecraft:portal", - "id": 90, - "data": 0 - }, - { - "name": "minecraft:portal", - "id": 90, - "data": 1 - }, - { - "name": "minecraft:portal", - "id": 90, - "data": 2 - }, - { - "name": "minecraft:portal", - "id": 90, - "data": 3 - }, - { - "name": "minecraft:lit_pumpkin", - "id": 91, - "data": 0 - }, - { - "name": "minecraft:lit_pumpkin", - "id": 91, - "data": 1 - }, - { - "name": "minecraft:lit_pumpkin", - "id": 91, - "data": 2 - }, - { - "name": "minecraft:lit_pumpkin", - "id": 91, - "data": 3 - }, - { - "name": "minecraft:cake", - "id": 92, - "data": 0 - }, - { - "name": "minecraft:cake", - "id": 92, - "data": 1 - }, - { - "name": "minecraft:cake", - "id": 92, - "data": 2 - }, - { - "name": "minecraft:cake", - "id": 92, - "data": 3 - }, - { - "name": "minecraft:cake", - "id": 92, - "data": 4 - }, - { - "name": "minecraft:cake", - "id": 92, - "data": 5 - }, - { - "name": "minecraft:cake", - "id": 92, - "data": 6 - }, - { - "name": "minecraft:cake", - "id": 92, - "data": 7 - }, - { - "name": "minecraft:unpowered_repeater", - "id": 93, - "data": 0 - }, - { - "name": "minecraft:unpowered_repeater", - "id": 93, - "data": 1 - }, - { - "name": "minecraft:unpowered_repeater", - "id": 93, - "data": 2 - }, - { - "name": "minecraft:unpowered_repeater", - "id": 93, - "data": 3 - }, - { - "name": "minecraft:unpowered_repeater", - "id": 93, - "data": 4 - }, - { - "name": "minecraft:unpowered_repeater", - "id": 93, - "data": 5 - }, - { - "name": "minecraft:unpowered_repeater", - "id": 93, - "data": 6 - }, - { - "name": "minecraft:unpowered_repeater", - "id": 93, - "data": 7 - }, - { - "name": "minecraft:unpowered_repeater", - "id": 93, - "data": 8 - }, - { - "name": "minecraft:unpowered_repeater", - "id": 93, - "data": 9 - }, - { - "name": "minecraft:unpowered_repeater", - "id": 93, - "data": 10 - }, - { - "name": "minecraft:unpowered_repeater", - "id": 93, - "data": 11 - }, - { - "name": "minecraft:unpowered_repeater", - "id": 93, - "data": 12 - }, - { - "name": "minecraft:unpowered_repeater", - "id": 93, - "data": 13 - }, - { - "name": "minecraft:unpowered_repeater", - "id": 93, - "data": 14 - }, - { - "name": "minecraft:unpowered_repeater", - "id": 93, - "data": 15 - }, - { - "name": "minecraft:powered_repeater", - "id": 94, - "data": 0 - }, - { - "name": "minecraft:powered_repeater", - "id": 94, - "data": 1 - }, - { - "name": "minecraft:powered_repeater", - "id": 94, - "data": 2 - }, - { - "name": "minecraft:powered_repeater", - "id": 94, - "data": 3 - }, - { - "name": "minecraft:powered_repeater", - "id": 94, - "data": 4 - }, - { - "name": "minecraft:powered_repeater", - "id": 94, - "data": 5 - }, - { - "name": "minecraft:powered_repeater", - "id": 94, - "data": 6 - }, - { - "name": "minecraft:powered_repeater", - "id": 94, - "data": 7 - }, - { - "name": "minecraft:powered_repeater", - "id": 94, - "data": 8 - }, - { - "name": "minecraft:powered_repeater", - "id": 94, - "data": 9 - }, - { - "name": "minecraft:powered_repeater", - "id": 94, - "data": 10 - }, - { - "name": "minecraft:powered_repeater", - "id": 94, - "data": 11 - }, - { - "name": "minecraft:powered_repeater", - "id": 94, - "data": 12 - }, - { - "name": "minecraft:powered_repeater", - "id": 94, - "data": 13 - }, - { - "name": "minecraft:powered_repeater", - "id": 94, - "data": 14 - }, - { - "name": "minecraft:powered_repeater", - "id": 94, - "data": 15 - }, - { - "name": "minecraft:invisibleBedrock", - "id": 95, - "data": 0 - }, - { - "name": "minecraft:trapdoor", - "id": 96, - "data": 0 - }, - { - "name": "minecraft:trapdoor", - "id": 96, - "data": 1 - }, - { - "name": "minecraft:trapdoor", - "id": 96, - "data": 2 - }, - { - "name": "minecraft:trapdoor", - "id": 96, - "data": 3 - }, - { - "name": "minecraft:trapdoor", - "id": 96, - "data": 4 - }, - { - "name": "minecraft:trapdoor", - "id": 96, - "data": 5 - }, - { - "name": "minecraft:trapdoor", - "id": 96, - "data": 6 - }, - { - "name": "minecraft:trapdoor", - "id": 96, - "data": 7 - }, - { - "name": "minecraft:trapdoor", - "id": 96, - "data": 8 - }, - { - "name": "minecraft:trapdoor", - "id": 96, - "data": 9 - }, - { - "name": "minecraft:trapdoor", - "id": 96, - "data": 10 - }, - { - "name": "minecraft:trapdoor", - "id": 96, - "data": 11 - }, - { - "name": "minecraft:trapdoor", - "id": 96, - "data": 12 - }, - { - "name": "minecraft:trapdoor", - "id": 96, - "data": 13 - }, - { - "name": "minecraft:trapdoor", - "id": 96, - "data": 14 - }, - { - "name": "minecraft:trapdoor", - "id": 96, - "data": 15 - }, - { - "name": "minecraft:monster_egg", - "id": 97, - "data": 0 - }, - { - "name": "minecraft:monster_egg", - "id": 97, - "data": 1 - }, - { - "name": "minecraft:monster_egg", - "id": 97, - "data": 2 - }, - { - "name": "minecraft:monster_egg", - "id": 97, - "data": 3 - }, - { - "name": "minecraft:monster_egg", - "id": 97, - "data": 4 - }, - { - "name": "minecraft:monster_egg", - "id": 97, - "data": 5 - }, - { - "name": "minecraft:monster_egg", - "id": 97, - "data": 6 - }, - { - "name": "minecraft:monster_egg", - "id": 97, - "data": 7 - }, - { - "name": "minecraft:stonebrick", - "id": 98, - "data": 0 - }, - { - "name": "minecraft:stonebrick", - "id": 98, - "data": 1 - }, - { - "name": "minecraft:stonebrick", - "id": 98, - "data": 2 - }, - { - "name": "minecraft:stonebrick", - "id": 98, - "data": 3 - }, - { - "name": "minecraft:stonebrick", - "id": 98, - "data": 4 - }, - { - "name": "minecraft:stonebrick", - "id": 98, - "data": 5 - }, - { - "name": "minecraft:stonebrick", - "id": 98, - "data": 6 - }, - { - "name": "minecraft:stonebrick", - "id": 98, - "data": 7 - }, - { - "name": "minecraft:brown_mushroom_block", - "id": 99, - "data": 0 - }, - { - "name": "minecraft:brown_mushroom_block", - "id": 99, - "data": 1 - }, - { - "name": "minecraft:brown_mushroom_block", - "id": 99, - "data": 2 - }, - { - "name": "minecraft:brown_mushroom_block", - "id": 99, - "data": 3 - }, - { - "name": "minecraft:brown_mushroom_block", - "id": 99, - "data": 4 - }, - { - "name": "minecraft:brown_mushroom_block", - "id": 99, - "data": 5 - }, - { - "name": "minecraft:brown_mushroom_block", - "id": 99, - "data": 6 - }, - { - "name": "minecraft:brown_mushroom_block", - "id": 99, - "data": 7 - }, - { - "name": "minecraft:brown_mushroom_block", - "id": 99, - "data": 8 - }, - { - "name": "minecraft:brown_mushroom_block", - "id": 99, - "data": 9 - }, - { - "name": "minecraft:brown_mushroom_block", - "id": 99, - "data": 10 - }, - { - "name": "minecraft:brown_mushroom_block", - "id": 99, - "data": 11 - }, - { - "name": "minecraft:brown_mushroom_block", - "id": 99, - "data": 12 - }, - { - "name": "minecraft:brown_mushroom_block", - "id": 99, - "data": 13 - }, - { - "name": "minecraft:brown_mushroom_block", - "id": 99, - "data": 14 - }, - { - "name": "minecraft:brown_mushroom_block", - "id": 99, - "data": 15 - }, - { - "name": "minecraft:red_mushroom_block", - "id": 100, - "data": 0 - }, - { - "name": "minecraft:red_mushroom_block", - "id": 100, - "data": 1 - }, - { - "name": "minecraft:red_mushroom_block", - "id": 100, - "data": 2 - }, - { - "name": "minecraft:red_mushroom_block", - "id": 100, - "data": 3 - }, - { - "name": "minecraft:red_mushroom_block", - "id": 100, - "data": 4 - }, - { - "name": "minecraft:red_mushroom_block", - "id": 100, - "data": 5 - }, - { - "name": "minecraft:red_mushroom_block", - "id": 100, - "data": 6 - }, - { - "name": "minecraft:red_mushroom_block", - "id": 100, - "data": 7 - }, - { - "name": "minecraft:red_mushroom_block", - "id": 100, - "data": 8 - }, - { - "name": "minecraft:red_mushroom_block", - "id": 100, - "data": 9 - }, - { - "name": "minecraft:red_mushroom_block", - "id": 100, - "data": 10 - }, - { - "name": "minecraft:red_mushroom_block", - "id": 100, - "data": 11 - }, - { - "name": "minecraft:red_mushroom_block", - "id": 100, - "data": 12 - }, - { - "name": "minecraft:red_mushroom_block", - "id": 100, - "data": 13 - }, - { - "name": "minecraft:red_mushroom_block", - "id": 100, - "data": 14 - }, - { - "name": "minecraft:red_mushroom_block", - "id": 100, - "data": 15 - }, - { - "name": "minecraft:iron_bars", - "id": 101, - "data": 0 - }, - { - "name": "minecraft:glass_pane", - "id": 102, - "data": 0 - }, - { - "name": "minecraft:melon_block", - "id": 103, - "data": 0 - }, - { - "name": "minecraft:pumpkin_stem", - "id": 104, - "data": 0 - }, - { - "name": "minecraft:pumpkin_stem", - "id": 104, - "data": 1 - }, - { - "name": "minecraft:pumpkin_stem", - "id": 104, - "data": 2 - }, - { - "name": "minecraft:pumpkin_stem", - "id": 104, - "data": 3 - }, - { - "name": "minecraft:pumpkin_stem", - "id": 104, - "data": 4 - }, - { - "name": "minecraft:pumpkin_stem", - "id": 104, - "data": 5 - }, - { - "name": "minecraft:pumpkin_stem", - "id": 104, - "data": 6 - }, - { - "name": "minecraft:pumpkin_stem", - "id": 104, - "data": 7 - }, - { - "name": "minecraft:melon_stem", - "id": 105, - "data": 0 - }, - { - "name": "minecraft:melon_stem", - "id": 105, - "data": 1 - }, - { - "name": "minecraft:melon_stem", - "id": 105, - "data": 2 - }, - { - "name": "minecraft:melon_stem", - "id": 105, - "data": 3 - }, - { - "name": "minecraft:melon_stem", - "id": 105, - "data": 4 - }, - { - "name": "minecraft:melon_stem", - "id": 105, - "data": 5 - }, - { - "name": "minecraft:melon_stem", - "id": 105, - "data": 6 - }, - { - "name": "minecraft:melon_stem", - "id": 105, - "data": 7 - }, - { - "name": "minecraft:vine", - "id": 106, - "data": 0 - }, - { - "name": "minecraft:vine", - "id": 106, - "data": 1 - }, - { - "name": "minecraft:vine", - "id": 106, - "data": 2 - }, - { - "name": "minecraft:vine", - "id": 106, - "data": 3 - }, - { - "name": "minecraft:vine", - "id": 106, - "data": 4 - }, - { - "name": "minecraft:vine", - "id": 106, - "data": 5 - }, - { - "name": "minecraft:vine", - "id": 106, - "data": 6 - }, - { - "name": "minecraft:vine", - "id": 106, - "data": 7 - }, - { - "name": "minecraft:vine", - "id": 106, - "data": 8 - }, - { - "name": "minecraft:vine", - "id": 106, - "data": 9 - }, - { - "name": "minecraft:vine", - "id": 106, - "data": 10 - }, - { - "name": "minecraft:vine", - "id": 106, - "data": 11 - }, - { - "name": "minecraft:vine", - "id": 106, - "data": 12 - }, - { - "name": "minecraft:vine", - "id": 106, - "data": 13 - }, - { - "name": "minecraft:vine", - "id": 106, - "data": 14 - }, - { - "name": "minecraft:vine", - "id": 106, - "data": 15 - }, - { - "name": "minecraft:fence_gate", - "id": 107, - "data": 0 - }, - { - "name": "minecraft:fence_gate", - "id": 107, - "data": 1 - }, - { - "name": "minecraft:fence_gate", - "id": 107, - "data": 2 - }, - { - "name": "minecraft:fence_gate", - "id": 107, - "data": 3 - }, - { - "name": "minecraft:fence_gate", - "id": 107, - "data": 4 - }, - { - "name": "minecraft:fence_gate", - "id": 107, - "data": 5 - }, - { - "name": "minecraft:fence_gate", - "id": 107, - "data": 6 - }, - { - "name": "minecraft:fence_gate", - "id": 107, - "data": 7 - }, - { - "name": "minecraft:fence_gate", - "id": 107, - "data": 8 - }, - { - "name": "minecraft:fence_gate", - "id": 107, - "data": 9 - }, - { - "name": "minecraft:fence_gate", - "id": 107, - "data": 10 - }, - { - "name": "minecraft:fence_gate", - "id": 107, - "data": 11 - }, - { - "name": "minecraft:fence_gate", - "id": 107, - "data": 12 - }, - { - "name": "minecraft:fence_gate", - "id": 107, - "data": 13 - }, - { - "name": "minecraft:fence_gate", - "id": 107, - "data": 14 - }, - { - "name": "minecraft:fence_gate", - "id": 107, - "data": 15 - }, - { - "name": "minecraft:brick_stairs", - "id": 108, - "data": 0 - }, - { - "name": "minecraft:brick_stairs", - "id": 108, - "data": 1 - }, - { - "name": "minecraft:brick_stairs", - "id": 108, - "data": 2 - }, - { - "name": "minecraft:brick_stairs", - "id": 108, - "data": 3 - }, - { - "name": "minecraft:brick_stairs", - "id": 108, - "data": 4 - }, - { - "name": "minecraft:brick_stairs", - "id": 108, - "data": 5 - }, - { - "name": "minecraft:brick_stairs", - "id": 108, - "data": 6 - }, - { - "name": "minecraft:brick_stairs", - "id": 108, - "data": 7 - }, - { - "name": "minecraft:stone_brick_stairs", - "id": 109, - "data": 0 - }, - { - "name": "minecraft:stone_brick_stairs", - "id": 109, - "data": 1 - }, - { - "name": "minecraft:stone_brick_stairs", - "id": 109, - "data": 2 - }, - { - "name": "minecraft:stone_brick_stairs", - "id": 109, - "data": 3 - }, - { - "name": "minecraft:stone_brick_stairs", - "id": 109, - "data": 4 - }, - { - "name": "minecraft:stone_brick_stairs", - "id": 109, - "data": 5 - }, - { - "name": "minecraft:stone_brick_stairs", - "id": 109, - "data": 6 - }, - { - "name": "minecraft:stone_brick_stairs", - "id": 109, - "data": 7 - }, - { - "name": "minecraft:mycelium", - "id": 110, - "data": 0 - }, - { - "name": "minecraft:waterlily", - "id": 111, - "data": 0 - }, - { - "name": "minecraft:nether_brick", - "id": 112, - "data": 0 - }, - { - "name": "minecraft:nether_brick_fence", - "id": 113, - "data": 0 - }, - { - "name": "minecraft:nether_brick_stairs", - "id": 114, - "data": 0 - }, - { - "name": "minecraft:nether_brick_stairs", - "id": 114, - "data": 1 - }, - { - "name": "minecraft:nether_brick_stairs", - "id": 114, - "data": 2 - }, - { - "name": "minecraft:nether_brick_stairs", - "id": 114, - "data": 3 - }, - { - "name": "minecraft:nether_brick_stairs", - "id": 114, - "data": 4 - }, - { - "name": "minecraft:nether_brick_stairs", - "id": 114, - "data": 5 - }, - { - "name": "minecraft:nether_brick_stairs", - "id": 114, - "data": 6 - }, - { - "name": "minecraft:nether_brick_stairs", - "id": 114, - "data": 7 - }, - { - "name": "minecraft:nether_wart", - "id": 115, - "data": 0 - }, - { - "name": "minecraft:nether_wart", - "id": 115, - "data": 1 - }, - { - "name": "minecraft:nether_wart", - "id": 115, - "data": 2 - }, - { - "name": "minecraft:nether_wart", - "id": 115, - "data": 3 - }, - { - "name": "minecraft:enchanting_table", - "id": 116, - "data": 0 - }, - { - "name": "minecraft:brewing_stand", - "id": 117, - "data": 0 - }, - { - "name": "minecraft:brewing_stand", - "id": 117, - "data": 1 - }, - { - "name": "minecraft:brewing_stand", - "id": 117, - "data": 2 - }, - { - "name": "minecraft:brewing_stand", - "id": 117, - "data": 3 - }, - { - "name": "minecraft:brewing_stand", - "id": 117, - "data": 4 - }, - { - "name": "minecraft:brewing_stand", - "id": 117, - "data": 5 - }, - { - "name": "minecraft:brewing_stand", - "id": 117, - "data": 6 - }, - { - "name": "minecraft:brewing_stand", - "id": 117, - "data": 7 - }, - { - "name": "minecraft:cauldron", - "id": 118, - "data": 0 - }, - { - "name": "minecraft:cauldron", - "id": 118, - "data": 1 - }, - { - "name": "minecraft:cauldron", - "id": 118, - "data": 2 - }, - { - "name": "minecraft:cauldron", - "id": 118, - "data": 3 - }, - { - "name": "minecraft:cauldron", - "id": 118, - "data": 4 - }, - { - "name": "minecraft:cauldron", - "id": 118, - "data": 5 - }, - { - "name": "minecraft:cauldron", - "id": 118, - "data": 6 - }, - { - "name": "minecraft:cauldron", - "id": 118, - "data": 7 - }, - { - "name": "minecraft:cauldron", - "id": 118, - "data": 8 - }, - { - "name": "minecraft:cauldron", - "id": 118, - "data": 9 - }, - { - "name": "minecraft:cauldron", - "id": 118, - "data": 10 - }, - { - "name": "minecraft:cauldron", - "id": 118, - "data": 11 - }, - { - "name": "minecraft:cauldron", - "id": 118, - "data": 12 - }, - { - "name": "minecraft:cauldron", - "id": 118, - "data": 13 - }, - { - "name": "minecraft:cauldron", - "id": 118, - "data": 14 - }, - { - "name": "minecraft:cauldron", - "id": 118, - "data": 15 - }, - { - "name": "minecraft:end_portal", - "id": 119, - "data": 0 - }, - { - "name": "minecraft:end_portal_frame", - "id": 120, - "data": 0 - }, - { - "name": "minecraft:end_portal_frame", - "id": 120, - "data": 1 - }, - { - "name": "minecraft:end_portal_frame", - "id": 120, - "data": 2 - }, - { - "name": "minecraft:end_portal_frame", - "id": 120, - "data": 3 - }, - { - "name": "minecraft:end_portal_frame", - "id": 120, - "data": 4 - }, - { - "name": "minecraft:end_portal_frame", - "id": 120, - "data": 5 - }, - { - "name": "minecraft:end_portal_frame", - "id": 120, - "data": 6 - }, - { - "name": "minecraft:end_portal_frame", - "id": 120, - "data": 7 - }, - { - "name": "minecraft:end_stone", - "id": 121, - "data": 0 - }, - { - "name": "minecraft:dragon_egg", - "id": 122, - "data": 0 - }, - { - "name": "minecraft:redstone_lamp", - "id": 123, - "data": 0 - }, - { - "name": "minecraft:lit_redstone_lamp", - "id": 124, - "data": 0 - }, - { - "name": "minecraft:dropper", - "id": 125, - "data": 0 - }, - { - "name": "minecraft:dropper", - "id": 125, - "data": 1 - }, - { - "name": "minecraft:dropper", - "id": 125, - "data": 2 - }, - { - "name": "minecraft:dropper", - "id": 125, - "data": 3 - }, - { - "name": "minecraft:dropper", - "id": 125, - "data": 4 - }, - { - "name": "minecraft:dropper", - "id": 125, - "data": 5 - }, - { - "name": "minecraft:dropper", - "id": 125, - "data": 6 - }, - { - "name": "minecraft:dropper", - "id": 125, - "data": 7 - }, - { - "name": "minecraft:dropper", - "id": 125, - "data": 8 - }, - { - "name": "minecraft:dropper", - "id": 125, - "data": 9 - }, - { - "name": "minecraft:dropper", - "id": 125, - "data": 10 - }, - { - "name": "minecraft:dropper", - "id": 125, - "data": 11 - }, - { - "name": "minecraft:dropper", - "id": 125, - "data": 12 - }, - { - "name": "minecraft:dropper", - "id": 125, - "data": 13 - }, - { - "name": "minecraft:dropper", - "id": 125, - "data": 14 - }, - { - "name": "minecraft:dropper", - "id": 125, - "data": 15 - }, - { - "name": "minecraft:activator_rail", - "id": 126, - "data": 0 - }, - { - "name": "minecraft:activator_rail", - "id": 126, - "data": 1 - }, - { - "name": "minecraft:activator_rail", - "id": 126, - "data": 2 - }, - { - "name": "minecraft:activator_rail", - "id": 126, - "data": 3 - }, - { - "name": "minecraft:activator_rail", - "id": 126, - "data": 4 - }, - { - "name": "minecraft:activator_rail", - "id": 126, - "data": 5 - }, - { - "name": "minecraft:activator_rail", - "id": 126, - "data": 6 - }, - { - "name": "minecraft:activator_rail", - "id": 126, - "data": 7 - }, - { - "name": "minecraft:activator_rail", - "id": 126, - "data": 8 - }, - { - "name": "minecraft:activator_rail", - "id": 126, - "data": 9 - }, - { - "name": "minecraft:activator_rail", - "id": 126, - "data": 10 - }, - { - "name": "minecraft:activator_rail", - "id": 126, - "data": 11 - }, - { - "name": "minecraft:activator_rail", - "id": 126, - "data": 12 - }, - { - "name": "minecraft:activator_rail", - "id": 126, - "data": 13 - }, - { - "name": "minecraft:activator_rail", - "id": 126, - "data": 14 - }, - { - "name": "minecraft:activator_rail", - "id": 126, - "data": 15 - }, - { - "name": "minecraft:cocoa", - "id": 127, - "data": 0 - }, - { - "name": "minecraft:cocoa", - "id": 127, - "data": 1 - }, - { - "name": "minecraft:cocoa", - "id": 127, - "data": 2 - }, - { - "name": "minecraft:cocoa", - "id": 127, - "data": 3 - }, - { - "name": "minecraft:cocoa", - "id": 127, - "data": 4 - }, - { - "name": "minecraft:cocoa", - "id": 127, - "data": 5 - }, - { - "name": "minecraft:cocoa", - "id": 127, - "data": 6 - }, - { - "name": "minecraft:cocoa", - "id": 127, - "data": 7 - }, - { - "name": "minecraft:cocoa", - "id": 127, - "data": 8 - }, - { - "name": "minecraft:cocoa", - "id": 127, - "data": 9 - }, - { - "name": "minecraft:cocoa", - "id": 127, - "data": 10 - }, - { - "name": "minecraft:cocoa", - "id": 127, - "data": 11 - }, - { - "name": "minecraft:cocoa", - "id": 127, - "data": 12 - }, - { - "name": "minecraft:cocoa", - "id": 127, - "data": 13 - }, - { - "name": "minecraft:cocoa", - "id": 127, - "data": 14 - }, - { - "name": "minecraft:cocoa", - "id": 127, - "data": 15 - }, - { - "name": "minecraft:sandstone_stairs", - "id": 128, - "data": 0 - }, - { - "name": "minecraft:sandstone_stairs", - "id": 128, - "data": 1 - }, - { - "name": "minecraft:sandstone_stairs", - "id": 128, - "data": 2 - }, - { - "name": "minecraft:sandstone_stairs", - "id": 128, - "data": 3 - }, - { - "name": "minecraft:sandstone_stairs", - "id": 128, - "data": 4 - }, - { - "name": "minecraft:sandstone_stairs", - "id": 128, - "data": 5 - }, - { - "name": "minecraft:sandstone_stairs", - "id": 128, - "data": 6 - }, - { - "name": "minecraft:sandstone_stairs", - "id": 128, - "data": 7 - }, - { - "name": "minecraft:emerald_ore", - "id": 129, - "data": 0 - }, - { - "name": "minecraft:ender_chest", - "id": 130, - "data": 0 - }, - { - "name": "minecraft:ender_chest", - "id": 130, - "data": 1 - }, - { - "name": "minecraft:ender_chest", - "id": 130, - "data": 2 - }, - { - "name": "minecraft:ender_chest", - "id": 130, - "data": 3 - }, - { - "name": "minecraft:ender_chest", - "id": 130, - "data": 4 - }, - { - "name": "minecraft:ender_chest", - "id": 130, - "data": 5 - }, - { - "name": "minecraft:ender_chest", - "id": 130, - "data": 6 - }, - { - "name": "minecraft:ender_chest", - "id": 130, - "data": 7 - }, - { - "name": "minecraft:tripwire_hook", - "id": 131, - "data": 0 - }, - { - "name": "minecraft:tripwire_hook", - "id": 131, - "data": 1 - }, - { - "name": "minecraft:tripwire_hook", - "id": 131, - "data": 2 - }, - { - "name": "minecraft:tripwire_hook", - "id": 131, - "data": 3 - }, - { - "name": "minecraft:tripwire_hook", - "id": 131, - "data": 4 - }, - { - "name": "minecraft:tripwire_hook", - "id": 131, - "data": 5 - }, - { - "name": "minecraft:tripwire_hook", - "id": 131, - "data": 6 - }, - { - "name": "minecraft:tripwire_hook", - "id": 131, - "data": 7 - }, - { - "name": "minecraft:tripwire_hook", - "id": 131, - "data": 8 - }, - { - "name": "minecraft:tripwire_hook", - "id": 131, - "data": 9 - }, - { - "name": "minecraft:tripwire_hook", - "id": 131, - "data": 10 - }, - { - "name": "minecraft:tripwire_hook", - "id": 131, - "data": 11 - }, - { - "name": "minecraft:tripwire_hook", - "id": 131, - "data": 12 - }, - { - "name": "minecraft:tripwire_hook", - "id": 131, - "data": 13 - }, - { - "name": "minecraft:tripwire_hook", - "id": 131, - "data": 14 - }, - { - "name": "minecraft:tripwire_hook", - "id": 131, - "data": 15 - }, - { - "name": "minecraft:tripWire", - "id": 132, - "data": 0 - }, - { - "name": "minecraft:tripWire", - "id": 132, - "data": 1 - }, - { - "name": "minecraft:tripWire", - "id": 132, - "data": 2 - }, - { - "name": "minecraft:tripWire", - "id": 132, - "data": 3 - }, - { - "name": "minecraft:tripWire", - "id": 132, - "data": 4 - }, - { - "name": "minecraft:tripWire", - "id": 132, - "data": 5 - }, - { - "name": "minecraft:tripWire", - "id": 132, - "data": 6 - }, - { - "name": "minecraft:tripWire", - "id": 132, - "data": 7 - }, - { - "name": "minecraft:tripWire", - "id": 132, - "data": 8 - }, - { - "name": "minecraft:tripWire", - "id": 132, - "data": 9 - }, - { - "name": "minecraft:tripWire", - "id": 132, - "data": 10 - }, - { - "name": "minecraft:tripWire", - "id": 132, - "data": 11 - }, - { - "name": "minecraft:tripWire", - "id": 132, - "data": 12 - }, - { - "name": "minecraft:tripWire", - "id": 132, - "data": 13 - }, - { - "name": "minecraft:tripWire", - "id": 132, - "data": 14 - }, - { - "name": "minecraft:tripWire", - "id": 132, - "data": 15 - }, - { - "name": "minecraft:emerald_block", - "id": 133, - "data": 0 - }, - { - "name": "minecraft:spruce_stairs", - "id": 134, - "data": 0 - }, - { - "name": "minecraft:spruce_stairs", - "id": 134, - "data": 1 - }, - { - "name": "minecraft:spruce_stairs", - "id": 134, - "data": 2 - }, - { - "name": "minecraft:spruce_stairs", - "id": 134, - "data": 3 - }, - { - "name": "minecraft:spruce_stairs", - "id": 134, - "data": 4 - }, - { - "name": "minecraft:spruce_stairs", - "id": 134, - "data": 5 - }, - { - "name": "minecraft:spruce_stairs", - "id": 134, - "data": 6 - }, - { - "name": "minecraft:spruce_stairs", - "id": 134, - "data": 7 - }, - { - "name": "minecraft:birch_stairs", - "id": 135, - "data": 0 - }, - { - "name": "minecraft:birch_stairs", - "id": 135, - "data": 1 - }, - { - "name": "minecraft:birch_stairs", - "id": 135, - "data": 2 - }, - { - "name": "minecraft:birch_stairs", - "id": 135, - "data": 3 - }, - { - "name": "minecraft:birch_stairs", - "id": 135, - "data": 4 - }, - { - "name": "minecraft:birch_stairs", - "id": 135, - "data": 5 - }, - { - "name": "minecraft:birch_stairs", - "id": 135, - "data": 6 - }, - { - "name": "minecraft:birch_stairs", - "id": 135, - "data": 7 - }, - { - "name": "minecraft:jungle_stairs", - "id": 136, - "data": 0 - }, - { - "name": "minecraft:jungle_stairs", - "id": 136, - "data": 1 - }, - { - "name": "minecraft:jungle_stairs", - "id": 136, - "data": 2 - }, - { - "name": "minecraft:jungle_stairs", - "id": 136, - "data": 3 - }, - { - "name": "minecraft:jungle_stairs", - "id": 136, - "data": 4 - }, - { - "name": "minecraft:jungle_stairs", - "id": 136, - "data": 5 - }, - { - "name": "minecraft:jungle_stairs", - "id": 136, - "data": 6 - }, - { - "name": "minecraft:jungle_stairs", - "id": 136, - "data": 7 - }, - { - "name": "minecraft:command_block", - "id": 137, - "data": 0 - }, - { - "name": "minecraft:command_block", - "id": 137, - "data": 1 - }, - { - "name": "minecraft:command_block", - "id": 137, - "data": 2 - }, - { - "name": "minecraft:command_block", - "id": 137, - "data": 3 - }, - { - "name": "minecraft:command_block", - "id": 137, - "data": 4 - }, - { - "name": "minecraft:command_block", - "id": 137, - "data": 5 - }, - { - "name": "minecraft:command_block", - "id": 137, - "data": 6 - }, - { - "name": "minecraft:command_block", - "id": 137, - "data": 7 - }, - { - "name": "minecraft:command_block", - "id": 137, - "data": 8 - }, - { - "name": "minecraft:command_block", - "id": 137, - "data": 9 - }, - { - "name": "minecraft:command_block", - "id": 137, - "data": 10 - }, - { - "name": "minecraft:command_block", - "id": 137, - "data": 11 - }, - { - "name": "minecraft:command_block", - "id": 137, - "data": 12 - }, - { - "name": "minecraft:command_block", - "id": 137, - "data": 13 - }, - { - "name": "minecraft:command_block", - "id": 137, - "data": 14 - }, - { - "name": "minecraft:command_block", - "id": 137, - "data": 15 - }, - { - "name": "minecraft:beacon", - "id": 138, - "data": 0 - }, - { - "name": "minecraft:cobblestone_wall", - "id": 139, - "data": 0 - }, - { - "name": "minecraft:cobblestone_wall", - "id": 139, - "data": 1 - }, - { - "name": "minecraft:cobblestone_wall", - "id": 139, - "data": 2 - }, - { - "name": "minecraft:cobblestone_wall", - "id": 139, - "data": 3 - }, - { - "name": "minecraft:cobblestone_wall", - "id": 139, - "data": 4 - }, - { - "name": "minecraft:cobblestone_wall", - "id": 139, - "data": 5 - }, - { - "name": "minecraft:cobblestone_wall", - "id": 139, - "data": 6 - }, - { - "name": "minecraft:cobblestone_wall", - "id": 139, - "data": 7 - }, - { - "name": "minecraft:cobblestone_wall", - "id": 139, - "data": 8 - }, - { - "name": "minecraft:cobblestone_wall", - "id": 139, - "data": 9 - }, - { - "name": "minecraft:cobblestone_wall", - "id": 139, - "data": 10 - }, - { - "name": "minecraft:cobblestone_wall", - "id": 139, - "data": 11 - }, - { - "name": "minecraft:cobblestone_wall", - "id": 139, - "data": 12 - }, - { - "name": "minecraft:cobblestone_wall", - "id": 139, - "data": 13 - }, - { - "name": "minecraft:cobblestone_wall", - "id": 139, - "data": 14 - }, - { - "name": "minecraft:cobblestone_wall", - "id": 139, - "data": 15 - }, - { - "name": "minecraft:flower_pot", - "id": 140, - "data": 0 - }, - { - "name": "minecraft:flower_pot", - "id": 140, - "data": 1 - }, - { - "name": "minecraft:carrots", - "id": 141, - "data": 0 - }, - { - "name": "minecraft:carrots", - "id": 141, - "data": 1 - }, - { - "name": "minecraft:carrots", - "id": 141, - "data": 2 - }, - { - "name": "minecraft:carrots", - "id": 141, - "data": 3 - }, - { - "name": "minecraft:carrots", - "id": 141, - "data": 4 - }, - { - "name": "minecraft:carrots", - "id": 141, - "data": 5 - }, - { - "name": "minecraft:carrots", - "id": 141, - "data": 6 - }, - { - "name": "minecraft:carrots", - "id": 141, - "data": 7 - }, - { - "name": "minecraft:potatoes", - "id": 142, - "data": 0 - }, - { - "name": "minecraft:potatoes", - "id": 142, - "data": 1 - }, - { - "name": "minecraft:potatoes", - "id": 142, - "data": 2 - }, - { - "name": "minecraft:potatoes", - "id": 142, - "data": 3 - }, - { - "name": "minecraft:potatoes", - "id": 142, - "data": 4 - }, - { - "name": "minecraft:potatoes", - "id": 142, - "data": 5 - }, - { - "name": "minecraft:potatoes", - "id": 142, - "data": 6 - }, - { - "name": "minecraft:potatoes", - "id": 142, - "data": 7 - }, - { - "name": "minecraft:wooden_button", - "id": 143, - "data": 0 - }, - { - "name": "minecraft:wooden_button", - "id": 143, - "data": 1 - }, - { - "name": "minecraft:wooden_button", - "id": 143, - "data": 2 - }, - { - "name": "minecraft:wooden_button", - "id": 143, - "data": 3 - }, - { - "name": "minecraft:wooden_button", - "id": 143, - "data": 4 - }, - { - "name": "minecraft:wooden_button", - "id": 143, - "data": 5 - }, - { - "name": "minecraft:wooden_button", - "id": 143, - "data": 6 - }, - { - "name": "minecraft:wooden_button", - "id": 143, - "data": 7 - }, - { - "name": "minecraft:wooden_button", - "id": 143, - "data": 8 - }, - { - "name": "minecraft:wooden_button", - "id": 143, - "data": 9 - }, - { - "name": "minecraft:wooden_button", - "id": 143, - "data": 10 - }, - { - "name": "minecraft:wooden_button", - "id": 143, - "data": 11 - }, - { - "name": "minecraft:wooden_button", - "id": 143, - "data": 12 - }, - { - "name": "minecraft:wooden_button", - "id": 143, - "data": 13 - }, - { - "name": "minecraft:wooden_button", - "id": 143, - "data": 14 - }, - { - "name": "minecraft:wooden_button", - "id": 143, - "data": 15 - }, - { - "name": "minecraft:skull", - "id": 144, - "data": 0 - }, - { - "name": "minecraft:skull", - "id": 144, - "data": 1 - }, - { - "name": "minecraft:skull", - "id": 144, - "data": 2 - }, - { - "name": "minecraft:skull", - "id": 144, - "data": 3 - }, - { - "name": "minecraft:skull", - "id": 144, - "data": 4 - }, - { - "name": "minecraft:skull", - "id": 144, - "data": 5 - }, - { - "name": "minecraft:skull", - "id": 144, - "data": 6 - }, - { - "name": "minecraft:skull", - "id": 144, - "data": 7 - }, - { - "name": "minecraft:skull", - "id": 144, - "data": 8 - }, - { - "name": "minecraft:skull", - "id": 144, - "data": 9 - }, - { - "name": "minecraft:skull", - "id": 144, - "data": 10 - }, - { - "name": "minecraft:skull", - "id": 144, - "data": 11 - }, - { - "name": "minecraft:skull", - "id": 144, - "data": 12 - }, - { - "name": "minecraft:skull", - "id": 144, - "data": 13 - }, - { - "name": "minecraft:skull", - "id": 144, - "data": 14 - }, - { - "name": "minecraft:skull", - "id": 144, - "data": 15 - }, - { - "name": "minecraft:anvil", - "id": 145, - "data": 0 - }, - { - "name": "minecraft:anvil", - "id": 145, - "data": 1 - }, - { - "name": "minecraft:anvil", - "id": 145, - "data": 2 - }, - { - "name": "minecraft:anvil", - "id": 145, - "data": 3 - }, - { - "name": "minecraft:anvil", - "id": 145, - "data": 4 - }, - { - "name": "minecraft:anvil", - "id": 145, - "data": 5 - }, - { - "name": "minecraft:anvil", - "id": 145, - "data": 6 - }, - { - "name": "minecraft:anvil", - "id": 145, - "data": 7 - }, - { - "name": "minecraft:anvil", - "id": 145, - "data": 8 - }, - { - "name": "minecraft:anvil", - "id": 145, - "data": 9 - }, - { - "name": "minecraft:anvil", - "id": 145, - "data": 10 - }, - { - "name": "minecraft:anvil", - "id": 145, - "data": 11 - }, - { - "name": "minecraft:anvil", - "id": 145, - "data": 12 - }, - { - "name": "minecraft:anvil", - "id": 145, - "data": 13 - }, - { - "name": "minecraft:anvil", - "id": 145, - "data": 14 - }, - { - "name": "minecraft:anvil", - "id": 145, - "data": 15 - }, - { - "name": "minecraft:trapped_chest", - "id": 146, - "data": 0 - }, - { - "name": "minecraft:trapped_chest", - "id": 146, - "data": 1 - }, - { - "name": "minecraft:trapped_chest", - "id": 146, - "data": 2 - }, - { - "name": "minecraft:trapped_chest", - "id": 146, - "data": 3 - }, - { - "name": "minecraft:trapped_chest", - "id": 146, - "data": 4 - }, - { - "name": "minecraft:trapped_chest", - "id": 146, - "data": 5 - }, - { - "name": "minecraft:trapped_chest", - "id": 146, - "data": 6 - }, - { - "name": "minecraft:trapped_chest", - "id": 146, - "data": 7 - }, - { - "name": "minecraft:light_weighted_pressure_plate", - "id": 147, - "data": 0 - }, - { - "name": "minecraft:light_weighted_pressure_plate", - "id": 147, - "data": 1 - }, - { - "name": "minecraft:light_weighted_pressure_plate", - "id": 147, - "data": 2 - }, - { - "name": "minecraft:light_weighted_pressure_plate", - "id": 147, - "data": 3 - }, - { - "name": "minecraft:light_weighted_pressure_plate", - "id": 147, - "data": 4 - }, - { - "name": "minecraft:light_weighted_pressure_plate", - "id": 147, - "data": 5 - }, - { - "name": "minecraft:light_weighted_pressure_plate", - "id": 147, - "data": 6 - }, - { - "name": "minecraft:light_weighted_pressure_plate", - "id": 147, - "data": 7 - }, - { - "name": "minecraft:light_weighted_pressure_plate", - "id": 147, - "data": 8 - }, - { - "name": "minecraft:light_weighted_pressure_plate", - "id": 147, - "data": 9 - }, - { - "name": "minecraft:light_weighted_pressure_plate", - "id": 147, - "data": 10 - }, - { - "name": "minecraft:light_weighted_pressure_plate", - "id": 147, - "data": 11 - }, - { - "name": "minecraft:light_weighted_pressure_plate", - "id": 147, - "data": 12 - }, - { - "name": "minecraft:light_weighted_pressure_plate", - "id": 147, - "data": 13 - }, - { - "name": "minecraft:light_weighted_pressure_plate", - "id": 147, - "data": 14 - }, - { - "name": "minecraft:light_weighted_pressure_plate", - "id": 147, - "data": 15 - }, - { - "name": "minecraft:heavy_weighted_pressure_plate", - "id": 148, - "data": 0 - }, - { - "name": "minecraft:heavy_weighted_pressure_plate", - "id": 148, - "data": 1 - }, - { - "name": "minecraft:heavy_weighted_pressure_plate", - "id": 148, - "data": 2 - }, - { - "name": "minecraft:heavy_weighted_pressure_plate", - "id": 148, - "data": 3 - }, - { - "name": "minecraft:heavy_weighted_pressure_plate", - "id": 148, - "data": 4 - }, - { - "name": "minecraft:heavy_weighted_pressure_plate", - "id": 148, - "data": 5 - }, - { - "name": "minecraft:heavy_weighted_pressure_plate", - "id": 148, - "data": 6 - }, - { - "name": "minecraft:heavy_weighted_pressure_plate", - "id": 148, - "data": 7 - }, - { - "name": "minecraft:heavy_weighted_pressure_plate", - "id": 148, - "data": 8 - }, - { - "name": "minecraft:heavy_weighted_pressure_plate", - "id": 148, - "data": 9 - }, - { - "name": "minecraft:heavy_weighted_pressure_plate", - "id": 148, - "data": 10 - }, - { - "name": "minecraft:heavy_weighted_pressure_plate", - "id": 148, - "data": 11 - }, - { - "name": "minecraft:heavy_weighted_pressure_plate", - "id": 148, - "data": 12 - }, - { - "name": "minecraft:heavy_weighted_pressure_plate", - "id": 148, - "data": 13 - }, - { - "name": "minecraft:heavy_weighted_pressure_plate", - "id": 148, - "data": 14 - }, - { - "name": "minecraft:heavy_weighted_pressure_plate", - "id": 148, - "data": 15 - }, - { - "name": "minecraft:unpowered_comparator", - "id": 149, - "data": 0 - }, - { - "name": "minecraft:unpowered_comparator", - "id": 149, - "data": 1 - }, - { - "name": "minecraft:unpowered_comparator", - "id": 149, - "data": 2 - }, - { - "name": "minecraft:unpowered_comparator", - "id": 149, - "data": 3 - }, - { - "name": "minecraft:unpowered_comparator", - "id": 149, - "data": 4 - }, - { - "name": "minecraft:unpowered_comparator", - "id": 149, - "data": 5 - }, - { - "name": "minecraft:unpowered_comparator", - "id": 149, - "data": 6 - }, - { - "name": "minecraft:unpowered_comparator", - "id": 149, - "data": 7 - }, - { - "name": "minecraft:unpowered_comparator", - "id": 149, - "data": 8 - }, - { - "name": "minecraft:unpowered_comparator", - "id": 149, - "data": 9 - }, - { - "name": "minecraft:unpowered_comparator", - "id": 149, - "data": 10 - }, - { - "name": "minecraft:unpowered_comparator", - "id": 149, - "data": 11 - }, - { - "name": "minecraft:unpowered_comparator", - "id": 149, - "data": 12 - }, - { - "name": "minecraft:unpowered_comparator", - "id": 149, - "data": 13 - }, - { - "name": "minecraft:unpowered_comparator", - "id": 149, - "data": 14 - }, - { - "name": "minecraft:unpowered_comparator", - "id": 149, - "data": 15 - }, - { - "name": "minecraft:powered_comparator", - "id": 150, - "data": 0 - }, - { - "name": "minecraft:powered_comparator", - "id": 150, - "data": 1 - }, - { - "name": "minecraft:powered_comparator", - "id": 150, - "data": 2 - }, - { - "name": "minecraft:powered_comparator", - "id": 150, - "data": 3 - }, - { - "name": "minecraft:powered_comparator", - "id": 150, - "data": 4 - }, - { - "name": "minecraft:powered_comparator", - "id": 150, - "data": 5 - }, - { - "name": "minecraft:powered_comparator", - "id": 150, - "data": 6 - }, - { - "name": "minecraft:powered_comparator", - "id": 150, - "data": 7 - }, - { - "name": "minecraft:powered_comparator", - "id": 150, - "data": 8 - }, - { - "name": "minecraft:powered_comparator", - "id": 150, - "data": 9 - }, - { - "name": "minecraft:powered_comparator", - "id": 150, - "data": 10 - }, - { - "name": "minecraft:powered_comparator", - "id": 150, - "data": 11 - }, - { - "name": "minecraft:powered_comparator", - "id": 150, - "data": 12 - }, - { - "name": "minecraft:powered_comparator", - "id": 150, - "data": 13 - }, - { - "name": "minecraft:powered_comparator", - "id": 150, - "data": 14 - }, - { - "name": "minecraft:powered_comparator", - "id": 150, - "data": 15 - }, - { - "name": "minecraft:daylight_detector", - "id": 151, - "data": 0 - }, - { - "name": "minecraft:daylight_detector", - "id": 151, - "data": 1 - }, - { - "name": "minecraft:daylight_detector", - "id": 151, - "data": 2 - }, - { - "name": "minecraft:daylight_detector", - "id": 151, - "data": 3 - }, - { - "name": "minecraft:daylight_detector", - "id": 151, - "data": 4 - }, - { - "name": "minecraft:daylight_detector", - "id": 151, - "data": 5 - }, - { - "name": "minecraft:daylight_detector", - "id": 151, - "data": 6 - }, - { - "name": "minecraft:daylight_detector", - "id": 151, - "data": 7 - }, - { - "name": "minecraft:daylight_detector", - "id": 151, - "data": 8 - }, - { - "name": "minecraft:daylight_detector", - "id": 151, - "data": 9 - }, - { - "name": "minecraft:daylight_detector", - "id": 151, - "data": 10 - }, - { - "name": "minecraft:daylight_detector", - "id": 151, - "data": 11 - }, - { - "name": "minecraft:daylight_detector", - "id": 151, - "data": 12 - }, - { - "name": "minecraft:daylight_detector", - "id": 151, - "data": 13 - }, - { - "name": "minecraft:daylight_detector", - "id": 151, - "data": 14 - }, - { - "name": "minecraft:daylight_detector", - "id": 151, - "data": 15 - }, - { - "name": "minecraft:redstone_block", - "id": 152, - "data": 0 - }, - { - "name": "minecraft:quartz_ore", - "id": 153, - "data": 0 - }, - { - "name": "minecraft:hopper", - "id": 154, - "data": 0 - }, - { - "name": "minecraft:hopper", - "id": 154, - "data": 1 - }, - { - "name": "minecraft:hopper", - "id": 154, - "data": 2 - }, - { - "name": "minecraft:hopper", - "id": 154, - "data": 3 - }, - { - "name": "minecraft:hopper", - "id": 154, - "data": 4 - }, - { - "name": "minecraft:hopper", - "id": 154, - "data": 5 - }, - { - "name": "minecraft:hopper", - "id": 154, - "data": 6 - }, - { - "name": "minecraft:hopper", - "id": 154, - "data": 7 - }, - { - "name": "minecraft:hopper", - "id": 154, - "data": 8 - }, - { - "name": "minecraft:hopper", - "id": 154, - "data": 9 - }, - { - "name": "minecraft:hopper", - "id": 154, - "data": 10 - }, - { - "name": "minecraft:hopper", - "id": 154, - "data": 11 - }, - { - "name": "minecraft:hopper", - "id": 154, - "data": 12 - }, - { - "name": "minecraft:hopper", - "id": 154, - "data": 13 - }, - { - "name": "minecraft:hopper", - "id": 154, - "data": 14 - }, - { - "name": "minecraft:hopper", - "id": 154, - "data": 15 - }, - { - "name": "minecraft:quartz_block", - "id": 155, - "data": 0 - }, - { - "name": "minecraft:quartz_block", - "id": 155, - "data": 1 - }, - { - "name": "minecraft:quartz_block", - "id": 155, - "data": 2 - }, - { - "name": "minecraft:quartz_block", - "id": 155, - "data": 3 - }, - { - "name": "minecraft:quartz_block", - "id": 155, - "data": 4 - }, - { - "name": "minecraft:quartz_block", - "id": 155, - "data": 5 - }, - { - "name": "minecraft:quartz_block", - "id": 155, - "data": 6 - }, - { - "name": "minecraft:quartz_block", - "id": 155, - "data": 7 - }, - { - "name": "minecraft:quartz_block", - "id": 155, - "data": 8 - }, - { - "name": "minecraft:quartz_block", - "id": 155, - "data": 9 - }, - { - "name": "minecraft:quartz_block", - "id": 155, - "data": 10 - }, - { - "name": "minecraft:quartz_block", - "id": 155, - "data": 11 - }, - { - "name": "minecraft:quartz_block", - "id": 155, - "data": 12 - }, - { - "name": "minecraft:quartz_block", - "id": 155, - "data": 13 - }, - { - "name": "minecraft:quartz_block", - "id": 155, - "data": 14 - }, - { - "name": "minecraft:quartz_block", - "id": 155, - "data": 15 - }, - { - "name": "minecraft:quartz_stairs", - "id": 156, - "data": 0 - }, - { - "name": "minecraft:quartz_stairs", - "id": 156, - "data": 1 - }, - { - "name": "minecraft:quartz_stairs", - "id": 156, - "data": 2 - }, - { - "name": "minecraft:quartz_stairs", - "id": 156, - "data": 3 - }, - { - "name": "minecraft:quartz_stairs", - "id": 156, - "data": 4 - }, - { - "name": "minecraft:quartz_stairs", - "id": 156, - "data": 5 - }, - { - "name": "minecraft:quartz_stairs", - "id": 156, - "data": 6 - }, - { - "name": "minecraft:quartz_stairs", - "id": 156, - "data": 7 - }, - { - "name": "minecraft:double_wooden_slab", - "id": 157, - "data": 0 - }, - { - "name": "minecraft:double_wooden_slab", - "id": 157, - "data": 1 - }, - { - "name": "minecraft:double_wooden_slab", - "id": 157, - "data": 2 - }, - { - "name": "minecraft:double_wooden_slab", - "id": 157, - "data": 3 - }, - { - "name": "minecraft:double_wooden_slab", - "id": 157, - "data": 4 - }, - { - "name": "minecraft:double_wooden_slab", - "id": 157, - "data": 5 - }, - { - "name": "minecraft:double_wooden_slab", - "id": 157, - "data": 6 - }, - { - "name": "minecraft:double_wooden_slab", - "id": 157, - "data": 7 - }, - { - "name": "minecraft:double_wooden_slab", - "id": 157, - "data": 8 - }, - { - "name": "minecraft:double_wooden_slab", - "id": 157, - "data": 9 - }, - { - "name": "minecraft:double_wooden_slab", - "id": 157, - "data": 10 - }, - { - "name": "minecraft:double_wooden_slab", - "id": 157, - "data": 11 - }, - { - "name": "minecraft:double_wooden_slab", - "id": 157, - "data": 12 - }, - { - "name": "minecraft:double_wooden_slab", - "id": 157, - "data": 13 - }, - { - "name": "minecraft:double_wooden_slab", - "id": 157, - "data": 14 - }, - { - "name": "minecraft:double_wooden_slab", - "id": 157, - "data": 15 - }, - { - "name": "minecraft:wooden_slab", - "id": 158, - "data": 0 - }, - { - "name": "minecraft:wooden_slab", - "id": 158, - "data": 1 - }, - { - "name": "minecraft:wooden_slab", - "id": 158, - "data": 2 - }, - { - "name": "minecraft:wooden_slab", - "id": 158, - "data": 3 - }, - { - "name": "minecraft:wooden_slab", - "id": 158, - "data": 4 - }, - { - "name": "minecraft:wooden_slab", - "id": 158, - "data": 5 - }, - { - "name": "minecraft:wooden_slab", - "id": 158, - "data": 6 - }, - { - "name": "minecraft:wooden_slab", - "id": 158, - "data": 7 - }, - { - "name": "minecraft:wooden_slab", - "id": 158, - "data": 8 - }, - { - "name": "minecraft:wooden_slab", - "id": 158, - "data": 9 - }, - { - "name": "minecraft:wooden_slab", - "id": 158, - "data": 10 - }, - { - "name": "minecraft:wooden_slab", - "id": 158, - "data": 11 - }, - { - "name": "minecraft:wooden_slab", - "id": 158, - "data": 12 - }, - { - "name": "minecraft:wooden_slab", - "id": 158, - "data": 13 - }, - { - "name": "minecraft:wooden_slab", - "id": 158, - "data": 14 - }, - { - "name": "minecraft:wooden_slab", - "id": 158, - "data": 15 - }, - { - "name": "minecraft:stained_hardened_clay", - "id": 159, - "data": 0 - }, - { - "name": "minecraft:stained_hardened_clay", - "id": 159, - "data": 1 - }, - { - "name": "minecraft:stained_hardened_clay", - "id": 159, - "data": 2 - }, - { - "name": "minecraft:stained_hardened_clay", - "id": 159, - "data": 3 - }, - { - "name": "minecraft:stained_hardened_clay", - "id": 159, - "data": 4 - }, - { - "name": "minecraft:stained_hardened_clay", - "id": 159, - "data": 5 - }, - { - "name": "minecraft:stained_hardened_clay", - "id": 159, - "data": 6 - }, - { - "name": "minecraft:stained_hardened_clay", - "id": 159, - "data": 7 - }, - { - "name": "minecraft:stained_hardened_clay", - "id": 159, - "data": 8 - }, - { - "name": "minecraft:stained_hardened_clay", - "id": 159, - "data": 9 - }, - { - "name": "minecraft:stained_hardened_clay", - "id": 159, - "data": 10 - }, - { - "name": "minecraft:stained_hardened_clay", - "id": 159, - "data": 11 - }, - { - "name": "minecraft:stained_hardened_clay", - "id": 159, - "data": 12 - }, - { - "name": "minecraft:stained_hardened_clay", - "id": 159, - "data": 13 - }, - { - "name": "minecraft:stained_hardened_clay", - "id": 159, - "data": 14 - }, - { - "name": "minecraft:stained_hardened_clay", - "id": 159, - "data": 15 - }, - { - "name": "minecraft:stained_glass_pane", - "id": 160, - "data": 0 - }, - { - "name": "minecraft:stained_glass_pane", - "id": 160, - "data": 1 - }, - { - "name": "minecraft:stained_glass_pane", - "id": 160, - "data": 2 - }, - { - "name": "minecraft:stained_glass_pane", - "id": 160, - "data": 3 - }, - { - "name": "minecraft:stained_glass_pane", - "id": 160, - "data": 4 - }, - { - "name": "minecraft:stained_glass_pane", - "id": 160, - "data": 5 - }, - { - "name": "minecraft:stained_glass_pane", - "id": 160, - "data": 6 - }, - { - "name": "minecraft:stained_glass_pane", - "id": 160, - "data": 7 - }, - { - "name": "minecraft:stained_glass_pane", - "id": 160, - "data": 8 - }, - { - "name": "minecraft:stained_glass_pane", - "id": 160, - "data": 9 - }, - { - "name": "minecraft:stained_glass_pane", - "id": 160, - "data": 10 - }, - { - "name": "minecraft:stained_glass_pane", - "id": 160, - "data": 11 - }, - { - "name": "minecraft:stained_glass_pane", - "id": 160, - "data": 12 - }, - { - "name": "minecraft:stained_glass_pane", - "id": 160, - "data": 13 - }, - { - "name": "minecraft:stained_glass_pane", - "id": 160, - "data": 14 - }, - { - "name": "minecraft:stained_glass_pane", - "id": 160, - "data": 15 - }, - { - "name": "minecraft:leaves2", - "id": 161, - "data": 0 - }, - { - "name": "minecraft:leaves2", - "id": 161, - "data": 1 - }, - { - "name": "minecraft:leaves2", - "id": 161, - "data": 2 - }, - { - "name": "minecraft:leaves2", - "id": 161, - "data": 3 - }, - { - "name": "minecraft:leaves2", - "id": 161, - "data": 4 - }, - { - "name": "minecraft:leaves2", - "id": 161, - "data": 5 - }, - { - "name": "minecraft:leaves2", - "id": 161, - "data": 6 - }, - { - "name": "minecraft:leaves2", - "id": 161, - "data": 7 - }, - { - "name": "minecraft:leaves2", - "id": 161, - "data": 8 - }, - { - "name": "minecraft:leaves2", - "id": 161, - "data": 9 - }, - { - "name": "minecraft:leaves2", - "id": 161, - "data": 10 - }, - { - "name": "minecraft:leaves2", - "id": 161, - "data": 11 - }, - { - "name": "minecraft:leaves2", - "id": 161, - "data": 12 - }, - { - "name": "minecraft:leaves2", - "id": 161, - "data": 13 - }, - { - "name": "minecraft:leaves2", - "id": 161, - "data": 14 - }, - { - "name": "minecraft:leaves2", - "id": 161, - "data": 15 - }, - { - "name": "minecraft:log2", - "id": 162, - "data": 0 - }, - { - "name": "minecraft:log2", - "id": 162, - "data": 1 - }, - { - "name": "minecraft:log2", - "id": 162, - "data": 2 - }, - { - "name": "minecraft:log2", - "id": 162, - "data": 3 - }, - { - "name": "minecraft:log2", - "id": 162, - "data": 4 - }, - { - "name": "minecraft:log2", - "id": 162, - "data": 5 - }, - { - "name": "minecraft:log2", - "id": 162, - "data": 6 - }, - { - "name": "minecraft:log2", - "id": 162, - "data": 7 - }, - { - "name": "minecraft:log2", - "id": 162, - "data": 8 - }, - { - "name": "minecraft:log2", - "id": 162, - "data": 9 - }, - { - "name": "minecraft:log2", - "id": 162, - "data": 10 - }, - { - "name": "minecraft:log2", - "id": 162, - "data": 11 - }, - { - "name": "minecraft:log2", - "id": 162, - "data": 12 - }, - { - "name": "minecraft:log2", - "id": 162, - "data": 13 - }, - { - "name": "minecraft:log2", - "id": 162, - "data": 14 - }, - { - "name": "minecraft:log2", - "id": 162, - "data": 15 - }, - { - "name": "minecraft:acacia_stairs", - "id": 163, - "data": 0 - }, - { - "name": "minecraft:acacia_stairs", - "id": 163, - "data": 1 - }, - { - "name": "minecraft:acacia_stairs", - "id": 163, - "data": 2 - }, - { - "name": "minecraft:acacia_stairs", - "id": 163, - "data": 3 - }, - { - "name": "minecraft:acacia_stairs", - "id": 163, - "data": 4 - }, - { - "name": "minecraft:acacia_stairs", - "id": 163, - "data": 5 - }, - { - "name": "minecraft:acacia_stairs", - "id": 163, - "data": 6 - }, - { - "name": "minecraft:acacia_stairs", - "id": 163, - "data": 7 - }, - { - "name": "minecraft:dark_oak_stairs", - "id": 164, - "data": 0 - }, - { - "name": "minecraft:dark_oak_stairs", - "id": 164, - "data": 1 - }, - { - "name": "minecraft:dark_oak_stairs", - "id": 164, - "data": 2 - }, - { - "name": "minecraft:dark_oak_stairs", - "id": 164, - "data": 3 - }, - { - "name": "minecraft:dark_oak_stairs", - "id": 164, - "data": 4 - }, - { - "name": "minecraft:dark_oak_stairs", - "id": 164, - "data": 5 - }, - { - "name": "minecraft:dark_oak_stairs", - "id": 164, - "data": 6 - }, - { - "name": "minecraft:dark_oak_stairs", - "id": 164, - "data": 7 - }, - { - "name": "minecraft:slime", - "id": 165, - "data": 0 - }, - { - "name": "minecraft:iron_trapdoor", - "id": 167, - "data": 0 - }, - { - "name": "minecraft:iron_trapdoor", - "id": 167, - "data": 1 - }, - { - "name": "minecraft:iron_trapdoor", - "id": 167, - "data": 2 - }, - { - "name": "minecraft:iron_trapdoor", - "id": 167, - "data": 3 - }, - { - "name": "minecraft:iron_trapdoor", - "id": 167, - "data": 4 - }, - { - "name": "minecraft:iron_trapdoor", - "id": 167, - "data": 5 - }, - { - "name": "minecraft:iron_trapdoor", - "id": 167, - "data": 6 - }, - { - "name": "minecraft:iron_trapdoor", - "id": 167, - "data": 7 - }, - { - "name": "minecraft:iron_trapdoor", - "id": 167, - "data": 8 - }, - { - "name": "minecraft:iron_trapdoor", - "id": 167, - "data": 9 - }, - { - "name": "minecraft:iron_trapdoor", - "id": 167, - "data": 10 - }, - { - "name": "minecraft:iron_trapdoor", - "id": 167, - "data": 11 - }, - { - "name": "minecraft:iron_trapdoor", - "id": 167, - "data": 12 - }, - { - "name": "minecraft:iron_trapdoor", - "id": 167, - "data": 13 - }, - { - "name": "minecraft:iron_trapdoor", - "id": 167, - "data": 14 - }, - { - "name": "minecraft:iron_trapdoor", - "id": 167, - "data": 15 - }, - { - "name": "minecraft:prismarine", - "id": 168, - "data": 0 - }, - { - "name": "minecraft:prismarine", - "id": 168, - "data": 1 - }, - { - "name": "minecraft:prismarine", - "id": 168, - "data": 2 - }, - { - "name": "minecraft:prismarine", - "id": 168, - "data": 3 - }, - { - "name": "minecraft:seaLantern", - "id": 169, - "data": 0 - }, - { - "name": "minecraft:hay_block", - "id": 170, - "data": 0 - }, - { - "name": "minecraft:hay_block", - "id": 170, - "data": 1 - }, - { - "name": "minecraft:hay_block", - "id": 170, - "data": 2 - }, - { - "name": "minecraft:hay_block", - "id": 170, - "data": 3 - }, - { - "name": "minecraft:hay_block", - "id": 170, - "data": 4 - }, - { - "name": "minecraft:hay_block", - "id": 170, - "data": 5 - }, - { - "name": "minecraft:hay_block", - "id": 170, - "data": 6 - }, - { - "name": "minecraft:hay_block", - "id": 170, - "data": 7 - }, - { - "name": "minecraft:hay_block", - "id": 170, - "data": 8 - }, - { - "name": "minecraft:hay_block", - "id": 170, - "data": 9 - }, - { - "name": "minecraft:hay_block", - "id": 170, - "data": 10 - }, - { - "name": "minecraft:hay_block", - "id": 170, - "data": 11 - }, - { - "name": "minecraft:hay_block", - "id": 170, - "data": 12 - }, - { - "name": "minecraft:hay_block", - "id": 170, - "data": 13 - }, - { - "name": "minecraft:hay_block", - "id": 170, - "data": 14 - }, - { - "name": "minecraft:hay_block", - "id": 170, - "data": 15 - }, - { - "name": "minecraft:carpet", - "id": 171, - "data": 0 - }, - { - "name": "minecraft:carpet", - "id": 171, - "data": 1 - }, - { - "name": "minecraft:carpet", - "id": 171, - "data": 2 - }, - { - "name": "minecraft:carpet", - "id": 171, - "data": 3 - }, - { - "name": "minecraft:carpet", - "id": 171, - "data": 4 - }, - { - "name": "minecraft:carpet", - "id": 171, - "data": 5 - }, - { - "name": "minecraft:carpet", - "id": 171, - "data": 6 - }, - { - "name": "minecraft:carpet", - "id": 171, - "data": 7 - }, - { - "name": "minecraft:carpet", - "id": 171, - "data": 8 - }, - { - "name": "minecraft:carpet", - "id": 171, - "data": 9 - }, - { - "name": "minecraft:carpet", - "id": 171, - "data": 10 - }, - { - "name": "minecraft:carpet", - "id": 171, - "data": 11 - }, - { - "name": "minecraft:carpet", - "id": 171, - "data": 12 - }, - { - "name": "minecraft:carpet", - "id": 171, - "data": 13 - }, - { - "name": "minecraft:carpet", - "id": 171, - "data": 14 - }, - { - "name": "minecraft:carpet", - "id": 171, - "data": 15 - }, - { - "name": "minecraft:hardened_clay", - "id": 172, - "data": 0 - }, - { - "name": "minecraft:coal_block", - "id": 173, - "data": 0 - }, - { - "name": "minecraft:packed_ice", - "id": 174, - "data": 0 - }, - { - "name": "minecraft:double_plant", - "id": 175, - "data": 0 - }, - { - "name": "minecraft:double_plant", - "id": 175, - "data": 1 - }, - { - "name": "minecraft:double_plant", - "id": 175, - "data": 2 - }, - { - "name": "minecraft:double_plant", - "id": 175, - "data": 3 - }, - { - "name": "minecraft:double_plant", - "id": 175, - "data": 4 - }, - { - "name": "minecraft:double_plant", - "id": 175, - "data": 5 - }, - { - "name": "minecraft:double_plant", - "id": 175, - "data": 6 - }, - { - "name": "minecraft:double_plant", - "id": 175, - "data": 7 - }, - { - "name": "minecraft:double_plant", - "id": 175, - "data": 8 - }, - { - "name": "minecraft:double_plant", - "id": 175, - "data": 9 - }, - { - "name": "minecraft:double_plant", - "id": 175, - "data": 10 - }, - { - "name": "minecraft:double_plant", - "id": 175, - "data": 11 - }, - { - "name": "minecraft:double_plant", - "id": 175, - "data": 12 - }, - { - "name": "minecraft:double_plant", - "id": 175, - "data": 13 - }, - { - "name": "minecraft:double_plant", - "id": 175, - "data": 14 - }, - { - "name": "minecraft:double_plant", - "id": 175, - "data": 15 - }, - { - "name": "minecraft:standing_banner", - "id": 176, - "data": 0 - }, - { - "name": "minecraft:standing_banner", - "id": 176, - "data": 1 - }, - { - "name": "minecraft:standing_banner", - "id": 176, - "data": 2 - }, - { - "name": "minecraft:standing_banner", - "id": 176, - "data": 3 - }, - { - "name": "minecraft:standing_banner", - "id": 176, - "data": 4 - }, - { - "name": "minecraft:standing_banner", - "id": 176, - "data": 5 - }, - { - "name": "minecraft:standing_banner", - "id": 176, - "data": 6 - }, - { - "name": "minecraft:standing_banner", - "id": 176, - "data": 7 - }, - { - "name": "minecraft:standing_banner", - "id": 176, - "data": 8 - }, - { - "name": "minecraft:standing_banner", - "id": 176, - "data": 9 - }, - { - "name": "minecraft:standing_banner", - "id": 176, - "data": 10 - }, - { - "name": "minecraft:standing_banner", - "id": 176, - "data": 11 - }, - { - "name": "minecraft:standing_banner", - "id": 176, - "data": 12 - }, - { - "name": "minecraft:standing_banner", - "id": 176, - "data": 13 - }, - { - "name": "minecraft:standing_banner", - "id": 176, - "data": 14 - }, - { - "name": "minecraft:standing_banner", - "id": 176, - "data": 15 - }, - { - "name": "minecraft:wall_banner", - "id": 177, - "data": 0 - }, - { - "name": "minecraft:wall_banner", - "id": 177, - "data": 1 - }, - { - "name": "minecraft:wall_banner", - "id": 177, - "data": 2 - }, - { - "name": "minecraft:wall_banner", - "id": 177, - "data": 3 - }, - { - "name": "minecraft:wall_banner", - "id": 177, - "data": 4 - }, - { - "name": "minecraft:wall_banner", - "id": 177, - "data": 5 - }, - { - "name": "minecraft:wall_banner", - "id": 177, - "data": 6 - }, - { - "name": "minecraft:wall_banner", - "id": 177, - "data": 7 - }, - { - "name": "minecraft:daylight_detector_inverted", - "id": 178, - "data": 0 - }, - { - "name": "minecraft:daylight_detector_inverted", - "id": 178, - "data": 1 - }, - { - "name": "minecraft:daylight_detector_inverted", - "id": 178, - "data": 2 - }, - { - "name": "minecraft:daylight_detector_inverted", - "id": 178, - "data": 3 - }, - { - "name": "minecraft:daylight_detector_inverted", - "id": 178, - "data": 4 - }, - { - "name": "minecraft:daylight_detector_inverted", - "id": 178, - "data": 5 - }, - { - "name": "minecraft:daylight_detector_inverted", - "id": 178, - "data": 6 - }, - { - "name": "minecraft:daylight_detector_inverted", - "id": 178, - "data": 7 - }, - { - "name": "minecraft:daylight_detector_inverted", - "id": 178, - "data": 8 - }, - { - "name": "minecraft:daylight_detector_inverted", - "id": 178, - "data": 9 - }, - { - "name": "minecraft:daylight_detector_inverted", - "id": 178, - "data": 10 - }, - { - "name": "minecraft:daylight_detector_inverted", - "id": 178, - "data": 11 - }, - { - "name": "minecraft:daylight_detector_inverted", - "id": 178, - "data": 12 - }, - { - "name": "minecraft:daylight_detector_inverted", - "id": 178, - "data": 13 - }, - { - "name": "minecraft:daylight_detector_inverted", - "id": 178, - "data": 14 - }, - { - "name": "minecraft:daylight_detector_inverted", - "id": 178, - "data": 15 - }, - { - "name": "minecraft:red_sandstone", - "id": 179, - "data": 0 - }, - { - "name": "minecraft:red_sandstone", - "id": 179, - "data": 1 - }, - { - "name": "minecraft:red_sandstone", - "id": 179, - "data": 2 - }, - { - "name": "minecraft:red_sandstone", - "id": 179, - "data": 3 - }, - { - "name": "minecraft:red_sandstone_stairs", - "id": 180, - "data": 0 - }, - { - "name": "minecraft:red_sandstone_stairs", - "id": 180, - "data": 1 - }, - { - "name": "minecraft:red_sandstone_stairs", - "id": 180, - "data": 2 - }, - { - "name": "minecraft:red_sandstone_stairs", - "id": 180, - "data": 3 - }, - { - "name": "minecraft:red_sandstone_stairs", - "id": 180, - "data": 4 - }, - { - "name": "minecraft:red_sandstone_stairs", - "id": 180, - "data": 5 - }, - { - "name": "minecraft:red_sandstone_stairs", - "id": 180, - "data": 6 - }, - { - "name": "minecraft:red_sandstone_stairs", - "id": 180, - "data": 7 - }, - { - "name": "minecraft:double_stone_slab2", - "id": 181, - "data": 0 - }, - { - "name": "minecraft:double_stone_slab2", - "id": 181, - "data": 1 - }, - { - "name": "minecraft:double_stone_slab2", - "id": 181, - "data": 2 - }, - { - "name": "minecraft:double_stone_slab2", - "id": 181, - "data": 3 - }, - { - "name": "minecraft:double_stone_slab2", - "id": 181, - "data": 4 - }, - { - "name": "minecraft:double_stone_slab2", - "id": 181, - "data": 5 - }, - { - "name": "minecraft:double_stone_slab2", - "id": 181, - "data": 6 - }, - { - "name": "minecraft:double_stone_slab2", - "id": 181, - "data": 7 - }, - { - "name": "minecraft:double_stone_slab2", - "id": 181, - "data": 8 - }, - { - "name": "minecraft:double_stone_slab2", - "id": 181, - "data": 9 - }, - { - "name": "minecraft:double_stone_slab2", - "id": 181, - "data": 10 - }, - { - "name": "minecraft:double_stone_slab2", - "id": 181, - "data": 11 - }, - { - "name": "minecraft:double_stone_slab2", - "id": 181, - "data": 12 - }, - { - "name": "minecraft:double_stone_slab2", - "id": 181, - "data": 13 - }, - { - "name": "minecraft:double_stone_slab2", - "id": 181, - "data": 14 - }, - { - "name": "minecraft:double_stone_slab2", - "id": 181, - "data": 15 - }, - { - "name": "minecraft:stone_slab2", - "id": 182, - "data": 0 - }, - { - "name": "minecraft:stone_slab2", - "id": 182, - "data": 1 - }, - { - "name": "minecraft:stone_slab2", - "id": 182, - "data": 2 - }, - { - "name": "minecraft:stone_slab2", - "id": 182, - "data": 3 - }, - { - "name": "minecraft:stone_slab2", - "id": 182, - "data": 4 - }, - { - "name": "minecraft:stone_slab2", - "id": 182, - "data": 5 - }, - { - "name": "minecraft:stone_slab2", - "id": 182, - "data": 6 - }, - { - "name": "minecraft:stone_slab2", - "id": 182, - "data": 7 - }, - { - "name": "minecraft:stone_slab2", - "id": 182, - "data": 8 - }, - { - "name": "minecraft:stone_slab2", - "id": 182, - "data": 9 - }, - { - "name": "minecraft:stone_slab2", - "id": 182, - "data": 10 - }, - { - "name": "minecraft:stone_slab2", - "id": 182, - "data": 11 - }, - { - "name": "minecraft:stone_slab2", - "id": 182, - "data": 12 - }, - { - "name": "minecraft:stone_slab2", - "id": 182, - "data": 13 - }, - { - "name": "minecraft:stone_slab2", - "id": 182, - "data": 14 - }, - { - "name": "minecraft:stone_slab2", - "id": 182, - "data": 15 - }, - { - "name": "minecraft:spruce_fence_gate", - "id": 183, - "data": 0 - }, - { - "name": "minecraft:spruce_fence_gate", - "id": 183, - "data": 1 - }, - { - "name": "minecraft:spruce_fence_gate", - "id": 183, - "data": 2 - }, - { - "name": "minecraft:spruce_fence_gate", - "id": 183, - "data": 3 - }, - { - "name": "minecraft:spruce_fence_gate", - "id": 183, - "data": 4 - }, - { - "name": "minecraft:spruce_fence_gate", - "id": 183, - "data": 5 - }, - { - "name": "minecraft:spruce_fence_gate", - "id": 183, - "data": 6 - }, - { - "name": "minecraft:spruce_fence_gate", - "id": 183, - "data": 7 - }, - { - "name": "minecraft:spruce_fence_gate", - "id": 183, - "data": 8 - }, - { - "name": "minecraft:spruce_fence_gate", - "id": 183, - "data": 9 - }, - { - "name": "minecraft:spruce_fence_gate", - "id": 183, - "data": 10 - }, - { - "name": "minecraft:spruce_fence_gate", - "id": 183, - "data": 11 - }, - { - "name": "minecraft:spruce_fence_gate", - "id": 183, - "data": 12 - }, - { - "name": "minecraft:spruce_fence_gate", - "id": 183, - "data": 13 - }, - { - "name": "minecraft:spruce_fence_gate", - "id": 183, - "data": 14 - }, - { - "name": "minecraft:spruce_fence_gate", - "id": 183, - "data": 15 - }, - { - "name": "minecraft:birch_fence_gate", - "id": 184, - "data": 0 - }, - { - "name": "minecraft:birch_fence_gate", - "id": 184, - "data": 1 - }, - { - "name": "minecraft:birch_fence_gate", - "id": 184, - "data": 2 - }, - { - "name": "minecraft:birch_fence_gate", - "id": 184, - "data": 3 - }, - { - "name": "minecraft:birch_fence_gate", - "id": 184, - "data": 4 - }, - { - "name": "minecraft:birch_fence_gate", - "id": 184, - "data": 5 - }, - { - "name": "minecraft:birch_fence_gate", - "id": 184, - "data": 6 - }, - { - "name": "minecraft:birch_fence_gate", - "id": 184, - "data": 7 - }, - { - "name": "minecraft:birch_fence_gate", - "id": 184, - "data": 8 - }, - { - "name": "minecraft:birch_fence_gate", - "id": 184, - "data": 9 - }, - { - "name": "minecraft:birch_fence_gate", - "id": 184, - "data": 10 - }, - { - "name": "minecraft:birch_fence_gate", - "id": 184, - "data": 11 - }, - { - "name": "minecraft:birch_fence_gate", - "id": 184, - "data": 12 - }, - { - "name": "minecraft:birch_fence_gate", - "id": 184, - "data": 13 - }, - { - "name": "minecraft:birch_fence_gate", - "id": 184, - "data": 14 - }, - { - "name": "minecraft:birch_fence_gate", - "id": 184, - "data": 15 - }, - { - "name": "minecraft:jungle_fence_gate", - "id": 185, - "data": 0 - }, - { - "name": "minecraft:jungle_fence_gate", - "id": 185, - "data": 1 - }, - { - "name": "minecraft:jungle_fence_gate", - "id": 185, - "data": 2 - }, - { - "name": "minecraft:jungle_fence_gate", - "id": 185, - "data": 3 - }, - { - "name": "minecraft:jungle_fence_gate", - "id": 185, - "data": 4 - }, - { - "name": "minecraft:jungle_fence_gate", - "id": 185, - "data": 5 - }, - { - "name": "minecraft:jungle_fence_gate", - "id": 185, - "data": 6 - }, - { - "name": "minecraft:jungle_fence_gate", - "id": 185, - "data": 7 - }, - { - "name": "minecraft:jungle_fence_gate", - "id": 185, - "data": 8 - }, - { - "name": "minecraft:jungle_fence_gate", - "id": 185, - "data": 9 - }, - { - "name": "minecraft:jungle_fence_gate", - "id": 185, - "data": 10 - }, - { - "name": "minecraft:jungle_fence_gate", - "id": 185, - "data": 11 - }, - { - "name": "minecraft:jungle_fence_gate", - "id": 185, - "data": 12 - }, - { - "name": "minecraft:jungle_fence_gate", - "id": 185, - "data": 13 - }, - { - "name": "minecraft:jungle_fence_gate", - "id": 185, - "data": 14 - }, - { - "name": "minecraft:jungle_fence_gate", - "id": 185, - "data": 15 - }, - { - "name": "minecraft:dark_oak_fence_gate", - "id": 186, - "data": 0 - }, - { - "name": "minecraft:dark_oak_fence_gate", - "id": 186, - "data": 1 - }, - { - "name": "minecraft:dark_oak_fence_gate", - "id": 186, - "data": 2 - }, - { - "name": "minecraft:dark_oak_fence_gate", - "id": 186, - "data": 3 - }, - { - "name": "minecraft:dark_oak_fence_gate", - "id": 186, - "data": 4 - }, - { - "name": "minecraft:dark_oak_fence_gate", - "id": 186, - "data": 5 - }, - { - "name": "minecraft:dark_oak_fence_gate", - "id": 186, - "data": 6 - }, - { - "name": "minecraft:dark_oak_fence_gate", - "id": 186, - "data": 7 - }, - { - "name": "minecraft:dark_oak_fence_gate", - "id": 186, - "data": 8 - }, - { - "name": "minecraft:dark_oak_fence_gate", - "id": 186, - "data": 9 - }, - { - "name": "minecraft:dark_oak_fence_gate", - "id": 186, - "data": 10 - }, - { - "name": "minecraft:dark_oak_fence_gate", - "id": 186, - "data": 11 - }, - { - "name": "minecraft:dark_oak_fence_gate", - "id": 186, - "data": 12 - }, - { - "name": "minecraft:dark_oak_fence_gate", - "id": 186, - "data": 13 - }, - { - "name": "minecraft:dark_oak_fence_gate", - "id": 186, - "data": 14 - }, - { - "name": "minecraft:dark_oak_fence_gate", - "id": 186, - "data": 15 - }, - { - "name": "minecraft:acacia_fence_gate", - "id": 187, - "data": 0 - }, - { - "name": "minecraft:acacia_fence_gate", - "id": 187, - "data": 1 - }, - { - "name": "minecraft:acacia_fence_gate", - "id": 187, - "data": 2 - }, - { - "name": "minecraft:acacia_fence_gate", - "id": 187, - "data": 3 - }, - { - "name": "minecraft:acacia_fence_gate", - "id": 187, - "data": 4 - }, - { - "name": "minecraft:acacia_fence_gate", - "id": 187, - "data": 5 - }, - { - "name": "minecraft:acacia_fence_gate", - "id": 187, - "data": 6 - }, - { - "name": "minecraft:acacia_fence_gate", - "id": 187, - "data": 7 - }, - { - "name": "minecraft:acacia_fence_gate", - "id": 187, - "data": 8 - }, - { - "name": "minecraft:acacia_fence_gate", - "id": 187, - "data": 9 - }, - { - "name": "minecraft:acacia_fence_gate", - "id": 187, - "data": 10 - }, - { - "name": "minecraft:acacia_fence_gate", - "id": 187, - "data": 11 - }, - { - "name": "minecraft:acacia_fence_gate", - "id": 187, - "data": 12 - }, - { - "name": "minecraft:acacia_fence_gate", - "id": 187, - "data": 13 - }, - { - "name": "minecraft:acacia_fence_gate", - "id": 187, - "data": 14 - }, - { - "name": "minecraft:acacia_fence_gate", - "id": 187, - "data": 15 - }, - { - "name": "minecraft:repeating_command_block", - "id": 188, - "data": 0 - }, - { - "name": "minecraft:repeating_command_block", - "id": 188, - "data": 1 - }, - { - "name": "minecraft:repeating_command_block", - "id": 188, - "data": 2 - }, - { - "name": "minecraft:repeating_command_block", - "id": 188, - "data": 3 - }, - { - "name": "minecraft:repeating_command_block", - "id": 188, - "data": 4 - }, - { - "name": "minecraft:repeating_command_block", - "id": 188, - "data": 5 - }, - { - "name": "minecraft:repeating_command_block", - "id": 188, - "data": 6 - }, - { - "name": "minecraft:repeating_command_block", - "id": 188, - "data": 7 - }, - { - "name": "minecraft:repeating_command_block", - "id": 188, - "data": 8 - }, - { - "name": "minecraft:repeating_command_block", - "id": 188, - "data": 9 - }, - { - "name": "minecraft:repeating_command_block", - "id": 188, - "data": 10 - }, - { - "name": "minecraft:repeating_command_block", - "id": 188, - "data": 11 - }, - { - "name": "minecraft:repeating_command_block", - "id": 188, - "data": 12 - }, - { - "name": "minecraft:repeating_command_block", - "id": 188, - "data": 13 - }, - { - "name": "minecraft:repeating_command_block", - "id": 188, - "data": 14 - }, - { - "name": "minecraft:repeating_command_block", - "id": 188, - "data": 15 - }, - { - "name": "minecraft:chain_command_block", - "id": 189, - "data": 0 - }, - { - "name": "minecraft:chain_command_block", - "id": 189, - "data": 1 - }, - { - "name": "minecraft:chain_command_block", - "id": 189, - "data": 2 - }, - { - "name": "minecraft:chain_command_block", - "id": 189, - "data": 3 - }, - { - "name": "minecraft:chain_command_block", - "id": 189, - "data": 4 - }, - { - "name": "minecraft:chain_command_block", - "id": 189, - "data": 5 - }, - { - "name": "minecraft:chain_command_block", - "id": 189, - "data": 6 - }, - { - "name": "minecraft:chain_command_block", - "id": 189, - "data": 7 - }, - { - "name": "minecraft:chain_command_block", - "id": 189, - "data": 8 - }, - { - "name": "minecraft:chain_command_block", - "id": 189, - "data": 9 - }, - { - "name": "minecraft:chain_command_block", - "id": 189, - "data": 10 - }, - { - "name": "minecraft:chain_command_block", - "id": 189, - "data": 11 - }, - { - "name": "minecraft:chain_command_block", - "id": 189, - "data": 12 - }, - { - "name": "minecraft:chain_command_block", - "id": 189, - "data": 13 - }, - { - "name": "minecraft:chain_command_block", - "id": 189, - "data": 14 - }, - { - "name": "minecraft:chain_command_block", - "id": 189, - "data": 15 - }, - { - "name": "minecraft:hard_glass_pane", - "id": 190, - "data": 0 - }, - { - "name": "minecraft:hard_stained_glass_pane", - "id": 191, - "data": 0 - }, - { - "name": "minecraft:hard_stained_glass_pane", - "id": 191, - "data": 1 - }, - { - "name": "minecraft:hard_stained_glass_pane", - "id": 191, - "data": 2 - }, - { - "name": "minecraft:hard_stained_glass_pane", - "id": 191, - "data": 3 - }, - { - "name": "minecraft:hard_stained_glass_pane", - "id": 191, - "data": 4 - }, - { - "name": "minecraft:hard_stained_glass_pane", - "id": 191, - "data": 5 - }, - { - "name": "minecraft:hard_stained_glass_pane", - "id": 191, - "data": 6 - }, - { - "name": "minecraft:hard_stained_glass_pane", - "id": 191, - "data": 7 - }, - { - "name": "minecraft:hard_stained_glass_pane", - "id": 191, - "data": 8 - }, - { - "name": "minecraft:hard_stained_glass_pane", - "id": 191, - "data": 9 - }, - { - "name": "minecraft:hard_stained_glass_pane", - "id": 191, - "data": 10 - }, - { - "name": "minecraft:hard_stained_glass_pane", - "id": 191, - "data": 11 - }, - { - "name": "minecraft:hard_stained_glass_pane", - "id": 191, - "data": 12 - }, - { - "name": "minecraft:hard_stained_glass_pane", - "id": 191, - "data": 13 - }, - { - "name": "minecraft:hard_stained_glass_pane", - "id": 191, - "data": 14 - }, - { - "name": "minecraft:hard_stained_glass_pane", - "id": 191, - "data": 15 - }, - { - "name": "minecraft:chemical_heat", - "id": 192, - "data": 0 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 0 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 1 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 2 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 3 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 4 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 5 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 6 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 7 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 8 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 9 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 10 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 11 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 12 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 13 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 14 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 15 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 16 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 17 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 18 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 19 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 20 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 21 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 22 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 23 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 24 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 25 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 26 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 27 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 28 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 29 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 30 - }, - { - "name": "minecraft:spruce_door", - "id": 193, - "data": 31 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 0 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 1 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 2 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 3 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 4 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 5 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 6 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 7 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 8 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 9 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 10 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 11 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 12 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 13 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 14 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 15 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 16 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 17 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 18 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 19 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 20 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 21 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 22 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 23 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 24 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 25 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 26 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 27 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 28 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 29 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 30 - }, - { - "name": "minecraft:birch_door", - "id": 194, - "data": 31 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 0 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 1 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 2 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 3 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 4 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 5 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 6 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 7 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 8 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 9 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 10 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 11 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 12 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 13 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 14 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 15 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 16 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 17 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 18 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 19 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 20 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 21 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 22 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 23 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 24 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 25 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 26 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 27 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 28 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 29 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 30 - }, - { - "name": "minecraft:jungle_door", - "id": 195, - "data": 31 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 0 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 1 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 2 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 3 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 4 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 5 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 6 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 7 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 8 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 9 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 10 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 11 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 12 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 13 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 14 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 15 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 16 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 17 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 18 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 19 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 20 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 21 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 22 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 23 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 24 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 25 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 26 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 27 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 28 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 29 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 30 - }, - { - "name": "minecraft:acacia_door", - "id": 196, - "data": 31 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 0 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 1 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 2 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 3 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 4 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 5 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 6 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 7 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 8 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 9 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 10 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 11 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 12 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 13 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 14 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 15 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 16 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 17 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 18 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 19 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 20 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 21 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 22 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 23 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 24 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 25 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 26 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 27 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 28 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 29 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 30 - }, - { - "name": "minecraft:dark_oak_door", - "id": 197, - "data": 31 - }, - { - "name": "minecraft:grass_path", - "id": 198, - "data": 0 - }, - { - "name": "minecraft:frame", - "id": 199, - "data": 0 - }, - { - "name": "minecraft:frame", - "id": 199, - "data": 1 - }, - { - "name": "minecraft:frame", - "id": 199, - "data": 2 - }, - { - "name": "minecraft:frame", - "id": 199, - "data": 3 - }, - { - "name": "minecraft:frame", - "id": 199, - "data": 4 - }, - { - "name": "minecraft:frame", - "id": 199, - "data": 5 - }, - { - "name": "minecraft:frame", - "id": 199, - "data": 6 - }, - { - "name": "minecraft:frame", - "id": 199, - "data": 7 - }, - { - "name": "minecraft:chorus_flower", - "id": 200, - "data": 0 - }, - { - "name": "minecraft:chorus_flower", - "id": 200, - "data": 1 - }, - { - "name": "minecraft:chorus_flower", - "id": 200, - "data": 2 - }, - { - "name": "minecraft:chorus_flower", - "id": 200, - "data": 3 - }, - { - "name": "minecraft:chorus_flower", - "id": 200, - "data": 4 - }, - { - "name": "minecraft:chorus_flower", - "id": 200, - "data": 5 - }, - { - "name": "minecraft:chorus_flower", - "id": 200, - "data": 6 - }, - { - "name": "minecraft:chorus_flower", - "id": 200, - "data": 7 - }, - { - "name": "minecraft:purpur_block", - "id": 201, - "data": 0 - }, - { - "name": "minecraft:purpur_block", - "id": 201, - "data": 1 - }, - { - "name": "minecraft:purpur_block", - "id": 201, - "data": 2 - }, - { - "name": "minecraft:purpur_block", - "id": 201, - "data": 3 - }, - { - "name": "minecraft:purpur_block", - "id": 201, - "data": 4 - }, - { - "name": "minecraft:purpur_block", - "id": 201, - "data": 5 - }, - { - "name": "minecraft:purpur_block", - "id": 201, - "data": 6 - }, - { - "name": "minecraft:purpur_block", - "id": 201, - "data": 7 - }, - { - "name": "minecraft:purpur_block", - "id": 201, - "data": 8 - }, - { - "name": "minecraft:purpur_block", - "id": 201, - "data": 9 - }, - { - "name": "minecraft:purpur_block", - "id": 201, - "data": 10 - }, - { - "name": "minecraft:purpur_block", - "id": 201, - "data": 11 - }, - { - "name": "minecraft:purpur_block", - "id": 201, - "data": 12 - }, - { - "name": "minecraft:purpur_block", - "id": 201, - "data": 13 - }, - { - "name": "minecraft:purpur_block", - "id": 201, - "data": 14 - }, - { - "name": "minecraft:purpur_block", - "id": 201, - "data": 15 - }, - { - "name": "minecraft:colored_torch_rg", - "id": 202, - "data": 0 - }, - { - "name": "minecraft:colored_torch_rg", - "id": 202, - "data": 1 - }, - { - "name": "minecraft:colored_torch_rg", - "id": 202, - "data": 2 - }, - { - "name": "minecraft:colored_torch_rg", - "id": 202, - "data": 3 - }, - { - "name": "minecraft:colored_torch_rg", - "id": 202, - "data": 4 - }, - { - "name": "minecraft:colored_torch_rg", - "id": 202, - "data": 5 - }, - { - "name": "minecraft:colored_torch_rg", - "id": 202, - "data": 6 - }, - { - "name": "minecraft:colored_torch_rg", - "id": 202, - "data": 7 - }, - { - "name": "minecraft:colored_torch_rg", - "id": 202, - "data": 8 - }, - { - "name": "minecraft:colored_torch_rg", - "id": 202, - "data": 9 - }, - { - "name": "minecraft:colored_torch_rg", - "id": 202, - "data": 10 - }, - { - "name": "minecraft:colored_torch_rg", - "id": 202, - "data": 11 - }, - { - "name": "minecraft:colored_torch_rg", - "id": 202, - "data": 12 - }, - { - "name": "minecraft:colored_torch_rg", - "id": 202, - "data": 13 - }, - { - "name": "minecraft:colored_torch_rg", - "id": 202, - "data": 14 - }, - { - "name": "minecraft:colored_torch_rg", - "id": 202, - "data": 15 - }, - { - "name": "minecraft:purpur_stairs", - "id": 203, - "data": 0 - }, - { - "name": "minecraft:purpur_stairs", - "id": 203, - "data": 1 - }, - { - "name": "minecraft:purpur_stairs", - "id": 203, - "data": 2 - }, - { - "name": "minecraft:purpur_stairs", - "id": 203, - "data": 3 - }, - { - "name": "minecraft:purpur_stairs", - "id": 203, - "data": 4 - }, - { - "name": "minecraft:purpur_stairs", - "id": 203, - "data": 5 - }, - { - "name": "minecraft:purpur_stairs", - "id": 203, - "data": 6 - }, - { - "name": "minecraft:purpur_stairs", - "id": 203, - "data": 7 - }, - { - "name": "minecraft:colored_torch_bp", - "id": 204, - "data": 0 - }, - { - "name": "minecraft:colored_torch_bp", - "id": 204, - "data": 1 - }, - { - "name": "minecraft:colored_torch_bp", - "id": 204, - "data": 2 - }, - { - "name": "minecraft:colored_torch_bp", - "id": 204, - "data": 3 - }, - { - "name": "minecraft:colored_torch_bp", - "id": 204, - "data": 4 - }, - { - "name": "minecraft:colored_torch_bp", - "id": 204, - "data": 5 - }, - { - "name": "minecraft:colored_torch_bp", - "id": 204, - "data": 6 - }, - { - "name": "minecraft:colored_torch_bp", - "id": 204, - "data": 7 - }, - { - "name": "minecraft:colored_torch_bp", - "id": 204, - "data": 8 - }, - { - "name": "minecraft:colored_torch_bp", - "id": 204, - "data": 9 - }, - { - "name": "minecraft:colored_torch_bp", - "id": 204, - "data": 10 - }, - { - "name": "minecraft:colored_torch_bp", - "id": 204, - "data": 11 - }, - { - "name": "minecraft:colored_torch_bp", - "id": 204, - "data": 12 - }, - { - "name": "minecraft:colored_torch_bp", - "id": 204, - "data": 13 - }, - { - "name": "minecraft:colored_torch_bp", - "id": 204, - "data": 14 - }, - { - "name": "minecraft:colored_torch_bp", - "id": 204, - "data": 15 - }, - { - "name": "minecraft:undyed_shulker_box", - "id": 205, - "data": 0 - }, - { - "name": "minecraft:end_bricks", - "id": 206, - "data": 0 - }, - { - "name": "minecraft:frosted_ice", - "id": 207, - "data": 0 - }, - { - "name": "minecraft:frosted_ice", - "id": 207, - "data": 1 - }, - { - "name": "minecraft:frosted_ice", - "id": 207, - "data": 2 - }, - { - "name": "minecraft:frosted_ice", - "id": 207, - "data": 3 - }, - { - "name": "minecraft:end_rod", - "id": 208, - "data": 0 - }, - { - "name": "minecraft:end_rod", - "id": 208, - "data": 1 - }, - { - "name": "minecraft:end_rod", - "id": 208, - "data": 2 - }, - { - "name": "minecraft:end_rod", - "id": 208, - "data": 3 - }, - { - "name": "minecraft:end_rod", - "id": 208, - "data": 4 - }, - { - "name": "minecraft:end_rod", - "id": 208, - "data": 5 - }, - { - "name": "minecraft:end_rod", - "id": 208, - "data": 6 - }, - { - "name": "minecraft:end_rod", - "id": 208, - "data": 7 - }, - { - "name": "minecraft:end_gateway", - "id": 209, - "data": 0 - }, - { - "name": "minecraft:magma", - "id": 213, - "data": 0 - }, - { - "name": "minecraft:nether_wart_block", - "id": 214, - "data": 0 - }, - { - "name": "minecraft:red_nether_brick", - "id": 215, - "data": 0 - }, - { - "name": "minecraft:bone_block", - "id": 216, - "data": 0 - }, - { - "name": "minecraft:bone_block", - "id": 216, - "data": 1 - }, - { - "name": "minecraft:bone_block", - "id": 216, - "data": 2 - }, - { - "name": "minecraft:bone_block", - "id": 216, - "data": 3 - }, - { - "name": "minecraft:bone_block", - "id": 216, - "data": 4 - }, - { - "name": "minecraft:bone_block", - "id": 216, - "data": 5 - }, - { - "name": "minecraft:bone_block", - "id": 216, - "data": 6 - }, - { - "name": "minecraft:bone_block", - "id": 216, - "data": 7 - }, - { - "name": "minecraft:bone_block", - "id": 216, - "data": 8 - }, - { - "name": "minecraft:bone_block", - "id": 216, - "data": 9 - }, - { - "name": "minecraft:bone_block", - "id": 216, - "data": 10 - }, - { - "name": "minecraft:bone_block", - "id": 216, - "data": 11 - }, - { - "name": "minecraft:bone_block", - "id": 216, - "data": 12 - }, - { - "name": "minecraft:bone_block", - "id": 216, - "data": 13 - }, - { - "name": "minecraft:bone_block", - "id": 216, - "data": 14 - }, - { - "name": "minecraft:bone_block", - "id": 216, - "data": 15 - }, - { - "name": "minecraft:shulker_box", - "id": 218, - "data": 0 - }, - { - "name": "minecraft:shulker_box", - "id": 218, - "data": 1 - }, - { - "name": "minecraft:shulker_box", - "id": 218, - "data": 2 - }, - { - "name": "minecraft:shulker_box", - "id": 218, - "data": 3 - }, - { - "name": "minecraft:shulker_box", - "id": 218, - "data": 4 - }, - { - "name": "minecraft:shulker_box", - "id": 218, - "data": 5 - }, - { - "name": "minecraft:shulker_box", - "id": 218, - "data": 6 - }, - { - "name": "minecraft:shulker_box", - "id": 218, - "data": 7 - }, - { - "name": "minecraft:shulker_box", - "id": 218, - "data": 8 - }, - { - "name": "minecraft:shulker_box", - "id": 218, - "data": 9 - }, - { - "name": "minecraft:shulker_box", - "id": 218, - "data": 10 - }, - { - "name": "minecraft:shulker_box", - "id": 218, - "data": 11 - }, - { - "name": "minecraft:shulker_box", - "id": 218, - "data": 12 - }, - { - "name": "minecraft:shulker_box", - "id": 218, - "data": 13 - }, - { - "name": "minecraft:shulker_box", - "id": 218, - "data": 14 - }, - { - "name": "minecraft:shulker_box", - "id": 218, - "data": 15 - }, - { - "name": "minecraft:purple_glazed_terracotta", - "id": 219, - "data": 0 - }, - { - "name": "minecraft:purple_glazed_terracotta", - "id": 219, - "data": 1 - }, - { - "name": "minecraft:purple_glazed_terracotta", - "id": 219, - "data": 2 - }, - { - "name": "minecraft:purple_glazed_terracotta", - "id": 219, - "data": 3 - }, - { - "name": "minecraft:purple_glazed_terracotta", - "id": 219, - "data": 4 - }, - { - "name": "minecraft:purple_glazed_terracotta", - "id": 219, - "data": 5 - }, - { - "name": "minecraft:purple_glazed_terracotta", - "id": 219, - "data": 6 - }, - { - "name": "minecraft:purple_glazed_terracotta", - "id": 219, - "data": 7 - }, - { - "name": "minecraft:white_glazed_terracotta", - "id": 220, - "data": 0 - }, - { - "name": "minecraft:white_glazed_terracotta", - "id": 220, - "data": 1 - }, - { - "name": "minecraft:white_glazed_terracotta", - "id": 220, - "data": 2 - }, - { - "name": "minecraft:white_glazed_terracotta", - "id": 220, - "data": 3 - }, - { - "name": "minecraft:white_glazed_terracotta", - "id": 220, - "data": 4 - }, - { - "name": "minecraft:white_glazed_terracotta", - "id": 220, - "data": 5 - }, - { - "name": "minecraft:white_glazed_terracotta", - "id": 220, - "data": 6 - }, - { - "name": "minecraft:white_glazed_terracotta", - "id": 220, - "data": 7 - }, - { - "name": "minecraft:orange_glazed_terracotta", - "id": 221, - "data": 0 - }, - { - "name": "minecraft:orange_glazed_terracotta", - "id": 221, - "data": 1 - }, - { - "name": "minecraft:orange_glazed_terracotta", - "id": 221, - "data": 2 - }, - { - "name": "minecraft:orange_glazed_terracotta", - "id": 221, - "data": 3 - }, - { - "name": "minecraft:orange_glazed_terracotta", - "id": 221, - "data": 4 - }, - { - "name": "minecraft:orange_glazed_terracotta", - "id": 221, - "data": 5 - }, - { - "name": "minecraft:orange_glazed_terracotta", - "id": 221, - "data": 6 - }, - { - "name": "minecraft:orange_glazed_terracotta", - "id": 221, - "data": 7 - }, - { - "name": "minecraft:magenta_glazed_terracotta", - "id": 222, - "data": 0 - }, - { - "name": "minecraft:magenta_glazed_terracotta", - "id": 222, - "data": 1 - }, - { - "name": "minecraft:magenta_glazed_terracotta", - "id": 222, - "data": 2 - }, - { - "name": "minecraft:magenta_glazed_terracotta", - "id": 222, - "data": 3 - }, - { - "name": "minecraft:magenta_glazed_terracotta", - "id": 222, - "data": 4 - }, - { - "name": "minecraft:magenta_glazed_terracotta", - "id": 222, - "data": 5 - }, - { - "name": "minecraft:magenta_glazed_terracotta", - "id": 222, - "data": 6 - }, - { - "name": "minecraft:magenta_glazed_terracotta", - "id": 222, - "data": 7 - }, - { - "name": "minecraft:light_blue_glazed_terracotta", - "id": 223, - "data": 0 - }, - { - "name": "minecraft:light_blue_glazed_terracotta", - "id": 223, - "data": 1 - }, - { - "name": "minecraft:light_blue_glazed_terracotta", - "id": 223, - "data": 2 - }, - { - "name": "minecraft:light_blue_glazed_terracotta", - "id": 223, - "data": 3 - }, - { - "name": "minecraft:light_blue_glazed_terracotta", - "id": 223, - "data": 4 - }, - { - "name": "minecraft:light_blue_glazed_terracotta", - "id": 223, - "data": 5 - }, - { - "name": "minecraft:light_blue_glazed_terracotta", - "id": 223, - "data": 6 - }, - { - "name": "minecraft:light_blue_glazed_terracotta", - "id": 223, - "data": 7 - }, - { - "name": "minecraft:yellow_glazed_terracotta", - "id": 224, - "data": 0 - }, - { - "name": "minecraft:yellow_glazed_terracotta", - "id": 224, - "data": 1 - }, - { - "name": "minecraft:yellow_glazed_terracotta", - "id": 224, - "data": 2 - }, - { - "name": "minecraft:yellow_glazed_terracotta", - "id": 224, - "data": 3 - }, - { - "name": "minecraft:yellow_glazed_terracotta", - "id": 224, - "data": 4 - }, - { - "name": "minecraft:yellow_glazed_terracotta", - "id": 224, - "data": 5 - }, - { - "name": "minecraft:yellow_glazed_terracotta", - "id": 224, - "data": 6 - }, - { - "name": "minecraft:yellow_glazed_terracotta", - "id": 224, - "data": 7 - }, - { - "name": "minecraft:lime_glazed_terracotta", - "id": 225, - "data": 0 - }, - { - "name": "minecraft:lime_glazed_terracotta", - "id": 225, - "data": 1 - }, - { - "name": "minecraft:lime_glazed_terracotta", - "id": 225, - "data": 2 - }, - { - "name": "minecraft:lime_glazed_terracotta", - "id": 225, - "data": 3 - }, - { - "name": "minecraft:lime_glazed_terracotta", - "id": 225, - "data": 4 - }, - { - "name": "minecraft:lime_glazed_terracotta", - "id": 225, - "data": 5 - }, - { - "name": "minecraft:lime_glazed_terracotta", - "id": 225, - "data": 6 - }, - { - "name": "minecraft:lime_glazed_terracotta", - "id": 225, - "data": 7 - }, - { - "name": "minecraft:pink_glazed_terracotta", - "id": 226, - "data": 0 - }, - { - "name": "minecraft:pink_glazed_terracotta", - "id": 226, - "data": 1 - }, - { - "name": "minecraft:pink_glazed_terracotta", - "id": 226, - "data": 2 - }, - { - "name": "minecraft:pink_glazed_terracotta", - "id": 226, - "data": 3 - }, - { - "name": "minecraft:pink_glazed_terracotta", - "id": 226, - "data": 4 - }, - { - "name": "minecraft:pink_glazed_terracotta", - "id": 226, - "data": 5 - }, - { - "name": "minecraft:pink_glazed_terracotta", - "id": 226, - "data": 6 - }, - { - "name": "minecraft:pink_glazed_terracotta", - "id": 226, - "data": 7 - }, - { - "name": "minecraft:gray_glazed_terracotta", - "id": 227, - "data": 0 - }, - { - "name": "minecraft:gray_glazed_terracotta", - "id": 227, - "data": 1 - }, - { - "name": "minecraft:gray_glazed_terracotta", - "id": 227, - "data": 2 - }, - { - "name": "minecraft:gray_glazed_terracotta", - "id": 227, - "data": 3 - }, - { - "name": "minecraft:gray_glazed_terracotta", - "id": 227, - "data": 4 - }, - { - "name": "minecraft:gray_glazed_terracotta", - "id": 227, - "data": 5 - }, - { - "name": "minecraft:gray_glazed_terracotta", - "id": 227, - "data": 6 - }, - { - "name": "minecraft:gray_glazed_terracotta", - "id": 227, - "data": 7 - }, - { - "name": "minecraft:silver_glazed_terracotta", - "id": 228, - "data": 0 - }, - { - "name": "minecraft:silver_glazed_terracotta", - "id": 228, - "data": 1 - }, - { - "name": "minecraft:silver_glazed_terracotta", - "id": 228, - "data": 2 - }, - { - "name": "minecraft:silver_glazed_terracotta", - "id": 228, - "data": 3 - }, - { - "name": "minecraft:silver_glazed_terracotta", - "id": 228, - "data": 4 - }, - { - "name": "minecraft:silver_glazed_terracotta", - "id": 228, - "data": 5 - }, - { - "name": "minecraft:silver_glazed_terracotta", - "id": 228, - "data": 6 - }, - { - "name": "minecraft:silver_glazed_terracotta", - "id": 228, - "data": 7 - }, - { - "name": "minecraft:cyan_glazed_terracotta", - "id": 229, - "data": 0 - }, - { - "name": "minecraft:cyan_glazed_terracotta", - "id": 229, - "data": 1 - }, - { - "name": "minecraft:cyan_glazed_terracotta", - "id": 229, - "data": 2 - }, - { - "name": "minecraft:cyan_glazed_terracotta", - "id": 229, - "data": 3 - }, - { - "name": "minecraft:cyan_glazed_terracotta", - "id": 229, - "data": 4 - }, - { - "name": "minecraft:cyan_glazed_terracotta", - "id": 229, - "data": 5 - }, - { - "name": "minecraft:cyan_glazed_terracotta", - "id": 229, - "data": 6 - }, - { - "name": "minecraft:cyan_glazed_terracotta", - "id": 229, - "data": 7 - }, - { - "name": "minecraft:blue_glazed_terracotta", - "id": 231, - "data": 0 - }, - { - "name": "minecraft:blue_glazed_terracotta", - "id": 231, - "data": 1 - }, - { - "name": "minecraft:blue_glazed_terracotta", - "id": 231, - "data": 2 - }, - { - "name": "minecraft:blue_glazed_terracotta", - "id": 231, - "data": 3 - }, - { - "name": "minecraft:blue_glazed_terracotta", - "id": 231, - "data": 4 - }, - { - "name": "minecraft:blue_glazed_terracotta", - "id": 231, - "data": 5 - }, - { - "name": "minecraft:blue_glazed_terracotta", - "id": 231, - "data": 6 - }, - { - "name": "minecraft:blue_glazed_terracotta", - "id": 231, - "data": 7 - }, - { - "name": "minecraft:brown_glazed_terracotta", - "id": 232, - "data": 0 - }, - { - "name": "minecraft:brown_glazed_terracotta", - "id": 232, - "data": 1 - }, - { - "name": "minecraft:brown_glazed_terracotta", - "id": 232, - "data": 2 - }, - { - "name": "minecraft:brown_glazed_terracotta", - "id": 232, - "data": 3 - }, - { - "name": "minecraft:brown_glazed_terracotta", - "id": 232, - "data": 4 - }, - { - "name": "minecraft:brown_glazed_terracotta", - "id": 232, - "data": 5 - }, - { - "name": "minecraft:brown_glazed_terracotta", - "id": 232, - "data": 6 - }, - { - "name": "minecraft:brown_glazed_terracotta", - "id": 232, - "data": 7 - }, - { - "name": "minecraft:green_glazed_terracotta", - "id": 233, - "data": 0 - }, - { - "name": "minecraft:green_glazed_terracotta", - "id": 233, - "data": 1 - }, - { - "name": "minecraft:green_glazed_terracotta", - "id": 233, - "data": 2 - }, - { - "name": "minecraft:green_glazed_terracotta", - "id": 233, - "data": 3 - }, - { - "name": "minecraft:green_glazed_terracotta", - "id": 233, - "data": 4 - }, - { - "name": "minecraft:green_glazed_terracotta", - "id": 233, - "data": 5 - }, - { - "name": "minecraft:green_glazed_terracotta", - "id": 233, - "data": 6 - }, - { - "name": "minecraft:green_glazed_terracotta", - "id": 233, - "data": 7 - }, - { - "name": "minecraft:red_glazed_terracotta", - "id": 234, - "data": 0 - }, - { - "name": "minecraft:red_glazed_terracotta", - "id": 234, - "data": 1 - }, - { - "name": "minecraft:red_glazed_terracotta", - "id": 234, - "data": 2 - }, - { - "name": "minecraft:red_glazed_terracotta", - "id": 234, - "data": 3 - }, - { - "name": "minecraft:red_glazed_terracotta", - "id": 234, - "data": 4 - }, - { - "name": "minecraft:red_glazed_terracotta", - "id": 234, - "data": 5 - }, - { - "name": "minecraft:red_glazed_terracotta", - "id": 234, - "data": 6 - }, - { - "name": "minecraft:red_glazed_terracotta", - "id": 234, - "data": 7 - }, - { - "name": "minecraft:black_glazed_terracotta", - "id": 235, - "data": 0 - }, - { - "name": "minecraft:black_glazed_terracotta", - "id": 235, - "data": 1 - }, - { - "name": "minecraft:black_glazed_terracotta", - "id": 235, - "data": 2 - }, - { - "name": "minecraft:black_glazed_terracotta", - "id": 235, - "data": 3 - }, - { - "name": "minecraft:black_glazed_terracotta", - "id": 235, - "data": 4 - }, - { - "name": "minecraft:black_glazed_terracotta", - "id": 235, - "data": 5 - }, - { - "name": "minecraft:black_glazed_terracotta", - "id": 235, - "data": 6 - }, - { - "name": "minecraft:black_glazed_terracotta", - "id": 235, - "data": 7 - }, - { - "name": "minecraft:concrete", - "id": 236, - "data": 0 - }, - { - "name": "minecraft:concrete", - "id": 236, - "data": 1 - }, - { - "name": "minecraft:concrete", - "id": 236, - "data": 2 - }, - { - "name": "minecraft:concrete", - "id": 236, - "data": 3 - }, - { - "name": "minecraft:concrete", - "id": 236, - "data": 4 - }, - { - "name": "minecraft:concrete", - "id": 236, - "data": 5 - }, - { - "name": "minecraft:concrete", - "id": 236, - "data": 6 - }, - { - "name": "minecraft:concrete", - "id": 236, - "data": 7 - }, - { - "name": "minecraft:concrete", - "id": 236, - "data": 8 - }, - { - "name": "minecraft:concrete", - "id": 236, - "data": 9 - }, - { - "name": "minecraft:concrete", - "id": 236, - "data": 10 - }, - { - "name": "minecraft:concrete", - "id": 236, - "data": 11 - }, - { - "name": "minecraft:concrete", - "id": 236, - "data": 12 - }, - { - "name": "minecraft:concrete", - "id": 236, - "data": 13 - }, - { - "name": "minecraft:concrete", - "id": 236, - "data": 14 - }, - { - "name": "minecraft:concrete", - "id": 236, - "data": 15 - }, - { - "name": "minecraft:concretePowder", - "id": 237, - "data": 0 - }, - { - "name": "minecraft:concretePowder", - "id": 237, - "data": 1 - }, - { - "name": "minecraft:concretePowder", - "id": 237, - "data": 2 - }, - { - "name": "minecraft:concretePowder", - "id": 237, - "data": 3 - }, - { - "name": "minecraft:concretePowder", - "id": 237, - "data": 4 - }, - { - "name": "minecraft:concretePowder", - "id": 237, - "data": 5 - }, - { - "name": "minecraft:concretePowder", - "id": 237, - "data": 6 - }, - { - "name": "minecraft:concretePowder", - "id": 237, - "data": 7 - }, - { - "name": "minecraft:concretePowder", - "id": 237, - "data": 8 - }, - { - "name": "minecraft:concretePowder", - "id": 237, - "data": 9 - }, - { - "name": "minecraft:concretePowder", - "id": 237, - "data": 10 - }, - { - "name": "minecraft:concretePowder", - "id": 237, - "data": 11 - }, - { - "name": "minecraft:concretePowder", - "id": 237, - "data": 12 - }, - { - "name": "minecraft:concretePowder", - "id": 237, - "data": 13 - }, - { - "name": "minecraft:concretePowder", - "id": 237, - "data": 14 - }, - { - "name": "minecraft:concretePowder", - "id": 237, - "data": 15 - }, - { - "name": "minecraft:chemistry_table", - "id": 238, - "data": 0 - }, - { - "name": "minecraft:chemistry_table", - "id": 238, - "data": 1 - }, - { - "name": "minecraft:chemistry_table", - "id": 238, - "data": 2 - }, - { - "name": "minecraft:chemistry_table", - "id": 238, - "data": 3 - }, - { - "name": "minecraft:chemistry_table", - "id": 238, - "data": 4 - }, - { - "name": "minecraft:chemistry_table", - "id": 238, - "data": 5 - }, - { - "name": "minecraft:chemistry_table", - "id": 238, - "data": 6 - }, - { - "name": "minecraft:chemistry_table", - "id": 238, - "data": 7 - }, - { - "name": "minecraft:chemistry_table", - "id": 238, - "data": 8 - }, - { - "name": "minecraft:chemistry_table", - "id": 238, - "data": 9 - }, - { - "name": "minecraft:chemistry_table", - "id": 238, - "data": 10 - }, - { - "name": "minecraft:chemistry_table", - "id": 238, - "data": 11 - }, - { - "name": "minecraft:chemistry_table", - "id": 238, - "data": 12 - }, - { - "name": "minecraft:chemistry_table", - "id": 238, - "data": 13 - }, - { - "name": "minecraft:chemistry_table", - "id": 238, - "data": 14 - }, - { - "name": "minecraft:chemistry_table", - "id": 238, - "data": 15 - }, - { - "name": "minecraft:underwater_torch", - "id": 239, - "data": 0 - }, - { - "name": "minecraft:underwater_torch", - "id": 239, - "data": 1 - }, - { - "name": "minecraft:underwater_torch", - "id": 239, - "data": 2 - }, - { - "name": "minecraft:underwater_torch", - "id": 239, - "data": 3 - }, - { - "name": "minecraft:underwater_torch", - "id": 239, - "data": 4 - }, - { - "name": "minecraft:underwater_torch", - "id": 239, - "data": 5 - }, - { - "name": "minecraft:underwater_torch", - "id": 239, - "data": 6 - }, - { - "name": "minecraft:underwater_torch", - "id": 239, - "data": 7 - }, - { - "name": "minecraft:chorus_plant", - "id": 240, - "data": 0 - }, - { - "name": "minecraft:stained_glass", - "id": 241, - "data": 0 - }, - { - "name": "minecraft:stained_glass", - "id": 241, - "data": 1 - }, - { - "name": "minecraft:stained_glass", - "id": 241, - "data": 2 - }, - { - "name": "minecraft:stained_glass", - "id": 241, - "data": 3 - }, - { - "name": "minecraft:stained_glass", - "id": 241, - "data": 4 - }, - { - "name": "minecraft:stained_glass", - "id": 241, - "data": 5 - }, - { - "name": "minecraft:stained_glass", - "id": 241, - "data": 6 - }, - { - "name": "minecraft:stained_glass", - "id": 241, - "data": 7 - }, - { - "name": "minecraft:stained_glass", - "id": 241, - "data": 8 - }, - { - "name": "minecraft:stained_glass", - "id": 241, - "data": 9 - }, - { - "name": "minecraft:stained_glass", - "id": 241, - "data": 10 - }, - { - "name": "minecraft:stained_glass", - "id": 241, - "data": 11 - }, - { - "name": "minecraft:stained_glass", - "id": 241, - "data": 12 - }, - { - "name": "minecraft:stained_glass", - "id": 241, - "data": 13 - }, - { - "name": "minecraft:stained_glass", - "id": 241, - "data": 14 - }, - { - "name": "minecraft:stained_glass", - "id": 241, - "data": 15 - }, - { - "name": "minecraft:podzol", - "id": 243, - "data": 0 - }, - { - "name": "minecraft:beetroot", - "id": 244, - "data": 0 - }, - { - "name": "minecraft:beetroot", - "id": 244, - "data": 1 - }, - { - "name": "minecraft:beetroot", - "id": 244, - "data": 2 - }, - { - "name": "minecraft:beetroot", - "id": 244, - "data": 3 - }, - { - "name": "minecraft:beetroot", - "id": 244, - "data": 4 - }, - { - "name": "minecraft:beetroot", - "id": 244, - "data": 5 - }, - { - "name": "minecraft:beetroot", - "id": 244, - "data": 6 - }, - { - "name": "minecraft:beetroot", - "id": 244, - "data": 7 - }, - { - "name": "minecraft:stonecutter", - "id": 245, - "data": 0 - }, - { - "name": "minecraft:glowingobsidian", - "id": 246, - "data": 0 - }, - { - "name": "minecraft:netherreactor", - "id": 247, - "data": 0 - }, - { - "name": "minecraft:info_update", - "id": 248, - "data": 0 - }, - { - "name": "minecraft:info_update2", - "id": 249, - "data": 0 - }, - { - "name": "minecraft:movingBlock", - "id": 250, - "data": 0 - }, - { - "name": "minecraft:observer", - "id": 251, - "data": 0 - }, - { - "name": "minecraft:observer", - "id": 251, - "data": 1 - }, - { - "name": "minecraft:observer", - "id": 251, - "data": 2 - }, - { - "name": "minecraft:observer", - "id": 251, - "data": 3 - }, - { - "name": "minecraft:observer", - "id": 251, - "data": 4 - }, - { - "name": "minecraft:observer", - "id": 251, - "data": 5 - }, - { - "name": "minecraft:observer", - "id": 251, - "data": 6 - }, - { - "name": "minecraft:observer", - "id": 251, - "data": 7 - }, - { - "name": "minecraft:observer", - "id": 251, - "data": 8 - }, - { - "name": "minecraft:observer", - "id": 251, - "data": 9 - }, - { - "name": "minecraft:observer", - "id": 251, - "data": 10 - }, - { - "name": "minecraft:observer", - "id": 251, - "data": 11 - }, - { - "name": "minecraft:observer", - "id": 251, - "data": 12 - }, - { - "name": "minecraft:observer", - "id": 251, - "data": 13 - }, - { - "name": "minecraft:observer", - "id": 251, - "data": 14 - }, - { - "name": "minecraft:observer", - "id": 251, - "data": 15 - }, - { - "name": "minecraft:structure_block", - "id": 252, - "data": 0 - }, - { - "name": "minecraft:structure_block", - "id": 252, - "data": 1 - }, - { - "name": "minecraft:structure_block", - "id": 252, - "data": 2 - }, - { - "name": "minecraft:structure_block", - "id": 252, - "data": 3 - }, - { - "name": "minecraft:structure_block", - "id": 252, - "data": 4 - }, - { - "name": "minecraft:structure_block", - "id": 252, - "data": 5 - }, - { - "name": "minecraft:structure_block", - "id": 252, - "data": 6 - }, - { - "name": "minecraft:structure_block", - "id": 252, - "data": 7 - }, - { - "name": "minecraft:hard_glass", - "id": 253, - "data": 0 - }, - { - "name": "minecraft:hard_stained_glass", - "id": 254, - "data": 0 - }, - { - "name": "minecraft:hard_stained_glass", - "id": 254, - "data": 1 - }, - { - "name": "minecraft:hard_stained_glass", - "id": 254, - "data": 2 - }, - { - "name": "minecraft:hard_stained_glass", - "id": 254, - "data": 3 - }, - { - "name": "minecraft:hard_stained_glass", - "id": 254, - "data": 4 - }, - { - "name": "minecraft:hard_stained_glass", - "id": 254, - "data": 5 - }, - { - "name": "minecraft:hard_stained_glass", - "id": 254, - "data": 6 - }, - { - "name": "minecraft:hard_stained_glass", - "id": 254, - "data": 7 - }, - { - "name": "minecraft:hard_stained_glass", - "id": 254, - "data": 8 - }, - { - "name": "minecraft:hard_stained_glass", - "id": 254, - "data": 9 - }, - { - "name": "minecraft:hard_stained_glass", - "id": 254, - "data": 10 - }, - { - "name": "minecraft:hard_stained_glass", - "id": 254, - "data": 11 - }, - { - "name": "minecraft:hard_stained_glass", - "id": 254, - "data": 12 - }, - { - "name": "minecraft:hard_stained_glass", - "id": 254, - "data": 13 - }, - { - "name": "minecraft:hard_stained_glass", - "id": 254, - "data": 14 - }, - { - "name": "minecraft:hard_stained_glass", - "id": 254, - "data": 15 - }, - { - "name": "minecraft:reserved6", - "id": 255, - "data": 0 - }, - { - "name": "minecraft:prismarine_stairs", - "id": 257, - "data": 0 - }, - { - "name": "minecraft:prismarine_stairs", - "id": 257, - "data": 1 - }, - { - "name": "minecraft:prismarine_stairs", - "id": 257, - "data": 2 - }, - { - "name": "minecraft:prismarine_stairs", - "id": 257, - "data": 3 - }, - { - "name": "minecraft:prismarine_stairs", - "id": 257, - "data": 4 - }, - { - "name": "minecraft:prismarine_stairs", - "id": 257, - "data": 5 - }, - { - "name": "minecraft:prismarine_stairs", - "id": 257, - "data": 6 - }, - { - "name": "minecraft:prismarine_stairs", - "id": 257, - "data": 7 - }, - { - "name": "minecraft:dark_prismarine_stairs", - "id": 258, - "data": 0 - }, - { - "name": "minecraft:dark_prismarine_stairs", - "id": 258, - "data": 1 - }, - { - "name": "minecraft:dark_prismarine_stairs", - "id": 258, - "data": 2 - }, - { - "name": "minecraft:dark_prismarine_stairs", - "id": 258, - "data": 3 - }, - { - "name": "minecraft:dark_prismarine_stairs", - "id": 258, - "data": 4 - }, - { - "name": "minecraft:dark_prismarine_stairs", - "id": 258, - "data": 5 - }, - { - "name": "minecraft:dark_prismarine_stairs", - "id": 258, - "data": 6 - }, - { - "name": "minecraft:dark_prismarine_stairs", - "id": 258, - "data": 7 - }, - { - "name": "minecraft:prismarine_bricks_stairs", - "id": 259, - "data": 0 - }, - { - "name": "minecraft:prismarine_bricks_stairs", - "id": 259, - "data": 1 - }, - { - "name": "minecraft:prismarine_bricks_stairs", - "id": 259, - "data": 2 - }, - { - "name": "minecraft:prismarine_bricks_stairs", - "id": 259, - "data": 3 - }, - { - "name": "minecraft:prismarine_bricks_stairs", - "id": 259, - "data": 4 - }, - { - "name": "minecraft:prismarine_bricks_stairs", - "id": 259, - "data": 5 - }, - { - "name": "minecraft:prismarine_bricks_stairs", - "id": 259, - "data": 6 - }, - { - "name": "minecraft:prismarine_bricks_stairs", - "id": 259, - "data": 7 - }, - { - "name": "minecraft:stripped_spruce_log", - "id": 260, - "data": 0 - }, - { - "name": "minecraft:stripped_spruce_log", - "id": 260, - "data": 1 - }, - { - "name": "minecraft:stripped_spruce_log", - "id": 260, - "data": 2 - }, - { - "name": "minecraft:stripped_spruce_log", - "id": 260, - "data": 3 - }, - { - "name": "minecraft:stripped_birch_log", - "id": 261, - "data": 0 - }, - { - "name": "minecraft:stripped_birch_log", - "id": 261, - "data": 1 - }, - { - "name": "minecraft:stripped_birch_log", - "id": 261, - "data": 2 - }, - { - "name": "minecraft:stripped_birch_log", - "id": 261, - "data": 3 - }, - { - "name": "minecraft:stripped_jungle_log", - "id": 262, - "data": 0 - }, - { - "name": "minecraft:stripped_jungle_log", - "id": 262, - "data": 1 - }, - { - "name": "minecraft:stripped_jungle_log", - "id": 262, - "data": 2 - }, - { - "name": "minecraft:stripped_jungle_log", - "id": 262, - "data": 3 - }, - { - "name": "minecraft:stripped_acacia_log", - "id": 263, - "data": 0 - }, - { - "name": "minecraft:stripped_acacia_log", - "id": 263, - "data": 1 - }, - { - "name": "minecraft:stripped_acacia_log", - "id": 263, - "data": 2 - }, - { - "name": "minecraft:stripped_acacia_log", - "id": 263, - "data": 3 - }, - { - "name": "minecraft:stripped_dark_oak_log", - "id": 264, - "data": 0 - }, - { - "name": "minecraft:stripped_dark_oak_log", - "id": 264, - "data": 1 - }, - { - "name": "minecraft:stripped_dark_oak_log", - "id": 264, - "data": 2 - }, - { - "name": "minecraft:stripped_dark_oak_log", - "id": 264, - "data": 3 - }, - { - "name": "minecraft:stripped_oak_log", - "id": 265, - "data": 0 - }, - { - "name": "minecraft:stripped_oak_log", - "id": 265, - "data": 1 - }, - { - "name": "minecraft:stripped_oak_log", - "id": 265, - "data": 2 - }, - { - "name": "minecraft:stripped_oak_log", - "id": 265, - "data": 3 - }, - { - "name": "minecraft:blue_ice", - "id": 266, - "data": 0 - }, - { - "name": "minecraft:element_1", - "id": 267, - "data": 0 - }, - { - "name": "minecraft:element_2", - "id": 268, - "data": 0 - }, - { - "name": "minecraft:element_3", - "id": 269, - "data": 0 - }, - { - "name": "minecraft:element_4", - "id": 270, - "data": 0 - }, - { - "name": "minecraft:element_5", - "id": 271, - "data": 0 - }, - { - "name": "minecraft:element_6", - "id": 272, - "data": 0 - }, - { - "name": "minecraft:element_7", - "id": 273, - "data": 0 - }, - { - "name": "minecraft:element_8", - "id": 274, - "data": 0 - }, - { - "name": "minecraft:element_9", - "id": 275, - "data": 0 - }, - { - "name": "minecraft:element_10", - "id": 276, - "data": 0 - }, - { - "name": "minecraft:element_11", - "id": 277, - "data": 0 - }, - { - "name": "minecraft:element_12", - "id": 278, - "data": 0 - }, - { - "name": "minecraft:element_13", - "id": 279, - "data": 0 - }, - { - "name": "minecraft:element_14", - "id": 280, - "data": 0 - }, - { - "name": "minecraft:element_15", - "id": 281, - "data": 0 - }, - { - "name": "minecraft:element_16", - "id": 282, - "data": 0 - }, - { - "name": "minecraft:element_17", - "id": 283, - "data": 0 - }, - { - "name": "minecraft:element_18", - "id": 284, - "data": 0 - }, - { - "name": "minecraft:element_19", - "id": 285, - "data": 0 - }, - { - "name": "minecraft:element_20", - "id": 286, - "data": 0 - }, - { - "name": "minecraft:element_21", - "id": 287, - "data": 0 - }, - { - "name": "minecraft:element_22", - "id": 288, - "data": 0 - }, - { - "name": "minecraft:element_23", - "id": 289, - "data": 0 - }, - { - "name": "minecraft:element_24", - "id": 290, - "data": 0 - }, - { - "name": "minecraft:element_25", - "id": 291, - "data": 0 - }, - { - "name": "minecraft:element_26", - "id": 292, - "data": 0 - }, - { - "name": "minecraft:element_27", - "id": 293, - "data": 0 - }, - { - "name": "minecraft:element_28", - "id": 294, - "data": 0 - }, - { - "name": "minecraft:element_29", - "id": 295, - "data": 0 - }, - { - "name": "minecraft:element_30", - "id": 296, - "data": 0 - }, - { - "name": "minecraft:element_31", - "id": 297, - "data": 0 - }, - { - "name": "minecraft:element_32", - "id": 298, - "data": 0 - }, - { - "name": "minecraft:element_33", - "id": 299, - "data": 0 - }, - { - "name": "minecraft:element_34", - "id": 300, - "data": 0 - }, - { - "name": "minecraft:element_35", - "id": 301, - "data": 0 - }, - { - "name": "minecraft:element_36", - "id": 302, - "data": 0 - }, - { - "name": "minecraft:element_37", - "id": 303, - "data": 0 - }, - { - "name": "minecraft:element_38", - "id": 304, - "data": 0 - }, - { - "name": "minecraft:element_39", - "id": 305, - "data": 0 - }, - { - "name": "minecraft:element_40", - "id": 306, - "data": 0 - }, - { - "name": "minecraft:element_41", - "id": 307, - "data": 0 - }, - { - "name": "minecraft:element_42", - "id": 308, - "data": 0 - }, - { - "name": "minecraft:element_43", - "id": 309, - "data": 0 - }, - { - "name": "minecraft:element_44", - "id": 310, - "data": 0 - }, - { - "name": "minecraft:element_45", - "id": 311, - "data": 0 - }, - { - "name": "minecraft:element_46", - "id": 312, - "data": 0 - }, - { - "name": "minecraft:element_47", - "id": 313, - "data": 0 - }, - { - "name": "minecraft:element_48", - "id": 314, - "data": 0 - }, - { - "name": "minecraft:element_49", - "id": 315, - "data": 0 - }, - { - "name": "minecraft:element_50", - "id": 316, - "data": 0 - }, - { - "name": "minecraft:element_51", - "id": 317, - "data": 0 - }, - { - "name": "minecraft:element_52", - "id": 318, - "data": 0 - }, - { - "name": "minecraft:element_53", - "id": 319, - "data": 0 - }, - { - "name": "minecraft:element_54", - "id": 320, - "data": 0 - }, - { - "name": "minecraft:element_55", - "id": 321, - "data": 0 - }, - { - "name": "minecraft:element_56", - "id": 322, - "data": 0 - }, - { - "name": "minecraft:element_57", - "id": 323, - "data": 0 - }, - { - "name": "minecraft:element_58", - "id": 324, - "data": 0 - }, - { - "name": "minecraft:element_59", - "id": 325, - "data": 0 - }, - { - "name": "minecraft:element_60", - "id": 326, - "data": 0 - }, - { - "name": "minecraft:element_61", - "id": 327, - "data": 0 - }, - { - "name": "minecraft:element_62", - "id": 328, - "data": 0 - }, - { - "name": "minecraft:element_63", - "id": 329, - "data": 0 - }, - { - "name": "minecraft:element_64", - "id": 330, - "data": 0 - }, - { - "name": "minecraft:element_65", - "id": 331, - "data": 0 - }, - { - "name": "minecraft:element_66", - "id": 332, - "data": 0 - }, - { - "name": "minecraft:element_67", - "id": 333, - "data": 0 - }, - { - "name": "minecraft:element_68", - "id": 334, - "data": 0 - }, - { - "name": "minecraft:element_69", - "id": 335, - "data": 0 - }, - { - "name": "minecraft:element_70", - "id": 336, - "data": 0 - }, - { - "name": "minecraft:element_71", - "id": 337, - "data": 0 - }, - { - "name": "minecraft:element_72", - "id": 338, - "data": 0 - }, - { - "name": "minecraft:element_73", - "id": 339, - "data": 0 - }, - { - "name": "minecraft:element_74", - "id": 340, - "data": 0 - }, - { - "name": "minecraft:element_75", - "id": 341, - "data": 0 - }, - { - "name": "minecraft:element_76", - "id": 342, - "data": 0 - }, - { - "name": "minecraft:element_77", - "id": 343, - "data": 0 - }, - { - "name": "minecraft:element_78", - "id": 344, - "data": 0 - }, - { - "name": "minecraft:element_79", - "id": 345, - "data": 0 - }, - { - "name": "minecraft:element_80", - "id": 346, - "data": 0 - }, - { - "name": "minecraft:element_81", - "id": 347, - "data": 0 - }, - { - "name": "minecraft:element_82", - "id": 348, - "data": 0 - }, - { - "name": "minecraft:element_83", - "id": 349, - "data": 0 - }, - { - "name": "minecraft:element_84", - "id": 350, - "data": 0 - }, - { - "name": "minecraft:element_85", - "id": 351, - "data": 0 - }, - { - "name": "minecraft:element_86", - "id": 352, - "data": 0 - }, - { - "name": "minecraft:element_87", - "id": 353, - "data": 0 - }, - { - "name": "minecraft:element_88", - "id": 354, - "data": 0 - }, - { - "name": "minecraft:element_89", - "id": 355, - "data": 0 - }, - { - "name": "minecraft:element_90", - "id": 356, - "data": 0 - }, - { - "name": "minecraft:element_91", - "id": 357, - "data": 0 - }, - { - "name": "minecraft:element_92", - "id": 358, - "data": 0 - }, - { - "name": "minecraft:element_93", - "id": 359, - "data": 0 - }, - { - "name": "minecraft:element_94", - "id": 360, - "data": 0 - }, - { - "name": "minecraft:element_95", - "id": 361, - "data": 0 - }, - { - "name": "minecraft:element_96", - "id": 362, - "data": 0 - }, - { - "name": "minecraft:element_97", - "id": 363, - "data": 0 - }, - { - "name": "minecraft:element_98", - "id": 364, - "data": 0 - }, - { - "name": "minecraft:element_99", - "id": 365, - "data": 0 - }, - { - "name": "minecraft:element_100", - "id": 366, - "data": 0 - }, - { - "name": "minecraft:element_101", - "id": 367, - "data": 0 - }, - { - "name": "minecraft:element_102", - "id": 368, - "data": 0 - }, - { - "name": "minecraft:element_103", - "id": 369, - "data": 0 - }, - { - "name": "minecraft:element_104", - "id": 370, - "data": 0 - }, - { - "name": "minecraft:element_105", - "id": 371, - "data": 0 - }, - { - "name": "minecraft:element_106", - "id": 372, - "data": 0 - }, - { - "name": "minecraft:element_107", - "id": 373, - "data": 0 - }, - { - "name": "minecraft:element_108", - "id": 374, - "data": 0 - }, - { - "name": "minecraft:element_109", - "id": 375, - "data": 0 - }, - { - "name": "minecraft:element_110", - "id": 376, - "data": 0 - }, - { - "name": "minecraft:element_111", - "id": 377, - "data": 0 - }, - { - "name": "minecraft:element_112", - "id": 378, - "data": 0 - }, - { - "name": "minecraft:element_113", - "id": 379, - "data": 0 - }, - { - "name": "minecraft:element_114", - "id": 380, - "data": 0 - }, - { - "name": "minecraft:element_115", - "id": 381, - "data": 0 - }, - { - "name": "minecraft:element_116", - "id": 382, - "data": 0 - }, - { - "name": "minecraft:element_117", - "id": 383, - "data": 0 - }, - { - "name": "minecraft:element_118", - "id": 384, - "data": 0 - }, - { - "name": "minecraft:seagrass", - "id": 385, - "data": 0 - }, - { - "name": "minecraft:seagrass", - "id": 385, - "data": 1 - }, - { - "name": "minecraft:seagrass", - "id": 385, - "data": 2 - }, - { - "name": "minecraft:seagrass", - "id": 385, - "data": 3 - }, - { - "name": "minecraft:coral", - "id": 386, - "data": 0 - }, - { - "name": "minecraft:coral", - "id": 386, - "data": 1 - }, - { - "name": "minecraft:coral", - "id": 386, - "data": 2 - }, - { - "name": "minecraft:coral", - "id": 386, - "data": 3 - }, - { - "name": "minecraft:coral", - "id": 386, - "data": 4 - }, - { - "name": "minecraft:coral", - "id": 386, - "data": 5 - }, - { - "name": "minecraft:coral", - "id": 386, - "data": 6 - }, - { - "name": "minecraft:coral", - "id": 386, - "data": 7 - }, - { - "name": "minecraft:coral_block", - "id": 387, - "data": 0 - }, - { - "name": "minecraft:coral_block", - "id": 387, - "data": 1 - }, - { - "name": "minecraft:coral_block", - "id": 387, - "data": 2 - }, - { - "name": "minecraft:coral_block", - "id": 387, - "data": 3 - }, - { - "name": "minecraft:coral_block", - "id": 387, - "data": 4 - }, - { - "name": "minecraft:coral_block", - "id": 387, - "data": 5 - }, - { - "name": "minecraft:coral_block", - "id": 387, - "data": 6 - }, - { - "name": "minecraft:coral_block", - "id": 387, - "data": 7 - }, - { - "name": "minecraft:coral_block", - "id": 387, - "data": 8 - }, - { - "name": "minecraft:coral_block", - "id": 387, - "data": 9 - }, - { - "name": "minecraft:coral_block", - "id": 387, - "data": 10 - }, - { - "name": "minecraft:coral_block", - "id": 387, - "data": 11 - }, - { - "name": "minecraft:coral_block", - "id": 387, - "data": 12 - }, - { - "name": "minecraft:coral_block", - "id": 387, - "data": 13 - }, - { - "name": "minecraft:coral_block", - "id": 387, - "data": 14 - }, - { - "name": "minecraft:coral_block", - "id": 387, - "data": 15 - }, - { - "name": "minecraft:coral_fan", - "id": 388, - "data": 0 - }, - { - "name": "minecraft:coral_fan", - "id": 388, - "data": 1 - }, - { - "name": "minecraft:coral_fan", - "id": 388, - "data": 2 - }, - { - "name": "minecraft:coral_fan", - "id": 388, - "data": 3 - }, - { - "name": "minecraft:coral_fan", - "id": 388, - "data": 4 - }, - { - "name": "minecraft:coral_fan", - "id": 388, - "data": 5 - }, - { - "name": "minecraft:coral_fan", - "id": 388, - "data": 6 - }, - { - "name": "minecraft:coral_fan", - "id": 388, - "data": 7 - }, - { - "name": "minecraft:coral_fan", - "id": 388, - "data": 8 - }, - { - "name": "minecraft:coral_fan", - "id": 388, - "data": 9 - }, - { - "name": "minecraft:coral_fan", - "id": 388, - "data": 10 - }, - { - "name": "minecraft:coral_fan", - "id": 388, - "data": 11 - }, - { - "name": "minecraft:coral_fan", - "id": 388, - "data": 12 - }, - { - "name": "minecraft:coral_fan", - "id": 388, - "data": 13 - }, - { - "name": "minecraft:coral_fan", - "id": 388, - "data": 14 - }, - { - "name": "minecraft:coral_fan", - "id": 388, - "data": 15 - }, - { - "name": "minecraft:coral_fan_dead", - "id": 389, - "data": 0 - }, - { - "name": "minecraft:coral_fan_dead", - "id": 389, - "data": 1 - }, - { - "name": "minecraft:coral_fan_dead", - "id": 389, - "data": 2 - }, - { - "name": "minecraft:coral_fan_dead", - "id": 389, - "data": 3 - }, - { - "name": "minecraft:coral_fan_dead", - "id": 389, - "data": 4 - }, - { - "name": "minecraft:coral_fan_dead", - "id": 389, - "data": 5 - }, - { - "name": "minecraft:coral_fan_dead", - "id": 389, - "data": 6 - }, - { - "name": "minecraft:coral_fan_dead", - "id": 389, - "data": 7 - }, - { - "name": "minecraft:coral_fan_dead", - "id": 389, - "data": 8 - }, - { - "name": "minecraft:coral_fan_dead", - "id": 389, - "data": 9 - }, - { - "name": "minecraft:coral_fan_dead", - "id": 389, - "data": 10 - }, - { - "name": "minecraft:coral_fan_dead", - "id": 389, - "data": 11 - }, - { - "name": "minecraft:coral_fan_dead", - "id": 389, - "data": 12 - }, - { - "name": "minecraft:coral_fan_dead", - "id": 389, - "data": 13 - }, - { - "name": "minecraft:coral_fan_dead", - "id": 389, - "data": 14 - }, - { - "name": "minecraft:coral_fan_dead", - "id": 389, - "data": 15 - }, - { - "name": "minecraft:coral_fan_hang", - "id": 390, - "data": 0 - }, - { - "name": "minecraft:coral_fan_hang", - "id": 390, - "data": 1 - }, - { - "name": "minecraft:coral_fan_hang", - "id": 390, - "data": 2 - }, - { - "name": "minecraft:coral_fan_hang", - "id": 390, - "data": 3 - }, - { - "name": "minecraft:coral_fan_hang", - "id": 390, - "data": 4 - }, - { - "name": "minecraft:coral_fan_hang", - "id": 390, - "data": 5 - }, - { - "name": "minecraft:coral_fan_hang", - "id": 390, - "data": 6 - }, - { - "name": "minecraft:coral_fan_hang", - "id": 390, - "data": 7 - }, - { - "name": "minecraft:coral_fan_hang", - "id": 390, - "data": 8 - }, - { - "name": "minecraft:coral_fan_hang", - "id": 390, - "data": 9 - }, - { - "name": "minecraft:coral_fan_hang", - "id": 390, - "data": 10 - }, - { - "name": "minecraft:coral_fan_hang", - "id": 390, - "data": 11 - }, - { - "name": "minecraft:coral_fan_hang", - "id": 390, - "data": 12 - }, - { - "name": "minecraft:coral_fan_hang", - "id": 390, - "data": 13 - }, - { - "name": "minecraft:coral_fan_hang", - "id": 390, - "data": 14 - }, - { - "name": "minecraft:coral_fan_hang", - "id": 390, - "data": 15 - }, - { - "name": "minecraft:coral_fan_hang2", - "id": 391, - "data": 0 - }, - { - "name": "minecraft:coral_fan_hang2", - "id": 391, - "data": 1 - }, - { - "name": "minecraft:coral_fan_hang2", - "id": 391, - "data": 2 - }, - { - "name": "minecraft:coral_fan_hang2", - "id": 391, - "data": 3 - }, - { - "name": "minecraft:coral_fan_hang2", - "id": 391, - "data": 4 - }, - { - "name": "minecraft:coral_fan_hang2", - "id": 391, - "data": 5 - }, - { - "name": "minecraft:coral_fan_hang2", - "id": 391, - "data": 6 - }, - { - "name": "minecraft:coral_fan_hang2", - "id": 391, - "data": 7 - }, - { - "name": "minecraft:coral_fan_hang2", - "id": 391, - "data": 8 - }, - { - "name": "minecraft:coral_fan_hang2", - "id": 391, - "data": 9 - }, - { - "name": "minecraft:coral_fan_hang2", - "id": 391, - "data": 10 - }, - { - "name": "minecraft:coral_fan_hang2", - "id": 391, - "data": 11 - }, - { - "name": "minecraft:coral_fan_hang2", - "id": 391, - "data": 12 - }, - { - "name": "minecraft:coral_fan_hang2", - "id": 391, - "data": 13 - }, - { - "name": "minecraft:coral_fan_hang2", - "id": 391, - "data": 14 - }, - { - "name": "minecraft:coral_fan_hang2", - "id": 391, - "data": 15 - }, - { - "name": "minecraft:coral_fan_hang3", - "id": 392, - "data": 0 - }, - { - "name": "minecraft:coral_fan_hang3", - "id": 392, - "data": 1 - }, - { - "name": "minecraft:coral_fan_hang3", - "id": 392, - "data": 2 - }, - { - "name": "minecraft:coral_fan_hang3", - "id": 392, - "data": 3 - }, - { - "name": "minecraft:coral_fan_hang3", - "id": 392, - "data": 4 - }, - { - "name": "minecraft:coral_fan_hang3", - "id": 392, - "data": 5 - }, - { - "name": "minecraft:coral_fan_hang3", - "id": 392, - "data": 6 - }, - { - "name": "minecraft:coral_fan_hang3", - "id": 392, - "data": 7 - }, - { - "name": "minecraft:coral_fan_hang3", - "id": 392, - "data": 8 - }, - { - "name": "minecraft:coral_fan_hang3", - "id": 392, - "data": 9 - }, - { - "name": "minecraft:coral_fan_hang3", - "id": 392, - "data": 10 - }, - { - "name": "minecraft:coral_fan_hang3", - "id": 392, - "data": 11 - }, - { - "name": "minecraft:coral_fan_hang3", - "id": 392, - "data": 12 - }, - { - "name": "minecraft:coral_fan_hang3", - "id": 392, - "data": 13 - }, - { - "name": "minecraft:coral_fan_hang3", - "id": 392, - "data": 14 - }, - { - "name": "minecraft:coral_fan_hang3", - "id": 392, - "data": 15 - }, - { - "name": "minecraft:kelp", - "id": 393, - "data": 0 - }, - { - "name": "minecraft:kelp", - "id": 393, - "data": 1 - }, - { - "name": "minecraft:kelp", - "id": 393, - "data": 2 - }, - { - "name": "minecraft:kelp", - "id": 393, - "data": 3 - }, - { - "name": "minecraft:kelp", - "id": 393, - "data": 4 - }, - { - "name": "minecraft:kelp", - "id": 393, - "data": 5 - }, - { - "name": "minecraft:kelp", - "id": 393, - "data": 6 - }, - { - "name": "minecraft:kelp", - "id": 393, - "data": 7 - }, - { - "name": "minecraft:kelp", - "id": 393, - "data": 8 - }, - { - "name": "minecraft:kelp", - "id": 393, - "data": 9 - }, - { - "name": "minecraft:kelp", - "id": 393, - "data": 10 - }, - { - "name": "minecraft:kelp", - "id": 393, - "data": 11 - }, - { - "name": "minecraft:kelp", - "id": 393, - "data": 12 - }, - { - "name": "minecraft:kelp", - "id": 393, - "data": 13 - }, - { - "name": "minecraft:kelp", - "id": 393, - "data": 14 - }, - { - "name": "minecraft:kelp", - "id": 393, - "data": 15 - }, - { - "name": "minecraft:dried_kelp_block", - "id": 394, - "data": 0 - }, - { - "name": "minecraft:acacia_button", - "id": 395, - "data": 0 - }, - { - "name": "minecraft:acacia_button", - "id": 395, - "data": 1 - }, - { - "name": "minecraft:acacia_button", - "id": 395, - "data": 2 - }, - { - "name": "minecraft:acacia_button", - "id": 395, - "data": 3 - }, - { - "name": "minecraft:acacia_button", - "id": 395, - "data": 4 - }, - { - "name": "minecraft:acacia_button", - "id": 395, - "data": 5 - }, - { - "name": "minecraft:acacia_button", - "id": 395, - "data": 6 - }, - { - "name": "minecraft:acacia_button", - "id": 395, - "data": 7 - }, - { - "name": "minecraft:acacia_button", - "id": 395, - "data": 8 - }, - { - "name": "minecraft:acacia_button", - "id": 395, - "data": 9 - }, - { - "name": "minecraft:acacia_button", - "id": 395, - "data": 10 - }, - { - "name": "minecraft:acacia_button", - "id": 395, - "data": 11 - }, - { - "name": "minecraft:acacia_button", - "id": 395, - "data": 12 - }, - { - "name": "minecraft:acacia_button", - "id": 395, - "data": 13 - }, - { - "name": "minecraft:acacia_button", - "id": 395, - "data": 14 - }, - { - "name": "minecraft:acacia_button", - "id": 395, - "data": 15 - }, - { - "name": "minecraft:birch_button", - "id": 396, - "data": 0 - }, - { - "name": "minecraft:birch_button", - "id": 396, - "data": 1 - }, - { - "name": "minecraft:birch_button", - "id": 396, - "data": 2 - }, - { - "name": "minecraft:birch_button", - "id": 396, - "data": 3 - }, - { - "name": "minecraft:birch_button", - "id": 396, - "data": 4 - }, - { - "name": "minecraft:birch_button", - "id": 396, - "data": 5 - }, - { - "name": "minecraft:birch_button", - "id": 396, - "data": 6 - }, - { - "name": "minecraft:birch_button", - "id": 396, - "data": 7 - }, - { - "name": "minecraft:birch_button", - "id": 396, - "data": 8 - }, - { - "name": "minecraft:birch_button", - "id": 396, - "data": 9 - }, - { - "name": "minecraft:birch_button", - "id": 396, - "data": 10 - }, - { - "name": "minecraft:birch_button", - "id": 396, - "data": 11 - }, - { - "name": "minecraft:birch_button", - "id": 396, - "data": 12 - }, - { - "name": "minecraft:birch_button", - "id": 396, - "data": 13 - }, - { - "name": "minecraft:birch_button", - "id": 396, - "data": 14 - }, - { - "name": "minecraft:birch_button", - "id": 396, - "data": 15 - }, - { - "name": "minecraft:dark_oak_button", - "id": 397, - "data": 0 - }, - { - "name": "minecraft:dark_oak_button", - "id": 397, - "data": 1 - }, - { - "name": "minecraft:dark_oak_button", - "id": 397, - "data": 2 - }, - { - "name": "minecraft:dark_oak_button", - "id": 397, - "data": 3 - }, - { - "name": "minecraft:dark_oak_button", - "id": 397, - "data": 4 - }, - { - "name": "minecraft:dark_oak_button", - "id": 397, - "data": 5 - }, - { - "name": "minecraft:dark_oak_button", - "id": 397, - "data": 6 - }, - { - "name": "minecraft:dark_oak_button", - "id": 397, - "data": 7 - }, - { - "name": "minecraft:dark_oak_button", - "id": 397, - "data": 8 - }, - { - "name": "minecraft:dark_oak_button", - "id": 397, - "data": 9 - }, - { - "name": "minecraft:dark_oak_button", - "id": 397, - "data": 10 - }, - { - "name": "minecraft:dark_oak_button", - "id": 397, - "data": 11 - }, - { - "name": "minecraft:dark_oak_button", - "id": 397, - "data": 12 - }, - { - "name": "minecraft:dark_oak_button", - "id": 397, - "data": 13 - }, - { - "name": "minecraft:dark_oak_button", - "id": 397, - "data": 14 - }, - { - "name": "minecraft:dark_oak_button", - "id": 397, - "data": 15 - }, - { - "name": "minecraft:jungle_button", - "id": 398, - "data": 0 - }, - { - "name": "minecraft:jungle_button", - "id": 398, - "data": 1 - }, - { - "name": "minecraft:jungle_button", - "id": 398, - "data": 2 - }, - { - "name": "minecraft:jungle_button", - "id": 398, - "data": 3 - }, - { - "name": "minecraft:jungle_button", - "id": 398, - "data": 4 - }, - { - "name": "minecraft:jungle_button", - "id": 398, - "data": 5 - }, - { - "name": "minecraft:jungle_button", - "id": 398, - "data": 6 - }, - { - "name": "minecraft:jungle_button", - "id": 398, - "data": 7 - }, - { - "name": "minecraft:jungle_button", - "id": 398, - "data": 8 - }, - { - "name": "minecraft:jungle_button", - "id": 398, - "data": 9 - }, - { - "name": "minecraft:jungle_button", - "id": 398, - "data": 10 - }, - { - "name": "minecraft:jungle_button", - "id": 398, - "data": 11 - }, - { - "name": "minecraft:jungle_button", - "id": 398, - "data": 12 - }, - { - "name": "minecraft:jungle_button", - "id": 398, - "data": 13 - }, - { - "name": "minecraft:jungle_button", - "id": 398, - "data": 14 - }, - { - "name": "minecraft:jungle_button", - "id": 398, - "data": 15 - }, - { - "name": "minecraft:spruce_button", - "id": 399, - "data": 0 - }, - { - "name": "minecraft:spruce_button", - "id": 399, - "data": 1 - }, - { - "name": "minecraft:spruce_button", - "id": 399, - "data": 2 - }, - { - "name": "minecraft:spruce_button", - "id": 399, - "data": 3 - }, - { - "name": "minecraft:spruce_button", - "id": 399, - "data": 4 - }, - { - "name": "minecraft:spruce_button", - "id": 399, - "data": 5 - }, - { - "name": "minecraft:spruce_button", - "id": 399, - "data": 6 - }, - { - "name": "minecraft:spruce_button", - "id": 399, - "data": 7 - }, - { - "name": "minecraft:spruce_button", - "id": 399, - "data": 8 - }, - { - "name": "minecraft:spruce_button", - "id": 399, - "data": 9 - }, - { - "name": "minecraft:spruce_button", - "id": 399, - "data": 10 - }, - { - "name": "minecraft:spruce_button", - "id": 399, - "data": 11 - }, - { - "name": "minecraft:spruce_button", - "id": 399, - "data": 12 - }, - { - "name": "minecraft:spruce_button", - "id": 399, - "data": 13 - }, - { - "name": "minecraft:spruce_button", - "id": 399, - "data": 14 - }, - { - "name": "minecraft:spruce_button", - "id": 399, - "data": 15 - }, - { - "name": "minecraft:acacia_trapdoor", - "id": 400, - "data": 0 - }, - { - "name": "minecraft:acacia_trapdoor", - "id": 400, - "data": 1 - }, - { - "name": "minecraft:acacia_trapdoor", - "id": 400, - "data": 2 - }, - { - "name": "minecraft:acacia_trapdoor", - "id": 400, - "data": 3 - }, - { - "name": "minecraft:acacia_trapdoor", - "id": 400, - "data": 4 - }, - { - "name": "minecraft:acacia_trapdoor", - "id": 400, - "data": 5 - }, - { - "name": "minecraft:acacia_trapdoor", - "id": 400, - "data": 6 - }, - { - "name": "minecraft:acacia_trapdoor", - "id": 400, - "data": 7 - }, - { - "name": "minecraft:acacia_trapdoor", - "id": 400, - "data": 8 - }, - { - "name": "minecraft:acacia_trapdoor", - "id": 400, - "data": 9 - }, - { - "name": "minecraft:acacia_trapdoor", - "id": 400, - "data": 10 - }, - { - "name": "minecraft:acacia_trapdoor", - "id": 400, - "data": 11 - }, - { - "name": "minecraft:acacia_trapdoor", - "id": 400, - "data": 12 - }, - { - "name": "minecraft:acacia_trapdoor", - "id": 400, - "data": 13 - }, - { - "name": "minecraft:acacia_trapdoor", - "id": 400, - "data": 14 - }, - { - "name": "minecraft:acacia_trapdoor", - "id": 400, - "data": 15 - }, - { - "name": "minecraft:birch_trapdoor", - "id": 401, - "data": 0 - }, - { - "name": "minecraft:birch_trapdoor", - "id": 401, - "data": 1 - }, - { - "name": "minecraft:birch_trapdoor", - "id": 401, - "data": 2 - }, - { - "name": "minecraft:birch_trapdoor", - "id": 401, - "data": 3 - }, - { - "name": "minecraft:birch_trapdoor", - "id": 401, - "data": 4 - }, - { - "name": "minecraft:birch_trapdoor", - "id": 401, - "data": 5 - }, - { - "name": "minecraft:birch_trapdoor", - "id": 401, - "data": 6 - }, - { - "name": "minecraft:birch_trapdoor", - "id": 401, - "data": 7 - }, - { - "name": "minecraft:birch_trapdoor", - "id": 401, - "data": 8 - }, - { - "name": "minecraft:birch_trapdoor", - "id": 401, - "data": 9 - }, - { - "name": "minecraft:birch_trapdoor", - "id": 401, - "data": 10 - }, - { - "name": "minecraft:birch_trapdoor", - "id": 401, - "data": 11 - }, - { - "name": "minecraft:birch_trapdoor", - "id": 401, - "data": 12 - }, - { - "name": "minecraft:birch_trapdoor", - "id": 401, - "data": 13 - }, - { - "name": "minecraft:birch_trapdoor", - "id": 401, - "data": 14 - }, - { - "name": "minecraft:birch_trapdoor", - "id": 401, - "data": 15 - }, - { - "name": "minecraft:dark_oak_trapdoor", - "id": 402, - "data": 0 - }, - { - "name": "minecraft:dark_oak_trapdoor", - "id": 402, - "data": 1 - }, - { - "name": "minecraft:dark_oak_trapdoor", - "id": 402, - "data": 2 - }, - { - "name": "minecraft:dark_oak_trapdoor", - "id": 402, - "data": 3 - }, - { - "name": "minecraft:dark_oak_trapdoor", - "id": 402, - "data": 4 - }, - { - "name": "minecraft:dark_oak_trapdoor", - "id": 402, - "data": 5 - }, - { - "name": "minecraft:dark_oak_trapdoor", - "id": 402, - "data": 6 - }, - { - "name": "minecraft:dark_oak_trapdoor", - "id": 402, - "data": 7 - }, - { - "name": "minecraft:dark_oak_trapdoor", - "id": 402, - "data": 8 - }, - { - "name": "minecraft:dark_oak_trapdoor", - "id": 402, - "data": 9 - }, - { - "name": "minecraft:dark_oak_trapdoor", - "id": 402, - "data": 10 - }, - { - "name": "minecraft:dark_oak_trapdoor", - "id": 402, - "data": 11 - }, - { - "name": "minecraft:dark_oak_trapdoor", - "id": 402, - "data": 12 - }, - { - "name": "minecraft:dark_oak_trapdoor", - "id": 402, - "data": 13 - }, - { - "name": "minecraft:dark_oak_trapdoor", - "id": 402, - "data": 14 - }, - { - "name": "minecraft:dark_oak_trapdoor", - "id": 402, - "data": 15 - }, - { - "name": "minecraft:jungle_trapdoor", - "id": 403, - "data": 0 - }, - { - "name": "minecraft:jungle_trapdoor", - "id": 403, - "data": 1 - }, - { - "name": "minecraft:jungle_trapdoor", - "id": 403, - "data": 2 - }, - { - "name": "minecraft:jungle_trapdoor", - "id": 403, - "data": 3 - }, - { - "name": "minecraft:jungle_trapdoor", - "id": 403, - "data": 4 - }, - { - "name": "minecraft:jungle_trapdoor", - "id": 403, - "data": 5 - }, - { - "name": "minecraft:jungle_trapdoor", - "id": 403, - "data": 6 - }, - { - "name": "minecraft:jungle_trapdoor", - "id": 403, - "data": 7 - }, - { - "name": "minecraft:jungle_trapdoor", - "id": 403, - "data": 8 - }, - { - "name": "minecraft:jungle_trapdoor", - "id": 403, - "data": 9 - }, - { - "name": "minecraft:jungle_trapdoor", - "id": 403, - "data": 10 - }, - { - "name": "minecraft:jungle_trapdoor", - "id": 403, - "data": 11 - }, - { - "name": "minecraft:jungle_trapdoor", - "id": 403, - "data": 12 - }, - { - "name": "minecraft:jungle_trapdoor", - "id": 403, - "data": 13 - }, - { - "name": "minecraft:jungle_trapdoor", - "id": 403, - "data": 14 - }, - { - "name": "minecraft:jungle_trapdoor", - "id": 403, - "data": 15 - }, - { - "name": "minecraft:spruce_trapdoor", - "id": 404, - "data": 0 - }, - { - "name": "minecraft:spruce_trapdoor", - "id": 404, - "data": 1 - }, - { - "name": "minecraft:spruce_trapdoor", - "id": 404, - "data": 2 - }, - { - "name": "minecraft:spruce_trapdoor", - "id": 404, - "data": 3 - }, - { - "name": "minecraft:spruce_trapdoor", - "id": 404, - "data": 4 - }, - { - "name": "minecraft:spruce_trapdoor", - "id": 404, - "data": 5 - }, - { - "name": "minecraft:spruce_trapdoor", - "id": 404, - "data": 6 - }, - { - "name": "minecraft:spruce_trapdoor", - "id": 404, - "data": 7 - }, - { - "name": "minecraft:spruce_trapdoor", - "id": 404, - "data": 8 - }, - { - "name": "minecraft:spruce_trapdoor", - "id": 404, - "data": 9 - }, - { - "name": "minecraft:spruce_trapdoor", - "id": 404, - "data": 10 - }, - { - "name": "minecraft:spruce_trapdoor", - "id": 404, - "data": 11 - }, - { - "name": "minecraft:spruce_trapdoor", - "id": 404, - "data": 12 - }, - { - "name": "minecraft:spruce_trapdoor", - "id": 404, - "data": 13 - }, - { - "name": "minecraft:spruce_trapdoor", - "id": 404, - "data": 14 - }, - { - "name": "minecraft:spruce_trapdoor", - "id": 404, - "data": 15 - }, - { - "name": "minecraft:acacia_pressure_plate", - "id": 405, - "data": 0 - }, - { - "name": "minecraft:acacia_pressure_plate", - "id": 405, - "data": 1 - }, - { - "name": "minecraft:acacia_pressure_plate", - "id": 405, - "data": 2 - }, - { - "name": "minecraft:acacia_pressure_plate", - "id": 405, - "data": 3 - }, - { - "name": "minecraft:acacia_pressure_plate", - "id": 405, - "data": 4 - }, - { - "name": "minecraft:acacia_pressure_plate", - "id": 405, - "data": 5 - }, - { - "name": "minecraft:acacia_pressure_plate", - "id": 405, - "data": 6 - }, - { - "name": "minecraft:acacia_pressure_plate", - "id": 405, - "data": 7 - }, - { - "name": "minecraft:acacia_pressure_plate", - "id": 405, - "data": 8 - }, - { - "name": "minecraft:acacia_pressure_plate", - "id": 405, - "data": 9 - }, - { - "name": "minecraft:acacia_pressure_plate", - "id": 405, - "data": 10 - }, - { - "name": "minecraft:acacia_pressure_plate", - "id": 405, - "data": 11 - }, - { - "name": "minecraft:acacia_pressure_plate", - "id": 405, - "data": 12 - }, - { - "name": "minecraft:acacia_pressure_plate", - "id": 405, - "data": 13 - }, - { - "name": "minecraft:acacia_pressure_plate", - "id": 405, - "data": 14 - }, - { - "name": "minecraft:acacia_pressure_plate", - "id": 405, - "data": 15 - }, - { - "name": "minecraft:birch_pressure_plate", - "id": 406, - "data": 0 - }, - { - "name": "minecraft:birch_pressure_plate", - "id": 406, - "data": 1 - }, - { - "name": "minecraft:birch_pressure_plate", - "id": 406, - "data": 2 - }, - { - "name": "minecraft:birch_pressure_plate", - "id": 406, - "data": 3 - }, - { - "name": "minecraft:birch_pressure_plate", - "id": 406, - "data": 4 - }, - { - "name": "minecraft:birch_pressure_plate", - "id": 406, - "data": 5 - }, - { - "name": "minecraft:birch_pressure_plate", - "id": 406, - "data": 6 - }, - { - "name": "minecraft:birch_pressure_plate", - "id": 406, - "data": 7 - }, - { - "name": "minecraft:birch_pressure_plate", - "id": 406, - "data": 8 - }, - { - "name": "minecraft:birch_pressure_plate", - "id": 406, - "data": 9 - }, - { - "name": "minecraft:birch_pressure_plate", - "id": 406, - "data": 10 - }, - { - "name": "minecraft:birch_pressure_plate", - "id": 406, - "data": 11 - }, - { - "name": "minecraft:birch_pressure_plate", - "id": 406, - "data": 12 - }, - { - "name": "minecraft:birch_pressure_plate", - "id": 406, - "data": 13 - }, - { - "name": "minecraft:birch_pressure_plate", - "id": 406, - "data": 14 - }, - { - "name": "minecraft:birch_pressure_plate", - "id": 406, - "data": 15 - }, - { - "name": "minecraft:dark_oak_pressure_plate", - "id": 407, - "data": 0 - }, - { - "name": "minecraft:dark_oak_pressure_plate", - "id": 407, - "data": 1 - }, - { - "name": "minecraft:dark_oak_pressure_plate", - "id": 407, - "data": 2 - }, - { - "name": "minecraft:dark_oak_pressure_plate", - "id": 407, - "data": 3 - }, - { - "name": "minecraft:dark_oak_pressure_plate", - "id": 407, - "data": 4 - }, - { - "name": "minecraft:dark_oak_pressure_plate", - "id": 407, - "data": 5 - }, - { - "name": "minecraft:dark_oak_pressure_plate", - "id": 407, - "data": 6 - }, - { - "name": "minecraft:dark_oak_pressure_plate", - "id": 407, - "data": 7 - }, - { - "name": "minecraft:dark_oak_pressure_plate", - "id": 407, - "data": 8 - }, - { - "name": "minecraft:dark_oak_pressure_plate", - "id": 407, - "data": 9 - }, - { - "name": "minecraft:dark_oak_pressure_plate", - "id": 407, - "data": 10 - }, - { - "name": "minecraft:dark_oak_pressure_plate", - "id": 407, - "data": 11 - }, - { - "name": "minecraft:dark_oak_pressure_plate", - "id": 407, - "data": 12 - }, - { - "name": "minecraft:dark_oak_pressure_plate", - "id": 407, - "data": 13 - }, - { - "name": "minecraft:dark_oak_pressure_plate", - "id": 407, - "data": 14 - }, - { - "name": "minecraft:dark_oak_pressure_plate", - "id": 407, - "data": 15 - }, - { - "name": "minecraft:jungle_pressure_plate", - "id": 408, - "data": 0 - }, - { - "name": "minecraft:jungle_pressure_plate", - "id": 408, - "data": 1 - }, - { - "name": "minecraft:jungle_pressure_plate", - "id": 408, - "data": 2 - }, - { - "name": "minecraft:jungle_pressure_plate", - "id": 408, - "data": 3 - }, - { - "name": "minecraft:jungle_pressure_plate", - "id": 408, - "data": 4 - }, - { - "name": "minecraft:jungle_pressure_plate", - "id": 408, - "data": 5 - }, - { - "name": "minecraft:jungle_pressure_plate", - "id": 408, - "data": 6 - }, - { - "name": "minecraft:jungle_pressure_plate", - "id": 408, - "data": 7 - }, - { - "name": "minecraft:jungle_pressure_plate", - "id": 408, - "data": 8 - }, - { - "name": "minecraft:jungle_pressure_plate", - "id": 408, - "data": 9 - }, - { - "name": "minecraft:jungle_pressure_plate", - "id": 408, - "data": 10 - }, - { - "name": "minecraft:jungle_pressure_plate", - "id": 408, - "data": 11 - }, - { - "name": "minecraft:jungle_pressure_plate", - "id": 408, - "data": 12 - }, - { - "name": "minecraft:jungle_pressure_plate", - "id": 408, - "data": 13 - }, - { - "name": "minecraft:jungle_pressure_plate", - "id": 408, - "data": 14 - }, - { - "name": "minecraft:jungle_pressure_plate", - "id": 408, - "data": 15 - }, - { - "name": "minecraft:spruce_pressure_plate", - "id": 409, - "data": 0 - }, - { - "name": "minecraft:spruce_pressure_plate", - "id": 409, - "data": 1 - }, - { - "name": "minecraft:spruce_pressure_plate", - "id": 409, - "data": 2 - }, - { - "name": "minecraft:spruce_pressure_plate", - "id": 409, - "data": 3 - }, - { - "name": "minecraft:spruce_pressure_plate", - "id": 409, - "data": 4 - }, - { - "name": "minecraft:spruce_pressure_plate", - "id": 409, - "data": 5 - }, - { - "name": "minecraft:spruce_pressure_plate", - "id": 409, - "data": 6 - }, - { - "name": "minecraft:spruce_pressure_plate", - "id": 409, - "data": 7 - }, - { - "name": "minecraft:spruce_pressure_plate", - "id": 409, - "data": 8 - }, - { - "name": "minecraft:spruce_pressure_plate", - "id": 409, - "data": 9 - }, - { - "name": "minecraft:spruce_pressure_plate", - "id": 409, - "data": 10 - }, - { - "name": "minecraft:spruce_pressure_plate", - "id": 409, - "data": 11 - }, - { - "name": "minecraft:spruce_pressure_plate", - "id": 409, - "data": 12 - }, - { - "name": "minecraft:spruce_pressure_plate", - "id": 409, - "data": 13 - }, - { - "name": "minecraft:spruce_pressure_plate", - "id": 409, - "data": 14 - }, - { - "name": "minecraft:spruce_pressure_plate", - "id": 409, - "data": 15 - }, - { - "name": "minecraft:carved_pumpkin", - "id": 410, - "data": 0 - }, - { - "name": "minecraft:carved_pumpkin", - "id": 410, - "data": 1 - }, - { - "name": "minecraft:carved_pumpkin", - "id": 410, - "data": 2 - }, - { - "name": "minecraft:carved_pumpkin", - "id": 410, - "data": 3 - }, - { - "name": "minecraft:sea_pickle", - "id": 411, - "data": 0 - }, - { - "name": "minecraft:sea_pickle", - "id": 411, - "data": 1 - }, - { - "name": "minecraft:sea_pickle", - "id": 411, - "data": 2 - }, - { - "name": "minecraft:sea_pickle", - "id": 411, - "data": 3 - }, - { - "name": "minecraft:sea_pickle", - "id": 411, - "data": 4 - }, - { - "name": "minecraft:sea_pickle", - "id": 411, - "data": 5 - }, - { - "name": "minecraft:sea_pickle", - "id": 411, - "data": 6 - }, - { - "name": "minecraft:sea_pickle", - "id": 411, - "data": 7 - }, - { - "name": "minecraft:conduit", - "id": 412, - "data": 0 - }, - { - "name": "minecraft:turtle_egg", - "id": 414, - "data": 0 - }, - { - "name": "minecraft:turtle_egg", - "id": 414, - "data": 1 - }, - { - "name": "minecraft:turtle_egg", - "id": 414, - "data": 2 - }, - { - "name": "minecraft:turtle_egg", - "id": 414, - "data": 3 - }, - { - "name": "minecraft:turtle_egg", - "id": 414, - "data": 4 - }, - { - "name": "minecraft:turtle_egg", - "id": 414, - "data": 5 - }, - { - "name": "minecraft:turtle_egg", - "id": 414, - "data": 6 - }, - { - "name": "minecraft:turtle_egg", - "id": 414, - "data": 7 - }, - { - "name": "minecraft:turtle_egg", - "id": 414, - "data": 8 - }, - { - "name": "minecraft:turtle_egg", - "id": 414, - "data": 9 - }, - { - "name": "minecraft:turtle_egg", - "id": 414, - "data": 10 - }, - { - "name": "minecraft:turtle_egg", - "id": 414, - "data": 11 - }, - { - "name": "minecraft:turtle_egg", - "id": 414, - "data": 12 - }, - { - "name": "minecraft:turtle_egg", - "id": 414, - "data": 13 - }, - { - "name": "minecraft:turtle_egg", - "id": 414, - "data": 14 - }, - { - "name": "minecraft:turtle_egg", - "id": 414, - "data": 15 - }, - { - "name": "minecraft:bubble_column", - "id": 415, - "data": 0 - }, - { - "name": "minecraft:bubble_column", - "id": 415, - "data": 1 - }, - { - "name": "minecraft:barrier", - "id": 416, - "data": 0 - }, - { - "name": "minecraft:stone_slab3", - "id": 417, - "data": 0 - }, - { - "name": "minecraft:stone_slab3", - "id": 417, - "data": 1 - }, - { - "name": "minecraft:stone_slab3", - "id": 417, - "data": 2 - }, - { - "name": "minecraft:stone_slab3", - "id": 417, - "data": 3 - }, - { - "name": "minecraft:stone_slab3", - "id": 417, - "data": 4 - }, - { - "name": "minecraft:stone_slab3", - "id": 417, - "data": 5 - }, - { - "name": "minecraft:stone_slab3", - "id": 417, - "data": 6 - }, - { - "name": "minecraft:stone_slab3", - "id": 417, - "data": 7 - }, - { - "name": "minecraft:stone_slab3", - "id": 417, - "data": 8 - }, - { - "name": "minecraft:stone_slab3", - "id": 417, - "data": 9 - }, - { - "name": "minecraft:stone_slab3", - "id": 417, - "data": 10 - }, - { - "name": "minecraft:stone_slab3", - "id": 417, - "data": 11 - }, - { - "name": "minecraft:stone_slab3", - "id": 417, - "data": 12 - }, - { - "name": "minecraft:stone_slab3", - "id": 417, - "data": 13 - }, - { - "name": "minecraft:stone_slab3", - "id": 417, - "data": 14 - }, - { - "name": "minecraft:stone_slab3", - "id": 417, - "data": 15 - }, - { - "name": "minecraft:bamboo", - "id": 418, - "data": 0 - }, - { - "name": "minecraft:bamboo", - "id": 418, - "data": 1 - }, - { - "name": "minecraft:bamboo", - "id": 418, - "data": 2 - }, - { - "name": "minecraft:bamboo", - "id": 418, - "data": 3 - }, - { - "name": "minecraft:bamboo", - "id": 418, - "data": 4 - }, - { - "name": "minecraft:bamboo", - "id": 418, - "data": 5 - }, - { - "name": "minecraft:bamboo", - "id": 418, - "data": 6 - }, - { - "name": "minecraft:bamboo", - "id": 418, - "data": 7 - }, - { - "name": "minecraft:bamboo", - "id": 418, - "data": 8 - }, - { - "name": "minecraft:bamboo", - "id": 418, - "data": 9 - }, - { - "name": "minecraft:bamboo", - "id": 418, - "data": 10 - }, - { - "name": "minecraft:bamboo", - "id": 418, - "data": 11 - }, - { - "name": "minecraft:bamboo", - "id": 418, - "data": 12 - }, - { - "name": "minecraft:bamboo", - "id": 418, - "data": 13 - }, - { - "name": "minecraft:bamboo", - "id": 418, - "data": 14 - }, - { - "name": "minecraft:bamboo", - "id": 418, - "data": 15 - }, - { - "name": "minecraft:bamboo_sapling", - "id": 419, - "data": 0 - }, - { - "name": "minecraft:bamboo_sapling", - "id": 419, - "data": 1 - }, - { - "name": "minecraft:bamboo_sapling", - "id": 419, - "data": 2 - }, - { - "name": "minecraft:bamboo_sapling", - "id": 419, - "data": 3 - }, - { - "name": "minecraft:bamboo_sapling", - "id": 419, - "data": 4 - }, - { - "name": "minecraft:bamboo_sapling", - "id": 419, - "data": 5 - }, - { - "name": "minecraft:bamboo_sapling", - "id": 419, - "data": 6 - }, - { - "name": "minecraft:bamboo_sapling", - "id": 419, - "data": 7 - }, - { - "name": "minecraft:bamboo_sapling", - "id": 419, - "data": 8 - }, - { - "name": "minecraft:bamboo_sapling", - "id": 419, - "data": 9 - }, - { - "name": "minecraft:bamboo_sapling", - "id": 419, - "data": 10 - }, - { - "name": "minecraft:bamboo_sapling", - "id": 419, - "data": 11 - }, - { - "name": "minecraft:bamboo_sapling", - "id": 419, - "data": 12 - }, - { - "name": "minecraft:bamboo_sapling", - "id": 419, - "data": 13 - }, - { - "name": "minecraft:bamboo_sapling", - "id": 419, - "data": 14 - }, - { - "name": "minecraft:bamboo_sapling", - "id": 419, - "data": 15 - }, - { - "name": "minecraft:scaffolding", - "id": 420, - "data": 0 - }, - { - "name": "minecraft:scaffolding", - "id": 420, - "data": 1 - }, - { - "name": "minecraft:scaffolding", - "id": 420, - "data": 2 - }, - { - "name": "minecraft:scaffolding", - "id": 420, - "data": 3 - }, - { - "name": "minecraft:scaffolding", - "id": 420, - "data": 4 - }, - { - "name": "minecraft:scaffolding", - "id": 420, - "data": 5 - }, - { - "name": "minecraft:scaffolding", - "id": 420, - "data": 6 - }, - { - "name": "minecraft:scaffolding", - "id": 420, - "data": 7 - }, - { - "name": "minecraft:scaffolding", - "id": 420, - "data": 8 - }, - { - "name": "minecraft:scaffolding", - "id": 420, - "data": 9 - }, - { - "name": "minecraft:scaffolding", - "id": 420, - "data": 10 - }, - { - "name": "minecraft:scaffolding", - "id": 420, - "data": 11 - }, - { - "name": "minecraft:scaffolding", - "id": 420, - "data": 12 - }, - { - "name": "minecraft:scaffolding", - "id": 420, - "data": 13 - }, - { - "name": "minecraft:scaffolding", - "id": 420, - "data": 14 - }, - { - "name": "minecraft:scaffolding", - "id": 420, - "data": 15 - }, - { - "name": "minecraft:stone_slab4", - "id": 421, - "data": 0 - }, - { - "name": "minecraft:stone_slab4", - "id": 421, - "data": 1 - }, - { - "name": "minecraft:stone_slab4", - "id": 421, - "data": 2 - }, - { - "name": "minecraft:stone_slab4", - "id": 421, - "data": 3 - }, - { - "name": "minecraft:stone_slab4", - "id": 421, - "data": 4 - }, - { - "name": "minecraft:stone_slab4", - "id": 421, - "data": 5 - }, - { - "name": "minecraft:stone_slab4", - "id": 421, - "data": 6 - }, - { - "name": "minecraft:stone_slab4", - "id": 421, - "data": 7 - }, - { - "name": "minecraft:stone_slab4", - "id": 421, - "data": 8 - }, - { - "name": "minecraft:stone_slab4", - "id": 421, - "data": 9 - }, - { - "name": "minecraft:stone_slab4", - "id": 421, - "data": 10 - }, - { - "name": "minecraft:stone_slab4", - "id": 421, - "data": 11 - }, - { - "name": "minecraft:stone_slab4", - "id": 421, - "data": 12 - }, - { - "name": "minecraft:stone_slab4", - "id": 421, - "data": 13 - }, - { - "name": "minecraft:stone_slab4", - "id": 421, - "data": 14 - }, - { - "name": "minecraft:stone_slab4", - "id": 421, - "data": 15 - }, - { - "name": "minecraft:double_stone_slab3", - "id": 422, - "data": 0 - }, - { - "name": "minecraft:double_stone_slab3", - "id": 422, - "data": 1 - }, - { - "name": "minecraft:double_stone_slab3", - "id": 422, - "data": 2 - }, - { - "name": "minecraft:double_stone_slab3", - "id": 422, - "data": 3 - }, - { - "name": "minecraft:double_stone_slab3", - "id": 422, - "data": 4 - }, - { - "name": "minecraft:double_stone_slab3", - "id": 422, - "data": 5 - }, - { - "name": "minecraft:double_stone_slab3", - "id": 422, - "data": 6 - }, - { - "name": "minecraft:double_stone_slab3", - "id": 422, - "data": 7 - }, - { - "name": "minecraft:double_stone_slab3", - "id": 422, - "data": 8 - }, - { - "name": "minecraft:double_stone_slab3", - "id": 422, - "data": 9 - }, - { - "name": "minecraft:double_stone_slab3", - "id": 422, - "data": 10 - }, - { - "name": "minecraft:double_stone_slab3", - "id": 422, - "data": 11 - }, - { - "name": "minecraft:double_stone_slab3", - "id": 422, - "data": 12 - }, - { - "name": "minecraft:double_stone_slab3", - "id": 422, - "data": 13 - }, - { - "name": "minecraft:double_stone_slab3", - "id": 422, - "data": 14 - }, - { - "name": "minecraft:double_stone_slab3", - "id": 422, - "data": 15 - }, - { - "name": "minecraft:double_stone_slab4", - "id": 423, - "data": 0 - }, - { - "name": "minecraft:double_stone_slab4", - "id": 423, - "data": 1 - }, - { - "name": "minecraft:double_stone_slab4", - "id": 423, - "data": 2 - }, - { - "name": "minecraft:double_stone_slab4", - "id": 423, - "data": 3 - }, - { - "name": "minecraft:double_stone_slab4", - "id": 423, - "data": 4 - }, - { - "name": "minecraft:double_stone_slab4", - "id": 423, - "data": 5 - }, - { - "name": "minecraft:double_stone_slab4", - "id": 423, - "data": 6 - }, - { - "name": "minecraft:double_stone_slab4", - "id": 423, - "data": 7 - }, - { - "name": "minecraft:double_stone_slab4", - "id": 423, - "data": 8 - }, - { - "name": "minecraft:double_stone_slab4", - "id": 423, - "data": 9 - }, - { - "name": "minecraft:double_stone_slab4", - "id": 423, - "data": 10 - }, - { - "name": "minecraft:double_stone_slab4", - "id": 423, - "data": 11 - }, - { - "name": "minecraft:double_stone_slab4", - "id": 423, - "data": 12 - }, - { - "name": "minecraft:double_stone_slab4", - "id": 423, - "data": 13 - }, - { - "name": "minecraft:double_stone_slab4", - "id": 423, - "data": 14 - }, - { - "name": "minecraft:double_stone_slab4", - "id": 423, - "data": 15 - }, - { - "name": "minecraft:granite_stairs", - "id": 424, - "data": 0 - }, - { - "name": "minecraft:granite_stairs", - "id": 424, - "data": 1 - }, - { - "name": "minecraft:granite_stairs", - "id": 424, - "data": 2 - }, - { - "name": "minecraft:granite_stairs", - "id": 424, - "data": 3 - }, - { - "name": "minecraft:granite_stairs", - "id": 424, - "data": 4 - }, - { - "name": "minecraft:granite_stairs", - "id": 424, - "data": 5 - }, - { - "name": "minecraft:granite_stairs", - "id": 424, - "data": 6 - }, - { - "name": "minecraft:granite_stairs", - "id": 424, - "data": 7 - }, - { - "name": "minecraft:diorite_stairs", - "id": 425, - "data": 0 - }, - { - "name": "minecraft:diorite_stairs", - "id": 425, - "data": 1 - }, - { - "name": "minecraft:diorite_stairs", - "id": 425, - "data": 2 - }, - { - "name": "minecraft:diorite_stairs", - "id": 425, - "data": 3 - }, - { - "name": "minecraft:diorite_stairs", - "id": 425, - "data": 4 - }, - { - "name": "minecraft:diorite_stairs", - "id": 425, - "data": 5 - }, - { - "name": "minecraft:diorite_stairs", - "id": 425, - "data": 6 - }, - { - "name": "minecraft:diorite_stairs", - "id": 425, - "data": 7 - }, - { - "name": "minecraft:andesite_stairs", - "id": 426, - "data": 0 - }, - { - "name": "minecraft:andesite_stairs", - "id": 426, - "data": 1 - }, - { - "name": "minecraft:andesite_stairs", - "id": 426, - "data": 2 - }, - { - "name": "minecraft:andesite_stairs", - "id": 426, - "data": 3 - }, - { - "name": "minecraft:andesite_stairs", - "id": 426, - "data": 4 - }, - { - "name": "minecraft:andesite_stairs", - "id": 426, - "data": 5 - }, - { - "name": "minecraft:andesite_stairs", - "id": 426, - "data": 6 - }, - { - "name": "minecraft:andesite_stairs", - "id": 426, - "data": 7 - }, - { - "name": "minecraft:polished_granite_stairs", - "id": 427, - "data": 0 - }, - { - "name": "minecraft:polished_granite_stairs", - "id": 427, - "data": 1 - }, - { - "name": "minecraft:polished_granite_stairs", - "id": 427, - "data": 2 - }, - { - "name": "minecraft:polished_granite_stairs", - "id": 427, - "data": 3 - }, - { - "name": "minecraft:polished_granite_stairs", - "id": 427, - "data": 4 - }, - { - "name": "minecraft:polished_granite_stairs", - "id": 427, - "data": 5 - }, - { - "name": "minecraft:polished_granite_stairs", - "id": 427, - "data": 6 - }, - { - "name": "minecraft:polished_granite_stairs", - "id": 427, - "data": 7 - }, - { - "name": "minecraft:polished_diorite_stairs", - "id": 428, - "data": 0 - }, - { - "name": "minecraft:polished_diorite_stairs", - "id": 428, - "data": 1 - }, - { - "name": "minecraft:polished_diorite_stairs", - "id": 428, - "data": 2 - }, - { - "name": "minecraft:polished_diorite_stairs", - "id": 428, - "data": 3 - }, - { - "name": "minecraft:polished_diorite_stairs", - "id": 428, - "data": 4 - }, - { - "name": "minecraft:polished_diorite_stairs", - "id": 428, - "data": 5 - }, - { - "name": "minecraft:polished_diorite_stairs", - "id": 428, - "data": 6 - }, - { - "name": "minecraft:polished_diorite_stairs", - "id": 428, - "data": 7 - }, - { - "name": "minecraft:polished_andesite_stairs", - "id": 429, - "data": 0 - }, - { - "name": "minecraft:polished_andesite_stairs", - "id": 429, - "data": 1 - }, - { - "name": "minecraft:polished_andesite_stairs", - "id": 429, - "data": 2 - }, - { - "name": "minecraft:polished_andesite_stairs", - "id": 429, - "data": 3 - }, - { - "name": "minecraft:polished_andesite_stairs", - "id": 429, - "data": 4 - }, - { - "name": "minecraft:polished_andesite_stairs", - "id": 429, - "data": 5 - }, - { - "name": "minecraft:polished_andesite_stairs", - "id": 429, - "data": 6 - }, - { - "name": "minecraft:polished_andesite_stairs", - "id": 429, - "data": 7 - }, - { - "name": "minecraft:mossy_stone_brick_stairs", - "id": 430, - "data": 0 - }, - { - "name": "minecraft:mossy_stone_brick_stairs", - "id": 430, - "data": 1 - }, - { - "name": "minecraft:mossy_stone_brick_stairs", - "id": 430, - "data": 2 - }, - { - "name": "minecraft:mossy_stone_brick_stairs", - "id": 430, - "data": 3 - }, - { - "name": "minecraft:mossy_stone_brick_stairs", - "id": 430, - "data": 4 - }, - { - "name": "minecraft:mossy_stone_brick_stairs", - "id": 430, - "data": 5 - }, - { - "name": "minecraft:mossy_stone_brick_stairs", - "id": 430, - "data": 6 - }, - { - "name": "minecraft:mossy_stone_brick_stairs", - "id": 430, - "data": 7 - }, - { - "name": "minecraft:smooth_red_sandstone_stairs", - "id": 431, - "data": 0 - }, - { - "name": "minecraft:smooth_red_sandstone_stairs", - "id": 431, - "data": 1 - }, - { - "name": "minecraft:smooth_red_sandstone_stairs", - "id": 431, - "data": 2 - }, - { - "name": "minecraft:smooth_red_sandstone_stairs", - "id": 431, - "data": 3 - }, - { - "name": "minecraft:smooth_red_sandstone_stairs", - "id": 431, - "data": 4 - }, - { - "name": "minecraft:smooth_red_sandstone_stairs", - "id": 431, - "data": 5 - }, - { - "name": "minecraft:smooth_red_sandstone_stairs", - "id": 431, - "data": 6 - }, - { - "name": "minecraft:smooth_red_sandstone_stairs", - "id": 431, - "data": 7 - }, - { - "name": "minecraft:smooth_sandstone_stairs", - "id": 432, - "data": 0 - }, - { - "name": "minecraft:smooth_sandstone_stairs", - "id": 432, - "data": 1 - }, - { - "name": "minecraft:smooth_sandstone_stairs", - "id": 432, - "data": 2 - }, - { - "name": "minecraft:smooth_sandstone_stairs", - "id": 432, - "data": 3 - }, - { - "name": "minecraft:smooth_sandstone_stairs", - "id": 432, - "data": 4 - }, - { - "name": "minecraft:smooth_sandstone_stairs", - "id": 432, - "data": 5 - }, - { - "name": "minecraft:smooth_sandstone_stairs", - "id": 432, - "data": 6 - }, - { - "name": "minecraft:smooth_sandstone_stairs", - "id": 432, - "data": 7 - }, - { - "name": "minecraft:end_brick_stairs", - "id": 433, - "data": 0 - }, - { - "name": "minecraft:end_brick_stairs", - "id": 433, - "data": 1 - }, - { - "name": "minecraft:end_brick_stairs", - "id": 433, - "data": 2 - }, - { - "name": "minecraft:end_brick_stairs", - "id": 433, - "data": 3 - }, - { - "name": "minecraft:end_brick_stairs", - "id": 433, - "data": 4 - }, - { - "name": "minecraft:end_brick_stairs", - "id": 433, - "data": 5 - }, - { - "name": "minecraft:end_brick_stairs", - "id": 433, - "data": 6 - }, - { - "name": "minecraft:end_brick_stairs", - "id": 433, - "data": 7 - }, - { - "name": "minecraft:mossy_cobblestone_stairs", - "id": 434, - "data": 0 - }, - { - "name": "minecraft:mossy_cobblestone_stairs", - "id": 434, - "data": 1 - }, - { - "name": "minecraft:mossy_cobblestone_stairs", - "id": 434, - "data": 2 - }, - { - "name": "minecraft:mossy_cobblestone_stairs", - "id": 434, - "data": 3 - }, - { - "name": "minecraft:mossy_cobblestone_stairs", - "id": 434, - "data": 4 - }, - { - "name": "minecraft:mossy_cobblestone_stairs", - "id": 434, - "data": 5 - }, - { - "name": "minecraft:mossy_cobblestone_stairs", - "id": 434, - "data": 6 - }, - { - "name": "minecraft:mossy_cobblestone_stairs", - "id": 434, - "data": 7 - }, - { - "name": "minecraft:normal_stone_stairs", - "id": 435, - "data": 0 - }, - { - "name": "minecraft:normal_stone_stairs", - "id": 435, - "data": 1 - }, - { - "name": "minecraft:normal_stone_stairs", - "id": 435, - "data": 2 - }, - { - "name": "minecraft:normal_stone_stairs", - "id": 435, - "data": 3 - }, - { - "name": "minecraft:normal_stone_stairs", - "id": 435, - "data": 4 - }, - { - "name": "minecraft:normal_stone_stairs", - "id": 435, - "data": 5 - }, - { - "name": "minecraft:normal_stone_stairs", - "id": 435, - "data": 6 - }, - { - "name": "minecraft:normal_stone_stairs", - "id": 435, - "data": 7 - }, - { - "name": "minecraft:spruce_standing_sign", - "id": 436, - "data": 0 - }, - { - "name": "minecraft:spruce_standing_sign", - "id": 436, - "data": 1 - }, - { - "name": "minecraft:spruce_standing_sign", - "id": 436, - "data": 2 - }, - { - "name": "minecraft:spruce_standing_sign", - "id": 436, - "data": 3 - }, - { - "name": "minecraft:spruce_standing_sign", - "id": 436, - "data": 4 - }, - { - "name": "minecraft:spruce_standing_sign", - "id": 436, - "data": 5 - }, - { - "name": "minecraft:spruce_standing_sign", - "id": 436, - "data": 6 - }, - { - "name": "minecraft:spruce_standing_sign", - "id": 436, - "data": 7 - }, - { - "name": "minecraft:spruce_standing_sign", - "id": 436, - "data": 8 - }, - { - "name": "minecraft:spruce_standing_sign", - "id": 436, - "data": 9 - }, - { - "name": "minecraft:spruce_standing_sign", - "id": 436, - "data": 10 - }, - { - "name": "minecraft:spruce_standing_sign", - "id": 436, - "data": 11 - }, - { - "name": "minecraft:spruce_standing_sign", - "id": 436, - "data": 12 - }, - { - "name": "minecraft:spruce_standing_sign", - "id": 436, - "data": 13 - }, - { - "name": "minecraft:spruce_standing_sign", - "id": 436, - "data": 14 - }, - { - "name": "minecraft:spruce_standing_sign", - "id": 436, - "data": 15 - }, - { - "name": "minecraft:spruce_wall_sign", - "id": 437, - "data": 0 - }, - { - "name": "minecraft:spruce_wall_sign", - "id": 437, - "data": 1 - }, - { - "name": "minecraft:spruce_wall_sign", - "id": 437, - "data": 2 - }, - { - "name": "minecraft:spruce_wall_sign", - "id": 437, - "data": 3 - }, - { - "name": "minecraft:spruce_wall_sign", - "id": 437, - "data": 4 - }, - { - "name": "minecraft:spruce_wall_sign", - "id": 437, - "data": 5 - }, - { - "name": "minecraft:spruce_wall_sign", - "id": 437, - "data": 6 - }, - { - "name": "minecraft:spruce_wall_sign", - "id": 437, - "data": 7 - }, - { - "name": "minecraft:smooth_stone", - "id": 438, - "data": 0 - }, - { - "name": "minecraft:red_nether_brick_stairs", - "id": 439, - "data": 0 - }, - { - "name": "minecraft:red_nether_brick_stairs", - "id": 439, - "data": 1 - }, - { - "name": "minecraft:red_nether_brick_stairs", - "id": 439, - "data": 2 - }, - { - "name": "minecraft:red_nether_brick_stairs", - "id": 439, - "data": 3 - }, - { - "name": "minecraft:red_nether_brick_stairs", - "id": 439, - "data": 4 - }, - { - "name": "minecraft:red_nether_brick_stairs", - "id": 439, - "data": 5 - }, - { - "name": "minecraft:red_nether_brick_stairs", - "id": 439, - "data": 6 - }, - { - "name": "minecraft:red_nether_brick_stairs", - "id": 439, - "data": 7 - }, - { - "name": "minecraft:smooth_quartz_stairs", - "id": 440, - "data": 0 - }, - { - "name": "minecraft:smooth_quartz_stairs", - "id": 440, - "data": 1 - }, - { - "name": "minecraft:smooth_quartz_stairs", - "id": 440, - "data": 2 - }, - { - "name": "minecraft:smooth_quartz_stairs", - "id": 440, - "data": 3 - }, - { - "name": "minecraft:smooth_quartz_stairs", - "id": 440, - "data": 4 - }, - { - "name": "minecraft:smooth_quartz_stairs", - "id": 440, - "data": 5 - }, - { - "name": "minecraft:smooth_quartz_stairs", - "id": 440, - "data": 6 - }, - { - "name": "minecraft:smooth_quartz_stairs", - "id": 440, - "data": 7 - }, - { - "name": "minecraft:birch_standing_sign", - "id": 441, - "data": 0 - }, - { - "name": "minecraft:birch_standing_sign", - "id": 441, - "data": 1 - }, - { - "name": "minecraft:birch_standing_sign", - "id": 441, - "data": 2 - }, - { - "name": "minecraft:birch_standing_sign", - "id": 441, - "data": 3 - }, - { - "name": "minecraft:birch_standing_sign", - "id": 441, - "data": 4 - }, - { - "name": "minecraft:birch_standing_sign", - "id": 441, - "data": 5 - }, - { - "name": "minecraft:birch_standing_sign", - "id": 441, - "data": 6 - }, - { - "name": "minecraft:birch_standing_sign", - "id": 441, - "data": 7 - }, - { - "name": "minecraft:birch_standing_sign", - "id": 441, - "data": 8 - }, - { - "name": "minecraft:birch_standing_sign", - "id": 441, - "data": 9 - }, - { - "name": "minecraft:birch_standing_sign", - "id": 441, - "data": 10 - }, - { - "name": "minecraft:birch_standing_sign", - "id": 441, - "data": 11 - }, - { - "name": "minecraft:birch_standing_sign", - "id": 441, - "data": 12 - }, - { - "name": "minecraft:birch_standing_sign", - "id": 441, - "data": 13 - }, - { - "name": "minecraft:birch_standing_sign", - "id": 441, - "data": 14 - }, - { - "name": "minecraft:birch_standing_sign", - "id": 441, - "data": 15 - }, - { - "name": "minecraft:birch_wall_sign", - "id": 442, - "data": 0 - }, - { - "name": "minecraft:birch_wall_sign", - "id": 442, - "data": 1 - }, - { - "name": "minecraft:birch_wall_sign", - "id": 442, - "data": 2 - }, - { - "name": "minecraft:birch_wall_sign", - "id": 442, - "data": 3 - }, - { - "name": "minecraft:birch_wall_sign", - "id": 442, - "data": 4 - }, - { - "name": "minecraft:birch_wall_sign", - "id": 442, - "data": 5 - }, - { - "name": "minecraft:birch_wall_sign", - "id": 442, - "data": 6 - }, - { - "name": "minecraft:birch_wall_sign", - "id": 442, - "data": 7 - }, - { - "name": "minecraft:jungle_standing_sign", - "id": 443, - "data": 0 - }, - { - "name": "minecraft:jungle_standing_sign", - "id": 443, - "data": 1 - }, - { - "name": "minecraft:jungle_standing_sign", - "id": 443, - "data": 2 - }, - { - "name": "minecraft:jungle_standing_sign", - "id": 443, - "data": 3 - }, - { - "name": "minecraft:jungle_standing_sign", - "id": 443, - "data": 4 - }, - { - "name": "minecraft:jungle_standing_sign", - "id": 443, - "data": 5 - }, - { - "name": "minecraft:jungle_standing_sign", - "id": 443, - "data": 6 - }, - { - "name": "minecraft:jungle_standing_sign", - "id": 443, - "data": 7 - }, - { - "name": "minecraft:jungle_standing_sign", - "id": 443, - "data": 8 - }, - { - "name": "minecraft:jungle_standing_sign", - "id": 443, - "data": 9 - }, - { - "name": "minecraft:jungle_standing_sign", - "id": 443, - "data": 10 - }, - { - "name": "minecraft:jungle_standing_sign", - "id": 443, - "data": 11 - }, - { - "name": "minecraft:jungle_standing_sign", - "id": 443, - "data": 12 - }, - { - "name": "minecraft:jungle_standing_sign", - "id": 443, - "data": 13 - }, - { - "name": "minecraft:jungle_standing_sign", - "id": 443, - "data": 14 - }, - { - "name": "minecraft:jungle_standing_sign", - "id": 443, - "data": 15 - }, - { - "name": "minecraft:jungle_wall_sign", - "id": 444, - "data": 0 - }, - { - "name": "minecraft:jungle_wall_sign", - "id": 444, - "data": 1 - }, - { - "name": "minecraft:jungle_wall_sign", - "id": 444, - "data": 2 - }, - { - "name": "minecraft:jungle_wall_sign", - "id": 444, - "data": 3 - }, - { - "name": "minecraft:jungle_wall_sign", - "id": 444, - "data": 4 - }, - { - "name": "minecraft:jungle_wall_sign", - "id": 444, - "data": 5 - }, - { - "name": "minecraft:jungle_wall_sign", - "id": 444, - "data": 6 - }, - { - "name": "minecraft:jungle_wall_sign", - "id": 444, - "data": 7 - }, - { - "name": "minecraft:acacia_standing_sign", - "id": 445, - "data": 0 - }, - { - "name": "minecraft:acacia_standing_sign", - "id": 445, - "data": 1 - }, - { - "name": "minecraft:acacia_standing_sign", - "id": 445, - "data": 2 - }, - { - "name": "minecraft:acacia_standing_sign", - "id": 445, - "data": 3 - }, - { - "name": "minecraft:acacia_standing_sign", - "id": 445, - "data": 4 - }, - { - "name": "minecraft:acacia_standing_sign", - "id": 445, - "data": 5 - }, - { - "name": "minecraft:acacia_standing_sign", - "id": 445, - "data": 6 - }, - { - "name": "minecraft:acacia_standing_sign", - "id": 445, - "data": 7 - }, - { - "name": "minecraft:acacia_standing_sign", - "id": 445, - "data": 8 - }, - { - "name": "minecraft:acacia_standing_sign", - "id": 445, - "data": 9 - }, - { - "name": "minecraft:acacia_standing_sign", - "id": 445, - "data": 10 - }, - { - "name": "minecraft:acacia_standing_sign", - "id": 445, - "data": 11 - }, - { - "name": "minecraft:acacia_standing_sign", - "id": 445, - "data": 12 - }, - { - "name": "minecraft:acacia_standing_sign", - "id": 445, - "data": 13 - }, - { - "name": "minecraft:acacia_standing_sign", - "id": 445, - "data": 14 - }, - { - "name": "minecraft:acacia_standing_sign", - "id": 445, - "data": 15 - }, - { - "name": "minecraft:acacia_wall_sign", - "id": 446, - "data": 0 - }, - { - "name": "minecraft:acacia_wall_sign", - "id": 446, - "data": 1 - }, - { - "name": "minecraft:acacia_wall_sign", - "id": 446, - "data": 2 - }, - { - "name": "minecraft:acacia_wall_sign", - "id": 446, - "data": 3 - }, - { - "name": "minecraft:acacia_wall_sign", - "id": 446, - "data": 4 - }, - { - "name": "minecraft:acacia_wall_sign", - "id": 446, - "data": 5 - }, - { - "name": "minecraft:acacia_wall_sign", - "id": 446, - "data": 6 - }, - { - "name": "minecraft:acacia_wall_sign", - "id": 446, - "data": 7 - }, - { - "name": "minecraft:darkoak_standing_sign", - "id": 447, - "data": 0 - }, - { - "name": "minecraft:darkoak_standing_sign", - "id": 447, - "data": 1 - }, - { - "name": "minecraft:darkoak_standing_sign", - "id": 447, - "data": 2 - }, - { - "name": "minecraft:darkoak_standing_sign", - "id": 447, - "data": 3 - }, - { - "name": "minecraft:darkoak_standing_sign", - "id": 447, - "data": 4 - }, - { - "name": "minecraft:darkoak_standing_sign", - "id": 447, - "data": 5 - }, - { - "name": "minecraft:darkoak_standing_sign", - "id": 447, - "data": 6 - }, - { - "name": "minecraft:darkoak_standing_sign", - "id": 447, - "data": 7 - }, - { - "name": "minecraft:darkoak_standing_sign", - "id": 447, - "data": 8 - }, - { - "name": "minecraft:darkoak_standing_sign", - "id": 447, - "data": 9 - }, - { - "name": "minecraft:darkoak_standing_sign", - "id": 447, - "data": 10 - }, - { - "name": "minecraft:darkoak_standing_sign", - "id": 447, - "data": 11 - }, - { - "name": "minecraft:darkoak_standing_sign", - "id": 447, - "data": 12 - }, - { - "name": "minecraft:darkoak_standing_sign", - "id": 447, - "data": 13 - }, - { - "name": "minecraft:darkoak_standing_sign", - "id": 447, - "data": 14 - }, - { - "name": "minecraft:darkoak_standing_sign", - "id": 447, - "data": 15 - }, - { - "name": "minecraft:darkoak_wall_sign", - "id": 448, - "data": 0 - }, - { - "name": "minecraft:darkoak_wall_sign", - "id": 448, - "data": 1 - }, - { - "name": "minecraft:darkoak_wall_sign", - "id": 448, - "data": 2 - }, - { - "name": "minecraft:darkoak_wall_sign", - "id": 448, - "data": 3 - }, - { - "name": "minecraft:darkoak_wall_sign", - "id": 448, - "data": 4 - }, - { - "name": "minecraft:darkoak_wall_sign", - "id": 448, - "data": 5 - }, - { - "name": "minecraft:darkoak_wall_sign", - "id": 448, - "data": 6 - }, - { - "name": "minecraft:darkoak_wall_sign", - "id": 448, - "data": 7 - }, - { - "name": "minecraft:lectern", - "id": 449, - "data": 0 - }, - { - "name": "minecraft:lectern", - "id": 449, - "data": 1 - }, - { - "name": "minecraft:lectern", - "id": 449, - "data": 2 - }, - { - "name": "minecraft:lectern", - "id": 449, - "data": 3 - }, - { - "name": "minecraft:lectern", - "id": 449, - "data": 4 - }, - { - "name": "minecraft:lectern", - "id": 449, - "data": 5 - }, - { - "name": "minecraft:lectern", - "id": 449, - "data": 6 - }, - { - "name": "minecraft:lectern", - "id": 449, - "data": 7 - }, - { - "name": "minecraft:grindstone", - "id": 450, - "data": 0 - }, - { - "name": "minecraft:grindstone", - "id": 450, - "data": 1 - }, - { - "name": "minecraft:grindstone", - "id": 450, - "data": 2 - }, - { - "name": "minecraft:grindstone", - "id": 450, - "data": 3 - }, - { - "name": "minecraft:grindstone", - "id": 450, - "data": 4 - }, - { - "name": "minecraft:grindstone", - "id": 450, - "data": 5 - }, - { - "name": "minecraft:grindstone", - "id": 450, - "data": 6 - }, - { - "name": "minecraft:grindstone", - "id": 450, - "data": 7 - }, - { - "name": "minecraft:grindstone", - "id": 450, - "data": 8 - }, - { - "name": "minecraft:grindstone", - "id": 450, - "data": 9 - }, - { - "name": "minecraft:grindstone", - "id": 450, - "data": 10 - }, - { - "name": "minecraft:grindstone", - "id": 450, - "data": 11 - }, - { - "name": "minecraft:grindstone", - "id": 450, - "data": 12 - }, - { - "name": "minecraft:grindstone", - "id": 450, - "data": 13 - }, - { - "name": "minecraft:grindstone", - "id": 450, - "data": 14 - }, - { - "name": "minecraft:grindstone", - "id": 450, - "data": 15 - }, - { - "name": "minecraft:blast_furnace", - "id": 451, - "data": 0 - }, - { - "name": "minecraft:blast_furnace", - "id": 451, - "data": 1 - }, - { - "name": "minecraft:blast_furnace", - "id": 451, - "data": 2 - }, - { - "name": "minecraft:blast_furnace", - "id": 451, - "data": 3 - }, - { - "name": "minecraft:blast_furnace", - "id": 451, - "data": 4 - }, - { - "name": "minecraft:blast_furnace", - "id": 451, - "data": 5 - }, - { - "name": "minecraft:blast_furnace", - "id": 451, - "data": 6 - }, - { - "name": "minecraft:blast_furnace", - "id": 451, - "data": 7 - }, - { - "name": "minecraft:stonecutter_block", - "id": 452, - "data": 0 - }, - { - "name": "minecraft:stonecutter_block", - "id": 452, - "data": 1 - }, - { - "name": "minecraft:stonecutter_block", - "id": 452, - "data": 2 - }, - { - "name": "minecraft:stonecutter_block", - "id": 452, - "data": 3 - }, - { - "name": "minecraft:stonecutter_block", - "id": 452, - "data": 4 - }, - { - "name": "minecraft:stonecutter_block", - "id": 452, - "data": 5 - }, - { - "name": "minecraft:stonecutter_block", - "id": 452, - "data": 6 - }, - { - "name": "minecraft:stonecutter_block", - "id": 452, - "data": 7 - }, - { - "name": "minecraft:smoker", - "id": 453, - "data": 0 - }, - { - "name": "minecraft:smoker", - "id": 453, - "data": 1 - }, - { - "name": "minecraft:smoker", - "id": 453, - "data": 2 - }, - { - "name": "minecraft:smoker", - "id": 453, - "data": 3 - }, - { - "name": "minecraft:smoker", - "id": 453, - "data": 4 - }, - { - "name": "minecraft:smoker", - "id": 453, - "data": 5 - }, - { - "name": "minecraft:smoker", - "id": 453, - "data": 6 - }, - { - "name": "minecraft:smoker", - "id": 453, - "data": 7 - }, - { - "name": "minecraft:lit_smoker", - "id": 454, - "data": 0 - }, - { - "name": "minecraft:lit_smoker", - "id": 454, - "data": 1 - }, - { - "name": "minecraft:lit_smoker", - "id": 454, - "data": 2 - }, - { - "name": "minecraft:lit_smoker", - "id": 454, - "data": 3 - }, - { - "name": "minecraft:lit_smoker", - "id": 454, - "data": 4 - }, - { - "name": "minecraft:lit_smoker", - "id": 454, - "data": 5 - }, - { - "name": "minecraft:lit_smoker", - "id": 454, - "data": 6 - }, - { - "name": "minecraft:lit_smoker", - "id": 454, - "data": 7 - }, - { - "name": "minecraft:cartography_table", - "id": 455, - "data": 0 - }, - { - "name": "minecraft:fletching_table", - "id": 456, - "data": 0 - }, - { - "name": "minecraft:smithing_table", - "id": 457, - "data": 0 - }, - { - "name": "minecraft:barrel", - "id": 458, - "data": 0 - }, - { - "name": "minecraft:barrel", - "id": 458, - "data": 1 - }, - { - "name": "minecraft:barrel", - "id": 458, - "data": 2 - }, - { - "name": "minecraft:barrel", - "id": 458, - "data": 3 - }, - { - "name": "minecraft:barrel", - "id": 458, - "data": 4 - }, - { - "name": "minecraft:barrel", - "id": 458, - "data": 5 - }, - { - "name": "minecraft:barrel", - "id": 458, - "data": 6 - }, - { - "name": "minecraft:barrel", - "id": 458, - "data": 7 - }, - { - "name": "minecraft:barrel", - "id": 458, - "data": 8 - }, - { - "name": "minecraft:barrel", - "id": 458, - "data": 9 - }, - { - "name": "minecraft:barrel", - "id": 458, - "data": 10 - }, - { - "name": "minecraft:barrel", - "id": 458, - "data": 11 - }, - { - "name": "minecraft:barrel", - "id": 458, - "data": 12 - }, - { - "name": "minecraft:barrel", - "id": 458, - "data": 13 - }, - { - "name": "minecraft:barrel", - "id": 458, - "data": 14 - }, - { - "name": "minecraft:barrel", - "id": 458, - "data": 15 - }, - { - "name": "minecraft:loom", - "id": 459, - "data": 0 - }, - { - "name": "minecraft:loom", - "id": 459, - "data": 1 - }, - { - "name": "minecraft:loom", - "id": 459, - "data": 2 - }, - { - "name": "minecraft:loom", - "id": 459, - "data": 3 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 0 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 1 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 2 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 3 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 4 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 5 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 6 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 7 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 8 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 9 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 10 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 11 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 12 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 13 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 14 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 15 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 16 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 17 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 18 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 19 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 20 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 21 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 22 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 23 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 24 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 25 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 26 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 27 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 28 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 29 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 30 - }, - { - "name": "minecraft:bell", - "id": 461, - "data": 31 - }, - { - "name": "minecraft:sweet_berry_bush", - "id": 462, - "data": 0 - }, - { - "name": "minecraft:sweet_berry_bush", - "id": 462, - "data": 1 - }, - { - "name": "minecraft:sweet_berry_bush", - "id": 462, - "data": 2 - }, - { - "name": "minecraft:sweet_berry_bush", - "id": 462, - "data": 3 - }, - { - "name": "minecraft:sweet_berry_bush", - "id": 462, - "data": 4 - }, - { - "name": "minecraft:sweet_berry_bush", - "id": 462, - "data": 5 - }, - { - "name": "minecraft:sweet_berry_bush", - "id": 462, - "data": 6 - }, - { - "name": "minecraft:sweet_berry_bush", - "id": 462, - "data": 7 - }, - { - "name": "minecraft:lantern", - "id": 463, - "data": 0 - }, - { - "name": "minecraft:lantern", - "id": 463, - "data": 1 - }, - { - "name": "minecraft:campfire", - "id": 464, - "data": 0 - }, - { - "name": "minecraft:campfire", - "id": 464, - "data": 1 - }, - { - "name": "minecraft:campfire", - "id": 464, - "data": 2 - }, - { - "name": "minecraft:campfire", - "id": 464, - "data": 3 - }, - { - "name": "minecraft:campfire", - "id": 464, - "data": 4 - }, - { - "name": "minecraft:campfire", - "id": 464, - "data": 5 - }, - { - "name": "minecraft:campfire", - "id": 464, - "data": 6 - }, - { - "name": "minecraft:campfire", - "id": 464, - "data": 7 - }, - { - "name": "minecraft:lava_cauldron", - "id": 465, - "data": 0 - }, - { - "name": "minecraft:lava_cauldron", - "id": 465, - "data": 1 - }, - { - "name": "minecraft:lava_cauldron", - "id": 465, - "data": 2 - }, - { - "name": "minecraft:lava_cauldron", - "id": 465, - "data": 3 - }, - { - "name": "minecraft:lava_cauldron", - "id": 465, - "data": 4 - }, - { - "name": "minecraft:lava_cauldron", - "id": 465, - "data": 5 - }, - { - "name": "minecraft:lava_cauldron", - "id": 465, - "data": 6 - }, - { - "name": "minecraft:lava_cauldron", - "id": 465, - "data": 7 - }, - { - "name": "minecraft:lava_cauldron", - "id": 465, - "data": 8 - }, - { - "name": "minecraft:lava_cauldron", - "id": 465, - "data": 9 - }, - { - "name": "minecraft:lava_cauldron", - "id": 465, - "data": 10 - }, - { - "name": "minecraft:lava_cauldron", - "id": 465, - "data": 11 - }, - { - "name": "minecraft:lava_cauldron", - "id": 465, - "data": 12 - }, - { - "name": "minecraft:lava_cauldron", - "id": 465, - "data": 13 - }, - { - "name": "minecraft:lava_cauldron", - "id": 465, - "data": 14 - }, - { - "name": "minecraft:lava_cauldron", - "id": 465, - "data": 15 - }, - { - "name": "minecraft:jigsaw", - "id": 466, - "data": 0 - }, - { - "name": "minecraft:jigsaw", - "id": 466, - "data": 1 - }, - { - "name": "minecraft:jigsaw", - "id": 466, - "data": 2 - }, - { - "name": "minecraft:jigsaw", - "id": 466, - "data": 3 - }, - { - "name": "minecraft:jigsaw", - "id": 466, - "data": 4 - }, - { - "name": "minecraft:jigsaw", - "id": 466, - "data": 5 - }, - { - "name": "minecraft:jigsaw", - "id": 466, - "data": 6 - }, - { - "name": "minecraft:jigsaw", - "id": 466, - "data": 7 - }, - { - "name": "minecraft:wood", - "id": 467, - "data": 0 - }, - { - "name": "minecraft:wood", - "id": 467, - "data": 1 - }, - { - "name": "minecraft:wood", - "id": 467, - "data": 2 - }, - { - "name": "minecraft:wood", - "id": 467, - "data": 3 - }, - { - "name": "minecraft:wood", - "id": 467, - "data": 4 - }, - { - "name": "minecraft:wood", - "id": 467, - "data": 5 - }, - { - "name": "minecraft:wood", - "id": 467, - "data": 6 - }, - { - "name": "minecraft:wood", - "id": 467, - "data": 7 - }, - { - "name": "minecraft:wood", - "id": 467, - "data": 8 - }, - { - "name": "minecraft:wood", - "id": 467, - "data": 9 - }, - { - "name": "minecraft:wood", - "id": 467, - "data": 10 - }, - { - "name": "minecraft:wood", - "id": 467, - "data": 11 - }, - { - "name": "minecraft:wood", - "id": 467, - "data": 12 - }, - { - "name": "minecraft:wood", - "id": 467, - "data": 13 - }, - { - "name": "minecraft:wood", - "id": 467, - "data": 14 - }, - { - "name": "minecraft:wood", - "id": 467, - "data": 15 - }, - { - "name": "minecraft:composter", - "id": 468, - "data": 0 - }, - { - "name": "minecraft:composter", - "id": 468, - "data": 1 - }, - { - "name": "minecraft:composter", - "id": 468, - "data": 2 - }, - { - "name": "minecraft:composter", - "id": 468, - "data": 3 - }, - { - "name": "minecraft:composter", - "id": 468, - "data": 4 - }, - { - "name": "minecraft:composter", - "id": 468, - "data": 5 - }, - { - "name": "minecraft:composter", - "id": 468, - "data": 6 - }, - { - "name": "minecraft:composter", - "id": 468, - "data": 7 - }, - { - "name": "minecraft:composter", - "id": 468, - "data": 8 - }, - { - "name": "minecraft:composter", - "id": 468, - "data": 9 - }, - { - "name": "minecraft:composter", - "id": 468, - "data": 10 - }, - { - "name": "minecraft:composter", - "id": 468, - "data": 11 - }, - { - "name": "minecraft:composter", - "id": 468, - "data": 12 - }, - { - "name": "minecraft:composter", - "id": 468, - "data": 13 - }, - { - "name": "minecraft:composter", - "id": 468, - "data": 14 - }, - { - "name": "minecraft:composter", - "id": 468, - "data": 15 - }, - { - "name": "minecraft:lit_blast_furnace", - "id": 469, - "data": 0 - }, - { - "name": "minecraft:lit_blast_furnace", - "id": 469, - "data": 1 - }, - { - "name": "minecraft:lit_blast_furnace", - "id": 469, - "data": 2 - }, - { - "name": "minecraft:lit_blast_furnace", - "id": 469, - "data": 3 - }, - { - "name": "minecraft:lit_blast_furnace", - "id": 469, - "data": 4 - }, - { - "name": "minecraft:lit_blast_furnace", - "id": 469, - "data": 5 - }, - { - "name": "minecraft:lit_blast_furnace", - "id": 469, - "data": 6 - }, - { - "name": "minecraft:lit_blast_furnace", - "id": 469, - "data": 7 - } -] \ No newline at end of file From 9b7fe5c8791d354a198b7992057bd9388438f2b3 Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Wed, 30 Oct 2019 21:27:34 -0500 Subject: [PATCH 15/50] Remove init method from previous testing --- .../src/main/java/org/geysermc/connector/GeyserConnector.java | 1 - 1 file changed, 1 deletion(-) diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java index 0197874f..fabed677 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -130,7 +130,6 @@ public class GeyserConnector implements Connector { logger.setDebug(config.isDebugMode()); - Toolbox.init(); TranslatorsInit.start(); commandMap = new GeyserCommandMap(this); From 5fee344743a1bbabb09d59c47c746e6ffb0ef529 Mon Sep 17 00:00:00 2001 From: Redned Date: Sat, 2 Nov 2019 15:50:04 -0500 Subject: [PATCH 16/50] Fix block palette --- .../geysermc/connector/GeyserConnector.java | 2 -- .../network/session/GeyserSession.java | 3 +-- .../org/geysermc/connector/utils/Toolbox.java | 25 ++++++++---------- ...d_palette.dat => runtime_block_states.dat} | Bin 208936 -> 208925 bytes 4 files changed, 12 insertions(+), 18 deletions(-) rename connector/src/main/resources/bedrock/{cached_palette.dat => runtime_block_states.dat} (53%) diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java index fabed677..b294ed34 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -50,7 +50,6 @@ import org.geysermc.connector.plugin.GeyserPluginLoader; import org.geysermc.connector.plugin.GeyserPluginManager; import org.geysermc.connector.thread.PingPassthroughThread; import org.geysermc.connector.utils.FileUtils; -import org.geysermc.connector.utils.Toolbox; import java.io.File; import java.io.IOException; @@ -117,7 +116,6 @@ public class GeyserConnector implements Connector { try { File configFile = FileUtils.fileOrCopiedFromResource("config.yml", (x) -> x.replaceAll("generateduuid", UUID.randomUUID().toString())); - config = FileUtils.loadConfig(configFile, GeyserConfiguration.class); } catch (IOException ex) { logger.severe("Failed to read/create config.yml! Make sure it's up to date and/or readable+writable!", ex); diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java index c7994858..649f6e85 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java @@ -29,7 +29,6 @@ import com.github.steveice10.mc.auth.data.GameProfile; import com.github.steveice10.mc.auth.exception.request.RequestException; import com.github.steveice10.mc.protocol.MinecraftProtocol; import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode; -import com.github.steveice10.mc.protocol.data.game.world.block.BlockFace; import com.github.steveice10.packetlib.Client; import com.github.steveice10.packetlib.event.session.ConnectedEvent; import com.github.steveice10.packetlib.event.session.DisconnectedEvent; @@ -296,7 +295,7 @@ public class GeyserSession implements Player { startGamePacket.setCurrentTick(0); startGamePacket.setEnchantmentSeed(0); startGamePacket.setMultiplayerCorrelationId(""); - startGamePacket.setBlockPalette(Toolbox.CACHED_PALLETE); + startGamePacket.setBlockPalette(Toolbox.BLOCKS); startGamePacket.setItemEntries(Toolbox.ITEMS); startGamePacket.setMovementServerAuthoritative(true); upstream.sendPacket(startGamePacket); 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 f5e9a20d..2d84249b 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java +++ b/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java @@ -21,34 +21,31 @@ import java.util.*; public class Toolbox { public static final Collection ITEMS; - public static ListTag CACHED_PALLETE; + public static ListTag BLOCKS; public static final TIntObjectMap ITEM_ENTRIES; public static final TIntObjectMap BLOCK_ENTRIES; static { - InputStream stream = GeyserConnector.class.getClassLoader().getResourceAsStream("bedrock/cached_palette.dat"); + InputStream stream = GeyserConnector.class.getClassLoader().getResourceAsStream("bedrock/runtime_block_states.dat"); if (stream == null) { - throw new AssertionError("Unable to find cached_palette.dat"); + throw new AssertionError("Unable to find bedrock/runtime_block_states.dat"); } Map blockIdToIdentifier = new HashMap<>(); - CompoundTag tag; + ListTag blocksTag; - NBTInputStream nbtInputStream = NbtUtils.createNetworkReader(stream); + NBTInputStream nbtInputStream = NbtUtils.createReader(stream); try { - tag = (CompoundTag) nbtInputStream.readTag(); - System.out.println(tag.getValue().values()); - System.out.println(tag.getAsList("Palette", CompoundTag.class)); + blocksTag = (ListTag) nbtInputStream.readTag(); nbtInputStream.close(); } catch (Exception ex) { - GeyserLogger.DEFAULT.warning("Failed to get blocks from cached palette, please report this error!"); + GeyserLogger.DEFAULT.warning("Failed to get blocks from runtime block states, please report this error!"); throw new AssertionError(ex); } - List entries = tag.getAsList("Palette", CompoundTag.class); - for (CompoundTag entry : entries) { - String name = entry.getAsString("name"); + for (CompoundTag entry : blocksTag.getValue()) { + String name = entry.getAsCompound("block").getAsString("name"); int id = entry.getAsShort("id"); int data = entry.getAsShort("meta"); @@ -56,7 +53,7 @@ public class Toolbox { GlobalBlockPalette.registerMapping(id << 4 | data); } - CACHED_PALLETE = new ListTag<>("Palette", CompoundTag.class, tag.getAsList("Palette", CompoundTag.class)); + BLOCKS = blocksTag; InputStream stream2 = Toolbox.class.getClassLoader().getResourceAsStream("bedrock/items.json"); if (stream2 == null) { throw new AssertionError("Items Table not found"); @@ -112,7 +109,7 @@ public class Toolbox { for (Map.Entry> itemEntry : blocks.entrySet()) { if (!blockIdToIdentifier.containsKey(itemEntry.getValue().get("bedrock_identifier"))) { - GeyserLogger.DEFAULT.debug("Mapping " + itemEntry.getValue().get("bedrock_identifier") + " does not exist on bedrock edition!"); + GeyserLogger.DEFAULT.debug("Mapping " + itemEntry.getValue().get("bedrock_identifier") + " was not found for bedrock edition!"); blockEntries.put(blockIndex, new BlockEntry(itemEntry.getKey(), blockIndex, 248, 0)); // update block } else { blockEntries.put(blockIndex, new BlockEntry(itemEntry.getKey(), blockIndex, blockIdToIdentifier.get(itemEntry.getValue().get("bedrock_identifier")), (int) itemEntry.getValue().get("bedrock_data"))); diff --git a/connector/src/main/resources/bedrock/cached_palette.dat b/connector/src/main/resources/bedrock/runtime_block_states.dat similarity index 53% rename from connector/src/main/resources/bedrock/cached_palette.dat rename to connector/src/main/resources/bedrock/runtime_block_states.dat index 32c993949174a90f34b2e4003f614796a4588f84..8e49d318789f685b78250bc2db36e5ae675aadb6 100644 GIT binary patch literal 208925 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 literal 208936 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 From a4b2a016f8031a5a37f282ce424fab4cc00c3844 Mon Sep 17 00:00:00 2001 From: Redned Date: Sat, 2 Nov 2019 15:58:50 -0500 Subject: [PATCH 17/50] Set version for pong and StartGamePacket from bedrock packet codec --- .../network/ConnectorServerEventHandler.java | 57 +++++++++---------- .../network/session/GeyserSession.java | 2 +- 2 files changed, 28 insertions(+), 31 deletions(-) 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 f9f12689..da8c8581 100644 --- a/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java +++ b/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java @@ -55,48 +55,45 @@ public class ConnectorServerEventHandler implements BedrockServerEventHandler { @Override public BedrockPong onQuery(InetSocketAddress inetSocketAddress) { - PingEvent pong = new PingEvent(inetSocketAddress); GeyserLogger.DEFAULT.debug(inetSocketAddress + " has pinged you!"); GeyserConfiguration config = connector.getConfig(); - pong.setEdition("MCPE"); - pong.setGameType("Default"); - pong.setNintendoLimited(false); - pong.setProtocolVersion(GeyserConnector.BEDROCK_PACKET_CODEC.getProtocolVersion()); - pong.setVersion("1.12.0"); + PingEvent pongEvent = new PingEvent(inetSocketAddress); + pongEvent.setEdition("MCPE"); + pongEvent.setGameType("Default"); + pongEvent.setNintendoLimited(false); + pongEvent.setProtocolVersion(GeyserConnector.BEDROCK_PACKET_CODEC.getProtocolVersion()); + pongEvent.setVersion(GeyserConnector.BEDROCK_PACKET_CODEC.getMinecraftVersion()); - connector.getPluginManager().runEvent(pong); + connector.getPluginManager().runEvent(pongEvent); if (connector.getConfig().isPingPassthrough()) { ServerStatusInfo serverInfo = connector.getPassthroughThread().getInfo(); if (serverInfo != null) { - pong.setMotd(MessageUtils.getBedrockMessage(serverInfo.getDescription())); - pong.setSubMotd(config.getBedrock().getMotd2()); - pong.setPlayerCount(serverInfo.getPlayerInfo().getOnlinePlayers()); - pong.setMaximumPlayerCount(serverInfo.getPlayerInfo().getMaxPlayers()); + pongEvent.setMotd(MessageUtils.getBedrockMessage(serverInfo.getDescription())); + pongEvent.setSubMotd(config.getBedrock().getMotd2()); + pongEvent.setPlayerCount(serverInfo.getPlayerInfo().getOnlinePlayers()); + pongEvent.setMaximumPlayerCount(serverInfo.getPlayerInfo().getMaxPlayers()); } } else { - pong.setPlayerCount(1); - pong.setMaximumPlayerCount(config.getMaxPlayers()); - pong.setMotd(config.getBedrock().getMotd1()); - pong.setSubMotd(config.getBedrock().getMotd2()); + pongEvent.setPlayerCount(1); + pongEvent.setMaximumPlayerCount(config.getMaxPlayers()); + pongEvent.setMotd(config.getBedrock().getMotd1()); + pongEvent.setSubMotd(config.getBedrock().getMotd2()); } - BedrockPong c = new BedrockPong(); - - c.setEdition(pong.getEdition()); - c.setGameType(pong.getGameType()); - c.setNintendoLimited(pong.isNintendoLimited()); - c.setProtocolVersion(pong.getProtocolVersion()); - c.setVersion(pong.getVersion()); - - c.setMotd(pong.getMotd()); - c.setSubMotd(pong.getSubMotd()); - c.setPlayerCount(pong.getPlayerCount()); - c.setMaximumPlayerCount(pong.getMaximumPlayerCount()); - c.setIpv4Port(config.getBedrock().getPort()); - - return c; + BedrockPong pong = new BedrockPong(); + pong.setEdition(pongEvent.getEdition()); + pong.setGameType(pongEvent.getGameType()); + pong.setNintendoLimited(pongEvent.isNintendoLimited()); + pong.setProtocolVersion(pongEvent.getProtocolVersion()); + pong.setVersion(pongEvent.getVersion()); + pong.setMotd(pongEvent.getMotd()); + pong.setSubMotd(pongEvent.getSubMotd()); + pong.setPlayerCount(pongEvent.getPlayerCount()); + pong.setMaximumPlayerCount(pongEvent.getMaximumPlayerCount()); + pong.setIpv4Port(config.getBedrock().getPort()); + return pong; } @Override diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java index 649f6e85..63547416 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java @@ -297,7 +297,7 @@ public class GeyserSession implements Player { startGamePacket.setMultiplayerCorrelationId(""); startGamePacket.setBlockPalette(Toolbox.BLOCKS); startGamePacket.setItemEntries(Toolbox.ITEMS); - startGamePacket.setMovementServerAuthoritative(true); + startGamePacket.setVanillaVersion(GeyserConnector.BEDROCK_PACKET_CODEC.getMinecraftVersion()); upstream.sendPacket(startGamePacket); PlayStatusPacket playStatusPacket = new PlayStatusPacket(); From 18c13067b894c179fa5c9d23bd0aceed7d267f4e Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Sat, 2 Nov 2019 16:14:28 -0500 Subject: [PATCH 18/50] Set version for ResourcePackStackPacket --- .../connector/network/UpstreamPacketHandler.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java b/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java index c4e6f92b..4990280b 100644 --- a/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java +++ b/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java @@ -45,7 +45,6 @@ public class UpstreamPacketHandler extends LoggingPacketHandler { @Override public boolean handle(LoginPacket loginPacket) { - // TODO: Implement support for multiple protocols if (loginPacket.getProtocolVersion() != GeyserConnector.BEDROCK_PACKET_CODEC.getProtocolVersion()) { connector.getLogger().debug("unsupported"); session.getUpstream().disconnect("Unsupported Bedrock version. Are you running an outdated version?"); @@ -56,16 +55,16 @@ public class UpstreamPacketHandler extends LoggingPacketHandler { PlayStatusPacket playStatus = new PlayStatusPacket(); playStatus.setStatus(PlayStatusPacket.Status.LOGIN_SUCCESS); - session.getUpstream().sendPacketImmediately(playStatus); + session.getUpstream().sendPacket(playStatus); ResourcePacksInfoPacket resourcePacksInfo = new ResourcePacksInfoPacket(); - session.getUpstream().sendPacketImmediately(resourcePacksInfo); + session.getUpstream().sendPacket(resourcePacksInfo); return true; } @Override - public boolean handle(ResourcePackClientResponsePacket textPacket) { - switch (textPacket.getStatus()) { + public boolean handle(ResourcePackClientResponsePacket packet) { + switch (packet.getStatus()) { case COMPLETED: session.connect(connector.getRemoteServer()); connector.getLogger().info("Player connected with username " + session.getAuthenticationData().getName()); @@ -74,7 +73,8 @@ public class UpstreamPacketHandler extends LoggingPacketHandler { ResourcePackStackPacket stack = new ResourcePackStackPacket(); stack.setExperimental(false); stack.setForcedToAccept(false); - session.getUpstream().sendPacketImmediately(stack); + stack.setGameVersion(GeyserConnector.BEDROCK_PACKET_CODEC.getMinecraftVersion()); + session.getUpstream().sendPacket(stack); break; default: session.getUpstream().disconnect("disconnectionScreen.resourcePack"); From 90e6ebc1bed9c3a262fbe8d9c093655bffb531f5 Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Tue, 5 Nov 2019 18:55:59 -0600 Subject: [PATCH 19/50] More work on 1.13 --- .../geysermc/connector/GeyserConnector.java | 2 ++ .../network/session/GeyserSession.java | 30 +++++++++++++++---- .../java/JavaJoinGameTranslator.java | 23 ++++++++------ .../org/geysermc/connector/utils/BiValue.java | 12 -------- .../geysermc/connector/utils/SkinUtils.java | 13 +++++--- .../org/geysermc/connector/utils/Toolbox.java | 27 +++++------------ 6 files changed, 57 insertions(+), 50 deletions(-) delete mode 100644 connector/src/main/java/org/geysermc/connector/utils/BiValue.java diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java index b294ed34..67c0b709 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -50,6 +50,7 @@ import org.geysermc.connector.plugin.GeyserPluginLoader; import org.geysermc.connector.plugin.GeyserPluginManager; import org.geysermc.connector.thread.PingPassthroughThread; import org.geysermc.connector.utils.FileUtils; +import org.geysermc.connector.utils.Toolbox; import java.io.File; import java.io.IOException; @@ -128,6 +129,7 @@ public class GeyserConnector implements Connector { logger.setDebug(config.isDebugMode()); + Toolbox.init(); TranslatorsInit.start(); commandMap = new GeyserCommandMap(this); diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java index 63547416..b0ff126d 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java @@ -43,6 +43,7 @@ import com.nukkitx.math.vector.Vector3i; import com.nukkitx.protocol.bedrock.BedrockServerSession; import com.nukkitx.protocol.bedrock.data.GamePublishSetting; import com.nukkitx.protocol.bedrock.data.GameRule; +import com.nukkitx.protocol.bedrock.packet.LevelChunkPacket; import com.nukkitx.protocol.bedrock.packet.PlayStatusPacket; import com.nukkitx.protocol.bedrock.packet.StartGamePacket; import com.nukkitx.protocol.bedrock.packet.TextPacket; @@ -57,7 +58,9 @@ import org.geysermc.connector.entity.PlayerEntity; import org.geysermc.connector.inventory.PlayerInventory; import org.geysermc.connector.network.session.cache.*; import org.geysermc.connector.network.translators.Registry; +import org.geysermc.connector.network.translators.TranslatorsInit; import org.geysermc.connector.utils.Toolbox; +import org.geysermc.connector.world.chunk.ChunkPosition; import java.net.InetSocketAddress; import java.util.UUID; @@ -119,14 +122,33 @@ public class GeyserSession implements Player { } public void connect(RemoteServer remoteServer) { - // This has to be sent first so the player actually joins startGame(); - this.remoteServer = remoteServer; if (!(connector.getConfig().getRemote().getAuthType().hashCode() == "online".hashCode())) { connector.getLogger().info("Attempting to login using offline mode... authentication is disabled."); authenticate(authenticationData.getName()); } + + Vector3f pos = Vector3f.ZERO; + int chunkX = pos.getFloorX() >> 4; + int chunkZ = pos.getFloorZ() >> 4; + for (int x = -3; x < 3; x++) { + for (int z = -3; z < 3; z++) { + LevelChunkPacket data = new LevelChunkPacket(); + data.setChunkX(chunkX + x); + data.setChunkZ(chunkZ + z); + data.setSubChunksLength(0); + data.setData(TranslatorsInit.EMPTY_LEVEL_CHUNK_DATA); + upstream.sendPacket(data); + } + } + + PlayStatusPacket playStatusPacket = new PlayStatusPacket(); + playStatusPacket.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN); + upstream.sendPacket(playStatusPacket); + + System.out.println("play status sent"); + System.out.println(playerEntity.getPosition()); } public void authenticate(String username) { @@ -299,9 +321,5 @@ public class GeyserSession implements Player { startGamePacket.setItemEntries(Toolbox.ITEMS); startGamePacket.setVanillaVersion(GeyserConnector.BEDROCK_PACKET_CODEC.getMinecraftVersion()); upstream.sendPacket(startGamePacket); - - PlayStatusPacket playStatusPacket = new PlayStatusPacket(); - playStatusPacket.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN); - upstream.sendPacket(playStatusPacket); } } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaJoinGameTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaJoinGameTranslator.java index 3c5a45bf..11644a08 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaJoinGameTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaJoinGameTranslator.java @@ -26,10 +26,17 @@ package org.geysermc.connector.network.translators.java; import com.github.steveice10.mc.protocol.packet.ingame.server.ServerJoinGamePacket; -import com.nukkitx.protocol.bedrock.packet.*; +import com.nukkitx.math.vector.Vector3i; +import com.nukkitx.protocol.bedrock.packet.AdventureSettingsPacket; +import com.nukkitx.protocol.bedrock.packet.ChunkRadiusUpdatedPacket; +import com.nukkitx.protocol.bedrock.packet.PlayStatusPacket; +import com.nukkitx.protocol.bedrock.packet.SetEntityDataPacket; +import com.nukkitx.protocol.bedrock.packet.SetPlayerGameTypePacket; + import org.geysermc.connector.entity.PlayerEntity; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; +import org.geysermc.connector.world.chunk.ChunkPosition; public class JavaJoinGameTranslator extends PacketTranslator { @@ -38,16 +45,14 @@ public class JavaJoinGameTranslator extends PacketTranslator 32) session.setRenderDistance(32); // <3 u ViaVersion but I don't like crashing clients x) - ChunkRadiusUpdatedPacket packet1 = new ChunkRadiusUpdatedPacket(); - packet1.setRadius(session.getRenderDistance()); - session.getUpstream().sendPacket(packet1); + ChunkRadiusUpdatedPacket chunkRadiusPacket = new ChunkRadiusUpdatedPacket(); + chunkRadiusPacket.setRadius(session.getRenderDistance()); + session.getUpstream().sendPacket(chunkRadiusPacket); session.setSpawned(true); } diff --git a/connector/src/main/java/org/geysermc/connector/utils/BiValue.java b/connector/src/main/java/org/geysermc/connector/utils/BiValue.java deleted file mode 100644 index 6ea88c4e..00000000 --- a/connector/src/main/java/org/geysermc/connector/utils/BiValue.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.geysermc.connector.utils; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@AllArgsConstructor(access = AccessLevel.PUBLIC) -@Getter -public class BiValue { - private F f; - private S s; -} diff --git a/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java b/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java index 66d6f9ec..9bca433c 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java @@ -27,7 +27,7 @@ public class SkinUtils { profile.getIdAsString(), SkinProvider.getCachedSkin(profile.getId()).getSkinData(), SkinProvider.getCachedCape(data.getCapeUrl()).getCapeData(), - "geometry.humanoid.custom" + (data.isAlex() ? "Slim" : ""), + getLegacySkinGeometry("geometry.humanoid.custom" + (data.isAlex() ? "Slim" : "")), "" ); } @@ -40,7 +40,7 @@ public class SkinUtils { profile.getIdAsString(), SkinProvider.STEVE_SKIN, SkinProvider.EMPTY_CAPE.getCapeData(), - "geometry.humanoid", + getLegacySkinGeometry("geometry.humanoid"), "" ); } @@ -48,7 +48,7 @@ public class SkinUtils { public static PlayerListPacket.Entry buildEntryManually(UUID uuid, String username, long geyserId, String skinId, byte[] skinData, byte[] capeData, String geometryName, String geometryData) { - SerializedSkin serializedSkin = SerializedSkin.of(skinId, ImageData.of(skinData), ImageData.of(capeData), geometryName, geometryData, true); + SerializedSkin serializedSkin = SerializedSkin.of(skinId, ImageData.of(32, 64, skinData), ImageData.of(32, 64, capeData), geometryName, geometryData, true); PlayerListPacket.Entry entry = new PlayerListPacket.Entry(uuid); entry.setName(username); @@ -56,6 +56,7 @@ public class SkinUtils { entry.setSkin(serializedSkin); entry.setXuid(""); entry.setPlatformChatId(""); + entry.setTeacher(false); return entry; } @@ -122,7 +123,7 @@ public class SkinUtils { entity.getUuid().toString(), skin.getSkinData(), cape.getCapeData(), - "geometry.humanoid.custom" + (data.isAlex() ? "Slim" : ""), + getLegacySkinGeometry("geometry.humanoid.custom" + (data.isAlex() ? "Slim" : "")), "" ); @@ -145,4 +146,8 @@ public class SkinUtils { }); }); } + + private static String getLegacySkinGeometry(String geometryName) { + return "{\"geometry\" :{\"default\" :\"" + geometryName + "\"}}"; + } } 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 2d84249b..0b895c34 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java +++ b/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java @@ -20,13 +20,13 @@ import java.util.*; public class Toolbox { - public static final Collection ITEMS; + public static final Collection ITEMS = new ArrayList<>(); public static ListTag BLOCKS; - public static final TIntObjectMap ITEM_ENTRIES; - public static final TIntObjectMap BLOCK_ENTRIES; + public static final TIntObjectMap ITEM_ENTRIES = new TIntObjectHashMap<>(); + public static final TIntObjectMap BLOCK_ENTRIES = new TIntObjectHashMap<>(); - static { + public static void init() { InputStream stream = GeyserConnector.class.getClassLoader().getResourceAsStream("bedrock/runtime_block_states.dat"); if (stream == null) { throw new AssertionError("Unable to find bedrock/runtime_block_states.dat"); @@ -67,13 +67,10 @@ public class Toolbox { e.printStackTrace(); } - List startGameEntries = new ArrayList<>(); for (Map entry : startGameItems) { - startGameEntries.add(new StartGamePacket.ItemEntry((String) entry.get("name"), (short) ((int) entry.get("id")))); + ITEMS.add(new StartGamePacket.ItemEntry((String) entry.get("name"), (short) ((int) entry.get("id")))); } - ITEMS = startGameEntries; - InputStream itemStream = Toolbox.class.getClassLoader().getResourceAsStream("items.json"); ObjectMapper itemMapper = new ObjectMapper(); Map> items = new HashMap<>(); @@ -84,16 +81,12 @@ public class Toolbox { ex.printStackTrace(); } - TIntObjectMap itemEntries = new TIntObjectHashMap<>(); int itemIndex = 0; - for (Map.Entry> itemEntry : items.entrySet()) { - itemEntries.put(itemIndex, new ItemEntry(itemEntry.getKey(), itemIndex, (int) itemEntry.getValue().get("bedrock_id"), (int) itemEntry.getValue().get("bedrock_data"))); + ITEM_ENTRIES.put(itemIndex, new ItemEntry(itemEntry.getKey(), itemIndex, (int) itemEntry.getValue().get("bedrock_id"), (int) itemEntry.getValue().get("bedrock_data"))); itemIndex++; } - ITEM_ENTRIES = itemEntries; - InputStream blockStream = Toolbox.class.getClassLoader().getResourceAsStream("blocks.json"); ObjectMapper blockMapper = new ObjectMapper(); Map> blocks = new HashMap<>(); @@ -104,20 +97,16 @@ public class Toolbox { ex.printStackTrace(); } - TIntObjectMap blockEntries = new TIntObjectHashMap<>(); int blockIndex = 0; - for (Map.Entry> itemEntry : blocks.entrySet()) { if (!blockIdToIdentifier.containsKey(itemEntry.getValue().get("bedrock_identifier"))) { GeyserLogger.DEFAULT.debug("Mapping " + itemEntry.getValue().get("bedrock_identifier") + " was not found for bedrock edition!"); - blockEntries.put(blockIndex, new BlockEntry(itemEntry.getKey(), blockIndex, 248, 0)); // update block + BLOCK_ENTRIES.put(blockIndex, new BlockEntry(itemEntry.getKey(), blockIndex, 248, 0)); // update block } else { - blockEntries.put(blockIndex, new BlockEntry(itemEntry.getKey(), blockIndex, blockIdToIdentifier.get(itemEntry.getValue().get("bedrock_identifier")), (int) itemEntry.getValue().get("bedrock_data"))); + BLOCK_ENTRIES.put(blockIndex, new BlockEntry(itemEntry.getKey(), blockIndex, blockIdToIdentifier.get(itemEntry.getValue().get("bedrock_identifier")), (int) itemEntry.getValue().get("bedrock_data"))); } blockIndex++; } - - BLOCK_ENTRIES = blockEntries; } } \ No newline at end of file From 21ddf8af1e7bc86786a6d8d036e5a2eaa8f6032c Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Sat, 9 Nov 2019 11:14:31 -0600 Subject: [PATCH 20/50] Update block palette --- .../network/session/GeyserSession.java | 1 - .../org/geysermc/connector/utils/Toolbox.java | 2 +- .../bedrock/runtime_block_states.dat | Bin 208925 -> 319351 bytes 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java index b0ff126d..4a513236 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java @@ -60,7 +60,6 @@ import org.geysermc.connector.network.session.cache.*; import org.geysermc.connector.network.translators.Registry; import org.geysermc.connector.network.translators.TranslatorsInit; import org.geysermc.connector.utils.Toolbox; -import org.geysermc.connector.world.chunk.ChunkPosition; import java.net.InetSocketAddress; import java.util.UUID; 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 0b895c34..db873900 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java +++ b/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java @@ -35,7 +35,7 @@ public class Toolbox { Map blockIdToIdentifier = new HashMap<>(); ListTag blocksTag; - NBTInputStream nbtInputStream = NbtUtils.createReader(stream); + NBTInputStream nbtInputStream = NbtUtils.createNetworkReader(stream); try { blocksTag = (ListTag) nbtInputStream.readTag(); nbtInputStream.close(); diff --git a/connector/src/main/resources/bedrock/runtime_block_states.dat b/connector/src/main/resources/bedrock/runtime_block_states.dat index 8e49d318789f685b78250bc2db36e5ae675aadb6..a0623f43e58e6120fbf110852751fd04e52518b0 100644 GIT binary patch literal 319351 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 From e676a428fb1a347ea9485e3b638e25afff4a2add Mon Sep 17 00:00:00 2001 From: AJ Ferguson Date: Sun, 10 Nov 2019 03:41:39 -0900 Subject: [PATCH 21/50] Fix dropped items --- .../java/entity/JavaEntityMetadataTranslator.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityMetadataTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityMetadataTranslator.java index ff84a629..f19a2912 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityMetadataTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityMetadataTranslator.java @@ -26,13 +26,17 @@ package org.geysermc.connector.network.translators.java.entity; import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.mc.protocol.data.game.entity.metadata.MetadataType; import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityMetadataPacket; import com.nukkitx.protocol.bedrock.data.EntityFlag; +import com.nukkitx.protocol.bedrock.packet.AddItemEntityPacket; import com.nukkitx.protocol.bedrock.packet.SetEntityDataPacket; import org.geysermc.connector.entity.Entity; +import org.geysermc.connector.entity.type.EntityType; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; +import org.geysermc.connector.network.translators.TranslatorsInit; public class JavaEntityMetadataTranslator extends PacketTranslator { @@ -51,6 +55,17 @@ public class JavaEntityMetadataTranslator extends PacketTranslator Date: Sun, 10 Nov 2019 16:53:01 -0600 Subject: [PATCH 22/50] Attempt to fix crashes on login --- .../network/LoggingPacketHandler.java | 45 +++++++++++++++++++ .../network/session/GeyserSession.java | 24 +++++++--- .../network/session/UpstreamSession.java | 2 +- .../java/JavaJoinGameTranslator.java | 2 +- .../java/JavaRespawnTranslator.java | 2 + .../player/JavaPlayerHealthTranslator.java | 4 +- .../geysermc/connector/utils/SkinUtils.java | 2 +- 7 files changed, 70 insertions(+), 11 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/LoggingPacketHandler.java b/connector/src/main/java/org/geysermc/connector/network/LoggingPacketHandler.java index c46aa66e..dc40fc49 100644 --- a/connector/src/main/java/org/geysermc/connector/network/LoggingPacketHandler.java +++ b/connector/src/main/java/org/geysermc/connector/network/LoggingPacketHandler.java @@ -716,4 +716,49 @@ public class LoggingPacketHandler implements BedrockPacketHandler { public boolean handle(VideoStreamConnectPacket packet) { return defaultHandler(packet); } + + @Override + public boolean handle(EmotePacket packet) { + return defaultHandler(packet); + } + + @Override + public boolean handle(TickSyncPacket packet) { + return defaultHandler(packet); + } + + @Override + public boolean handle(AnvilDamagePacket packet) { + return defaultHandler(packet); + } + + @Override + public boolean handle(NetworkSettingsPacket packet) { + return defaultHandler(packet); + } + + @Override + public boolean handle(PlayerAuthInputPacket packet) { + return defaultHandler(packet); + } + + @Override + public boolean handle(SettingsCommandPacket packet) { + return defaultHandler(packet); + } + + @Override + public boolean handle(EducationSettingsPacket packet) { + return defaultHandler(packet); + } + + @Override + public boolean handle(CompletedUsingItemPacket packet) { + return defaultHandler(packet); + } + + @Override + public boolean handle(MultiplayerSettingsPacket packet) { + return defaultHandler(packet); + } } \ No newline at end of file diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java index 4a513236..bfe3d4ce 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java @@ -43,7 +43,10 @@ import com.nukkitx.math.vector.Vector3i; import com.nukkitx.protocol.bedrock.BedrockServerSession; import com.nukkitx.protocol.bedrock.data.GamePublishSetting; import com.nukkitx.protocol.bedrock.data.GameRule; +import com.nukkitx.protocol.bedrock.packet.AvailableEntityIdentifiersPacket; +import com.nukkitx.protocol.bedrock.packet.BiomeDefinitionListPacket; import com.nukkitx.protocol.bedrock.packet.LevelChunkPacket; +import com.nukkitx.protocol.bedrock.packet.NetworkChunkPublisherUpdatePacket; import com.nukkitx.protocol.bedrock.packet.PlayStatusPacket; import com.nukkitx.protocol.bedrock.packet.StartGamePacket; import com.nukkitx.protocol.bedrock.packet.TextPacket; @@ -131,8 +134,13 @@ public class GeyserSession implements Player { Vector3f pos = Vector3f.ZERO; int chunkX = pos.getFloorX() >> 4; int chunkZ = pos.getFloorZ() >> 4; - for (int x = -3; x < 3; x++) { - for (int z = -3; z < 3; z++) { + for (int x = -5; x < 5; x++) { + for (int z = -5; z < 5; z++) { + NetworkChunkPublisherUpdatePacket chunkPublisherUpdatePacket = new NetworkChunkPublisherUpdatePacket(); + chunkPublisherUpdatePacket.setPosition(pos.toInt()); + chunkPublisherUpdatePacket.setRadius(renderDistance << 4); + upstream.sendPacket(chunkPublisherUpdatePacket); + LevelChunkPacket data = new LevelChunkPacket(); data.setChunkX(chunkX + x); data.setChunkZ(chunkZ + z); @@ -142,6 +150,9 @@ public class GeyserSession implements Player { } } + upstream.sendPacket(new BiomeDefinitionListPacket()); + upstream.sendPacket(new AvailableEntityIdentifiersPacket()); + PlayStatusPacket playStatusPacket = new PlayStatusPacket(); playStatusPacket.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN); upstream.sendPacket(playStatusPacket); @@ -279,15 +290,15 @@ public class GeyserSession implements Player { startGamePacket.setPlayerPosition(Vector3f.from(0, 69, 0)); startGamePacket.setRotation(Vector2f.from(1, 1)); - startGamePacket.setSeed(0); + startGamePacket.setSeed(-1); startGamePacket.setDimensionId(playerEntity.getDimension()); startGamePacket.setGeneratorId(1); startGamePacket.setLevelGamemode(0); startGamePacket.setDifficulty(1); startGamePacket.setDefaultSpawn(Vector3i.ZERO); startGamePacket.setAcheivementsDisabled(true); - startGamePacket.setTime(0); - startGamePacket.setEduLevel(false); + startGamePacket.setTime(-1); + startGamePacket.setEduEditionOffers(0); startGamePacket.setEduFeaturesEnabled(false); startGamePacket.setRainLevel(0); startGamePacket.setLightningLevel(0); @@ -313,12 +324,13 @@ public class GeyserSession implements Player { startGamePacket.setLevelId("world"); startGamePacket.setWorldName("world"); startGamePacket.setPremiumWorldTemplateId("00000000-0000-0000-0000-000000000000"); - startGamePacket.setCurrentTick(0); + // startGamePacket.setCurrentTick(0); startGamePacket.setEnchantmentSeed(0); startGamePacket.setMultiplayerCorrelationId(""); startGamePacket.setBlockPalette(Toolbox.BLOCKS); startGamePacket.setItemEntries(Toolbox.ITEMS); startGamePacket.setVanillaVersion(GeyserConnector.BEDROCK_PACKET_CODEC.getMinecraftVersion()); + // startGamePacket.setMovementServerAuthoritative(true); upstream.sendPacket(startGamePacket); } } diff --git a/connector/src/main/java/org/geysermc/connector/network/session/UpstreamSession.java b/connector/src/main/java/org/geysermc/connector/network/session/UpstreamSession.java index d14ff752..5992592f 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/UpstreamSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/UpstreamSession.java @@ -18,7 +18,7 @@ public class UpstreamSession { public void sendPacket(@NonNull BedrockPacket packet) { if (isClosed()) return; - + session.sendPacket(packet); } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaJoinGameTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaJoinGameTranslator.java index 11644a08..87bb62e0 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaJoinGameTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaJoinGameTranslator.java @@ -49,7 +49,7 @@ public class JavaJoinGameTranslator extends PacketTranslator session.getUpstream().sendPacket(playerGameTypePacket); session.setGameMode(packet.getGamemode()); + /* PlayStatusPacket playStatusPacket = new PlayStatusPacket(); playStatusPacket.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN); session.getUpstream().sendPacket(playStatusPacket); + */ } private int getDimension(int javaDimension) { diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerHealthTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerHealthTranslator.java index b5b655ea..1abd4c1c 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerHealthTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerHealthTranslator.java @@ -63,8 +63,8 @@ public class JavaPlayerHealthTranslator extends PacketTranslator Date: Tue, 12 Nov 2019 22:28:47 -0600 Subject: [PATCH 23/50] Minor cleanup --- .../org/geysermc/connector/GeyserConnector.java | 1 - .../geysermc/connector/console/GeyserLogger.java | 15 --------------- .../connector/network/session/GeyserSession.java | 3 +-- 3 files changed, 1 insertion(+), 18 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java index 67c0b709..cc16f70e 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -97,7 +97,6 @@ public class GeyserConnector implements Connector { } private GeyserConnector() { - long startupTime = System.currentTimeMillis(); // Metric diff --git a/connector/src/main/java/org/geysermc/connector/console/GeyserLogger.java b/connector/src/main/java/org/geysermc/connector/console/GeyserLogger.java index 0ff122ea..7634debc 100644 --- a/connector/src/main/java/org/geysermc/connector/console/GeyserLogger.java +++ b/connector/src/main/java/org/geysermc/connector/console/GeyserLogger.java @@ -90,55 +90,40 @@ public class GeyserLogger implements org.geysermc.api.logger.Logger { @Override public void severe(String message) { - waitFor(); System.out.println(printConsole(ChatColor.DARK_RED + message, colored)); } @Override public void severe(String message, Throwable error) { - waitFor(); System.out.println(printConsole(ChatColor.DARK_RED + message + "\n" + error.getMessage(), colored)); } @Override public void error(String message) { - waitFor(); System.out.println(printConsole(ChatColor.RED + message, colored)); } @Override public void error(String message, Throwable error) { - waitFor(); System.out.println(printConsole(ChatColor.RED + message + "\n" + error, colored)); } @Override public void warning(String message) { - waitFor(); System.out.println(printConsole(ChatColor.YELLOW + message, colored)); } @Override public void info(String message) { - waitFor(); System.out.println(printConsole(ChatColor.WHITE + message, colored)); } @Override public void debug(String message) { - waitFor(); - if (debug) System.out.println(printConsole(ChatColor.GRAY + message, colored)); } - private synchronized void waitFor() { - - } - - public void stop() { - } - public static String printConsole(String message, boolean colors) { return colors ? ChatColor.toANSI(message + ChatColor.RESET) : ChatColor.stripColors(message + ChatColor.RESET); } diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java index bfe3d4ce..0a619e92 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java @@ -157,8 +157,7 @@ public class GeyserSession implements Player { playStatusPacket.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN); upstream.sendPacket(playStatusPacket); - System.out.println("play status sent"); - System.out.println(playerEntity.getPosition()); + connector.getLogger().debug("play status sent"); } public void authenticate(String username) { From ddd0400b57e8f93db86e5b06ab4449996466f357 Mon Sep 17 00:00:00 2001 From: EOT3000 <43685885+EOT3000@users.noreply.github.com> Date: Wed, 13 Nov 2019 09:48:13 -0500 Subject: [PATCH 24/50] VERSION is always 1.0-SNAPSHOT --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 45f3f919..af9314c6 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -27,7 +27,7 @@ If applicable, add screenshots to help explain your problem. run /version **Geyser version** -Not yet +Jenkins **Bedrock version** The version of your Minecraft pe From a0c4d593149d6f135fcafc642d84058b4cfe2ed9 Mon Sep 17 00:00:00 2001 From: AJ Ferguson Date: Wed, 13 Nov 2019 17:26:14 -0900 Subject: [PATCH 25/50] Fix 'runtime_block_states.dat' not being read correctly --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3538fe1e..79b7b5a1 100644 --- a/pom.xml +++ b/pom.xml @@ -88,7 +88,7 @@ src/main/resources/ - true + false From 7d4cb06fbe1581ceb9bedddfc471c076ac39010a Mon Sep 17 00:00:00 2001 From: AJ Ferguson Date: Wed, 13 Nov 2019 17:26:45 -0900 Subject: [PATCH 26/50] Fix crash on login --- .../connector/network/session/GeyserSession.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java index 0a619e92..b5be8cbc 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java @@ -40,6 +40,7 @@ import com.nukkitx.math.vector.Vector2f; import com.nukkitx.math.vector.Vector2i; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3i; +import com.nukkitx.nbt.tag.CompoundTag; import com.nukkitx.protocol.bedrock.BedrockServerSession; import com.nukkitx.protocol.bedrock.data.GamePublishSetting; import com.nukkitx.protocol.bedrock.data.GameRule; @@ -150,8 +151,12 @@ public class GeyserSession implements Player { } } - upstream.sendPacket(new BiomeDefinitionListPacket()); - upstream.sendPacket(new AvailableEntityIdentifiersPacket()); + BiomeDefinitionListPacket biomePacket = new BiomeDefinitionListPacket(); + biomePacket.setTag(CompoundTag.EMPTY); + upstream.sendPacket(biomePacket); + AvailableEntityIdentifiersPacket entityPacket = new AvailableEntityIdentifiersPacket(); + entityPacket.setTag(CompoundTag.EMPTY); + upstream.sendPacket(entityPacket); PlayStatusPacket playStatusPacket = new PlayStatusPacket(); playStatusPacket.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN); From 38ae400d0c31d9cafaf879d9c0b8714270368601 Mon Sep 17 00:00:00 2001 From: LegacyGamerHD Date: Fri, 15 Nov 2019 04:04:30 +0100 Subject: [PATCH 27/50] add phew entity flags (#79) * Add some entity flags * goddangit stupid web editor * whoops (Some information pulled from BMan's pull request for flags) --- .../java/entity/JavaEntityMetadataTranslator.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityMetadataTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityMetadataTranslator.java index f19a2912..1d001480 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityMetadataTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityMetadataTranslator.java @@ -53,8 +53,11 @@ public class JavaEntityMetadataTranslator extends PacketTranslator Date: Thu, 14 Nov 2019 21:07:22 -0600 Subject: [PATCH 28/50] Fix tabs in formatting from previous commit --- .../java/entity/JavaEntityMetadataTranslator.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityMetadataTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityMetadataTranslator.java index 1d001480..a21b2f86 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityMetadataTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityMetadataTranslator.java @@ -53,11 +53,11 @@ public class JavaEntityMetadataTranslator extends PacketTranslator Date: Fri, 15 Nov 2019 21:25:43 -0600 Subject: [PATCH 29/50] Fix players not showing up Skins still need some work as it applies to every player online rather than a specific player; however, players are now visible regardless. --- .../org/geysermc/connector/utils/ProvidedSkin.java | 11 ++++++----- .../java/org/geysermc/connector/utils/SkinUtils.java | 12 +++++++++++- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/utils/ProvidedSkin.java b/connector/src/main/java/org/geysermc/connector/utils/ProvidedSkin.java index 007a9557..71bf2984 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/ProvidedSkin.java +++ b/connector/src/main/java/org/geysermc/connector/utils/ProvidedSkin.java @@ -3,6 +3,7 @@ package org.geysermc.connector.utils; import lombok.Getter; import javax.imageio.ImageIO; +import java.awt.Color; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -18,11 +19,11 @@ public class ProvidedSkin { try { for (int y = 0; y < image.getHeight(); y++) { for (int x = 0; x < image.getWidth(); x++) { - int rgba = image.getRGB(x, y); - outputStream.write((rgba >> 16) & 0xFF); - outputStream.write((rgba >> 8) & 0xFF); - outputStream.write(rgba & 0xFF); - outputStream.write((rgba >> 24) & 0xFF); + Color color = new Color(image.getRGB(x, y), true); + outputStream.write(color.getRed()); + outputStream.write(color.getGreen()); + outputStream.write(color.getBlue()); + outputStream.write(color.getAlpha()); } } image.flush(); diff --git a/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java b/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java index 08b9ed1f..988501b8 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java @@ -13,6 +13,7 @@ import org.geysermc.connector.entity.PlayerEntity; import org.geysermc.connector.network.session.GeyserSession; import java.util.Base64; +import java.util.Collections; import java.util.UUID; import java.util.function.Consumer; @@ -48,7 +49,16 @@ public class SkinUtils { public static PlayerListPacket.Entry buildEntryManually(UUID uuid, String username, long geyserId, String skinId, byte[] skinData, byte[] capeData, String geometryName, String geometryData) { - SerializedSkin serializedSkin = SerializedSkin.of(skinId, ImageData.of(64, 64, skinData), ImageData.of(64, 32, capeData), geometryName, geometryData, true); + if (skinData == null || skinData.length == 0) { + skinData = SkinProvider.EMPTY_SKIN.getSkinData(); + } + + if (capeData == null || capeData.length == 0) { + capeData = SkinProvider.EMPTY_CAPE.getCapeData(); + } + + SerializedSkin serializedSkin = SerializedSkin.of(skinId, geometryName, ImageData.of(64, 64, skinData), + Collections.emptyList(), ImageData.of(64, 32, capeData), geometryData, "", true, false, false, "", ""); PlayerListPacket.Entry entry = new PlayerListPacket.Entry(uuid); entry.setName(username); From 73c9ee313c403bad0302edd3b2577d985846b0df Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Fri, 15 Nov 2019 22:10:23 -0600 Subject: [PATCH 30/50] Add fox entity type --- .../java/org/geysermc/connector/entity/type/EntityType.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java b/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java index af95536c..88414531 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java +++ b/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java @@ -135,7 +135,8 @@ public enum EntityType { DROWNED(110, 1.95f, 0.6f), TROPICAL_FISH(111, 0.6f, 0.6f), COD(112, 0.25f, 0.5f), - PANDA(113, 1.25f, 1.125f, 1.825f); + PANDA(113, 1.25f, 1.125f, 1.825f), + FOX(121, 0.5f, 1.25f); private final int type; private final float height; From 51c1792d67f20a17f88abb92461833926f01f7f0 Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Fri, 15 Nov 2019 22:21:26 -0600 Subject: [PATCH 31/50] Only send one empty chunk upon login --- .../network/session/GeyserSession.java | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java index b5be8cbc..8f4544d3 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java @@ -135,25 +135,22 @@ public class GeyserSession implements Player { Vector3f pos = Vector3f.ZERO; int chunkX = pos.getFloorX() >> 4; int chunkZ = pos.getFloorZ() >> 4; - for (int x = -5; x < 5; x++) { - for (int z = -5; z < 5; z++) { - NetworkChunkPublisherUpdatePacket chunkPublisherUpdatePacket = new NetworkChunkPublisherUpdatePacket(); - chunkPublisherUpdatePacket.setPosition(pos.toInt()); - chunkPublisherUpdatePacket.setRadius(renderDistance << 4); - upstream.sendPacket(chunkPublisherUpdatePacket); + NetworkChunkPublisherUpdatePacket chunkPublisherUpdatePacket = new NetworkChunkPublisherUpdatePacket(); + chunkPublisherUpdatePacket.setPosition(pos.toInt()); + chunkPublisherUpdatePacket.setRadius(renderDistance << 4); + upstream.sendPacket(chunkPublisherUpdatePacket); - LevelChunkPacket data = new LevelChunkPacket(); - data.setChunkX(chunkX + x); - data.setChunkZ(chunkZ + z); - data.setSubChunksLength(0); - data.setData(TranslatorsInit.EMPTY_LEVEL_CHUNK_DATA); - upstream.sendPacket(data); - } - } + LevelChunkPacket data = new LevelChunkPacket(); + data.setChunkX(chunkX); + data.setChunkZ(chunkZ); + data.setSubChunksLength(0); + data.setData(TranslatorsInit.EMPTY_LEVEL_CHUNK_DATA); + upstream.sendPacket(data); BiomeDefinitionListPacket biomePacket = new BiomeDefinitionListPacket(); biomePacket.setTag(CompoundTag.EMPTY); upstream.sendPacket(biomePacket); + AvailableEntityIdentifiersPacket entityPacket = new AvailableEntityIdentifiersPacket(); entityPacket.setTag(CompoundTag.EMPTY); upstream.sendPacket(entityPacket); @@ -161,8 +158,6 @@ public class GeyserSession implements Player { PlayStatusPacket playStatusPacket = new PlayStatusPacket(); playStatusPacket.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN); upstream.sendPacket(playStatusPacket); - - connector.getLogger().debug("play status sent"); } public void authenticate(String username) { From d2034854180362b7aa9182181c9edb3b1fdd750d Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Sun, 17 Nov 2019 15:29:49 -0600 Subject: [PATCH 32/50] Add entity status translator --- .../network/translators/TranslatorsInit.java | 1 + .../entity/JavaEntityStatusTranslator.java | 97 +++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityStatusTranslator.java 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 d4bc5b45..5711409c 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 @@ -114,6 +114,7 @@ public class TranslatorsInit { Registry.registerJava(ServerEntityRotationPacket.class, new JavaEntityRotationTranslator()); Registry.registerJava(ServerEntityHeadLookPacket.class, new JavaEntityHeadLookTranslator()); Registry.registerJava(ServerEntityMetadataPacket.class, new JavaEntityMetadataTranslator()); + Registry.registerJava(ServerEntityStatusPacket.class, new JavaEntityStatusTranslator()); Registry.registerJava(ServerBossBarPacket.class, new JavaBossBarTranslator()); Registry.registerJava(ServerSpawnExpOrbPacket.class, new JavaSpawnExpOrbTranslator()); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityStatusTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityStatusTranslator.java new file mode 100644 index 00000000..a3745864 --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityStatusTranslator.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2019 GeyserMC. http://geysermc.org + * + * 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. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.connector.network.translators.java.entity; + +import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityStatusPacket; +import com.nukkitx.protocol.bedrock.packet.EntityEventPacket; +import org.geysermc.connector.entity.Entity; +import org.geysermc.connector.network.session.GeyserSession; +import org.geysermc.connector.network.translators.PacketTranslator; + +public class JavaEntityStatusTranslator extends PacketTranslator { + + @Override + public void translate(ServerEntityStatusPacket packet, GeyserSession session) { + Entity entity = session.getEntityCache().getEntityByJavaId(packet.getEntityId()); + if (packet.getEntityId() == session.getPlayerEntity().getEntityId()) { + entity = session.getPlayerEntity(); + } + if (entity == null) + return; + + EntityEventPacket entityEventPacket = new EntityEventPacket(); + entityEventPacket.setRuntimeEntityId(entity.getGeyserId()); + switch (packet.getStatus()) { + case LIVING_HURT: + case LIVING_HURT_SWEET_BERRY_BUSH: + entityEventPacket.setEvent(EntityEventPacket.Event.HURT_ANIMATION); + break; + case LIVING_DEATH: + entityEventPacket.setEvent(EntityEventPacket.Event.DEATH_ANIMATION); + break; + case WOLF_SHAKE_WATER: + entityEventPacket.setEvent(EntityEventPacket.Event.SHAKE_WET); + break; + case PLAYER_FINISH_USING_ITEM: + entityEventPacket.setEvent(EntityEventPacket.Event.USE_ITEM); + break; + case FISHING_HOOK_PULL_PLAYER: + entityEventPacket.setEvent(EntityEventPacket.Event.FISH_HOOK_LURED); + break; + case TAMEABLE_TAMING_FAILED: + entityEventPacket.setEvent(EntityEventPacket.Event.TAME_FAIL); + break; + case TAMEABLE_TAMING_SUCCEEDED: + entityEventPacket.setEvent(EntityEventPacket.Event.TAME_SUCCESS); + case ZOMBIE_VILLAGER_CURE: + entityEventPacket.setEvent(EntityEventPacket.Event.ZOMBIE_VILLAGER_CURE); + break; + case ANIMAL_EMIT_HEARTS: + entityEventPacket.setEvent(EntityEventPacket.Event.LOVE_PARTICLES); + break; + case FIREWORK_EXPLODE: + entityEventPacket.setEvent(EntityEventPacket.Event.FIREWORK_PARTICLES); + break; + case WITCH_EMIT_PARTICLES: + entityEventPacket.setEvent(EntityEventPacket.Event.WITCH_SPELL_PARTICLES); + break; + case TOTEM_OF_UNDYING_MAKE_SOUND: + entityEventPacket.setEvent(EntityEventPacket.Event.CONSUME_TOTEM); + break; + case SHEEP_GRAZE_OR_TNT_CART_EXPLODE: + entityEventPacket.setEvent(EntityEventPacket.Event.MINECART_TNT_PRIME_FUSE); + break; + case IRON_GOLEM_HOLD_POPPY: + entityEventPacket.setEvent(EntityEventPacket.Event.IRON_GOLEM_OFFER_FLOWER); + break; + case IRON_GOLEM_EMPTY_HAND: + entityEventPacket.setEvent(EntityEventPacket.Event.IRON_GOLEM_WITHDRAW_FLOWER); + break; + } + + session.getUpstream().sendPacket(entityEventPacket); + } +} From 577aa6c8fc6528f7096f2ec750093bf1d2f25646 Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Sun, 17 Nov 2019 15:40:13 -0600 Subject: [PATCH 33/50] Add unload chunk translator --- .../network/translators/TranslatorsInit.java | 1 + .../java/world/JavaUnloadChunkTranslator.java | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaUnloadChunkTranslator.java 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 5711409c..6539fb05 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 @@ -142,6 +142,7 @@ public class TranslatorsInit { Registry.registerJava(ServerTeamPacket.class, new JavaTeamTranslator()); Registry.registerJava(ServerBlockChangePacket.class, new JavaBlockChangeTranslator()); Registry.registerJava(ServerMultiBlockChangePacket.class, new JavaMultiBlockChangeTranslator()); + Registry.registerJava(ServerUnloadChunkPacket.class, new JavaUnloadChunkTranslator()); Registry.registerJava(ServerOpenWindowPacket.class, new OpenWindowPacketTranslator()); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaUnloadChunkTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaUnloadChunkTranslator.java new file mode 100644 index 00000000..b727f440 --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaUnloadChunkTranslator.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2019 GeyserMC. http://geysermc.org + * + * 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. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.connector.network.translators.java.world; + +import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerUnloadChunkPacket; +import org.geysermc.connector.network.session.GeyserSession; +import org.geysermc.connector.network.translators.PacketTranslator; +import org.geysermc.connector.world.chunk.ChunkPosition; + +public class JavaUnloadChunkTranslator extends PacketTranslator { + + @Override + public void translate(ServerUnloadChunkPacket packet, GeyserSession session) { + session.getChunkCache().removeChunk(new ChunkPosition(packet.getX(), packet.getZ())); + } +} From 068033aeaa575c2d25278c7def9c2497df01eb2a Mon Sep 17 00:00:00 2001 From: Tim203 Date: Tue, 19 Nov 2019 21:31:24 +0100 Subject: [PATCH 34/50] Fixes errors related to skins --- .../BedrockPlayerInitializedTranslator.java | 1 - .../spawn/JavaSpawnPlayerTranslator.java | 5 ++-- .../connector/utils/ProvidedSkin.java | 11 ++++---- .../connector/utils/SkinProvider.java | 13 ++++++--- .../geysermc/connector/utils/SkinUtils.java | 27 +++++++++---------- 5 files changed, 30 insertions(+), 27 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockPlayerInitializedTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockPlayerInitializedTranslator.java index 435b192b..ba2e3c93 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockPlayerInitializedTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockPlayerInitializedTranslator.java @@ -15,7 +15,6 @@ public class BedrockPlayerInitializedTranslator extends PacketTranslator entity.sendPlayer(session)); } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/spawn/JavaSpawnPlayerTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/spawn/JavaSpawnPlayerTranslator.java index 4d00bdcb..660cac2e 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/spawn/JavaSpawnPlayerTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/spawn/JavaSpawnPlayerTranslator.java @@ -51,8 +51,9 @@ public class JavaSpawnPlayerTranslator extends PacketTranslator entity.sendPlayer(session)); + if (session.getUpstream().isInitialized()) { + SkinUtils.requestAndHandleSkinAndCape(entity, session, skinAndCape -> entity.sendPlayer(session)); + } } } diff --git a/connector/src/main/java/org/geysermc/connector/utils/ProvidedSkin.java b/connector/src/main/java/org/geysermc/connector/utils/ProvidedSkin.java index 71bf2984..78cd8933 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/ProvidedSkin.java +++ b/connector/src/main/java/org/geysermc/connector/utils/ProvidedSkin.java @@ -3,7 +3,6 @@ package org.geysermc.connector.utils; import lombok.Getter; import javax.imageio.ImageIO; -import java.awt.Color; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -19,11 +18,11 @@ public class ProvidedSkin { try { for (int y = 0; y < image.getHeight(); y++) { for (int x = 0; x < image.getWidth(); x++) { - Color color = new Color(image.getRGB(x, y), true); - outputStream.write(color.getRed()); - outputStream.write(color.getGreen()); - outputStream.write(color.getBlue()); - outputStream.write(color.getAlpha()); + int rgba = image.getRGB(x, y); + outputStream.write((rgba >> 16) & 0xFF); // Red + outputStream.write((rgba >> 8) & 0xFF); // Green + outputStream.write(rgba & 0xFF); // Blue + outputStream.write((rgba >> 24) & 0xFF); // Alpha } } image.flush(); diff --git a/connector/src/main/java/org/geysermc/connector/utils/SkinProvider.java b/connector/src/main/java/org/geysermc/connector/utils/SkinProvider.java index 2d2aceab..b2634e3b 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/SkinProvider.java +++ b/connector/src/main/java/org/geysermc/connector/utils/SkinProvider.java @@ -22,12 +22,12 @@ public class SkinProvider { public static final boolean ALLOW_THIRD_PARTY_CAPES = ((GeyserConnector)Geyser.getConnector()).getConfig().isAllowThirdPartyCapes(); private static final ExecutorService EXECUTOR_SERVICE = Executors.newFixedThreadPool(ALLOW_THIRD_PARTY_CAPES ? 21 : 14); - public static final Skin EMPTY_SKIN = new Skin(-1, ""); public static final byte[] STEVE_SKIN = new ProvidedSkin("bedrock/skin/skin_steve.png").getSkin(); + public static final Skin EMPTY_SKIN = new Skin(-1, "steve", STEVE_SKIN); private static Map cachedSkins = new ConcurrentHashMap<>(); private static Map> requestedSkins = new ConcurrentHashMap<>(); - public static final Cape EMPTY_CAPE = new Cape("", new byte[0], -1, true); + public static final Cape EMPTY_CAPE = new Cape("", "no-cape", new byte[0], -1, true); private static Map cachedCapes = new ConcurrentHashMap<>(); private static Map> requestedCapes = new ConcurrentHashMap<>(); @@ -149,8 +149,11 @@ public class SkinProvider { cape = requestImage(capeUrl, true); } catch (Exception ignored) {} // just ignore I guess + String[] urlSection = capeUrl.split("/"); // A real url is expected at this stage + return new Cape( capeUrl, + urlSection[urlSection.length - 1], // get the texture id and use it as cape id cape.length > 0 ? cape : EMPTY_CAPE.getCapeData(), System.currentTimeMillis(), cape.length == 0 @@ -209,13 +212,14 @@ public class SkinProvider { public static class Skin { private UUID skinOwner; private String textureUrl; - private byte[] skinData = STEVE_SKIN; + private byte[] skinData; private long requestedOn; private boolean updated; - private Skin(long requestedOn, String textureUrl) { + private Skin(long requestedOn, String textureUrl, byte[] skinData) { this.requestedOn = requestedOn; this.textureUrl = textureUrl; + this.skinData = skinData; } } @@ -223,6 +227,7 @@ public class SkinProvider { @Getter public static class Cape { private String textureUrl; + private String capeId; private byte[] capeData; private long requestedOn; private boolean failed; diff --git a/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java b/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java index 988501b8..640ae450 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java @@ -20,6 +20,7 @@ import java.util.function.Consumer; public class SkinUtils { public static PlayerListPacket.Entry buildCachedEntry(GameProfile profile, long geyserId) { GameProfileData data = GameProfileData.from(profile); + SkinProvider.Cape cape = SkinProvider.getCachedCape(data.getCapeUrl()); return buildEntryManually( profile.getId(), @@ -27,7 +28,8 @@ public class SkinUtils { geyserId, profile.getIdAsString(), SkinProvider.getCachedSkin(profile.getId()).getSkinData(), - SkinProvider.getCachedCape(data.getCapeUrl()).getCapeData(), + cape.getCapeId(), + cape.getCapeData(), getLegacySkinGeometry("geometry.humanoid.custom" + (data.isAlex() ? "Slim" : "")), "" ); @@ -40,6 +42,7 @@ public class SkinUtils { geyserId, profile.getIdAsString(), SkinProvider.STEVE_SKIN, + SkinProvider.EMPTY_CAPE.getCapeId(), SkinProvider.EMPTY_CAPE.getCapeData(), getLegacySkinGeometry("geometry.humanoid"), "" @@ -47,18 +50,13 @@ public class SkinUtils { } public static PlayerListPacket.Entry buildEntryManually(UUID uuid, String username, long geyserId, - String skinId, byte[] skinData, byte[] capeData, + String skinId, byte[] skinData, + String capeId, byte[] capeData, String geometryName, String geometryData) { - if (skinData == null || skinData.length == 0) { - skinData = SkinProvider.EMPTY_SKIN.getSkinData(); - } - - if (capeData == null || capeData.length == 0) { - capeData = SkinProvider.EMPTY_CAPE.getCapeData(); - } - - SerializedSkin serializedSkin = SerializedSkin.of(skinId, geometryName, ImageData.of(64, 64, skinData), - Collections.emptyList(), ImageData.of(64, 32, capeData), geometryData, "", true, false, false, "", ""); + SerializedSkin serializedSkin = SerializedSkin.of( + skinId, geometryName, ImageData.of(skinData), Collections.emptyList(), + ImageData.of(capeData), geometryData, "", true, false, false, capeId, uuid.toString() + ); PlayerListPacket.Entry entry = new PlayerListPacket.Entry(uuid); entry.setName(username); @@ -107,7 +105,7 @@ public class SkinUtils { public static void requestAndHandleSkinAndCape(PlayerEntity entity, GeyserSession session, Consumer skinAndCapeConsumer) { Geyser.getGeneralThreadPool().execute(() -> { - SkinUtils.GameProfileData data = SkinUtils.GameProfileData.from(entity.getProfile()); + GameProfileData data = GameProfileData.from(entity.getProfile()); SkinProvider.requestSkinAndCape(entity.getUuid(), data.getSkinUrl(), data.getCapeUrl()) .whenCompleteAsync((skinAndCape, throwable) -> { @@ -126,12 +124,13 @@ public class SkinUtils { entity.setLastSkinUpdate(skin.getRequestedOn()); if (session.getUpstream().isInitialized()) { - PlayerListPacket.Entry updatedEntry = SkinUtils.buildEntryManually( + PlayerListPacket.Entry updatedEntry = buildEntryManually( entity.getUuid(), entity.getUsername(), entity.getGeyserId(), entity.getUuid().toString(), skin.getSkinData(), + cape.getCapeId(), cape.getCapeData(), getLegacySkinGeometry("geometry.humanoid.custom" + (data.isAlex() ? "Slim" : "")), "" From 61d07ab4411505302fe06a9d440e8fc6913e41cd Mon Sep 17 00:00:00 2001 From: Redned Date: Tue, 19 Nov 2019 19:09:04 -0600 Subject: [PATCH 35/50] Create FUNDING.yml --- .github/FUNDING.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..b4b93dca --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: GeyserMC +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] From 0fe1a302a3d0a24e55a70260149120b88f0ee8b7 Mon Sep 17 00:00:00 2001 From: AJ Ferguson Date: Wed, 20 Nov 2019 17:28:40 -0900 Subject: [PATCH 36/50] Update mappings --- .../resources/bedrock/creative_items.json | 57 +- .../src/main/resources/bedrock/items.json | 524 +++++++++++++++++- connector/src/main/resources/blocks.json | 204 +++---- connector/src/main/resources/items.json | 346 ++++++------ 4 files changed, 829 insertions(+), 302 deletions(-) diff --git a/connector/src/main/resources/bedrock/creative_items.json b/connector/src/main/resources/bedrock/creative_items.json index 60073989..8453bf90 100644 --- a/connector/src/main/resources/bedrock/creative_items.json +++ b/connector/src/main/resources/bedrock/creative_items.json @@ -1039,6 +1039,9 @@ { "id" : 2 }, + { + "id" : 198 + }, { "id" : 243 }, @@ -1336,6 +1339,26 @@ "id" : -131, "damage" : 4 }, + { + "id" : -131, + "damage" : 11 + }, + { + "id" : -131, + "damage" : 9 + }, + { + "id" : -131, + "damage" : 10 + }, + { + "id" : -131, + "damage" : 8 + }, + { + "id" : -131, + "damage" : 12 + }, { "id" : -133, "damage" : 3 @@ -1441,6 +1464,9 @@ "id" : 175, "damage" : 5 }, + { + "id" : -216 + }, { "id" : 351, "damage" : 19 @@ -1748,6 +1774,10 @@ "id" : 383, "damage" : 113 }, + { + "id" : 383, + "damage" : 121 + }, { "id" : 383, "damage" : 33 @@ -2993,15 +3023,15 @@ { "id" : 54 }, - { - "id" : -203 - }, { "id" : 146 }, { "id" : 130 }, + { + "id" : -203 + }, { "id" : 205 }, @@ -3819,32 +3849,25 @@ "id" : 69 }, { - "id" : 143, - "damage" : 5 + "id" : 143 }, { - "id" : -144, - "damage" : 5 + "id" : -144 }, { - "id" : -141, - "damage" : 5 + "id" : -141 }, { - "id" : -143, - "damage" : 5 + "id" : -143 }, { - "id" : -140, - "damage" : 5 + "id" : -140 }, { - "id" : -142, - "damage" : 5 + "id" : -142 }, { - "id" : 77, - "damage" : 5 + "id" : 77 }, { "id" : 131 diff --git a/connector/src/main/resources/bedrock/items.json b/connector/src/main/resources/bedrock/items.json index 1c1c2fa1..e4b9e43e 100644 --- a/connector/src/main/resources/bedrock/items.json +++ b/connector/src/main/resources/bedrock/items.json @@ -51,6 +51,10 @@ "name": "minecraft:bread", "id": 297 }, + { + "name": "minecraft:light_block", + "id": -215 + }, { "name": "minecraft:porkchop", "id": 319 @@ -63,10 +67,18 @@ "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 @@ -87,6 +99,10 @@ "name": "minecraft:horsearmorgold", "id": 418 }, + { + "name": "minecraft:element_74", + "id": -85 + }, { "name": "minecraft:pufferfish", "id": 462 @@ -107,6 +123,10 @@ "name": "minecraft:emerald", "id": 388 }, + { + "name": "minecraft:element_47", + "id": -58 + }, { "name": "minecraft:mushroom_stew", "id": 282 @@ -135,10 +155,22 @@ "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 @@ -159,10 +191,18 @@ "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 @@ -219,6 +259,10 @@ "name": "minecraft:chicken", "id": 365 }, + { + "name": "minecraft:element_31", + "id": -42 + }, { "name": "minecraft:cooked_chicken", "id": 366 @@ -243,6 +287,10 @@ "name": "minecraft:diamond_axe", "id": 279 }, + { + "name": "minecraft:element_105", + "id": -116 + }, { "name": "minecraft:carrot", "id": 391 @@ -259,6 +307,10 @@ "name": "minecraft:baked_potato", "id": 393 }, + { + "name": "minecraft:element_15", + "id": -26 + }, { "name": "minecraft:carpet", "id": 171 @@ -367,6 +419,10 @@ "name": "minecraft:arrow", "id": 262 }, + { + "name": "minecraft:element_97", + "id": -108 + }, { "name": "minecraft:campfire", "id": 720 @@ -463,6 +519,10 @@ "name": "minecraft:slime_ball", "id": 341 }, + { + "name": "minecraft:element_58", + "id": -69 + }, { "name": "minecraft:golden_sword", "id": 283 @@ -483,6 +543,10 @@ "name": "minecraft:golden_axe", "id": 286 }, + { + "name": "minecraft:element_62", + "id": -73 + }, { "name": "minecraft:string", "id": 287 @@ -551,14 +615,26 @@ "name": "minecraft:grindstone", "id": -195 }, + { + "name": "minecraft:element_46", + "id": -57 + }, { "name": "minecraft:potion", "id": 373 }, + { + "name": "minecraft:wither_rose", + "id": -216 + }, { "name": "minecraft:leather_helmet", "id": 298 }, + { + "name": "minecraft:element_48", + "id": -59 + }, { "name": "minecraft:leather_chestplate", "id": 299 @@ -587,6 +663,14 @@ "name": "minecraft:stonebrick", "id": 98 }, + { + "name": "minecraft:stickypistonarmcollision", + "id": -217 + }, + { + "name": "minecraft:structure_void", + "id": 217 + }, { "name": "minecraft:chainmail_chestplate", "id": 303 @@ -595,6 +679,10 @@ "name": "minecraft:lit_blast_furnace", "id": -214 }, + { + "name": "minecraft:element_11", + "id": -22 + }, { "name": "minecraft:chainmail_leggings", "id": 304 @@ -631,6 +719,10 @@ "name": "minecraft:iron_boots", "id": 309 }, + { + "name": "minecraft:element_104", + "id": -115 + }, { "name": "minecraft:chorus_fruit_popped", "id": 433 @@ -643,6 +735,10 @@ "name": "minecraft:diamond_leggings", "id": 312 }, + { + "name": "minecraft:element_75", + "id": -86 + }, { "name": "minecraft:diamond_boots", "id": 313 @@ -787,6 +883,10 @@ "name": "minecraft:flowing_lava", "id": 10 }, + { + "name": "minecraft:element_86", + "id": -97 + }, { "name": "minecraft:red_glazed_terracotta", "id": 234 @@ -831,6 +931,10 @@ "name": "minecraft:clock", "id": 347 }, + { + "name": "minecraft:element_96", + "id": -107 + }, { "name": "minecraft:dye", "id": 351 @@ -859,6 +963,10 @@ "name": "minecraft:cake", "id": 354 }, + { + "name": "minecraft:element_113", + "id": -124 + }, { "name": "minecraft:mossy_cobblestone", "id": 48 @@ -891,6 +999,14 @@ "name": "minecraft:double_stone_slab2", "id": 182 }, + { + "name": "minecraft:element_3", + "id": -14 + }, + { + "name": "minecraft:element_23", + "id": -34 + }, { "name": "minecraft:skull", "id": 397 @@ -939,6 +1055,10 @@ "name": "minecraft:fermented_spider_eye", "id": 376 }, + { + "name": "minecraft:element_81", + "id": -92 + }, { "name": "minecraft:monster_egg", "id": 97 @@ -1019,10 +1139,18 @@ "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 @@ -1047,6 +1175,10 @@ "name": "minecraft:concrete", "id": 236 }, + { + "name": "minecraft:element_73", + "id": -84 + }, { "name": "minecraft:quartz", "id": 406 @@ -1059,10 +1191,18 @@ "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 @@ -1107,13 +1247,17 @@ "name": "minecraft:record_13", "id": 500 }, + { + "name": "minecraft:stone_button", + "id": 77 + }, { "name": "minecraft:record_cat", "id": 501 }, { - "name": "minecraft:stone_button", - "id": 77 + "name": "minecraft:element_89", + "id": -100 }, { "name": "minecraft:record_blocks", @@ -1123,6 +1267,10 @@ "name": "minecraft:bamboo", "id": -163 }, + { + "name": "minecraft:element_72", + "id": -83 + }, { "name": "minecraft:record_chirp", "id": 503 @@ -1187,6 +1335,10 @@ "name": "minecraft:end_crystal", "id": 426 }, + { + "name": "minecraft:element_55", + "id": -66 + }, { "name": "minecraft:birch_door", "id": 428 @@ -1203,6 +1355,10 @@ "name": "minecraft:acacia_door", "id": 430 }, + { + "name": "minecraft:element_116", + "id": -127 + }, { "name": "minecraft:chorus_fruit", "id": 432 @@ -1251,6 +1407,10 @@ "name": "minecraft:prismarine_shard", "id": 409 }, + { + "name": "minecraft:element_112", + "id": -123 + }, { "name": "minecraft:totem", "id": 450 @@ -1263,6 +1423,10 @@ "name": "minecraft:pumpkin_stem", "id": 104 }, + { + "name": "minecraft:element_50", + "id": -61 + }, { "name": "minecraft:lever", "id": 69 @@ -1271,6 +1435,10 @@ "name": "minecraft:heart_of_the_sea", "id": 467 }, + { + "name": "minecraft:element_92", + "id": -103 + }, { "name": "minecraft:grass", "id": 2 @@ -1323,6 +1491,22 @@ "name": "minecraft:banner_pattern", "id": 434 }, + { + "name": "minecraft:suspicious_stew", + "id": 734 + }, + { + "name": "minecraft:element_4", + "id": -15 + }, + { + "name": "minecraft:element_24", + "id": -35 + }, + { + "name": "minecraft:camera", + "id": 498 + }, { "name": "minecraft:compound", "id": 499 @@ -1331,6 +1515,10 @@ "name": "minecraft:bleach", "id": 451 }, + { + "name": "minecraft:element_40", + "id": -51 + }, { "name": "minecraft:rapid_fertilizer", "id": 449 @@ -1399,6 +1587,10 @@ "name": "minecraft:coral_block", "id": -132 }, + { + "name": "minecraft:element_54", + "id": -65 + }, { "name": "minecraft:double_stone_slab", "id": 44 @@ -1407,6 +1599,14 @@ "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 @@ -1423,6 +1623,10 @@ "name": "minecraft:leaves", "id": 18 }, + { + "name": "minecraft:element_10", + "id": -21 + }, { "name": "minecraft:birch_button", "id": -141 @@ -1435,6 +1639,10 @@ "name": "minecraft:red_sandstone", "id": 179 }, + { + "name": "minecraft:element_91", + "id": -102 + }, { "name": "minecraft:wooden_slab", "id": 158 @@ -1463,10 +1671,6 @@ "name": "minecraft:planks", "id": 5 }, - { - "name": "minecraft:redstone_torch", - "id": 76 - }, { "name": "minecraft:quartz_block", "id": 155 @@ -1511,6 +1715,10 @@ "name": "minecraft:stained_glass", "id": 241 }, + { + "name": "minecraft:element_82", + "id": -93 + }, { "name": "minecraft:stained_glass_pane", "id": 160 @@ -1523,6 +1731,10 @@ "name": "minecraft:undyed_shulker_box", "id": 205 }, + { + "name": "minecraft:element_107", + "id": -118 + }, { "name": "minecraft:piston", "id": 33 @@ -1567,6 +1779,10 @@ "name": "minecraft:bell", "id": -206 }, + { + "name": "minecraft:element_42", + "id": -53 + }, { "name": "minecraft:cartography_table", "id": -200 @@ -1587,6 +1803,10 @@ "name": "minecraft:chemistry_table", "id": 238 }, + { + "name": "minecraft:element_70", + "id": -81 + }, { "name": "minecraft:tnt", "id": 46 @@ -1603,54 +1823,214 @@ "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_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 @@ -1659,18 +2039,54 @@ "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 @@ -1679,6 +2095,18 @@ "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 @@ -1687,6 +2115,18 @@ "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 @@ -1695,10 +2135,62 @@ "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 @@ -1707,6 +2199,10 @@ "name": "minecraft:spruce_standing_sign", "id": -181 }, + { + "name": "minecraft:element_118", + "id": -129 + }, { "name": "minecraft:gravel", "id": 13 @@ -1855,6 +2351,10 @@ "name": "minecraft:red_nether_brick_stairs", "id": -184 }, + { + "name": "minecraft:redstone_torch", + "id": 76 + }, { "name": "minecraft:ice", "id": 79 @@ -2179,6 +2679,14 @@ "name": "minecraft:chorus_plant", "id": 240 }, + { + "name": "minecraft:fire", + "id": 51 + }, + { + "name": "minecraft:item.camera", + "id": 242 + }, { "name": "minecraft:stonecutter", "id": 245 @@ -2203,10 +2711,6 @@ "name": "minecraft:stripped_dark_oak_log", "id": -9 }, - { - "name": "minecraft:fire", - "id": 51 - }, { "name": "minecraft:hard_glass_pane", "id": 190 diff --git a/connector/src/main/resources/blocks.json b/connector/src/main/resources/blocks.json index df9f305c..0e8f0d0e 100644 --- a/connector/src/main/resources/blocks.json +++ b/connector/src/main/resources/blocks.json @@ -577,339 +577,339 @@ }, "minecraft:oak_leaves[distance=1,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 8 + "bedrock_data": 4 }, "minecraft:oak_leaves[distance=1,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 4 + "bedrock_data": 0 }, "minecraft:oak_leaves[distance=2,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 8 + "bedrock_data": 4 }, "minecraft:oak_leaves[distance=2,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 4 + "bedrock_data": 0 }, "minecraft:oak_leaves[distance=3,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 8 + "bedrock_data": 4 }, "minecraft:oak_leaves[distance=3,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 4 + "bedrock_data": 0 }, "minecraft:oak_leaves[distance=4,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 8 + "bedrock_data": 4 }, "minecraft:oak_leaves[distance=4,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 4 + "bedrock_data": 0 }, "minecraft:oak_leaves[distance=5,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 8 + "bedrock_data": 4 }, "minecraft:oak_leaves[distance=5,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 4 + "bedrock_data": 0 }, "minecraft:oak_leaves[distance=6,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 8 + "bedrock_data": 4 }, "minecraft:oak_leaves[distance=6,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 4 + "bedrock_data": 0 }, "minecraft:oak_leaves[distance=7,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 8 + "bedrock_data": 4 }, "minecraft:oak_leaves[distance=7,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 4 + "bedrock_data": 0 }, "minecraft:spruce_leaves[distance=1,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 9 + "bedrock_data": 5 }, "minecraft:spruce_leaves[distance=1,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 5 + "bedrock_data": 1 }, "minecraft:spruce_leaves[distance=2,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 9 + "bedrock_data": 5 }, "minecraft:spruce_leaves[distance=2,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 5 + "bedrock_data": 1 }, "minecraft:spruce_leaves[distance=3,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 9 + "bedrock_data": 5 }, "minecraft:spruce_leaves[distance=3,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 5 + "bedrock_data": 1 }, "minecraft:spruce_leaves[distance=4,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 9 + "bedrock_data": 5 }, "minecraft:spruce_leaves[distance=4,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 5 + "bedrock_data": 1 }, "minecraft:spruce_leaves[distance=5,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 9 + "bedrock_data": 5 }, "minecraft:spruce_leaves[distance=5,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 5 + "bedrock_data": 1 }, "minecraft:spruce_leaves[distance=6,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 9 + "bedrock_data": 5 }, "minecraft:spruce_leaves[distance=6,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 5 + "bedrock_data": 1 }, "minecraft:spruce_leaves[distance=7,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 9 + "bedrock_data": 5 }, "minecraft:spruce_leaves[distance=7,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 5 + "bedrock_data": 1 }, "minecraft:birch_leaves[distance=1,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 10 + "bedrock_data": 6 }, "minecraft:birch_leaves[distance=1,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 6 + "bedrock_data": 2 }, "minecraft:birch_leaves[distance=2,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 10 + "bedrock_data": 6 }, "minecraft:birch_leaves[distance=2,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 6 + "bedrock_data": 2 }, "minecraft:birch_leaves[distance=3,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 10 + "bedrock_data": 6 }, "minecraft:birch_leaves[distance=3,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 6 + "bedrock_data": 2 }, "minecraft:birch_leaves[distance=4,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 10 + "bedrock_data": 6 }, "minecraft:birch_leaves[distance=4,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 6 + "bedrock_data": 2 }, "minecraft:birch_leaves[distance=5,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 10 + "bedrock_data": 6 }, "minecraft:birch_leaves[distance=5,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 6 + "bedrock_data": 2 }, "minecraft:birch_leaves[distance=6,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 10 + "bedrock_data": 6 }, "minecraft:birch_leaves[distance=6,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 6 + "bedrock_data": 2 }, "minecraft:birch_leaves[distance=7,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 10 + "bedrock_data": 6 }, "minecraft:birch_leaves[distance=7,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 6 + "bedrock_data": 2 }, "minecraft:jungle_leaves[distance=1,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 11 + "bedrock_data": 7 }, "minecraft:jungle_leaves[distance=1,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 7 + "bedrock_data": 3 }, "minecraft:jungle_leaves[distance=2,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 11 + "bedrock_data": 7 }, "minecraft:jungle_leaves[distance=2,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 7 + "bedrock_data": 3 }, "minecraft:jungle_leaves[distance=3,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 11 + "bedrock_data": 7 }, "minecraft:jungle_leaves[distance=3,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 7 + "bedrock_data": 3 }, "minecraft:jungle_leaves[distance=4,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 11 + "bedrock_data": 7 }, "minecraft:jungle_leaves[distance=4,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 7 + "bedrock_data": 3 }, "minecraft:jungle_leaves[distance=5,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 11 + "bedrock_data": 7 }, "minecraft:jungle_leaves[distance=5,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 7 + "bedrock_data": 3 }, "minecraft:jungle_leaves[distance=6,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 11 + "bedrock_data": 7 }, "minecraft:jungle_leaves[distance=6,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 7 + "bedrock_data": 3 }, "minecraft:jungle_leaves[distance=7,persistent=true]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 11 + "bedrock_data": 7 }, "minecraft:jungle_leaves[distance=7,persistent=false]": { "bedrock_identifier": "minecraft:leaves", - "bedrock_data": 7 + "bedrock_data": 3 }, "minecraft:acacia_leaves[distance=1,persistent=true]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 8 + "bedrock_data": 4 }, "minecraft:acacia_leaves[distance=1,persistent=false]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 4 + "bedrock_data": 0 }, "minecraft:acacia_leaves[distance=2,persistent=true]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 8 + "bedrock_data": 4 }, "minecraft:acacia_leaves[distance=2,persistent=false]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 4 + "bedrock_data": 0 }, "minecraft:acacia_leaves[distance=3,persistent=true]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 8 + "bedrock_data": 4 }, "minecraft:acacia_leaves[distance=3,persistent=false]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 4 + "bedrock_data": 0 }, "minecraft:acacia_leaves[distance=4,persistent=true]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 8 + "bedrock_data": 4 }, "minecraft:acacia_leaves[distance=4,persistent=false]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 4 + "bedrock_data": 0 }, "minecraft:acacia_leaves[distance=5,persistent=true]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 8 + "bedrock_data": 4 }, "minecraft:acacia_leaves[distance=5,persistent=false]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 4 + "bedrock_data": 0 }, "minecraft:acacia_leaves[distance=6,persistent=true]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 8 + "bedrock_data": 4 }, "minecraft:acacia_leaves[distance=6,persistent=false]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 4 + "bedrock_data": 0 }, "minecraft:acacia_leaves[distance=7,persistent=true]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 8 + "bedrock_data": 4 }, "minecraft:acacia_leaves[distance=7,persistent=false]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 4 + "bedrock_data": 0 }, "minecraft:dark_oak_leaves[distance=1,persistent=true]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 9 + "bedrock_data": 5 }, "minecraft:dark_oak_leaves[distance=1,persistent=false]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 5 + "bedrock_data": 1 }, "minecraft:dark_oak_leaves[distance=2,persistent=true]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 9 + "bedrock_data": 5 }, "minecraft:dark_oak_leaves[distance=2,persistent=false]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 5 + "bedrock_data": 1 }, "minecraft:dark_oak_leaves[distance=3,persistent=true]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 9 + "bedrock_data": 5 }, "minecraft:dark_oak_leaves[distance=3,persistent=false]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 5 + "bedrock_data": 1 }, "minecraft:dark_oak_leaves[distance=4,persistent=true]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 9 + "bedrock_data": 5 }, "minecraft:dark_oak_leaves[distance=4,persistent=false]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 5 + "bedrock_data": 1 }, "minecraft:dark_oak_leaves[distance=5,persistent=true]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 9 + "bedrock_data": 5 }, "minecraft:dark_oak_leaves[distance=5,persistent=false]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 5 + "bedrock_data": 1 }, "minecraft:dark_oak_leaves[distance=6,persistent=true]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 9 + "bedrock_data": 5 }, "minecraft:dark_oak_leaves[distance=6,persistent=false]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 5 + "bedrock_data": 1 }, "minecraft:dark_oak_leaves[distance=7,persistent=true]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 9 + "bedrock_data": 5 }, "minecraft:dark_oak_leaves[distance=7,persistent=false]": { "bedrock_identifier": "minecraft:leaves2", - "bedrock_data": 5 + "bedrock_data": 1 }, "minecraft:sponge": { "bedrock_identifier": "minecraft:sponge", @@ -5688,8 +5688,8 @@ "bedrock_data": 9 }, "minecraft:wither_rose": { - "bedrock_identifier": "minecraft:red_flower", - "bedrock_data": 11 + "bedrock_identifier": "minecraft:wither_rose", + "bedrock_data": 0 }, "minecraft:lily_of_the_valley": { "bedrock_identifier": "minecraft:red_flower", @@ -34892,7 +34892,7 @@ "bedrock_data": 8 }, "minecraft:structure_void": { - "bedrock_identifier": "minecraft:air", + "bedrock_identifier": "minecraft:structure_void", "bedrock_data": 0 }, "minecraft:observer[facing=north,powered=true]": { @@ -35897,23 +35897,23 @@ }, "minecraft:dead_tube_coral_block": { "bedrock_identifier": "minecraft:coral_block", - "bedrock_data": 5 + "bedrock_data": 8 }, "minecraft:dead_brain_coral_block": { "bedrock_identifier": "minecraft:coral_block", - "bedrock_data": 6 + "bedrock_data": 9 }, "minecraft:dead_bubble_coral_block": { "bedrock_identifier": "minecraft:coral_block", - "bedrock_data": 7 + "bedrock_data": 10 }, "minecraft:dead_fire_coral_block": { "bedrock_identifier": "minecraft:coral_block", - "bedrock_data": 8 + "bedrock_data": 11 }, "minecraft:dead_horn_coral_block": { "bedrock_identifier": "minecraft:coral_block", - "bedrock_data": 9 + "bedrock_data": 12 }, "minecraft:tube_coral_block": { "bedrock_identifier": "minecraft:coral_block", @@ -35937,43 +35937,43 @@ }, "minecraft:dead_tube_coral[waterlogged=true]": { "bedrock_identifier": "minecraft:coral", - "bedrock_data": 0 + "bedrock_data": 8 }, "minecraft:dead_tube_coral[waterlogged=false]": { "bedrock_identifier": "minecraft:coral", - "bedrock_data": 0 + "bedrock_data": 8 }, "minecraft:dead_brain_coral[waterlogged=true]": { "bedrock_identifier": "minecraft:coral", - "bedrock_data": 1 + "bedrock_data": 9 }, "minecraft:dead_brain_coral[waterlogged=false]": { "bedrock_identifier": "minecraft:coral", - "bedrock_data": 1 + "bedrock_data": 9 }, "minecraft:dead_bubble_coral[waterlogged=true]": { "bedrock_identifier": "minecraft:coral", - "bedrock_data": 2 + "bedrock_data": 10 }, "minecraft:dead_bubble_coral[waterlogged=false]": { "bedrock_identifier": "minecraft:coral", - "bedrock_data": 2 + "bedrock_data": 10 }, "minecraft:dead_fire_coral[waterlogged=true]": { "bedrock_identifier": "minecraft:coral", - "bedrock_data": 3 + "bedrock_data": 11 }, "minecraft:dead_fire_coral[waterlogged=false]": { "bedrock_identifier": "minecraft:coral", - "bedrock_data": 3 + "bedrock_data": 11 }, "minecraft:dead_horn_coral[waterlogged=true]": { "bedrock_identifier": "minecraft:coral", - "bedrock_data": 4 + "bedrock_data": 12 }, "minecraft:dead_horn_coral[waterlogged=false]": { "bedrock_identifier": "minecraft:coral", - "bedrock_data": 4 + "bedrock_data": 12 }, "minecraft:tube_coral[waterlogged=true]": { "bedrock_identifier": "minecraft:coral", diff --git a/connector/src/main/resources/items.json b/connector/src/main/resources/items.json index 86df5991..746b30b4 100644 --- a/connector/src/main/resources/items.json +++ b/connector/src/main/resources/items.json @@ -1,6 +1,6 @@ { "minecraft:air": { - "bedrock_id": 0, + "bedrock_id": -158, "bedrock_data": 0 }, "minecraft:stone": { @@ -176,52 +176,52 @@ "bedrock_data": 0 }, "minecraft:stripped_oak_wood": { - "bedrock_id": -10, - "bedrock_data": 0 + "bedrock_id": -212, + "bedrock_data": 8 }, "minecraft:stripped_spruce_wood": { - "bedrock_id": -5, - "bedrock_data": 0 + "bedrock_id": -212, + "bedrock_data": 9 }, "minecraft:stripped_birch_wood": { - "bedrock_id": -6, - "bedrock_data": 0 + "bedrock_id": -212, + "bedrock_data": 10 }, "minecraft:stripped_jungle_wood": { - "bedrock_id": -7, - "bedrock_data": 0 + "bedrock_id": -212, + "bedrock_data": 11 }, "minecraft:stripped_acacia_wood": { - "bedrock_id": -8, - "bedrock_data": 0 + "bedrock_id": -212, + "bedrock_data": 12 }, "minecraft:stripped_dark_oak_wood": { - "bedrock_id": -9, - "bedrock_data": 0 + "bedrock_id": -212, + "bedrock_data": 13 }, "minecraft:oak_wood": { - "bedrock_id": 248, + "bedrock_id": -212, "bedrock_data": 0 }, "minecraft:spruce_wood": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -212, + "bedrock_data": 1 }, "minecraft:birch_wood": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -212, + "bedrock_data": 2 }, "minecraft:jungle_wood": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -212, + "bedrock_data": 3 }, "minecraft:acacia_wood": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -212, + "bedrock_data": 4 }, "minecraft:dark_oak_wood": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -212, + "bedrock_data": 5 }, "minecraft:oak_leaves": { "bedrock_id": 18, @@ -269,7 +269,7 @@ }, "minecraft:dispenser": { "bedrock_id": 23, - "bedrock_data": 3 + "bedrock_data": 0 }, "minecraft:sandstone": { "bedrock_id": 24, @@ -297,7 +297,7 @@ }, "minecraft:sticky_piston": { "bedrock_id": 29, - "bedrock_data": 1 + "bedrock_data": 0 }, "minecraft:cobweb": { "bedrock_id": 30, @@ -325,7 +325,7 @@ }, "minecraft:piston": { "bedrock_id": 33, - "bedrock_data": 1 + "bedrock_data": 0 }, "minecraft:white_wool": { "bedrock_id": 35, @@ -432,15 +432,15 @@ "bedrock_data": 8 }, "minecraft:cornflower": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 38, + "bedrock_data": 9 }, "minecraft:lily_of_the_valley": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 38, + "bedrock_data": 10 }, "minecraft:wither_rose": { - "bedrock_id": 248, + "bedrock_id": -216, "bedrock_data": 0 }, "minecraft:brown_mushroom": { @@ -484,11 +484,11 @@ "bedrock_data": 5 }, "minecraft:stone_slab": { - "bedrock_id": 44, - "bedrock_data": 0 + "bedrock_id": -166, + "bedrock_data": 2 }, "minecraft:smooth_stone_slab": { - "bedrock_id": 248, + "bedrock_id": 44, "bedrock_data": 0 }, "minecraft:sandstone_slab": { @@ -496,8 +496,8 @@ "bedrock_data": 1 }, "minecraft:cut_sandstone_slab": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -166, + "bedrock_data": 3 }, "minecraft:petrified_oak_slab": { "bedrock_id": 44, @@ -528,8 +528,8 @@ "bedrock_data": 0 }, "minecraft:cut_red_sandstone_slab": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -166, + "bedrock_data": 4 }, "minecraft:purpur_slab": { "bedrock_id": 182, @@ -548,19 +548,19 @@ "bedrock_data": 3 }, "minecraft:smooth_quartz": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 155, + "bedrock_data": 3 }, "minecraft:smooth_red_sandstone": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 179, + "bedrock_data": 3 }, "minecraft:smooth_sandstone": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 24, + "bedrock_data": 3 }, "minecraft:smooth_stone": { - "bedrock_id": 248, + "bedrock_id": -183, "bedrock_data": 0 }, "minecraft:bricks": { @@ -697,7 +697,7 @@ }, "minecraft:stone_button": { "bedrock_id": 77, - "bedrock_data": 5 + "bedrock_data": 0 }, "minecraft:snow": { "bedrock_id": 78, @@ -988,56 +988,56 @@ "bedrock_data": 1 }, "minecraft:brick_wall": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 139, + "bedrock_data": 6 }, "minecraft:prismarine_wall": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 139, + "bedrock_data": 11 }, "minecraft:red_sandstone_wall": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 139, + "bedrock_data": 12 }, "minecraft:mossy_stone_brick_wall": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 139, + "bedrock_data": 8 }, "minecraft:granite_wall": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 139, + "bedrock_data": 2 }, "minecraft:stone_brick_wall": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 139, + "bedrock_data": 7 }, "minecraft:nether_brick_wall": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 139, + "bedrock_data": 9 }, "minecraft:andesite_wall": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 139, + "bedrock_data": 4 }, "minecraft:red_nether_brick_wall": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 139, + "bedrock_data": 13 }, "minecraft:sandstone_wall": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 139, + "bedrock_data": 5 }, "minecraft:end_stone_brick_wall": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 139, + "bedrock_data": 10 }, "minecraft:diorite_wall": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 139, + "bedrock_data": 3 }, "minecraft:oak_button": { "bedrock_id": 143, - "bedrock_data": 5 + "bedrock_data": 0 }, "minecraft:spruce_button": { "bedrock_id": -144, @@ -1121,7 +1121,7 @@ }, "minecraft:dropper": { "bedrock_id": 125, - "bedrock_data": 3 + "bedrock_data": 0 }, "minecraft:white_terracotta": { "bedrock_id": 159, @@ -1188,7 +1188,7 @@ "bedrock_data": 15 }, "minecraft:barrier": { - "bedrock_id": 95, + "bedrock_id": -161, "bedrock_data": 0 }, "minecraft:iron_trapdoor": { @@ -1844,24 +1844,24 @@ "bedrock_data": 4 }, "minecraft:dead_brain_coral": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -131, + "bedrock_data": 9 }, "minecraft:dead_bubble_coral": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -131, + "bedrock_data": 10 }, "minecraft:dead_fire_coral": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -131, + "bedrock_data": 11 }, "minecraft:dead_horn_coral": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -131, + "bedrock_data": 12 }, "minecraft:dead_tube_coral": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -131, + "bedrock_data": 8 }, "minecraft:tube_coral_fan": { "bedrock_id": -133, @@ -1912,51 +1912,51 @@ "bedrock_data": 0 }, "minecraft:polished_granite_stairs": { - "bedrock_id": 248, + "bedrock_id": -172, "bedrock_data": 0 }, "minecraft:smooth_red_sandstone_stairs": { - "bedrock_id": 248, + "bedrock_id": -176, "bedrock_data": 0 }, "minecraft:mossy_stone_brick_stairs": { - "bedrock_id": 248, + "bedrock_id": -175, "bedrock_data": 0 }, "minecraft:polished_diorite_stairs": { - "bedrock_id": 248, + "bedrock_id": -173, "bedrock_data": 0 }, "minecraft:mossy_cobblestone_stairs": { - "bedrock_id": 248, + "bedrock_id": -179, "bedrock_data": 0 }, "minecraft:end_stone_brick_stairs": { - "bedrock_id": 248, + "bedrock_id": -178, "bedrock_data": 0 }, "minecraft:stone_stairs": { - "bedrock_id": 248, + "bedrock_id": -180, "bedrock_data": 0 }, "minecraft:smooth_sandstone_stairs": { - "bedrock_id": 248, + "bedrock_id": -177, "bedrock_data": 0 }, "minecraft:smooth_quartz_stairs": { - "bedrock_id": 248, + "bedrock_id": -185, "bedrock_data": 0 }, "minecraft:granite_stairs": { - "bedrock_id": 248, + "bedrock_id": -169, "bedrock_data": 0 }, "minecraft:andesite_stairs": { - "bedrock_id": 248, + "bedrock_id": -171, "bedrock_data": 0 }, "minecraft:red_nether_brick_stairs": { - "bedrock_id": 248, + "bedrock_id": -184, "bedrock_data": 0 }, "minecraft:polished_andesite_stairs": { @@ -1968,59 +1968,59 @@ "bedrock_data": 0 }, "minecraft:polished_granite_slab": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -162, + "bedrock_data": 7 }, "minecraft:smooth_red_sandstone_slab": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -162, + "bedrock_data": 1 }, "minecraft:mossy_stone_brick_slab": { - "bedrock_id": 248, + "bedrock_id": -166, "bedrock_data": 0 }, "minecraft:polished_diorite_slab": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -162, + "bedrock_data": 5 }, "minecraft:mossy_cobblestone_slab": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 182, + "bedrock_data": 5 }, "minecraft:end_stone_brick_slab": { - "bedrock_id": 248, + "bedrock_id": -162, "bedrock_data": 0 }, "minecraft:smooth_sandstone_slab": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 182, + "bedrock_data": 6 }, "minecraft:smooth_quartz_slab": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -166, + "bedrock_data": 1 }, "minecraft:granite_slab": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -162, + "bedrock_data": 6 }, "minecraft:andesite_slab": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -162, + "bedrock_data": 3 }, "minecraft:red_nether_brick_slab": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 182, + "bedrock_data": 7 }, "minecraft:polished_andesite_slab": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -162, + "bedrock_data": 2 }, "minecraft:diorite_slab": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": -162, + "bedrock_data": 4 }, "minecraft:scaffolding": { - "bedrock_id": 248, + "bedrock_id": -165, "bedrock_data": 0 }, "minecraft:iron_door": { @@ -2360,7 +2360,7 @@ "bedrock_data": 0 }, "minecraft:spruce_sign": { - "bedrock_id": 427, + "bedrock_id": 472, "bedrock_data": 0 }, "minecraft:birch_sign": { @@ -2376,7 +2376,7 @@ "bedrock_data": 0 }, "minecraft:dark_oak_sign": { - "bedrock_id": 276, + "bedrock_id": 476, "bedrock_data": 0 }, "minecraft:bucket": { @@ -2588,20 +2588,20 @@ "bedrock_data": 15 }, "minecraft:blue_dye": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 351, + "bedrock_data": 18 }, "minecraft:brown_dye": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 351, + "bedrock_data": 17 }, "minecraft:black_dye": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 351, + "bedrock_data": 16 }, "minecraft:white_dye": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 351, + "bedrock_data": 19 }, "minecraft:bone": { "bedrock_id": 352, @@ -2796,8 +2796,8 @@ "bedrock_data": 43 }, "minecraft:cat_spawn_egg": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 383, + "bedrock_data": 75 }, "minecraft:cave_spider_spawn_egg": { "bedrock_id": 383, @@ -2848,8 +2848,8 @@ "bedrock_data": 104 }, "minecraft:fox_spawn_egg": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 383, + "bedrock_data": 121 }, "minecraft:ghast_spawn_egg": { "bedrock_id": 383, @@ -2888,8 +2888,8 @@ "bedrock_data": 22 }, "minecraft:panda_spawn_egg": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 383, + "bedrock_data": 113 }, "minecraft:parrot_spawn_egg": { "bedrock_id": 383, @@ -2904,8 +2904,8 @@ "bedrock_data": 12 }, "minecraft:pillager_spawn_egg": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 383, + "bedrock_data": 114 }, "minecraft:polar_bear_spawn_egg": { "bedrock_id": 383, @@ -2920,8 +2920,8 @@ "bedrock_data": 18 }, "minecraft:ravager_spawn_egg": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 383, + "bedrock_data": 59 }, "minecraft:salmon_spawn_egg": { "bedrock_id": 383, @@ -2964,8 +2964,8 @@ "bedrock_data": 46 }, "minecraft:trader_llama_spawn_egg": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 383, + "bedrock_data": 29 }, "minecraft:tropical_fish_spawn_egg": { "bedrock_id": 383, @@ -2988,8 +2988,8 @@ "bedrock_data": 57 }, "minecraft:wandering_trader_spawn_egg": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 383, + "bedrock_data": 118 }, "minecraft:witch_spawn_egg": { "bedrock_id": 383, @@ -3301,18 +3301,18 @@ }, "minecraft:spectral_arrow": { "bedrock_id": 262, - "bedrock_data": 2 + "bedrock_data": 0 }, "minecraft:tipped_arrow": { - "bedrock_id": 440, - "bedrock_data": 1 + "bedrock_id": 262, + "bedrock_data": 0 }, "minecraft:lingering_potion": { "bedrock_id": 441, "bedrock_data": 0 }, "minecraft:shield": { - "bedrock_id": 268, + "bedrock_id": 513, "bedrock_data": 0 }, "minecraft:elytra": { @@ -3356,7 +3356,7 @@ "bedrock_data": 0 }, "minecraft:debug_stick": { - "bedrock_id": 248, + "bedrock_id": 280, "bedrock_data": 0 }, "minecraft:music_disc_13": { @@ -3428,7 +3428,7 @@ "bedrock_data": 0 }, "minecraft:suspicious_stew": { - "bedrock_id": 248, + "bedrock_id": 734, "bedrock_data": 0 }, "minecraft:loom": { @@ -3436,75 +3436,75 @@ "bedrock_data": 0 }, "minecraft:flower_banner_pattern": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 434, + "bedrock_data": 2 }, "minecraft:creeper_banner_pattern": { - "bedrock_id": 248, + "bedrock_id": 434, "bedrock_data": 0 }, "minecraft:skull_banner_pattern": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 434, + "bedrock_data": 1 }, "minecraft:mojang_banner_pattern": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 434, + "bedrock_data": 3 }, "minecraft:globe_banner_pattern": { - "bedrock_id": 248, - "bedrock_data": 0 + "bedrock_id": 434, + "bedrock_data": 4 }, "minecraft:barrel": { - "bedrock_id": 248, + "bedrock_id": -203, "bedrock_data": 0 }, "minecraft:smoker": { - "bedrock_id": 248, + "bedrock_id": -198, "bedrock_data": 0 }, "minecraft:blast_furnace": { - "bedrock_id": 248, + "bedrock_id": -196, "bedrock_data": 0 }, "minecraft:cartography_table": { - "bedrock_id": 248, + "bedrock_id": -200, "bedrock_data": 0 }, "minecraft:fletching_table": { - "bedrock_id": 248, + "bedrock_id": -201, "bedrock_data": 0 }, "minecraft:grindstone": { - "bedrock_id": 248, + "bedrock_id": -195, "bedrock_data": 0 }, "minecraft:lectern": { - "bedrock_id": 248, + "bedrock_id": -194, "bedrock_data": 0 }, "minecraft:smithing_table": { - "bedrock_id": 248, + "bedrock_id": -202, "bedrock_data": 0 }, "minecraft:stonecutter": { - "bedrock_id": 248, + "bedrock_id": -197, "bedrock_data": 0 }, "minecraft:bell": { - "bedrock_id": 248, + "bedrock_id": -206, "bedrock_data": 0 }, "minecraft:lantern": { - "bedrock_id": 248, + "bedrock_id": -208, "bedrock_data": 0 }, "minecraft:sweet_berries": { - "bedrock_id": 248, + "bedrock_id": 477, "bedrock_data": 0 }, "minecraft:campfire": { - "bedrock_id": 248, + "bedrock_id": 720, "bedrock_data": 0 } } \ No newline at end of file From ae5b8a2540b976869abcd5f771c01fcdab8e889c Mon Sep 17 00:00:00 2001 From: Alisson Lauffer Date: Thu, 21 Nov 2019 00:46:08 -0300 Subject: [PATCH 37/50] Do not set logo height in README - This prevents logo from getting stretched --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1b6a4357..6278d4e1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Geyser +Geyser [![forthebadge made-with-java](http://ForTheBadge.com/images/badges/made-with-java.svg)](https://java.com/) From d7568ef52364e7a906b6c13a6ab5fa352d4cf1fc Mon Sep 17 00:00:00 2001 From: Redned Date: Fri, 22 Nov 2019 17:54:36 -0600 Subject: [PATCH 38/50] Fix entity types with wrong names --- .../java/org/geysermc/connector/entity/type/EntityType.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java b/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java index 88414531..70d53f40 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java +++ b/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java @@ -87,7 +87,7 @@ public enum EntityType { TRIPOD_CAMERA(62, 0f), PLAYER(63, 1.8f, 0.6f, 0.6f, 1.62f), ITEM(64, 0.25f, 0.25f), - PRIMED_TNT(65, 0.98f, 0.98f), + TNT(65, 0.98f, 0.98f), FALLING_BLOCK(66, 0.98f, 0.98f), MOVING_BLOCK(67, 0f), EXPERIENCE_BOTTLE(68, 0.25f, 0.25f), @@ -108,7 +108,7 @@ public enum EntityType { EGG(82, 0f), PAINTING(83, 0f), MINECART(84, 0f), - LARGE_FIREBALL(85, 0f), + FIREBALL(85, 0f), SPLASH_POTION(86, 0f), ENDER_PEARL(87, 0f), LEASH_KNOT(88, 0f), From 8725dba69cd56306bbac1f5ec735d1aded314d61 Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Tue, 26 Nov 2019 19:52:13 -0600 Subject: [PATCH 39/50] Fix offline mode console spam for skins --- .../main/java/org/geysermc/connector/utils/SkinUtils.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java b/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java index 988501b8..f6a845cb 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java @@ -9,6 +9,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import org.apache.commons.codec.Charsets; import org.geysermc.api.Geyser; +import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.entity.PlayerEntity; import org.geysermc.connector.network.session.GeyserSession; @@ -97,8 +98,10 @@ public class SkinUtils { return new GameProfileData(skinUrl, capeUrl, isAlex); } catch (Exception exception) { + if (!((GeyserConnector) Geyser.getConnector()).getConfig().getRemote().getAuthType().equals("offline")) { + Geyser.getLogger().debug("Got invalid texture data for " + profile.getName() + " " + exception.getMessage()); + } // return default skin with default cape when texture data is invalid - Geyser.getLogger().debug("Got invalid texture data for " + profile.getName() + " " + exception.getMessage()); return new GameProfileData("", "", false); } } From c67630dfb1dd04037b47dbcf7d6c53f79b332814 Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Tue, 26 Nov 2019 20:03:23 -0600 Subject: [PATCH 40/50] Update to latest NukkitX Protocol changes --- .../java/entity/player/JavaPlayerHealthTranslator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerHealthTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerHealthTranslator.java index 1abd4c1c..73376385 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerHealthTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerHealthTranslator.java @@ -63,7 +63,7 @@ public class JavaPlayerHealthTranslator extends PacketTranslator Date: Tue, 26 Nov 2019 21:12:35 -0600 Subject: [PATCH 41/50] Fix end crystal entity --- .../java/org/geysermc/connector/entity/type/EntityType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java b/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java index 70d53f40..d3286c8d 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java +++ b/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java @@ -93,7 +93,7 @@ public enum EntityType { EXPERIENCE_BOTTLE(68, 0.25f, 0.25f), EXPERIENCE_ORB(69, 0f), EYE_OF_ENDER(70, 0f), - ENDER_CRYSTAL(71, 0f), + END_CRYSTAL(71, 0f), FIREWORK_ROCKET(72, 0f), TRIDENT(73, 0f), TURTLE(74, 0.4f, 1.2f), From f06eb6f718996d2615df2db2e073ad361d50786b Mon Sep 17 00:00:00 2001 From: Redned Date: Wed, 27 Nov 2019 09:58:57 -0600 Subject: [PATCH 42/50] Bump NukkitX protocol library version --- connector/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/connector/pom.xml b/connector/pom.xml index 052ea6c0..7b295929 100644 --- a/connector/pom.xml +++ b/connector/pom.xml @@ -75,7 +75,7 @@ com.nukkitx.protocol bedrock-v388 - 2.4.0-SNAPSHOT + 2.4.0 compile @@ -164,4 +164,4 @@ - \ No newline at end of file + From 9875d204e32f8c0d6544506b1177b5eb1b903a38 Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Wed, 27 Nov 2019 19:30:30 -0600 Subject: [PATCH 43/50] Add more entity metadata translations and fix autojump (Closes #73) --- .../org/geysermc/connector/entity/Entity.java | 54 +++++++++----- .../geysermc/connector/entity/ItemEntity.java | 58 +++++++++++++++ .../connector/entity/PaintingEntity.java | 25 +++++++ .../network/translators/TranslatorsInit.java | 6 +- .../entity/JavaEntityMetadataTranslator.java | 35 +-------- .../player/JavaPlayerAbilitiesTranslator.java | 72 +++++++++++++++++++ 6 files changed, 193 insertions(+), 57 deletions(-) create mode 100644 connector/src/main/java/org/geysermc/connector/entity/ItemEntity.java create mode 100644 connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerAbilitiesTranslator.java diff --git a/connector/src/main/java/org/geysermc/connector/entity/Entity.java b/connector/src/main/java/org/geysermc/connector/entity/Entity.java index 8824c953..ba9fe4ab 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/Entity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/Entity.java @@ -25,16 +25,15 @@ package org.geysermc.connector.entity; -import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityPropertiesPacket; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.MetadataType; +import com.github.steveice10.mc.protocol.data.message.TextMessage; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.EntityData; import com.nukkitx.protocol.bedrock.data.EntityDataDictionary; import com.nukkitx.protocol.bedrock.data.EntityFlag; import com.nukkitx.protocol.bedrock.data.EntityFlags; -import com.nukkitx.protocol.bedrock.packet.AddEntityPacket; -import com.nukkitx.protocol.bedrock.packet.RemoveEntityPacket; -import com.nukkitx.protocol.bedrock.packet.SetEntityDataPacket; -import com.nukkitx.protocol.bedrock.packet.UpdateAttributesPacket; +import com.nukkitx.protocol.bedrock.packet.*; import lombok.Getter; import lombok.Setter; import org.geysermc.connector.console.GeyserLogger; @@ -43,6 +42,7 @@ import org.geysermc.connector.entity.attribute.AttributeType; import org.geysermc.connector.entity.type.EntityType; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.utils.AttributeUtils; +import org.geysermc.connector.utils.MessageUtils; import java.util.*; @@ -164,6 +164,36 @@ public class Entity { updateAttributesPacket.setRuntimeEntityId(geyserId); updateAttributesPacket.setAttributes(attributes); session.getUpstream().sendPacket(updateAttributesPacket); + } + + public void updateBedrockMetadata(EntityMetadata entityMetadata, GeyserSession session) { + switch (entityMetadata.getId()) { + case 0: + if (entityMetadata.getType() == MetadataType.BYTE) { + byte xd = (byte) entityMetadata.getValue(); + metadata.getFlags().setFlag(EntityFlag.ON_FIRE, (xd & 0x01) == 0x01); + metadata.getFlags().setFlag(EntityFlag.SNEAKING, (xd & 0x02) == 0x02); + metadata.getFlags().setFlag(EntityFlag.SPRINTING, (xd & 0x08) == 0x08); + metadata.getFlags().setFlag(EntityFlag.SWIMMING, (xd & 0x10) == 0x10); + metadata.getFlags().setFlag(EntityFlag.GLIDING, (xd & 0x80) == 0x80); + metadata.getFlags().setFlag(EntityFlag.INVISIBLE, (xd & 0x20) == 0x20); + } + break; + case 2: // custom name + TextMessage name = (TextMessage) entityMetadata.getValue(); + if (name != null) + metadata.put(EntityData.NAMETAG, MessageUtils.getBedrockMessage(name)); + break; + case 3: // is custom name visible + metadata.getFlags().setFlag(EntityFlag.ALWAYS_SHOW_NAME, (boolean) entityMetadata.getValue()); + break; + case 4: // silent + metadata.getFlags().setFlag(EntityFlag.SILENT, (boolean) entityMetadata.getValue()); + break; + case 5: // no gravity + metadata.getFlags().setFlag(EntityFlag.HAS_GRAVITY, !(boolean) entityMetadata.getValue()); + break; + } SetEntityDataPacket entityDataPacket = new SetEntityDataPacket(); entityDataPacket.setRuntimeEntityId(geyserId); @@ -171,20 +201,6 @@ public class Entity { session.getUpstream().sendPacket(entityDataPacket); } - // To be used at a later date - public void updateJavaAttributes(GeyserSession session) { - List attributes = new ArrayList<>(); - for (Map.Entry entry : this.attributes.entrySet()) { - if (!entry.getValue().getType().isBedrockAttribute()) - continue; - - attributes.add(AttributeUtils.getJavaAttribute(entry.getValue())); - } - - ServerEntityPropertiesPacket entityPropertiesPacket = new ServerEntityPropertiesPacket((int) entityId, attributes); - session.getDownstream().getSession().send(entityPropertiesPacket); - } - public void setPosition(Vector3f position) { if (is(PlayerEntity.class)) { this.position = position.add(0, entityType.getOffset(), 0); diff --git a/connector/src/main/java/org/geysermc/connector/entity/ItemEntity.java b/connector/src/main/java/org/geysermc/connector/entity/ItemEntity.java new file mode 100644 index 00000000..78c78f3f --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/entity/ItemEntity.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2019 GeyserMC. http://geysermc.org + * + * 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. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.connector.entity; + +import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; +import com.nukkitx.math.vector.Vector3f; +import com.nukkitx.protocol.bedrock.packet.AddItemEntityPacket; +import org.geysermc.connector.entity.type.EntityType; +import org.geysermc.connector.network.session.GeyserSession; +import org.geysermc.connector.network.translators.TranslatorsInit; + +public class ItemEntity extends Entity { + + public ItemEntity(long entityId, long geyserId, EntityType entityType, Vector3f position, Vector3f motion, Vector3f rotation) { + super(entityId, geyserId, entityType, position, motion, rotation); + } + + @Override + public void updateBedrockMetadata(EntityMetadata entityMetadata, GeyserSession session) { + if (entityMetadata.getId() == 7) { + AddItemEntityPacket itemPacket = new AddItemEntityPacket(); + itemPacket.setRuntimeEntityId(geyserId); + itemPacket.setPosition(position); + itemPacket.setMotion(motion); + itemPacket.setUniqueEntityId(geyserId); + itemPacket.setFromFishing(false); + itemPacket.getMetadata().putAll(metadata); + itemPacket.setItemInHand(TranslatorsInit.getItemTranslator().translateToBedrock((ItemStack) entityMetadata.getValue())); + session.getUpstream().sendPacket(itemPacket); + } + + super.updateBedrockMetadata(entityMetadata, session); + } +} diff --git a/connector/src/main/java/org/geysermc/connector/entity/PaintingEntity.java b/connector/src/main/java/org/geysermc/connector/entity/PaintingEntity.java index f9f6e37f..b598b9bf 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/PaintingEntity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/PaintingEntity.java @@ -1,3 +1,28 @@ +/* + * Copyright (c) 2019 GeyserMC. http://geysermc.org + * + * 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. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + package org.geysermc.connector.entity; import com.nukkitx.math.vector.Vector3f; 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 6539fb05..694ae525 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 @@ -27,10 +27,7 @@ package org.geysermc.connector.network.translators; import com.github.steveice10.mc.protocol.packet.ingame.server.*; import com.github.steveice10.mc.protocol.packet.ingame.server.entity.*; -import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.ServerPlayerActionAckPacket; -import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.ServerPlayerHealthPacket; -import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.ServerPlayerPositionRotationPacket; -import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.ServerPlayerSetExperiencePacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.*; import com.github.steveice10.mc.protocol.packet.ingame.server.entity.spawn.*; import com.github.steveice10.mc.protocol.packet.ingame.server.scoreboard.ServerDisplayScoreboardPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.scoreboard.ServerScoreboardObjectivePacket; @@ -129,6 +126,7 @@ public class TranslatorsInit { Registry.registerJava(ServerPlayerSetExperiencePacket.class, new JavaPlayerSetExperienceTranslator()); Registry.registerJava(ServerPlayerHealthPacket.class, new JavaPlayerHealthTranslator()); Registry.registerJava(ServerPlayerActionAckPacket.class, new JavaPlayerActionAckTranslator()); + Registry.registerJava(ServerPlayerAbilitiesPacket.class, new JavaPlayerAbilitiesTranslator()); Registry.registerJava(ServerNotifyClientPacket.class, new JavaNotifyClientTranslator()); Registry.registerJava(ServerChunkDataPacket.class, new JavaChunkDataTranslator()); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityMetadataTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityMetadataTranslator.java index a21b2f86..85efcc68 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityMetadataTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityMetadataTranslator.java @@ -26,17 +26,10 @@ package org.geysermc.connector.network.translators.java.entity; import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadata; -import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; -import com.github.steveice10.mc.protocol.data.game.entity.metadata.MetadataType; import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityMetadataPacket; -import com.nukkitx.protocol.bedrock.data.EntityFlag; -import com.nukkitx.protocol.bedrock.packet.AddItemEntityPacket; -import com.nukkitx.protocol.bedrock.packet.SetEntityDataPacket; import org.geysermc.connector.entity.Entity; -import org.geysermc.connector.entity.type.EntityType; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; -import org.geysermc.connector.network.translators.TranslatorsInit; public class JavaEntityMetadataTranslator extends PacketTranslator { @@ -49,35 +42,9 @@ public class JavaEntityMetadataTranslator extends PacketTranslator { + + @Override + public void translate(ServerPlayerAbilitiesPacket packet, GeyserSession session) { + Entity entity = session.getPlayerEntity(); + if (entity == null) + return; + + EntityDataDictionary metadata = entity.getMetadata(); + metadata.getFlags().setFlag(EntityFlag.CAN_FLY, packet.isCanFly()); + + SetEntityDataPacket entityDataPacket = new SetEntityDataPacket(); + entityDataPacket.setRuntimeEntityId(entity.getGeyserId()); + entityDataPacket.getMetadata().putAll(metadata); + session.getUpstream().sendPacket(entityDataPacket); + + int playerFlags = 0; + + playerFlags = setPlayerFlag(0x20, true, playerFlags); // auto jump + playerFlags = setPlayerFlag(0x40, packet.isCanFly(), playerFlags); // can fly + playerFlags = setPlayerFlag(0x200, packet.isFlying(), playerFlags); // is flying + + AdventureSettingsPacket adventureSettingsPacket = new AdventureSettingsPacket(); + adventureSettingsPacket.setUniqueEntityId(entity.getGeyserId()); + adventureSettingsPacket.setPlayerFlags(playerFlags); + session.getUpstream().sendPacket(adventureSettingsPacket); + } + + private int setPlayerFlag(int flag, boolean value, int playerFlags) { + if (value) { + return playerFlags | flag; + } else { + return playerFlags & ~flag; + } + } +} From 0e7fff0b9b7e4f5975faabb0737c817c6cd81627 Mon Sep 17 00:00:00 2001 From: Redned Date: Wed, 27 Nov 2019 20:58:58 -0600 Subject: [PATCH 44/50] Fix permissions --- .../java/entity/player/JavaPlayerAbilitiesTranslator.java | 1 + 1 file changed, 1 insertion(+) diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerAbilitiesTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerAbilitiesTranslator.java index 0daa03ad..25ebf1af 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerAbilitiesTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerAbilitiesTranslator.java @@ -57,6 +57,7 @@ public class JavaPlayerAbilitiesTranslator extends PacketTranslator Date: Wed, 27 Nov 2019 21:22:27 -0600 Subject: [PATCH 45/50] (Actually) fix offline mode skins --- .../src/main/java/org/geysermc/connector/utils/SkinUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java b/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java index 407212dd..b4c9d7f6 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java @@ -100,7 +100,7 @@ public class SkinUtils { Geyser.getLogger().debug("Got invalid texture data for " + profile.getName() + " " + exception.getMessage()); } // return default skin with default cape when texture data is invalid - return new GameProfileData("", "", false); + return new GameProfileData(SkinProvider.EMPTY_SKIN.getTextureUrl(), SkinProvider.EMPTY_CAPE.getTextureUrl(), false); } } } From 7a4621cf51f284baf8bd043729fcdecf848c5b09 Mon Sep 17 00:00:00 2001 From: Redned Date: Wed, 27 Nov 2019 22:33:45 -0600 Subject: [PATCH 46/50] Fix 'version' typo in startup message --- .../src/main/java/org/geysermc/connector/GeyserConnector.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java index cc16f70e..bfd1e07e 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -110,7 +110,7 @@ public class GeyserConnector implements Connector { logger.info("******************************************"); logger.info(""); - logger.info("Loading " + NAME + " vesion " + VERSION); + logger.info("Loading " + NAME + " version " + VERSION); logger.info(""); logger.info("******************************************"); From faffa07e896f978dcd5f32edc9e6616b3871f663 Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Thu, 28 Nov 2019 10:10:32 -0600 Subject: [PATCH 47/50] Fix flying in creative mode Flying with commands such as /fly will not work for now (it didn't in the first place). This will need to be addressed later. --- .../network/translators/TranslatorsInit.java | 4 +- .../world/JavaNotifyClientTranslator.java | 44 ++++++++++++++++--- 2 files changed, 40 insertions(+), 8 deletions(-) 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 694ae525..4f6e21e7 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 @@ -126,7 +126,9 @@ public class TranslatorsInit { Registry.registerJava(ServerPlayerSetExperiencePacket.class, new JavaPlayerSetExperienceTranslator()); Registry.registerJava(ServerPlayerHealthPacket.class, new JavaPlayerHealthTranslator()); Registry.registerJava(ServerPlayerActionAckPacket.class, new JavaPlayerActionAckTranslator()); - Registry.registerJava(ServerPlayerAbilitiesPacket.class, new JavaPlayerAbilitiesTranslator()); + + // FIXME: This translator messes with allowing flight in creative mode. Will need to be addressed later + // Registry.registerJava(ServerPlayerAbilitiesPacket.class, new JavaPlayerAbilitiesTranslator()); Registry.registerJava(ServerNotifyClientPacket.class, new JavaNotifyClientTranslator()); Registry.registerJava(ServerChunkDataPacket.class, new JavaChunkDataTranslator()); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaNotifyClientTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaNotifyClientTranslator.java index 6c1b51ae..2a6d4a57 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaNotifyClientTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaNotifyClientTranslator.java @@ -28,9 +28,9 @@ package org.geysermc.connector.network.translators.java.world; import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode; import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerNotifyClientPacket; import com.nukkitx.math.vector.Vector3f; -import com.nukkitx.protocol.bedrock.packet.LevelEventPacket; -import com.nukkitx.protocol.bedrock.packet.SetPlayerGameTypePacket; -import com.nukkitx.protocol.bedrock.packet.ShowCreditsPacket; +import com.nukkitx.protocol.bedrock.data.EntityDataDictionary; +import com.nukkitx.protocol.bedrock.data.EntityFlag; +import com.nukkitx.protocol.bedrock.packet.*; import org.geysermc.connector.entity.Entity; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; @@ -41,6 +41,10 @@ public class JavaNotifyClientTranslator extends PacketTranslator Date: Thu, 28 Nov 2019 10:35:06 -0600 Subject: [PATCH 48/50] Update wood mappings --- connector/src/main/resources/blocks.json | 72 ++++++++++++------------ 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/connector/src/main/resources/blocks.json b/connector/src/main/resources/blocks.json index 0e8f0d0e..83fbe14b 100644 --- a/connector/src/main/resources/blocks.json +++ b/connector/src/main/resources/blocks.json @@ -432,76 +432,76 @@ "bedrock_data": 2 }, "minecraft:oak_wood[axis=x]": { - "bedrock_identifier": "minecraft:log", - "bedrock_data": 12 + "bedrock_identifier": "minecraft:wood", + "bedrock_data": 16 }, "minecraft:oak_wood[axis=y]": { - "bedrock_identifier": "minecraft:log", - "bedrock_data": 12 + "bedrock_identifier": "minecraft:wood", + "bedrock_data": 0 }, "minecraft:oak_wood[axis=z]": { - "bedrock_identifier": "minecraft:log", - "bedrock_data": 12 + "bedrock_identifier": "minecraft:wood", + "bedrock_data": 32 }, "minecraft:spruce_wood[axis=x]": { - "bedrock_identifier": "minecraft:log", - "bedrock_data": 13 + "bedrock_identifier": "minecraft:wood", + "bedrock_data": 17 }, "minecraft:spruce_wood[axis=y]": { - "bedrock_identifier": "minecraft:log", - "bedrock_data": 13 + "bedrock_identifier": "minecraft:wood", + "bedrock_data": 1 }, "minecraft:spruce_wood[axis=z]": { - "bedrock_identifier": "minecraft:log", - "bedrock_data": 13 + "bedrock_identifier": "minecraft:wood", + "bedrock_data": 33 }, "minecraft:birch_wood[axis=x]": { - "bedrock_identifier": "minecraft:log", - "bedrock_data": 14 + "bedrock_identifier": "minecraft:wood", + "bedrock_data": 18 }, "minecraft:birch_wood[axis=y]": { - "bedrock_identifier": "minecraft:log", - "bedrock_data": 14 + "bedrock_identifier": "minecraft:wood", + "bedrock_data": 2 }, "minecraft:birch_wood[axis=z]": { - "bedrock_identifier": "minecraft:log", - "bedrock_data": 14 + "bedrock_identifier": "minecraft:wood", + "bedrock_data": 34 }, "minecraft:jungle_wood[axis=x]": { - "bedrock_identifier": "minecraft:log", - "bedrock_data": 15 + "bedrock_identifier": "minecraft:wood", + "bedrock_data": 19 }, "minecraft:jungle_wood[axis=y]": { - "bedrock_identifier": "minecraft:log", - "bedrock_data": 15 + "bedrock_identifier": "minecraft:wood", + "bedrock_data": 3 }, "minecraft:jungle_wood[axis=z]": { - "bedrock_identifier": "minecraft:log", - "bedrock_data": 15 + "bedrock_identifier": "minecraft:wood", + "bedrock_data": 35 }, "minecraft:acacia_wood[axis=x]": { - "bedrock_identifier": "minecraft:log2", - "bedrock_data": 12 + "bedrock_identifier": "minecraft:wood", + "bedrock_data": 20 }, "minecraft:acacia_wood[axis=y]": { - "bedrock_identifier": "minecraft:log2", - "bedrock_data": 12 + "bedrock_identifier": "minecraft:wood", + "bedrock_data": 4 }, "minecraft:acacia_wood[axis=z]": { - "bedrock_identifier": "minecraft:log2", - "bedrock_data": 12 + "bedrock_identifier": "minecraft:wood", + "bedrock_data": 36 }, "minecraft:dark_oak_wood[axis=x]": { - "bedrock_identifier": "minecraft:log2", - "bedrock_data": 13 + "bedrock_identifier": "minecraft:wood", + "bedrock_data": 21 }, "minecraft:dark_oak_wood[axis=y]": { - "bedrock_identifier": "minecraft:log2", - "bedrock_data": 13 + "bedrock_identifier": "minecraft:wood", + "bedrock_data": 5 }, "minecraft:dark_oak_wood[axis=z]": { - "bedrock_identifier": "minecraft:log2", - "bedrock_data": 13 + "bedrock_identifier": "minecraft:wood", + "bedrock_data": 37 }, "minecraft:stripped_oak_wood[axis=x]": { "bedrock_identifier": "minecraft:stripped_oak_log", From 28693ff8294de1b97111114baa586e6f3a47513a Mon Sep 17 00:00:00 2001 From: Redned Date: Thu, 28 Nov 2019 15:06:09 -0600 Subject: [PATCH 49/50] Add maven workflow --- .github/workflows/maven.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/maven.yml diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml new file mode 100644 index 00000000..91106d3f --- /dev/null +++ b/.github/workflows/maven.yml @@ -0,0 +1,17 @@ +name: Java CI + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Build with Maven + run: mvn -B package --file pom.xml From 89cfbdcdfd6b8482792db199b12357cc123c6fe5 Mon Sep 17 00:00:00 2001 From: Redned Date: Thu, 28 Nov 2019 15:13:58 -0600 Subject: [PATCH 50/50] Update workflows to build PRs --- .github/workflows/maven.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 91106d3f..d8c2beeb 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -1,6 +1,6 @@ name: Java CI -on: [push] +on: [push, pull_request] jobs: build: