From 20bbe7cec67d958e4bb0bc2a1c3365dda6bd815b Mon Sep 17 00:00:00 2001 From: lenis0012 <0p1q9o2w@hotmail.nl> Date: Thu, 23 Jun 2016 04:00:59 +0200 Subject: [PATCH 1/8] Support 1.9.2 servers This code basically reads 1.9 data so it can then be transformed to add in the tile entities. it geta a little funky when it already loaded it as a 1.8 chunk tho, so i had to add some methods to the chunk api. in short: I hate minecraft --- .../api/minecraft/chunks/Chunk.java | 13 +++ .../api/minecraft/chunks/ChunkSection.java | 18 +++++ .../Chunk1_9_3_4.java | 11 ++- .../Chunk1_9_3_4Type.java | 6 +- .../ChunkSection1_9_3_4.java | 44 ++++++++++ .../Chunk1_9_1_2Type.java | 38 +++++---- .../ChunkSection1_9_1_2.java | 80 ++++++++++++++++++- .../Protocol1_9_3TO1_9_1_2.java | 57 ++++++++++--- .../sotrage/ClientWorld.java | 32 ++++++++ .../chunks/Chunk1_9to1_8.java | 10 +++ .../chunks/ChunkSection1_9to1_8.java | 3 +- .../storage/ClientChunks.java | 3 + 12 files changed, 283 insertions(+), 32 deletions(-) create mode 100644 src/main/java/us/myles/ViaVersion/api/minecraft/chunks/ChunkSection.java create mode 100644 src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/ChunkSection1_9_3_4.java create mode 100644 src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/sotrage/ClientWorld.java diff --git a/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/Chunk.java b/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/Chunk.java index ff414c7df..634b9c343 100644 --- a/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/Chunk.java +++ b/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/Chunk.java @@ -1,4 +1,17 @@ package us.myles.ViaVersion.api.minecraft.chunks; public interface Chunk { + int getX(); + + int getZ(); + + ChunkSection[] getSections(); + + boolean isGroundUp(); + + boolean isBiomeData(); + + byte[] getBiomeData(); + + int getBitmask(); } diff --git a/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/ChunkSection.java b/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/ChunkSection.java new file mode 100644 index 000000000..bd6d59fa0 --- /dev/null +++ b/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/ChunkSection.java @@ -0,0 +1,18 @@ +package us.myles.ViaVersion.api.minecraft.chunks; + +import io.netty.buffer.ByteBuf; + +/** + * Created by Lennart on 6/23/2016. + */ +public interface ChunkSection { + int getBlockId(int x, int y, int z); + + void writeBlocks(ByteBuf output) throws Exception; + + void writeBlockLight(ByteBuf output) throws Exception; + + boolean hasSkyLight(); + + void writeSkyLight(ByteBuf output) throws Exception; +} diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Chunk1_9_3_4.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Chunk1_9_3_4.java index 309429473..3592a9241 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Chunk1_9_3_4.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Chunk1_9_3_4.java @@ -14,7 +14,16 @@ public class Chunk1_9_3_4 implements Chunk { private int z; private boolean groundUp; private int bitmask; - private byte[] sections; + private ChunkSection1_9_3_4[] sections; List blockEntities; + @Override + public boolean isBiomeData() { + return false; + } + + @Override + public byte[] getBiomeData() { + return new byte[0]; + } } diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Chunk1_9_3_4Type.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Chunk1_9_3_4Type.java index 668011548..78d3d88f6 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Chunk1_9_3_4Type.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Chunk1_9_3_4Type.java @@ -31,7 +31,7 @@ public class Chunk1_9_3_4Type extends BaseChunkType { for (int i = 0; i < blockEntities; i++) { nbtData.add(Type.NBT.read(input)); } - return new Chunk1_9_3_4(chunkX, chunkZ, groundUp, primaryBitmask, sections, nbtData); + return new Chunk1_9_3_4(chunkX, chunkZ, groundUp, primaryBitmask, new ChunkSection1_9_3_4[] {new ChunkSection1_9_3_4(sections)}, nbtData); } @Override @@ -46,8 +46,8 @@ public class Chunk1_9_3_4Type extends BaseChunkType { buffer.writeBoolean(chunk.isGroundUp()); Type.VAR_INT.write(buffer, chunk.getBitmask()); - Type.VAR_INT.write(buffer, chunk.getSections().length); - buffer.writeBytes(chunk.getSections()); + Type.VAR_INT.write(buffer, chunk.getSections()[0].getData().length); + buffer.writeBytes(chunk.getSections()[0].getData()); // no block entities as it's earlier } diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/ChunkSection1_9_3_4.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/ChunkSection1_9_3_4.java new file mode 100644 index 000000000..85cc4d352 --- /dev/null +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/ChunkSection1_9_3_4.java @@ -0,0 +1,44 @@ +package us.myles.ViaVersion.protocols.protocol1_9_1_2to1_9_3_4; + +import io.netty.buffer.ByteBuf; +import us.myles.ViaVersion.api.minecraft.chunks.ChunkSection; + +/** + * Created by Lennart on 6/23/2016. + */ +public class ChunkSection1_9_3_4 implements ChunkSection { + private final byte[] data; + + public ChunkSection1_9_3_4(byte[] data) { + this.data = data; + } + + public byte[] getData() { + return data; + } + + @Override + public int getBlockId(int x, int y, int z) { + throw new UnsupportedOperationException("Invalid chunk type!"); + } + + @Override + public void writeBlocks(ByteBuf output) throws Exception { + throw new UnsupportedOperationException("Invalid chunk type!"); + } + + @Override + public void writeBlockLight(ByteBuf output) throws Exception { + throw new UnsupportedOperationException("Invalid chunk type!"); + } + + @Override + public boolean hasSkyLight() { + throw new UnsupportedOperationException("Invalid chunk type!"); + } + + @Override + public void writeSkyLight(ByteBuf output) throws Exception { + throw new UnsupportedOperationException("Invalid chunk type!"); + } +} diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Chunk1_9_1_2Type.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Chunk1_9_1_2Type.java index b40721ae8..fa881c54f 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Chunk1_9_1_2Type.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Chunk1_9_1_2Type.java @@ -2,18 +2,24 @@ package us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; +import org.bukkit.World; import org.spacehq.opennbt.tag.builtin.CompoundTag; import us.myles.ViaVersion.api.minecraft.chunks.Chunk; +import us.myles.ViaVersion.api.minecraft.chunks.ChunkSection; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.api.type.types.minecraft.BaseChunkType; -import us.myles.ViaVersion.protocols.protocol1_9to1_8.chunks.ChunkSection1_9to1_8; +import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.sotrage.ClientWorld; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks; import java.util.ArrayList; import java.util.BitSet; public class Chunk1_9_1_2Type extends BaseChunkType { - public Chunk1_9_1_2Type() { + private final ClientWorld clientWorld; + + public Chunk1_9_1_2Type(ClientWorld clientWorld) { super("1.9.1/2 Chunk"); + this.clientWorld = clientWorld; } @Override @@ -39,29 +45,27 @@ public class Chunk1_9_1_2Type extends BaseChunkType { if (!usedSections.get(i)) continue; // Section not set ChunkSection1_9_1_2 section = new ChunkSection1_9_1_2(); sections[i] = section; - // WIP. -// section.readBlocks(input); -// section.readBlockLight(input); -// section.readSkyLight(input); - /* - BlockStorage blocks = new BlockStorage(in); - NibbleArray3d blocklight = new NibbleArray3d(in, 2048); (1024 bytes) - NibbleArray3d skylight = hasSkylight ? new NibbleArray3d(in, 2048) : null; (1024 bytes) - chunks[index] = new Chunk(blocks, blocklight, skylight); - */ + section.readBlocks(input); + section.readBlockLight(input); + if(clientWorld.getEnvironment() == World.Environment.NORMAL) { + section.readSkyLight(input); + } } + byte[] biomeData = groundUp ? new byte[256] : null; - if (groundUp) + if (groundUp) { input.readBytes(biomeData); + } return new Chunk1_9_1_2(chunkX, chunkZ, groundUp, primaryBitmask, sections, biomeData, new ArrayList()); } @Override public void write(ByteBuf output, Chunk input) throws Exception { - if (!(input instanceof Chunk1_9_1_2)) - throw new Exception("Tried to send the wrong chunk type from 1.9.3-4 chunk: " + input.getClass()); - Chunk1_9_1_2 chunk = (Chunk1_9_1_2) input; +// if (!(input instanceof Chunk1_9_1_2)) +// throw new Exception("Tried to send the wrong chunk type from 1.9.3-4 chunk: " + input.getClass()); +// Chunk1_9_1_2 chunk = (Chunk1_9_1_2) input; + Chunk chunk = input; output.writeInt(chunk.getX()); output.writeInt(chunk.getZ()); @@ -71,7 +75,7 @@ public class Chunk1_9_1_2Type extends BaseChunkType { ByteBuf buf = Unpooled.buffer(); for (int i = 0; i < 16; i++) { - ChunkSection1_9_1_2 section = chunk.getSections()[i]; + ChunkSection section = chunk.getSections()[i]; if (section == null) continue; // Section not set section.writeBlocks(buf); section.writeBlockLight(buf); diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java index 4cff93fd6..70109671e 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java @@ -3,12 +3,14 @@ package us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2; import com.google.common.collect.Lists; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; +import us.myles.ViaVersion.api.minecraft.chunks.ChunkSection; import us.myles.ViaVersion.api.minecraft.chunks.NibbleArray; import us.myles.ViaVersion.api.type.Type; +import java.util.Arrays; import java.util.List; -public class ChunkSection1_9_1_2 { +public class ChunkSection1_9_1_2 implements ChunkSection { /** * Size (dimensions) of blocks in a chunks section. */ @@ -91,6 +93,82 @@ public class ChunkSection1_9_1_2 { return z << 8 | y << 4 | x; } + /** + * Read blocks from input stream. + * This reads all the block related data: + * + * + * @param input The buffer to read from. + * @throws Exception + */ + public void readBlocks(ByteBuf input) throws Exception { + // Clear current data +// Arrays.fill(blocks, 0); + palette.clear(); + + // Reaad bits per block + int bitsPerBlock = input.readByte(); + long maxEntryValue = (1L << bitsPerBlock) - 1; + + if(bitsPerBlock == 0) { + throw new RuntimeException("Aye me m8 its the global palette!"); + } + + // Read palette + int paletteLength = Type.VAR_INT.read(input); + for(int i = 0; i < paletteLength; i++) { + palette.add(Type.VAR_INT.read(input)); + } + + // Read blocks + int blockLength = Type.VAR_INT.read(input); + long[] blockData = new long[blockLength]; + for(int i = 0; i < blocks.length; i++) { + int bitIndex = i * bitsPerBlock; + int startIndex = bitIndex / 64; + int endIndex = ((i + 1) * bitsPerBlock - 1) / 64; + int startBitSubIndex = bitIndex % 64; + if(startIndex == endIndex) { + blocks[i] = (int) (blockData[startIndex] >>> startBitSubIndex & maxEntryValue); + } else { + int endBitSubIndex = 64 - startBitSubIndex; + blocks[i] = (int) ((blockData[startIndex] >>> startBitSubIndex | blockData[endIndex] << endBitSubIndex) & maxEntryValue); + } + } + } + + /** + * Read block light from buffer. + * + * @param input The buffer to read from + */ + public void readBlockLight(ByteBuf input) { + byte[] handle = new byte[LIGHT_LENGTH]; + input.readBytes(handle); + blockLight.setHandle(handle); + } + + /** + * Read sky light from buffer. + * Note: Only sent in overworld! + * + * @param input The buffer to read from + */ + public void readSkyLight(ByteBuf input) { + byte[] handle = new byte[LIGHT_LENGTH]; + input.readBytes(handle); + if(skyLight != null) { + skyLight.setHandle(handle); + return; + } + + this.skyLight = new NibbleArray(handle); + } + /** * Write the blocks to a buffer. * diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java index 1a91bb68a..2437523a6 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java @@ -6,11 +6,14 @@ import org.spacehq.opennbt.tag.builtin.StringTag; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.minecraft.Position; +import us.myles.ViaVersion.api.minecraft.chunks.Chunk; +import us.myles.ViaVersion.api.minecraft.chunks.ChunkSection; import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.api.remapper.PacketHandler; import us.myles.ViaVersion.api.remapper.PacketRemapper; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.packets.State; +import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.sotrage.ClientWorld; import us.myles.ViaVersion.protocols.protocol1_9to1_8.chunks.Chunk1_9to1_8; import us.myles.ViaVersion.protocols.protocol1_9to1_8.chunks.ChunkSection1_9to1_8; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks; @@ -18,6 +21,7 @@ import us.myles.ViaVersion.protocols.protocol1_9to1_8.types.ChunkType; import java.util.ArrayList; import java.util.List; +import java.util.Objects; public class Protocol1_9_3TO1_9_1_2 extends Protocol { @Override @@ -74,15 +78,19 @@ public class Protocol1_9_3TO1_9_1_2 extends Protocol { handler(new PacketHandler() { @Override public void handle(PacketWrapper wrapper) throws Exception { - ClientChunks clientChunks = wrapper.user().get(ClientChunks.class); + ClientWorld clientWorld = wrapper.user().get(ClientWorld.class); - ChunkType type = new ChunkType(clientChunks); + Chunk1_9_1_2Type type = new Chunk1_9_1_2Type(clientWorld); if (wrapper.isReadable(type, 0)) { - Chunk1_9to1_8 chunk = (Chunk1_9to1_8) wrapper.read(type); + Chunk chunk = wrapper.read(type); +// if(rawChunk instanceof Chunk1_9to1_8) { +// throw new RuntimeException("Sweet berry candies"); +// } +// Chunk1_9_1_2 chunk = (Chunk1_9_1_2) rawChunk; List tags = new ArrayList<>(); for (int i = 0; i < chunk.getSections().length; i++) { - ChunkSection1_9to1_8 section = chunk.getSections()[i]; + ChunkSection section = chunk.getSections()[i]; if (section == null) continue; @@ -99,18 +107,49 @@ public class Protocol1_9_3TO1_9_1_2 extends Protocol { wrapper.write(type, chunk); wrapper.write(Type.NBT_ARRAY, tags.toArray(new CompoundTag[0])); - } else { - wrapper.passthroughAll(); - wrapper.write(Type.VAR_INT, 0); } } }); } }); + + // Join (save dimension id) + registerOutgoing(State.PLAY, 0x23, 0x23, new PacketRemapper() { + @Override + public void registerMap() { + handler(new PacketHandler() { + @Override + public void handle(PacketWrapper wrapper) throws Exception { + ClientWorld clientChunks = wrapper.user().get(ClientWorld.class); + wrapper.passthrough(Type.INT); + wrapper.passthrough(Type.UNSIGNED_BYTE); + int dimensionId = wrapper.passthrough(Type.INT); + clientChunks.setEnvironment(dimensionId); + wrapper.passthroughAll(); + } + }); + } + }); + + // Respawn (save dimension id) + registerOutgoing(State.PLAY, 0x33, 0x33, new PacketRemapper() { + @Override + public void registerMap() { + handler(new PacketHandler() { + @Override + public void handle(PacketWrapper wrapper) throws Exception { + ClientWorld clientWorld = wrapper.user().get(ClientWorld.class); + int dimensionId = wrapper.passthrough(Type.INT); + clientWorld.setEnvironment(dimensionId); + wrapper.passthroughAll(); + } + }); + } + }); } @Override - public void init(UserConnection userConnection) { - + public void init(UserConnection user) { + user.put(new ClientWorld(user)); } } diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/sotrage/ClientWorld.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/sotrage/ClientWorld.java new file mode 100644 index 000000000..3acfd44fe --- /dev/null +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/sotrage/ClientWorld.java @@ -0,0 +1,32 @@ +package us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.sotrage; + +import lombok.Getter; +import org.bukkit.World; +import us.myles.ViaVersion.api.data.StoredObject; +import us.myles.ViaVersion.api.data.UserConnection; + +@Getter +public class ClientWorld extends StoredObject { + private World.Environment environment; + + public ClientWorld(UserConnection user) { + super(user); + } + + public void setEnvironment(int environmentId) { + this.environment = getEnvFromId(environmentId); + } + + private World.Environment getEnvFromId(int id) { + switch(id) { + case -1: + return World.Environment.NETHER; + case 0: + return World.Environment.NORMAL; + case 1: + return World.Environment.THE_END; + default: + throw new IllegalArgumentException("Invalid environment id:" + id); + } + } +} diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/Chunk1_9to1_8.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/Chunk1_9to1_8.java index f994cf18a..5a254119c 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/Chunk1_9to1_8.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/Chunk1_9to1_8.java @@ -36,4 +36,14 @@ public class Chunk1_9to1_8 implements Chunk { public boolean hasBiomeData() { return biomeData != null && groundUp; } + + @Override + public boolean isBiomeData() { + return biomeData != null; + } + + @Override + public int getBitmask() { + return primaryBitmask; + } } diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java index 7825bb2fb..142867562 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java @@ -3,12 +3,13 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.chunks; import com.google.common.collect.Lists; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; +import us.myles.ViaVersion.api.minecraft.chunks.ChunkSection; import us.myles.ViaVersion.api.minecraft.chunks.NibbleArray; import us.myles.ViaVersion.api.type.Type; import java.util.List; -public class ChunkSection1_9to1_8 { +public class ChunkSection1_9to1_8 implements ChunkSection { /** * Size (dimensions) of blocks in a chunks section. */ diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java index bc2147b05..c4f68b179 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java @@ -3,7 +3,10 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.storage; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import lombok.Getter; +import lombok.Setter; import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.WorldType; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.data.StoredObject; import us.myles.ViaVersion.api.data.UserConnection; From 598d0f96d83d8e15741ab1f0657eb8c5dd062d9f Mon Sep 17 00:00:00 2001 From: Myles Date: Fri, 1 Jul 2016 20:17:25 +0100 Subject: [PATCH 2/8] Not sure if i'm working forward or backwards on this, but pushing for progress --- .../Chunk1_9_1_2Type.java | 3 +- .../ChunkSection1_9_1_2.java | 75 +++++++++++++------ .../Protocol1_9_3TO1_9_1_2.java | 45 +++++------ .../{sotrage => storage}/ClientWorld.java | 2 +- 4 files changed, 73 insertions(+), 52 deletions(-) rename src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/{sotrage => storage}/ClientWorld.java (93%) diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Chunk1_9_1_2Type.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Chunk1_9_1_2Type.java index fa881c54f..c35578c0f 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Chunk1_9_1_2Type.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Chunk1_9_1_2Type.java @@ -8,8 +8,7 @@ import us.myles.ViaVersion.api.minecraft.chunks.Chunk; import us.myles.ViaVersion.api.minecraft.chunks.ChunkSection; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.api.type.types.minecraft.BaseChunkType; -import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.sotrage.ClientWorld; -import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks; +import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; import java.util.ArrayList; import java.util.BitSet; diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java index 70109671e..dc0341f97 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java @@ -7,7 +7,6 @@ import us.myles.ViaVersion.api.minecraft.chunks.ChunkSection; import us.myles.ViaVersion.api.minecraft.chunks.NibbleArray; import us.myles.ViaVersion.api.type.Type; -import java.util.Arrays; import java.util.List; public class ChunkSection1_9_1_2 implements ChunkSection { @@ -47,7 +46,7 @@ public class ChunkSection1_9_1_2 implements ChunkSection { setBlock(index(x, y, z), type, data); } - public int getBlockId(int x, int y, int z){ + public int getBlockId(int x, int y, int z) { int index = blocks[index(x, y, z)]; return palette.indexOf(index) >> 4; } @@ -97,9 +96,9 @@ public class ChunkSection1_9_1_2 implements ChunkSection { * Read blocks from input stream. * This reads all the block related data: *
    - *
  • Block length/palette type
  • - *
  • Palette
  • - *
  • Block hashes/palette reference
  • + *
  • Block length/palette type
  • + *
  • Palette
  • + *
  • Block hashes/palette reference
  • *
* * @param input The buffer to read from. @@ -111,34 +110,62 @@ public class ChunkSection1_9_1_2 implements ChunkSection { palette.clear(); // Reaad bits per block - int bitsPerBlock = input.readByte(); + int bitsPerBlock = input.readUnsignedByte(); long maxEntryValue = (1L << bitsPerBlock) - 1; - if(bitsPerBlock == 0) { - throw new RuntimeException("Aye me m8 its the global palette!"); + if (bitsPerBlock == 0) { + bitsPerBlock = 13; } + if (bitsPerBlock < 4) { + bitsPerBlock = 4; + } + if (bitsPerBlock > 8) { + bitsPerBlock = 13; + } + System.out.println("bps: " + bitsPerBlock); + if(bitsPerBlock != 13) { + // Read palette + int paletteLength = Type.VAR_INT.read(input); - // Read palette - int paletteLength = Type.VAR_INT.read(input); - for(int i = 0; i < paletteLength; i++) { - palette.add(Type.VAR_INT.read(input)); + for (int i = 0; i < paletteLength; i++) { + if (bitsPerBlock != 13) { + palette.add(Type.VAR_INT.read(input)); + } else { + Type.VAR_INT.read(input); + } + } + System.out.println("length of palette: " + paletteLength); } // Read blocks int blockLength = Type.VAR_INT.read(input); - long[] blockData = new long[blockLength]; - for(int i = 0; i < blocks.length; i++) { - int bitIndex = i * bitsPerBlock; - int startIndex = bitIndex / 64; - int endIndex = ((i + 1) * bitsPerBlock - 1) / 64; - int startBitSubIndex = bitIndex % 64; - if(startIndex == endIndex) { - blocks[i] = (int) (blockData[startIndex] >>> startBitSubIndex & maxEntryValue); - } else { - int endBitSubIndex = 64 - startBitSubIndex; - blocks[i] = (int) ((blockData[startIndex] >>> startBitSubIndex | blockData[endIndex] << endBitSubIndex) & maxEntryValue); + if (blockLength > 0) { + long[] blockData = new long[blockLength]; + System.out.println("Block Length: " + blockData.length); + for (int i = 0; i < blocks.length; i++) { + int bitIndex = i * bitsPerBlock; + int startIndex = bitIndex / 64; + int endIndex = ((i + 1) * bitsPerBlock - 1) / 64; + int startBitSubIndex = bitIndex % 64; + int val; + if (startIndex == endIndex) { + val = (int) (blockData[startIndex] >>> startBitSubIndex & maxEntryValue); + } else { + int endBitSubIndex = 64 - startBitSubIndex; + val = (int) ((blockData[startIndex] >>> startBitSubIndex | blockData[endIndex] << endBitSubIndex) & maxEntryValue); + } + + if (bitsPerBlock == 13) { + int type = val >> 4; + int data = val & 0xF; + + setBlock(i, type, data); + } else { + blocks[i] = val; + } } } + System.out.println("done"); } /** @@ -161,7 +188,7 @@ public class ChunkSection1_9_1_2 implements ChunkSection { public void readSkyLight(ByteBuf input) { byte[] handle = new byte[LIGHT_LENGTH]; input.readBytes(handle); - if(skyLight != null) { + if (skyLight != null) { skyLight.setHandle(handle); return; } diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java index 2437523a6..a2086bd22 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java @@ -13,15 +13,10 @@ import us.myles.ViaVersion.api.remapper.PacketHandler; import us.myles.ViaVersion.api.remapper.PacketRemapper; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.packets.State; -import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.sotrage.ClientWorld; -import us.myles.ViaVersion.protocols.protocol1_9to1_8.chunks.Chunk1_9to1_8; -import us.myles.ViaVersion.protocols.protocol1_9to1_8.chunks.ChunkSection1_9to1_8; -import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks; -import us.myles.ViaVersion.protocols.protocol1_9to1_8.types.ChunkType; +import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; import java.util.ArrayList; import java.util.List; -import java.util.Objects; public class Protocol1_9_3TO1_9_1_2 extends Protocol { @Override @@ -81,34 +76,34 @@ public class Protocol1_9_3TO1_9_1_2 extends Protocol { ClientWorld clientWorld = wrapper.user().get(ClientWorld.class); Chunk1_9_1_2Type type = new Chunk1_9_1_2Type(clientWorld); - if (wrapper.isReadable(type, 0)) { - Chunk chunk = wrapper.read(type); + // if (wrapper.isReadable(type, 0)) { + Chunk chunk = wrapper.read(type); // if(rawChunk instanceof Chunk1_9to1_8) { // throw new RuntimeException("Sweet berry candies"); // } // Chunk1_9_1_2 chunk = (Chunk1_9_1_2) rawChunk; - List tags = new ArrayList<>(); - for (int i = 0; i < chunk.getSections().length; i++) { - ChunkSection section = chunk.getSections()[i]; - if (section == null) - continue; + List tags = new ArrayList<>(); + for (int i = 0; i < chunk.getSections().length; i++) { + ChunkSection section = chunk.getSections()[i]; + if (section == null) + continue; - for (int x = 0; x < 16; x++) - for (int y = 0; y < 16; y++) - for (int z = 0; z < 16; z++) { - int block = section.getBlockId(x, y, z); - if (FakeTileEntity.hasBlock(block)) { - // NOT SURE WHY Y AND Z WORK THIS WAY, TODO: WORK OUT WHY THIS IS OR FIX W/E BROKE IT - tags.add(FakeTileEntity.getFromBlock(x + (chunk.getX() << 4), z + (i << 4), y + (chunk.getZ() << 4), block)); - } + for (int x = 0; x < 16; x++) + for (int y = 0; y < 16; y++) + for (int z = 0; z < 16; z++) { + int block = section.getBlockId(x, y, z); + if (FakeTileEntity.hasBlock(block)) { + // NOT SURE WHY Y AND Z WORK THIS WAY, TODO: WORK OUT WHY THIS IS OR FIX W/E BROKE IT + tags.add(FakeTileEntity.getFromBlock(x + (chunk.getX() << 4), z + (i << 4), y + (chunk.getZ() << 4), block)); } - } - - wrapper.write(type, chunk); - wrapper.write(Type.NBT_ARRAY, tags.toArray(new CompoundTag[0])); + } } + + wrapper.write(type, chunk); + wrapper.write(Type.NBT_ARRAY, tags.toArray(new CompoundTag[0])); } + // } }); } }); diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/sotrage/ClientWorld.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/storage/ClientWorld.java similarity index 93% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/sotrage/ClientWorld.java rename to src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/storage/ClientWorld.java index 3acfd44fe..394274146 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/sotrage/ClientWorld.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/storage/ClientWorld.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.sotrage; +package us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.storage; import lombok.Getter; import org.bukkit.World; From 7d2ef743acccb1be2618173aaff2c8c553d19de0 Mon Sep 17 00:00:00 2001 From: Myles Date: Sat, 2 Jul 2016 19:09:38 +0100 Subject: [PATCH 3/8] Fix stupidity, thanks @Pokechu22 <3 --- .../ChunkSection1_9_1_2.java | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java index dc0341f97..f543cd5cd 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java @@ -105,8 +105,6 @@ public class ChunkSection1_9_1_2 implements ChunkSection { * @throws Exception */ public void readBlocks(ByteBuf input) throws Exception { - // Clear current data -// Arrays.fill(blocks, 0); palette.clear(); // Reaad bits per block @@ -122,11 +120,9 @@ public class ChunkSection1_9_1_2 implements ChunkSection { if (bitsPerBlock > 8) { bitsPerBlock = 13; } - System.out.println("bps: " + bitsPerBlock); - if(bitsPerBlock != 13) { + int paletteLength = Type.VAR_INT.read(input); + if (bitsPerBlock != 13) { // Read palette - int paletteLength = Type.VAR_INT.read(input); - for (int i = 0; i < paletteLength; i++) { if (bitsPerBlock != 13) { palette.add(Type.VAR_INT.read(input)); @@ -134,14 +130,11 @@ public class ChunkSection1_9_1_2 implements ChunkSection { Type.VAR_INT.read(input); } } - System.out.println("length of palette: " + paletteLength); } // Read blocks - int blockLength = Type.VAR_INT.read(input); - if (blockLength > 0) { - long[] blockData = new long[blockLength]; - System.out.println("Block Length: " + blockData.length); + Long[] blockData = Type.LONG_ARRAY.read(input); + if (blockData.length > 0) { for (int i = 0; i < blocks.length; i++) { int bitIndex = i * bitsPerBlock; int startIndex = bitIndex / 64; @@ -165,7 +158,6 @@ public class ChunkSection1_9_1_2 implements ChunkSection { } } } - System.out.println("done"); } /** From 13c6a9d612381836e63880d1370876995fe87d12 Mon Sep 17 00:00:00 2001 From: Matsv Date: Sat, 2 Jul 2016 20:45:34 +0200 Subject: [PATCH 4/8] Change getBlockId to get instead of indexOf --- .../protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java index f543cd5cd..e424e718b 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java @@ -48,7 +48,7 @@ public class ChunkSection1_9_1_2 implements ChunkSection { public int getBlockId(int x, int y, int z) { int index = blocks[index(x, y, z)]; - return palette.indexOf(index) >> 4; + return palette.get(index) >> 4; } /** From c6d3c97c65e218ac73e32c65a24c64bd709fbc5a Mon Sep 17 00:00:00 2001 From: Myles Date: Sat, 2 Jul 2016 21:07:22 +0100 Subject: [PATCH 5/8] Fix clearing of wrapper --- src/main/java/us/myles/ViaVersion/api/PacketWrapper.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java b/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java index 6a76829de..cea87b59d 100644 --- a/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java +++ b/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java @@ -223,6 +223,7 @@ public class PacketWrapper { } if (readableObjects.size() > 0) { packetValues.addAll(readableObjects); + readableObjects.clear(); } int index = 0; @@ -267,7 +268,7 @@ public class PacketWrapper { private void writeRemaining(ByteBuf output) { if (inputBuffer != null) { - output.writeBytes(inputBuffer); + output.writeBytes(inputBuffer, inputBuffer.readableBytes()); } } From abe3c4b0c952c25dacea58525c1231fdb8db0df0 Mon Sep 17 00:00:00 2001 From: Myles Date: Sat, 2 Jul 2016 21:07:41 +0100 Subject: [PATCH 6/8] Identify unsigned byte properly --- .../us/myles/ViaVersion/api/type/types/UnsignedByteType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/UnsignedByteType.java b/src/main/java/us/myles/ViaVersion/api/type/types/UnsignedByteType.java index 7c293b362..6f910d872 100644 --- a/src/main/java/us/myles/ViaVersion/api/type/types/UnsignedByteType.java +++ b/src/main/java/us/myles/ViaVersion/api/type/types/UnsignedByteType.java @@ -6,7 +6,7 @@ import us.myles.ViaVersion.api.type.TypeConverter; public class UnsignedByteType extends Type implements TypeConverter { public UnsignedByteType() { - super(Short.class); + super("Unsigned Byte", Short.class); } @Override From 8edb7048a1c0a73dc557a8ee02cc1c011f353ec0 Mon Sep 17 00:00:00 2001 From: Myles Date: Sat, 2 Jul 2016 21:23:28 +0100 Subject: [PATCH 7/8] Code cleanup and implement index fix by @Matsv --- .../api/minecraft/chunks/ChunkSection.java | 3 -- .../ChunkSection1_9_3_4.java | 3 -- .../Chunk1_9_1_2Type.java | 5 --- .../ChunkSection1_9_1_2.java | 2 +- .../Protocol1_9_3TO1_9_1_2.java | 33 +++++++++---------- .../chunks/ChunkSection1_9to1_8.java | 2 +- 6 files changed, 17 insertions(+), 31 deletions(-) diff --git a/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/ChunkSection.java b/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/ChunkSection.java index bd6d59fa0..3dce62e30 100644 --- a/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/ChunkSection.java +++ b/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/ChunkSection.java @@ -2,9 +2,6 @@ package us.myles.ViaVersion.api.minecraft.chunks; import io.netty.buffer.ByteBuf; -/** - * Created by Lennart on 6/23/2016. - */ public interface ChunkSection { int getBlockId(int x, int y, int z); diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/ChunkSection1_9_3_4.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/ChunkSection1_9_3_4.java index 85cc4d352..97b15cdb9 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/ChunkSection1_9_3_4.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/ChunkSection1_9_3_4.java @@ -3,9 +3,6 @@ package us.myles.ViaVersion.protocols.protocol1_9_1_2to1_9_3_4; import io.netty.buffer.ByteBuf; import us.myles.ViaVersion.api.minecraft.chunks.ChunkSection; -/** - * Created by Lennart on 6/23/2016. - */ public class ChunkSection1_9_3_4 implements ChunkSection { private final byte[] data; diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Chunk1_9_1_2Type.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Chunk1_9_1_2Type.java index c35578c0f..6fc00d9c7 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Chunk1_9_1_2Type.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Chunk1_9_1_2Type.java @@ -61,9 +61,6 @@ public class Chunk1_9_1_2Type extends BaseChunkType { @Override public void write(ByteBuf output, Chunk input) throws Exception { -// if (!(input instanceof Chunk1_9_1_2)) -// throw new Exception("Tried to send the wrong chunk type from 1.9.3-4 chunk: " + input.getClass()); -// Chunk1_9_1_2 chunk = (Chunk1_9_1_2) input; Chunk chunk = input; output.writeInt(chunk.getX()); @@ -92,7 +89,5 @@ public class Chunk1_9_1_2Type extends BaseChunkType { if (chunk.isBiomeData()) { output.writeBytes(chunk.getBiomeData()); } - -// Type.NBT_ARRAY.write(output, tags.toArray(new CompoundTag[0])); Written by the handler } } diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java index e424e718b..acc9513a8 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/ChunkSection1_9_1_2.java @@ -89,7 +89,7 @@ public class ChunkSection1_9_1_2 implements ChunkSection { } private int index(int x, int y, int z) { - return z << 8 | y << 4 | x; + return y << 8 | z << 4 | x; } /** diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java index a2086bd22..0db400369 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java @@ -76,12 +76,7 @@ public class Protocol1_9_3TO1_9_1_2 extends Protocol { ClientWorld clientWorld = wrapper.user().get(ClientWorld.class); Chunk1_9_1_2Type type = new Chunk1_9_1_2Type(clientWorld); - // if (wrapper.isReadable(type, 0)) { - Chunk chunk = wrapper.read(type); -// if(rawChunk instanceof Chunk1_9to1_8) { -// throw new RuntimeException("Sweet berry candies"); -// } -// Chunk1_9_1_2 chunk = (Chunk1_9_1_2) rawChunk; + Chunk chunk = wrapper.passthrough(type); List tags = new ArrayList<>(); for (int i = 0; i < chunk.getSections().length; i++) { @@ -89,21 +84,20 @@ public class Protocol1_9_3TO1_9_1_2 extends Protocol { if (section == null) continue; - for (int x = 0; x < 16; x++) - for (int y = 0; y < 16; y++) + for (int x = 0; x < 16; x++) { + for (int y = 0; y < 16; y++) { for (int z = 0; z < 16; z++) { int block = section.getBlockId(x, y, z); if (FakeTileEntity.hasBlock(block)) { - // NOT SURE WHY Y AND Z WORK THIS WAY, TODO: WORK OUT WHY THIS IS OR FIX W/E BROKE IT - tags.add(FakeTileEntity.getFromBlock(x + (chunk.getX() << 4), z + (i << 4), y + (chunk.getZ() << 4), block)); + tags.add(FakeTileEntity.getFromBlock(x + (chunk.getX() << 4), y + (i << 4), z + (chunk.getZ() << 4), block)); } } + } + } } - wrapper.write(type, chunk); wrapper.write(Type.NBT_ARRAY, tags.toArray(new CompoundTag[0])); } - // } }); } }); @@ -112,15 +106,17 @@ public class Protocol1_9_3TO1_9_1_2 extends Protocol { registerOutgoing(State.PLAY, 0x23, 0x23, new PacketRemapper() { @Override public void registerMap() { + map(Type.INT); // 0 - Entity ID + map(Type.UNSIGNED_BYTE); // 1 - Gamemode + map(Type.INT); // 2 - Dimension + handler(new PacketHandler() { @Override public void handle(PacketWrapper wrapper) throws Exception { ClientWorld clientChunks = wrapper.user().get(ClientWorld.class); - wrapper.passthrough(Type.INT); - wrapper.passthrough(Type.UNSIGNED_BYTE); - int dimensionId = wrapper.passthrough(Type.INT); + int dimensionId = wrapper.get(Type.INT, 1); clientChunks.setEnvironment(dimensionId); - wrapper.passthroughAll(); + wrapper.passthroughAll(); // Todo: Fix this } }); } @@ -130,13 +126,14 @@ public class Protocol1_9_3TO1_9_1_2 extends Protocol { registerOutgoing(State.PLAY, 0x33, 0x33, new PacketRemapper() { @Override public void registerMap() { + map(Type.INT); // 0 - Dimension ID handler(new PacketHandler() { @Override public void handle(PacketWrapper wrapper) throws Exception { ClientWorld clientWorld = wrapper.user().get(ClientWorld.class); - int dimensionId = wrapper.passthrough(Type.INT); + int dimensionId = wrapper.get(Type.INT, 0); clientWorld.setEnvironment(dimensionId); - wrapper.passthroughAll(); + wrapper.passthroughAll(); // Todo: Fix this } }); } diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java index 142867562..0953941ed 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java @@ -89,7 +89,7 @@ public class ChunkSection1_9to1_8 implements ChunkSection { } private int index(int x, int y, int z) { - return z << 8 | y << 4 | x; + return y << 8 | z << 4 | x; } /** From 212da9c46c2394320096d8df5b02cfd0ea44be99 Mon Sep 17 00:00:00 2001 From: Myles Date: Sat, 2 Jul 2016 22:05:08 +0100 Subject: [PATCH 8/8] Fix resetReader being wrong, ty @Matsv for helping solve this --- src/main/java/us/myles/ViaVersion/api/PacketWrapper.java | 4 ++++ .../protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java b/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java index cea87b59d..7f1516f9b 100644 --- a/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java +++ b/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java @@ -394,6 +394,10 @@ public class PacketWrapper { * Reset the reader, so that it can be read again. */ public void resetReader() { + // Move readable objects are packet values + this.packetValues.addAll(readableObjects); + this.readableObjects.clear(); + // Move all packet values to the readable for next packet. this.readableObjects.addAll(packetValues); this.packetValues.clear(); } diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java index 0db400369..24a672176 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java @@ -116,7 +116,6 @@ public class Protocol1_9_3TO1_9_1_2 extends Protocol { ClientWorld clientChunks = wrapper.user().get(ClientWorld.class); int dimensionId = wrapper.get(Type.INT, 1); clientChunks.setEnvironment(dimensionId); - wrapper.passthroughAll(); // Todo: Fix this } }); } @@ -133,7 +132,6 @@ public class Protocol1_9_3TO1_9_1_2 extends Protocol { ClientWorld clientWorld = wrapper.user().get(ClientWorld.class); int dimensionId = wrapper.get(Type.INT, 0); clientWorld.setEnvironment(dimensionId); - wrapper.passthroughAll(); // Todo: Fix this } }); }