From 9826df5d5b16270d281ec7e6ffecc90803a60fd4 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Tue, 29 Jan 2019 12:02:11 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B4=D1=8F=D0=BB=D1=8F=D0=B5=D0=BC=20?= =?UTF-8?q?=D0=B2=D1=81=D0=B5=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B8,=20?= =?UTF-8?q?=D0=BA=D1=80=D0=BE=D0=BC=D0=B5=20core?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anvil-loader/build.gradle | 9 - .../com/flowpowered/nbt/LongArrayTag.java | 73 ---- .../com/flowpowered/nbt/NBTConstants.java | 38 --- .../java/com/flowpowered/nbt/TagType.java | 94 ------ .../nbt/stream/NBTInputStream.java | 210 ------------ .../main/java/mc/world/anvil/AnvilBlock.java | 80 ----- .../main/java/mc/world/anvil/AnvilChunk.java | 137 -------- .../mc/world/anvil/AnvilChunkProvider.java | 50 --- .../mc/world/anvil/AnvilChunkSection.java | 57 ---- .../main/java/mc/world/anvil/EmptyChunk.java | 153 --------- .../main/java/mc/world/anvil/LevelInfo.java | 26 -- .../src/main/java/mc/world/anvil/Region.java | 108 ------ .../java/mc/world/anvil/RegionManager.java | 49 --- .../test/java/mc/world/anvil/RegionTest.java | 213 ------------ .../src/test/resources/region/r.0.-1.mca | Bin 12288 -> 0 bytes .../src/test/resources/region/r.0.0.mca | Bin 716800 -> 0 bytes core/build.gradle | 2 +- .../java/mc/core/embedded/FakeServer.java | 10 +- h2_playermanager/build.gradle | 17 - .../src/main/java/mc/core/h2db/H2Player.java | 63 ---- .../java/mc/core/h2db/H2PlayerManager.java | 98 ------ .../mc/core/h2db/entity/H2PlayerEntity.java | 102 ------ .../repository/H2PlayerEntityRepository.java | 12 - .../mc/core/h2db/service/H2PlayerService.java | 11 - .../h2db/service/H2PlayerServiceImpl.java | 44 --- .../mc/core/h2db/H2PlayerManagerTest.java | 159 --------- .../test/java/mc/core/h2db/H2PlayerTest.java | 36 -- .../java/mc/core/h2db/TestSpringConfig.java | 90 ----- .../h2db/service/H2PlayerServiceTest.java | 155 --------- proto_1.12.2/build.gradle | 10 - .../ByteArrayOutputNetStream.java | 71 ---- .../core/network/proto_1_12_2/Direction.java | 26 -- .../proto_1_12_2/NetInputStream_p340.java | 82 ----- .../proto_1_12_2/NetOutputStream_p340.java | 63 ---- .../mc/core/network/proto_1_12_2/State.java | 132 -------- .../network/proto_1_12_2/TeleportManager.java | 55 --- .../network/proto_1_12_2/package-info.java | 32 -- .../proto_1_12_2/packets/AnimationPacket.java | 17 - .../proto_1_12_2/packets/BossBarPacket.java | 117 ------- .../proto_1_12_2/packets/ChangeGameState.java | 36 -- .../packets/ChatMessageClientPacket.java | 21 -- .../packets/ChatMessageServerPacket.java | 30 -- .../proto_1_12_2/packets/ChunkDataPacket.java | 317 ------------------ .../packets/ClientSettingsPacket.java | 48 --- .../packets/DisconnectPacket.java | 25 -- .../packets/EncryptionRequestPacket.java | 32 -- .../packets/EntityActionPacket.java | 45 --- .../proto_1_12_2/packets/HandshakePacket.java | 30 -- .../packets/HeldItemChangePacket.java | 17 - .../proto_1_12_2/packets/JoinGamePacket.java | 34 -- .../proto_1_12_2/packets/KeepAlivePacket.java | 32 -- .../packets/LoginStartPacket.java | 21 -- .../packets/LoginSuccessPacket.java | 29 -- .../proto_1_12_2/packets/PingPacket.java | 26 -- .../packets/PlayerAbilitiesPacket.java | 58 ---- .../packets/PlayerBlockPlacementPacket.java | 30 -- .../packets/PlayerDiggingPacket.java | 55 --- .../PlayerListHeaderAndFooterPacket.java | 35 -- .../packets/PlayerListItemPacket.java | 84 ----- .../packets/PlayerLookPacket.java | 18 - .../packets/PlayerPositionAndLookPacket.java | 56 ---- .../packets/PlayerPositionPacket.java | 19 -- .../packets/PluginMessagePacket.java | 34 -- .../packets/SpawnPositionPacket.java | 28 -- .../packets/StatusRequestPacket.java | 16 - .../packets/StatusResponsePacket.java | 53 --- .../packets/TabCompletePacket.java | 33 -- .../packets/TeleportConfirmPacket.java | 21 -- .../packets/TimeUpdatePacket.java | 27 -- .../proto_1_12_2/packets/TitlePacket.java | 117 ------- .../packets/UnloadChunkPacket.java | 16 - .../serializers/BlockLocationSerializer.java | 63 ---- .../proto_1_12_2/serializers/Mapper.java | 5 - .../proto_1_12_2/serializers/TextMapper.java | 55 --- .../proto_1_12_2/ByteArrayInputNetStream.java | 84 ----- .../ByteArrayInputNetStreamTest.java | 135 -------- .../ByteArrayOutputNetStreamTest.java | 259 -------------- .../packets/ChunkDataPacketTest.java | 312 ----------------- .../proto_1_12_2/packets/DumbChunkData.java | 133 -------- .../packets/PlayerAbilitiesPacketTest.java | 41 --- .../BlockLocationSerializerTest.java | 32 -- .../packets/ChunkDataPacket00.bin | Bin 13182 -> 0 bytes .../packets/ChunkDataPacket01.bin | Bin 6967 -> 0 bytes proto_1.12.2_netty/build.gradle | 13 - .../proto_1_12_2/netty/KeepAliveThread.java | 48 --- .../proto_1_12_2/netty/NettyServer.java | 92 ----- .../proto_1_12_2/netty/PacketDecoder.java | 66 ---- .../proto_1_12_2/netty/PacketEncoder.java | 41 --- .../proto_1_12_2/netty/PacketHandler.java | 76 ----- .../proto_1_12_2/netty/PacketPostEncoder.java | 38 --- .../netty/PlayerEventListener.java | 70 ---- .../netty/handlers/AbstractStateHandler.java | 54 --- .../netty/handlers/HandshakeHandler.java | 25 -- .../netty/handlers/HandshakeStateHandler.java | 11 - .../netty/handlers/LoginHandler.java | 127 ------- .../netty/handlers/LoginStateHandler.java | 11 - .../netty/handlers/PlayHandler.java | 90 ----- .../netty/handlers/PlayStateHandler.java | 11 - .../netty/handlers/StateHandler.java | 12 - .../netty/handlers/StatusHandler.java | 38 --- .../netty/handlers/StatusStateHandler.java | 11 - .../netty/wrappers/WrapperNetChannel.java | 73 ---- .../netty/wrappers/WrapperNetInputStream.java | 68 ---- .../wrappers/WrapperNetOutputStream.java | 57 ---- settings.gradle | 6 - simple_world/README.MD | 39 --- simple_world/build.gradle | 6 - .../mc/world/simple/FlatChunkProvider.java | 55 --- .../java/mc/world/simple/SimpleChunk.java | 79 ----- .../mc/world/simple/SimpleChunkSection.java | 70 ---- .../java/mc/world/simple/SimpleWorld.java | 67 ---- .../world/simple/SimpleChunkSectionTest.java | 46 --- .../java/mc/world/simple/SimpleWorldTest.java | 37 -- .../mc/world/simple/TestSpringConfig.java | 38 --- vanilla_commands/build.gradle | 6 - .../main/java/mc/commands/HelpCommand.java | 70 ---- .../main/java/mc/commands/ListCommand.java | 60 ---- 117 files changed, 6 insertions(+), 6868 deletions(-) delete mode 100644 anvil-loader/build.gradle delete mode 100644 anvil-loader/src/main/java/com/flowpowered/nbt/LongArrayTag.java delete mode 100644 anvil-loader/src/main/java/com/flowpowered/nbt/NBTConstants.java delete mode 100644 anvil-loader/src/main/java/com/flowpowered/nbt/TagType.java delete mode 100644 anvil-loader/src/main/java/com/flowpowered/nbt/stream/NBTInputStream.java delete mode 100644 anvil-loader/src/main/java/mc/world/anvil/AnvilBlock.java delete mode 100644 anvil-loader/src/main/java/mc/world/anvil/AnvilChunk.java delete mode 100644 anvil-loader/src/main/java/mc/world/anvil/AnvilChunkProvider.java delete mode 100644 anvil-loader/src/main/java/mc/world/anvil/AnvilChunkSection.java delete mode 100644 anvil-loader/src/main/java/mc/world/anvil/EmptyChunk.java delete mode 100644 anvil-loader/src/main/java/mc/world/anvil/LevelInfo.java delete mode 100644 anvil-loader/src/main/java/mc/world/anvil/Region.java delete mode 100644 anvil-loader/src/main/java/mc/world/anvil/RegionManager.java delete mode 100644 anvil-loader/src/test/java/mc/world/anvil/RegionTest.java delete mode 100644 anvil-loader/src/test/resources/region/r.0.-1.mca delete mode 100644 anvil-loader/src/test/resources/region/r.0.0.mca delete mode 100644 h2_playermanager/build.gradle delete mode 100644 h2_playermanager/src/main/java/mc/core/h2db/H2Player.java delete mode 100644 h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java delete mode 100644 h2_playermanager/src/main/java/mc/core/h2db/entity/H2PlayerEntity.java delete mode 100644 h2_playermanager/src/main/java/mc/core/h2db/repository/H2PlayerEntityRepository.java delete mode 100644 h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerService.java delete mode 100644 h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerServiceImpl.java delete mode 100644 h2_playermanager/src/test/java/mc/core/h2db/H2PlayerManagerTest.java delete mode 100644 h2_playermanager/src/test/java/mc/core/h2db/H2PlayerTest.java delete mode 100644 h2_playermanager/src/test/java/mc/core/h2db/TestSpringConfig.java delete mode 100644 h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java delete mode 100644 proto_1.12.2/build.gradle delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/ByteArrayOutputNetStream.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/Direction.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/NetInputStream_p340.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/NetOutputStream_p340.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/TeleportManager.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/package-info.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/AnimationPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/BossBarPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChangeGameState.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChatMessageClientPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChatMessageServerPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ClientSettingsPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/DisconnectPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/EncryptionRequestPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/EntityActionPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/HandshakePacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/HeldItemChangePacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/JoinGamePacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/KeepAlivePacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/LoginStartPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/LoginSuccessPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PingPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerListHeaderAndFooterPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerListItemPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerLookPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionAndLookPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PluginMessagePacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/SpawnPositionPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/StatusRequestPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/StatusResponsePacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TeleportConfirmPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TimeUpdatePacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TitlePacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/UnloadChunkPacket.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/BlockLocationSerializer.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/Mapper.java delete mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/TextMapper.java delete mode 100644 proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/ByteArrayInputNetStream.java delete mode 100644 proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/ByteArrayInputNetStreamTest.java delete 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/ChunkDataPacketTest.java delete mode 100644 proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/DumbChunkData.java delete mode 100644 proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacketTest.java delete mode 100644 proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/serializers/BlockLocationSerializerTest.java delete mode 100644 proto_1.12.2/src/test/resources/mc/core/network/proto_1_12_2/packets/ChunkDataPacket00.bin delete mode 100644 proto_1.12.2/src/test/resources/mc/core/network/proto_1_12_2/packets/ChunkDataPacket01.bin delete mode 100644 proto_1.12.2_netty/build.gradle delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/KeepAliveThread.java delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketDecoder.java delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketEncoder.java delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketHandler.java delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketPostEncoder.java delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/AbstractStateHandler.java delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/HandshakeHandler.java delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/HandshakeStateHandler.java delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginStateHandler.java delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayStateHandler.java delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/StateHandler.java delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/StatusHandler.java delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/StatusStateHandler.java delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetChannel.java delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetInputStream.java delete mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetOutputStream.java delete mode 100644 simple_world/README.MD delete mode 100644 simple_world/build.gradle delete mode 100644 simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java delete mode 100644 simple_world/src/main/java/mc/world/simple/SimpleChunk.java delete mode 100644 simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java delete mode 100644 simple_world/src/main/java/mc/world/simple/SimpleWorld.java delete mode 100644 simple_world/src/test/java/mc/world/simple/SimpleChunkSectionTest.java delete mode 100644 simple_world/src/test/java/mc/world/simple/SimpleWorldTest.java delete mode 100644 simple_world/src/test/java/mc/world/simple/TestSpringConfig.java delete mode 100644 vanilla_commands/build.gradle delete mode 100644 vanilla_commands/src/main/java/mc/commands/HelpCommand.java delete mode 100644 vanilla_commands/src/main/java/mc/commands/ListCommand.java diff --git a/anvil-loader/build.gradle b/anvil-loader/build.gradle deleted file mode 100644 index 2328060..0000000 --- a/anvil-loader/build.gradle +++ /dev/null @@ -1,9 +0,0 @@ -group 'mc' -version '1.0-SNAPSHOT' - -dependencies { - /* Core */ - compile_excludeCopy project(':core') - - compile (group: 'net.sf.trove4j', name: 'trove4j', version: '3.0.3') -} \ No newline at end of file diff --git a/anvil-loader/src/main/java/com/flowpowered/nbt/LongArrayTag.java b/anvil-loader/src/main/java/com/flowpowered/nbt/LongArrayTag.java deleted file mode 100644 index 47b09ee..0000000 --- a/anvil-loader/src/main/java/com/flowpowered/nbt/LongArrayTag.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.flowpowered.nbt; - -import java.util.Arrays; - -public class LongArrayTag extends Tag { - /** - * The value. - */ - private final long[] value; - - /** - * Creates the tag. - * - * @param name The name. - * @param value The value. - */ - public LongArrayTag(String name, long[] value) { - super(TagType.TAG_LONG_ARRAY, name); - this.value = value; - } - - @Override - public long[] getValue() { - return value; - } - - @Override - public String toString() { - StringBuilder hex = new StringBuilder(); - for (long s : value) { - String hexDigits = Long.toHexString(s).toUpperCase(); - if (hexDigits.length() == 1) { - hex.append("0"); - } - hex.append(hexDigits).append(" "); - } - - String name = getName(); - String append = ""; - if (name != null && !name.equals("")) { - append = "(\"" + this.getName() + "\")"; - } - return "TAG_Long_Array" + append + ": " + hex.toString(); - } - - @Override - public LongArrayTag clone() { - long[] clonedArray = cloneArray(value); - - return new LongArrayTag(getName(), clonedArray); - } - - @Override - public boolean equals(Object other) { - if (!(other instanceof IntArrayTag)) { - return false; - } - - LongArrayTag tag = (LongArrayTag) other; - return Arrays.equals(value, tag.value) && getName().equals(tag.getName()); - } - - private long[] cloneArray(long[] longArray) { - if (longArray == null) { - return null; - } else { - int length = longArray.length; - byte[] newArray = new byte[length]; - System.arraycopy(longArray, 0, newArray, 0, length); - return longArray; - } - } -} diff --git a/anvil-loader/src/main/java/com/flowpowered/nbt/NBTConstants.java b/anvil-loader/src/main/java/com/flowpowered/nbt/NBTConstants.java deleted file mode 100644 index f6dd1b4..0000000 --- a/anvil-loader/src/main/java/com/flowpowered/nbt/NBTConstants.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.flowpowered.nbt; - -import java.nio.charset.Charset; - -/** - * A class which holds constant values. - */ -public final class NBTConstants { - /** - * The character set used by NBT (UTF-8). - */ - public static final Charset CHARSET = Charset.forName("UTF-8"); - /** - * Tag type constants. - */ - @Deprecated - public static final int TYPE_END = TagType.TAG_END.getId(), - TYPE_BYTE = TagType.TAG_BYTE.getId(), - TYPE_SHORT = TagType.TAG_SHORT.getId(), - TYPE_INT = TagType.TAG_INT.getId(), - TYPE_LONG = TagType.TAG_LONG.getId(), - TYPE_FLOAT = TagType.TAG_FLOAT.getId(), - TYPE_DOUBLE = TagType.TAG_DOUBLE.getId(), - TYPE_BYTE_ARRAY = TagType.TAG_BYTE_ARRAY.getId(), - TYPE_STRING = TagType.TAG_STRING.getId(), - TYPE_LIST = TagType.TAG_LIST.getId(), - TYPE_COMPOUND = TagType.TAG_COMPOUND.getId(), - TYPE_INT_ARRAY = TagType.TAG_INT_ARRAY.getId(), - TYPE_SHORT_ARRAY = TagType.TAG_SHORT_ARRAY.getId(), - TYPE_LONG_ARRAY = TagType.TAG_LONG_ARRAY.getId(); - - /** - * Default private constructor. - */ - private NBTConstants() { - } -} - diff --git a/anvil-loader/src/main/java/com/flowpowered/nbt/TagType.java b/anvil-loader/src/main/java/com/flowpowered/nbt/TagType.java deleted file mode 100644 index 444e3e2..0000000 --- a/anvil-loader/src/main/java/com/flowpowered/nbt/TagType.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.flowpowered.nbt; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public enum TagType { - TAG_END(EndTag.class, "TAG_End", 0), - TAG_BYTE(ByteTag.class, "TAG_Byte", 1), - TAG_SHORT(ShortTag.class, "TAG_Short", 2), - TAG_INT(IntTag.class, "TAG_Int", 3), - TAG_LONG(LongTag.class, "TAG_Long", 4), - TAG_FLOAT(FloatTag.class, "TAG_Float", 5), - TAG_DOUBLE(DoubleTag.class, "TAG_Double", 6), - TAG_BYTE_ARRAY(ByteArrayTag.class, "TAG_Byte_Array", 7), - TAG_STRING(StringTag.class, "TAG_String", 8), - @SuppressWarnings("unchecked") - TAG_LIST((Class) ListTag.class, "TAG_List", 9), - // Java generics, y u so suck - TAG_COMPOUND(CompoundTag.class, "TAG_Compound", 10), - TAG_INT_ARRAY(IntArrayTag.class, "TAG_Int_Array", 11), - TAG_LONG_ARRAY(LongArrayTag.class, "TAG_Long_Array", 12), - TAG_SHORT_ARRAY(ShortArrayTag.class, "TAG_Short_Array", 100),; - private static final Map>, TagType> BY_CLASS = new HashMap>, TagType>(); - private static final Map BY_NAME = new HashMap(); - private static final TagType[] BY_ID; - - static { - BY_ID = new TagType[BaseData.maxId + 1]; - for (TagType type : TagType.values()) { - BY_CLASS.put(type.getTagClass(), type); - BY_NAME.put(type.getTypeName(), type); - BY_ID[type.getId()] = type; - } - } - - private final Class> tagClass; - private final String typeName; - private final int id; - - private TagType(Class> tagClass, String typeName, int id) { - this.tagClass = tagClass; - this.typeName = typeName; - this.id = id; - // Such a hack, shame that Java makes this such a pain - if (this.id > BaseData.maxId) { - BaseData.maxId = this.id; - } - } - - public Class> getTagClass() { - return tagClass; - } - - public String getTypeName() { - return typeName; - } - - public int getId() { - return id; - } - - public static TagType getByTagClass(Class> clazz) { - TagType ret = BY_CLASS.get(clazz); - if (ret == null) { - throw new IllegalArgumentException("Tag type " + clazz + " is unknown!"); - } - return ret; - } - - public static TagType getByTypeName(String typeName) { - TagType ret = BY_NAME.get(typeName); - if (ret == null) { - throw new IllegalArgumentException("Tag type " + typeName + " is unknown!"); - } - return ret; - } - - public static TagType getById(int id) { - if (id >= 0 && id < BY_ID.length) { - TagType ret = BY_ID[id]; - if (ret == null) { - throw new IllegalArgumentException("Tag type id " + id + " is unknown!"); - } - return ret; - } else { - throw new IndexOutOfBoundsException("Tag type id " + id + " is out of bounds!"); - } - } - - private static class BaseData { - private static int maxId = 0; - } -} diff --git a/anvil-loader/src/main/java/com/flowpowered/nbt/stream/NBTInputStream.java b/anvil-loader/src/main/java/com/flowpowered/nbt/stream/NBTInputStream.java deleted file mode 100644 index 8298779..0000000 --- a/anvil-loader/src/main/java/com/flowpowered/nbt/stream/NBTInputStream.java +++ /dev/null @@ -1,210 +0,0 @@ -package com.flowpowered.nbt.stream; - -import java.io.Closeable; -import java.io.IOException; -import java.io.InputStream; -import java.nio.ByteOrder; -import java.util.ArrayList; -import java.util.List; -import java.util.zip.GZIPInputStream; - -import com.flowpowered.nbt.*; - -/** - * This class reads NBT, or Named Binary Tag streams, and produces an object graph of subclasses of the {@link Tag} object.

The NBT format was created by Markus Persson, and the specification - * may be found at https://flowpowered.com/nbt/spec.txt. - */ -public final class NBTInputStream implements Closeable { - /** - * The data input stream. - */ - private final EndianSwitchableInputStream is; - - /** - * Creates a new {@link NBTInputStream}, which will source its data from the specified input stream. This assumes the stream is compressed. - * - * @param is The input stream. - * @throws java.io.IOException if an I/O error occurs. - */ - public NBTInputStream(InputStream is) throws IOException { - this(is, true, ByteOrder.BIG_ENDIAN); - } - - /** - * Creates a new {@link NBTInputStream}, which sources its data from the specified input stream. A flag must be passed which indicates if the stream is compressed with GZIP or not. This assumes the - * stream uses big endian encoding. - * - * @param is The input stream. - * @param compressed A flag indicating if the stream is compressed. - * @throws java.io.IOException if an I/O error occurs. - */ - public NBTInputStream(InputStream is, boolean compressed) throws IOException { - this(is, compressed, ByteOrder.BIG_ENDIAN); - } - - /** - * Creates a new {@link NBTInputStream}, which sources its data from the specified input stream. A flag must be passed which indicates if the stream is compressed with GZIP or not. - * - * @param is The input stream. - * @param compressed A flag indicating if the stream is compressed. - * @param endianness Whether to read numbers from the InputStream with little endian encoding. - * @throws java.io.IOException if an I/O error occurs. - */ - public NBTInputStream(InputStream is, boolean compressed, ByteOrder endianness) throws IOException { - this.is = new EndianSwitchableInputStream(compressed ? new GZIPInputStream(is) : is, endianness); - } - - /** - * Reads an NBT {@link Tag} from the stream. - * - * @return The tag that was read. - * @throws java.io.IOException if an I/O error occurs. - */ - public Tag readTag() throws IOException { - return readTag(0); - } - - /** - * Reads an NBT {@link Tag} from the stream. - * - * @param depth The depth of this tag. - * @return The tag that was read. - * @throws java.io.IOException if an I/O error occurs. - */ - private Tag readTag(int depth) throws IOException { - int typeId = is.readByte() & 0xFF; - TagType type = TagType.getById(typeId); - - String name; - if (type != TagType.TAG_END) { - int nameLength = is.readShort() & 0xFFFF; - byte[] nameBytes = new byte[nameLength]; - is.readFully(nameBytes); - name = new String(nameBytes, NBTConstants.CHARSET.name()); - } else { - name = ""; - } - - return readTagPayload(type, name, depth); - } - - /** - * Reads the payload of a {@link Tag}, given the name and type. - * - * @param type The type. - * @param name The name. - * @param depth The depth. - * @return The tag. - * @throws java.io.IOException if an I/O error occurs. - */ - @SuppressWarnings ({"unchecked", "rawtypes"}) - private Tag readTagPayload(TagType type, String name, int depth) throws IOException { - switch (type) { - case TAG_END: - if (depth == 0) { - throw new IOException("TAG_End found without a TAG_Compound/TAG_List tag preceding it."); - } else { - return new EndTag(); - } - - case TAG_BYTE: - return new ByteTag(name, is.readByte()); - - case TAG_SHORT: - return new ShortTag(name, is.readShort()); - - case TAG_INT: - return new IntTag(name, is.readInt()); - - case TAG_LONG: - return new LongTag(name, is.readLong()); - - case TAG_FLOAT: - return new FloatTag(name, is.readFloat()); - - case TAG_DOUBLE: - return new DoubleTag(name, is.readDouble()); - - case TAG_BYTE_ARRAY: - int length = is.readInt(); - byte[] bytes = new byte[length]; - is.readFully(bytes); - return new ByteArrayTag(name, bytes); - - case TAG_STRING: - length = is.readShort(); - bytes = new byte[length]; - is.readFully(bytes); - return new StringTag(name, new String(bytes, NBTConstants.CHARSET.name())); - - case TAG_LIST: - TagType childType = TagType.getById(is.readByte()); - length = is.readInt(); - - Class clazz = childType.getTagClass(); - List tagList = new ArrayList(length); - for (int i = 0; i < length; i++) { - Tag tag = readTagPayload(childType, "", depth + 1); - if (tag instanceof EndTag) { - throw new IOException("TAG_End not permitted in a list."); - } else if (!clazz.isInstance(tag)) { - throw new IOException("Mixed tag types within a list."); - } - tagList.add(tag); - } - - return new ListTag(name, clazz, tagList); - - case TAG_COMPOUND: - CompoundMap compoundTagList = new CompoundMap(); - while (true) { - Tag tag = readTag(depth + 1); - if (tag instanceof EndTag) { - break; - } else { - compoundTagList.put(tag); - } - } - - return new CompoundTag(name, compoundTagList); - - case TAG_INT_ARRAY: - length = is.readInt(); - int[] ints = new int[length]; - for (int i = 0; i < length; i++) { - ints[i] = is.readInt(); - } - return new IntArrayTag(name, ints); - - case TAG_SHORT_ARRAY: - length = is.readInt(); - short[] shorts = new short[length]; - for (int i = 0; i < length; i++) { - shorts[i] = is.readShort(); - } - return new ShortArrayTag(name, shorts); - - case TAG_LONG_ARRAY: - length = is.readInt(); - long[] longs = new long[length]; - for (int i = 0; i < length; i++) { - longs[i] = is.readLong(); - } - return new LongArrayTag(name, longs); - - default: - throw new IOException("Invalid tag type: " + type + "."); - } - } - - public void close() throws IOException { - is.close(); - } - - /** - * @return whether this NBTInputStream reads numbers in little-endian format. - */ - public ByteOrder getByteOrder() { - return is.getEndianness(); - } -} diff --git a/anvil-loader/src/main/java/mc/world/anvil/AnvilBlock.java b/anvil-loader/src/main/java/mc/world/anvil/AnvilBlock.java deleted file mode 100644 index 990e6e9..0000000 --- a/anvil-loader/src/main/java/mc/world/anvil/AnvilBlock.java +++ /dev/null @@ -1,80 +0,0 @@ -package mc.world.anvil; - -import com.flowpowered.nbt.CompoundTag; -import lombok.extern.slf4j.Slf4j; -import mc.core.world.block.Block; -import mc.core.world.block.BlockLocation; -import mc.core.world.block.BlockType; - -@Slf4j -public class AnvilBlock implements Block { - private final AnvilChunkSection chunkSection; - private final BlockLocation location; - private BlockLocation globalLocation; - - public AnvilBlock(AnvilChunkSection chunkSection, int x, int y, int z) { - this.chunkSection = chunkSection; - this.location = new BlockLocation(x, y, z); - } - - @Override - public int getLight() { - return chunkSection.getBlockLight().get(location); - } - - @Override - public void setLight(int light) { - // nope... - } - - @Override - public BlockType getType() { - final byte id = chunkSection.getBlocks().get((location.getY() << 8) + (location.getZ() << 4) + location.getX()); - final int meta = chunkSection.getBlocksMeta().get(location); - BlockType type = BlockType.getByIdMeta(id & 0xFF, meta); - if (type.equals(BlockType.BEDROCK) && id != 7) { - log.warn("ChunkSection: {},{},{} | Block: {}", - chunkSection.getParent().getX(), - chunkSection.getY(), - chunkSection.getParent().getZ(), - location.toString()); - } - return type; - } - - @Override - public BlockLocation getLocation() { - if (globalLocation == null) { - globalLocation = new BlockLocation( - (chunkSection.getParent().getX() << 4) + location.getX(), - (chunkSection.getY() << 4) + location.getY(), - (chunkSection.getParent().getZ() << 4) + location.getZ() - ); - } - return globalLocation; - } - - @Override - public CompoundTag getNBTData() { - CompoundTag compoundTag = ((AnvilChunk)chunkSection.getParent()).getNbtByGlobalXYZ( - (chunkSection.getParent().getX() << 4) + location.getX(), - (chunkSection.getY() << 4) + location.getY(), - (chunkSection.getParent().getZ() << 4) + location.getZ() - ); - - if (compoundTag != null) { - compoundTag.getValue().remove("Items"); - compoundTag.getValue().remove("Lock"); - } - - return compoundTag; - } - - @Override - public String toString() { - return "AnvilBlock{" + - "location=" + getLocation() + - ", type=" + getType() + - '}'; - } -} diff --git a/anvil-loader/src/main/java/mc/world/anvil/AnvilChunk.java b/anvil-loader/src/main/java/mc/world/anvil/AnvilChunk.java deleted file mode 100644 index a0a985d..0000000 --- a/anvil-loader/src/main/java/mc/world/anvil/AnvilChunk.java +++ /dev/null @@ -1,137 +0,0 @@ -package mc.world.anvil; - -import com.flowpowered.nbt.ByteArrayTag; -import com.flowpowered.nbt.ByteTag; -import com.flowpowered.nbt.CompoundMap; -import com.flowpowered.nbt.CompoundTag; -import com.flowpowered.nbt.IntTag; -import com.flowpowered.nbt.ListTag; -import gnu.trove.list.TByteList; -import gnu.trove.list.array.TByteArrayList; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import mc.core.utils.NibbleArray; -import mc.core.world.Biome; -import mc.core.world.block.Block; -import mc.core.world.chunk.Chunk; -import mc.core.world.chunk.ChunkSection; - -import java.util.ArrayList; -import java.util.List; - -@Slf4j -@Getter -public class AnvilChunk implements Chunk { - private int x; - private int z; - private TByteList biomes = new TByteArrayList(256); - private List sections; - private ListTag tileEntities; - - @SuppressWarnings("unchecked") - AnvilChunk(CompoundTag chunkTag) { - CompoundMap levelTagMap = ((CompoundTag) chunkTag.getValue().get("Level")).getValue(); - - this.x = ((IntTag) levelTagMap.get("xPos")).getValue(); - this.z = ((IntTag) levelTagMap.get("zPos")).getValue(); - - biomes.add(((ByteArrayTag) levelTagMap.get("Biomes")).getValue()); - tileEntities = (ListTag) levelTagMap.get("TileEntities"); - - List sections = ((ListTag) levelTagMap.get("Sections")).getValue(); - this.sections = new ArrayList<>(sections.size()); - - for (CompoundTag sectionTag : sections) { - CompoundMap sectionTagValue = sectionTag.getValue(); - - AnvilChunkSection chunkSection = new AnvilChunkSection(); - chunkSection.setParent(this); - chunkSection.setY(((ByteTag) sectionTagValue.get("Y")).getValue()); - - chunkSection.setBlockLight(new NibbleArray(((ByteArrayTag) sectionTagValue.get("BlockLight")).getValue())); - chunkSection.setSkyLight(new NibbleArray(((ByteArrayTag) sectionTagValue.get("SkyLight")).getValue())); - chunkSection.getBlocks().add(((ByteArrayTag) sectionTagValue.get("Blocks")).getValue()); - chunkSection.setBlocksMeta(new NibbleArray(((ByteArrayTag) sectionTagValue.get("Data")).getValue())); - - this.sections.add(chunkSection); - } - } - - CompoundTag getNbtByGlobalXYZ(int x, int y, int z) { - for (CompoundTag compoundTag : tileEntities.getValue()) { - CompoundMap compoundMap = compoundTag.getValue(); - if (((IntTag)compoundMap.get("x")).getValue() == x - && ((IntTag)compoundMap.get("y")).getValue() == y - && ((IntTag)compoundMap.get("z")).getValue() == z) { - return compoundTag; - } - } - return null; - } - - @Override - public ChunkSection getChunkSection(int height) { - if (height > sections.size()-1) return null; - return sections.get(height); - } - - @Override - public void setChunkSection(int height, ChunkSection chunkSection) { - // nope... - } - - @Override - public Block getBlock(int x, int y, int z) { - final int height = y >> 4; - return sections.get(height).getBlock( - x - getX() << 4, - y - height << 4, - z - getZ() << 4 - ); - } - - @Override - public void setBlock(Block block) { - // nope... - } - - @Override - public int getSkyLight(int x, int y, int z) { - final int height = y >> 4; - return sections.get(height).getSkyLight( - x - getX() << 4, - y - height << 4, - z - getZ() << 4 - ); - } - - @Override - public void setSkyLight(int x, int y, int z, int lightLevel) { - // nope... - } - - @Override - public int getAddition(int x, int y, int z) { - final int height = y >> 4; - return sections.get(height).getAddition( - x - getX() << 4, - y - height << 4, - z - getZ() << 4 - ); - } - - @Override - public void setAddition(int x, int y, int z, int value) { - // nope... - } - - @Override - public Biome getBiome(int x, int z) { - return Biome.getById(biomes.get((z >> 4) << 4 | (x >> 4)) & 255); - } - - @Override - public void setBiome(int x, int z, Biome biome) { - // nope... - } -} diff --git a/anvil-loader/src/main/java/mc/world/anvil/AnvilChunkProvider.java b/anvil-loader/src/main/java/mc/world/anvil/AnvilChunkProvider.java deleted file mode 100644 index d3fafc3..0000000 --- a/anvil-loader/src/main/java/mc/world/anvil/AnvilChunkProvider.java +++ /dev/null @@ -1,50 +0,0 @@ -package mc.world.anvil; - -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import mc.core.world.chunk.Chunk; -import mc.core.world.chunk.ChunkProvider; -import org.springframework.stereotype.Component; - -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; - -@Slf4j -@Component -@NoArgsConstructor -@Setter -public class AnvilChunkProvider implements ChunkProvider { - private RegionManager regionManager; - - public AnvilChunkProvider(String mapPath) { - Path pathMap = Paths.get(mapPath); - if (Files.exists(pathMap)) { - log.info("Use Anvil map from \"{}\"", pathMap); - this.setRegionManager(new RegionManager(pathMap.resolve("region"))); - } else { - log.error("Anvil map: path \"{}\" not found!!!", pathMap); - } - } - - @Override - public Chunk getChunk(int x, int z) { - Region region = regionManager.getRegion(x >> 5, z >> 5); - if (region == null) { - return new EmptyChunk(x, z); - } else { - return region.getChunk(x, z); - } - } - - @Override - public void saveChunk(Chunk chunk) { - // nope - } - - @Override - public void saveChunk(Chunk... chunks) { - // nope - } -} diff --git a/anvil-loader/src/main/java/mc/world/anvil/AnvilChunkSection.java b/anvil-loader/src/main/java/mc/world/anvil/AnvilChunkSection.java deleted file mode 100644 index 1892e57..0000000 --- a/anvil-loader/src/main/java/mc/world/anvil/AnvilChunkSection.java +++ /dev/null @@ -1,57 +0,0 @@ -package mc.world.anvil; - -import gnu.trove.list.TByteList; -import gnu.trove.list.linked.TByteLinkedList; -import lombok.Getter; -import lombok.Setter; -import mc.core.utils.NibbleArray; -import mc.core.world.block.Block; -import mc.core.world.chunk.Chunk; -import mc.core.world.chunk.ChunkSection; - -@Getter -public class AnvilChunkSection implements ChunkSection { - @Setter - private Chunk parent; - - @Setter - private int y; - - private TByteList blocks = new TByteLinkedList(); - @Setter - private NibbleArray blocksMeta; - @Setter - private NibbleArray blockLight; - @Setter - private NibbleArray skyLight; - - @Override - public Block getBlock(int x, int y, int z) { - return new AnvilBlock(this, x, y, z); - } - - @Override - public void setBlock(Block block) { - // nope... - } - - @Override - public int getSkyLight(int x, int y, int z) { - return skyLight.get(x, y, z); - } - - @Override - public void setSkyLight(int x, int y, int z, int lightLevel) { - // nope... - } - - @Override - public int getAddition(int x, int y, int z) { - return 0; - } - - @Override - public void setAddition(int x, int y, int z, int value) { - // nope... - } -} diff --git a/anvil-loader/src/main/java/mc/world/anvil/EmptyChunk.java b/anvil-loader/src/main/java/mc/world/anvil/EmptyChunk.java deleted file mode 100644 index 0ff6a8f..0000000 --- a/anvil-loader/src/main/java/mc/world/anvil/EmptyChunk.java +++ /dev/null @@ -1,153 +0,0 @@ -package mc.world.anvil; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import mc.core.world.Biome; -import mc.core.world.block.Block; -import mc.core.world.block.BlockLocation; -import mc.core.world.block.BlockType; -import mc.core.world.chunk.Chunk; -import mc.core.world.chunk.ChunkSection; - -import java.util.LinkedList; -import java.util.List; - -@Getter -public class EmptyChunk implements Chunk { - private int x; - private int z; - private List $sections = new LinkedList<>(); - - public EmptyChunk(int x, int z) { - this.x = x; - this.z = z; - - for (int i = 0; i < 16; i++) { - this.$sections.add(null); - } - } - - @Override - public ChunkSection getChunkSection(int height) { - ChunkSection section; - if ((section = $sections.get(height)) == null) { - section = new EmptySection(height); - $sections.set(height, section); - } - - return section; - } - - @Override - public void setChunkSection(int height, ChunkSection chunkSection) { - } - - @Override - public Block getBlock(int x, int y, int z) { - return getChunkSection(y >> 4).getBlock( - x - getX() << 4, - y - (y >> 4) << 4, - z - getZ() << 4 - ); - } - - @Override - public void setBlock(Block block) { - } - - @Override - public int getSkyLight(int x, int y, int z) { - return getChunkSection(y >> 4).getSkyLight(x, y, z); - } - - @Override - public void setSkyLight(int x, int y, int z, int lightLevel) { - } - - @Override - public int getAddition(int x, int y, int z) { - return getChunkSection(y >> 4).getAddition(x, y, z); - } - - @Override - public void setAddition(int x, int y, int z, int value) { - } - - @Override - public Biome getBiome(int x, int z) { - return Biome.PLAINS; - } - - @Override - public void setBiome(int x, int z, Biome biome) { - } - - @NoArgsConstructor - @Getter - public class EmptySection implements ChunkSection { - private int y; - - EmptySection(int y) { - this.y = y; - } - - @Override - public Chunk getParent() { - return EmptyChunk.this; - } - - @Override - public void setParent(Chunk chunk) { - } - - @Override - public Block getBlock(int localX, int localY, int localZ) { - return new Block() { - @Override - public int getLight() { - return 15; - } - - @Override - public void setLight(int light) { - } - - @Override - public BlockType getType() { - return BlockType.AIR; - } - - @Override - public BlockLocation getLocation() { - return new BlockLocation( - (getParent().getX() << 4) + localX, - (getY() << 4) + localY, - (getParent().getZ() << 4) + localZ - ); - } - }; - } - - @Override - public void setBlock(Block block) { - } - - @Override - public int getSkyLight(int localX, int localY, int localZ) { - return 15; - } - - @Override - public void setSkyLight(int localX, int localY, int localZ, int lightLevel) { - } - - @Override - public int getAddition(int localX, int localY, int localZ) { - return 0; - } - - @Override - public void setAddition(int localX, int localY, int localZ, int value) { - } - } -} diff --git a/anvil-loader/src/main/java/mc/world/anvil/LevelInfo.java b/anvil-loader/src/main/java/mc/world/anvil/LevelInfo.java deleted file mode 100644 index a2da8ba..0000000 --- a/anvil-loader/src/main/java/mc/world/anvil/LevelInfo.java +++ /dev/null @@ -1,26 +0,0 @@ -package mc.world.anvil; - -import com.flowpowered.nbt.*; -import lombok.Getter; -import lombok.ToString; -import mc.core.world.block.BlockLocation; - -@Getter -@ToString -class LevelInfo { - private long seed; - private BlockLocation spawn; - private int version; - - LevelInfo(CompoundTag levelDatTag) { - CompoundMap dataMapTag = ((CompoundTag) levelDatTag.getValue().get("Data")).getValue(); - - seed = ((LongTag) dataMapTag.get("RandomSeed")).getValue(); - spawn = new BlockLocation( - ((IntTag) dataMapTag.get("SpawnX")).getValue(), - ((IntTag) dataMapTag.get("SpawnY")).getValue(), - ((IntTag) dataMapTag.get("SpawnZ")).getValue() - ); - version = ((IntTag) dataMapTag.get("version")).getValue(); - } -} diff --git a/anvil-loader/src/main/java/mc/world/anvil/Region.java b/anvil-loader/src/main/java/mc/world/anvil/Region.java deleted file mode 100644 index b171aee..0000000 --- a/anvil-loader/src/main/java/mc/world/anvil/Region.java +++ /dev/null @@ -1,108 +0,0 @@ -package mc.world.anvil; - -import com.flowpowered.nbt.CompoundTag; -import com.flowpowered.nbt.Tag; -import com.flowpowered.nbt.stream.NBTInputStream; -import gnu.trove.list.TByteList; -import gnu.trove.list.array.TByteArrayList; -import lombok.extern.slf4j.Slf4j; -import mc.core.world.chunk.Chunk; - -import javax.annotation.Nullable; -import java.io.*; -import java.util.zip.InflaterInputStream; - -@Slf4j -class Region implements Closeable { - private static final byte BYTE_TRUE = 1, - BYTE_FALSE = 0; - - private RandomAccessFile file; - private TByteList sectorFree; - private final int[] offsets = new int[1024]; - - Region(File file) throws IOException { - this.file = new RandomAccessFile(file, "rw"); - - int sizeOfSectorFree = (int)this.file.length() / 4096; - sectorFree = new TByteArrayList(sizeOfSectorFree); - - sectorFree.add(BYTE_FALSE); - sectorFree.add(BYTE_FALSE); - for (int i = 0; i < sizeOfSectorFree-2; i++) { - sectorFree.add(BYTE_TRUE); - } - - for (int i = 0; i < offsets.length; ++i) { - int read = this.file.readInt(); - offsets[i] = read; - - if (read != 0 && (read >> 8) + (read & 255) <= this.sectorFree.size()) { - for (int j = 0; j < (read & 255); ++j) { - this.sectorFree.set((read >> 8) + j, BYTE_FALSE); - } - } - } - - this.file.skipBytes(1024); - } - - @Nullable - Chunk getChunk(int x, int z) { - int offset; - try { - offset = getOffset(x & 31, z & 31); - } catch (Exception e) { - return new EmptyChunk(x, z); - } - - if (offset == 0) { - return new EmptyChunk(x, z); - } - - int v1 = offset >> 8; - int v2 = offset & 255; - - if (v1 + v2 > sectorFree.size()) { - return new EmptyChunk(x, z); - } - - try { - file.seek((long) (v1 * 4096)); - int read = file.readInt(); - if (read <= 0 || read > 4096 * v2) { - return new EmptyChunk(x, z); - } - - boolean gzippedData = (file.readByte() == 0x01); - - if (gzippedData) { - log.warn("GZipped"); - } else { - byte[] buffer = new byte[read - 1]; - file.read(buffer); - InflaterInputStream inputStream = new InflaterInputStream(new ByteArrayInputStream(buffer)); - - NBTInputStream nbtInputStream = new NBTInputStream(inputStream, false); - - Tag rootTag = nbtInputStream.readTag(); - nbtInputStream.close(); - return new AnvilChunk((CompoundTag) rootTag); - } - } catch (IOException e) { - log.error("Get chunk", e); - return null; - } - - return null; - } - - private int getOffset(int x, int z) { - return offsets[x + z * 32]; - } - - @Override - public void close() throws IOException { - if (file != null) file.close(); - } -} diff --git a/anvil-loader/src/main/java/mc/world/anvil/RegionManager.java b/anvil-loader/src/main/java/mc/world/anvil/RegionManager.java deleted file mode 100644 index b0cdb50..0000000 --- a/anvil-loader/src/main/java/mc/world/anvil/RegionManager.java +++ /dev/null @@ -1,49 +0,0 @@ -package mc.world.anvil; - -import gnu.trove.map.TIntObjectMap; -import gnu.trove.map.hash.TIntObjectHashMap; -import lombok.extern.slf4j.Slf4j; -import mc.core.utils.CompactedCoords; -import org.springframework.lang.Nullable; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; - -@Slf4j -public class RegionManager { - private final Path regionFilesPath; - private final TIntObjectMap regions = new TIntObjectHashMap<>(); - - public RegionManager(String regionFilesPath) { - this(Paths.get(regionFilesPath)); - } - - public RegionManager(Path regionFilesPath) { - this.regionFilesPath = regionFilesPath; - } - - @Nullable - public Region getRegion(int x, int z) { - final int xz = CompactedCoords.compressXZ(x, z); - - if (regions.containsKey(xz)) { - return regions.get(xz); - } else { - Path regionFilePath = regionFilesPath.resolve("r." + x + "." + z + ".mca"); - if (Files.exists(regionFilePath)) { - try { - Region region = new Region(regionFilePath.toFile()); - regions.put(xz, region); - return region; - } catch (IOException e) { - log.error("load region from file", e); - return null; - } - } else { - return null; - } - } - } -} diff --git a/anvil-loader/src/test/java/mc/world/anvil/RegionTest.java b/anvil-loader/src/test/java/mc/world/anvil/RegionTest.java deleted file mode 100644 index 81e6caf..0000000 --- a/anvil-loader/src/test/java/mc/world/anvil/RegionTest.java +++ /dev/null @@ -1,213 +0,0 @@ -package mc.world.anvil; - -import com.flowpowered.nbt.CompoundMap; -import com.flowpowered.nbt.CompoundTag; -import com.flowpowered.nbt.IntTag; -import com.flowpowered.nbt.StringTag; -import lombok.SneakyThrows; -import mc.core.world.block.Block; -import mc.core.world.block.BlockType; -import mc.core.world.chunk.Chunk; -import mc.core.world.chunk.ChunkSection; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Stream; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -class RegionTest { - private static RegionManager regionManager; - - @BeforeAll - @SneakyThrows - static void before() { - regionManager = new RegionManager(Paths.get(RegionTest.class.getResource("/region/").toURI())); - } - - private static void assertZeroPlast(int x, int z, Block block, String msg) { - // @formatter:off - if (x == 0 && z == 0) assertEquals(BlockType.STONE, block.getType(), msg); - else if (x == 15 && z == 0) assertEquals(BlockType.GRANITE, block.getType(), msg); - else if (x == 0 && z == 15) assertEquals(BlockType.POLISHED_GRANITE, block.getType(), msg); - else if (x == 15 && z == 15) assertEquals(BlockType.DIORITE, block.getType(), msg); - else assertEquals(BlockType.BEDROCK, block.getType(), msg); - // @formatter:on - } - - private static ChunkChecker chunkChecker00() { - return new ChunkChecker() { - private void checkSection0(ChunkSection chunkSection) { - for (int y = 0; y < 16; y++) { - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - Block block = chunkSection.getBlock(x, y, z); - String msg = String.format("coords: %d %d %d", x, y, z); - - if (y == 0) { - assertZeroPlast(x, z, block, msg); - } else { - assertEquals(BlockType.STONE, block.getType(), msg); - } - } - } - } - } - - private CompoundTag createExceptedNBT(Block block) { - CompoundMap compoundMap = new CompoundMap(); - compoundMap.put(new IntTag("x", block.getLocation().getX())); - compoundMap.put(new IntTag("y", block.getLocation().getY())); - compoundMap.put(new IntTag("z", block.getLocation().getZ())); - compoundMap.put(new StringTag("id", block.getType().getNamedId())); - - return new CompoundTag("", compoundMap); - } - - private void checkSection1(ChunkSection chunkSection) { - for (int y = 0; y < 16; y++) { - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - Block block = chunkSection.getBlock(x, y, z); - String msg = String.format("coords: %d %d %d", x, y, z); - - // @formatter:off - if (y == 0) assertEquals(BlockType.DIRT, block.getType(), msg); - else if (y == 1) assertEquals(BlockType.GRASS, block.getType(), msg); - else if (y == 2) { - if ((x == 2 || x == 4 || x == 5) && z == 1) { - assertEquals(BlockType.CHEST_NORTH, block.getType(), msg); - assertEquals(createExceptedNBT(block), block.getNBTData()); - } else if ((x == 2 || x == 3 || x == 5) && z == 6) { - assertEquals(BlockType.CHEST_SOUTH, block.getType(), msg); - assertEquals(createExceptedNBT(block), block.getNBTData()); - } else if (x == 1 && (z == 2 || z == 3 || z == 5)) { - assertEquals(BlockType.CHEST_WEST, block.getType(), msg); - assertEquals(createExceptedNBT(block), block.getNBTData()); - } else if (x == 6 && (z == 2 || z == 4 || z == 5)) { - assertEquals(BlockType.CHEST_EAST, block.getType(), msg); - assertEquals(createExceptedNBT(block), block.getNBTData()); - } else { - assertEquals(BlockType.AIR, block.getType(), msg); - } - } - else assertEquals(BlockType.AIR, block.getType(), msg); - // @formatter:on - } - } - } - } - - @Override - public void check(Chunk chunk) { - ChunkSection chunkSection = chunk.getChunkSection(0); - assertNotNull(chunkSection); - checkSection0(chunkSection); - - chunkSection = chunk.getChunkSection(1); - assertNotNull(chunkSection); - checkSection1(chunkSection); - } - }; - } - - private static ChunkChecker chunkChecker01() { - return new ChunkChecker() { - @Override - public void check(Chunk chunk) { - ChunkSection section = chunk.getChunkSection(0); - assertNotNull(section); - - final List exceptedTypes = Arrays.asList( - BlockType.CLAY, - BlockType.ORE_REDSTONE, - BlockType.ORE_DIAMOND, - BlockType.OBSIDIAN, - BlockType.STONE_MOSS, - BlockType.SANDSTONE, - BlockType.ORE_LAPIS, - BlockType.WOOD_JUNGLE, - BlockType.WOOD_BIRCH, - BlockType.WOOD_SPRUCE, - BlockType.WOOD_OAK, - BlockType.ORE_COAL, - BlockType.ORE_IRON, - BlockType.ORE_GOLD, - BlockType.GRAVEL, - BlockType.SAND - ); - - for (int y = 0; y < 2; y++) { - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - Block block = section.getBlock(x, y, z); - String msg = String.format("coords: %d %d %d", x, y, z); - - if (y == 0) { - assertZeroPlast(x, z, block, msg); - } else { - assertEquals(exceptedTypes.get(x), block.getType(), msg); - } - } - } - } - } - }; - } - - private static ChunkChecker chunkChecker0N1() { - return new ChunkChecker() { - @Override - public void check(Chunk chunk) { - ChunkSection section = chunk.getChunkSection(0); - assertNotNull(section); - - for (int y = 0; y < 1; y++) { - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - assertZeroPlast(x, z, - section.getBlock(x, y, z), - String.format("coords: %d %d %d", x, y, z)); - } - } - } - } - }; - } - - private static Stream streamArguments() { - - - return Stream.of( - Arguments.of(0, 0, chunkChecker00()), - Arguments.of(0, 1, chunkChecker01()), - Arguments.of(0, -1, chunkChecker0N1()) - ); - } - - @DisplayName("testGetChunk") - @ParameterizedTest(name = "[{index}] chunk {0},{1}") - @MethodSource("streamArguments") - void testGetChunk(int chunkX, int chunkZ, ChunkChecker chunkChecker) { - final Region region = regionManager.getRegion(chunkX >> 5, chunkZ >> 5); - assertNotNull(region); - - final Chunk chunk = region.getChunk(chunkX, chunkZ); - assertNotNull(chunk); - assertFalse(chunk instanceof EmptyChunk); - - chunkChecker.check(chunk); - } - - interface ChunkChecker { - void check(Chunk chunk); - } -} diff --git a/anvil-loader/src/test/resources/region/r.0.-1.mca b/anvil-loader/src/test/resources/region/r.0.-1.mca deleted file mode 100644 index 25001f94d63eee35a30e5840af1d57516908054c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmZQz7zLvtFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0<;eSCPv!ZF>1qT z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQL6EK#afn<$<)Hfq_wzsUq&} zt@~bw4Mf;J=&!qFT6NL=qohlsxG38-ZvDezF%h|^q+Dw&ZPSAbY8#YZmoLcucTmyZ ziNi!}gT?wkv-9-=b!sZ^EvdfF$R_mbku&qUM$UDN&6~dMp3D8#sBC?&cU^AUiF?yG zUf=83H9zRjq!S6+*Owp9({0}3zxcqPb-s$M_uqe?#1vkd@n^x>3)`&LY-@M4)XQ_K z`8es|0UsNe4+qx=b>!x=UeNFpZspQgS|-x`s_?nymA21+BUAqbG%$%QU|`j7VB~@_ z{h}1y%U(}nezyOz&hdHgZz?|gdZTh?KTMfI``!QIE51B`JD-^`7p85-1P48F_HFY2 zpIIyjcaeaZ*rTmrt~vk9m(RSP9JUW^JdN5u8UmvsFd71*Aut*OqaiRF0;3@?8Umvs PFd71*Aut*O@LP*jw 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 HY%B0THzyr3 diff --git a/core/build.gradle b/core/build.gradle index 1b923c1..c2585f1 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -1,4 +1,4 @@ -version '1.0-SNAPSHOT' +version '0.1' apply plugin: 'maven' apply plugin: 'application' diff --git a/core/src/main/java/mc/core/embedded/FakeServer.java b/core/src/main/java/mc/core/embedded/FakeServer.java index 99e296f..6c93937 100644 --- a/core/src/main/java/mc/core/embedded/FakeServer.java +++ b/core/src/main/java/mc/core/embedded/FakeServer.java @@ -1,15 +1,15 @@ -/* - * DmitriyMX - * 2018-06-29 - */ package mc.core.embedded; +import lombok.extern.slf4j.Slf4j; import mc.core.network.Server; import mc.core.network.StartServerException; +@Slf4j public class FakeServer implements Server { + @Override - public void start() throws StartServerException { + public void start() { + log.info("Hello. I'm FakeServer. And i do nothing."); } @Override diff --git a/h2_playermanager/build.gradle b/h2_playermanager/build.gradle deleted file mode 100644 index acdbf0c..0000000 --- a/h2_playermanager/build.gradle +++ /dev/null @@ -1,17 +0,0 @@ -version '1.0-SNAPSHOT' - -ext { - spring_data_version = '2.1.0.RELEASE' -} - -dependencies { - /* Core */ - compile_excludeCopy project(':core') - - /* Spring */ - compile (group: 'org.springframework.data', name: 'spring-data-jpa', version: spring_data_version) - - /* Database */ - compile (group: 'org.hibernate', name: 'hibernate-entitymanager', version: '5.3.6.Final') - compile (group: 'com.h2database', name: 'h2', version: '1.4.197') -} \ No newline at end of file diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2Player.java b/h2_playermanager/src/main/java/mc/core/h2db/H2Player.java deleted file mode 100644 index 8880503..0000000 --- a/h2_playermanager/src/main/java/mc/core/h2db/H2Player.java +++ /dev/null @@ -1,63 +0,0 @@ -package mc.core.h2db; - -import lombok.Data; -import mc.core.EntityLocation; -import mc.core.exception.ResourceUnloadedException; -import mc.core.network.NetChannel; -import mc.core.player.Player; -import mc.core.player.PlayerSettings; -import mc.core.world.World; - -import java.lang.ref.Reference; -import java.lang.ref.WeakReference; -import java.util.List; -import java.util.Objects; -import java.util.UUID; - -@Data -public class H2Player implements Player { - private int id; - private UUID uuid; - private String name; - private boolean online = false; - private List loadedChunks; - private NetChannel channel; - private EntityLocation location; - private Reference $refWorld; - private boolean flying = false; - private PlayerSettings settings; - - @Override - public World getWorld() { - if ($refWorld == null) { - return null; - } else if ($refWorld.get() == null) { - throw new ResourceUnloadedException("You're trying to get unloaded world"); - } else { - return $refWorld.get(); - } - } - - @Override - public void setWorld(World world) { - if (world == null) { - this.$refWorld = null; - } else { - this.$refWorld = new WeakReference<>(world); - } - } - - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (obj == null || getClass() != obj.getClass()) return false; - H2Player player = (H2Player) obj; - return id == player.id && - Objects.equals(uuid, player.uuid); - } - - @Override - public int hashCode() { - return Objects.hash(id, uuid); - } -} diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java deleted file mode 100644 index 7db2b42..0000000 --- a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java +++ /dev/null @@ -1,98 +0,0 @@ -package mc.core.h2db; - -import com.google.common.collect.ImmutableList; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import mc.core.EntityLocation; -import mc.core.h2db.service.H2PlayerService; -import mc.core.network.BroadcastNetChannel; -import mc.core.network.NetChannel; -import mc.core.player.Player; -import mc.core.player.PlayerManager; -import mc.core.player.PlayerSettings; -import mc.core.world.World; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.UUID; - -@Slf4j -@Component -public class H2PlayerManager implements PlayerManager { - @Setter - @Autowired - private H2PlayerService h2PlayerService; - private List playerList = Collections.synchronizedList(new ArrayList<>()); - - @Override - public Player createPlayer(String name, EntityLocation location, World world) { - H2Player h2Player = new H2Player(); - h2Player.setName(name); - h2Player.setUuid(UUID.randomUUID()); - h2Player.setLocation(location.clone()); - h2Player.setLoadedChunks(new ArrayList<>()); - h2Player.setWorld(world); - h2Player.setSettings(new PlayerSettings()); - - return h2PlayerService.save(h2Player); - } - - @Override - public void joinServer(Player player) { - //TODO в дальнейшем следует именно этому методу передать функции инсерта в БД - H2Player h2Player = (H2Player) player; - playerList.add(h2Player); - h2Player.setOnline(true); - } - - @Override - public void leftServer(Player player) { - H2Player h2Player = (H2Player) player; - h2PlayerService.save(h2Player); - h2Player.setOnline(false); - h2Player.getLoadedChunks().clear(); - } - - @Override - public Player getPlayer(String name) { - return playerList.stream() - .filter(player -> player.getName().equals(name)) - .filter(H2Player::isOnline) - .findFirst().orElse(null); - } - - @Override - public List getPlayers() { - return playerList.stream() - .filter(H2Player::isOnline) - .collect(ImmutableList.toImmutableList()); - } - - @Override - public int getCountPlayers() { - return (int) playerList.stream() - .filter(H2Player::isOnline) - .count(); - } - - @Override - public NetChannel getBroadcastChannel() { - return new BroadcastNetChannel( - playerList.stream() - .filter(H2Player::isOnline) - .map(player -> (Player)player) - ); - } - - @Override - public Player getOfflinePlayer(String name) { - return playerList.stream() - .filter(player -> player.getName().equals(name)) - .filter(player -> !player.isOnline()) - .findFirst().orElseGet(() -> h2PlayerService.getByName(name)); - } -} diff --git a/h2_playermanager/src/main/java/mc/core/h2db/entity/H2PlayerEntity.java b/h2_playermanager/src/main/java/mc/core/h2db/entity/H2PlayerEntity.java deleted file mode 100644 index 86e9cda..0000000 --- a/h2_playermanager/src/main/java/mc/core/h2db/entity/H2PlayerEntity.java +++ /dev/null @@ -1,102 +0,0 @@ -package mc.core.h2db.entity; - -import lombok.Data; -import lombok.NoArgsConstructor; -import mc.core.EntityLocation; -import mc.core.h2db.H2Player; -import mc.core.world.World; -import org.hibernate.annotations.GenericGenerator; -import org.springframework.context.ApplicationContext; - -import javax.persistence.*; -import java.util.UUID; - -@Entity -@Table(name = "players", - indexes = {@Index(name = "idx_players_uuid", columnList = "uuid", unique = true), - @Index(name = "idx_players_name", columnList = "name")}) -@NoArgsConstructor -@Data -public class H2PlayerEntity { - @Id - @GeneratedValue(generator = "increment") - @GenericGenerator(name= "increment", strategy= "increment") - @Column(nullable = false) - private Long id; - - @Column(length = 36, nullable = false) - private String uuid; - - @Column(length = 16, nullable = false) - private String name; - - @Column(name = "location_x", nullable = false) - private Double locationX; - - @Column(name = "location_y", nullable = false) - private Double locationY; - - @Column(name = "location_z", nullable = false) - private Double locationZ; - - @Column(name = "location_yaw", nullable = false) - private Float locationYaw; - - @Column(name = "location_pitch", nullable = false) - private Float locationPitch; - - @Column(name = "location_world", length = 64, nullable = false) - private String locationWorld; - - public H2PlayerEntity(H2Player player) { - this.id = (long) player.getId(); - setUuid(player.getUuid().toString()); - setName(this.name = player.getName()); - this.locationX = player.getLocation().getX(); - this.locationY = player.getLocation().getY(); - this.locationZ = player.getLocation().getZ(); - this.locationYaw = player.getLocation().getYaw(); - this.locationPitch = player.getLocation().getPitch(); - this.locationWorld = player.getWorld().getName(); - } - - public void setUuid(String uuid) { - if (uuid == null || uuid.trim().isEmpty()) { - this.uuid = null; - } else { - this.uuid = uuid; - } - } - - public void setName(String name) { - if (name == null || name.trim().isEmpty()) { - this.name = null; - } else { - this.name = name; - } - } - - public H2Player toPlayer(ApplicationContext context) { - H2Player player = new H2Player(); - return toPlayer(player, context); - } - - public H2Player toPlayer(H2Player player, ApplicationContext context) { - player.setId(this.id.intValue()); - player.setUuid(UUID.fromString(this.uuid)); - player.setName(this.name); - if (player.getLocation() == null) { - player.setLocation(new EntityLocation( - this.locationX, this.locationY, this.locationZ, - this.locationYaw, this.locationPitch - )); - } else { - player.getLocation().setXYZ(this.locationX, this.locationY, this.locationZ); - player.getLocation().setYawPitch(this.locationYaw, this.locationPitch); - } - - player.setWorld(context.getBean(this.locationWorld, World.class)); - - return player; - } -} diff --git a/h2_playermanager/src/main/java/mc/core/h2db/repository/H2PlayerEntityRepository.java b/h2_playermanager/src/main/java/mc/core/h2db/repository/H2PlayerEntityRepository.java deleted file mode 100644 index 47b4f45..0000000 --- a/h2_playermanager/src/main/java/mc/core/h2db/repository/H2PlayerEntityRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package mc.core.h2db.repository; - -import mc.core.h2db.entity.H2PlayerEntity; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -@Repository -public interface H2PlayerEntityRepository extends JpaRepository { - Optional findByName(String name); -} diff --git a/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerService.java b/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerService.java deleted file mode 100644 index a20fb7b..0000000 --- a/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerService.java +++ /dev/null @@ -1,11 +0,0 @@ -package mc.core.h2db.service; - -import mc.core.h2db.H2Player; - -public interface H2PlayerService { - H2Player save(H2Player player); - void remove(H2Player player); - - H2Player getByName(String name); - H2Player getById(int id); -} diff --git a/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerServiceImpl.java b/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerServiceImpl.java deleted file mode 100644 index b920fbf..0000000 --- a/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerServiceImpl.java +++ /dev/null @@ -1,44 +0,0 @@ -package mc.core.h2db.service; - -import mc.core.h2db.H2Player; -import mc.core.h2db.entity.H2PlayerEntity; -import mc.core.h2db.repository.H2PlayerEntityRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.stereotype.Service; - -import java.util.Optional; - -@Service -public class H2PlayerServiceImpl implements H2PlayerService { - @Autowired - private ApplicationContext context; - @Autowired - private H2PlayerEntityRepository h2PlayerEntityRepository; - - @Override - public H2Player save(H2Player player) { - H2PlayerEntity entity = new H2PlayerEntity(player); - //TODO возможно имеет смысл здесь оптимизация - //вместо toPlayer() сделать toPlayer(H2Player) который в существующий - //будет дописывать/обновлять данные - return h2PlayerEntityRepository.saveAndFlush(entity).toPlayer(player, context); - } - - @Override - public void remove(H2Player player) { - h2PlayerEntityRepository.deleteById((long) player.getId()); - } - - @Override - public H2Player getByName(String name) { - Optional optEntity = h2PlayerEntityRepository.findByName(name); - return optEntity.map(entiry -> entiry.toPlayer(context)).orElse(null); - } - - @Override - public H2Player getById(int id) { - Optional optEntity = h2PlayerEntityRepository.findById((long) id); - return optEntity.map(entiry -> entiry.toPlayer(context)).orElse(null); - } -} diff --git a/h2_playermanager/src/test/java/mc/core/h2db/H2PlayerManagerTest.java b/h2_playermanager/src/test/java/mc/core/h2db/H2PlayerManagerTest.java deleted file mode 100644 index dd25625..0000000 --- a/h2_playermanager/src/test/java/mc/core/h2db/H2PlayerManagerTest.java +++ /dev/null @@ -1,159 +0,0 @@ -package mc.core.h2db; - -import mc.core.EntityLocation; -import mc.core.h2db.service.H2PlayerService; -import mc.core.player.Player; -import mc.core.world.World; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = {TestSpringConfig.class}) -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) -class H2PlayerManagerTest { - @Autowired - private H2PlayerService h2PlayerService; - @Autowired - private World mockWorld; - @Autowired - private H2PlayerManager playerManager; - - @Test - void createPlayer() { - final String playerName = "NEW_PLAYER"; - final Player newPlayer = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld); - - assertNotNull(newPlayer); - assertEquals(H2Player.class, newPlayer.getClass()); - assertTrue(newPlayer.getId() > 0); - - final H2Player queryPlayer = h2PlayerService.getByName(playerName); - assertTrue(queryPlayer.getId() > 0); - - assertEquals(newPlayer, queryPlayer); - assertEquals(newPlayer.getName(), queryPlayer.getName()); - assertEquals(newPlayer.getLocation(), queryPlayer.getLocation()); - assertEquals(newPlayer.getWorld(), queryPlayer.getWorld()); - } - - @Test - void joinServer() { - assertEquals(0, playerManager.getCountPlayers()); - - final String playerName = "NEW_PLAYER"; - final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld); - playerManager.joinServer(player); - - assertEquals(1, playerManager.getCountPlayers()); - assertTrue(player.isOnline()); - } - - @Test - void leftServer() { - assertEquals(0, playerManager.getCountPlayers()); - - final String playerName = "NEW_PLAYER"; - final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld); - playerManager.joinServer(player); - - assertEquals(1, playerManager.getCountPlayers()); - assertTrue(player.isOnline()); - - final int playerId = player.getId(); - - final String anotherName = "ANOTHER_NAME"; - ((H2Player)player).setName(anotherName); - - playerManager.leftServer(player); - - assertEquals(0, playerManager.getCountPlayers()); - - assertFalse(player.isOnline()); - assertTrue(player.getLoadedChunks().isEmpty()); - - final H2Player queryPlayer = h2PlayerService.getById(playerId); - - assertNotNull(queryPlayer); - ((H2Player)player).setId(playerId); - assertEquals(player, queryPlayer); - } - - @Test - void getPlayer() { - assertEquals(0, playerManager.getCountPlayers()); - - final String playerName = "NEW_PLAYER"; - final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld); - assertNotNull(player); - - playerManager.joinServer(player); - - assertEquals(1, playerManager.getCountPlayers()); - - Player queryPlayer = playerManager.getPlayer(playerName); - - assertEquals(player, queryPlayer); - } - - @Test - void getPlayers() { - assertEquals(0, playerManager.getCountPlayers()); - - final String playerName = "NEW_PLAYER"; - final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld); - assertNotNull(player); - - playerManager.joinServer(player); - - assertEquals(1, playerManager.getCountPlayers()); - - List players = playerManager.getPlayers(); - assertEquals(1, players.size()); - try { - players.add(new H2Player()); - fail(); - } catch (Exception e) { - assertTrue(true); - } - - assertEquals(player, players.get(0)); - } - - @Test - void getCountPlayers() { - assertEquals(0, playerManager.getCountPlayers()); - - final String playerName = "NEW_PLAYER"; - final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld); - assertNotNull(player); - - playerManager.joinServer(player); - - assertEquals(1, playerManager.getCountPlayers()); - - playerManager.leftServer(player); - - assertEquals(0, playerManager.getCountPlayers()); - } - - @Test - void getOfflinePlayer() { - final String playerName = "NEW_PLAYER"; - final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld); - playerManager.joinServer(player); - playerManager.leftServer(player); - - assertEquals(0, playerManager.getCountPlayers()); - - Player offlinePlayer = playerManager.getOfflinePlayer(playerName); - assertEquals(player, offlinePlayer); - } -} diff --git a/h2_playermanager/src/test/java/mc/core/h2db/H2PlayerTest.java b/h2_playermanager/src/test/java/mc/core/h2db/H2PlayerTest.java deleted file mode 100644 index 271fae7..0000000 --- a/h2_playermanager/src/test/java/mc/core/h2db/H2PlayerTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package mc.core.h2db; - -import org.junit.jupiter.api.Test; - -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; - -class H2PlayerTest { - @Test - void equals_() { - UUID uuid = UUID.randomUUID(); - - H2Player player1 = new H2Player(); - player1.setId(1); - player1.setUuid(uuid); - player1.setName("Player1"); - - H2Player player2 = new H2Player(); - player2.setId(1); - player2.setUuid(uuid); - player2.setName("Player2"); - - assertEquals(player1, player2); - - player2.setId(2); - - assertNotEquals(player1, player2); - - player2.setId(1); - player2.setUuid(UUID.randomUUID()); - - assertNotEquals(player1, player2); - } -} diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestSpringConfig.java b/h2_playermanager/src/test/java/mc/core/h2db/TestSpringConfig.java deleted file mode 100644 index 8dd5f80..0000000 --- a/h2_playermanager/src/test/java/mc/core/h2db/TestSpringConfig.java +++ /dev/null @@ -1,90 +0,0 @@ -package mc.core.h2db; - -import mc.core.h2db.service.H2PlayerService; -import mc.core.world.World; -import org.hibernate.jpa.HibernatePersistenceProvider; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.jdbc.datasource.DriverManagerDataSource; -import org.springframework.orm.jpa.JpaTransactionManager; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -import javax.persistence.EntityManagerFactory; -import javax.sql.DataSource; -import java.util.Properties; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -@Configuration -@EnableJpaRepositories -@EnableTransactionManagement -@ComponentScan("mc.core.h2db") -public class TestSpringConfig { - private static final String DATABASE_DRIVER = "org.h2.Driver"; - private static final String DATABASE_URL = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"; - private static final String DATABASE_USERNAME = "sa"; - private static final String DATABASE_PASSWORD = "s3cReT"; - - static { - System.setProperty("org.jboss.logging.provider", "slf4j"); - } - - private Properties hibernateProp() { - Properties properties = new Properties(); - properties.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); - properties.put("hibernate.show_sql", "true"); - properties.put("hibernate.format_sql", "true"); - properties.put("hibernate.use_sql_comments", "true"); - properties.put("hibernate.hbm2ddl.auto", "create"); - - return properties; - } - - @Bean("mockWorld") - public World mockWorld() { - World mockWorld = mock(World.class); - when(mockWorld.getName()).thenReturn("mockWorld"); - return mockWorld; - } - - @Bean - public DataSource dataSource() { - DriverManagerDataSource dmds = new DriverManagerDataSource(); - dmds.setDriverClassName(DATABASE_DRIVER); - dmds.setUrl(DATABASE_URL); - dmds.setUsername(DATABASE_USERNAME); - dmds.setPassword(DATABASE_PASSWORD); - - return dmds; - } - - @Bean - public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { - LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); - entityManagerFactoryBean.setDataSource(dataSource); - entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class); - entityManagerFactoryBean.setPackagesToScan("mc.core.h2db.entity"); - entityManagerFactoryBean.setJpaProperties(hibernateProp()); - - return entityManagerFactoryBean; - } - - @Bean - public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { - JpaTransactionManager transactionManager = new JpaTransactionManager(); - transactionManager.setEntityManagerFactory(entityManagerFactory); - - return transactionManager; - } - - @Bean - public H2PlayerManager h2PlayerManager(H2PlayerService h2PlayerService) { - H2PlayerManager playerManager = new H2PlayerManager(); - playerManager.setH2PlayerService(h2PlayerService); - return playerManager; - } -} diff --git a/h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java b/h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java deleted file mode 100644 index 464e0e4..0000000 --- a/h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java +++ /dev/null @@ -1,155 +0,0 @@ -package mc.core.h2db.service; - -import mc.core.EntityLocation; -import mc.core.h2db.H2Player; -import mc.core.h2db.TestSpringConfig; -import mc.core.world.World; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.UUID; -import java.util.concurrent.ThreadLocalRandom; - -import static org.junit.jupiter.api.Assertions.*; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = {TestSpringConfig.class}) -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) -class H2PlayerServiceTest { - @Autowired - private H2PlayerService h2PlayerService; - @Autowired - private World world; - - private H2Player buildPlayer() { - final ThreadLocalRandom rnd = ThreadLocalRandom.current(); - final double minD = 0.0d, maxD = 10.0d; - final float minF = 0.0f, maxF = 359.9f; - final int minI = 1000, maxI = 9999; - - final H2Player player = new H2Player(); - player.setUuid(UUID.randomUUID()); - player.setName("player" + rnd.nextInt(minI, maxI)); - player.setLocation(new EntityLocation( - rnd.nextDouble(minD, maxD), - rnd.nextDouble(minD, maxD), - rnd.nextDouble(minD, maxD), - rnd.nextFloat() * (maxF - minF) + minF, - rnd.nextFloat() * (maxF - minF) + minF - )); - player.setWorld(world); - - return player; - } - - private void assertPlayers(H2Player expected, H2Player actual) { - assertEquals(expected, actual); - assertEquals(expected.getName(), actual.getName()); - assertEquals(expected.getLocation(), actual.getLocation()); - assertNotNull(actual.getWorld()); - assertEquals(expected.getWorld(), actual.getWorld()); - } - - @Test - void save() { - H2Player player = buildPlayer(); - H2Player savedPlayer = h2PlayerService.save(player); - - player.setId(savedPlayer.getId()); //FIXME костыль, однако - assertPlayers(player, savedPlayer); - } - - @Test - void save_NameEmpty() { - assertThrows(Exception.class, () -> { - H2Player player = buildPlayer(); - player.setName(""); - h2PlayerService.save(player); - }); - } - - @Test - void save_NameNull() { - assertThrows(Exception.class, () -> { - H2Player player = buildPlayer(); - player.setName(null); - h2PlayerService.save(player); - }); - } - - @Test - void save_UuidNull() { - assertThrows(Exception.class, () -> { - H2Player player = buildPlayer(); - player.setUuid(null); - h2PlayerService.save(player); - }); - } - - @Test - void save_LocationNull() { - assertThrows(Exception.class, () -> { - H2Player player = buildPlayer(); - player.setLocation(null); - h2PlayerService.save(player); - }); - } - - @Test - void remove() { - H2Player player = h2PlayerService.save(buildPlayer()); - h2PlayerService.remove(player); - - H2Player player2 = h2PlayerService.getById(player.getId()); - assertNull(player2); - } - - @Test - void remove_NotExists() { - assertThrows(Exception.class, () -> { - H2Player player = h2PlayerService.save(buildPlayer()); - h2PlayerService.remove(player); - h2PlayerService.remove(player); - }); - } - - @Test - void getByName() { - H2Player player = h2PlayerService.save(buildPlayer()); - - H2Player player2 = h2PlayerService.getByName(player.getName()); - assertPlayers(player, player2); - } - - @Test - void getByName_NotExists() { - assertNull(h2PlayerService.getByName("UNKNOW_PLAYER")); - } - - @Test - void getByName_Empty() { - assertNull(h2PlayerService.getByName("")); - } - - @Test - void getByName_Null() { - assertNull(h2PlayerService.getByName(null)); - } - - @Test - void getById() { - H2Player player = h2PlayerService.save(buildPlayer()); - - H2Player player2 = h2PlayerService.getById(player.getId()); - assertPlayers(player, player2); - } - - @Test - void getById_NotExists() { - assertNull(h2PlayerService.getById(9999)); - } -} diff --git a/proto_1.12.2/build.gradle b/proto_1.12.2/build.gradle deleted file mode 100644 index 7c71711..0000000 --- a/proto_1.12.2/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ -version '1.0-SNAPSHOT' - -dependencies { - /* Core */ - compile_excludeCopy project(':core') - - /* Components */ - compile (group: 'com.google.code.gson', name: 'gson', version: '2.8.5') - compile (group: 'net.sf.trove4j', name: 'trove4j', version: '3.0.3') -} 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 deleted file mode 100644 index 7a2b7d6..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/ByteArrayOutputNetStream.java +++ /dev/null @@ -1,71 +0,0 @@ -package mc.core.network.proto_1_12_2; - -import java.io.ByteArrayOutputStream; - -public class ByteArrayOutputNetStream extends NetOutputStream_p340 { - private ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - @Override - public void writeBoolean(boolean value) { - baos.write(value ? 1 : 0); - } - - @Override - public void writeByte(int value) { - baos.write(value); - } - - @Override - public void writeUnsignedByte(int value) { - baos.write((byte)(value & 0xFF)); - } - - @Override - public void writeBytes(byte[] buffer, int offset, int lengtn) { - baos.write(buffer, offset, lengtn); - } - - @Override - public void writeShort(int value) { - baos.write((byte) (value >>> 8)); - baos.write((byte) value); - } - - @Override - public void writeInt(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((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 - public void writeFloat(float value) { - writeInt(Float.floatToIntBits(value)); - } - - @Override - public void writeDouble(double value) { - writeLong(Double.doubleToLongBits(value)); - } - - public int size() { - return baos.size(); - } - - public byte[] toByteArray() { - return baos.toByteArray(); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/Direction.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/Direction.java deleted file mode 100644 index 8deb848..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/Direction.java +++ /dev/null @@ -1,26 +0,0 @@ -package mc.core.network.proto_1_12_2; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import java.util.Arrays; - -@RequiredArgsConstructor -public enum Direction { - BOTTOM(0), // -Y - TOP(1), // +Y - NORTH(2), // -Z - SOUTH(3), // +Z - WEST(4), // -X - EAST(5); // +X - - public static Direction getById(final int id) { - return Arrays.stream(Direction.values()) - .filter(direction -> direction.id == id) - .findFirst() - .orElse(null); - } - - @Getter - private final int id; -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/NetInputStream_p340.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/NetInputStream_p340.java deleted file mode 100644 index 6be6f48..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/NetInputStream_p340.java +++ /dev/null @@ -1,82 +0,0 @@ -package mc.core.network.proto_1_12_2; - -import com.flowpowered.nbt.Tag; -import com.flowpowered.nbt.stream.NBTInputStream; -import lombok.extern.slf4j.Slf4j; -import mc.core.network.NetInputStream; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.UUID; -import java.util.concurrent.atomic.AtomicInteger; - -@Slf4j -public abstract class NetInputStream_p340 extends NetInputStream { - private NBTInputStream nbtInputStream; - - @Override - public int readVarInt(AtomicInteger countReadBytes) { - int numRead = 0; - int result = 0; - byte read; - do { - if ((numRead+1) > 5) { - log.warn("VarInt is too big"); - break; - } - read = readByte(); - int value = (read & 0b01111111); - result |= (value << (7 * numRead)); - - numRead++; - } while ((read & 0b10000000) != 0); - - if (countReadBytes != null) { - countReadBytes.set(numRead); - } - - return result; - } - - @Override - public int readVarInt() { - return readVarInt(null); - } - - @Override - public String readString() { - int size = readVarInt(); - if (size == 0) { - log.warn("String zero length??"); - return ""; - } - - byte[] bytes = new byte[size]; - readBytes(bytes); - return new String(bytes, StandardCharsets.UTF_8); - } - - @Override - public UUID readUUID() { - return new UUID(readLong(), readLong()); - } - - @Override - public Tag readNBT() { - if (nbtInputStream == null) { - try { - nbtInputStream = new NBTInputStream(this, false); - } catch (IOException e) { - log.error("Create NBT stream", e); - return null; - } - } - - try { - return nbtInputStream.readTag(); - } catch (IOException e) { - log.error("Read NBT", e); - return null; - } - } -} 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 deleted file mode 100644 index 396ec74..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/NetOutputStream_p340.java +++ /dev/null @@ -1,63 +0,0 @@ -package mc.core.network.proto_1_12_2; - -import com.flowpowered.nbt.Tag; -import com.flowpowered.nbt.stream.NBTOutputStream; -import lombok.extern.slf4j.Slf4j; -import mc.core.network.NetOutputStream; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.UUID; - -@Slf4j -public abstract class NetOutputStream_p340 extends NetOutputStream { - private NBTOutputStream nbtOutputStream; - - @Override - public void writeVarInt(int value) { - while ((value & -128) != 0) { - writeByte(value & 127 | 128); - value >>>= 7; - } - - writeByte(value); - } - - @Override - public void writeString(String value) { - if (value.length() > Short.MAX_VALUE) { - log.warn("String \"{}\" too long!", value); - byte[] buf = value.substring(0, Short.MAX_VALUE).getBytes(StandardCharsets.UTF_8); - writeVarInt(Short.MAX_VALUE); - writeBytes(buf); - } else { - byte[] buf = value.getBytes(StandardCharsets.UTF_8); - writeVarInt(value.length()); - writeBytes(buf); - } - } - - @Override - public void writeUUID(UUID uuid) { - writeLong(uuid.getMostSignificantBits()); - writeLong(uuid.getLeastSignificantBits()); - } - - @Override - public void writeNBT(Tag tag) { - if (nbtOutputStream == null) { - try { - nbtOutputStream = new NBTOutputStream(this, false); - } catch (IOException e) { - log.error("Create NBT stream", e); - return; - } - } - - try { - nbtOutputStream.writeTag(tag); - } catch (IOException e) { - log.error("Write NBT", e); - } - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java deleted file mode 100644 index a548a3d..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * DmitriyMX - * 2018-06-08 - */ -package mc.core.network.proto_1_12_2; - -import com.google.common.collect.ImmutableMap; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import mc.core.network.CSPacket; -import mc.core.network.SCPacket; -import mc.core.network.proto_1_12_2.packets.*; - -import java.util.Map; - -/** - * Для каждого состояния протокола имеется свой набор пакетов. - */ -@Slf4j -@RequiredArgsConstructor -public enum State { - /** - * Не известная стадия. - * Переход на этут стадию является следствием ошибки в работе протокола (умышленного или нет) - */ - UNKNOWN(-1, ImmutableMap.of(), ImmutableMap.of()), - - /** - * Рукопожатие. - * С этого состояния начинается сюбое соединение с сервером. - */ - HANDSHAKE(0, - ImmutableMap.>builder() - .put(0x00, HandshakePacket.class) - .build(), - null - ), - - /** - * Информация о сервере. - * Используется для получения Motd, кол-ва слотов и т.д. - */ - STATUS(1, - ImmutableMap.>builder() - .put(0x00, StatusRequestPacket.class) - .put(0x01, PingPacket.class) - .build(), - ImmutableMap., Integer>builder() - .put(StatusResponsePacket.class, 0x00) - .put(PingPacket.class, 0x01) - .build() - ), - - /** - * Стадия логина/авторизации. - */ - LOGIN(2, - ImmutableMap.>builder() - .put(0x00, LoginStartPacket.class) - .build(), - ImmutableMap., Integer>builder() - .put(DisconnectPacket.class, 0x00) - .put(LoginSuccessPacket.class, 0x02) - .build() - ), - - /** - * Игровая стадия. - * Основная стадия протокола. - */ - PLAY(3, - ImmutableMap.>builder() - .put(0x00, TeleportConfirmPacket.class) - .put(0x01, TabCompletePacket.class) - .put(0x02, ChatMessageClientPacket.class) - .put(0x04, ClientSettingsPacket.class) - .put(0x09, PluginMessagePacket.class) - .put(0x0B, KeepAlivePacket.class) - .put(0x0D, PlayerPositionPacket.class) - .put(0x0E, PlayerPositionAndLookPacket.class) - .put(0x0F, PlayerLookPacket.class) - .put(0x13, PlayerAbilitiesPacket.class) - .put(0x14, PlayerDiggingPacket.class) - .put(0x15, EntityActionPacket.class) - .put(0x1A, HeldItemChangePacket.class) - .put(0x1D, AnimationPacket.class) - .put(0x1F, PlayerBlockPlacementPacket.class) - .build(), - ImmutableMap., Integer>builder() - .put(BossBarPacket.class, 0x0C) - .put(ChatMessageServerPacket.class, 0x0F) - .put(PluginMessagePacket.class, 0x18) - .put(UnloadChunkPacket.class, 0x1D) - .put(ChangeGameState.class, 0x1E) - .put(KeepAlivePacket.class, 0x1F) - .put(ChunkDataPacket.class, 0x20) - .put(JoinGamePacket.class, 0x23) - .put(PlayerAbilitiesPacket.class, 0x2C) - .put(PlayerListItemPacket.class, 0x2E) - .put(PlayerPositionAndLookPacket.class, 0x2F) - .put(SpawnPositionPacket.class, 0x46) - .put(TimeUpdatePacket.class, 0x47) - .put(TitlePacket.class, 0x48) - .put(PlayerListHeaderAndFooterPacket.class, 0x4A) - .build() - ); - - public static State valueOf(int id) { - if (id == 0) return HANDSHAKE; - else if (id == 1) return STATUS; - else if (id == 2) return LOGIN; - else if (id == 3) return PLAY; - else { - log.warn("Unknown state: {}", id); - return UNKNOWN; - } - } - - @Getter - private final int id; - private final Map> clientSidePacketsMap; - private final Map, Integer> serverSidePacketsMap; - - public Class getClientSidePacket(int id) { - return clientSidePacketsMap.get(id); - } - - public Integer getServerSidePacket(Class clazz) { - return serverSidePacketsMap.get(clazz); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/TeleportManager.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/TeleportManager.java deleted file mode 100644 index ba9cd07..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/TeleportManager.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * DmitriyMX - * 2018-06-23 - */ -package mc.core.network.proto_1_12_2; - -import lombok.AllArgsConstructor; -import mc.core.EntityLocation; -import mc.core.player.Player; - -import java.util.HashMap; -import java.util.Map; -import java.util.Random; - -public class TeleportManager { - private static TeleportManager instance = new TeleportManager(); - - public static TeleportManager getInstance() { - return instance; - } - - @AllArgsConstructor - private class TpData { - public Player player; - public EntityLocation newLocation; - // TODO необходимо добавить TimeStamp, что бы понимать, когда клиент отвергнул телепортацию - // т.е. идея такова: долгое молчание клиента знак отвержения телепортации. - } - - private final Random RAND = new Random(); - private final Map teleportMap = new HashMap<>(); - - private TeleportManager() {} - - public int append(Player player, EntityLocation location) { - int teleportId; - do { - teleportId = RAND.nextInt(9999); - } while (teleportMap.containsKey(teleportId)); - - teleportMap.put(teleportId, new TpData(player, location.clone())); - return teleportId; - } - - public void apply(int teleportId) { - if (teleportMap.containsKey(teleportId)) { - TpData data = teleportMap.remove(teleportId); - data.player.getLocation().set(data.newLocation); - } - } - - public void removeDataPlayer(Player player) { - teleportMap.entrySet().removeIf(entry -> entry.getValue().player.equals(player)); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/package-info.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/package-info.java deleted file mode 100644 index d6207e6..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/package-info.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Протокол Minecraft версии 1.12.2 (номер версии протокола - 340) - * - * - * Типы данных. - * - * (см. http://wiki.vg/Protocol#Data_types) - * - * - * Формат пакетов. - * - * Есть два варианта: без использования сжатия и с использованием. - * Регулируется это пакетом {@link mc.core.network.proto_1_12_2.packets.SetCompressionPacket} - * - * Формат без использования сжатия: - * - * +---------------+------------+--------------------+ - * | Название | Тип | Комментарий | - * +---------------+------------+--------------------+ - * | Размер пакета | VarInt | ID пакета + данные | - * +---------------+------------+--------------------+ - * | ID пакета | VarInt | | - * +---------------+------------+--------------------+ - * | Данные | Byte Array | | - * +---------------+------------+--------------------+ - * - * Формат с использованием сжатия: - * - * (см. http://wiki.vg/Protocol#With_compression) - */ - -package mc.core.network.proto_1_12_2; \ No newline at end of file diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/AnimationPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/AnimationPacket.java deleted file mode 100644 index be82f07..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/AnimationPacket.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * DmitriyMX - * 2018-06-17 - */ -package mc.core.network.proto_1_12_2.packets; - -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; - -public class AnimationPacket implements CSPacket { - private int handAnimation; - - @Override - public void readSelf(NetInputStream netStream) { - this.handAnimation = netStream.readVarInt(); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/BossBarPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/BossBarPacket.java deleted file mode 100644 index 7339c11..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/BossBarPacket.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * DmitriyMX - * 2018-07-12 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import lombok.ToString; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; -import mc.core.network.proto_1_12_2.serializers.TextMapper; -import mc.core.text.Text; - -import java.util.UUID; - -@Setter -@ToString -public class BossBarPacket implements SCPacket { - @RequiredArgsConstructor - public enum Action { - ADD(0), - REMOVE(1), - UPDATE_HEALTH(2), - UPDATE_TITLE(3), - UPDATE_STYLE(4), - UPDATE_FLAGS(5); - - @Getter - private final int id; - } - - @RequiredArgsConstructor - public enum Color { - PINK(0), - BLUE(1), - RED(2), - GREEN(3), - YELLOW(4), - PURPLE(5), - WHITE(5); - - @Getter - private final int id; - } - - @RequiredArgsConstructor - public enum Division { - NO(0), - _0(0), - _6(1), - _10(2), - _12(3), - _20(4); - - @Getter - private final int id; - } - - @RequiredArgsConstructor - public enum Flag { - NO(0x00), - DAKR_SKY(0x01), - DRAGON_BAR(0x02); - - @Getter - private final int id; - } - - @Getter - @Setter - public static class BarData { - private Text title; - /* - * From 0 to 1. - * Values greater than 1 do not crash a Notchian client, - * and start rendering part of a second health bar at around 1.5. - * (https://i.johni0702.de/nA.png) - */ - private float health; - private Color color; - private Division division; - private Flag flags; - } - - private UUID uuid; // Unique ID for this bar - private Action action; - private BarData barData; - - @Override - public void writeSelf(NetOutputStream netStream) { - netStream.writeUUID(uuid); - netStream.writeVarInt(action.id); - - if (action == Action.REMOVE) { - return; - } - - if (action == Action.ADD || action == Action.UPDATE_TITLE) { - netStream.writeString(TextMapper.getInstance().mapping(barData.title)); - } - - if (action == Action.ADD || action == Action.UPDATE_HEALTH) { - netStream.writeFloat(barData.health); - } - - if (action == Action.ADD || action == Action.UPDATE_STYLE) { - netStream.writeVarInt(barData.color.id); - netStream.writeVarInt(barData.division.id); - } - - if (action == Action.ADD || action == Action.UPDATE_FLAGS) { - netStream.writeUnsignedByte(barData.flags.id); - } - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChangeGameState.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChangeGameState.java deleted file mode 100644 index e4d1169..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChangeGameState.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * DmitriyMX - * 2018-07-27 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; - -@Setter -public class ChangeGameState implements SCPacket { - @RequiredArgsConstructor - public enum Reason { - INVALID_BED(0), // Would be used to switch between messages, but the only used message is 0 for invalid bed (wat?) - RAINING_END(1), - RAINING_BEGIN(2), - CHANGE_GAMEMODE(3), // 0: Survival, 1: Creative, 2: Adventure, 3: Spectator - ARROW_HITTING_PLAYER(6), // Appears to be played when an arrow strikes another player in Multiplayer - FADE_VALUE(7), // The current darkness value. 1 = Dark, 0 = Bright, Setting the value higher causes the game to change color and freeze - FADE_TIME(8), // Time in ticks for the sky to fade - GUARDIAN_APPEARANCE(10); // Play elder guardian mob appearance (effect and sound) - - private final int id; - } - - private Reason reason; - private float value; - - @Override - public void writeSelf(NetOutputStream netStream) { - netStream.writeUnsignedByte(reason.id); - netStream.writeFloat(value); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChatMessageClientPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChatMessageClientPacket.java deleted file mode 100644 index 70aa84a..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChatMessageClientPacket.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * DmitriyMX - * 2018-06-17 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.Getter; -import lombok.ToString; -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; - -@Getter -@ToString -public class ChatMessageClientPacket implements CSPacket { - private String message; - - @Override - public void readSelf(NetInputStream netStream) { - this.message = netStream.readString(); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChatMessageServerPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChatMessageServerPacket.java deleted file mode 100644 index 903e61c..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChatMessageServerPacket.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * DmitriyMX - * 2018-06-24 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; -import mc.core.chat.MessageType; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; -import mc.core.network.proto_1_12_2.serializers.TextMapper; -import mc.core.text.Text; - -@AllArgsConstructor -@NoArgsConstructor -@Setter -@ToString -public class ChatMessageServerPacket implements SCPacket { - private Text text; - private MessageType type; - - @Override - public void writeSelf(NetOutputStream netStream) { - netStream.writeString(TextMapper.getInstance().mapping(text)); - netStream.writeByte(type.getId()); - } -} 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 deleted file mode 100644 index 9be81ac..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java +++ /dev/null @@ -1,317 +0,0 @@ -package mc.core.network.proto_1_12_2.packets; - -import com.flowpowered.nbt.CompoundTag; -import gnu.trove.list.TIntList; -import gnu.trove.list.array.TIntArrayList; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; -import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; -import mc.core.utils.NibbleArray; -import mc.core.world.block.Block; -import mc.core.world.block.BlockLocation; -import mc.core.world.block.BlockType; -import mc.core.world.chunk.Chunk; -import mc.core.world.chunk.ChunkSection; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; - -/* -Packet structure - -- https://wiki.vg/Chunk_Format#Packet_structure - -+------------------------------------------------------+ -| Field | Type | -|--------------------------|---------------------------| -| Chunk X | int | -|--------------------------|---------------------------| -| Chunk Y | int | -|--------------------------|---------------------------| -| Init Chunk | boolean | ("Ground-Up Continuous") -|--------------------------|---------------------------| -| Primary Bit Mask | VarInt | -|--------------------------|---------------------------| -| Size of Data | VarInt | -|--------------------------|---------------------------| -| Data | Byte array | - https://wiki.vg/Chunk_Format#Data_structure -| +------------------------------------------------+ | -| | Chunk Section | Byte array | | - https://wiki.vg/Chunk_Format#Chunk_Section_structure -| | +------------------------------------------+ | | -| | | Bits Per Block | Unsigned Byte | | | (we use 4 bits per block) -| | |--------------------|---------------------| | | -| | | Palette | Byte array | | | - https://wiki.vg/Chunk_Format#Palettes -| | | +------------------------------------+ | | | (we use Indirect type palette) -| | | | Size of palette | VarInt | | | | -| | | |-----------------|------------------| | | | -| | | | Palette | Array of VarInt | | | | -| | | +------------------------------------+ | | | -| | |--------------------|---------------------| | | -| | | Size of Data Array | VarInt | | | -| | |--------------------|---------------------| | | -| | | Data Array | Array of Long | | | -| | |--------------------|---------------------| | | -| | | Block Light | Byte Array | | | (Half byte per block) -| | |--------------------|---------------------| | | -| | | Sky Light | Optional Byte Array | | | (Only if in the Overworld; half byte per block) -| | +------------------------------------------+ | | -| |-----------------------|------------------------| | -| | Biomes | Optional Byte array | | -| +------------------------------------------------+ | -|--------------------------|---------------------------| -| Number of block entities | VarInt | -|--------------------------|---------------------------| -| Block entities | Array of NBT | -+------------------------------------------------------+ - */ - -@Slf4j -@NoArgsConstructor -public class ChunkDataPacket implements SCPacket { - @Setter - private int x; - @Setter - private int z; - @Setter - private boolean initChunk = true; // "Ground-Up Continuous" - private Chunk chunk; - private List sectionList; - - public void setChunk(Chunk chunk) { - this.sectionList = null; - this.chunk = chunk; - } - - public void setChunkSectionList(List sectionList) { - this.chunk = null; - this.sectionList = sectionList; - } - - @Override - public void writeSelf(NetOutputStream netStream) { - if (sectionList == null && chunk == null) { - log.warn("Empty chunk data!"); //TODO для такого нужна заглушка - return; - } - - netStream.writeInt(x); // Chunk X - netStream.writeInt(z); // Chunk Y - netStream.writeBoolean(initChunk); // Init Chunk - - int maxH = 0; - int bitMask = 0; - if (sectionList == null && chunk != null) { - for (int h = 15; h >= 0; h--) { - bitMask = bitMask << 1; - ChunkSection chunkSection = chunk.getChunkSection(h); - if (chunkSection != null && chunkSection.getY() == h) { - bitMask |= 0x01; - maxH++; - } else { - bitMask |= 0x00; - } - } - } else if (sectionList != null && chunk == null) { - sectionList.sort(Comparator.comparingInt(ChunkSection::getY)); - for (int h = 15, i = 0; h >= 0; h--) { - bitMask = bitMask << 1; - ChunkSection chunkSection = sectionList.get(i); - if (chunkSection != null && chunkSection.getY() == h) { - bitMask |= 0x01; - maxH++; - } else { - bitMask |= 0x00; - } - } - } - netStream.writeVarInt(bitMask); // Primary Bit Mask - - final ByteArrayOutputNetStream data = new ByteArrayOutputNetStream(); - - final ByteArrayOutputNetStream biomes = new ByteArrayOutputNetStream(); - boolean biomeWrite = true; - - List nbtList = new ArrayList<>(); - - for (int h = 0; h < maxH; h++) { - ChunkSection chunkSection = null; - - if (chunk != null) { - chunkSection = chunk.getChunkSection(h); - } else if (sectionList != null) { - chunkSection = sectionList.remove(0); - } - - if (chunkSection == null) { - continue; - } - - final PalettedChunkSection palettedChunkSection = new PalettedChunkSection(); - - for (int y = 0; y < 16; y++) { - for (int z = 0; z < 16; z++) { - for (int x = 0; x < 16; x++) { - Block block = chunkSection.getBlock(x, y, z); - - palettedChunkSection.addBlock( - block, - chunkSection.getSkyLight(x, y, z) - ); - - CompoundTag nbt = block.getNBTData(); - if (nbt != null) { - nbtList.add(nbt); - } - - if (biomeWrite) { - biomes.writeByte(chunk.getBiome( - (chunk.getX() << 4) + x, - (chunk.getZ() << 4) + z - ).getId()); - if (x == 15 && z == 15) { - biomeWrite = false; - } - } - } - } - } - - // - palettedChunkSection.writeToNetStream(data); - // - } - // - data.writeBytes(biomes.toByteArray()); - // - - netStream.writeVarInt(data.size()); // Size of Data - netStream.writeBytes(data.toByteArray()); // Data - netStream.writeVarInt(nbtList.size()); // Number of block entities - // - for (CompoundTag compoundTag : nbtList) { - netStream.writeNBT(compoundTag); - } - // - } - - @Override - public String toString() { - return "ChunkDataPacket{" + - "x=" + x + - ", z=" + z + - ", chunk=" + chunk + - '}'; - } - - private class PalettedChunkSection { - private TIntList palette = new TIntArrayList(); - private byte[] blocks = new byte[4096]; - private NibbleArray blockLight = new NibbleArray(); - private NibbleArray skyLight = new NibbleArray(); - - private int coordsToIndex(BlockLocation location) { - return coordsToIndex(location.getX(), location.getY(), location.getZ()); - } - - private int coordsToIndex(int x, int y, int z) { - return y << 8 | z << 4 | x; - } - - private int serializeBlockState(BlockType blockType) { - return (blockType.getId() << 4) | blockType.getMeta(); - } - - byte addBlockType(BlockType blockType) { - int blockState = serializeBlockState(blockType); - - int idx = palette.indexOf(blockState); - if (idx == -1) { - palette.add(blockState); - idx = palette.size()-1; - } - - return (byte) idx; - } - - void addBlock(Block block, int skyLight) { - BlockLocation location = new BlockLocation( - block.getLocation().getX() - ((block.getLocation().getX() >> 4) << 4), - block.getLocation().getY() - ((block.getLocation().getY() >> 4) << 4), - block.getLocation().getZ() - ((block.getLocation().getZ() >> 4) << 4) - ); - blocks[coordsToIndex(location)] = addBlockType(block.getType()); - blockLight.set(location, block.getLight()); - this.skyLight.set(location, skyLight); - } - - void writeToNetStream(final NetOutputStream netOutputStream) { - int bitsPerBlock = 4; - if (palette.size() > 15) { - if (palette.size() <= 31) - bitsPerBlock = 5; - else if (palette.size() <= 63) - bitsPerBlock = 6; - else if (palette.size() <= 127) - bitsPerBlock = 7; - else if (palette.size() <= 255) - bitsPerBlock = 8; - } - - // - netOutputStream.writeUnsignedByte(bitsPerBlock); // Bits Per Block - netOutputStream.writeVarInt(palette.size()); // Size of palette - palette.forEach(value -> { netOutputStream.writeVarInt(value); return true; }); // Palette - // - // - final int dataLength = (4096/*16*16*16*/ * bitsPerBlock) / 64/*size of long in bits*/; - netOutputStream.writeVarInt(dataLength); // Size of Data Array - // - long value = 0; - int lastPos = 0; - boolean fairy = false; - long fairyValue = 0; - for (int y = 0; y < 16; y++) { - for (int z = 0; z < 16; z++) { - for (int x = 0; x < 16; x++) { - final int blockNumber = (((y << 4) + z) << 4) + x; - final int startLong = ( blockNumber * bitsPerBlock ) / 64; - final int startOffset = ( blockNumber * bitsPerBlock ) % 64; - final int endLong = ((blockNumber + 1) * bitsPerBlock - 1) / 64; - - final long idxBlockInPalette = blocks[coordsToIndex(x, y, z)]; - - if (startLong != lastPos) { - netOutputStream.writeLong(value); - lastPos = startLong; - if (fairy) { - value = fairyValue; - fairy = false; - } else { - value = 0; - } - } - value |= (idxBlockInPalette << startOffset); - - if (startLong != endLong) { - fairyValue = idxBlockInPalette >> (64 - startOffset); - fairy = true; - } - } - } - } - netOutputStream.writeLong(value); - // - // - // - netOutputStream.writeBytes(blockLight.getRawData()); - // - // - netOutputStream.writeBytes(skyLight.getRawData()); - // - } - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ClientSettingsPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ClientSettingsPacket.java deleted file mode 100644 index 6cb98bd..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ClientSettingsPacket.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * DmitriyMX - * 2018-06-11 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; - -@NoArgsConstructor -@Getter -@ToString -public class ClientSettingsPacket implements CSPacket { - private String locale; - private int viewDistance; - private int chatMode; - private boolean chatColors; - private boolean capeEnabled, - jacketEnabled, - leftSleeveEnabled, - rightSleeveEnabled, - leftPantsLegEnabled, - rightPantsLegEnabled, - hatEnabled; - private int mainHand; - - @Override - public void readSelf(NetInputStream netStream) { - locale = netStream.readString(); - viewDistance = netStream.readByte(); - chatMode = netStream.readVarInt(); - chatColors = netStream.readBoolean(); - - int bitmask = netStream.readUnsignedByte(); - capeEnabled = (bitmask & 0x01) > 0; - jacketEnabled = (bitmask & 0x02) > 0; - leftSleeveEnabled = (bitmask & 0x04) > 0; - rightSleeveEnabled = (bitmask & 0x08) > 0; - leftPantsLegEnabled = (bitmask & 0x10) > 0; - rightPantsLegEnabled = (bitmask & 0x20) > 0; - hatEnabled = (bitmask & 0x40) > 0; - - mainHand = netStream.readVarInt(); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/DisconnectPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/DisconnectPacket.java deleted file mode 100644 index 96f83f7..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/DisconnectPacket.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * DmitriyMX - * 2018-06-10 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -import lombok.Setter; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; -import mc.core.network.proto_1_12_2.serializers.TextMapper; -import mc.core.text.Text; - -@AllArgsConstructor -@NoArgsConstructor -@Setter -public class DisconnectPacket implements SCPacket { - private Text reason; - - @Override - public void writeSelf(NetOutputStream netStream) { - netStream.writeString(TextMapper.getInstance().mapping(reason)); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/EncryptionRequestPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/EncryptionRequestPacket.java deleted file mode 100644 index 33a2f54..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/EncryptionRequestPacket.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * DmitriyMX - * 2018-06-11 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -import lombok.Setter; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; - -import java.security.PublicKey; - -@AllArgsConstructor -@NoArgsConstructor -@Setter -public class EncryptionRequestPacket implements SCPacket { - private String serverId; - private PublicKey publicKey; - private byte[] verifyToken; - - @Override - public void writeSelf(NetOutputStream netStream) { - netStream.writeString(serverId); - byte[] bytes = publicKey.getEncoded(); - netStream.writeVarInt(bytes.length); - netStream.writeBytes(bytes); - netStream.writeVarInt(verifyToken.length); - netStream.writeBytes(verifyToken); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/EntityActionPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/EntityActionPacket.java deleted file mode 100644 index 0e02a01..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/EntityActionPacket.java +++ /dev/null @@ -1,45 +0,0 @@ -package mc.core.network.proto_1_12_2.packets; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; - -import java.util.Arrays; - -@Getter -public class EntityActionPacket implements CSPacket { - @RequiredArgsConstructor - public enum Action { - START_SNEAKING(0), - STOP_SNEAKING(1), - LEAVE_BED(2), // Leave bed is only sent when the “Leave Bed” button is clicked on the sleep GUI, not when waking up due today time. - START_SPRINTING(3), - STOP_SPRINTING(4), - START_JUMP_WITH_HORSE(5), - STOP_JUMP_WITH_HORSE(6), - OPEN_HORSE_INVENTORY(7), // Open horse inventory is only sent when pressing the inventory key (default: E) while on a horse — all other methods of opening a horse's inventory (involving right-clicking or shift-right-clicking it) do not use this packet. - START_FLYING_WITH_ELYTRA(8); - - public static Action getById(final int id) { - return Arrays.stream(Action.values()) - .filter(action -> action.id == id) - .findFirst() - .orElse(null); - } - - @Getter - private final int id; - } - - private int entityId; - private Action action; - private int jumpBoost; // Only used by the “start jump with horse” action, in which case it ranges from 0 to 100. In all other cases it is 0. - - @Override - public void readSelf(NetInputStream netStream) { - entityId = netStream.readVarInt(); - action = Action.getById(netStream.readVarInt()); - jumpBoost = netStream.readVarInt(); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/HandshakePacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/HandshakePacket.java deleted file mode 100644 index a0a2ab2..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/HandshakePacket.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * DmitriyMX - * 2018-06-10 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; -import mc.core.network.proto_1_12_2.State; - -@NoArgsConstructor -@Getter -@ToString -public class HandshakePacket implements CSPacket { - private int protocolVersion; - private String address; - private int serverPort; - private State nextState; - - @Override - public void readSelf(NetInputStream netStream) { - this.protocolVersion = netStream.readVarInt(); - this.address = netStream.readString(); - this.serverPort = netStream.readUnsignedShort(); - this.nextState = State.valueOf(netStream.readVarInt()); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/HeldItemChangePacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/HeldItemChangePacket.java deleted file mode 100644 index ca9f073..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/HeldItemChangePacket.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * DmitriyMX - * 2018-06-17 - */ -package mc.core.network.proto_1_12_2.packets; - -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; - -public class HeldItemChangePacket implements CSPacket { - private int slot; - - @Override - public void readSelf(NetInputStream netStream) { - this.slot = netStream.readShort(); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/JoinGamePacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/JoinGamePacket.java deleted file mode 100644 index 6000085..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/JoinGamePacket.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * DmitriyMX - * 2018-06-11 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; -import mc.core.player.PlayerMode; - -@NoArgsConstructor -@Setter -@ToString -public class JoinGamePacket implements SCPacket { - private int entityId; - private PlayerMode mode; - private int dimension; - private int difficulty; - private String levelType; - - @Override - public void writeSelf(NetOutputStream netStream) { - netStream.writeInt(entityId); - netStream.writeUnsignedByte(mode.getId()); - netStream.writeInt(dimension); - netStream.writeUnsignedByte(difficulty); - netStream.writeUnsignedByte(0); // Max Players, unused - netStream.writeString(levelType); - netStream.writeBoolean(false); // Reduced Debug Info - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/KeepAlivePacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/KeepAlivePacket.java deleted file mode 100644 index bb4ed23..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/KeepAlivePacket.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * DmitriyMX - * 2018-06-23 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; - -@AllArgsConstructor -@NoArgsConstructor -@Setter -@ToString -public class KeepAlivePacket implements CSPacket, SCPacket { - private long payload; - - @Override - public void readSelf(NetInputStream netStream) { - this.payload = netStream.readLong(); - } - - @Override - public void writeSelf(NetOutputStream netStream) { - netStream.writeLong(this.payload); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/LoginStartPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/LoginStartPacket.java deleted file mode 100644 index e3654c7..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/LoginStartPacket.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * DmitriyMX - * 2018-06-10 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.Getter; -import lombok.ToString; -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; - -@Getter -@ToString -public class LoginStartPacket implements CSPacket { - private String playerName; - - @Override - public void readSelf(NetInputStream netStream) { - this.playerName = netStream.readString(); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/LoginSuccessPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/LoginSuccessPacket.java deleted file mode 100644 index 376d7a1..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/LoginSuccessPacket.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * DmitriyMX - * 2018-06-11 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; - -import java.util.UUID; - -@AllArgsConstructor -@NoArgsConstructor -@Setter -@ToString -public class LoginSuccessPacket implements SCPacket { - private UUID uuid; - private String playerName; - - @Override - public void writeSelf(NetOutputStream netStream) { - netStream.writeString(uuid.toString()); - netStream.writeString(playerName); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PingPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PingPacket.java deleted file mode 100644 index 3f63723..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PingPacket.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * DmitriyMX - * 2018-06-10 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.ToString; -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; - -@ToString -public class PingPacket implements CSPacket, SCPacket { - private long payload; - - @Override - public void readSelf(NetInputStream netStream) { - this.payload = netStream.readLong(); - } - - @Override - public void writeSelf(NetOutputStream netStream) { - netStream.writeLong(payload); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacket.java deleted file mode 100644 index 6258bc5..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacket.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * DmitriyMX - * 2018-06-11 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; - -@NoArgsConstructor -@Getter -@Setter -@ToString -public class PlayerAbilitiesPacket implements SCPacket, CSPacket { - private static final byte $GOD_MODE_MASK = 0x01, - $FLYING_MASK = 0x02, - $CAN_FLY_MASK = 0x04, - $IDB_MASK = 0x08; - - private boolean godMode = false; - private boolean flying = false; - private boolean canFly = false; - private boolean instantDestroyBlocks = false; - private float flyingSpeed = 0.05f; - private float fieldOfView = flyingSpeed; - private float walkingSpeed; - - @Override - public void writeSelf(NetOutputStream netStream) { - byte flag = 0; - if (godMode) flag = (byte)(flag | $GOD_MODE_MASK); - if (flying) flag = (byte)(flag | $FLYING_MASK); - if (canFly) flag = (byte)(flag | $CAN_FLY_MASK); - if (instantDestroyBlocks) flag = (byte)(flag | $IDB_MASK); - - netStream.writeByte(flag); - netStream.writeFloat(flyingSpeed); - netStream.writeFloat(fieldOfView); - } - - @Override - public void readSelf(NetInputStream netStream) { - byte flag = netStream.readByte(); - godMode = (flag & $GOD_MODE_MASK) > 0; - canFly = (flag & $CAN_FLY_MASK) > 0; - flying = (flag & $FLYING_MASK) > 0; - instantDestroyBlocks = (flag & $IDB_MASK) > 0; - - flyingSpeed = netStream.readFloat(); - walkingSpeed = netStream.readFloat(); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java deleted file mode 100644 index b9c2a2e..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java +++ /dev/null @@ -1,30 +0,0 @@ -package mc.core.network.proto_1_12_2.packets; - -import lombok.Getter; -import lombok.ToString; -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; -import mc.core.network.proto_1_12_2.Direction; -import mc.core.network.proto_1_12_2.serializers.BlockLocationSerializer; -import mc.core.world.block.BlockLocation; - -@Getter -@ToString -public class PlayerBlockPlacementPacket implements CSPacket { - private BlockLocation location; - private Direction face; - /** true - main hand; false - off hand */ - private boolean hand; - private float cursorX, cursorY, cursorZ; - - @Override - public void readSelf(NetInputStream netStream) { - long compactedCoords = netStream.readLong(); - location = BlockLocationSerializer.fromLong(compactedCoords); - face = Direction.getById(netStream.readVarInt()); - hand = (netStream.readVarInt() == 1); - cursorX = netStream.readFloat(); - cursorY = netStream.readFloat(); - cursorZ = netStream.readFloat(); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java deleted file mode 100644 index 341ca67..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.core.network.proto_1_12_2.packets; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.ToString; -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; -import mc.core.network.proto_1_12_2.Direction; -import mc.core.network.proto_1_12_2.serializers.BlockLocationSerializer; -import mc.core.world.block.BlockLocation; - -import java.util.Arrays; - -@Getter -@ToString -public class PlayerDiggingPacket implements CSPacket { - @RequiredArgsConstructor - public enum Status { - STARTED_DIGGING(0), - CANCELLED_DIGGING(1), - FINISHED_DIGGING(2), - DROP_ITEM_STACK(3), - DROP_ITEM(4), - /* Indicates that the currently held item should have its - * state updated such as eating food, pulling back bows, - * using buckets, etc. Location is always set to 0/0/0, - * Face is always set to -Y. - */ - SHOOT_ARROW(5), - FINISH_EATING(5), - SWAP_ITEM_IN_HAND(6); - - public static Status getById(final int id) { - return Arrays.stream(Status.values()) - .filter(status -> status.id == id) - .findFirst() - .orElse(null); - } - - @Getter - private final int id; - } - - private Status status; - private BlockLocation location; - private Direction face; - - @Override - public void readSelf(NetInputStream netStream) { - status = Status.getById(netStream.readVarInt()); - long compactCoord = netStream.readLong(); - location = BlockLocationSerializer.fromLong(compactCoord); - face = Direction.getById(netStream.readByte()); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerListHeaderAndFooterPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerListHeaderAndFooterPacket.java deleted file mode 100644 index 20872c5..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerListHeaderAndFooterPacket.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * DmitriyMX - * 2018-07-11 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.Setter; -import lombok.ToString; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; -import mc.core.network.proto_1_12_2.serializers.TextMapper; -import mc.core.text.Text; - -@Setter -@ToString -public class PlayerListHeaderAndFooterPacket implements SCPacket { - // To remove the header/footer, send a empty translatable component: {"translate":""} - private Text header; - private Text footer; - - @Override - public void writeSelf(NetOutputStream netStream) { - if (header == null) { - netStream.writeString("{\"translate\":\"\"}"); - } else { - netStream.writeString(TextMapper.getInstance().mapping(header)); - } - - if (footer == null) { - netStream.writeString("{\"translate\":\"\"}"); - } else { - netStream.writeString(TextMapper.getInstance().mapping(footer)); - } - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerListItemPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerListItemPacket.java deleted file mode 100644 index 9eb85d3..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerListItemPacket.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * DmitriyMX - * 2018-07-11 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.*; -import lombok.extern.slf4j.Slf4j; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; -import mc.core.network.proto_1_12_2.serializers.TextMapper; -import mc.core.player.PlayerMode; -import mc.core.text.Text; - -import java.util.*; - -@Slf4j -@Getter -@Setter -@ToString -public class PlayerListItemPacket implements SCPacket { - @RequiredArgsConstructor - public enum Action { - ADD_PLAYER(0), - UPDATE_GAMEMODE(1), - UPDATE_LATENCY(2), - UPDATE_DISPLAY_NAME(3), - REMOVE_PLAYER(4); - - @Getter - private final int id; - } - - @Data - @ToString - public static class PlayerData { - private UUID uuid; - private String name; - private Properties properties = new Properties(); - private PlayerMode gameMode; - private int ping; - private boolean hasDisplayName = false; - private Text displayName; - } - - private Action action; - private List listPlayers = new ArrayList<>(); - - @Override - public void writeSelf(NetOutputStream netStream) { - netStream.writeVarInt(action.id); - netStream.writeVarInt(listPlayers.size()); - - for (PlayerData playerData : listPlayers) { - netStream.writeUUID(playerData.uuid); - - if (action == Action.ADD_PLAYER) { - netStream.writeString(playerData.name); - netStream.writeVarInt(playerData.properties.size()); - - for (Map.Entry entry : playerData.properties.entrySet()) { - netStream.writeString(entry.getKey().toString()); - netStream.writeString(entry.getValue().toString()); - netStream.writeBoolean(false); // Is Signed - } - } - - if (action == Action.ADD_PLAYER || action == Action.UPDATE_GAMEMODE) { - netStream.writeVarInt(playerData.gameMode.getId()); - } - - if (action == Action.ADD_PLAYER || action == Action.UPDATE_LATENCY) { - netStream.writeVarInt(playerData.ping); - } - - if (action == Action.ADD_PLAYER || action == Action.UPDATE_DISPLAY_NAME) { - netStream.writeBoolean(playerData.hasDisplayName); - if (playerData.hasDisplayName) { - netStream.writeString(TextMapper.getInstance().mapping(playerData.displayName)); - } - } - } - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerLookPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerLookPacket.java deleted file mode 100644 index b21e14b..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerLookPacket.java +++ /dev/null @@ -1,18 +0,0 @@ -package mc.core.network.proto_1_12_2.packets; - -import lombok.Getter; -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; - -@Getter -public class PlayerLookPacket implements CSPacket { - private float yaw, pitch; - private boolean onGround; // True if the client is on the ground, false otherwise - - @Override - public void readSelf(NetInputStream netStream) { - this.yaw = netStream.readFloat(); - this.pitch = netStream.readFloat(); - this.onGround = netStream.readBoolean(); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionAndLookPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionAndLookPacket.java deleted file mode 100644 index 3c783a7..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionAndLookPacket.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * DmitriyMX - * 2018-06-11 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; -import mc.core.EntityLocation; -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; - -@NoArgsConstructor -@Getter -@ToString -public class PlayerPositionAndLookPacket implements SCPacket, CSPacket { - @Setter - private EntityLocation location; - @Setter - private int teleportId; - private boolean onGround = false; - - @Override - public void writeSelf(NetOutputStream netStream) { - netStream.writeDouble(location.getX()); - netStream.writeDouble(location.getY()); - netStream.writeDouble(location.getZ()); - netStream.writeFloat(location.getYaw()); - netStream.writeFloat(location.getPitch()); - netStream.writeByte(0); // It's a bitfield, X/Y/Z/Y_ROT/X_ROT. If X is setXYZ, the x value is relative and not absolute. - /* X - 0x01 - * Y - 0x02 - * Z - 0x04 - * Y_ROT - 0x08 - * X_ROT - 0x10 - */ - netStream.writeVarInt(teleportId); // Client should confirm this packet with Teleport Confirm containing the same Teleport ID - } - - @Override - public void readSelf(NetInputStream netStream) { - this.location = new EntityLocation( - netStream.readDouble(), - netStream.readDouble(), - netStream.readDouble(), - netStream.readFloat(), - netStream.readFloat() - ); - - this.onGround = netStream.readBoolean(); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionPacket.java deleted file mode 100644 index 986af29..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionPacket.java +++ /dev/null @@ -1,19 +0,0 @@ -package mc.core.network.proto_1_12_2.packets; - -import lombok.Getter; -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; - -@Getter -public class PlayerPositionPacket implements CSPacket { - private double x, y, z; // Y - is feet position. Normally Head Y - +1.62d - private boolean onGround; // True if the client is on the ground, false otherwise - - @Override - public void readSelf(NetInputStream netStream) { - this.x = netStream.readDouble(); - this.y = netStream.readDouble(); - this.z = netStream.readDouble(); - this.onGround = netStream.readBoolean(); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PluginMessagePacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PluginMessagePacket.java deleted file mode 100644 index cef386f..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PluginMessagePacket.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * DmitriyMX - * 2018-06-11 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.*; -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; - -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@ToString -public class PluginMessagePacket implements SCPacket, CSPacket { - private String channelName; - private byte[] data; - - @Override - public void readSelf(NetInputStream netStream) { - channelName = netStream.readString(); - data = new byte[netStream.getDataSize() - channelName.getBytes().length - 1]; - netStream.readBytes(data); - } - - @Override - public void writeSelf(NetOutputStream netStream) { - netStream.writeString(channelName); - netStream.writeBytes(data); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/SpawnPositionPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/SpawnPositionPacket.java deleted file mode 100644 index 2b3eb6e..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/SpawnPositionPacket.java +++ /dev/null @@ -1,28 +0,0 @@ -package mc.core.network.proto_1_12_2.packets; - -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; -import mc.core.EntityLocation; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; - -@AllArgsConstructor -@NoArgsConstructor -@Setter -@ToString -public class SpawnPositionPacket implements SCPacket { - private EntityLocation location; - - private long location2long(EntityLocation entityLocation) { - return (((long) entityLocation.getBlockX() & 0x3FFFFFF) << 38) - | (((long) entityLocation.getBlockY() & 0x0000FFF) << 26) - | ((long) entityLocation.getBlockZ() & 0x3FFFFFF); - } - - @Override - public void writeSelf(NetOutputStream netStream) { - netStream.writeLong(location2long(location)); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/StatusRequestPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/StatusRequestPacket.java deleted file mode 100644 index b57c56a..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/StatusRequestPacket.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * DmitriyMX - * 2018-06-10 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.ToString; -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; - -@ToString -public class StatusRequestPacket implements CSPacket { - @Override - public void readSelf(NetInputStream netStream) { - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/StatusResponsePacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/StatusResponsePacket.java deleted file mode 100644 index 3505581..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/StatusResponsePacket.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * DmitriyMX - * 2018-06-10 - */ -package mc.core.network.proto_1_12_2.packets; - -import com.google.gson.JsonObject; -import lombok.Setter; -import lombok.ToString; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; - -@Setter -@ToString -public class StatusResponsePacket implements SCPacket { - public static final String NAME = "1.12.2"; - public static final int PROTOCOL = 340; - private static final JsonObject versionObj; - - static { - versionObj = new JsonObject(); - versionObj.addProperty("name", NAME); - versionObj.addProperty("protocol", PROTOCOL); - } - - private int maxOnline; - private int online; - private String description; - private byte[] faviconBase64; - - @Override - public void writeSelf(NetOutputStream netStream) { - JsonObject playersObj = new JsonObject(); - playersObj.addProperty("max", maxOnline); - playersObj.addProperty("online", online); - - JsonObject descriptionObj = new JsonObject(); - descriptionObj.addProperty("text", description); - - JsonObject rootObj = new JsonObject(); - rootObj.add("version", versionObj); - rootObj.add("players", playersObj); - rootObj.add("description", descriptionObj); - - if (faviconBase64 != null && faviconBase64.length > 0) { - rootObj.addProperty("favicon", - "data:image/png;base64," + new String(faviconBase64) - ); - } - - netStream.writeString(rootObj.toString()); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java deleted file mode 100644 index 4e1082e..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * DmitriyMX - * 2018-06-17 - */ -package mc.core.network.proto_1_12_2.packets; - -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; -import mc.core.world.block.BlockLocation; - -public class TabCompletePacket implements CSPacket { - private String text; - private boolean assumeCommand; - private boolean hasPosition; - private BlockLocation location; - - @Override - public void readSelf(NetInputStream netStream) { - this.text = netStream.readString(); - this.assumeCommand = netStream.readBoolean(); - this.hasPosition = netStream.readBoolean(); - - if (this.hasPosition) { - long compactValue = netStream.readLong(); - - double x = compactValue >> 38; - double y = (compactValue >> 26) & 0xFFF; - double z = compactValue << 38 >> 38; // is normal? - - this.location = new BlockLocation((int)x, (int)y, (int)z); //FIXME - } - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TeleportConfirmPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TeleportConfirmPacket.java deleted file mode 100644 index 356b6a3..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TeleportConfirmPacket.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * DmitriyMX - * 2018-06-12 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.Getter; -import lombok.ToString; -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; - -@Getter -@ToString -public class TeleportConfirmPacket implements CSPacket { - private int teleportId; - - @Override - public void readSelf(NetInputStream netStream) { - teleportId = netStream.readVarInt(); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TimeUpdatePacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TimeUpdatePacket.java deleted file mode 100644 index e17160e..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TimeUpdatePacket.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * DmitriyMX - * 2018-06-24 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; - -@AllArgsConstructor -@NoArgsConstructor -@Setter -@ToString -public class TimeUpdatePacket implements SCPacket { - private long time; - private long worldage; - - @Override - public void writeSelf(NetOutputStream netStream) { - netStream.writeLong(worldage); - netStream.writeLong(time); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TitlePacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TitlePacket.java deleted file mode 100644 index 9b357a8..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TitlePacket.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * DmitriyMX - * 2018-06-24 - */ -package mc.core.network.proto_1_12_2.packets; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import lombok.ToString; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; -import mc.core.network.proto_1_12_2.serializers.TextMapper; -import mc.core.text.Text; - -@RequiredArgsConstructor -@Setter -@ToString -public class TitlePacket implements SCPacket { - private static final int TICKS_PER_SEC = 20, - MIN_MS = (1000 / TICKS_PER_SEC); - - @RequiredArgsConstructor - public enum Action { - SET_TITLE(0), - SET_SUBTITLE(1), - SET_ACTION_BAR(2), - SET_DISPLAY_TIME(3), - HIDE(4), - RESET(5); - - @Getter - private final int id; - } - - private final Action action; - private Text text = null; - private Integer fadeInTime = null; - private Integer stayTime = null; - private Integer fadeOutTime = null; - - public TitlePacket(Action action, Object... values) { - if (values.length == 0 && (action != Action.HIDE && action != Action.RESET)) { - this.action = Action.HIDE; - return; - } - - this.action = action; - - switch (this.action) { - case SET_TITLE: - case SET_SUBTITLE: - case SET_ACTION_BAR: - if (values[0] == null) { - this.text = Text.of(); - } else if (values[0] instanceof Text) { - this.text = (Text) values[0]; - } else { - this.text = Text.of(values[0].toString()); - } - break; - case SET_DISPLAY_TIME: - if (values.length < 3) { - this.fadeInTime = 0; - this.stayTime = 0; - this.fadeOutTime = 0; - } else { - if (values[0] instanceof Integer) { - if (((Integer) values[0]) < MIN_MS) { - this.fadeInTime = 1; - } else { - this.fadeInTime = ((Integer) values[0]) / MIN_MS; - } - } else { - this.fadeInTime = 0; - } - - if (values[1] instanceof Integer) { - if (((Integer) values[1]) < MIN_MS) { - this.stayTime = 1; - } else { - this.stayTime = ((Integer) values[1]) / MIN_MS; - } - } else { - this.stayTime = 0; - } - - if (values[2] instanceof Integer) { - if (((Integer) values[2]) < MIN_MS) { - this.fadeOutTime = 1; - } else { - this.fadeOutTime = ((Integer) values[2]) / MIN_MS; - } - } else { - this.fadeOutTime = 0; - } - } - } - } - - @Override - public void writeSelf(NetOutputStream netStream) { - netStream.writeVarInt(action.id); - - switch (action) { - case SET_TITLE: - case SET_SUBTITLE: - case SET_ACTION_BAR: - netStream.writeString(TextMapper.getInstance().mapping(this.text)); - break; - case SET_DISPLAY_TIME: - netStream.writeInt(this.fadeInTime); - netStream.writeInt(this.stayTime); - netStream.writeInt(this.fadeOutTime); - } - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/UnloadChunkPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/UnloadChunkPacket.java deleted file mode 100644 index 5bcfe15..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/UnloadChunkPacket.java +++ /dev/null @@ -1,16 +0,0 @@ -package mc.core.network.proto_1_12_2.packets; - -import lombok.Setter; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; - -public class UnloadChunkPacket implements SCPacket { - @Setter - private int x, z; - - @Override - public void writeSelf(NetOutputStream netStream) { - netStream.writeInt(x); - netStream.writeInt(z); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/BlockLocationSerializer.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/BlockLocationSerializer.java deleted file mode 100644 index 9aea2f5..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/BlockLocationSerializer.java +++ /dev/null @@ -1,63 +0,0 @@ -package mc.core.network.proto_1_12_2.serializers; - -import mc.core.world.block.BlockLocation; - -import static com.google.common.math.IntMath.isPowerOfTwo; - -public class BlockLocationSerializer { - private static final int[] MULTIPLY_DE_BRUIJN_BIT_POSITION = new int[] {0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9}; - private static final int NUM_X_BITS = 1 + log2(smallestEncompassingPowerOfTwo(30000000)); - private static final int NUM_Z_BITS = NUM_X_BITS; - private static final int NUM_Y_BITS = 64 - NUM_X_BITS - NUM_Z_BITS; - private static final int Y_SHIFT = NUM_Z_BITS; - private static final int X_SHIFT = Y_SHIFT + NUM_Y_BITS; - private static final long X_MASK = (1L << NUM_X_BITS) - 1L; - private static final long Y_MASK = (1L << NUM_Y_BITS) - 1L; - private static final long Z_MASK = (1L << NUM_Z_BITS) - 1L; - - /* - * net.minecraft.util.math.MathHelper#log2(int) - */ - private static int log2(int value) { - return log2DeBruijn(value) - (isPowerOfTwo(value) ? 0 : 1); - } - - /* - * net.minecraft.util.math.MathHelper#log2DeBruijn(int) - */ - private static int log2DeBruijn(int value) { - value = isPowerOfTwo(value) ? value : smallestEncompassingPowerOfTwo(value); - return MULTIPLY_DE_BRUIJN_BIT_POSITION[(int)((long)value * 125613361L >> 27) & 31]; - } - - /* - * net.minecraft.util.math.MathHelper#smallestEncompassingPowerOfTwo(int) - */ - private static int smallestEncompassingPowerOfTwo(int value) { - int i = value - 1; - i = i | i >> 1; - i = i | i >> 2; - i = i | i >> 4; - i = i | i >> 8; - i = i | i >> 16; - return i + 1; - } - - public static long toLong(BlockLocation location) { - return ((long)location.getX() & X_MASK) << X_SHIFT | - ((long)location.getY() & Y_MASK) << Y_SHIFT | - ((long)location.getZ() & Z_MASK); - } - - public static BlockLocation fromLong(long value) { - BlockLocation location = BlockLocation.ZERO(); - fromLong(value, location); - return location; - } - - public static void fromLong(long value, BlockLocation location) { - location.setX((int)(value << 64 - X_SHIFT - NUM_X_BITS >> 64 - NUM_X_BITS)); - location.setY((int)(value << 64 - Y_SHIFT - NUM_Y_BITS >> 64 - NUM_Y_BITS)); - location.setZ((int)(value << 64 - NUM_Z_BITS >> 64 - NUM_Z_BITS)); - } -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/Mapper.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/Mapper.java deleted file mode 100644 index 167dc43..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/Mapper.java +++ /dev/null @@ -1,5 +0,0 @@ -package mc.core.network.proto_1_12_2.serializers; - -public interface Mapper { - T mapping(F fromObject); -} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/TextMapper.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/TextMapper.java deleted file mode 100644 index 2590d2f..0000000 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/TextMapper.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * DmitriyMX - * 2018-06-11 - */ -package mc.core.network.proto_1_12_2.serializers; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import lombok.Getter; -import mc.core.text.Text; - -public class TextMapper implements Mapper { - @Getter - private static TextMapper instance = new TextMapper(); - - private JsonObject serialize(Text text) { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("text", text.getContent()); - - if (text.getColor() != null) { - jsonObject.addProperty("color", text.getColor().getName()); - } - - if (text.getStyle() != null) { - if (text.getStyle().getBold().isPresent()) { - jsonObject.addProperty("bold", text.getStyle().getBold().get()); - } - if (text.getStyle().getItalic().isPresent()) { - jsonObject.addProperty("italic", text.getStyle().getItalic().get()); - } - if (text.getStyle().getObfuscated().isPresent()) { - jsonObject.addProperty("obfuscated", text.getStyle().getObfuscated().get()); - } - if (text.getStyle().getStrikethrough().isPresent()) { - jsonObject.addProperty("strikethrough", text.getStyle().getStrikethrough().get()); - } - if (text.getStyle().getUnderline().isPresent()) { - jsonObject.addProperty("underlined", text.getStyle().getUnderline().get()); - } - } - - if (text.getChildren() != null) { - JsonArray extra = new JsonArray(); - text.getChildren().forEach(child -> extra.add(serialize(child))); - jsonObject.add("extra", extra); - } - - return jsonObject; - } - - @Override - public String mapping(Text fromObject) { - return serialize(fromObject).toString(); - } -} diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/ByteArrayInputNetStream.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/ByteArrayInputNetStream.java deleted file mode 100644 index 4b0c90a..0000000 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/ByteArrayInputNetStream.java +++ /dev/null @@ -1,84 +0,0 @@ -package mc.core.network.proto_1_12_2; - -import lombok.extern.slf4j.Slf4j; - -import java.io.ByteArrayInputStream; -import java.io.IOException; - -@Slf4j -public class ByteArrayInputNetStream extends NetInputStream_p340 { - private ByteArrayInputStream bais; - - public ByteArrayInputNetStream(byte[] buff) { - bais = new ByteArrayInputStream(buff); - } - - @Override - public boolean readBoolean() { - return readByte() != 0; - } - - @Override - public byte readByte() { - return (byte) bais.read(); - } - - @Override - 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 - public int readUnsignedByte() { - return bais.read() & 0xFF; - } - - @Override - public int readUnsignedShort() { - throw new UnsupportedOperationException(); - } - - @Override - public short readShort() { - throw new UnsupportedOperationException(); - } - - @Override - public int readInt() { - int ch1 = bais.read(); - int ch2 = bais.read(); - int ch3 = bais.read(); - int ch4 = bais.read(); - if ((ch1 | ch2 | ch3 | ch4) < 0) return 0; - return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4)); - } - - @Override - public long readLong() { - throw new UnsupportedOperationException(); - } - - @Override - public float readFloat() { - return Float.intBitsToFloat(readInt()); - } - - @Override - public double readDouble() { - 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 deleted file mode 100644 index 7c3c32a..0000000 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/ByteArrayInputNetStreamTest.java +++ /dev/null @@ -1,135 +0,0 @@ -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; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class ByteArrayInputNetStreamTest { - private Random random; - - @BeforeEach - void before() { - random = new Random(System.currentTimeMillis()); - } - - @Test - void testReadBoolean() { - ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream(); - byteArrayOutputNetStream.writeBoolean(true); - - ByteArrayInputNetStream byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray()); - - assertTrue(byteArrayInputNetStream.readBoolean()); - - byteArrayOutputNetStream = new ByteArrayOutputNetStream(); - byteArrayOutputNetStream.writeBoolean(false); - - byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray()); - - assertFalse(byteArrayInputNetStream.readBoolean()); - } - - @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 testReadUnsignedByte() { - ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream(); - byteArrayOutputNetStream.writeUnsignedByte(30); - - ByteArrayInputNetStream byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray()); - - assertEquals(30, byteArrayInputNetStream.readUnsignedByte()); - - byteArrayOutputNetStream = new ByteArrayOutputNetStream(); - byteArrayOutputNetStream.writeUnsignedByte(130); - - byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray()); - - assertEquals(130, byteArrayInputNetStream.readUnsignedByte()); - } - - @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 deleted file mode 100644 index 3d34bb1..0000000 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/ByteArrayOutputNetStreamTest.java +++ /dev/null @@ -1,259 +0,0 @@ -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/ChunkDataPacketTest.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacketTest.java deleted file mode 100644 index 5f4e772..0000000 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacketTest.java +++ /dev/null @@ -1,312 +0,0 @@ -package mc.core.network.proto_1_12_2.packets; - -import com.flowpowered.nbt.*; -import javafx.util.Pair; -import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; -import mc.core.network.proto_1_12_2.packets.DumbChunkData.DumbChunkSection; -import mc.core.world.Biome; -import mc.core.world.block.*; -import mc.core.world.chunk.Chunk; -import mc.core.world.chunk.ChunkSection; -import org.apache.commons.io.IOUtils; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Stream; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Mockito.*; - -class ChunkDataPacketTest { - private static List> listOfParams; - - private static DumbChunkData createExpectedData(String xz) throws IOException { - InputStream inputStream = ChunkDataPacketTest.class.getResourceAsStream(String.format("ChunkDataPacket%s.bin", xz)); - assertNotNull(inputStream); - return DumbChunkData.ReadFromNetInputStream(IOUtils.toByteArray(inputStream)); - } - - private static Block createChestBlock00(BlockType type, int x, int y, int z, int height) { - final BlockLocation location = new BlockLocation(x, y, z); - - final CompoundMap compoundMap = new CompoundMap(); - compoundMap.put(new IntTag("x", x)); - compoundMap.put(new IntTag("y", (height << 4) + y)); - compoundMap.put(new IntTag("z", z)); - compoundMap.put(new StringTag("id", type.getNamedId())); - final CompoundTag compoundTag = new CompoundTag("", compoundMap); - - return new AbstractBlock(type) { - @Override - public BlockLocation getLocation() { - return location; - } - - @Override - public CompoundTag getNBTData() { - return compoundTag; - } - }; - } - - private static ChunkSection createChunkSection00(int height) { - final ChunkSection chunkSection = mock(ChunkSection.class); - when(chunkSection.getSkyLight(anyInt(), anyInt(), anyInt())).thenReturn(0); - when(chunkSection.getY()).thenReturn(height); - - if (height == 0) { - when(chunkSection.getBlock(anyInt(), anyInt(), anyInt())).thenAnswer(invocation -> { - Object[] args = invocation.getArguments(); - final int x = (int) args[0]; - final int y = (int) args[1]; - final int z = (int) args[2]; - - BlockFactory blockFactory = new BlockFactory(); - - if (y == 0) { - // @formatter:off - if (x == 0 && z == 0) return blockFactory.create(BlockType.STONE, x, y, z); - else if (x == 15 && z == 0) return blockFactory.create(BlockType.GRANITE, x, y, z); - else if (x == 0 && z == 15) return blockFactory.create(BlockType.POLISHED_GRANITE, x, y, z); - else if (x == 15 && z == 15) return blockFactory.create(BlockType.DIORITE, x, y, z); - else return blockFactory.create(BlockType.BEDROCK, x, y, z); - // @formatter:on - } else { - return blockFactory.create(BlockType.STONE, x, y, z); - } - }); - } else { - when(chunkSection.getBlock(anyInt(), anyInt(), anyInt())).thenAnswer(invocation -> { - Object[] args = invocation.getArguments(); - final int x = (int) args[0]; - final int y = (int) args[1]; - final int z = (int) args[2]; - - BlockFactory blockFactory = new BlockFactory(); - - // @formatter:off - if (y == 0) return blockFactory.create(BlockType.DIRT, x, y, z); - else if (y == 1) return blockFactory.create(BlockType.GRASS, x, y, z); - else if (y == 2) { - if ((x == 2 || x == 4 || x == 5) && z == 1) - return createChestBlock00(BlockType.CHEST_NORTH, x, y, z, height); - else if ((x == 2 || x == 3 || x == 5) && z == 6) - return createChestBlock00(BlockType.CHEST_SOUTH, x, y, z, height); - else if (x == 1 && (z == 2 || z == 3 || z == 5)) - return createChestBlock00(BlockType.CHEST_WEST, x, y, z, height); - else if (x == 6 && (z == 2 || z == 4 || z == 5)) - return createChestBlock00(BlockType.CHEST_EAST, x, y, z, height); - else - return blockFactory.create(BlockType.AIR, x, y, z); - } - else return blockFactory.create(BlockType.AIR, x, y, z); - // @formatter:on - }); - } - - return chunkSection; - } - - private static Chunk createMockChunk00() { - final ChunkSection chunkSection0 = createChunkSection00(0); - final ChunkSection chunkSection1 = createChunkSection00(1); - - final Chunk chunk = mock(Chunk.class); - when(chunk.getX()).thenReturn(0); - when(chunk.getZ()).thenReturn(0); - when(chunk.getBiome(anyInt(), anyInt())).thenReturn(Biome.PLAINS); - when(chunk.getChunkSection(0)).thenReturn(chunkSection0); - when(chunk.getChunkSection(1)).thenReturn(chunkSection1); - - return chunk; - } - - private static ChunkSection createChunkSection01() { - final ChunkSection chunkSection = mock(ChunkSection.class); - when(chunkSection.getSkyLight(anyInt(), anyInt(), anyInt())).thenReturn(0); - when(chunkSection.getY()).thenReturn(0); - - final List types = Arrays.asList( - BlockType.CLAY, - BlockType.ORE_REDSTONE, - BlockType.ORE_DIAMOND, - BlockType.OBSIDIAN, - BlockType.STONE_MOSS, - BlockType.SANDSTONE, - BlockType.ORE_LAPIS, - BlockType.WOOD_JUNGLE, - BlockType.WOOD_BIRCH, - BlockType.WOOD_SPRUCE, - BlockType.WOOD_OAK, - BlockType.ORE_COAL, - BlockType.ORE_IRON, - BlockType.ORE_GOLD, - BlockType.GRAVEL, - BlockType.SAND - ); - - when(chunkSection.getBlock(anyInt(), anyInt(), anyInt())).thenAnswer(invocation -> { - Object[] args = invocation.getArguments(); - final int x = (int) args[0]; - final int y = (int) args[1]; - final int z = (int) args[2]; - - BlockFactory blockFactory = new BlockFactory(); - - if (y == 0) { - // @formatter:off - if (x == 0 && z == 0) return blockFactory.create(BlockType.STONE, x, y, z); - else if (x == 15 && z == 0) return blockFactory.create(BlockType.GRANITE, x, y, z); - else if (x == 0 && z == 15) return blockFactory.create(BlockType.POLISHED_GRANITE, x, y, z); - else if (x == 15 && z == 15) return blockFactory.create(BlockType.DIORITE, x, y, z); - else return blockFactory.create(BlockType.BEDROCK, x, y, z); - // @formatter:on - } else if (y == 1) { - return blockFactory.create(types.get(x), x, y, z); - } else { - return blockFactory.create(BlockType.AIR, x, y, z); - } - }); - - return chunkSection; - } - - private static Chunk createMockChunk01() { - final ChunkSection chunkSection0 = createChunkSection01(); - - final Chunk chunk = mock(Chunk.class); - when(chunk.getX()).thenReturn(0); - when(chunk.getZ()).thenReturn(1); - when(chunk.getBiome(anyInt(), anyInt())).thenReturn(Biome.PLAINS); - when(chunk.getChunkSection(0)).thenReturn(chunkSection0); - - return chunk; - } - - private static void verifyMock(Chunk chunk) { - verify(chunk, atLeast(1)).getX(); - verify(chunk, atLeast(1)).getZ(); - verify(chunk, times(256)).getBiome(anyInt(), anyInt()); - verify(chunk, atLeast(2)).getChunkSection(anyInt()); - } - - private static DumbChunkData createActualData(Chunk chunk) { - ChunkDataPacket packet = new ChunkDataPacket(); - packet.setX(chunk.getX()); - packet.setZ(chunk.getZ()); - packet.setChunk(chunk); - packet.setInitChunk(true); - - ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); - packet.writeSelf(netStream); - - verifyMock(chunk); - - return DumbChunkData.ReadFromNetInputStream(netStream.toByteArray()); - } - - @BeforeAll - static void beforeClassTest() throws IOException { - listOfParams = Arrays.asList( - new Pair<>(createExpectedData("00"), createActualData(createMockChunk00())), - new Pair<>(createExpectedData("01"), createActualData(createMockChunk01())) - ); - } - - private static Stream streamArguments() { - return listOfParams.stream().map(pair -> Arguments.of(pair.getKey(), pair.getValue())); - } - - @DisplayName("testGeneral") - @ParameterizedTest(name = "[{index}] {0}") - @MethodSource("streamArguments") - void testGeneral(DumbChunkData expected, DumbChunkData actual) { - assertEquals(expected.getX(), actual.getX(), "X coord not equals"); - assertEquals(expected.getZ(), actual.getZ(), "Z coord not equals"); - assertEquals(expected.isInitChunk(), actual.isInitChunk(), "Flag init chunk not equals"); - assertEquals(expected.getBitMask(), actual.getBitMask(), "BitMask not equals"); - assertArrayEquals(expected.getBiomes(), actual.getBiomes(), "Biomes not equals"); - } - - @DisplayName("testNBT") - @ParameterizedTest(name = "[{index}] {0}") - @MethodSource("streamArguments") - void testNBT(DumbChunkData expected, DumbChunkData actual) { - assertEquals(expected.getNumberNBT(), actual.getNumberNBT()); - assertEquals(expected.getNbt().size(), actual.getNbt().size()); - - for (Tag tag : actual.getNbt()) { - assertTrue(expected.getNbt().contains(tag)); - } - } - - @DisplayName("testData (disabled light test)") - @ParameterizedTest(name = "[{index}] {0}") - @MethodSource("streamArguments") - void testData(DumbChunkData expected, DumbChunkData actual) { - assertEquals(expected.getData().length, actual.getData().length); - - for (int numberSection = 0; numberSection < expected.getData().length; numberSection++) { - final DumbChunkSection expectedSection = expected.getData()[numberSection]; - final DumbChunkSection actualSection = actual.getData()[numberSection]; - - // Palette - testPalette(expectedSection, actualSection, numberSection); - - // Data - testDataBlock(expectedSection, actualSection, numberSection); - - // Block and Sky light - // DISABLE // - //testLight(expectedSection, actualSection, numberSection); - } - } - - private void testPalette(DumbChunkSection expected, DumbChunkSection actual, int numberSection) { - assertEquals(expected.getBitsPerBlock(), actual.getBitsPerBlock()); - - if (expected.getPalette().size() > actual.getPalette().size()) { - for (int j = 0; j < actual.getPalette().size(); j++) { - assertTrue(expected.getPalette().contains( - actual.getPalette().get(j) - ), String.format("[%d] Palette not contains %s", numberSection, actual.getPalette().get(j))); - } - } else { - for (int j = 0; j < expected.getPalette().size(); j++) { - assertTrue(actual.getPalette().contains( - expected.getPalette().get(j) - ), String.format("[%d] Palette not contains %s", numberSection, actual.getPalette().get(j))); - } - } - } - - private void testDataBlock(DumbChunkSection expected, DumbChunkSection actual, int numberSection) { - assertEquals(expected.getData().size(), actual.getData().size()); - - for (int j = 0; j < expected.getData().size(); j++) { - assertEquals( - expected.getData().get(j), - actual.getData().get(j), - String.format("[%d] Data (blocks)", numberSection) - ); - } - } - - private void testLight(DumbChunkSection expected, DumbChunkSection actual, int numberSection) { - // Block light - assertArrayEquals(expected.getBlockLight(), actual.getBlockLight(), - String.format("[%d] Block light", numberSection)); - - // Sky light - assertArrayEquals(expected.getSkyLight(), actual.getSkyLight(), - String.format("[%d] Sky light", numberSection)); - } -} diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/DumbChunkData.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/DumbChunkData.java deleted file mode 100644 index bd472c8..0000000 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/DumbChunkData.java +++ /dev/null @@ -1,133 +0,0 @@ -package mc.core.network.proto_1_12_2.packets; - -import com.flowpowered.nbt.Tag; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; -import mc.core.network.proto_1_12_2.ByteArrayInputNetStream; -import mc.core.world.block.BlockType; - -import java.nio.ByteBuffer; -import java.nio.LongBuffer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@Getter -class DumbChunkData { - private int x; - private int z; - private boolean initChunk; - private int bitMask; - - private int sizeOfData; - private DumbChunkSection[] data; - private byte[] biomes; - - private int numberNBT; - private List> nbt; - - private static BlockType deserializeBlockState(int blockState) { - return BlockType.getByIdMeta(blockState >> 4, blockState & 0x0F); - } - - static DumbChunkData ReadFromNetInputStream(byte[] bytes) { - ByteArrayInputNetStream netStream = new ByteArrayInputNetStream(bytes); - - DumbChunkData dumbChunkData = new DumbChunkData(); - - dumbChunkData.x = netStream.readInt(); - dumbChunkData.z = netStream.readInt(); - dumbChunkData.initChunk = netStream.readBoolean(); - - dumbChunkData.bitMask = netStream.readVarInt(); - int countOfSections = 0; - for (int shift = 0; shift < 8; shift++) { - countOfSections += ((dumbChunkData.bitMask >> shift) & 0x01) > 0 ? 1 : 0; - } - - dumbChunkData.sizeOfData = netStream.readVarInt(); - - dumbChunkData.data = new DumbChunkSection[countOfSections]; - for (int c = 0; c < countOfSections; c++) { - DumbChunkSection dumbChunkSection = new DumbChunkSection(); - - dumbChunkSection.bitsPerBlock = netStream.readUnsignedByte(); - int sizePalette = netStream.readVarInt(); - dumbChunkSection.palette = new ArrayList<>(sizePalette); - for (int i = 0; i < sizePalette; i++) { - dumbChunkSection.palette.add(deserializeBlockState(netStream.readVarInt())); - } - - final byte[] rawData = new byte[netStream.readVarInt() * 8]; - netStream.readBytes(rawData); - LongBuffer data = ByteBuffer.wrap(rawData).asLongBuffer(); - - final int bitMask = (1 << dumbChunkSection.bitsPerBlock) - 1; - dumbChunkSection.data = new ArrayList<>(4096); - for (int y = 0; y < 16; y++) { - for (int z = 0; z < 16; z++) { - for (int x = 0; x < 16; x++) { - final int blockNumber = (((y << 4) + z) << 4) + x; - final int startLong = ( blockNumber * dumbChunkSection.bitsPerBlock ) / 64; - final int startOffset = ( blockNumber * dumbChunkSection.bitsPerBlock ) % 64; - final int endLong = ((blockNumber + 1) * dumbChunkSection.bitsPerBlock - 1) / 64; - - int idxBlock; - if (startLong == endLong) { - idxBlock = (int)(data.get(startLong) >> startOffset); - } else { - int endOffset = 64 - startOffset; - long mask = (1 << endOffset) - 1; - idxBlock = (int)(((data.get(startLong) >> startOffset) & mask) | data.get(endLong) << endOffset); - } - - dumbChunkSection.data.add(dumbChunkSection.palette.get(idxBlock & bitMask)); - } - } - } - - dumbChunkSection.blockLight = new byte[2048]; - netStream.readBytes(dumbChunkSection.blockLight); - dumbChunkSection.skyLight = new byte[2048]; - netStream.readBytes(dumbChunkSection.skyLight); - - dumbChunkData.data[c] = dumbChunkSection; - } - - dumbChunkData.biomes = new byte[256]; - netStream.readBytes(dumbChunkData.biomes); - - dumbChunkData.numberNBT = netStream.readVarInt(); - if (dumbChunkData.numberNBT > 0) { - dumbChunkData.nbt = new ArrayList<>(dumbChunkData.numberNBT); - for (int i = 0; i < dumbChunkData.numberNBT; i++) { - dumbChunkData.nbt.add(netStream.readNBT()); - } - } else { - dumbChunkData.nbt = Collections.emptyList(); - } - - return dumbChunkData; - } - - @Override - public String toString() { - return "DumbChunkData{" + - "x=" + x + - ", z=" + z + - '}'; - } - - @NoArgsConstructor(access = AccessLevel.PRIVATE) - @Getter - static class DumbChunkSection { - private int bitsPerBlock; - private List palette; - - private List data; - private byte[] blockLight; - private byte[] skyLight; - } -} 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 deleted file mode 100644 index 62d70c7..0000000 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacketTest.java +++ /dev/null @@ -1,41 +0,0 @@ -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; - -import java.util.Random; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class PlayerAbilitiesPacketTest { - private Random rnd = new Random(); - private PlayerAbilitiesPacket packet; - - @BeforeEach - void before() { - packet = new PlayerAbilitiesPacket(); - packet.setGodMode(rnd.nextBoolean()); - packet.setFlying(rnd.nextBoolean()); - packet.setCanFly(rnd.nextBoolean()); - packet.setInstantDestroyBlocks(rnd.nextBoolean()); - packet.setFlyingSpeed(rnd.nextFloat()); - } - - @Test - void writePacket() { - ByteArrayOutputNetStream netOutputStream = new ByteArrayOutputNetStream(); - packet.writeSelf(netOutputStream); - - ByteArrayInputNetStream netInputStream = new ByteArrayInputNetStream(netOutputStream.toByteArray()); - PlayerAbilitiesPacket outPkt = new PlayerAbilitiesPacket(); - outPkt.readSelf(netInputStream); - - assertEquals(packet.isGodMode(), outPkt.isGodMode(), "god mode"); - assertEquals(packet.isFlying(), outPkt.isFlying(), "flying"); - assertEquals(packet.isCanFly(), outPkt.isCanFly(), "can fly"); - assertEquals(packet.isInstantDestroyBlocks(), outPkt.isInstantDestroyBlocks(), "instant destroy block"); - assertEquals(packet.getFlyingSpeed(), outPkt.getFlyingSpeed(), 0.00001f, "flying speed"); - } -} diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/serializers/BlockLocationSerializerTest.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/serializers/BlockLocationSerializerTest.java deleted file mode 100644 index dda7500..0000000 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/serializers/BlockLocationSerializerTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package mc.core.network.proto_1_12_2.serializers; - -import mc.core.world.block.BlockLocation; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.concurrent.ThreadLocalRandom; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class BlockLocationSerializerTest { - private static final ThreadLocalRandom rnd = ThreadLocalRandom.current(); - private static final int minI = 0, maxI = 10; - private int x, y, z; - - @BeforeEach - void before() { - x = rnd.nextInt(minI, maxI); - y = rnd.nextInt(minI, maxI); - z = rnd.nextInt(minI, maxI); - } - - @Test - void serialize() { - BlockLocation location = new BlockLocation(x, y, z); - final long serializedCoords = BlockLocationSerializer.toLong(location); - - BlockLocation deserLoc = BlockLocationSerializer.fromLong(serializedCoords); - - assertEquals(location, deserLoc); - } -} \ No newline at end of file diff --git a/proto_1.12.2/src/test/resources/mc/core/network/proto_1_12_2/packets/ChunkDataPacket00.bin b/proto_1.12.2/src/test/resources/mc/core/network/proto_1_12_2/packets/ChunkDataPacket00.bin deleted file mode 100644 index 61255440f0b35fd862ef4fc67d49fe87dde2c6b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13182 zcmeI%Pin$I6vy#5Gs#$_;GbSVOAjFJ&Q;Ig3AFw}7m8RHZC75y>-py#bx4BZP#J;{ zsD9rfj~RIUGM{WhB9fLe>yOAvbzZAKt@P`2Qq8m#ckQH6FEt7Q1Q0*~0R##c$X*I) z2q1s}0tg_000IagfB*srAaKJ1QAt{jjosP3-P)Bd{QH9!SlkbYzmv|M^qWbRvB-P2 zpLDlQ>bTz>Wjizk5I_I{1Q0*~0R#|0009IL_zwcV6aok!fB*t_D4_1V9?K#|)R%i# zQLcZxUU&V+b^RcEGLXu2G8^_6z0tDW9}hp5a+=WIgbGgh874RpU7ZmJGveGC{>g1H X!+IHEUE@vU&xnF|<)1u%#wFbYt0xo9 diff --git a/proto_1.12.2/src/test/resources/mc/core/network/proto_1_12_2/packets/ChunkDataPacket01.bin b/proto_1.12.2/src/test/resources/mc/core/network/proto_1_12_2/packets/ChunkDataPacket01.bin deleted file mode 100644 index 6c12d37e60387af6882e5609c780d73a98f59f3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6967 zcmeI%u?@m75Cu@*Awr-sAVsvPk_qUs*d`4lxX1to7Dz#blpT@{G6EH4#0C)ivH}7r z|BA2E-AR^SYo$UF(S1Kpls>ID+iK;OcHtr$*;&U|zVMkHTYk}lI%=rlG&Z_S<3mWZ zD~CR`l1BTbAB2h5&{r_00bZa m0SG_<0uX=z1Rwwb2teRp1>PtKKmY;|fWQO=hVP ATTR_STATE = AttributeKey.newInstance("ATTR_STATE"); - public static final AttributeKey ATTR_PLAYER = AttributeKey.newInstance("ATTR_PLAYER"); - - @Autowired - private ApplicationContext context; - @Autowired - private KeepAliveThread keepAliveThread; - @Setter - private String host; - @Setter - private int port; - @Setter - private int workerGroupCount = 0; - private EventLoopGroup bossGroup, workerGroup; - - private ChannelInitializer buildChannelInitializer() { - return new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel socketChannel) { - Map beans = context.getBeansOfType(ChannelHandler.class); - beans.forEach(socketChannel.pipeline()::addLast); - } - }; - } - - private ServerBootstrap buildServerBootstrap() { - ServerBootstrap bootstrap = new ServerBootstrap(); - - bootstrap.group(bossGroup, workerGroup) - .channel(NioServerSocketChannel.class) - .childHandler(buildChannelInitializer()); - - return bootstrap; - } - - @Override - public void start() throws StartServerException { - log.info("Use protocol {}", StatusResponsePacket.NAME); - - EventBus.getInstance().registerSubscribes(new PlayerEventListener()); - - bossGroup = new NioEventLoopGroup(1); - workerGroup = new NioEventLoopGroup(workerGroupCount); - - ServerBootstrap serverBootstrap = buildServerBootstrap(); - - log.info("Start server: {}:{}", host, port); - try { - ChannelFuture channelFuture = serverBootstrap.bind(host, port).sync(); - keepAliveThread.start(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - throw new StartServerException(e); - } - } - - @Override - public void stop() { - log.info("Server shutdown"); - keepAliveThread.interrupt(); - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } -} diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketDecoder.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketDecoder.java deleted file mode 100644 index 585a88d..0000000 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketDecoder.java +++ /dev/null @@ -1,66 +0,0 @@ -package mc.core.network.proto_1_12_2.netty; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ReplayingDecoder; -import lombok.extern.slf4j.Slf4j; -import mc.core.network.CSPacket; -import mc.core.network.NetInputStream; -import mc.core.network.proto_1_12_2.State; -import mc.core.network.proto_1_12_2.netty.wrappers.WrapperNetInputStream; - -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_STATE; - -@Slf4j -public class PacketDecoder extends ReplayingDecoder { - - @Override - public void channelActive(ChannelHandlerContext ctx) { - ctx.channel().attr(ATTR_STATE).set(State.HANDSHAKE); - ctx.fireChannelActive(); - } - - @Override - public void channelInactive(ChannelHandlerContext ctx) { - ctx.channel().attr(ATTR_STATE).set(null); - ctx.fireChannelInactive(); - } - - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { - State state = ctx.channel().attr(ATTR_STATE).get(); - NetInputStream netStream = new WrapperNetInputStream(in); - - int packetSize = netStream.readVarInt(); - log.debug("Packet size: {}", packetSize); - int leftDataPacket = packetSize; - - final AtomicInteger countReadBytes = new AtomicInteger(0); - int packetId = netStream.readVarInt(countReadBytes); - String hexPacketId = Integer.toHexString(packetId).toUpperCase(); - if (hexPacketId.length() == 1) hexPacketId = "0" + hexPacketId; - log.debug("Packet id: 0x{}", hexPacketId); - leftDataPacket = leftDataPacket - countReadBytes.get(); - - Class packetClass = state.getClientSidePacket(packetId); - if (packetClass == null) { - log.warn("Unknown packet: {}:0x{}", state.name(), hexPacketId); - in.skipBytes(leftDataPacket); - } else { - netStream.setDataSize(leftDataPacket); - CSPacket packet = packetClass.newInstance(); - try { - packet.readSelf(netStream); - log.debug("Known packet: {}:{}", state.name(), packet.toString()); - out.add(packet); - } catch (Exception e) { - log.warn("Known packet: {}:{}. But throw exception. See debug log.", state.name(), packet.getClass().getSimpleName()); - log.debug("Read packet", e); - in.skipBytes(leftDataPacket); - } - } - } -} diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketEncoder.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketEncoder.java deleted file mode 100644 index 9dbc4a9..0000000 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketEncoder.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * DmitriyMX - * 2018-06-10 - */ -package mc.core.network.proto_1_12_2.netty; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToByteEncoder; -import lombok.extern.slf4j.Slf4j; -import mc.core.network.NetOutputStream; -import mc.core.network.SCPacket; -import mc.core.network.proto_1_12_2.State; -import mc.core.network.proto_1_12_2.netty.wrappers.WrapperNetOutputStream; - -import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_STATE; -import static org.slf4j.helpers.MessageFormatter.format; - -@Slf4j -public class PacketEncoder extends MessageToByteEncoder { - - @Override - protected void encode(ChannelHandlerContext ctx, SCPacket packet, ByteBuf out) { - State state = ctx.channel().attr(ATTR_STATE).get(); - Integer id = state.getServerSidePacket(packet.getClass()); - if (id == null) { - log.error("Not defined ID packet: {}:{}", state.name(), packet.getClass()); - return; - } - - log.debug("Send {}:{}", state, packet); - - try { - NetOutputStream netStream = new WrapperNetOutputStream(out); - netStream.writeVarInt(id); - packet.writeSelf(netStream); - } catch (Throwable t) { - log.error(format("Error encoding packet {}:{}", state, packet).getMessage(), t); - } - } -} diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketHandler.java deleted file mode 100644 index 01b44ca..0000000 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketHandler.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * DmitriyMX - * 2018-06-10 - */ -package mc.core.network.proto_1_12_2.netty; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import lombok.extern.slf4j.Slf4j; -import mc.core.chat.ChatProcessor; -import mc.core.network.CSPacket; -import mc.core.network.proto_1_12_2.State; -import mc.core.network.proto_1_12_2.netty.handlers.*; -import mc.core.player.Player; -import mc.core.player.PlayerManager; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.ComponentScan; - -import javax.annotation.PostConstruct; -import java.util.Collection; - -import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_PLAYER; -import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_STATE; - -@Slf4j -@ComponentScan("mc.core.network.proto_1_12_2.netty.handlers") -public class PacketHandler extends SimpleChannelInboundHandler { - @Autowired - private ApplicationContext applicationContext; - @Autowired - private PlayerManager playerManager; - @Autowired - private ChatProcessor chatProcessor; - private ImmutableMap> handlersMap = ImmutableMap.of(); - - @PostConstruct - public void init() { - ImmutableMap.Builder> builder = ImmutableMap.builder(); - - Collection beans1 = applicationContext.getBeansOfType(HandshakeStateHandler.class).values(); - builder.put(State.HANDSHAKE, ImmutableList.copyOf(beans1)); - - Collection beans2 = applicationContext.getBeansOfType(StatusStateHandler.class).values(); - builder.put(State.STATUS, ImmutableList.copyOf(beans2)); - - Collection beans3 = applicationContext.getBeansOfType(LoginStateHandler.class).values(); - builder.put(State.LOGIN, ImmutableList.copyOf(beans3)); - - Collection beans4 = applicationContext.getBeansOfType(PlayStateHandler.class).values(); - builder.put(State.PLAY, ImmutableList.copyOf(beans4)); - - this.handlersMap = builder.build(); - } - - @Override - public void channelInactive(ChannelHandlerContext ctx) throws Exception { - super.channelInactive(ctx); - Player player = ctx.channel().attr(ATTR_PLAYER).get(); - if (player != null) { - playerManager.leftServer(player); - player.setChannel(null); - } - ctx.channel().attr(ATTR_PLAYER).set(null); - } - - @Override - protected void channelRead0(ChannelHandlerContext ctx, CSPacket packet) throws Exception { - ImmutableList stateHandlers = this.handlersMap.get(ctx.channel().attr(ATTR_STATE).get()); - for (StateHandler handler : stateHandlers) { - handler.handle(ctx.channel(), packet); - } - } -} diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketPostEncoder.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketPostEncoder.java deleted file mode 100644 index 7e7b848..0000000 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketPostEncoder.java +++ /dev/null @@ -1,38 +0,0 @@ -package mc.core.network.proto_1_12_2.netty; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToByteEncoder; -import lombok.extern.slf4j.Slf4j; -import mc.core.network.proto_1_12_2.netty.wrappers.WrapperNetOutputStream; - -/** - * Подсчет размера отправляемого пакета - */ -@Slf4j -public class PacketPostEncoder extends MessageToByteEncoder { - - private static int getVarIntSize(int input) { - for (int i = 1; i < 5; ++i) { - if ((input & -1 << i * 7) == 0) { - return i; - } - } - - return 5; - } - - @Override - protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) { - final int pktSize = msg.readableBytes(); - final int sizeOfPktSize = getVarIntSize(pktSize); - - if (sizeOfPktSize > 3) { - log.warn("unable to fit {} into {}", pktSize, 3); - } - - out.ensureWritable(sizeOfPktSize + pktSize); - (new WrapperNetOutputStream(out)).writeVarInt(pktSize); - out.writeBytes(msg); - } -} diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java deleted file mode 100644 index 5602221..0000000 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java +++ /dev/null @@ -1,70 +0,0 @@ -package mc.core.network.proto_1_12_2.netty; - -import lombok.extern.slf4j.Slf4j; -import mc.core.eventbus.Subscriber; -import mc.core.eventbus.events.SC_ChunkLoadEvent; -import mc.core.eventbus.events.SC_ChunkUnloadEvent; -import mc.core.eventbus.events.SC_PlayerMoveEvent; -import mc.core.network.NetChannel; -import mc.core.network.proto_1_12_2.TeleportManager; -import mc.core.network.proto_1_12_2.packets.ChunkDataPacket; -import mc.core.network.proto_1_12_2.packets.PlayerPositionAndLookPacket; -import mc.core.network.proto_1_12_2.packets.UnloadChunkPacket; -import mc.core.utils.CompactedCoords; -import mc.core.world.chunk.Chunk; - -@Slf4j -public class PlayerEventListener { - @Subscriber - public void playerMoveEventHandler(SC_PlayerMoveEvent event) { - log.debug("(SC) playerMoveEventHandler()"); - PlayerPositionAndLookPacket packet = new PlayerPositionAndLookPacket(); - packet.setLocation(event.getNewLocation()); - int tpId = TeleportManager.getInstance().append(event.getPlayer(), event.getNewLocation()); - packet.setTeleportId(tpId); - - event.getPlayer().getChannel().writeAndFlush(packet); - } - - @Subscriber - public void playerChunkLoadHandler(SC_ChunkLoadEvent event) { - if (event.getNeedLoadChunks().size() == 0) return; - - final NetChannel channel = event.getPlayer().getChannel(); - - for(Integer compressXZ : event.getNeedLoadChunks()) { - int[] xz = CompactedCoords.uncompressXZ(compressXZ); - Chunk chunk = event.getPlayer().getWorld().getChunk(xz[0], xz[1]); - if (chunk == null) continue; - - ChunkDataPacket packet = new ChunkDataPacket(); - packet.setX(xz[0]); - packet.setZ(xz[1]); - packet.setInitChunk(true); - packet.setChunk(chunk); - - channel.write(packet); - } - - channel.flush(); - } - - @Subscriber - public void playerChunkUnloadHandler(SC_ChunkUnloadEvent event) { - if (event.getNeedUnloadChunks().size() == 0) return; - - final NetChannel channel = event.getPlayer().getChannel(); - - for(Integer compressXZ : event.getNeedUnloadChunks()) { - int[] xz = CompactedCoords.uncompressXZ(compressXZ); - - UnloadChunkPacket packet = new UnloadChunkPacket(); - packet.setX(xz[0]); - packet.setZ(xz[1]); - - channel.write(packet); - } - - channel.flush(); - } -} diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/AbstractStateHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/AbstractStateHandler.java deleted file mode 100644 index 5cb51d4..0000000 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/AbstractStateHandler.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * DmitriyMX - * 2018-06-23 - */ -package mc.core.network.proto_1_12_2.netty.handlers; - -import com.google.common.collect.ImmutableMap; -import io.netty.channel.Channel; -import lombok.extern.slf4j.Slf4j; -import mc.core.network.CSPacket; - -import javax.annotation.PostConstruct; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.lang.reflect.Method; -import java.util.function.Function; -import java.util.stream.Stream; - -import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_STATE; - -@Slf4j -public abstract class AbstractStateHandler implements StateHandler { - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.METHOD) - protected @interface Handler { - } - - private ImmutableMap, Method> methods = ImmutableMap.of(); - - @PostConstruct - protected void init() { - this.methods = Stream.of(this.getClass().getDeclaredMethods()) - .filter(method -> method.isAnnotationPresent(Handler.class) - && method.getParameterCount() == 2 - && method.getParameterTypes()[0].isAssignableFrom(Channel.class) - && CSPacket.class.isAssignableFrom(method.getParameterTypes()[1])) - .collect(ImmutableMap.toImmutableMap( - method -> method.getParameterTypes()[1], - Function.identity())); - } - - @Override - public void handle(Channel channel, CSPacket packet) throws Exception { - if (this.methods.containsKey(packet.getClass())) { - this.methods.get(packet.getClass()).invoke(this, channel, packet); - } else { - log.trace("No def listener of {}:{}", - channel.attr(ATTR_STATE).get(), - packet.getClass().getSimpleName()); - } - } -} diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/HandshakeHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/HandshakeHandler.java deleted file mode 100644 index 3ff9af1..0000000 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/HandshakeHandler.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * DmitriyMX - * 2018-06-23 - */ -package mc.core.network.proto_1_12_2.netty.handlers; - -import io.netty.channel.Channel; -import lombok.extern.slf4j.Slf4j; -import mc.core.network.proto_1_12_2.State; -import mc.core.network.proto_1_12_2.packets.HandshakePacket; -import org.springframework.stereotype.Component; - -import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_STATE; - -@Slf4j -@Component -public class HandshakeHandler extends AbstractStateHandler implements HandshakeStateHandler { - @Handler - public void onHandshake(Channel channel, HandshakePacket packet) { - if (packet.getNextState().equals(State.UNKNOWN)) return; - //FIXME обрати внимание: хацкер может намеренно передать state:03 и тогда может начатся пиздец - log.debug("New state: {}", packet.getNextState()); - channel.attr(ATTR_STATE).set(packet.getNextState()); - } -} diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/HandshakeStateHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/HandshakeStateHandler.java deleted file mode 100644 index 1bf92e7..0000000 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/HandshakeStateHandler.java +++ /dev/null @@ -1,11 +0,0 @@ -/* - * DmitriyMX - * 2018-06-23 - */ -package mc.core.network.proto_1_12_2.netty.handlers; - -/** - * Marker interface - */ -public interface HandshakeStateHandler extends StateHandler { -} 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 deleted file mode 100644 index c0ced7f..0000000 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java +++ /dev/null @@ -1,127 +0,0 @@ -package mc.core.network.proto_1_12_2.netty.handlers; - -import io.netty.channel.Channel; -import io.netty.channel.ChannelFutureListener; -import mc.core.eventbus.EventBus; -import mc.core.eventbus.events.CS_PlayerMoveEvent; -import mc.core.network.proto_1_12_2.State; -import mc.core.network.proto_1_12_2.TeleportManager; -import mc.core.network.proto_1_12_2.netty.KeepAliveThread; -import mc.core.network.proto_1_12_2.netty.wrappers.WrapperNetChannel; -import mc.core.network.proto_1_12_2.packets.*; -import mc.core.player.Player; -import mc.core.player.PlayerManager; -import mc.core.player.PlayerMode; -import mc.core.text.Text; -import mc.core.text.TextColor; -import mc.core.text.TextStyle; -import mc.core.world.World; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_PLAYER; -import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_STATE; - -@Component -public class LoginHandler extends AbstractStateHandler implements LoginStateHandler { - @Autowired - private PlayerManager playerManager; - @Autowired - private KeepAliveThread keepAliveThread; - @Autowired - private World world; - - @Handler - public void onLoginStart(Channel channel, LoginStartPacket packet) { - Player player = playerManager.getPlayer(packet.getPlayerName()); - if (player != null) { - channel.writeAndFlush(new DisconnectPacket( - Text.builder("Player \"") - .append(Text.of(packet.getPlayerName(), TextColor.YELLOW)) - .append(Text.of("\" is online", TextColor.WHITE)) - .build())) - .addListener(ChannelFutureListener.CLOSE); - } else { - player = playerManager.getOfflinePlayer(packet.getPlayerName()); - - if (player == null) { - player = playerManager.createPlayer( - packet.getPlayerName(), - world.getSpawn(), - world - ); - - if (player == null) { - channel.writeAndFlush(new DisconnectPacket( - Text.of("Internal server error: can't create new player")) - ).addListener(ChannelFutureListener.CLOSE); - return; - } - } - - channel.writeAndFlush(new LoginSuccessPacket( - player.getUuid(), - packet.getPlayerName())); - channel.attr(ATTR_PLAYER).set(player); - channel.attr(ATTR_STATE).set(State.PLAY); - - // Join Game - JoinGamePacket pkt1 = new JoinGamePacket(); - pkt1.setEntityId(player.getId()); //TODO отделить системный ID от EntityID - pkt1.setMode(PlayerMode.CREATIVE); //TODO перенести в Config - pkt1.setDimension(0/*Overworld*/); //TODO перенести в World - pkt1.setDifficulty(0/*Peaceful*/); //TODO перенести в Config - pkt1.setLevelType(world.getType().getName()); - channel.write(pkt1); - - // Spawn Position - SpawnPositionPacket pkt2 = new SpawnPositionPacket(); - pkt2.setLocation(world.getSpawn()); - channel.write(pkt2); - - // Player Abilities - PlayerAbilitiesPacket pkt3 = new PlayerAbilitiesPacket(); //TODO перенести в Player - pkt3.setCanFly(true); - pkt3.setFlying(true); - pkt3.setGodMode(true); - pkt3.setInstantDestroyBlocks(true); - channel.write(pkt3); - - channel.flush(); - - // Player Position And Look - PlayerPositionAndLookPacket pkt4 = new PlayerPositionAndLookPacket(); - pkt4.setLocation(player.getLocation()); - pkt4.setTeleportId(TeleportManager.getInstance().append(player, player.getLocation())); - channel.writeAndFlush(pkt4); - - player.setChannel(new WrapperNetChannel(channel)); - - // Send items - //TODO обновление должно приходить всем игрокам на сервере - PlayerListItemPacket pkt5 = new PlayerListItemPacket(); - pkt5.setAction(PlayerListItemPacket.Action.ADD_PLAYER); - PlayerListItemPacket.PlayerData playerData = new PlayerListItemPacket.PlayerData(); - playerData.setUuid(player.getUuid()); - playerData.setName(player.getName()); - playerData.setGameMode(PlayerMode.CREATIVE); - playerData.setPing(0); - playerData.setHasDisplayName(true); - playerData.setDisplayName(Text.builder() - .append(Text.of(TextColor.RED, TextStyle.BOLD, player.getName().substring(0,1))) - .append(Text.of(TextColor.WHITE, player.getName().substring(1))) - .build() - ); - pkt5.getListPlayers().add(playerData); - channel.writeAndFlush(pkt5); - - playerManager.joinServer(player); - keepAliveThread.notifyLock(); - - CS_PlayerMoveEvent event = new CS_PlayerMoveEvent(player, player.getLocation()); - event.setNewLocation(player.getLocation()); - event.setRecalcChunk(true); - EventBus.getInstance().post(event); - } - } -} diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginStateHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginStateHandler.java deleted file mode 100644 index a51a626..0000000 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginStateHandler.java +++ /dev/null @@ -1,11 +0,0 @@ -/* - * DmitriyMX - * 2018-06-23 - */ -package mc.core.network.proto_1_12_2.netty.handlers; - -/** - * Marker interface - */ -public interface LoginStateHandler extends StateHandler { -} diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java deleted file mode 100644 index c1675ba..0000000 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package mc.core.network.proto_1_12_2.netty.handlers; - -import io.netty.channel.Channel; -import lombok.extern.slf4j.Slf4j; -import mc.core.EntityLocation; -import mc.core.chat.ChatProcessor; -import mc.core.eventbus.EventBus; -import mc.core.eventbus.events.CS_PlayerMoveEvent; -import mc.core.network.proto_1_12_2.TeleportManager; -import mc.core.network.proto_1_12_2.packets.*; -import mc.core.player.Player; -import mc.core.player.PlayerSettings; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_PLAYER; - -@Slf4j -@Component -public class PlayHandler extends AbstractStateHandler implements PlayStateHandler { - @Autowired - private ChatProcessor chatProcessor; - - private TeleportManager teleport = TeleportManager.getInstance(); - - @Handler - public void onClientSettings(Channel channel, ClientSettingsPacket packet) { - Player player = channel.attr(ATTR_PLAYER).get(); - - player.getSettings().setLocate(packet.getLocale()); - player.getSettings().setViewDistance(packet.getViewDistance()); - player.getSettings().setChatMode(PlayerSettings.ChatMode.getById(packet.getChatMode())); - player.getSettings().setChatColors(packet.isChatColors()); - - player.getSettings().setCapeEnabled(packet.isCapeEnabled()); - player.getSettings().setJacketEnabled(packet.isJacketEnabled()); - player.getSettings().setLeftSleeveEnabled(packet.isLeftSleeveEnabled()); - player.getSettings().setRightSleeveEnabled(packet.isRightSleeveEnabled()); - player.getSettings().setLeftPantsLegEnabled(packet.isLeftPantsLegEnabled()); - player.getSettings().setRightPantsLegEnabled(packet.isRightPantsLegEnabled()); - player.getSettings().setHatEnabled(packet.isHatEnabled()); - - player.getSettings().setMainHand(PlayerSettings.Hand.getById(packet.getMainHand())); - } - - @Handler - public void onTeleportConfirm(Channel channel, TeleportConfirmPacket packet) { - this.teleport.apply(packet.getTeleportId()); - } - - @Handler - public void onPositionAndLook(Channel channel, PlayerPositionAndLookPacket packet) { - Player player = channel.attr(ATTR_PLAYER).get(); - player.getLocation().set(packet.getLocation()); - } - - @Handler - public void onChat(Channel channel, ChatMessageClientPacket packet) { - chatProcessor.process( - channel.attr(ATTR_PLAYER).get(), - packet.getMessage() - ); - } - - @Handler - public void onPlayerMove(Channel channel, PlayerPositionPacket packet) { - log.debug("(Netty) onPlayerMove()"); - Player player = channel.attr(ATTR_PLAYER).get(); - - if (player.getLocation().getX() == packet.getX() && - player.getLocation().getY() == packet.getY() && - player.getLocation().getZ() == packet.getZ()) { - return; - } - - CS_PlayerMoveEvent event = new CS_PlayerMoveEvent(player, player.getLocation().clone()); - event.setNewLocation(new EntityLocation( - packet.getX(), packet.getY(), packet.getZ(), - player.getLocation().getYaw(), - player.getLocation().getPitch() - )); - EventBus.getInstance().post(event); - } - - @Handler - public void onPlayerLook(Channel channel, PlayerLookPacket packet) { - Player player = channel.attr(ATTR_PLAYER).get(); - player.getLocation().setYawPitch(packet.getYaw(), packet.getPitch()); - } -} diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayStateHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayStateHandler.java deleted file mode 100644 index 8f05c0f..0000000 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayStateHandler.java +++ /dev/null @@ -1,11 +0,0 @@ -/* - * DmitriyMX - * 2018-06-23 - */ -package mc.core.network.proto_1_12_2.netty.handlers; - -/** - * Marker interface - */ -public interface PlayStateHandler extends StateHandler { -} diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/StateHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/StateHandler.java deleted file mode 100644 index c853d62..0000000 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/StateHandler.java +++ /dev/null @@ -1,12 +0,0 @@ -/* - * DmitriyMX - * 2018-06-23 - */ -package mc.core.network.proto_1_12_2.netty.handlers; - -import io.netty.channel.Channel; -import mc.core.network.CSPacket; - -public interface StateHandler { - void handle(Channel channel, CSPacket packet) throws Exception; -} diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/StatusHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/StatusHandler.java deleted file mode 100644 index 10c48fc..0000000 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/StatusHandler.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * DmitriyMX - * 2018-06-23 - */ -package mc.core.network.proto_1_12_2.netty.handlers; - -import io.netty.channel.Channel; -import mc.core.Config; -import mc.core.network.proto_1_12_2.packets.PingPacket; -import mc.core.network.proto_1_12_2.packets.StatusRequestPacket; -import mc.core.network.proto_1_12_2.packets.StatusResponsePacket; -import mc.core.player.PlayerManager; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class StatusHandler extends AbstractStateHandler implements StatusStateHandler { - @Autowired - private Config config; - @Autowired - private PlayerManager playerManager; - - @Handler - public void onStatusRequest(Channel channel, StatusRequestPacket packet) { - StatusResponsePacket responsePacket = new StatusResponsePacket(); - responsePacket.setMaxOnline(config.getMaxPlayers()); - responsePacket.setDescription(config.getDescriptionServer()); - responsePacket.setFaviconBase64(config.getFaviconBase64()); - responsePacket.setOnline(playerManager.getCountPlayers()); - - channel.writeAndFlush(responsePacket); - } - - @Handler - public void onPing(Channel channel, PingPacket packet) { - channel.writeAndFlush(packet); - } -} diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/StatusStateHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/StatusStateHandler.java deleted file mode 100644 index 38d77f2..0000000 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/StatusStateHandler.java +++ /dev/null @@ -1,11 +0,0 @@ -/* - * DmitriyMX - * 2018-06-23 - */ -package mc.core.network.proto_1_12_2.netty.handlers; - -/** - * Marker interface - */ -public interface StatusStateHandler extends StateHandler { -} diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetChannel.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetChannel.java deleted file mode 100644 index 960297a..0000000 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetChannel.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * DmitriyMX - * 2018-06-23 - */ -package mc.core.network.proto_1_12_2.netty.wrappers; - -import io.netty.channel.Channel; -import lombok.RequiredArgsConstructor; -import mc.core.chat.MessageType; -import mc.core.network.NetChannel; -import mc.core.network.SCPacket; -import mc.core.network.proto_1_12_2.packets.ChatMessageServerPacket; -import mc.core.network.proto_1_12_2.packets.TimeUpdatePacket; -import mc.core.network.proto_1_12_2.packets.TitlePacket; -import mc.core.text.Text; -import mc.core.text.Title; - -@RequiredArgsConstructor -public class WrapperNetChannel implements NetChannel { - private final Channel channel; - - @Override - public void sendTimeUpdate(long time, long age) { - writeAndFlush(new TimeUpdatePacket(time, age)); - } - - @Override - public void sendChatMessage(Text text, MessageType type) { - writeAndFlush(new ChatMessageServerPacket(text, type)); - } - - @Override - public void sendTitle(Title title) { - Text text = title.getTitle(); - if (text != null) write(new TitlePacket(TitlePacket.Action.SET_TITLE, text)); - - text = title.getSubtitle(); - if (text != null) write(new TitlePacket(TitlePacket.Action.SET_SUBTITLE, text)); - - text = title.getTextActionBar(); - if (text != null) write(new TitlePacket(TitlePacket.Action.SET_ACTION_BAR, text)); - - Integer fadeIn = title.getFadeInTime(); - Integer stay = title.getStayTime(); - Integer fadeOut = title.getFadeOutTime(); - if (fadeIn != null && stay != null && fadeOut != null) { - write(new TitlePacket(TitlePacket.Action.SET_DISPLAY_TIME, fadeIn, stay, fadeOut)); - } - - Boolean bool = title.getHide(); - if (bool != null && bool) write(new TitlePacket(TitlePacket.Action.HIDE)); - - bool = title.getReset(); - if (bool != null && bool) write(new TitlePacket(TitlePacket.Action.RESET)); - - flush(); - } - - @Override - public void writeAndFlush(SCPacket pkt) { - channel.writeAndFlush(pkt, channel.voidPromise()); - } - - @Override - public void write(SCPacket pkt) { - channel.write(pkt); - } - - @Override - public void flush() { - channel.flush(); - } -} 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 deleted file mode 100644 index 4658c5b..0000000 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetInputStream.java +++ /dev/null @@ -1,68 +0,0 @@ -package mc.core.network.proto_1_12_2.netty.wrappers; - -import io.netty.buffer.ByteBuf; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import mc.core.network.proto_1_12_2.NetInputStream_p340; - -@Slf4j -@RequiredArgsConstructor -public class WrapperNetInputStream extends NetInputStream_p340 { - private final ByteBuf byteBuf; - - @Override - public boolean readBoolean() { - return byteBuf.readBoolean(); - } - - @Override - public byte readByte() { - return byteBuf.readByte(); - } - - @Override - public int readBytes(byte[] buffer, int offset, int length) { - byteBuf.readBytes(buffer, offset, length); - return length; - } - - @Override - public int readUnsignedByte() { - return byteBuf.readUnsignedByte(); - } - - @Override - public int readUnsignedShort() { - return byteBuf.readUnsignedShort(); - } - - @Override - public short readShort() { - return byteBuf.readShort(); - } - - @Override - public int readInt() { - return byteBuf.readInt(); - } - - @Override - public long readLong() { - return byteBuf.readLong(); - } - - @Override - public float readFloat() { - return byteBuf.readFloat(); - } - - @Override - public double readDouble() { - return byteBuf.readDouble(); - } - - @Override - public void skipBytes(int count) { - byteBuf.skipBytes(count); - } -} 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 deleted file mode 100644 index b227994..0000000 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetOutputStream.java +++ /dev/null @@ -1,57 +0,0 @@ -package mc.core.network.proto_1_12_2.netty.wrappers; - -import io.netty.buffer.ByteBuf; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import mc.core.network.proto_1_12_2.NetOutputStream_p340; - -@Slf4j -@RequiredArgsConstructor -public class WrapperNetOutputStream extends NetOutputStream_p340 { - private final ByteBuf byteBuf; - - @Override - public void writeBoolean(boolean value) { - byteBuf.writeBoolean(value); - } - - @Override - public void writeByte(int value) { - byteBuf.writeByte(value); - } - - @Override - public void writeUnsignedByte(int value) { - byteBuf.writeByte((byte)(value & 0xFF)); - } - - @Override - public void writeBytes(byte[] buffer, int offset, int lengtn) { - byteBuf.writeBytes(buffer, offset, lengtn); - } - - @Override - public void writeShort(int value) { - byteBuf.writeShort(value); - } - - @Override - public void writeInt(int value) { - byteBuf.writeInt(value); - } - - @Override - public void writeLong(long value) { - byteBuf.writeLong(value); - } - - @Override - public void writeFloat(float value) { - byteBuf.writeFloat(value); - } - - @Override - public void writeDouble(double value) { - byteBuf.writeDouble(value); - } -} diff --git a/settings.gradle b/settings.gradle index 6e2132d..aee0b52 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,9 +1,3 @@ rootProject.name = 'mc-server' include('core') // Core -include('simple_world') -include('h2_playermanager') -include('vanilla_commands') -include('proto_1.12.2') // Protocol 1.12.2 -include('proto_1.12.2_netty') // Protocol 1.12.2 (Netty impl.) -include('anvil-loader') // Vanilla world loader (aka Anvil) diff --git a/simple_world/README.MD b/simple_world/README.MD deleted file mode 100644 index 02871ed..0000000 --- a/simple_world/README.MD +++ /dev/null @@ -1,39 +0,0 @@ -# Simple world - -Простая реализация мира - -## Spring bean - -```xml - - - - - - - - - - - - - - - - 1;BEDROCK - 2;DIRT - 1;GRASS - - - -``` - -`spawn` - точка спавна. - -При указании точки спавна, указывать шестой параметр `World` не имеет смысла, -т.к. `SimpleWorld` всё равно перезапишет этот параметр. - -`layersBlock` - слои блоков. - -В качестве значения указывается спиток строк, каждая из которых описывает слой блоков. -Формат строк такой: `кол-во_слоёв;тип_блока`. Порядок строк такой: сверху нижние слои, а снизу - верхние. diff --git a/simple_world/build.gradle b/simple_world/build.gradle deleted file mode 100644 index 6d1bcee..0000000 --- a/simple_world/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ -version '1.0-SNAPSHOT' - -dependencies { - /* Core */ - compile_excludeCopy project(':core') -} diff --git a/simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java b/simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java deleted file mode 100644 index 45a3cd0..0000000 --- a/simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.world.simple; - -import mc.core.world.block.BlockType; -import mc.core.world.chunk.Chunk; -import mc.core.world.chunk.ChunkProvider; -import mc.core.world.chunk.ChunkSection; - -import java.util.ArrayList; -import java.util.List; - -public class FlatChunkProvider implements ChunkProvider { - private ChunkSection chunkSection; - - public void setLayersBlockAsString(List listOfLayers) { - List layoutsBlock = new ArrayList<>(); - - for (String value : listOfLayers) { - String[] splitValue = value.split(";"); - - BlockType blockType; - try { - blockType = BlockType.valueOf(splitValue[1]); - } catch (IllegalArgumentException e) { - continue; - } - - for (int i = 0; i < Integer.parseInt(splitValue[0]); i++) { - layoutsBlock.add(blockType); - } - } - - setLayersBlock(layoutsBlock); - } - - public void setLayersBlock(List layoutsBlock) { - this.chunkSection = new SimpleChunkSection(layoutsBlock); - } - - @Override - public Chunk getChunk(int x, int z) { - Chunk chunk = new SimpleChunk(x, z); - chunk.setChunkSection(0, chunkSection); - return chunk; - } - - @Override - public void saveChunk(Chunk chunk) { - //FIXME nope... - } - - @Override - public void saveChunk(Chunk... chunks) { - //FIXME nope... - } -} diff --git a/simple_world/src/main/java/mc/world/simple/SimpleChunk.java b/simple_world/src/main/java/mc/world/simple/SimpleChunk.java deleted file mode 100644 index d6a7427..0000000 --- a/simple_world/src/main/java/mc/world/simple/SimpleChunk.java +++ /dev/null @@ -1,79 +0,0 @@ -package mc.world.simple; - -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; - -@Slf4j -@RequiredArgsConstructor -public class SimpleChunk implements Chunk { - @Getter - private final int x, z; - private ChunkSection chunkSection; - - @Override - public ChunkSection getChunkSection(int height) { - return chunkSection; - } - - @Override - public void setChunkSection(int height, ChunkSection chunkSection) { - this.chunkSection = chunkSection; - this.chunkSection.setParent(this); - } - - 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 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 deleted file mode 100644 index cde4005..0000000 --- a/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java +++ /dev/null @@ -1,70 +0,0 @@ -package mc.world.simple; - -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; - - public SimpleChunkSection(List layersBlock) { - this.layersBlock = layersBlock; - } - - @Override - public int getSkyLight(int localX, int localY, int localZ) { - if (localY <= 3) return 0; - else return 15; - } - - @Override - public void setSkyLight(int localX, int localY, int localZ, int lightLevel) { - } - - @Override - public int getAddition(int localX, int localY, int localZ) { - return 0; - } - - @Override - public void setAddition(int localX, int localY, int localZ, int value) { - } - - @Override - public int getY() { - return 0; - } - - @Override - public void setBlock(Block block) { - } - - @Override - 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 (localY >= layersBlock.size()) { - return blockFactory.create(BlockType.AIR, localX, localY, localZ); - } - - BlockType blockType = layersBlock.get(localY); - if (blockType == null) return blockFactory.create(BlockType.AIR, localX, localY, localZ); - - 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 deleted file mode 100644 index 4a6e345..0000000 --- a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java +++ /dev/null @@ -1,67 +0,0 @@ -package mc.world.simple; - -import lombok.Getter; -import lombok.Setter; -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; -import org.springframework.stereotype.Component; - -import javax.annotation.Nonnull; - -@Slf4j -@Component -public class SimpleWorld implements World, BeanNameAware { - @Getter - private String name; - @Getter - private final WorldType type = WorldType.FLAT; - private EntityLocation spawn; - @Setter - private ChunkProvider chunkProvider; - - @Override - public EntityLocation getSpawn() { - if (this.spawn == null) { - log.warn("Spawn is not defined! Set spawn [0, 6, 0]"); - setSpawn(0d, 6d, 0d); - } - - return this.spawn; - } - - @Override - public void setSpawn(EntityLocation location) { - this.spawn = location; - } - - @Override - public Chunk getChunk(int x, int z) { - return chunkProvider.getChunk(x, z); - } - - @Override - public void setChunk(int x, int z, Chunk chunk) { - 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; - } -} diff --git a/simple_world/src/test/java/mc/world/simple/SimpleChunkSectionTest.java b/simple_world/src/test/java/mc/world/simple/SimpleChunkSectionTest.java deleted file mode 100644 index b0486b9..0000000 --- a/simple_world/src/test/java/mc/world/simple/SimpleChunkSectionTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package mc.world.simple; - -import com.google.common.collect.Lists; -import mc.core.world.block.Block; -import mc.core.world.block.BlockType; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class SimpleChunkSectionTest { - private SimpleChunkSection chunkSection; - private List layersBlock; - - @BeforeEach - void before() { - layersBlock = Lists.newArrayList( - BlockType.BEDROCK, - BlockType.DIRT, - BlockType.DIRT, - BlockType.GRASS - ); - - chunkSection = new SimpleChunkSection(layersBlock); - } - - @Test - @Disabled - void getBlock() { - for (int y = 15; y >= 0; y--) { - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - Block block = chunkSection.getBlock(x, y, z); - if (y > layersBlock.size()-1) { - assertEquals(block.getType(), BlockType.AIR); - } else { - assertEquals(block.getType(), layersBlock.get(y)); - } - } - } - } - } -} \ No newline at end of file diff --git a/simple_world/src/test/java/mc/world/simple/SimpleWorldTest.java b/simple_world/src/test/java/mc/world/simple/SimpleWorldTest.java deleted file mode 100644 index 110a830..0000000 --- a/simple_world/src/test/java/mc/world/simple/SimpleWorldTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package mc.world.simple; - -import mc.core.EntityLocation; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import static org.junit.jupiter.api.Assertions.*; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = {TestSpringConfig.class}) -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) -class SimpleWorldTest { - @Autowired - private SimpleWorld world; - - @Test - void spawn() { - final EntityLocation location = new EntityLocation(1d, 2d, 3d,4f, 5f); - - world.setSpawn(location); - assertEquals(location, world.getSpawn()); - assertSame(location, world.getSpawn()); - - world.setSpawn(1d, 2d, 3d, 4f, 5f); - assertEquals(location, world.getSpawn()); - assertNotSame(location, world.getSpawn()); - - location.setYawPitch(0, 0); - world.setSpawn(1d, 2d, 3d); - assertEquals(location, world.getSpawn()); - assertNotSame(location, world.getSpawn()); - } -} \ No newline at end of file diff --git a/simple_world/src/test/java/mc/world/simple/TestSpringConfig.java b/simple_world/src/test/java/mc/world/simple/TestSpringConfig.java deleted file mode 100644 index 865fdd9..0000000 --- a/simple_world/src/test/java/mc/world/simple/TestSpringConfig.java +++ /dev/null @@ -1,38 +0,0 @@ -package mc.world.simple; - -import com.google.common.collect.Lists; -import mc.core.world.block.BlockType; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - -import java.util.List; - -@Configuration -@ComponentScan("mc.world.simple") -public class TestSpringConfig { - @Bean - public List layersBlock() { - return Lists.newArrayList( - BlockType.BEDROCK, - BlockType.DIRT, - BlockType.DIRT, - BlockType.GRASS - ); - } - - @Bean - public SimpleChunkSection chunkSection(List layersBlock) { - return new SimpleChunkSection(layersBlock); - } - - @Bean - public SimpleWorld simpleWorld(List layersBlock) { - FlatChunkProvider chunkProvider = new FlatChunkProvider(); - chunkProvider.setLayersBlock(layersBlock); - - SimpleWorld world = new SimpleWorld(); - world.setChunkProvider(chunkProvider); - return world; - } -} diff --git a/vanilla_commands/build.gradle b/vanilla_commands/build.gradle deleted file mode 100644 index 6d1bcee..0000000 --- a/vanilla_commands/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ -version '1.0-SNAPSHOT' - -dependencies { - /* Core */ - compile_excludeCopy project(':core') -} diff --git a/vanilla_commands/src/main/java/mc/commands/HelpCommand.java b/vanilla_commands/src/main/java/mc/commands/HelpCommand.java deleted file mode 100644 index c3d466e..0000000 --- a/vanilla_commands/src/main/java/mc/commands/HelpCommand.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * DmitriyMX - * 2018-05-23 - */ -package mc.commands; - -import lombok.extern.slf4j.Slf4j; -import mc.core.chat.CommandExecutor; -import mc.core.chat.CommanderChatProcessor; -import mc.core.chat.MessageType; -import mc.core.player.Player; -import mc.core.text.Text; -import mc.core.text.TextColor; -import mc.core.text.TextTemplate; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; - -import java.util.Optional; - -@Slf4j -public class HelpCommand implements CommandExecutor { - private static final TextTemplate messageFormat = TextTemplate.builder() - .arg("command", TextColor.RED) - .append(Text.of(TextColor.GRAY, " - ")) - .arg("description", TextColor.WHITE) - .build(); - - @Autowired - private ApplicationContext applicationContext; - private CommanderChatProcessor commanderChatProcessor; - - @Override - public String getName() { - return "help"; - } - - @Override - public Optional getAliases() { - return Optional.of(new String[]{"?"}); - } - - @Override - public Optional getUsage() { - return Optional.empty(); - } - - @Override - public String getDescription() { - return "shows this message"; - } - - @Override - public void execute(Player sender, String... args) { - if (commanderChatProcessor == null) { - commanderChatProcessor = applicationContext.getBean(CommanderChatProcessor.class); - if (commanderChatProcessor == null) { - log.error("Error get bean of type \"CommanderChatProcessor\". WTF?!"); - sender.getChannel().sendChatMessage(Text.of(TextColor.RED, "!!-Server error-!!")); - return; - } - } - - commanderChatProcessor.getAllCommands().forEach(commandExecutor -> { - Text message = messageFormat.apply( - "command", commandExecutor.getUsage().orElse(commandExecutor.getName()), - "description", commandExecutor.getDescription()); - sender.getChannel().sendChatMessage(message, MessageType.SYSTEM_MESSAGE); - }); - } -} diff --git a/vanilla_commands/src/main/java/mc/commands/ListCommand.java b/vanilla_commands/src/main/java/mc/commands/ListCommand.java deleted file mode 100644 index 82411a6..0000000 --- a/vanilla_commands/src/main/java/mc/commands/ListCommand.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * DmitriyMX - * 2018-05-23 - */ -package mc.commands; - -import mc.core.chat.CommandExecutor; -import mc.core.chat.MessageType; -import mc.core.player.Player; -import mc.core.player.PlayerManager; -import mc.core.text.Text; -import mc.core.text.TextColor; -import mc.core.text.TextTemplate; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.Optional; -import java.util.StringJoiner; - -public class ListCommand implements CommandExecutor { - private static final TextTemplate messageFormat = TextTemplate.builder() - .append(Text.of(TextColor.GREEN, "Online(")) - .arg("count") - .append(Text.of(TextColor.GREEN, "): ")) - .arg("players", TextColor.DARK_GREEN) - .build(); - - @Autowired - private PlayerManager playerManager; - - @Override - public String getName() { - return "list"; - } - - @Override - public Optional getAliases() { - return Optional.empty(); - } - - @Override - public Optional getUsage() { - return Optional.empty(); - } - - @Override - public String getDescription() { - return "lists all currently connected players"; - } - - @Override - public void execute(Player sender, String... args) { - StringJoiner sj = new StringJoiner(", "); - playerManager.getPlayers().forEach(pl -> sj.add(pl.getName())); - - Text message = messageFormat.apply( - "count", playerManager.getCountPlayers(), - "players", sj.toString()); - sender.getChannel().sendChatMessage(message, MessageType.SYSTEM_MESSAGE); - } -}