From d06f963b6790441f4cb83e93267a651e214a88b3 Mon Sep 17 00:00:00 2001 From: AJ Ferguson Date: Fri, 20 Dec 2019 20:05:20 -0900 Subject: [PATCH 1/6] Block states and fix waterlogged blocks --- .../network/UpstreamPacketHandler.java | 2 +- .../network/session/GeyserSession.java | 2 +- .../network/session/cache/ChunkCache.java | 2 +- .../network/translators/block/BlockEntry.java | 7 +-- .../translators/block/BlockTranslator.java | 17 +++++- .../player/JavaPlayerActionAckTranslator.java | 19 +------ .../java/world/JavaBlockChangeTranslator.java | 23 +------- .../world/JavaMultiBlockChangeTranslator.java | 20 +------ .../geysermc/connector/utils/ChunkUtils.java | 39 +++++++++++-- .../org/geysermc/connector/utils/Toolbox.java | 52 +++++++++++------- .../connector/world/GlobalBlockPalette.java | 47 ---------------- .../connector/world/chunk/BlockStorage.java | 15 ++--- .../bedrock/runtime_block_states-1.14.dat | Bin 302699 -> 0 bytes .../bedrock/runtime_block_states.dat | Bin 319351 -> 302699 bytes connector/src/main/resources/mappings | 2 +- 15 files changed, 98 insertions(+), 149 deletions(-) delete mode 100644 connector/src/main/java/org/geysermc/connector/world/GlobalBlockPalette.java delete mode 100644 connector/src/main/resources/bedrock/runtime_block_states-1.14.dat 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 555e54e6..929a9c34 100644 --- a/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java +++ b/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java @@ -72,7 +72,7 @@ public class UpstreamPacketHandler extends LoggingPacketHandler { ResourcePackStackPacket stack = new ResourcePackStackPacket(); stack.setExperimental(false); stack.setForcedToAccept(false); - stack.setGameVersion(GeyserConnector.BEDROCK_PACKET_CODEC.getMinecraftVersion()); + stack.setGameVersion("*"); session.getUpstream().sendPacket(stack); break; default: 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 8fedc583..52ee3823 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 @@ -322,7 +322,7 @@ public class GeyserSession implements Player { startGamePacket.setMultiplayerCorrelationId(""); startGamePacket.setBlockPalette(Toolbox.BLOCKS); startGamePacket.setItemEntries(Toolbox.ITEMS); - startGamePacket.setVanillaVersion(GeyserConnector.BEDROCK_PACKET_CODEC.getMinecraftVersion()); + startGamePacket.setVanillaVersion("*"); // startGamePacket.setMovementServerAuthoritative(true); upstream.sendPacket(startGamePacket); } 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 44de2b00..3ff1b7f9 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 @@ -79,7 +79,7 @@ public class ChunkCache { Position blockPosition = chunkPosition.getChunkBlock(position.getX(), position.getY(), position.getZ()); if (chunk != null) { BlockState blockState = chunk.get(blockPosition.getX(), blockPosition.getY(), blockPosition.getZ()); - return TranslatorsInit.getBlockTranslator().getBedrockBlock(blockState); + return TranslatorsInit.getBlockTranslator().getBlockEntry(blockState); } return BlockEntry.AIR; diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockEntry.java b/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockEntry.java index 47edde73..244b580c 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockEntry.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockEntry.java @@ -32,16 +32,15 @@ import lombok.Getter; @AllArgsConstructor public class BlockEntry { - public static BlockEntry AIR = new BlockEntry("minecraft:air", 0, 0, 0); + public static BlockEntry AIR = new BlockEntry("minecraft:air", 0, 0); private String javaIdentifier; private int javaId; - private int bedrockId; - private int bedrockData; + private int bedrockRuntimeId; @Override public boolean equals(Object obj) { - return obj == this || (obj instanceof BlockEntry && ((BlockEntry) obj).getBedrockId() == this.getBedrockId() && ((BlockEntry) obj).getJavaIdentifier().equals(this.getJavaIdentifier())); + return obj == this || (obj instanceof BlockEntry && ((BlockEntry) obj).getBedrockRuntimeId() == this.getBedrockRuntimeId() && ((BlockEntry) obj).getJavaIdentifier().equals(this.getJavaIdentifier())); } } 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 c9a967da..1ea3470b 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 @@ -3,9 +3,22 @@ package org.geysermc.connector.network.translators.block; import com.github.steveice10.mc.protocol.data.game.world.block.BlockState; import org.geysermc.connector.utils.Toolbox; -public class BlockTranslator { +import java.util.HashMap; +import java.util.Map; - public BlockEntry getBedrockBlock(BlockState state) { +public class BlockTranslator { + private final Map javaIdentifierMap = new HashMap<>(); + + public BlockEntry getBlockEntry(BlockState state) { return Toolbox.BLOCK_ENTRIES.get(state.getId()); } + + public BlockEntry getBlockEntry(String javaIdentifier) { + return javaIdentifierMap.computeIfAbsent(javaIdentifier, key -> Toolbox.BLOCK_ENTRIES.values() + .stream().filter(blockEntry -> blockEntry.getJavaIdentifier().equals(key)).findFirst().orElse(null)); + } + + public boolean isWaterLogged(BlockEntry entry) { + return (entry.getJavaIdentifier().contains("waterlogged=true") || entry.getJavaIdentifier().startsWith("minecraft:kelp") || entry.getJavaIdentifier().contains("seagrass")); + } } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerActionAckTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerActionAckTranslator.java index 3213a2fd..df2c914f 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerActionAckTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerActionAckTranslator.java @@ -26,13 +26,9 @@ package org.geysermc.connector.network.translators.java.entity.player; import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.ServerPlayerActionAckPacket; -import com.nukkitx.math.vector.Vector3i; -import com.nukkitx.protocol.bedrock.packet.UpdateBlockPacket; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; -import org.geysermc.connector.network.translators.TranslatorsInit; -import org.geysermc.connector.network.translators.block.BlockEntry; -import org.geysermc.connector.world.GlobalBlockPalette; +import org.geysermc.connector.utils.ChunkUtils; public class JavaPlayerActionAckTranslator extends PacketTranslator { @@ -40,18 +36,7 @@ public class JavaPlayerActionAckTranslator extends PacketTranslator { + @Override public void translate(ServerBlockChangePacket packet, GeyserSession session) { - UpdateBlockPacket updateBlockPacket = new UpdateBlockPacket(); - BlockChangeRecord record = packet.getRecord(); - updateBlockPacket.setDataLayer(0); - updateBlockPacket.setBlockPosition(Vector3i.from( - record.getPosition().getX(), - record.getPosition().getY(), - record.getPosition().getZ() - )); - - BlockEntry itemEntry = TranslatorsInit.getBlockTranslator().getBedrockBlock(record.getBlock()); - updateBlockPacket.setRuntimeId(GlobalBlockPalette.getOrCreateRuntimeId(itemEntry.getBedrockId() << 4 | itemEntry.getBedrockData())); - updateBlockPacket.getFlags().add(UpdateBlockPacket.Flag.NEIGHBORS); - - session.getUpstream().sendPacket(updateBlockPacket); + ChunkUtils.updateBlock(session, packet.getRecord().getBlock(), packet.getRecord().getPosition()); } } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaMultiBlockChangeTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaMultiBlockChangeTranslator.java index 14864b8c..9f4e36cc 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaMultiBlockChangeTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaMultiBlockChangeTranslator.java @@ -27,32 +27,16 @@ package org.geysermc.connector.network.translators.java.world; import com.github.steveice10.mc.protocol.data.game.world.block.BlockChangeRecord; import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerMultiBlockChangePacket; -import com.nukkitx.math.vector.Vector3i; -import com.nukkitx.protocol.bedrock.packet.UpdateBlockPacket; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; -import org.geysermc.connector.network.translators.TranslatorsInit; -import org.geysermc.connector.network.translators.block.BlockEntry; -import org.geysermc.connector.world.GlobalBlockPalette; +import org.geysermc.connector.utils.ChunkUtils; public class JavaMultiBlockChangeTranslator extends PacketTranslator { @Override public void translate(ServerMultiBlockChangePacket packet, GeyserSession session) { for (BlockChangeRecord record : packet.getRecords()) { - UpdateBlockPacket updateBlockPacket = new UpdateBlockPacket(); - updateBlockPacket.setDataLayer(0); - updateBlockPacket.setBlockPosition(Vector3i.from( - record.getPosition().getX(), - record.getPosition().getY(), - record.getPosition().getZ() - )); - - BlockEntry blockEntry = TranslatorsInit.getBlockTranslator().getBedrockBlock(record.getBlock()); - updateBlockPacket.setRuntimeId(GlobalBlockPalette.getOrCreateRuntimeId(blockEntry.getBedrockId() << 4 | blockEntry.getBedrockData())); - updateBlockPacket.getFlags().add(UpdateBlockPacket.Flag.NEIGHBORS); - - session.getUpstream().sendPacket(updateBlockPacket); + ChunkUtils.updateBlock(session, record.getBlock(), record.getPosition()); } } } 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 6f2b6d3c..bc6c739b 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java @@ -2,13 +2,17 @@ package org.geysermc.connector.utils; import com.github.steveice10.mc.protocol.data.game.chunk.Chunk; import com.github.steveice10.mc.protocol.data.game.chunk.Column; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; +import com.github.steveice10.mc.protocol.data.game.world.block.BlockChangeRecord; import com.github.steveice10.mc.protocol.data.game.world.block.BlockState; +import com.nukkitx.math.vector.Vector3i; +import com.nukkitx.protocol.bedrock.packet.UpdateBlockPacket; +import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.TranslatorsInit; import org.geysermc.connector.network.translators.block.BlockEntry; import org.geysermc.connector.world.chunk.ChunkSection; public class ChunkUtils { - public static ChunkData translateToBedrock(Column column) { ChunkData chunkData = new ChunkData(); @@ -29,14 +33,14 @@ public class ChunkUtils { for (int y = 0; y < 16; y++) { for (int z = 0; z < 16; z++) { BlockState blockState = chunk.get(x, y, z); - BlockEntry block = TranslatorsInit.getBlockTranslator().getBedrockBlock(blockState); + BlockEntry block = TranslatorsInit.getBlockTranslator().getBlockEntry(blockState); section.getBlockStorageArray()[0].setFullBlock(ChunkSection.blockPosition(x, y, z), - block.getBedrockId() << 4 | block.getBedrockData()); + block.getBedrockRuntimeId()); - if (block.getJavaIdentifier().contains("waterlogged=true")) { - section.getBlockStorageArray()[1].setFullBlock(ChunkSection.blockPosition(x, y, z), - 9 << 4); // water id + if (TranslatorsInit.getBlockTranslator().isWaterLogged(block)) { + BlockEntry water = TranslatorsInit.getBlockTranslator().getBlockEntry("minecraft:water[level=0]"); + section.getBlockStorageArray()[1].setFullBlock(ChunkSection.blockPosition(x, y, z), water.getBedrockRuntimeId()); } } } @@ -45,6 +49,29 @@ public class ChunkUtils { return chunkData; } + public static void updateBlock(GeyserSession session, BlockState blockState, Position position) { + BlockEntry blockEntry = TranslatorsInit.getBlockTranslator().getBlockEntry(blockState); + Vector3i pos = Vector3i.from(position.getX(), position.getY(), position.getZ()); + + UpdateBlockPacket updateBlockPacket = new UpdateBlockPacket(); + updateBlockPacket.setDataLayer(0); + updateBlockPacket.setBlockPosition(pos); + updateBlockPacket.setRuntimeId(blockEntry.getBedrockRuntimeId()); + updateBlockPacket.getFlags().add(UpdateBlockPacket.Flag.NEIGHBORS); + session.getUpstream().sendPacket(updateBlockPacket); + + UpdateBlockPacket waterPacket = new UpdateBlockPacket(); + waterPacket.setDataLayer(1); + waterPacket.setBlockPosition(pos); + if (TranslatorsInit.getBlockTranslator().isWaterLogged(blockEntry)) { + BlockEntry water = TranslatorsInit.getBlockTranslator().getBlockEntry("minecraft:water[level=0]"); + waterPacket.setRuntimeId(water.getBedrockRuntimeId()); + } else { + waterPacket.setRuntimeId(0); + } + session.getUpstream().sendPacket(waterPacket); + } + public static final class ChunkData { public ChunkSection[] sections; 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 74a1be96..9522e391 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java +++ b/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java @@ -5,6 +5,7 @@ import com.nukkitx.nbt.NbtUtils; import com.nukkitx.nbt.stream.NBTInputStream; import com.nukkitx.nbt.tag.CompoundTag; import com.nukkitx.nbt.tag.ListTag; +import com.nukkitx.nbt.tag.Tag; import com.nukkitx.protocol.bedrock.packet.StartGamePacket; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; @@ -13,7 +14,6 @@ import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.console.GeyserLogger; import org.geysermc.connector.network.translators.block.BlockEntry; import org.geysermc.connector.network.translators.item.ItemEntry; -import org.geysermc.connector.world.GlobalBlockPalette; import java.io.InputStream; import java.util.*; @@ -32,7 +32,6 @@ public class Toolbox { throw new AssertionError("Unable to find bedrock/runtime_block_states.dat"); } - Map blockIdToIdentifier = new HashMap<>(); ListTag blocksTag; NBTInputStream nbtInputStream = NbtUtils.createNetworkReader(stream); @@ -44,15 +43,6 @@ public class Toolbox { throw new AssertionError(ex); } - for (CompoundTag entry : blocksTag.getValue()) { - String name = entry.getAsCompound("block").getAsString("name"); - int id = entry.getAsShort("id"); - int data = entry.getAsShort("meta"); - - blockIdToIdentifier.put(name, id); - GlobalBlockPalette.registerMapping(id << 4 | data); - } - BLOCKS = blocksTag; InputStream stream2 = Toolbox.class.getClassLoader().getResourceAsStream("bedrock/items.json"); if (stream2 == null) { @@ -97,16 +87,38 @@ public class Toolbox { ex.printStackTrace(); } - 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!"); - BLOCK_ENTRIES.put(blockIndex, new BlockEntry(itemEntry.getKey(), blockIndex, 248, 0)); // update block - } else { - BLOCK_ENTRIES.put(blockIndex, new BlockEntry(itemEntry.getKey(), blockIndex, blockIdToIdentifier.get(itemEntry.getValue().get("bedrock_identifier")), (int) itemEntry.getValue().get("bedrock_data"))); - } + int javaIndex = -1; + javaLoop: + for (Map.Entry> javaEntry : blocks.entrySet()) { + javaIndex++; + String wantedIdentifier = (String) javaEntry.getValue().get("bedrock_identifier"); + Map wantedStates = (Map) javaEntry.getValue().get("bedrock_states"); - blockIndex++; + int bedrockIndex = -1; + bedrockLoop: + for (CompoundTag bedrockEntry : BLOCKS.getValue()) { + bedrockIndex++; + CompoundTag blockTag = bedrockEntry.getAsCompound("block"); + if (blockTag.getAsString("name").equals(wantedIdentifier)) { + if (wantedStates != null) { + Map> bedrockStates = blockTag.getAsCompound("states").getValue(); + for (Map.Entry stateEntry : wantedStates.entrySet()) { + Tag bedrockStateTag = bedrockStates.get(stateEntry.getKey()); + if (bedrockStateTag == null) + continue bedrockLoop; + Object bedrockStateValue = bedrockStateTag.getValue(); + if (bedrockStateValue instanceof Byte) + bedrockStateValue = ((Byte) bedrockStateValue).intValue(); + if (!stateEntry.getValue().equals(bedrockStateValue)) + continue bedrockLoop; + } + } + BlockEntry blockEntry = new BlockEntry(javaEntry.getKey(), javaIndex, bedrockIndex); + BLOCK_ENTRIES.put(javaIndex, blockEntry); + continue javaLoop; + } + } + GeyserLogger.DEFAULT.debug("Mapping " + javaEntry.getKey() + " was not found for bedrock edition!"); } } } \ No newline at end of file diff --git a/connector/src/main/java/org/geysermc/connector/world/GlobalBlockPalette.java b/connector/src/main/java/org/geysermc/connector/world/GlobalBlockPalette.java deleted file mode 100644 index 9965acfa..00000000 --- a/connector/src/main/java/org/geysermc/connector/world/GlobalBlockPalette.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.geysermc.connector.world; - -import it.unimi.dsi.fastutil.ints.Int2IntMap; -import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; - -import java.util.NoSuchElementException; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * Adapted from NukkitX: https://github.com/NukkitX/Nukkit - */ -public class GlobalBlockPalette { - - private static final Int2IntMap legacyToRuntimeId = new Int2IntOpenHashMap(); - private static final Int2IntMap runtimeIdToLegacy = new Int2IntOpenHashMap(); - private static final AtomicInteger runtimeIdAllocator = new AtomicInteger(0); - - static { - legacyToRuntimeId.defaultReturnValue(-1); - runtimeIdToLegacy.defaultReturnValue(-1); - } - - public static int getOrCreateRuntimeId(int id, int meta) { - return getOrCreateRuntimeId((id << 4) | meta); - } - - public static int getOrCreateRuntimeId(int legacyId) throws NoSuchElementException { - int runtimeId = legacyToRuntimeId.get(legacyId); - if (!legacyToRuntimeId.containsKey(legacyId) || runtimeId == -1) { - //runtimeId = registerMapping(runtimeIdAllocator.incrementAndGet(), legacyId); - // throw new NoSuchElementException("Unmapped block registered id:" + (legacyId >>> 4) + " meta:" + (legacyId & 0xf)); - return 0; - } - return runtimeId; - } - - public static int registerMapping(int legacyId) { - int runtimeId = runtimeIdAllocator.getAndIncrement(); - runtimeIdToLegacy.put(runtimeId, legacyId); - legacyToRuntimeId.put(legacyId, runtimeId); - return runtimeId; - } - - public static int getLegacyId(int runtimeId) { - return runtimeIdToLegacy.get(runtimeId); - } -} diff --git a/connector/src/main/java/org/geysermc/connector/world/chunk/BlockStorage.java b/connector/src/main/java/org/geysermc/connector/world/chunk/BlockStorage.java index dbb967d4..4d0cb9c2 100644 --- a/connector/src/main/java/org/geysermc/connector/world/chunk/BlockStorage.java +++ b/connector/src/main/java/org/geysermc/connector/world/chunk/BlockStorage.java @@ -4,7 +4,6 @@ import com.nukkitx.network.VarInts; import io.netty.buffer.ByteBuf; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; -import org.geysermc.connector.world.GlobalBlockPalette; import org.geysermc.connector.world.chunk.bitarray.BitArray; import org.geysermc.connector.world.chunk.bitarray.BitArrayVersion; @@ -44,11 +43,11 @@ public class BlockStorage { } public synchronized int getFullBlock(int index) { - return this.legacyIdFor(this.bitArray.get(index)); + return this.palette.getInt(this.bitArray.get(index)); } - public synchronized void setFullBlock(int index, int legacyId) { - int idx = this.idFor(legacyId); + public synchronized void setFullBlock(int index, int runtimeId) { + int idx = this.idFor(runtimeId); this.bitArray.set(index, idx); } @@ -72,8 +71,7 @@ public class BlockStorage { this.bitArray = newBitArray; } - private int idFor(int legacyId) { - int runtimeId = GlobalBlockPalette.getOrCreateRuntimeId(legacyId); + private int idFor(int runtimeId) { int index = this.palette.indexOf(runtimeId); if (index != -1) { return index; @@ -91,11 +89,6 @@ public class BlockStorage { return index; } - private int legacyIdFor(int index) { - int runtimeId = this.palette.get(index); - return GlobalBlockPalette.getLegacyId(runtimeId); - } - public boolean isEmpty() { if (this.palette.size() == 1) { return true; diff --git a/connector/src/main/resources/bedrock/runtime_block_states-1.14.dat b/connector/src/main/resources/bedrock/runtime_block_states-1.14.dat deleted file mode 100644 index 38b413c2d14b0dce04f33af6f0f25578c39c580f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 302699 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 diff --git a/connector/src/main/resources/bedrock/runtime_block_states.dat b/connector/src/main/resources/bedrock/runtime_block_states.dat index a0623f43e58e6120fbf110852751fd04e52518b0..0c79ab2fda69f179702313551ebd61e6cc128854 100644 GIT binary patch literal 302699 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 Date: Sat, 21 Dec 2019 14:14:20 -0900 Subject: [PATCH 2/6] Fix bubble columns --- .../connector/network/translators/block/BlockTranslator.java | 5 ++++- connector/src/main/resources/mappings | 2 +- 2 files changed, 5 insertions(+), 2 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 1ea3470b..31be9fa4 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 @@ -19,6 +19,9 @@ public class BlockTranslator { } public boolean isWaterLogged(BlockEntry entry) { - return (entry.getJavaIdentifier().contains("waterlogged=true") || entry.getJavaIdentifier().startsWith("minecraft:kelp") || entry.getJavaIdentifier().contains("seagrass")); + return (entry.getJavaIdentifier().contains("waterlogged=true") + || entry.getJavaIdentifier().startsWith("minecraft:kelp") + || entry.getJavaIdentifier().contains("seagrass") + || entry.getJavaIdentifier().startsWith("minecraft:bubble_column")); } } diff --git a/connector/src/main/resources/mappings b/connector/src/main/resources/mappings index 3b962523..582fb160 160000 --- a/connector/src/main/resources/mappings +++ b/connector/src/main/resources/mappings @@ -1 +1 @@ -Subproject commit 3b962523aee0bb9e74a3a4d7f0c9a4964f942d38 +Subproject commit 582fb1609ffde735e514b99550362a9a533fc88a From 776d4c65857b6ab5bce9deb6c3aaba83ef905bdd Mon Sep 17 00:00:00 2001 From: AJ Ferguson Date: Sun, 22 Dec 2019 00:32:49 -0900 Subject: [PATCH 3/6] Optimize waterlogged check --- .../network/translators/block/BlockEntry.java | 18 +++++++++++++----- .../translators/block/BlockTranslator.java | 7 ------- .../geysermc/connector/utils/ChunkUtils.java | 4 ++-- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockEntry.java b/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockEntry.java index 244b580c..ab126eeb 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockEntry.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockEntry.java @@ -25,19 +25,27 @@ package org.geysermc.connector.network.translators.block; -import lombok.AllArgsConstructor; import lombok.Getter; @Getter -@AllArgsConstructor public class BlockEntry { public static BlockEntry AIR = new BlockEntry("minecraft:air", 0, 0); - private String javaIdentifier; - private int javaId; + private final String javaIdentifier; + private final int javaId; + private final int bedrockRuntimeId; + private final boolean waterlogged; - private int bedrockRuntimeId; + public BlockEntry(String javaIdentifier, int javaId, int bedrockRuntimeId) { + this.javaIdentifier = javaIdentifier; + this.javaId = javaId; + this.bedrockRuntimeId = bedrockRuntimeId; + this.waterlogged = (javaIdentifier.contains("waterlogged=true") + || javaIdentifier.startsWith("minecraft:kelp") + || javaIdentifier.contains("seagrass") + || javaIdentifier.startsWith("minecraft:bubble_column")); + } @Override public boolean equals(Object obj) { 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 31be9fa4..7ff630c3 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 @@ -17,11 +17,4 @@ public class BlockTranslator { return javaIdentifierMap.computeIfAbsent(javaIdentifier, key -> Toolbox.BLOCK_ENTRIES.values() .stream().filter(blockEntry -> blockEntry.getJavaIdentifier().equals(key)).findFirst().orElse(null)); } - - public boolean isWaterLogged(BlockEntry entry) { - return (entry.getJavaIdentifier().contains("waterlogged=true") - || entry.getJavaIdentifier().startsWith("minecraft:kelp") - || entry.getJavaIdentifier().contains("seagrass") - || entry.getJavaIdentifier().startsWith("minecraft:bubble_column")); - } } 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 bc6c739b..a80621a8 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java @@ -38,7 +38,7 @@ public class ChunkUtils { section.getBlockStorageArray()[0].setFullBlock(ChunkSection.blockPosition(x, y, z), block.getBedrockRuntimeId()); - if (TranslatorsInit.getBlockTranslator().isWaterLogged(block)) { + if (block.isWaterlogged()) { BlockEntry water = TranslatorsInit.getBlockTranslator().getBlockEntry("minecraft:water[level=0]"); section.getBlockStorageArray()[1].setFullBlock(ChunkSection.blockPosition(x, y, z), water.getBedrockRuntimeId()); } @@ -63,7 +63,7 @@ public class ChunkUtils { UpdateBlockPacket waterPacket = new UpdateBlockPacket(); waterPacket.setDataLayer(1); waterPacket.setBlockPosition(pos); - if (TranslatorsInit.getBlockTranslator().isWaterLogged(blockEntry)) { + if (blockEntry.isWaterlogged()) { BlockEntry water = TranslatorsInit.getBlockTranslator().getBlockEntry("minecraft:water[level=0]"); waterPacket.setRuntimeId(water.getBedrockRuntimeId()); } else { From 6273c3b1101c6222d91c401aed5f6cfaa53e12d0 Mon Sep 17 00:00:00 2001 From: Redned Date: Sun, 22 Dec 2019 10:09:23 -0600 Subject: [PATCH 4/6] Update README.md --- README.md | 39 +++++++++++++++------------------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 2a8fd14e..bd1a01ad 100644 --- a/README.md +++ b/README.md @@ -13,39 +13,30 @@ Geyser is a bridge between Minecraft: Bedrock Edition and Minecraft: Java Editio Geyser is a proxy, bridging the gap between Minecraft: Bedrock Edition and Minecraft: Java Edition servers. The ultimate goal of this project is to allow Minecraft: Bedrock Edition users to join Minecraft: Java Edition servers as seamlessly as possible. -### Please note, this project is still a work in progress and should not be used on production. +### Please note, this project is still a work in progress and should not be used on production. Expect bugs! ## Setting Up -Please note, Geyser is **not** a plugin. Watch the video below or take a look [here](https://github.com/GeyserMC/Geyser/wiki#Setup) for how to set it up. +Please note, Geyser is **not** (currently) a plugin. Watch the video below or take a look [here](https://github.com/GeyserMC/Geyser/wiki#Setup) for how to set it up. -[![YouTube Video](https://img.youtube.com/vi/OmLxwl7_UzQ/0.jpg)](https://www.youtube.com/watch?v=OmLxwl7_UzQ) +[![YouTube Video](https://img.youtube.com/vi/U7dZZ8w7Gi4/0.jpg)](https://www.youtube.com/watch?v=U7dZZ8w7Gi4) -Links: +## Links: - Website: https://geysermc.org - Docs: https://github.com/GeyserMC/Geyser/wiki - Download: http://ci.geysermc.org - Discord: http://discord.geysermc.org/ -## What's Completed -- [x] Server recognized in server list -- [x] Join detection from remote -- [x] Online mode/auth support -- [x] Chat/command support -- [x] Scoreboard -- [ ] Inventory support - - [x] Inventory viewing - - [x] NBT data - - [ ] Inventory movement (transactions) -- [x] Player movement support -- [x] Entity support -- [x] Player support -- [ ] Chunks - - [x] Block translation (may be missing mappings) - - [x] Block updates - - [ ] Block entities - - [x] Extra data - - [ ] Biome colors -- [x] Block break/place support +## What's Left to be Added/Fixed +- Inventories ([#67](https://github.com/GeyserMC/Geyser/pull/67)) +- Crafting ([#67](https://github.com/GeyserMC/Geyser/pull/67)) +- Creative Mode ([#67](https://github.com/GeyserMC/Geyser/pull/67)) +- Sounds +- Block Particles +- Block Entities ([`block-entities`](https://github.com/GeyserMC/Geyser/tree/block-entities)) +- Biome Colors +- Some Entity Flags +- Proper Movement +- Support to be Ran as a Plugin ([`plugin`](https://github.com/GeyserMC/Geyser/tree/plugin)) ## Compiling 1. Clone the repo to your computer From cbbc485efa468895b94cc1bb5861d933599b13ce Mon Sep 17 00:00:00 2001 From: Redned Date: Sun, 22 Dec 2019 21:01:48 -0600 Subject: [PATCH 5/6] Add Patreon to README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bd1a01ad..0108781c 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ Please note, Geyser is **not** (currently) a plugin. Watch the video below or ta - Docs: https://github.com/GeyserMC/Geyser/wiki - Download: http://ci.geysermc.org - Discord: http://discord.geysermc.org/ +- Donate: https://patreon.com/GeyserMC ## What's Left to be Added/Fixed - Inventories ([#67](https://github.com/GeyserMC/Geyser/pull/67)) From 1f7b8ba5d5d0455331acbcfd3e8b6c58c0d62236 Mon Sep 17 00:00:00 2001 From: LegacyGamerHD Date: Mon, 23 Dec 2019 18:47:31 +0100 Subject: [PATCH 6/6] Update Nukkit Protocol Library to 1.14 (#117) * Update nukkit protocolib to 1.14 * Fixes * Remove debug --- connector/pom.xml | 4 ++-- .../main/java/org/geysermc/connector/GeyserConnector.java | 5 ++--- .../geysermc/connector/network/UpstreamPacketHandler.java | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/connector/pom.xml b/connector/pom.xml index ee8b9049..82e3adb1 100644 --- a/connector/pom.xml +++ b/connector/pom.xml @@ -66,8 +66,8 @@ com.nukkitx.protocol - bedrock-v388 - 2.4.2 + bedrock-v389 + 2.4.4 compile diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java index 46443ffa..8b6638da 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -27,7 +27,7 @@ package org.geysermc.connector; import com.nukkitx.protocol.bedrock.BedrockPacketCodec; import com.nukkitx.protocol.bedrock.BedrockServer; -import com.nukkitx.protocol.bedrock.v388.Bedrock_v388; +import com.nukkitx.protocol.bedrock.v389.Bedrock_v389; import lombok.Getter; import org.fusesource.jansi.AnsiConsole; @@ -67,8 +67,7 @@ import java.util.concurrent.TimeUnit; @Getter public class GeyserConnector implements Connector { - public static final BedrockPacketCodec BEDROCK_PACKET_CODEC = Bedrock_v388.V388_CODEC; - public static final int BEDROCK_1_14_PROTOCOL_VERSION = 389; + public static final BedrockPacketCodec BEDROCK_PACKET_CODEC = Bedrock_v389.V389_CODEC; public static final String NAME = "Geyser"; public static final String VERSION = "1.0-SNAPSHOT"; 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 555e54e6..9768c88b 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,7 @@ public class UpstreamPacketHandler extends LoggingPacketHandler { @Override public boolean handle(LoginPacket loginPacket) { - if (loginPacket.getProtocolVersion() != GeyserConnector.BEDROCK_1_14_PROTOCOL_VERSION) { + if (loginPacket.getProtocolVersion() != GeyserConnector.BEDROCK_PACKET_CODEC.getProtocolVersion()) { session.getUpstream().disconnect("Unsupported Bedrock version. Are you running an outdated version?"); return true; } @@ -131,4 +131,4 @@ public class UpstreamPacketHandler extends LoggingPacketHandler { public boolean handle(InventoryTransactionPacket packet) { return translateAndDefault(packet); } -} \ No newline at end of file +}