From 0feefc83e4ba07bdcf345b7a66aa9c96eeca8ace Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 24 Dec 2018 11:30:46 +0300 Subject: [PATCH 1/5] =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D0=B5=D1=80=D0=BD=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D0=BD=D0=B8=D1=8F=20NetStream=20(extends=20Input/O?= =?UTF-8?q?utput=20stream)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cherry-pick: d783317b5de7810087c968468c0a1fe27dbd413c --- .../java/mc/core/network/NetInputStream.java | 34 +++++++++++++++---- .../java/mc/core/network/NetOutputStream.java | 28 +++++++++++---- .../ByteArrayOutputNetStream.java | 8 ++--- .../proto_1_12_2/NetOutputStream_p340.java | 6 ---- .../packets/ByteArrayInputNetStream.java | 17 ++++++++-- .../netty/wrappers/WrapperNetInputStream.java | 9 ++--- .../wrappers/WrapperNetOutputStream.java | 8 ++--- 7 files changed, 72 insertions(+), 38 deletions(-) diff --git a/core/src/main/java/mc/core/network/NetInputStream.java b/core/src/main/java/mc/core/network/NetInputStream.java index 9ae1049..2c40cb6 100644 --- a/core/src/main/java/mc/core/network/NetInputStream.java +++ b/core/src/main/java/mc/core/network/NetInputStream.java @@ -1,22 +1,23 @@ -/* - * DmitriyMX - * 2018-07-25 - */ package mc.core.network; import lombok.Getter; import lombok.Setter; +import java.io.IOException; +import java.io.InputStream; import java.util.UUID; -public abstract class NetInputStream { +public abstract class NetInputStream extends InputStream { @Getter @Setter private int dataSize; public abstract boolean readBoolean(); public abstract byte readByte(); - public abstract void readBytes(byte[] buffer); + public int readBytes(byte[] buffer) { + return readBytes(buffer, 0, buffer.length); + } + public abstract int readBytes(byte[] buffer, int offset, int length); public abstract int readUnsignedByte(); public abstract int readUnsignedShort(); public abstract short readShort(); @@ -30,4 +31,25 @@ public abstract class NetInputStream { public abstract UUID readUUID(); public abstract void skipBytes(int count); + + @Override + public int read() throws IOException { + return readByte(); + } + + @Override + public int read(byte[] b) throws IOException { + return readBytes(b); + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + return readBytes(b, off, len); + } + + @Override + public long skip(long n) throws IOException { + skipBytes((int) n); + return n; + } } diff --git a/core/src/main/java/mc/core/network/NetOutputStream.java b/core/src/main/java/mc/core/network/NetOutputStream.java index 86c6f19..b7bf437 100644 --- a/core/src/main/java/mc/core/network/NetOutputStream.java +++ b/core/src/main/java/mc/core/network/NetOutputStream.java @@ -1,16 +1,17 @@ -/* - * DmitriyMX - * 2018-07-25 - */ package mc.core.network; +import java.io.IOException; +import java.io.OutputStream; import java.util.UUID; -public abstract class NetOutputStream { +public abstract class NetOutputStream extends OutputStream { public abstract void writeBoolean(boolean value); public abstract void writeByte(int value); public abstract void writeUnsignedByte(int value); - public abstract void writeBytes(byte[] buffer); + public void writeBytes(byte[] buffer) { + writeBytes(buffer, 0, buffer.length); + } + public abstract void writeBytes(byte[] buffer, int offset, int lengtn); public abstract void writeShort(int value); public abstract void writeInt(int value); public abstract void writeVarInt(int value); @@ -19,4 +20,19 @@ public abstract class NetOutputStream { public abstract void writeDouble(double value); public abstract void writeString(String value); public abstract void writeUUID(UUID uuid); + + @Override + public void write(int b) throws IOException { + writeByte(b); + } + + @Override + public void write(byte[] b) throws IOException { + writeBytes(b); + } + + @Override + public void write(byte[] b, int off, int len) throws IOException { + writeBytes(b, off, len); + } } diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/ByteArrayOutputNetStream.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/ByteArrayOutputNetStream.java index d496e05..6b5cbee 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/ByteArrayOutputNetStream.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/ByteArrayOutputNetStream.java @@ -1,7 +1,3 @@ -/* - * DmitriyMX - * 2018-06-10 - */ package mc.core.network.proto_1_12_2; import java.io.ByteArrayOutputStream; @@ -25,8 +21,8 @@ public class ByteArrayOutputNetStream extends NetOutputStream_p340 { } @Override - public void writeBytes(byte[] buffer) { - baos.write(buffer, 0, buffer.length); + public void writeBytes(byte[] buffer, int offset, int lengtn) { + baos.write(buffer, offset, lengtn); } @Override diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/NetOutputStream_p340.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/NetOutputStream_p340.java index cbc3239..b4bcdbd 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/NetOutputStream_p340.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/NetOutputStream_p340.java @@ -1,7 +1,3 @@ -/* - * DmitriyMX - * 2018-07-25 - */ package mc.core.network.proto_1_12_2; import lombok.extern.slf4j.Slf4j; @@ -22,8 +18,6 @@ public abstract class NetOutputStream_p340 extends NetOutputStream { writeByte(value); } - - @Override public void writeString(String value) { if (value.length() > Short.MAX_VALUE) { diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStream.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStream.java index c51beaf..865a76a 100644 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStream.java +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStream.java @@ -1,9 +1,12 @@ package mc.core.network.proto_1_12_2.packets; +import lombok.extern.slf4j.Slf4j; import mc.core.network.proto_1_12_2.NetInputStream_p340; import java.io.ByteArrayInputStream; +import java.io.IOException; +@Slf4j public class ByteArrayInputNetStream extends NetInputStream_p340 { private ByteArrayInputStream bais; @@ -22,7 +25,17 @@ public class ByteArrayInputNetStream extends NetInputStream_p340 { } @Override - public void readBytes(byte[] buffer) { + public int readBytes(byte[] buffer, int offset, int length) { + try { + int read = bais.read(buffer, offset, length); + if (read < length) { + throw new IOException("not enough data"); + } + return read; + } catch (IOException e) { + log.error("", e); + return -1; + } } @Override @@ -47,7 +60,7 @@ public class ByteArrayInputNetStream extends NetInputStream_p340 { int ch3 = bais.read(); int ch4 = bais.read(); if ((ch1 | ch2 | ch3 | ch4) < 0) return 0; - return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0)); + return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4)); } @Override diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetInputStream.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetInputStream.java index 215fc68..4658c5b 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetInputStream.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetInputStream.java @@ -1,7 +1,3 @@ -/* - * DmitriyMX - * 2018-07-25 - */ package mc.core.network.proto_1_12_2.netty.wrappers; import io.netty.buffer.ByteBuf; @@ -25,8 +21,9 @@ public class WrapperNetInputStream extends NetInputStream_p340 { } @Override - public void readBytes(byte[] buffer) { - byteBuf.readBytes(buffer); + public int readBytes(byte[] buffer, int offset, int length) { + byteBuf.readBytes(buffer, offset, length); + return length; } @Override diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetOutputStream.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetOutputStream.java index 539dc2c..b227994 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetOutputStream.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetOutputStream.java @@ -1,7 +1,3 @@ -/* - * DmitriyMX - * 2018-07-25 - */ package mc.core.network.proto_1_12_2.netty.wrappers; import io.netty.buffer.ByteBuf; @@ -30,8 +26,8 @@ public class WrapperNetOutputStream extends NetOutputStream_p340 { } @Override - public void writeBytes(byte[] buffer) { - byteBuf.writeBytes(buffer); + public void writeBytes(byte[] buffer, int offset, int lengtn) { + byteBuf.writeBytes(buffer, offset, lengtn); } @Override From 3ecaa87b0af5d533f7da6a55fcfc3b55ececf98d Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 24 Dec 2018 15:50:34 +0300 Subject: [PATCH 2/5] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=B8=20=D0=BC=D0=BE=D0=B4=D0=B5=D1=80=D0=BD?= =?UTF-8?q?=D0=B8=D0=B7=D0=B8=D1=80=D1=83=D0=B5=D0=BC=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D1=8B=20=D0=B4=D0=BB=D1=8F=20NetStream=20(ByteArray*)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ByteArrayOutputNetStream.java | 26 +- .../ByteArrayInputNetStream.java | 17 +- .../ByteArrayInputNetStreamTest.java | 99 +++++++ .../ByteArrayOutputNetStreamTest.java | 259 ++++++++++++++++++ .../packets/ByteArrayInputNetStreamTest.java | 48 ---- .../packets/PlayerAbilitiesPacketTest.java | 1 + 6 files changed, 380 insertions(+), 70 deletions(-) rename proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/{packets => }/ByteArrayInputNetStream.java (79%) create mode 100644 proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/ByteArrayInputNetStreamTest.java create mode 100644 proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/ByteArrayOutputNetStreamTest.java delete mode 100644 proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStreamTest.java diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/ByteArrayOutputNetStream.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/ByteArrayOutputNetStream.java index 6b5cbee..7a2b7d6 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/ByteArrayOutputNetStream.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/ByteArrayOutputNetStream.java @@ -27,28 +27,28 @@ public class ByteArrayOutputNetStream extends NetOutputStream_p340 { @Override public void writeShort(int value) { - baos.write((byte) value >>> 8); + baos.write((byte) (value >>> 8)); baos.write((byte) value); } @Override public void writeInt(int value) { - baos.write((byte)((int)(value >>> 24))); - baos.write((byte)((int)(value >>> 16))); - baos.write((byte)((int)(value >>> 8))); - baos.write((byte)((int)(value))); + baos.write((value >>> 24) & 0xFF); + baos.write((value >>> 16) & 0xFF); + baos.write((value >>> 8) & 0xFF); + baos.write(value & 0xFF); } @Override public void writeLong(long value) { - baos.write((byte)((int)(value >>> 56))); - baos.write((byte)((int)(value >>> 48))); - baos.write((byte)((int)(value >>> 40))); - baos.write((byte)((int)(value >>> 32))); - baos.write((byte)((int)(value >>> 24))); - baos.write((byte)((int)(value >>> 16))); - baos.write((byte)((int)(value >>> 8))); - baos.write((byte)((int)(value))); + baos.write((int) ((value >>> 56) & 0xFF)); + baos.write((int) ((value >>> 48) & 0xFF)); + baos.write((int) ((value >>> 40) & 0xFF)); + baos.write((int) ((value >>> 32) & 0xFF)); + baos.write((int) ((value >>> 24) & 0xFF)); + baos.write((int) ((value >>> 16) & 0xFF)); + baos.write((int) ((value >>> 8) & 0xFF)); + baos.write((int) (value & 0xFF)); } @Override diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStream.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/ByteArrayInputNetStream.java similarity index 79% rename from proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStream.java rename to proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/ByteArrayInputNetStream.java index 865a76a..6af906e 100644 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStream.java +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/ByteArrayInputNetStream.java @@ -1,7 +1,6 @@ -package mc.core.network.proto_1_12_2.packets; +package mc.core.network.proto_1_12_2; import lombok.extern.slf4j.Slf4j; -import mc.core.network.proto_1_12_2.NetInputStream_p340; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -16,7 +15,7 @@ public class ByteArrayInputNetStream extends NetInputStream_p340 { @Override public boolean readBoolean() { - return false; + throw new UnsupportedOperationException(); } @Override @@ -40,17 +39,17 @@ public class ByteArrayInputNetStream extends NetInputStream_p340 { @Override public int readUnsignedByte() { - return 0; + throw new UnsupportedOperationException(); } @Override public int readUnsignedShort() { - return 0; + throw new UnsupportedOperationException(); } @Override public short readShort() { - return 0; + throw new UnsupportedOperationException(); } @Override @@ -65,7 +64,7 @@ public class ByteArrayInputNetStream extends NetInputStream_p340 { @Override public long readLong() { - return 0; + throw new UnsupportedOperationException(); } @Override @@ -75,11 +74,11 @@ public class ByteArrayInputNetStream extends NetInputStream_p340 { @Override public double readDouble() { - return 0; + throw new UnsupportedOperationException(); } @Override public void skipBytes(int count) { - + throw new UnsupportedOperationException(); } } diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/ByteArrayInputNetStreamTest.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/ByteArrayInputNetStreamTest.java new file mode 100644 index 0000000..10e2a05 --- /dev/null +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/ByteArrayInputNetStreamTest.java @@ -0,0 +1,99 @@ +package mc.core.network.proto_1_12_2; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.Random; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ByteArrayInputNetStreamTest { + private Random random; + + @BeforeEach + void before() { + random = new Random(System.currentTimeMillis()); + } + + @Test + void testReadByte() throws IOException { + final byte[] bytes = new byte[1]; + random.nextBytes(bytes); + + ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeByte(bytes[0]); + + ByteArrayInputNetStream byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray()); + + assertEquals(bytes[0], byteArrayInputNetStream.readByte()); + + byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray()); + + assertEquals(bytes[0], byteArrayInputNetStream.read()); + } + + @Test + void testReadBytes() throws IOException { + final byte[] expectedBytes = new byte[10]; + random.nextBytes(expectedBytes); + + ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeBytes(expectedBytes); + + ByteArrayInputNetStream byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray()); + byte[] actualBytes = new byte[10]; + byteArrayInputNetStream.readBytes(actualBytes); + + assertArrayEquals(expectedBytes, actualBytes); + + byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray()); + actualBytes = new byte[10]; + int r = byteArrayInputNetStream.read(actualBytes); + + assertArrayEquals(expectedBytes, actualBytes); + assertEquals(expectedBytes.length, r); + + byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray()); + actualBytes = new byte[10]; + byteArrayInputNetStream.readBytes(actualBytes, 2, 5); + byte[] nibbleExpectedBytes = new byte[10]; + System.arraycopy(expectedBytes, 0, nibbleExpectedBytes, 2, 5); + + assertArrayEquals(nibbleExpectedBytes, actualBytes); + + byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray()); + actualBytes = new byte[10]; + r = byteArrayInputNetStream.read(actualBytes, 2, 5); + nibbleExpectedBytes = new byte[10]; + System.arraycopy(expectedBytes, 0, nibbleExpectedBytes, 2, 5); + + assertArrayEquals(nibbleExpectedBytes, actualBytes); + assertEquals(5, r); + } + + @Test + void testReadInt() { + final int integerDig = random.nextInt(); + + ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeInt(integerDig); + + ByteArrayInputNetStream byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray()); + + assertEquals(integerDig, byteArrayInputNetStream.readInt()); + } + + @Test + void readFloat() { + final float floatDig = random.nextFloat(); + + ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeFloat(floatDig); + + ByteArrayInputNetStream byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray()); + + assertEquals(floatDig, byteArrayInputNetStream.readFloat()); + } +} \ No newline at end of file diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/ByteArrayOutputNetStreamTest.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/ByteArrayOutputNetStreamTest.java new file mode 100644 index 0000000..c7077d5 --- /dev/null +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/ByteArrayOutputNetStreamTest.java @@ -0,0 +1,259 @@ +package mc.core.network.proto_1_12_2; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Random; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +class ByteArrayOutputNetStreamTest { + private Random random; + + @BeforeEach + void before() { + random = new Random(System.currentTimeMillis()); + } + + @Test + void testWriteBoolean() { + ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeBoolean(true); + + assertArrayEquals(new byte[]{0x01}, byteArrayOutputNetStream.toByteArray()); + + byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeBoolean(false); + + assertArrayEquals(new byte[]{0x00}, byteArrayOutputNetStream.toByteArray()); + } + + @Test + void testWriteByte() throws IOException { + final byte[] bytes = new byte[1]; + random.nextBytes(bytes); + + ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeByte(bytes[0]); + + assertArrayEquals(bytes, byteArrayOutputNetStream.toByteArray()); + + byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.write(bytes[0]); + + assertArrayEquals(bytes, byteArrayOutputNetStream.toByteArray()); + } + + @Test + void testWriteUnsignedByte() { + final byte[] bytes = new byte[1]; + random.nextBytes(bytes); + + ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeUnsignedByte(bytes[0]); + + assertArrayEquals(bytes, byteArrayOutputNetStream.toByteArray()); + + byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeUnsignedByte(0xFF); + + assertArrayEquals(new byte[]{(byte) 0xFF}, byteArrayOutputNetStream.toByteArray()); + } + + @Test + void testWriteBytes() throws IOException { + final byte[] expectedBytes = new byte[10]; + random.nextBytes(expectedBytes); + + ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeBytes(expectedBytes); + + assertArrayEquals(expectedBytes, byteArrayOutputNetStream.toByteArray()); + + byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.write(expectedBytes); + + assertArrayEquals(expectedBytes, byteArrayOutputNetStream.toByteArray()); + + byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeBytes(expectedBytes, 2, 5); + byte[] nibbleExpectedBytes = new byte[5]; + System.arraycopy(expectedBytes, 2, nibbleExpectedBytes, 0, 5); + + assertArrayEquals(nibbleExpectedBytes, byteArrayOutputNetStream.toByteArray()); + + byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.write(expectedBytes, 2, 5); + nibbleExpectedBytes = new byte[5]; + System.arraycopy(expectedBytes, 2, nibbleExpectedBytes, 0, 5); + + assertArrayEquals(nibbleExpectedBytes, byteArrayOutputNetStream.toByteArray()); + } + + @Test + void testWriteShort() { + int smallInt; + do { + smallInt = random.nextInt(); + } while (smallInt > Short.MAX_VALUE || smallInt < Short.MIN_VALUE); + + ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeShort(smallInt); + + assertArrayEquals(new byte[]{ (byte) (smallInt >>> 8), + (byte) smallInt }, + byteArrayOutputNetStream.toByteArray()); + } + + @Test + void testWriteInt() { + final int integerDig = random.nextInt(); + + ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeInt(integerDig); + + assertArrayEquals(new byte[]{ (byte) ((integerDig >>> 24) & 0xFF), + (byte) ((integerDig >>> 16) & 0xFF), + (byte) ((integerDig >>> 8) & 0xFF), + (byte) (integerDig & 0xFF) }, + byteArrayOutputNetStream.toByteArray()); + } + + @Test + void testWriteLong() { + final long longDig = random.nextLong(); + + ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeLong(longDig); + + assertArrayEquals(new byte[]{ (byte) ((longDig >>> 56) & 0xFF), + (byte) ((longDig >>> 48) & 0xFF), + (byte) ((longDig >>> 40) & 0xFF), + (byte) ((longDig >>> 32) & 0xFF), + (byte) ((longDig >>> 24) & 0xFF), + (byte) ((longDig >>> 16) & 0xFF), + (byte) ((longDig >>> 8) & 0xFF), + (byte) (longDig & 0xFF) }, + byteArrayOutputNetStream.toByteArray()); + } + + @Test + void testWriteFloat() { + final float floatDig = random.nextFloat(); + + ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeFloat(floatDig); + final int floatBits = Float.floatToIntBits(floatDig); + + assertArrayEquals(new byte[]{ (byte) ((floatBits >>> 24) & 0xFF), + (byte) ((floatBits >>> 16) & 0xFF), + (byte) ((floatBits >>> 8) & 0xFF), + (byte) (floatBits & 0xFF) }, + byteArrayOutputNetStream.toByteArray()); + } + + @Test + void testWriteDouble() { + final double doubleDig = random.nextDouble(); + + ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeDouble(doubleDig); + final long doubleBits = Double.doubleToLongBits(doubleDig); + + assertArrayEquals(new byte[]{ (byte) ((doubleBits >>> 56) & 0xFF), + (byte) ((doubleBits >>> 48) & 0xFF), + (byte) ((doubleBits >>> 40) & 0xFF), + (byte) ((doubleBits >>> 32) & 0xFF), + (byte) ((doubleBits >>> 24) & 0xFF), + (byte) ((doubleBits >>> 16) & 0xFF), + (byte) ((doubleBits >>> 8) & 0xFF), + (byte) (doubleBits & 0xFF) }, + byteArrayOutputNetStream.toByteArray()); + } + + @Test + void testWriteVarInt() { + final int b1Int = 120; + ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeVarInt(b1Int); + + assertArrayEquals(new byte[]{ 0x78 }, + byteArrayOutputNetStream.toByteArray()); + + final int b2Int = 12000; + byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeVarInt(b2Int); + + assertArrayEquals(new byte[]{ (byte) 0xE0, 0x5D }, + byteArrayOutputNetStream.toByteArray()); + + final int b3Int = 120000; + byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeVarInt(b3Int); + + assertArrayEquals(new byte[]{ (byte) 0xC0, (byte) 0xA9, 0x07 }, + byteArrayOutputNetStream.toByteArray()); + + final int b4Int = 120000000; + byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeVarInt(b4Int); + + assertArrayEquals(new byte[]{ (byte) 0x80, (byte) 0x9C, (byte) 0x9C, (byte) 0x39 }, + byteArrayOutputNetStream.toByteArray()); + + final int b5Int = 1200000000; + byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeVarInt(b5Int); + + assertArrayEquals(new byte[]{ (byte) 0x80, (byte) 0x98, (byte) 0x9A, (byte) 0xBC, 0x04 }, + byteArrayOutputNetStream.toByteArray()); + } + + @Test + void testWriteString() { + final String string = "Hello? Есть тут кто?"; + + ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeString(string); + + final byte[] strBytes = string.getBytes(StandardCharsets.UTF_8); + final byte[] bytes = new byte[strBytes.length + 1]; + bytes[0] = (byte) string.length(); // здесь считается, что размер поместится в один байт + System.arraycopy(strBytes, 0, bytes, 1, strBytes.length); + + assertArrayEquals(bytes, byteArrayOutputNetStream.toByteArray()); + } + + @Test + void testWriteUUID() { + final UUID uuid = UUID.randomUUID(); + + ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream(); + byteArrayOutputNetStream.writeUUID(uuid); + + final long mostSignificantBits = uuid.getMostSignificantBits(); + final long leastSignificantBits = uuid.getLeastSignificantBits(); + + assertArrayEquals(new byte[]{ (byte) ((mostSignificantBits >>> 56) & 0xFF), + (byte) ((mostSignificantBits >>> 48) & 0xFF), + (byte) ((mostSignificantBits >>> 40) & 0xFF), + (byte) ((mostSignificantBits >>> 32) & 0xFF), + (byte) ((mostSignificantBits >>> 24) & 0xFF), + (byte) ((mostSignificantBits >>> 16) & 0xFF), + (byte) ((mostSignificantBits >>> 8) & 0xFF), + (byte) (mostSignificantBits & 0xFF), + + (byte) ((leastSignificantBits >>> 56) & 0xFF), + (byte) ((leastSignificantBits >>> 48) & 0xFF), + (byte) ((leastSignificantBits >>> 40) & 0xFF), + (byte) ((leastSignificantBits >>> 32) & 0xFF), + (byte) ((leastSignificantBits >>> 24) & 0xFF), + (byte) ((leastSignificantBits >>> 16) & 0xFF), + (byte) ((leastSignificantBits >>> 8) & 0xFF), + (byte) (leastSignificantBits & 0xFF) }, + byteArrayOutputNetStream.toByteArray()); + } +} diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStreamTest.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStreamTest.java deleted file mode 100644 index 4964a77..0000000 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStreamTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package mc.core.network.proto_1_12_2.packets; - -import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; -import org.junit.jupiter.api.Test; - -import java.util.Random; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class ByteArrayInputNetStreamTest { - private Random rnd = new Random(); - - @Test - void readByte() { - final byte b0 = (byte) rnd.nextInt(); - ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); - netStream.writeByte(b0); - byte[] buffer = netStream.toByteArray(); - - ByteArrayInputNetStream netInputStream = new ByteArrayInputNetStream(buffer); - byte b1 = netInputStream.readByte(); - assertEquals(b0, b1); - } - - @Test - void readInt() { - final int i0 = rnd.nextInt(); - ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); - netStream.writeInt(i0); - byte[] buffer = netStream.toByteArray(); - - ByteArrayInputNetStream netInputStream = new ByteArrayInputNetStream(buffer); - int i1 = netInputStream.readInt(); - assertEquals(i0, i1); - } - - @Test - void readFloat() { - final float f0 = rnd.nextFloat(); - ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); - netStream.writeFloat(f0); - byte[] buffer = netStream.toByteArray(); - - ByteArrayInputNetStream netInputStream = new ByteArrayInputNetStream(buffer); - float f1 = netInputStream.readFloat(); - assertEquals(f0, f1, 0.00001f); - } -} \ No newline at end of file diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacketTest.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacketTest.java index 229a15a..62d70c7 100644 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacketTest.java +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacketTest.java @@ -1,5 +1,6 @@ package mc.core.network.proto_1_12_2.packets; +import mc.core.network.proto_1_12_2.ByteArrayInputNetStream; import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; From 969ecdac36e5e65e4d3aee9574482ef3aa4afe02 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Tue, 25 Dec 2018 10:27:06 +0300 Subject: [PATCH 3/5] Block: getBlockType() -> getType() --- core/src/main/java/mc/core/world/block/Block.java | 2 +- .../mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java | 2 +- .../src/test/java/mc/world/simple/SimpleChunkSectionTest.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/mc/core/world/block/Block.java b/core/src/main/java/mc/core/world/block/Block.java index a23d3df..24c3b4f 100644 --- a/core/src/main/java/mc/core/world/block/Block.java +++ b/core/src/main/java/mc/core/world/block/Block.java @@ -3,6 +3,6 @@ package mc.core.world.block; public interface Block { int getLight(); void setLight(int light); - BlockType getBlockType(); + BlockType getType(); BlockLocation getLocation(); } diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java index 38db3cc..233548a 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java @@ -171,7 +171,7 @@ public class ChunkDataPacket implements SCPacket { for (int z = 0; z < 16; z++) { for (int x = 0; x < 16; x++) { Block block = chunkSection.getBlock(x, y, z); - int blockState = serializeBlockState(block.getBlockType()); + int blockState = serializeBlockState(block.getType()); int currentIndexPaletteBlock; if (!palette.contains(blockState)) { diff --git a/simple_world/src/test/java/mc/world/simple/SimpleChunkSectionTest.java b/simple_world/src/test/java/mc/world/simple/SimpleChunkSectionTest.java index 4804190..9a670cc 100644 --- a/simple_world/src/test/java/mc/world/simple/SimpleChunkSectionTest.java +++ b/simple_world/src/test/java/mc/world/simple/SimpleChunkSectionTest.java @@ -33,9 +33,9 @@ class SimpleChunkSectionTest { for (int z = 0; z < 16; z++) { Block block = chunkSection.getBlock(x, y, z); if (y > layersBlock.size()-1) { - assertEquals(block.getBlockType(), BlockType.AIR); + assertEquals(block.getType(), BlockType.AIR); } else { - assertEquals(block.getBlockType(), layersBlock.get(y)); + assertEquals(block.getType(), layersBlock.get(y)); } } } From 48de3a50498f2d056ecb95dbc1d3902990e5baeb Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Tue, 25 Dec 2018 14:55:14 +0300 Subject: [PATCH 4/5] =?UTF-8?q?=D0=BC=D0=B5=D0=BB=D0=BA=D0=B8=D0=B9=20?= =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD?= =?UTF-8?q?=D0=B3=20+=20=D1=83=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5?= =?UTF-8?q?=D0=BC=20=D1=82=D0=BE=D1=87=D0=BD=D0=BE=20=D0=B3=D0=B4=D0=B5=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5,=20?= =?UTF-8?q?=D0=B0=20=D0=B3=D0=B4=D0=B5=20=D0=B3=D0=BB=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D0=BA=D0=BE=D0=BE=D1=80=D0=B4?= =?UTF-8?q?=D0=B8=D0=BD=D0=B0=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/mc/core/CoreEventListener.java | 4 +- .../src/main/java/mc/core/EntityLocation.java | 5 ++ core/src/main/java/mc/core/world/World.java | 39 ++++++++++--- .../mc/core/world/block/AbstractBlock.java | 4 +- .../main/java/mc/core/world/chunk/Chunk.java | 27 ++++++++- .../mc/core/world/chunk/ChunkSection.java | 33 ++++++----- .../proto_1_12_2/packets/ChunkDataPacket.java | 2 +- .../packets/ChunkdataPacketTest.java | 3 +- .../netty/handlers/LoginHandler.java | 2 +- .../java/mc/world/simple/SimpleChunk.java | 51 +++++++++++++++-- .../mc/world/simple/SimpleChunkSection.java | 56 ++++++++----------- .../java/mc/world/simple/SimpleWorld.java | 13 ++++- 12 files changed, 168 insertions(+), 71 deletions(-) diff --git a/core/src/main/java/mc/core/CoreEventListener.java b/core/src/main/java/mc/core/CoreEventListener.java index 201b60e..134e071 100644 --- a/core/src/main/java/mc/core/CoreEventListener.java +++ b/core/src/main/java/mc/core/CoreEventListener.java @@ -24,10 +24,10 @@ public class CoreEventListener { log.trace("(GameLoop) playerMoveEventHandler()"); Chunk chunk; - chunk = event.getPlayer().getWorld().getChunk(event.getOldLocation()); // Old chunk + chunk = event.getPlayer().getWorld().getChunk(event.getOldLocation().toBlockLocation()); // Old chunk int ccX = chunk.getX(); int ccZ = chunk.getZ(); - chunk = event.getPlayer().getWorld().getChunk(event.getNewLocation()); // Next chunk + chunk = event.getPlayer().getWorld().getChunk(event.getNewLocation().toBlockLocation()); // Next chunk int ncX = chunk.getX(); int ncZ = chunk.getZ(); diff --git a/core/src/main/java/mc/core/EntityLocation.java b/core/src/main/java/mc/core/EntityLocation.java index 735c50b..e0dc571 100644 --- a/core/src/main/java/mc/core/EntityLocation.java +++ b/core/src/main/java/mc/core/EntityLocation.java @@ -3,6 +3,7 @@ package mc.core; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import mc.core.world.block.BlockLocation; import org.springframework.lang.Nullable; @NoArgsConstructor @@ -44,6 +45,10 @@ public class EntityLocation implements Cloneable { return (int) Math.floor(z); } + public BlockLocation toBlockLocation() { + return new BlockLocation(getBlockX(), getBlockY(), getBlockZ()); + } + @Override public EntityLocation clone() { try { diff --git a/core/src/main/java/mc/core/world/World.java b/core/src/main/java/mc/core/world/World.java index 37d35e0..8c91eac 100644 --- a/core/src/main/java/mc/core/world/World.java +++ b/core/src/main/java/mc/core/world/World.java @@ -1,34 +1,57 @@ -/* - * DmitriyMX - * 2018-04-15 - */ package mc.core.world; import mc.core.EntityLocation; +import mc.core.world.block.Block; import mc.core.world.block.BlockLocation; import mc.core.world.chunk.Chunk; public interface World { String getName(); - WorldType getWorldType(); + WorldType getType(); EntityLocation getSpawn(); + void setSpawn(EntityLocation location); + default void setSpawn(double x, double y, double z, float yaw, float pitch) { setSpawn(new EntityLocation(x, y, z, yaw, pitch)); } + default void setSpawn(double x, double y, double z) { setSpawn(x, y, z, 0f, 0f); } + /** + * Получить чанк по его координатам + * @param x chunk X + * @param z chunk Z + * @return {@link Chunk} + */ Chunk getChunk(int x, int z); - void setChunk(int x, int z, Chunk chunkSection); + /** + * Получить чанк по глобальным координатам блока + * @param location {@link BlockLocation} + * @return {@link Chunk} + */ default Chunk getChunk(BlockLocation location) { return getChunk(location.getX() >> 4, location.getZ() >> 4); } - default Chunk getChunk(EntityLocation location) { - return getChunk(location.getBlockX() >> 4, location.getBlockZ() >> 4); + void setChunk(int x, int z, Chunk chunk); + + /** + * Получить блок по его координатам + * @param x X + * @param y Y + * @param z Z + * @return {@link Block} + */ + Block getBlock(int x, int y, int z); + + default Block getBlock(BlockLocation location) { + return getBlock(location.getX(), location.getY(), location.getZ()); } + + void setBlock(Block block); } diff --git a/core/src/main/java/mc/core/world/block/AbstractBlock.java b/core/src/main/java/mc/core/world/block/AbstractBlock.java index 6bf8445..1795d8e 100644 --- a/core/src/main/java/mc/core/world/block/AbstractBlock.java +++ b/core/src/main/java/mc/core/world/block/AbstractBlock.java @@ -10,10 +10,10 @@ public abstract class AbstractBlock implements Block { @Getter private int light = 0; @Getter - private final BlockType blockType; + private final BlockType type; protected AbstractBlock(BlockType type) { - this.blockType = type; + this.type = type; } @Override diff --git a/core/src/main/java/mc/core/world/chunk/Chunk.java b/core/src/main/java/mc/core/world/chunk/Chunk.java index 0ee2e28..d096646 100644 --- a/core/src/main/java/mc/core/world/chunk/Chunk.java +++ b/core/src/main/java/mc/core/world/chunk/Chunk.java @@ -1,6 +1,7 @@ package mc.core.world.chunk; import mc.core.world.Biome; +import mc.core.world.block.Block; public interface Chunk { int getX(); @@ -9,6 +10,28 @@ public interface Chunk { ChunkSection getChunkSection(int height); void setChunkSection(int height, ChunkSection chunkSection); - Biome getBiome(int localX, int localZ); - void setBiome(int localX, int localZ, Biome biome); + /** + * Получить блок по глобальным координатам секции чанка + * @param x global X + * @param y global Y + * @param z global Z + * @return {@link Block} + */ + Block getBlock(int x, int y, int z); + void setBlock(Block block); + + int getSkyLight(int x, int y, int z); + void setSkyLight(int x, int y, int z, int lightLevel); + + int getAddition(int x, int y, int z); + void setAddition(int x, int y, int z, int value); + + /** + * Получить тип биома по глобальным координатам + * @param x global X + * @param z global Z + * @return + */ + Biome getBiome(int x, int z); + void setBiome(int x, int z, Biome biome); } diff --git a/core/src/main/java/mc/core/world/chunk/ChunkSection.java b/core/src/main/java/mc/core/world/chunk/ChunkSection.java index ae65a8b..194f520 100644 --- a/core/src/main/java/mc/core/world/chunk/ChunkSection.java +++ b/core/src/main/java/mc/core/world/chunk/ChunkSection.java @@ -1,26 +1,29 @@ -/* - * DmitriyMX - * 2018-04-15 - */ package mc.core.world.chunk; -import mc.core.world.Biome; import mc.core.world.block.Block; -/* 16x16x16 */ +/** + * Секция чанка размером 16x16x16 блоков + */ public interface ChunkSection { - int getX(); + Chunk getParent(); + void setParent(Chunk chunk); + int getY(); - int getZ(); + /** + * Получить блок по локальным координатам секции чанка + * @param localX local X (0-15) + * @param localY local Y (0-15) + * @param localZ local Z (0-15) + * @return {@link Block} + */ + Block getBlock(int localX, int localY, int localZ); void setBlock(Block block); - Block getBlock(int x, int y, int z); - int getSkyLight(int x, int y, int z); - void setSkyLight(int x, int y, int z, int lightLevel); + int getSkyLight(int localX, int localY, int localZ); + void setSkyLight(int localX, int localY, int localZ, int lightLevel); - int getAddition(int x, int y, int z); - void setAddition(int x, int y, int z, int value); - - Biome getBiome(int localX, int localZ); + int getAddition(int localX, int localY, int localZ); + void setAddition(int localX, int localY, int localZ, int value); } diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java index 233548a..a57e323 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java @@ -207,7 +207,7 @@ public class ChunkDataPacket implements SCPacket { } if (!biomeFinally) { - biomes.writeByte(chunkSection.getBiome(x, z).getId()); + biomes.writeByte(chunk.getBiome(x, z).getId()); if (x == 15 && z == 15) { biomeFinally = true; } diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ChunkdataPacketTest.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ChunkdataPacketTest.java index 5060676..6b21626 100644 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ChunkdataPacketTest.java +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ChunkdataPacketTest.java @@ -41,7 +41,6 @@ class ChunkdataPacketTest { if (y <= 3) return 0; else return 15; }); - when(chunkSection.getBiome(anyInt(), anyInt())).thenReturn(Biome.PLAINS); when(chunkSection.getBlock(anyInt(), anyInt(), anyInt())).thenAnswer(invocation -> { Object[] args = invocation.getArguments(); int x = (int) args[0]; @@ -57,7 +56,7 @@ class ChunkdataPacketTest { }); world = mock(World.class); - when(world.getWorldType()).thenReturn(WorldType.FLAT); + when(world.getType()).thenReturn(WorldType.FLAT); when(world.getChunk(anyInt(), anyInt())).thenAnswer(invocation -> { Object[] args = invocation.getArguments(); diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java index 0f8332c..19afb32 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java @@ -73,7 +73,7 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand pkt1.setMode(PlayerMode.CREATIVE); //TODO перенести в Config pkt1.setDimension(0/*Overworld*/); //TODO перенести в World pkt1.setDifficulty(0/*Peaceful*/); //TODO перенести в Config - pkt1.setLevelType(world.getWorldType().getName()); + pkt1.setLevelType(world.getType().getName()); channel.write(pkt1); // Spawn Position diff --git a/simple_world/src/main/java/mc/world/simple/SimpleChunk.java b/simple_world/src/main/java/mc/world/simple/SimpleChunk.java index aadf810..7a6fbb5 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleChunk.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleChunk.java @@ -4,6 +4,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import mc.core.world.Biome; +import mc.core.world.block.Block; import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkSection; @@ -13,7 +14,6 @@ public class SimpleChunk implements Chunk { @Getter private final int x, z; private ChunkSection chunkSection; - private final Biome biome = Biome.PLAINS; @Override public ChunkSection getChunkSection(int height) { @@ -23,15 +23,58 @@ public class SimpleChunk implements Chunk { @Override public void setChunkSection(int height, ChunkSection chunkSection) { this.chunkSection = chunkSection; + this.chunkSection.setParent(this); } @Override - public Biome getBiome(int localX, int localZ) { - return biome; + public Block getBlock(int x, int y, int z) { + return chunkSection.getBlock( + x - (x >> 4) << 4, + y - (y >> 4) << 4, + z - (z >> 4) << 4 + ); } @Override - public void setBiome(int localX, int localZ, Biome biome) { + public void setBlock(Block block) { + // ignore + } + + @Override + public int getSkyLight(int x, int y, int z) { + return chunkSection.getSkyLight( + x - (x >> 4) << 4, + y - (y >> 4) << 4, + z - (z >> 4) << 4 + ); + } + + @Override + public void setSkyLight(int x, int y, int z, int lightLevel) { + // ignore + } + + @Override + public int getAddition(int x, int y, int z) { + return chunkSection.getAddition( + x - (x >> 4) << 4, + y - (y >> 4) << 4, + z - (z >> 4) << 4 + ); + } + + @Override + public void setAddition(int x, int y, int z, int value) { + // ignore + } + + @Override + public Biome getBiome(int x, int z) { + return Biome.PLAINS; + } + + @Override + public void setBiome(int x, int z, Biome biome) { // ignore } } diff --git a/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java b/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java index 4674ac7..cde4005 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java @@ -1,14 +1,19 @@ package mc.world.simple; -import mc.core.world.Biome; +import lombok.Getter; +import lombok.Setter; import mc.core.world.block.Block; import mc.core.world.block.BlockFactory; import mc.core.world.block.BlockType; +import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkSection; import java.util.List; public class SimpleChunkSection implements ChunkSection { + @Getter + @Setter + private Chunk parent; private final BlockFactory blockFactory = new BlockFactory(); private final List layersBlock; @@ -17,32 +22,22 @@ public class SimpleChunkSection implements ChunkSection { } @Override - public int getSkyLight(int x, int y, int z) { - if (y <= 3) return 0; + public int getSkyLight(int localX, int localY, int localZ) { + if (localY <= 3) return 0; else return 15; } @Override - public void setSkyLight(int x, int y, int z, int lightLevel) { + public void setSkyLight(int localX, int localY, int localZ, int lightLevel) { } @Override - public int getAddition(int x, int y, int z) { + public int getAddition(int localX, int localY, int localZ) { return 0; } @Override - public void setAddition(int x, int y, int z, int value) { - } - - @Override - public Biome getBiome(int localX, int localZ) { - return Biome.PLAINS; - } - - @Override - public int getX() { - return 0; + public void setAddition(int localX, int localY, int localZ, int value) { } @Override @@ -50,31 +45,26 @@ public class SimpleChunkSection implements ChunkSection { return 0; } - @Override - public int getZ() { - return 0; - } - @Override public void setBlock(Block block) { } @Override - public Block getBlock(int x, int y, int z) { - if (x < 0) x = 0; - else if (x > 15) x = 15; - if (y < 0) y = 0; - else if (y > 15) y = 15; - if (z < 0) z = 0; - else if (z > 15) z = 15; + public Block getBlock(int localX, int localY, int localZ) { + if (localX < 0) localX = 0; + else if (localX > 15) localX = 15; + if (localY < 0) localY = 0; + else if (localY > 15) localY = 15; + if (localZ < 0) localZ = 0; + else if (localZ > 15) localZ = 15; - if (y >= layersBlock.size()) { - return blockFactory.create(BlockType.AIR, x, y, z); + if (localY >= layersBlock.size()) { + return blockFactory.create(BlockType.AIR, localX, localY, localZ); } - BlockType blockType = layersBlock.get(y); - if (blockType == null) return blockFactory.create(BlockType.AIR, x, y, z); + BlockType blockType = layersBlock.get(localY); + if (blockType == null) return blockFactory.create(BlockType.AIR, localX, localY, localZ); - return blockFactory.create(blockType, x, y, z); + return blockFactory.create(blockType, localX, localY, localZ); } } diff --git a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java index b4ac9e4..4a6e345 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j; import mc.core.EntityLocation; import mc.core.world.World; import mc.core.world.WorldType; +import mc.core.world.block.Block; import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkProvider; import org.springframework.beans.factory.BeanNameAware; @@ -19,7 +20,7 @@ public class SimpleWorld implements World, BeanNameAware { @Getter private String name; @Getter - private final WorldType worldType = WorldType.FLAT; + private final WorldType type = WorldType.FLAT; private EntityLocation spawn; @Setter private ChunkProvider chunkProvider; @@ -49,6 +50,16 @@ public class SimpleWorld implements World, BeanNameAware { throw new UnsupportedOperationException(); } + @Override + public Block getBlock(int x, int y, int z) { + return chunkProvider.getChunk(x >> 4, z >> 4).getBlock(x, y, z); + } + + @Override + public void setBlock(Block block) { + // nope... + } + @Override public void setBeanName(@Nonnull String name) { this.name = name; From 3ce031f87be3e13aa9a1f1c0917cbea3142b92a8 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Tue, 25 Dec 2018 16:20:31 +0300 Subject: [PATCH 5/5] =?UTF-8?q?=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=81=D0=BE=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=B8=D0=BC?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D1=81=20Gradle=205?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index cd525cf..ccd332c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,6 @@ buildscript { repositories { - maven { - url "https://plugins.gradle.org/m2/" - } + maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath (group: 'org.sonarsource.scanner.gradle', name: 'sonarqube-gradle-plugin', version: '2.6.2') @@ -33,9 +31,7 @@ allprojects { repositories { mavenCentral() - maven { - url 'https://oss.sonatype.org/content/groups/public/' - } + maven { url 'https://oss.sonatype.org/content/groups/public/' } } } @@ -65,6 +61,8 @@ subprojects { /* Lombok */ annotationProcessor (group: 'org.projectlombok', name: 'lombok', version: lombok_version) compileOnly (group: 'org.projectlombok', name: 'lombok', version: lombok_version) + testAnnotationProcessor (group: 'org.projectlombok', name: 'lombok', version: lombok_version) + testCompileOnly (group: 'org.projectlombok', name: 'lombok', version: lombok_version) /* Testing */ testImplementation (group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: junit_version)