From dc01fb59b811592c0a157313775f021558eb9cb5 Mon Sep 17 00:00:00 2001 From: Myles Date: Fri, 23 Sep 2016 18:49:59 +0100 Subject: [PATCH 01/76] Doesn't compile but start work towards seperating into modules... (with legacy support hopefully for basic API) --- bukkit/pom.xml | 51 +++ .../java/us/myles/ViaVersion/ViaConfig.java | 0 .../us/myles/ViaVersion/ViaVersionPlugin.java | 63 ++- .../us/myles/ViaVersion/api/ViaListener.java | 0 .../us/myles/ViaVersion/api/ViaVersion.java | 38 +- .../myles/ViaVersion/api/ViaVersionAPI.java | 287 ++++++------ .../us/myles/ViaVersion/boss/ViaBossBar.java | 0 .../bukkit/BukkitCommandHandler.java | 21 + .../bukkit/BukkitCommandSender.java | 20 + .../BasicHandlerConstructor.java | 0 .../classgenerator/ClassGenerator.java | 0 .../classgenerator/HandlerConstructor.java | 0 .../ViaVersion/handlers/ViaDecodeHandler.java | 0 .../ViaVersion/handlers/ViaEncodeHandler.java | 0 .../ViaVersion/handlers/ViaPacketHandler.java | 0 .../handlers/ViaVersionInitializer.java | 0 .../ViaVersion/listeners}/UpdateListener.java | 42 +- .../myles/ViaVersion/util/Configuration.java | 0 .../ViaVersion/util/ProtocolSupportUtil.java | 0 .../myles/ViaVersion/util/ReflectionUtil.java | 0 {src => bukkit/src}/main/resources/config.yml | 0 {src => bukkit/src}/main/resources/plugin.yml | 0 bungee/pom.xml | 23 + .../main/java/us/myles/ViaVersion/Bungee.java | 0 {src => bungee/src}/main/resources/bungee.yml | 0 common/pom.xml | 14 + .../myles/ViaVersion/api/PacketWrapper.java | 0 .../java/us/myles/ViaVersion/api/Pair.java | 0 .../java/us/myles/ViaVersion/api/Via.java | 15 + .../ViaVersion/api/ViaVersionConfig.java | 0 .../us/myles/ViaVersion/api/boss/BossBar.java | 0 .../myles/ViaVersion/api/boss/BossColor.java | 0 .../myles/ViaVersion/api/boss/BossFlag.java | 0 .../myles/ViaVersion/api/boss/BossStyle.java | 0 .../api/command/ViaCommandSender.java | 6 + .../ViaVersion/api/command/ViaSubCommand.java | 7 +- .../api/command/ViaVersionCommand.java | 0 .../ViaVersion/api/data/StoredObject.java | 0 .../ViaVersion/api/data/UserConnection.java | 24 +- .../ViaVersion/api/minecraft/Position.java | 0 .../api/minecraft/chunks/Chunk.java | 0 .../api/minecraft/chunks/ChunkSection.java | 0 .../api/minecraft/chunks/NibbleArray.java | 0 .../ViaVersion/api/minecraft/item/Item.java | 0 .../api/minecraft/metadata/Metadata.java | 0 .../ViaVersion/api/platform/ViaPlatform.java | 22 + .../ViaVersion/api/protocol/Protocol.java | 0 .../api/protocol/ProtocolPipeline.java | 6 +- .../api/protocol/ProtocolRegistry.java | 4 +- .../api/protocol/ProtocolVersion.java | 0 .../api/remapper/PacketHandler.java | 0 .../api/remapper/PacketRemapper.java | 0 .../ViaVersion/api/remapper/TypeRemapper.java | 0 .../ViaVersion/api/remapper/ValueCreator.java | 0 .../ViaVersion/api/remapper/ValueReader.java | 0 .../api/remapper/ValueTransformer.java | 0 .../ViaVersion/api/remapper/ValueWriter.java | 0 .../ViaVersion/api/type/ByteBufReader.java | 0 .../ViaVersion/api/type/ByteBufWriter.java | 0 .../ViaVersion/api/type/PartialType.java | 0 .../us/myles/ViaVersion/api/type/Type.java | 0 .../ViaVersion/api/type/TypeConverter.java | 0 .../ViaVersion/api/type/types/ArrayType.java | 0 .../api/type/types/BooleanType.java | 0 .../ViaVersion/api/type/types/ByteType.java | 0 .../ViaVersion/api/type/types/DoubleType.java | 0 .../ViaVersion/api/type/types/FloatType.java | 0 .../ViaVersion/api/type/types/IntType.java | 0 .../ViaVersion/api/type/types/LongType.java | 0 .../api/type/types/RemainingBytesType.java | 0 .../ViaVersion/api/type/types/ShortType.java | 0 .../ViaVersion/api/type/types/StringType.java | 0 .../ViaVersion/api/type/types/UUIDType.java | 0 .../api/type/types/UnsignedByteType.java | 0 .../api/type/types/UnsignedShortType.java | 0 .../ViaVersion/api/type/types/VarIntType.java | 0 .../ViaVersion/api/type/types/VoidType.java | 0 .../type/types/minecraft/BaseChunkType.java | 0 .../type/types/minecraft/EulerAngleType.java | 0 .../type/types/minecraft/ItemArrayType.java | 0 .../api/type/types/minecraft/ItemType.java | 0 .../types/minecraft/MetaListTypeTemplate.java | 0 .../types/minecraft/MetaTypeTemplate.java | 0 .../api/type/types/minecraft/NBTType.java | 0 .../type/types/minecraft/OptPositionType.java | 0 .../api/type/types/minecraft/OptUUIDType.java | 0 .../type/types/minecraft/PositionType.java | 0 .../api/type/types/minecraft/VectorType.java | 0 .../type/types/version/Metadata1_8Type.java | 0 .../type/types/version/Metadata1_9Type.java | 0 .../types/version/MetadataList1_8Type.java | 0 .../types/version/MetadataList1_9Type.java | 0 .../api/type/types/version/Types1_8.java | 0 .../api/type/types/version/Types1_9.java | 0 .../commands/ViaCommandHandler.java | 27 +- .../commands/defaultsubs/AutoTeamSubCmd.java | 4 +- .../commands/defaultsubs/DebugSubCmd.java | 3 +- .../defaultsubs/DisplayLeaksSubCmd.java | 3 +- .../commands/defaultsubs/DontBugMeSubCmd.java | 3 +- .../commands/defaultsubs/DumpSubCmd.java | 3 +- .../commands/defaultsubs/HelpSubCmd.java | 3 +- .../commands/defaultsubs/ListSubCmd.java | 3 +- .../commands/defaultsubs/PPSSubCmd.java | 3 +- .../commands/defaultsubs/ReloadSubCmd.java | 4 +- .../myles/ViaVersion/dump/DumpTemplate.java | 0 .../us/myles/ViaVersion/dump/PluginInfo.java | 0 .../us/myles/ViaVersion/dump/VersionInfo.java | 0 .../ViaVersion/exception/CancelException.java | 0 .../exception/InformativeException.java | 0 .../myles/ViaVersion/packets/Direction.java | 0 .../myles/ViaVersion/packets/PacketType.java | 416 +++++++++--------- .../us/myles/ViaVersion/packets/State.java | 0 .../protocols/base/BaseProtocol.java | 2 +- .../protocols/base/ProtocolInfo.java | 0 .../Protocol1_10To1_9_3_4.java | 0 .../storage/ResourcePackTracker.java | 0 .../Protocol1_9_1_2TO1_9_3_4.java | 0 .../chunks/BlockEntity.java | 0 .../chunks/Chunk1_9_3_4.java | 0 .../chunks/ChunkSection1_9_3_4.java | 0 .../types/Chunk1_9_3_4Type.java | 0 .../Protocol1_9_1TO1_9.java | 0 .../Protocol1_9_3TO1_9_1_2.java | 0 .../chunks/Chunk1_9_1_2.java | 0 .../chunks/ChunkSection1_9_1_2.java | 0 .../chunks/FakeTileEntity.java | 0 .../storage/ClientWorld.java | 0 .../types/Chunk1_9_1_2Type.java | 0 .../protocols/protocol1_9to1_8/ArmorType.java | 178 ++++---- .../protocol1_9to1_8/ItemRewriter.java | 0 .../PlayerMovementMapper.java | 0 .../protocol1_9to1_8/Protocol1_9TO1_8.java | 0 .../protocol1_9to1_8/ViaIdleThread.java | 0 .../protocol1_9to1_8/chat/ChatRewriter.java | 0 .../protocol1_9to1_8/chat/GameMode.java | 0 .../chunks/Chunk1_9to1_8.java | 0 .../chunks/ChunkSection1_9to1_8.java | 0 .../listeners/ArmorListener.java | 0 .../listeners/BlockListener.java | 0 .../listeners/CommandBlockListener.java | 0 .../listeners/DeathListener.java | 0 .../listeners/HandItemCache.java | 0 .../listeners/PaperPatch.java | 0 .../protocol1_9to1_8/metadata/MetaIndex.java | 0 .../metadata/MetadataRewriter.java | 0 .../metadata/MetadataTypes.java | 0 .../protocol1_9to1_8/metadata/NewType.java | 0 .../protocol1_9to1_8/metadata/Type.java | 0 .../packets/EntityPackets.java | 0 .../packets/InventoryPackets.java | 0 .../packets/PlayerPackets.java | 0 .../packets/SpawnPackets.java | 0 .../packets/WorldPackets.java | 0 .../protocol1_9to1_8/sounds/Effect.java | 0 .../sounds/SoundCategory.java | 0 .../protocol1_9to1_8/sounds/SoundEffect.java | 0 .../storage/ClientChunks.java | 0 .../storage/EntityTracker.java | 0 .../storage/InventoryTracker.java | 0 .../storage/MovementTracker.java | 0 .../storage/PlaceBlockTracker.java | 0 .../protocol1_9to1_8/types/ChunkType.java | 0 .../Protocol1_9TO1_9_1.java | 0 .../protocolsnapshotto1_10/ItemRewriter.java | 0 .../MetadataRewriter.java | 0 .../ProtocolSnapshotTo1_10.java | 0 .../packets/InventoryPackets.java | 0 .../storage/EntityTracker.java | 0 .../myles/ViaVersion/update/UpdateUtil.java | 252 ++++++----- .../us/myles/ViaVersion/update/Version.java | 152 +++---- .../myles/ViaVersion/util/ConcurrentList.java | 0 .../us/myles/ViaVersion/util/EntityUtil.java | 0 .../us/myles/ViaVersion/util/ListWrapper.java | 0 .../myles/ViaVersion/util/PipelineUtil.java | 0 jar/pom.xml | 104 +++++ pom.xml | 148 +------ 176 files changed, 1079 insertions(+), 872 deletions(-) create mode 100644 bukkit/pom.xml rename {src => bukkit/src}/main/java/us/myles/ViaVersion/ViaConfig.java (100%) rename {src => bukkit/src}/main/java/us/myles/ViaVersion/ViaVersionPlugin.java (93%) rename {src => bukkit/src}/main/java/us/myles/ViaVersion/api/ViaListener.java (100%) rename {src => bukkit/src}/main/java/us/myles/ViaVersion/api/ViaVersion.java (96%) rename {src => bukkit/src}/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java (96%) rename {src => bukkit/src}/main/java/us/myles/ViaVersion/boss/ViaBossBar.java (100%) create mode 100644 bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandHandler.java create mode 100644 bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandSender.java rename {src => bukkit/src}/main/java/us/myles/ViaVersion/classgenerator/BasicHandlerConstructor.java (100%) rename {src => bukkit/src}/main/java/us/myles/ViaVersion/classgenerator/ClassGenerator.java (100%) rename {src => bukkit/src}/main/java/us/myles/ViaVersion/classgenerator/HandlerConstructor.java (100%) rename {src => bukkit/src}/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java (100%) rename {src => bukkit/src}/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java (100%) rename {src => bukkit/src}/main/java/us/myles/ViaVersion/handlers/ViaPacketHandler.java (100%) rename {src => bukkit/src}/main/java/us/myles/ViaVersion/handlers/ViaVersionInitializer.java (100%) rename {src/main/java/us/myles/ViaVersion/update => bukkit/src/main/java/us/myles/ViaVersion/listeners}/UpdateListener.java (68%) rename {src => bukkit/src}/main/java/us/myles/ViaVersion/util/Configuration.java (100%) rename {src => bukkit/src}/main/java/us/myles/ViaVersion/util/ProtocolSupportUtil.java (100%) rename {src => bukkit/src}/main/java/us/myles/ViaVersion/util/ReflectionUtil.java (100%) rename {src => bukkit/src}/main/resources/config.yml (100%) rename {src => bukkit/src}/main/resources/plugin.yml (100%) create mode 100644 bungee/pom.xml rename {src => bungee/src}/main/java/us/myles/ViaVersion/Bungee.java (100%) rename {src => bungee/src}/main/resources/bungee.yml (100%) create mode 100644 common/pom.xml rename {src => common/src}/main/java/us/myles/ViaVersion/api/PacketWrapper.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/Pair.java (100%) create mode 100644 common/src/main/java/us/myles/ViaVersion/api/Via.java rename {src => common/src}/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/boss/BossBar.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/boss/BossColor.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/boss/BossFlag.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/boss/BossStyle.java (100%) create mode 100644 common/src/main/java/us/myles/ViaVersion/api/command/ViaCommandSender.java rename {src => common/src}/main/java/us/myles/ViaVersion/api/command/ViaSubCommand.java (85%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/command/ViaVersionCommand.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/data/StoredObject.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/data/UserConnection.java (87%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/minecraft/Position.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/minecraft/chunks/Chunk.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/minecraft/chunks/ChunkSection.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/minecraft/chunks/NibbleArray.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/minecraft/item/Item.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/minecraft/metadata/Metadata.java (100%) create mode 100644 common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java rename {src => common/src}/main/java/us/myles/ViaVersion/api/protocol/Protocol.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/protocol/ProtocolPipeline.java (96%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java (98%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/protocol/ProtocolVersion.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/remapper/PacketHandler.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/remapper/PacketRemapper.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/remapper/TypeRemapper.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/remapper/ValueCreator.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/remapper/ValueReader.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/remapper/ValueTransformer.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/remapper/ValueWriter.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/ByteBufReader.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/ByteBufWriter.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/PartialType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/Type.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/TypeConverter.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/ArrayType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/BooleanType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/ByteType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/DoubleType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/FloatType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/IntType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/LongType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/RemainingBytesType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/ShortType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/StringType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/UUIDType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/UnsignedByteType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/UnsignedShortType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/VarIntType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/VoidType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/minecraft/BaseChunkType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/minecraft/EulerAngleType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/minecraft/ItemArrayType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/minecraft/ItemType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/minecraft/MetaListTypeTemplate.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/minecraft/MetaTypeTemplate.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/minecraft/NBTType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptPositionType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptUUIDType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/minecraft/PositionType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/minecraft/VectorType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/version/Metadata1_8Type.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/version/Metadata1_9Type.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/version/MetadataList1_8Type.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/version/MetadataList1_9Type.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/version/Types1_8.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/api/type/types/version/Types1_9.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java (83%) rename {src => common/src}/main/java/us/myles/ViaVersion/commands/defaultsubs/AutoTeamSubCmd.java (88%) rename {src => common/src}/main/java/us/myles/ViaVersion/commands/defaultsubs/DebugSubCmd.java (85%) rename {src => common/src}/main/java/us/myles/ViaVersion/commands/defaultsubs/DisplayLeaksSubCmd.java (87%) rename {src => common/src}/main/java/us/myles/ViaVersion/commands/defaultsubs/DontBugMeSubCmd.java (87%) rename {src => common/src}/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java (96%) rename {src => common/src}/main/java/us/myles/ViaVersion/commands/defaultsubs/HelpSubCmd.java (84%) rename {src => common/src}/main/java/us/myles/ViaVersion/commands/defaultsubs/ListSubCmd.java (92%) rename {src => common/src}/main/java/us/myles/ViaVersion/commands/defaultsubs/PPSSubCmd.java (94%) rename {src => common/src}/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java (84%) rename {src => common/src}/main/java/us/myles/ViaVersion/dump/DumpTemplate.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/dump/PluginInfo.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/dump/VersionInfo.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/exception/CancelException.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/exception/InformativeException.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/packets/Direction.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/packets/PacketType.java (98%) rename {src => common/src}/main/java/us/myles/ViaVersion/packets/State.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java (99%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/base/ProtocolInfo.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_10to1_9_3/Protocol1_10To1_9_3_4.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_10to1_9_3/storage/ResourcePackTracker.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Protocol1_9_1_2TO1_9_3_4.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/BlockEntity.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/Chunk1_9_3_4.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/ChunkSection1_9_3_4.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/types/Chunk1_9_3_4Type.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9_1to1_9/Protocol1_9_1TO1_9.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/Chunk1_9_1_2.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/ChunkSection1_9_1_2.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/FakeTileEntity.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/storage/ClientWorld.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/types/Chunk1_9_1_2Type.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java (96%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ItemRewriter.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/PlayerMovementMapper.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ViaIdleThread.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chat/ChatRewriter.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chat/GameMode.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/Chunk1_9to1_8.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/ArmorListener.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/BlockListener.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/CommandBlockListener.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/DeathListener.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/HandItemCache.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/PaperPatch.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataTypes.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/NewType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/Type.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/EntityPackets.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/InventoryPackets.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/PlayerPackets.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/Effect.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/SoundCategory.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/SoundEffect.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/InventoryTracker.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/MovementTracker.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/PlaceBlockTracker.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/types/ChunkType.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_9_1/Protocol1_9TO1_9_1.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/ItemRewriter.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/ProtocolSnapshotTo1_10.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/packets/InventoryPackets.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/storage/EntityTracker.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/update/UpdateUtil.java (68%) rename {src => common/src}/main/java/us/myles/ViaVersion/update/Version.java (96%) rename {src => common/src}/main/java/us/myles/ViaVersion/util/ConcurrentList.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/util/EntityUtil.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/util/ListWrapper.java (100%) rename {src => common/src}/main/java/us/myles/ViaVersion/util/PipelineUtil.java (100%) create mode 100644 jar/pom.xml diff --git a/bukkit/pom.xml b/bukkit/pom.xml new file mode 100644 index 000000000..50dd3a05c --- /dev/null +++ b/bukkit/pom.xml @@ -0,0 +1,51 @@ + + + + viaversion + us.myles + 1.0.0-ALPHA-16w38a + + 4.0.0 + + viaversion-bukkit + + + + 1.8.8-R0.1-SNAPSHOT + + + + + + us.myles + viaversion-common + 1.0.0-ALPHA-16w38a + provided + + + + + org.bukkit + bukkit + ${bukkitVersion} + provided + true + + + junit + junit + + + gson + com.google.code.gson + + + persistence-api + javax.persistence + + + + + \ No newline at end of file diff --git a/src/main/java/us/myles/ViaVersion/ViaConfig.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaConfig.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/ViaConfig.java rename to bukkit/src/main/java/us/myles/ViaVersion/ViaConfig.java diff --git a/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java similarity index 93% rename from src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java rename to bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 8471af2b2..0b72d9560 100644 --- a/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -13,6 +13,7 @@ import org.bukkit.entity.Player; import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.java.JavaPlugin; import us.myles.ViaVersion.api.Pair; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.ViaVersionAPI; import us.myles.ViaVersion.api.boss.BossBar; @@ -20,14 +21,15 @@ import us.myles.ViaVersion.api.boss.BossColor; import us.myles.ViaVersion.api.boss.BossStyle; import us.myles.ViaVersion.api.command.ViaVersionCommand; import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.api.protocol.ProtocolVersion; import us.myles.ViaVersion.boss.ViaBossBar; +import us.myles.ViaVersion.bukkit.BukkitCommandHandler; import us.myles.ViaVersion.classgenerator.ClassGenerator; -import us.myles.ViaVersion.commands.ViaCommandHandler; import us.myles.ViaVersion.handlers.ViaVersionInitializer; +import us.myles.ViaVersion.listeners.UpdateListener; import us.myles.ViaVersion.protocols.base.ProtocolInfo; -import us.myles.ViaVersion.update.UpdateListener; import us.myles.ViaVersion.update.UpdateUtil; import us.myles.ViaVersion.util.ConcurrentList; import us.myles.ViaVersion.util.ListWrapper; @@ -42,12 +44,12 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; -public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI { +public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI, ViaPlatform { private final Map portedPlayers = new ConcurrentHashMap<>(); private List injectedFutures = new ArrayList<>(); private List> injectedLists = new ArrayList<>(); - private ViaCommandHandler commandHandler; + private BukkitCommandHandler commandHandler; private boolean debug = false; private boolean compatSpigotBuild = false; private boolean spigot = true; @@ -74,6 +76,9 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI { public void onLoad() { // Config magic conf = new ViaConfig(this); + // Init platform + Via.init(this); + // For compatibility ViaVersion.setInstance(this); // Handle reloads @@ -118,7 +123,7 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI { if (lateBind) injectPacketHandler(); if (conf.isCheckForUpdates()) - UpdateUtil.sendUpdateMessage(this); + UpdateUtil.sendUpdateMessage(); // Gather version :) Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { @Override @@ -136,9 +141,9 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI { }); - Bukkit.getPluginManager().registerEvents(new UpdateListener(this), this); + Bukkit.getPluginManager().registerEvents(new UpdateListener(), this); - getCommand("viaversion").setExecutor(commandHandler = new ViaCommandHandler()); + getCommand("viaversion").setExecutor(commandHandler = new BukkitCommandHandler()); getCommand("viaversion").setTabCompleter(commandHandler); // Register Protocol Listeners @@ -527,4 +532,48 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI { } return false; } + + @Override + public String getPlatformName() { + return "Bukkit"; + } + + @Override + public String getPluginVersion() { + return getDescription().getVersion(); + } + + @Override + public void runAsync(Runnable runnable) { + getServer().getScheduler().runTaskAsynchronously(this, runnable); + } + + @Override + public void runSync(Runnable runnable) { + getServer().getScheduler().runTask(this, runnable); + } + + @Override + public void sendMessage(UUID uuid, String message) { + Player player = Bukkit.getPlayer(uuid); + if (player != null) { + player.sendMessage(message); + } + } + + @Override + public boolean kickPlayer(UUID uuid, String message) { + Player player = Bukkit.getPlayer(uuid); + if (player != null) { + player.kickPlayer(message); + return true; + } else { + return false; + } + } + + @Override + public boolean isPluginEnabled() { + return Bukkit.getPluginManager().getPlugin("ViaVersion").isEnabled(); + } } diff --git a/src/main/java/us/myles/ViaVersion/api/ViaListener.java b/bukkit/src/main/java/us/myles/ViaVersion/api/ViaListener.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/ViaListener.java rename to bukkit/src/main/java/us/myles/ViaVersion/api/ViaListener.java diff --git a/src/main/java/us/myles/ViaVersion/api/ViaVersion.java b/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersion.java similarity index 96% rename from src/main/java/us/myles/ViaVersion/api/ViaVersion.java rename to bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersion.java index a6fee1ad8..99655a2fe 100644 --- a/src/main/java/us/myles/ViaVersion/api/ViaVersion.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersion.java @@ -1,19 +1,19 @@ -package us.myles.ViaVersion.api; - -import lombok.Getter; -import org.apache.commons.lang.Validate; -import us.myles.ViaVersion.ViaVersionPlugin; - -public class ViaVersion { - - @Getter - private static ViaVersionAPI instance; - @Getter - private static ViaVersionConfig config; - - public static void setInstance(ViaVersionPlugin plugin) { - Validate.isTrue(instance == null, "Instance is already set"); - ViaVersion.instance = plugin; - ViaVersion.config = plugin.getConf(); - } -} +package us.myles.ViaVersion.api; + +import lombok.Getter; +import org.apache.commons.lang.Validate; +import us.myles.ViaVersion.ViaVersionPlugin; + +@Deprecated +public class ViaVersion { + @Getter + private static ViaVersionAPI instance; + @Getter + private static ViaVersionConfig config; + + public static void setInstance(ViaVersionPlugin plugin) { + Validate.isTrue(instance == null, "Instance is already set"); + ViaVersion.instance = plugin; + ViaVersion.config = plugin.getConf(); + } +} diff --git a/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java b/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java similarity index 96% rename from src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java rename to bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java index fb3d77466..939109d17 100644 --- a/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java @@ -1,143 +1,144 @@ -package us.myles.ViaVersion.api; - -import io.netty.buffer.ByteBuf; -import org.bukkit.entity.Player; -import us.myles.ViaVersion.api.boss.BossBar; -import us.myles.ViaVersion.api.boss.BossColor; -import us.myles.ViaVersion.api.boss.BossStyle; -import us.myles.ViaVersion.api.command.ViaVersionCommand; -import us.myles.ViaVersion.api.protocol.ProtocolRegistry; - -import java.util.SortedSet; -import java.util.UUID; - -public interface ViaVersionAPI { - /** - * Is the player connection modified by ViaVersion? - * - * @param player Bukkit player object - * @return True if the client is modified (At the moment it also means version 1.9 and higher) - * @deprecated As of 0.9.9, because all players are ported use {@link #getPlayerVersion(Player)} - */ - boolean isPorted(Player player); - - /** - * Get protocol number from a player - * Will also retrieve version from ProtocolSupport if it's being used. - * - * @param player Bukkit player object - * @return Protocol ID, For example (47=1.8-1.8.8, 107=1.9, 108=1.9.1) - */ - int getPlayerVersion(Player player); - - /** - * Get protocol number from a player - * - * @param uuid UUID of a player - * @return Protocol ID, For example (47=1.8-1.8.8, 107=1.9, 108=1.9.1) - */ - int getPlayerVersion(UUID uuid); - - /** - * Is player using 1.9? - * - * @param playerUUID UUID of a player - * @return True if the client is on 1.9 - * @deprecated As of 0.9.9, because all players are ported use {@link #getPlayerVersion(UUID)} - */ - @Deprecated - boolean isPorted(UUID playerUUID); - - /** - * Get the version of the plugin - * - * @return Plugin version - */ - String getVersion(); - - /** - * Send a raw packet to the player (Use new IDs) - * - * @param player The player to send packet - * @param packet The packet, you need a VarInt ID then the packet contents. - * @throws IllegalArgumentException If not on 1.9 throws IllegalArg - */ - void sendRawPacket(Player player, ByteBuf packet) throws IllegalArgumentException; - - /** - * Send a raw packet to the player (Use new IDs) - * - * @param uuid The uuid from the player to send packet - * @param packet The packet, you need a VarInt ID then the packet contents. - * @throws IllegalArgumentException If not on 1.9 throws IllegalArg - */ - void sendRawPacket(UUID uuid, ByteBuf packet) throws IllegalArgumentException; - - /** - * Create a new bossbar instance - * - * @param title The title - * @param color The color - * @param style The style - * @return Bossbar instance - */ - BossBar createBossBar(String title, BossColor color, BossStyle style); - - /** - * Create a new bossbar instance - * - * @param title The title - * @param health Number between 0 and 1 - * @param color The color - * @param style The style - * @return Bossbar instance - */ - BossBar createBossBar(String title, float health, BossColor color, BossStyle style); - - /** - * Get if global debug is enabled - * - * @return true if debug is enabled - */ - boolean isDebug(); - - /** - * Get ViaVersions command handler - * - * @return command handler - */ - ViaVersionCommand getCommandHandler(); - - /** - * Get if this version is a compatibility build for spigot. - * Eg. 1.9.1 / 1.9.2 allow certain versions to connect - * - * @return True if it is - */ - boolean isCompatSpigotBuild(); - - /** - * Get the supported protocol versions - * This method removes any blocked protocol versions. - * - * @return a list of protocol versions - * @see ProtocolRegistry#getSupportedVersions() for full list. - */ - SortedSet getSupportedVersions(); - - /** - * Gets if the server uses spigot - *

- * Note: Will only work after ViaVersion load - * - * @return True if spigot - */ - boolean isSpigot(); - - /** - * Gets if protocol support is also being used. - * - * @return True if it is being used. - */ - boolean isProtocolSupport(); -} +package us.myles.ViaVersion.api; + +import io.netty.buffer.ByteBuf; +import org.bukkit.entity.Player; +import us.myles.ViaVersion.api.boss.BossBar; +import us.myles.ViaVersion.api.boss.BossColor; +import us.myles.ViaVersion.api.boss.BossStyle; +import us.myles.ViaVersion.api.command.ViaVersionCommand; +import us.myles.ViaVersion.api.protocol.ProtocolRegistry; + +import java.util.SortedSet; +import java.util.UUID; + +@Deprecated +public interface ViaVersionAPI { + /** + * Is the player connection modified by ViaVersion? + * + * @param player Bukkit player object + * @return True if the client is modified (At the moment it also means version 1.9 and higher) + * @deprecated As of 0.9.9, because all players are ported use {@link #getPlayerVersion(Player)} + */ + boolean isPorted(Player player); + + /** + * Get protocol number from a player + * Will also retrieve version from ProtocolSupport if it's being used. + * + * @param player Bukkit player object + * @return Protocol ID, For example (47=1.8-1.8.8, 107=1.9, 108=1.9.1) + */ + int getPlayerVersion(Player player); + + /** + * Get protocol number from a player + * + * @param uuid UUID of a player + * @return Protocol ID, For example (47=1.8-1.8.8, 107=1.9, 108=1.9.1) + */ + int getPlayerVersion(UUID uuid); + + /** + * Is player using 1.9? + * + * @param playerUUID UUID of a player + * @return True if the client is on 1.9 + * @deprecated As of 0.9.9, because all players are ported use {@link #getPlayerVersion(UUID)} + */ + @Deprecated + boolean isPorted(UUID playerUUID); + + /** + * Get the version of the plugin + * + * @return Plugin version + */ + String getVersion(); + + /** + * Send a raw packet to the player (Use new IDs) + * + * @param player The player to send packet + * @param packet The packet, you need a VarInt ID then the packet contents. + * @throws IllegalArgumentException If not on 1.9 throws IllegalArg + */ + void sendRawPacket(Player player, ByteBuf packet) throws IllegalArgumentException; + + /** + * Send a raw packet to the player (Use new IDs) + * + * @param uuid The uuid from the player to send packet + * @param packet The packet, you need a VarInt ID then the packet contents. + * @throws IllegalArgumentException If not on 1.9 throws IllegalArg + */ + void sendRawPacket(UUID uuid, ByteBuf packet) throws IllegalArgumentException; + + /** + * Create a new bossbar instance + * + * @param title The title + * @param color The color + * @param style The style + * @return Bossbar instance + */ + BossBar createBossBar(String title, BossColor color, BossStyle style); + + /** + * Create a new bossbar instance + * + * @param title The title + * @param health Number between 0 and 1 + * @param color The color + * @param style The style + * @return Bossbar instance + */ + BossBar createBossBar(String title, float health, BossColor color, BossStyle style); + + /** + * Get if global debug is enabled + * + * @return true if debug is enabled + */ + boolean isDebug(); + + /** + * Get ViaVersions command handler + * + * @return command handler + */ + ViaVersionCommand getCommandHandler(); + + /** + * Get if this version is a compatibility build for spigot. + * Eg. 1.9.1 / 1.9.2 allow certain versions to connect + * + * @return True if it is + */ + boolean isCompatSpigotBuild(); + + /** + * Get the supported protocol versions + * This method removes any blocked protocol versions. + * + * @return a list of protocol versions + * @see ProtocolRegistry#getSupportedVersions() for full list. + */ + SortedSet getSupportedVersions(); + + /** + * Gets if the server uses spigot + *

+ * Note: Will only work after ViaVersion load + * + * @return True if spigot + */ + boolean isSpigot(); + + /** + * Gets if protocol support is also being used. + * + * @return True if it is being used. + */ + boolean isProtocolSupport(); +} diff --git a/src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java b/bukkit/src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java rename to bukkit/src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandHandler.java new file mode 100644 index 000000000..a5b0a6d64 --- /dev/null +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandHandler.java @@ -0,0 +1,21 @@ +package us.myles.ViaVersion.bukkit; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; +import us.myles.ViaVersion.commands.ViaCommandHandler; + +import java.util.List; + +public class BukkitCommandHandler extends ViaCommandHandler implements CommandExecutor, TabExecutor { + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + return onCommand(new BukkitCommandSender(sender), args); + } + + @Override + public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + return onTabComplete(new BukkitCommandSender(sender), args); + } +} diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandSender.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandSender.java new file mode 100644 index 000000000..64dbf26b6 --- /dev/null +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandSender.java @@ -0,0 +1,20 @@ +package us.myles.ViaVersion.bukkit; + +import lombok.AllArgsConstructor; +import org.bukkit.command.CommandSender; +import us.myles.ViaVersion.api.command.ViaCommandSender; + +@AllArgsConstructor +public class BukkitCommandSender implements ViaCommandSender { + private CommandSender sender; + + @Override + public boolean hasPermission(String permission) { + return sender.hasPermission(permission); + } + + @Override + public void sendMessage(String msg) { + sender.sendMessage(msg); + } +} diff --git a/src/main/java/us/myles/ViaVersion/classgenerator/BasicHandlerConstructor.java b/bukkit/src/main/java/us/myles/ViaVersion/classgenerator/BasicHandlerConstructor.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/classgenerator/BasicHandlerConstructor.java rename to bukkit/src/main/java/us/myles/ViaVersion/classgenerator/BasicHandlerConstructor.java diff --git a/src/main/java/us/myles/ViaVersion/classgenerator/ClassGenerator.java b/bukkit/src/main/java/us/myles/ViaVersion/classgenerator/ClassGenerator.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/classgenerator/ClassGenerator.java rename to bukkit/src/main/java/us/myles/ViaVersion/classgenerator/ClassGenerator.java diff --git a/src/main/java/us/myles/ViaVersion/classgenerator/HandlerConstructor.java b/bukkit/src/main/java/us/myles/ViaVersion/classgenerator/HandlerConstructor.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/classgenerator/HandlerConstructor.java rename to bukkit/src/main/java/us/myles/ViaVersion/classgenerator/HandlerConstructor.java diff --git a/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java rename to bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java diff --git a/src/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java rename to bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java diff --git a/src/main/java/us/myles/ViaVersion/handlers/ViaPacketHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaPacketHandler.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/handlers/ViaPacketHandler.java rename to bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaPacketHandler.java diff --git a/src/main/java/us/myles/ViaVersion/handlers/ViaVersionInitializer.java b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaVersionInitializer.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/handlers/ViaVersionInitializer.java rename to bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaVersionInitializer.java diff --git a/src/main/java/us/myles/ViaVersion/update/UpdateListener.java b/bukkit/src/main/java/us/myles/ViaVersion/listeners/UpdateListener.java similarity index 68% rename from src/main/java/us/myles/ViaVersion/update/UpdateListener.java rename to bukkit/src/main/java/us/myles/ViaVersion/listeners/UpdateListener.java index 965e142ac..c71921d88 100644 --- a/src/main/java/us/myles/ViaVersion/update/UpdateListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/listeners/UpdateListener.java @@ -1,23 +1,19 @@ -package us.myles.ViaVersion.update; - -import lombok.RequiredArgsConstructor; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; -import us.myles.ViaVersion.ViaVersionPlugin; -import us.myles.ViaVersion.api.ViaVersion; - -@RequiredArgsConstructor -public class UpdateListener implements Listener { - - private final ViaVersionPlugin plugin; - - @EventHandler - public void onJoin(PlayerJoinEvent e) { - if (e.getPlayer().hasPermission("viaversion.update") - && ViaVersion.getConfig().isCheckForUpdates()) { - UpdateUtil.sendUpdateMessage(e.getPlayer().getUniqueId(), plugin); - } - } - -} +package us.myles.ViaVersion.listeners; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.update.UpdateUtil; + +public class UpdateListener implements Listener { + + @EventHandler + public void onJoin(PlayerJoinEvent e) { + if (e.getPlayer().hasPermission("viaversion.update") + && ViaVersion.getConfig().isCheckForUpdates()) { + UpdateUtil.sendUpdateMessage(e.getPlayer().getUniqueId()); + } + } + +} diff --git a/src/main/java/us/myles/ViaVersion/util/Configuration.java b/bukkit/src/main/java/us/myles/ViaVersion/util/Configuration.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/util/Configuration.java rename to bukkit/src/main/java/us/myles/ViaVersion/util/Configuration.java diff --git a/src/main/java/us/myles/ViaVersion/util/ProtocolSupportUtil.java b/bukkit/src/main/java/us/myles/ViaVersion/util/ProtocolSupportUtil.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/util/ProtocolSupportUtil.java rename to bukkit/src/main/java/us/myles/ViaVersion/util/ProtocolSupportUtil.java diff --git a/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java b/bukkit/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java rename to bukkit/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java diff --git a/src/main/resources/config.yml b/bukkit/src/main/resources/config.yml similarity index 100% rename from src/main/resources/config.yml rename to bukkit/src/main/resources/config.yml diff --git a/src/main/resources/plugin.yml b/bukkit/src/main/resources/plugin.yml similarity index 100% rename from src/main/resources/plugin.yml rename to bukkit/src/main/resources/plugin.yml diff --git a/bungee/pom.xml b/bungee/pom.xml new file mode 100644 index 000000000..613d7bb07 --- /dev/null +++ b/bungee/pom.xml @@ -0,0 +1,23 @@ + + + + viaversion + us.myles + 1.0.0-ALPHA-16w38a + + 4.0.0 + + viaversion-bungee + + + + + net.md-5 + bungeecord-api + 1.9-SNAPSHOT + provided + + + \ No newline at end of file diff --git a/src/main/java/us/myles/ViaVersion/Bungee.java b/bungee/src/main/java/us/myles/ViaVersion/Bungee.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/Bungee.java rename to bungee/src/main/java/us/myles/ViaVersion/Bungee.java diff --git a/src/main/resources/bungee.yml b/bungee/src/main/resources/bungee.yml similarity index 100% rename from src/main/resources/bungee.yml rename to bungee/src/main/resources/bungee.yml diff --git a/common/pom.xml b/common/pom.xml new file mode 100644 index 000000000..a8efbad02 --- /dev/null +++ b/common/pom.xml @@ -0,0 +1,14 @@ + + + + viaversion + us.myles + 1.0.0-ALPHA-16w38a + + 4.0.0 + + viaversion-common + + \ No newline at end of file diff --git a/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java b/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/PacketWrapper.java rename to common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java diff --git a/src/main/java/us/myles/ViaVersion/api/Pair.java b/common/src/main/java/us/myles/ViaVersion/api/Pair.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/Pair.java rename to common/src/main/java/us/myles/ViaVersion/api/Pair.java diff --git a/common/src/main/java/us/myles/ViaVersion/api/Via.java b/common/src/main/java/us/myles/ViaVersion/api/Via.java new file mode 100644 index 000000000..06d2461d6 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/Via.java @@ -0,0 +1,15 @@ +package us.myles.ViaVersion.api; + +import lombok.Getter; +import org.apache.commons.lang.Validate; +import us.myles.ViaVersion.api.platform.ViaPlatform; + +public class Via { + @Getter + private static ViaPlatform platform; + + public static void init(ViaPlatform platform) { + Validate.isTrue(platform == null, "Platform is already set"); + Via.platform = platform; + } +} diff --git a/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java b/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java rename to common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java diff --git a/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java b/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/boss/BossBar.java rename to common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java diff --git a/src/main/java/us/myles/ViaVersion/api/boss/BossColor.java b/common/src/main/java/us/myles/ViaVersion/api/boss/BossColor.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/boss/BossColor.java rename to common/src/main/java/us/myles/ViaVersion/api/boss/BossColor.java diff --git a/src/main/java/us/myles/ViaVersion/api/boss/BossFlag.java b/common/src/main/java/us/myles/ViaVersion/api/boss/BossFlag.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/boss/BossFlag.java rename to common/src/main/java/us/myles/ViaVersion/api/boss/BossFlag.java diff --git a/src/main/java/us/myles/ViaVersion/api/boss/BossStyle.java b/common/src/main/java/us/myles/ViaVersion/api/boss/BossStyle.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/boss/BossStyle.java rename to common/src/main/java/us/myles/ViaVersion/api/boss/BossStyle.java diff --git a/common/src/main/java/us/myles/ViaVersion/api/command/ViaCommandSender.java b/common/src/main/java/us/myles/ViaVersion/api/command/ViaCommandSender.java new file mode 100644 index 000000000..8dacd6526 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/command/ViaCommandSender.java @@ -0,0 +1,6 @@ +package us.myles.ViaVersion.api.command; + +public interface ViaCommandSender { + public boolean hasPermission(String permission); + public void sendMessage(String msg); +} diff --git a/src/main/java/us/myles/ViaVersion/api/command/ViaSubCommand.java b/common/src/main/java/us/myles/ViaVersion/api/command/ViaSubCommand.java similarity index 85% rename from src/main/java/us/myles/ViaVersion/api/command/ViaSubCommand.java rename to common/src/main/java/us/myles/ViaVersion/api/command/ViaSubCommand.java index 000b97d6e..86df89e65 100644 --- a/src/main/java/us/myles/ViaVersion/api/command/ViaSubCommand.java +++ b/common/src/main/java/us/myles/ViaVersion/api/command/ViaSubCommand.java @@ -1,6 +1,5 @@ package us.myles.ViaVersion.api.command; -import org.bukkit.command.CommandSender; import us.myles.ViaVersion.commands.ViaCommandHandler; import java.util.Collections; @@ -47,7 +46,7 @@ public abstract class ViaSubCommand { * @param args Arguments * @return command executed succesfully if false, show usage */ - public abstract boolean execute(CommandSender sender, String[] args); + public abstract boolean execute(ViaCommandSender sender, String[] args); /** * Yay, possibility to implement tab-completion @@ -56,7 +55,7 @@ public abstract class ViaSubCommand { * @param args args * @return tab complete possibilities */ - public List onTabComplete(CommandSender sender, String[] args) { + public List onTabComplete(ViaCommandSender sender, String[] args) { return Collections.emptyList(); } @@ -71,7 +70,7 @@ public abstract class ViaSubCommand { * @param message string message * @param args optional objects */ - public void sendMessage(CommandSender sender, String message, Object... args) { + public void sendMessage(ViaCommandSender sender, String message, Object... args) { ViaCommandHandler.sendMessage(sender, message, args); } } diff --git a/src/main/java/us/myles/ViaVersion/api/command/ViaVersionCommand.java b/common/src/main/java/us/myles/ViaVersion/api/command/ViaVersionCommand.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/command/ViaVersionCommand.java rename to common/src/main/java/us/myles/ViaVersion/api/command/ViaVersionCommand.java diff --git a/src/main/java/us/myles/ViaVersion/api/data/StoredObject.java b/common/src/main/java/us/myles/ViaVersion/api/data/StoredObject.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/data/StoredObject.java rename to common/src/main/java/us/myles/ViaVersion/api/data/StoredObject.java diff --git a/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java b/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java similarity index 87% rename from src/main/java/us/myles/ViaVersion/api/data/UserConnection.java rename to common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java index 28ddac8c1..a22f77f2a 100644 --- a/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java +++ b/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java @@ -5,9 +5,8 @@ import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandler; import io.netty.channel.socket.SocketChannel; import lombok.Data; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; +import net.md_5.bungee.api.ChatColor; +import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import java.util.Map; @@ -145,18 +144,15 @@ public class UserConnection { pendingDisconnect = true; if (get(ProtocolInfo.class).getUuid() != null) { final UUID uuid = get(ProtocolInfo.class).getUuid(); - if (Bukkit.getPlayer(uuid) != null) { - Bukkit.getScheduler().runTask(Bukkit.getPluginManager().getPlugin("ViaVersion"), new Runnable() { - @Override - public void run() { - Player player = Bukkit.getPlayer(uuid); - if (player != null) - player.kickPlayer(ChatColor.translateAlternateColorCodes('&', reason)); + ViaVersion.getPlatform().runSync(new Runnable() { + @Override + public void run() { + if (!ViaVersion.getPlatform().kickPlayer(uuid, ChatColor.translateAlternateColorCodes('&', reason))) { + getChannel().close(); // =) } - }); - return; - } + } + }); } - getChannel().close(); // =) + } } diff --git a/src/main/java/us/myles/ViaVersion/api/minecraft/Position.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/Position.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/minecraft/Position.java rename to common/src/main/java/us/myles/ViaVersion/api/minecraft/Position.java diff --git a/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/Chunk.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/Chunk.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/minecraft/chunks/Chunk.java rename to common/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/Chunk.java diff --git a/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/ChunkSection.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/ChunkSection.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/minecraft/chunks/ChunkSection.java rename to common/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/ChunkSection.java diff --git a/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/NibbleArray.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/NibbleArray.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/minecraft/chunks/NibbleArray.java rename to common/src/main/java/us/myles/ViaVersion/api/minecraft/chunks/NibbleArray.java diff --git a/src/main/java/us/myles/ViaVersion/api/minecraft/item/Item.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/item/Item.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/minecraft/item/Item.java rename to common/src/main/java/us/myles/ViaVersion/api/minecraft/item/Item.java diff --git a/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/Metadata.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/Metadata.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/minecraft/metadata/Metadata.java rename to common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/Metadata.java diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java new file mode 100644 index 000000000..f72e85438 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java @@ -0,0 +1,22 @@ +package us.myles.ViaVersion.api.platform; + +import java.util.UUID; +import java.util.logging.Logger; + +public interface ViaPlatform { + public Logger getLogger(); + + public String getPlatformName(); + + public String getPluginVersion(); + + public void runAsync(Runnable runnable); + + public void runSync(Runnable runnable); + + public void sendMessage(UUID uuid, String message); + + public boolean kickPlayer(UUID uuid, String message); + + public boolean isPluginEnabled(); +} diff --git a/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java rename to common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java diff --git a/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolPipeline.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolPipeline.java similarity index 96% rename from src/main/java/us/myles/ViaVersion/api/protocol/ProtocolPipeline.java rename to common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolPipeline.java index cf0b03385..fc43208df 100644 --- a/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolPipeline.java +++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolPipeline.java @@ -1,9 +1,9 @@ package us.myles.ViaVersion.api.protocol; -import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.packets.Direction; import us.myles.ViaVersion.packets.PacketType; import us.myles.ViaVersion.packets.State; @@ -109,12 +109,12 @@ public class ProtocolPipeline extends Protocol { } } String name = packet + "[" + userConnection.get(ProtocolInfo.class).getProtocolVersion() + "]"; - ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); + ViaPlatform platform = ViaVersion.getPlatform(); String actualUsername = packetWrapper.user().get(ProtocolInfo.class).getUsername(); String username = actualUsername != null ? actualUsername + " " : ""; - plugin.getLogger().log(Level.INFO, "{0}{1}: {2} {3} -> {4} [{5}] Value: {6}", + platform.getLogger().log(Level.INFO, "{0}{1}: {2} {3} -> {4} [{5}] Value: {6}", new Object[]{ username, direction, diff --git a/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java similarity index 98% rename from src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java rename to common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java index d8349fc25..59016e270 100644 --- a/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java +++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java @@ -2,8 +2,8 @@ package us.myles.ViaVersion.api.protocol; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import org.bukkit.Bukkit; import us.myles.ViaVersion.api.Pair; +import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.protocols.base.BaseProtocol; import us.myles.ViaVersion.protocols.protocol1_10to1_9_3.Protocol1_10To1_9_3_4; import us.myles.ViaVersion.protocols.protocol1_9_1_2to1_9_3_4.Protocol1_9_1_2TO1_9_3_4; @@ -61,7 +61,7 @@ public class ProtocolRegistry { registryMap.get(version).put(output, protocol); } - if (Bukkit.getPluginManager().getPlugin("ViaVersion").isEnabled()) { + if (ViaVersion.getPlatform().isPluginEnabled()) { protocol.registerListeners(); refreshVersions(); } else { diff --git a/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolVersion.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolVersion.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/protocol/ProtocolVersion.java rename to common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolVersion.java diff --git a/src/main/java/us/myles/ViaVersion/api/remapper/PacketHandler.java b/common/src/main/java/us/myles/ViaVersion/api/remapper/PacketHandler.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/remapper/PacketHandler.java rename to common/src/main/java/us/myles/ViaVersion/api/remapper/PacketHandler.java diff --git a/src/main/java/us/myles/ViaVersion/api/remapper/PacketRemapper.java b/common/src/main/java/us/myles/ViaVersion/api/remapper/PacketRemapper.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/remapper/PacketRemapper.java rename to common/src/main/java/us/myles/ViaVersion/api/remapper/PacketRemapper.java diff --git a/src/main/java/us/myles/ViaVersion/api/remapper/TypeRemapper.java b/common/src/main/java/us/myles/ViaVersion/api/remapper/TypeRemapper.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/remapper/TypeRemapper.java rename to common/src/main/java/us/myles/ViaVersion/api/remapper/TypeRemapper.java diff --git a/src/main/java/us/myles/ViaVersion/api/remapper/ValueCreator.java b/common/src/main/java/us/myles/ViaVersion/api/remapper/ValueCreator.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/remapper/ValueCreator.java rename to common/src/main/java/us/myles/ViaVersion/api/remapper/ValueCreator.java diff --git a/src/main/java/us/myles/ViaVersion/api/remapper/ValueReader.java b/common/src/main/java/us/myles/ViaVersion/api/remapper/ValueReader.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/remapper/ValueReader.java rename to common/src/main/java/us/myles/ViaVersion/api/remapper/ValueReader.java diff --git a/src/main/java/us/myles/ViaVersion/api/remapper/ValueTransformer.java b/common/src/main/java/us/myles/ViaVersion/api/remapper/ValueTransformer.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/remapper/ValueTransformer.java rename to common/src/main/java/us/myles/ViaVersion/api/remapper/ValueTransformer.java diff --git a/src/main/java/us/myles/ViaVersion/api/remapper/ValueWriter.java b/common/src/main/java/us/myles/ViaVersion/api/remapper/ValueWriter.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/remapper/ValueWriter.java rename to common/src/main/java/us/myles/ViaVersion/api/remapper/ValueWriter.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/ByteBufReader.java b/common/src/main/java/us/myles/ViaVersion/api/type/ByteBufReader.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/ByteBufReader.java rename to common/src/main/java/us/myles/ViaVersion/api/type/ByteBufReader.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/ByteBufWriter.java b/common/src/main/java/us/myles/ViaVersion/api/type/ByteBufWriter.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/ByteBufWriter.java rename to common/src/main/java/us/myles/ViaVersion/api/type/ByteBufWriter.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/PartialType.java b/common/src/main/java/us/myles/ViaVersion/api/type/PartialType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/PartialType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/PartialType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/Type.java b/common/src/main/java/us/myles/ViaVersion/api/type/Type.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/Type.java rename to common/src/main/java/us/myles/ViaVersion/api/type/Type.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/TypeConverter.java b/common/src/main/java/us/myles/ViaVersion/api/type/TypeConverter.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/TypeConverter.java rename to common/src/main/java/us/myles/ViaVersion/api/type/TypeConverter.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/ArrayType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/ArrayType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/ArrayType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/ArrayType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/BooleanType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/BooleanType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/BooleanType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/BooleanType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/ByteType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/ByteType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/ByteType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/ByteType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/DoubleType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/DoubleType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/DoubleType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/DoubleType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/FloatType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/FloatType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/FloatType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/FloatType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/IntType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/IntType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/IntType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/IntType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/LongType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/LongType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/LongType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/LongType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/RemainingBytesType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/RemainingBytesType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/RemainingBytesType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/RemainingBytesType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/ShortType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/ShortType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/ShortType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/ShortType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/StringType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/StringType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/StringType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/StringType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/UUIDType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/UUIDType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/UUIDType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/UUIDType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/UnsignedByteType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/UnsignedByteType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/UnsignedByteType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/UnsignedByteType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/UnsignedShortType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/UnsignedShortType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/UnsignedShortType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/UnsignedShortType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/VarIntType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/VarIntType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/VarIntType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/VarIntType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/VoidType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/VoidType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/VoidType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/VoidType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/BaseChunkType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/BaseChunkType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/minecraft/BaseChunkType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/BaseChunkType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/EulerAngleType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/EulerAngleType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/minecraft/EulerAngleType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/EulerAngleType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/ItemArrayType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/ItemArrayType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/minecraft/ItemArrayType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/ItemArrayType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/ItemType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/ItemType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/minecraft/ItemType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/ItemType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/MetaListTypeTemplate.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/MetaListTypeTemplate.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/minecraft/MetaListTypeTemplate.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/MetaListTypeTemplate.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/MetaTypeTemplate.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/MetaTypeTemplate.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/minecraft/MetaTypeTemplate.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/MetaTypeTemplate.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/NBTType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/NBTType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/minecraft/NBTType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/NBTType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptPositionType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptPositionType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptPositionType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptPositionType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptUUIDType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptUUIDType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptUUIDType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptUUIDType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/PositionType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/PositionType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/minecraft/PositionType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/PositionType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/VectorType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/VectorType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/minecraft/VectorType.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/VectorType.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/version/Metadata1_8Type.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/version/Metadata1_8Type.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/version/Metadata1_8Type.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/version/Metadata1_8Type.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/version/Metadata1_9Type.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/version/Metadata1_9Type.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/version/Metadata1_9Type.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/version/Metadata1_9Type.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/version/MetadataList1_8Type.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/version/MetadataList1_8Type.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/version/MetadataList1_8Type.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/version/MetadataList1_8Type.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/version/MetadataList1_9Type.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/version/MetadataList1_9Type.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/version/MetadataList1_9Type.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/version/MetadataList1_9Type.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/version/Types1_8.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/version/Types1_8.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/version/Types1_8.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/version/Types1_8.java diff --git a/src/main/java/us/myles/ViaVersion/api/type/types/version/Types1_9.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/version/Types1_9.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/api/type/types/version/Types1_9.java rename to common/src/main/java/us/myles/ViaVersion/api/type/types/version/Types1_9.java diff --git a/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java b/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java similarity index 83% rename from src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java rename to common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java index c67230529..9423b1837 100644 --- a/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java @@ -1,20 +1,17 @@ package us.myles.ViaVersion.commands; import lombok.NonNull; +import net.md_5.bungee.api.ChatColor; import org.apache.commons.lang.Validate; -import org.bukkit.ChatColor; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; import us.myles.ViaVersion.api.command.ViaVersionCommand; import us.myles.ViaVersion.commands.defaultsubs.*; import java.util.*; -public class ViaCommandHandler implements ViaVersionCommand, CommandExecutor, TabCompleter { +public abstract class ViaCommandHandler implements ViaVersionCommand { private Map commandMap; public ViaCommandHandler() { @@ -44,8 +41,7 @@ public class ViaCommandHandler implements ViaVersionCommand, CommandExecutor, Ta return commandMap.get(name.toLowerCase()); } - @Override - public boolean onCommand(CommandSender sender, Command cmd, String arg, String[] args) { + public boolean onCommand(ViaCommandSender sender, String[] args) { if (args.length == 0) { showHelp(sender); return false; @@ -70,8 +66,7 @@ public class ViaCommandHandler implements ViaVersionCommand, CommandExecutor, Ta return result; } - @Override - public List onTabComplete(CommandSender sender, Command command, String arg, String[] args) { + public List onTabComplete(ViaCommandSender sender, String[] args) { Set allowed = calculateAllowedCommands(sender); List output = new ArrayList<>(); @@ -103,20 +98,20 @@ public class ViaCommandHandler implements ViaVersionCommand, CommandExecutor, Ta return output; } - public void showHelp(CommandSender sender) { + public void showHelp(ViaCommandSender sender) { Set allowed = calculateAllowedCommands(sender); if (allowed.size() == 0) { sender.sendMessage(color("&cYou are not allowed to use this command!")); return; } - sender.sendMessage(color("&aViaVersion &c" + ViaVersion.getInstance().getVersion())); + sender.sendMessage(color("&aViaVersion &c" + Via.getPlatform().getPluginVersion())); sender.sendMessage(color("&6Commands:")); for (ViaSubCommand cmd : allowed) sender.sendMessage(color(String.format("&2/viaversion %s &7- &6%s", cmd.usage(), cmd.description()))); allowed.clear(); } - private Set calculateAllowedCommands(CommandSender sender) { + private Set calculateAllowedCommands(ViaCommandSender sender) { Set cmds = new HashSet<>(); for (ViaSubCommand sub : commandMap.values()) if (hasPermission(sender, sub.permission())) @@ -124,7 +119,7 @@ public class ViaCommandHandler implements ViaVersionCommand, CommandExecutor, Ta return cmds; } - private boolean hasPermission(CommandSender sender, String permission) { + private boolean hasPermission(ViaCommandSender sender, String permission) { return permission == null || sender.hasPermission(permission); } @@ -148,7 +143,7 @@ public class ViaCommandHandler implements ViaVersionCommand, CommandExecutor, Ta return string; } - public static void sendMessage(@NonNull CommandSender sender, String message, Object... args) { + public static void sendMessage(@NonNull ViaCommandSender sender, String message, Object... args) { sender.sendMessage(color(args == null ? message : String.format(message, args))); } } diff --git a/src/main/java/us/myles/ViaVersion/commands/defaultsubs/AutoTeamSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/AutoTeamSubCmd.java similarity index 88% rename from src/main/java/us/myles/ViaVersion/commands/defaultsubs/AutoTeamSubCmd.java rename to common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/AutoTeamSubCmd.java index 0217f12d8..dee8f5331 100644 --- a/src/main/java/us/myles/ViaVersion/commands/defaultsubs/AutoTeamSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/AutoTeamSubCmd.java @@ -1,8 +1,8 @@ package us.myles.ViaVersion.commands.defaultsubs; -import org.bukkit.command.CommandSender; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; public class AutoTeamSubCmd extends ViaSubCommand { @@ -17,7 +17,7 @@ public class AutoTeamSubCmd extends ViaSubCommand { } @Override - public boolean execute(CommandSender sender, String[] args) { + public boolean execute(ViaCommandSender sender, String[] args) { ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); boolean newValue = !ViaVersion.getConfig().isAutoTeam(); diff --git a/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DebugSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DebugSubCmd.java similarity index 85% rename from src/main/java/us/myles/ViaVersion/commands/defaultsubs/DebugSubCmd.java rename to common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DebugSubCmd.java index 931ac7282..997f5670d 100644 --- a/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DebugSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DebugSubCmd.java @@ -3,6 +3,7 @@ package us.myles.ViaVersion.commands.defaultsubs; import org.bukkit.command.CommandSender; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; public class DebugSubCmd extends ViaSubCommand { @@ -17,7 +18,7 @@ public class DebugSubCmd extends ViaSubCommand { } @Override - public boolean execute(CommandSender sender, String[] args) { + public boolean execute(ViaCommandSender sender, String[] args) { ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); plugin.setDebug(!plugin.isDebug()); diff --git a/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DisplayLeaksSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DisplayLeaksSubCmd.java similarity index 87% rename from src/main/java/us/myles/ViaVersion/commands/defaultsubs/DisplayLeaksSubCmd.java rename to common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DisplayLeaksSubCmd.java index 8701d9f6f..309b1a85c 100644 --- a/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DisplayLeaksSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DisplayLeaksSubCmd.java @@ -2,6 +2,7 @@ package us.myles.ViaVersion.commands.defaultsubs; import io.netty.util.ResourceLeakDetector; import org.bukkit.command.CommandSender; +import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; public class DisplayLeaksSubCmd extends ViaSubCommand { @@ -16,7 +17,7 @@ public class DisplayLeaksSubCmd extends ViaSubCommand { } @Override - public boolean execute(CommandSender sender, String[] args) { + public boolean execute(ViaCommandSender sender, String[] args) { if (ResourceLeakDetector.getLevel() != ResourceLeakDetector.Level.ADVANCED) ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.ADVANCED); else diff --git a/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DontBugMeSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DontBugMeSubCmd.java similarity index 87% rename from src/main/java/us/myles/ViaVersion/commands/defaultsubs/DontBugMeSubCmd.java rename to common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DontBugMeSubCmd.java index f99936c0d..b35ecf382 100644 --- a/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DontBugMeSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DontBugMeSubCmd.java @@ -3,6 +3,7 @@ package us.myles.ViaVersion.commands.defaultsubs; import org.bukkit.command.CommandSender; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; public class DontBugMeSubCmd extends ViaSubCommand { @@ -17,7 +18,7 @@ public class DontBugMeSubCmd extends ViaSubCommand { } @Override - public boolean execute(CommandSender sender, String[] args) { + public boolean execute(ViaCommandSender sender, String[] args) { ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); boolean newValue = !ViaVersion.getConfig().isCheckForUpdates(); diff --git a/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java similarity index 96% rename from src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java rename to common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java index 03ad3472d..adb108ff7 100644 --- a/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java @@ -9,6 +9,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.plugin.Plugin; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.dump.DumpTemplate; @@ -40,7 +41,7 @@ public class DumpSubCmd extends ViaSubCommand { } @Override - public boolean execute(final CommandSender sender, String[] args) { + public boolean execute(final ViaCommandSender sender, String[] args) { VersionInfo version = new VersionInfo( Bukkit.getServer().getVersion(), Bukkit.getServer().getBukkitVersion(), diff --git a/src/main/java/us/myles/ViaVersion/commands/defaultsubs/HelpSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/HelpSubCmd.java similarity index 84% rename from src/main/java/us/myles/ViaVersion/commands/defaultsubs/HelpSubCmd.java rename to common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/HelpSubCmd.java index 40f936107..6f674c18f 100644 --- a/src/main/java/us/myles/ViaVersion/commands/defaultsubs/HelpSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/HelpSubCmd.java @@ -3,6 +3,7 @@ package us.myles.ViaVersion.commands.defaultsubs; import org.bukkit.command.CommandSender; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; import us.myles.ViaVersion.commands.ViaCommandHandler; @@ -18,7 +19,7 @@ public class HelpSubCmd extends ViaSubCommand { } @Override - public boolean execute(CommandSender sender, String[] args) { + public boolean execute(ViaCommandSender sender, String[] args) { ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); ((ViaCommandHandler) plugin.getCommandHandler()).showHelp(sender); diff --git a/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ListSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ListSubCmd.java similarity index 92% rename from src/main/java/us/myles/ViaVersion/commands/defaultsubs/ListSubCmd.java rename to common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ListSubCmd.java index 2c85a6de6..53c4047e1 100644 --- a/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ListSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ListSubCmd.java @@ -4,6 +4,7 @@ import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; import us.myles.ViaVersion.api.protocol.ProtocolVersion; @@ -26,7 +27,7 @@ public class ListSubCmd extends ViaSubCommand { } @Override - public boolean execute(CommandSender sender, String[] args) { + public boolean execute(ViaCommandSender sender, String[] args) { Map> playerVersions = new TreeMap<>(new Comparator() { @Override public int compare(ProtocolVersion o1, ProtocolVersion o2) { diff --git a/src/main/java/us/myles/ViaVersion/commands/defaultsubs/PPSSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/PPSSubCmd.java similarity index 94% rename from src/main/java/us/myles/ViaVersion/commands/defaultsubs/PPSSubCmd.java rename to common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/PPSSubCmd.java index d2e7bc186..6cf98ae8e 100644 --- a/src/main/java/us/myles/ViaVersion/commands/defaultsubs/PPSSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/PPSSubCmd.java @@ -5,6 +5,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.protocol.ProtocolVersion; @@ -28,7 +29,7 @@ public class PPSSubCmd extends ViaSubCommand { } @Override - public boolean execute(CommandSender sender, String[] args) { + public boolean execute(ViaCommandSender sender, String[] args) { Map> playerVersions = new HashMap<>(); int totalPackets = 0; int clients = 0; diff --git a/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java similarity index 84% rename from src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java rename to common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java index 9a25e6c13..b919e4ab8 100644 --- a/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java @@ -1,8 +1,8 @@ package us.myles.ViaVersion.commands.defaultsubs; -import org.bukkit.command.CommandSender; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; public class ReloadSubCmd extends ViaSubCommand { @@ -17,7 +17,7 @@ public class ReloadSubCmd extends ViaSubCommand { } @Override - public boolean execute(CommandSender sender, String[] args) { + public boolean execute(ViaCommandSender sender, String[] args) { ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); plugin.getConf().generateConfig(); diff --git a/src/main/java/us/myles/ViaVersion/dump/DumpTemplate.java b/common/src/main/java/us/myles/ViaVersion/dump/DumpTemplate.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/dump/DumpTemplate.java rename to common/src/main/java/us/myles/ViaVersion/dump/DumpTemplate.java diff --git a/src/main/java/us/myles/ViaVersion/dump/PluginInfo.java b/common/src/main/java/us/myles/ViaVersion/dump/PluginInfo.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/dump/PluginInfo.java rename to common/src/main/java/us/myles/ViaVersion/dump/PluginInfo.java diff --git a/src/main/java/us/myles/ViaVersion/dump/VersionInfo.java b/common/src/main/java/us/myles/ViaVersion/dump/VersionInfo.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/dump/VersionInfo.java rename to common/src/main/java/us/myles/ViaVersion/dump/VersionInfo.java diff --git a/src/main/java/us/myles/ViaVersion/exception/CancelException.java b/common/src/main/java/us/myles/ViaVersion/exception/CancelException.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/exception/CancelException.java rename to common/src/main/java/us/myles/ViaVersion/exception/CancelException.java diff --git a/src/main/java/us/myles/ViaVersion/exception/InformativeException.java b/common/src/main/java/us/myles/ViaVersion/exception/InformativeException.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/exception/InformativeException.java rename to common/src/main/java/us/myles/ViaVersion/exception/InformativeException.java diff --git a/src/main/java/us/myles/ViaVersion/packets/Direction.java b/common/src/main/java/us/myles/ViaVersion/packets/Direction.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/packets/Direction.java rename to common/src/main/java/us/myles/ViaVersion/packets/Direction.java diff --git a/src/main/java/us/myles/ViaVersion/packets/PacketType.java b/common/src/main/java/us/myles/ViaVersion/packets/PacketType.java similarity index 98% rename from src/main/java/us/myles/ViaVersion/packets/PacketType.java rename to common/src/main/java/us/myles/ViaVersion/packets/PacketType.java index 43bb5cf0c..9aade55b8 100644 --- a/src/main/java/us/myles/ViaVersion/packets/PacketType.java +++ b/common/src/main/java/us/myles/ViaVersion/packets/PacketType.java @@ -1,208 +1,208 @@ -package us.myles.ViaVersion.packets; - -import java.util.HashMap; - -@Deprecated -public enum PacketType { - /* Handshake serverbound */ - HANDSHAKE(State.HANDSHAKE, Direction.INCOMING, 0x00), // Mapped - /* Login serverbound */ - LOGIN_START(State.LOGIN, Direction.INCOMING, 0x00), // Mapped - LOGIN_ENCRYPTION_RESPONSE(State.LOGIN, Direction.INCOMING, 0x01), // Mapped - /* Login clientbound */ - LOGIN_DISCONNECT(State.LOGIN, Direction.OUTGOING, 0x00), // Mapped - LOGIN_ENCRYPTION_REQUEST(State.LOGIN, Direction.OUTGOING, 0x01), // Mapped - LOGIN_SUCCESS(State.LOGIN, Direction.OUTGOING, 0x02), // Mapped - LOGIN_SETCOMPRESSION(State.LOGIN, Direction.OUTGOING, 0x03), // Mapped - - /* Status serverbound */ - STATUS_REQUEST(State.STATUS, Direction.INCOMING, 0x00), // Mapped - STATUS_PING(State.STATUS, Direction.INCOMING, 0x01), // Mapped - /* Status clientbound */ - STATUS_RESPONSE(State.STATUS, Direction.OUTGOING, 0x00), - STATUS_PONG(State.STATUS, Direction.OUTGOING, 0x01), - /* Play serverbound */ - PLAY_TP_CONFIRM(State.PLAY, Direction.INCOMING, -1, 0x00), // Mapped - PLAY_TAB_COMPLETE_REQUEST(State.PLAY, Direction.INCOMING, 0x14, 0x01), // Mapped - PLAY_CHAT_MESSAGE_CLIENT(State.PLAY, Direction.INCOMING, 0x01, 0x02), // Mapped - PLAY_CLIENT_STATUS(State.PLAY, Direction.INCOMING, 0x16, 0x03), // Mapped - PLAY_CLIENT_SETTINGS(State.PLAY, Direction.INCOMING, 0x15, 0x04), // Mapped - PLAY_CONFIRM_TRANS(State.PLAY, Direction.INCOMING, 0x0F, 0x05), // Mapped - PLAY_ENCHANT_ITEM(State.PLAY, Direction.INCOMING, 0x11, 0x06), // Mapped - PLAY_CLICK_WINDOW(State.PLAY, Direction.INCOMING, 0x0E, 0x07), // Mapped - PLAY_CLOSE_WINDOW_REQUEST(State.PLAY, Direction.INCOMING, 0x0D, 0x08), // Mapped - PLAY_PLUGIN_MESSAGE_REQUEST(State.PLAY, Direction.INCOMING, 0x17, 0x09), - PLAY_USE_ENTITY(State.PLAY, Direction.INCOMING, 0x02, 0x0A), // Mapped - PLAY_KEEP_ALIVE_REQUEST(State.PLAY, Direction.INCOMING, 0x00, 0x0B), // Mapped - PLAY_PLAYER_POSITION_REQUEST(State.PLAY, Direction.INCOMING, 0x04, 0x0C), // Mapped - PLAY_PLAYER_POSITION_LOOK_REQUEST(State.PLAY, Direction.INCOMING, 0x06, 0x0D), // Mapped - PLAY_PLAYER_LOOK_REQUEST(State.PLAY, Direction.INCOMING, 0x05, 0x0E), // Mapped - PLAY_PLAYER(State.PLAY, Direction.INCOMING, 0x03, 0x0F), // Mapped - PLAY_VEHICLE_MOVE_REQUEST(State.PLAY, Direction.INCOMING, -1, 0x10), // Mapped - PLAY_STEER_BOAT(State.PLAY, Direction.INCOMING, -1, 0x11), // Mapped - PLAY_PLAYER_ABILITIES_REQUEST(State.PLAY, Direction.INCOMING, 0x13, 0x12), // Mapped - PLAY_PLAYER_DIGGING(State.PLAY, Direction.INCOMING, 0x07, 0x13), // Mapped - PLAY_ENTITY_ACTION(State.PLAY, Direction.INCOMING, 0x0B, 0x14), // Mapped - PLAY_STEER_VEHICLE(State.PLAY, Direction.INCOMING, 0x0C, 0x15), // Mapped - - PLAY_RESOURCE_PACK_STATUS(State.PLAY, Direction.INCOMING, 0x19, 0x16), // Mapped - PLAY_HELD_ITEM_CHANGE_REQUEST(State.PLAY, Direction.INCOMING, 0x09, 0x17), // Mapped - - PLAY_CREATIVE_INVENTORY_ACTION(State.PLAY, Direction.INCOMING, 0x10, 0x18), // Mapped - PLAY_UPDATE_SIGN_REQUEST(State.PLAY, Direction.INCOMING, 0x12, 0x19), // Mapped - PLAY_ANIMATION_REQUEST(State.PLAY, Direction.INCOMING, 0x0A, 0x1A), // Mapped - PLAY_SPECTATE(State.PLAY, Direction.INCOMING, 0x18, 0x1B), // Mapped - PLAY_PLAYER_BLOCK_PLACEMENT(State.PLAY, Direction.INCOMING, 0x08, 0x1C), // Mapped - PLAY_USE_ITEM(State.PLAY, Direction.INCOMING, -1, 0x1D), // Mapped - /* Play clientbound */ - PLAY_SPAWN_OBJECT(State.PLAY, Direction.OUTGOING, 0x0E, 0x00), // Mapped - PLAY_SPAWN_XP_ORB(State.PLAY, Direction.OUTGOING, 0x11, 0x01), // Mapped - PLAY_SPAWN_GLOBAL_ENTITY(State.PLAY, Direction.OUTGOING, 0x2C, 0x02), // Mapped - PLAY_SPAWN_MOB(State.PLAY, Direction.OUTGOING, 0x0F, 0x03), // Mapped - PLAY_SPAWN_PAINTING(State.PLAY, Direction.OUTGOING, 0x10, 0x04), // Mapped - PLAY_SPAWN_PLAYER(State.PLAY, Direction.OUTGOING, 0x0C, 0x05), // Mapped - - PLAY_ANIMATION(State.PLAY, Direction.OUTGOING, 0x0B, 0x06), // Mapped - PLAY_STATS(State.PLAY, Direction.OUTGOING, 0x37, 0x07), // Mapped - - PLAY_BLOCK_BREAK_ANIMATION(State.PLAY, Direction.OUTGOING, 0x25, 0x08), // Mapped - PLAY_UPDATE_BLOCK_ENTITY(State.PLAY, Direction.OUTGOING, 0x35, 0x09), // Mapped - PLAY_BLOCK_ACTION(State.PLAY, Direction.OUTGOING, 0x24, 0x0A), // Mapped - PLAY_BLOCK_CHANGE(State.PLAY, Direction.OUTGOING, 0x23, 0x0B), // Mapped - - PLAY_BOSS_BAR(State.PLAY, Direction.OUTGOING, -1, 0x0C), - PLAY_SERVER_DIFFICULTY(State.PLAY, Direction.OUTGOING, 0x41, 0x0D), // Mapped - PLAY_TAB_COMPLETE(State.PLAY, Direction.OUTGOING, 0x3A, 0x0E), // Mapped - PLAY_CHAT_MESSAGE(State.PLAY, Direction.OUTGOING, 0x02, 0x0F), // Mapped - PLAY_MULTI_BLOCK_CHANGE(State.PLAY, Direction.OUTGOING, 0x22, 0x10), // Mapped - PLAY_CONFIRM_TRANSACTION(State.PLAY, Direction.OUTGOING, 0x32, 0x11), // Mapped - PLAY_CLOSE_WINDOW(State.PLAY, Direction.OUTGOING, 0x2E, 0x12), // Mapped - PLAY_OPEN_WINDOW(State.PLAY, Direction.OUTGOING, 0x2D, 0x13), // Mapped - PLAY_WINDOW_ITEMS(State.PLAY, Direction.OUTGOING, 0x30, 0x14), // Mapped - PLAY_WINDOW_PROPERTY(State.PLAY, Direction.OUTGOING, 0x31, 0x15), // Mapped - PLAY_SET_SLOT(State.PLAY, Direction.OUTGOING, 0x2F, 0x16), // Mapped - PLAY_SET_COOLDOWN(State.PLAY, Direction.OUTGOING, -1, 0x17), - PLAY_PLUGIN_MESSAGE(State.PLAY, Direction.OUTGOING, 0x3F, 0x18), // Mapped - PLAY_NAMED_SOUND_EFFECT(State.PLAY, Direction.OUTGOING, 0x29, 0x19), // Mapped - PLAY_DISCONNECT(State.PLAY, Direction.OUTGOING, 0x40, 0x1A), // Mapped - PLAY_ENTITY_STATUS(State.PLAY, Direction.OUTGOING, 0x1A, 0x1B), // Mapped - PLAY_EXPLOSION(State.PLAY, Direction.OUTGOING, 0x27, 0x1C), // Mapped - PLAY_UNLOAD_CHUNK(State.PLAY, Direction.OUTGOING, -1, 0x1D), - PLAY_CHANGE_GAME_STATE(State.PLAY, Direction.OUTGOING, 0x2B, 0x1E), - PLAY_KEEP_ALIVE(State.PLAY, Direction.OUTGOING, 0x00, 0x1F), // Mapped - PLAY_CHUNK_DATA(State.PLAY, Direction.OUTGOING, 0x21, 0x20), // Mapped - PLAY_EFFECT(State.PLAY, Direction.OUTGOING, 0x28, 0x21), // Mapped - PLAY_PARTICLE(State.PLAY, Direction.OUTGOING, 0x2A, 0x22), // Mapped - PLAY_JOIN_GAME(State.PLAY, Direction.OUTGOING, 0x01, 0x23), // Mapped - PLAY_MAP(State.PLAY, Direction.OUTGOING, 0x34, 0x24), // Mapped - PLAY_ENTITY_RELATIVE_MOVE(State.PLAY, Direction.OUTGOING, 0x15, 0x25), // Mapped - PLAY_ENTITY_LOOK_MOVE(State.PLAY, Direction.OUTGOING, 0x17, 0x26), // Mapped - PLAY_ENTITY_LOOK(State.PLAY, Direction.OUTGOING, 0x16, 0x27), // Mapped - PLAY_ENTITY(State.PLAY, Direction.OUTGOING, 0x14, 0x28), // Mapped - PLAY_VEHICLE_MOVE(State.PLAY, Direction.OUTGOING, -1, 0x29), - PLAY_OPEN_SIGN_EDITOR(State.PLAY, Direction.OUTGOING, 0x36, 0x2A), // Mapped - PLAY_PLAYER_ABILITIES(State.PLAY, Direction.OUTGOING, 0x39, 0x2B), // Mapped - PLAY_COMBAT_EVENT(State.PLAY, Direction.OUTGOING, 0x42, 0x2C), // Mapped - PLAY_PLAYER_LIST_ITEM(State.PLAY, Direction.OUTGOING, 0x38, 0x2D), // Mapped - PLAY_PLAYER_POSITION_LOOK(State.PLAY, Direction.OUTGOING, 0x08, 0x2E), // Mapped - PLAY_USE_BED(State.PLAY, Direction.OUTGOING, 0x0A, 0x2F), // Mapped - PLAY_DESTROY_ENTITIES(State.PLAY, Direction.OUTGOING, 0x13, 0x30), // Mapped - PLAY_REMOVE_ENTITY_EFFECT(State.PLAY, Direction.OUTGOING, 0x1E, 0x31), // Mapped - PLAY_RESOURCE_PACK_SEND(State.PLAY, Direction.OUTGOING, 0x48, 0x32), // Mapped - PLAY_RESPAWN(State.PLAY, Direction.OUTGOING, 0x07, 0x33), // Mapped - PLAY_ENTITY_HEAD_LOOK(State.PLAY, Direction.OUTGOING, 0x19, 0x34), // Mapped - PLAY_WORLD_BORDER(State.PLAY, Direction.OUTGOING, 0x44, 0x35), // Mapped - PLAY_CAMERA(State.PLAY, Direction.OUTGOING, 0x43, 0x36), // Mapped - PLAY_HELD_ITEM_CHANGE(State.PLAY, Direction.OUTGOING, 0x09, 0x37), // Mapped - PLAY_DISPLAY_SCOREBOARD(State.PLAY, Direction.OUTGOING, 0x3D, 0x38), // Mapped - PLAY_ENTITY_METADATA(State.PLAY, Direction.OUTGOING, 0x1C, 0x39), // Mapped - PLAY_ATTACH_ENTITY(State.PLAY, Direction.OUTGOING, 0x1B, 0x3A), // Mapped - PLAY_ENTITY_VELOCITY(State.PLAY, Direction.OUTGOING, 0x12, 0x3B), // Mapped - PLAY_ENTITY_EQUIPMENT(State.PLAY, Direction.OUTGOING, 0x04, 0x3C), // Mapped - PLAY_SET_XP(State.PLAY, Direction.OUTGOING, 0x1F, 0x3D), // Mapped - PLAY_UPDATE_HEALTH(State.PLAY, Direction.OUTGOING, 0x06, 0x3E), // Mapped - PLAY_SCOREBOARD_OBJ(State.PLAY, Direction.OUTGOING, 0x3B, 0x3F), // Mapped - PLAY_SET_PASSENGERS(State.PLAY, Direction.OUTGOING, -1, 0x40), - PLAY_TEAM(State.PLAY, Direction.OUTGOING, 0x3E, 0x41), // Mapped - PLAY_UPDATE_SCORE(State.PLAY, Direction.OUTGOING, 0x3C, 0x42), // Mapped - PLAY_SPAWN_POSITION(State.PLAY, Direction.OUTGOING, 0x05, 0x43), // Mapped - PLAY_TIME_UPDATE(State.PLAY, Direction.OUTGOING, 0x03, 0x44), // Mapped - PLAY_TITLE(State.PLAY, Direction.OUTGOING, 0x45, 0x45), // Mapped - PLAY_UPDATE_SIGN(State.PLAY, Direction.OUTGOING, 0x33, 0x46), // Mapped - PLAY_SOUND_EFFECT(State.PLAY, Direction.OUTGOING, -1, 0x47), - PLAY_PLAYER_LIST_HEADER_FOOTER(State.PLAY, Direction.OUTGOING, 0x47, 0x48), // Mapped - PLAY_COLLECT_ITEM(State.PLAY, Direction.OUTGOING, 0x0D, 0x49), // Mapped - PLAY_ENTITY_TELEPORT(State.PLAY, Direction.OUTGOING, 0x18, 0x4A), // Mapped - PLAY_ENTITY_PROPERTIES(State.PLAY, Direction.OUTGOING, 0x20, 0x4B), // Mapped - PLAY_ENTITY_EFFECT(State.PLAY, Direction.OUTGOING, 0x1D, 0x4C), // Mapped - - PLAY_MAP_CHUNK_BULK(State.PLAY, Direction.OUTGOING, 0x26, -1), - PLAY_SET_COMPRESSION(State.PLAY, Direction.OUTGOING, 0x46, -1), - PLAY_UPDATE_ENTITY_NBT(State.PLAY, Direction.OUTGOING, 0x49, -1); - - private static HashMap oldids = new HashMap<>(); - private static HashMap newids = new HashMap<>(); - - static { - for (PacketType pt : PacketType.values()) { - oldids.put(toShort((short) pt.getPacketID(), (short) pt.getDirection().ordinal(), (short) pt.getState().ordinal()), pt); - newids.put(toShort((short) pt.getNewPacketID(), (short) pt.getDirection().ordinal(), (short) pt.getState().ordinal()), pt); - } - } - - private State state; - private Direction direction; - private int packetID; - private int newPacketID = -1; - - PacketType(State state, Direction direction, int packetID) { - this.state = state; - this.direction = direction; - this.packetID = packetID; - this.newPacketID = packetID; - } - - PacketType(State state, Direction direction, int packetID, int newPacketID) { - this.state = state; - this.direction = direction; - this.packetID = packetID; - this.newPacketID = newPacketID; - } - - public static PacketType findNewPacket(State state, Direction direction, int id) { - return newids.get(toShort((short) id, (short) direction.ordinal(), (short) state.ordinal())); - } - - public static PacketType findOldPacket(State state, Direction direction, int id) { - return oldids.get(toShort((short) id, (short) direction.ordinal(), (short) state.ordinal())); - } - - public static PacketType getIncomingPacket(State state, int id) { - return findNewPacket(state, Direction.INCOMING, id); - } - - public static PacketType getOutgoingPacket(State state, int id) { - return findOldPacket(state, Direction.OUTGOING, id); - } - - private static short toShort(short id, short direction, short state) { - return (short) ((id & 0x00FF) | (direction << 8) & 0x0F00 | (state << 12) & 0xF000); - } - - public State getState() { - return state; - } - - public Direction getDirection() { - return direction; - } - - public int getPacketID() { - return packetID; - } - - public int getNewPacketID() { - return newPacketID; - } - -} +package us.myles.ViaVersion.packets; + +import java.util.HashMap; + +@Deprecated +public enum PacketType { + /* Handshake serverbound */ + HANDSHAKE(State.HANDSHAKE, Direction.INCOMING, 0x00), // Mapped + /* Login serverbound */ + LOGIN_START(State.LOGIN, Direction.INCOMING, 0x00), // Mapped + LOGIN_ENCRYPTION_RESPONSE(State.LOGIN, Direction.INCOMING, 0x01), // Mapped + /* Login clientbound */ + LOGIN_DISCONNECT(State.LOGIN, Direction.OUTGOING, 0x00), // Mapped + LOGIN_ENCRYPTION_REQUEST(State.LOGIN, Direction.OUTGOING, 0x01), // Mapped + LOGIN_SUCCESS(State.LOGIN, Direction.OUTGOING, 0x02), // Mapped + LOGIN_SETCOMPRESSION(State.LOGIN, Direction.OUTGOING, 0x03), // Mapped + + /* Status serverbound */ + STATUS_REQUEST(State.STATUS, Direction.INCOMING, 0x00), // Mapped + STATUS_PING(State.STATUS, Direction.INCOMING, 0x01), // Mapped + /* Status clientbound */ + STATUS_RESPONSE(State.STATUS, Direction.OUTGOING, 0x00), + STATUS_PONG(State.STATUS, Direction.OUTGOING, 0x01), + /* Play serverbound */ + PLAY_TP_CONFIRM(State.PLAY, Direction.INCOMING, -1, 0x00), // Mapped + PLAY_TAB_COMPLETE_REQUEST(State.PLAY, Direction.INCOMING, 0x14, 0x01), // Mapped + PLAY_CHAT_MESSAGE_CLIENT(State.PLAY, Direction.INCOMING, 0x01, 0x02), // Mapped + PLAY_CLIENT_STATUS(State.PLAY, Direction.INCOMING, 0x16, 0x03), // Mapped + PLAY_CLIENT_SETTINGS(State.PLAY, Direction.INCOMING, 0x15, 0x04), // Mapped + PLAY_CONFIRM_TRANS(State.PLAY, Direction.INCOMING, 0x0F, 0x05), // Mapped + PLAY_ENCHANT_ITEM(State.PLAY, Direction.INCOMING, 0x11, 0x06), // Mapped + PLAY_CLICK_WINDOW(State.PLAY, Direction.INCOMING, 0x0E, 0x07), // Mapped + PLAY_CLOSE_WINDOW_REQUEST(State.PLAY, Direction.INCOMING, 0x0D, 0x08), // Mapped + PLAY_PLUGIN_MESSAGE_REQUEST(State.PLAY, Direction.INCOMING, 0x17, 0x09), + PLAY_USE_ENTITY(State.PLAY, Direction.INCOMING, 0x02, 0x0A), // Mapped + PLAY_KEEP_ALIVE_REQUEST(State.PLAY, Direction.INCOMING, 0x00, 0x0B), // Mapped + PLAY_PLAYER_POSITION_REQUEST(State.PLAY, Direction.INCOMING, 0x04, 0x0C), // Mapped + PLAY_PLAYER_POSITION_LOOK_REQUEST(State.PLAY, Direction.INCOMING, 0x06, 0x0D), // Mapped + PLAY_PLAYER_LOOK_REQUEST(State.PLAY, Direction.INCOMING, 0x05, 0x0E), // Mapped + PLAY_PLAYER(State.PLAY, Direction.INCOMING, 0x03, 0x0F), // Mapped + PLAY_VEHICLE_MOVE_REQUEST(State.PLAY, Direction.INCOMING, -1, 0x10), // Mapped + PLAY_STEER_BOAT(State.PLAY, Direction.INCOMING, -1, 0x11), // Mapped + PLAY_PLAYER_ABILITIES_REQUEST(State.PLAY, Direction.INCOMING, 0x13, 0x12), // Mapped + PLAY_PLAYER_DIGGING(State.PLAY, Direction.INCOMING, 0x07, 0x13), // Mapped + PLAY_ENTITY_ACTION(State.PLAY, Direction.INCOMING, 0x0B, 0x14), // Mapped + PLAY_STEER_VEHICLE(State.PLAY, Direction.INCOMING, 0x0C, 0x15), // Mapped + + PLAY_RESOURCE_PACK_STATUS(State.PLAY, Direction.INCOMING, 0x19, 0x16), // Mapped + PLAY_HELD_ITEM_CHANGE_REQUEST(State.PLAY, Direction.INCOMING, 0x09, 0x17), // Mapped + + PLAY_CREATIVE_INVENTORY_ACTION(State.PLAY, Direction.INCOMING, 0x10, 0x18), // Mapped + PLAY_UPDATE_SIGN_REQUEST(State.PLAY, Direction.INCOMING, 0x12, 0x19), // Mapped + PLAY_ANIMATION_REQUEST(State.PLAY, Direction.INCOMING, 0x0A, 0x1A), // Mapped + PLAY_SPECTATE(State.PLAY, Direction.INCOMING, 0x18, 0x1B), // Mapped + PLAY_PLAYER_BLOCK_PLACEMENT(State.PLAY, Direction.INCOMING, 0x08, 0x1C), // Mapped + PLAY_USE_ITEM(State.PLAY, Direction.INCOMING, -1, 0x1D), // Mapped + /* Play clientbound */ + PLAY_SPAWN_OBJECT(State.PLAY, Direction.OUTGOING, 0x0E, 0x00), // Mapped + PLAY_SPAWN_XP_ORB(State.PLAY, Direction.OUTGOING, 0x11, 0x01), // Mapped + PLAY_SPAWN_GLOBAL_ENTITY(State.PLAY, Direction.OUTGOING, 0x2C, 0x02), // Mapped + PLAY_SPAWN_MOB(State.PLAY, Direction.OUTGOING, 0x0F, 0x03), // Mapped + PLAY_SPAWN_PAINTING(State.PLAY, Direction.OUTGOING, 0x10, 0x04), // Mapped + PLAY_SPAWN_PLAYER(State.PLAY, Direction.OUTGOING, 0x0C, 0x05), // Mapped + + PLAY_ANIMATION(State.PLAY, Direction.OUTGOING, 0x0B, 0x06), // Mapped + PLAY_STATS(State.PLAY, Direction.OUTGOING, 0x37, 0x07), // Mapped + + PLAY_BLOCK_BREAK_ANIMATION(State.PLAY, Direction.OUTGOING, 0x25, 0x08), // Mapped + PLAY_UPDATE_BLOCK_ENTITY(State.PLAY, Direction.OUTGOING, 0x35, 0x09), // Mapped + PLAY_BLOCK_ACTION(State.PLAY, Direction.OUTGOING, 0x24, 0x0A), // Mapped + PLAY_BLOCK_CHANGE(State.PLAY, Direction.OUTGOING, 0x23, 0x0B), // Mapped + + PLAY_BOSS_BAR(State.PLAY, Direction.OUTGOING, -1, 0x0C), + PLAY_SERVER_DIFFICULTY(State.PLAY, Direction.OUTGOING, 0x41, 0x0D), // Mapped + PLAY_TAB_COMPLETE(State.PLAY, Direction.OUTGOING, 0x3A, 0x0E), // Mapped + PLAY_CHAT_MESSAGE(State.PLAY, Direction.OUTGOING, 0x02, 0x0F), // Mapped + PLAY_MULTI_BLOCK_CHANGE(State.PLAY, Direction.OUTGOING, 0x22, 0x10), // Mapped + PLAY_CONFIRM_TRANSACTION(State.PLAY, Direction.OUTGOING, 0x32, 0x11), // Mapped + PLAY_CLOSE_WINDOW(State.PLAY, Direction.OUTGOING, 0x2E, 0x12), // Mapped + PLAY_OPEN_WINDOW(State.PLAY, Direction.OUTGOING, 0x2D, 0x13), // Mapped + PLAY_WINDOW_ITEMS(State.PLAY, Direction.OUTGOING, 0x30, 0x14), // Mapped + PLAY_WINDOW_PROPERTY(State.PLAY, Direction.OUTGOING, 0x31, 0x15), // Mapped + PLAY_SET_SLOT(State.PLAY, Direction.OUTGOING, 0x2F, 0x16), // Mapped + PLAY_SET_COOLDOWN(State.PLAY, Direction.OUTGOING, -1, 0x17), + PLAY_PLUGIN_MESSAGE(State.PLAY, Direction.OUTGOING, 0x3F, 0x18), // Mapped + PLAY_NAMED_SOUND_EFFECT(State.PLAY, Direction.OUTGOING, 0x29, 0x19), // Mapped + PLAY_DISCONNECT(State.PLAY, Direction.OUTGOING, 0x40, 0x1A), // Mapped + PLAY_ENTITY_STATUS(State.PLAY, Direction.OUTGOING, 0x1A, 0x1B), // Mapped + PLAY_EXPLOSION(State.PLAY, Direction.OUTGOING, 0x27, 0x1C), // Mapped + PLAY_UNLOAD_CHUNK(State.PLAY, Direction.OUTGOING, -1, 0x1D), + PLAY_CHANGE_GAME_STATE(State.PLAY, Direction.OUTGOING, 0x2B, 0x1E), + PLAY_KEEP_ALIVE(State.PLAY, Direction.OUTGOING, 0x00, 0x1F), // Mapped + PLAY_CHUNK_DATA(State.PLAY, Direction.OUTGOING, 0x21, 0x20), // Mapped + PLAY_EFFECT(State.PLAY, Direction.OUTGOING, 0x28, 0x21), // Mapped + PLAY_PARTICLE(State.PLAY, Direction.OUTGOING, 0x2A, 0x22), // Mapped + PLAY_JOIN_GAME(State.PLAY, Direction.OUTGOING, 0x01, 0x23), // Mapped + PLAY_MAP(State.PLAY, Direction.OUTGOING, 0x34, 0x24), // Mapped + PLAY_ENTITY_RELATIVE_MOVE(State.PLAY, Direction.OUTGOING, 0x15, 0x25), // Mapped + PLAY_ENTITY_LOOK_MOVE(State.PLAY, Direction.OUTGOING, 0x17, 0x26), // Mapped + PLAY_ENTITY_LOOK(State.PLAY, Direction.OUTGOING, 0x16, 0x27), // Mapped + PLAY_ENTITY(State.PLAY, Direction.OUTGOING, 0x14, 0x28), // Mapped + PLAY_VEHICLE_MOVE(State.PLAY, Direction.OUTGOING, -1, 0x29), + PLAY_OPEN_SIGN_EDITOR(State.PLAY, Direction.OUTGOING, 0x36, 0x2A), // Mapped + PLAY_PLAYER_ABILITIES(State.PLAY, Direction.OUTGOING, 0x39, 0x2B), // Mapped + PLAY_COMBAT_EVENT(State.PLAY, Direction.OUTGOING, 0x42, 0x2C), // Mapped + PLAY_PLAYER_LIST_ITEM(State.PLAY, Direction.OUTGOING, 0x38, 0x2D), // Mapped + PLAY_PLAYER_POSITION_LOOK(State.PLAY, Direction.OUTGOING, 0x08, 0x2E), // Mapped + PLAY_USE_BED(State.PLAY, Direction.OUTGOING, 0x0A, 0x2F), // Mapped + PLAY_DESTROY_ENTITIES(State.PLAY, Direction.OUTGOING, 0x13, 0x30), // Mapped + PLAY_REMOVE_ENTITY_EFFECT(State.PLAY, Direction.OUTGOING, 0x1E, 0x31), // Mapped + PLAY_RESOURCE_PACK_SEND(State.PLAY, Direction.OUTGOING, 0x48, 0x32), // Mapped + PLAY_RESPAWN(State.PLAY, Direction.OUTGOING, 0x07, 0x33), // Mapped + PLAY_ENTITY_HEAD_LOOK(State.PLAY, Direction.OUTGOING, 0x19, 0x34), // Mapped + PLAY_WORLD_BORDER(State.PLAY, Direction.OUTGOING, 0x44, 0x35), // Mapped + PLAY_CAMERA(State.PLAY, Direction.OUTGOING, 0x43, 0x36), // Mapped + PLAY_HELD_ITEM_CHANGE(State.PLAY, Direction.OUTGOING, 0x09, 0x37), // Mapped + PLAY_DISPLAY_SCOREBOARD(State.PLAY, Direction.OUTGOING, 0x3D, 0x38), // Mapped + PLAY_ENTITY_METADATA(State.PLAY, Direction.OUTGOING, 0x1C, 0x39), // Mapped + PLAY_ATTACH_ENTITY(State.PLAY, Direction.OUTGOING, 0x1B, 0x3A), // Mapped + PLAY_ENTITY_VELOCITY(State.PLAY, Direction.OUTGOING, 0x12, 0x3B), // Mapped + PLAY_ENTITY_EQUIPMENT(State.PLAY, Direction.OUTGOING, 0x04, 0x3C), // Mapped + PLAY_SET_XP(State.PLAY, Direction.OUTGOING, 0x1F, 0x3D), // Mapped + PLAY_UPDATE_HEALTH(State.PLAY, Direction.OUTGOING, 0x06, 0x3E), // Mapped + PLAY_SCOREBOARD_OBJ(State.PLAY, Direction.OUTGOING, 0x3B, 0x3F), // Mapped + PLAY_SET_PASSENGERS(State.PLAY, Direction.OUTGOING, -1, 0x40), + PLAY_TEAM(State.PLAY, Direction.OUTGOING, 0x3E, 0x41), // Mapped + PLAY_UPDATE_SCORE(State.PLAY, Direction.OUTGOING, 0x3C, 0x42), // Mapped + PLAY_SPAWN_POSITION(State.PLAY, Direction.OUTGOING, 0x05, 0x43), // Mapped + PLAY_TIME_UPDATE(State.PLAY, Direction.OUTGOING, 0x03, 0x44), // Mapped + PLAY_TITLE(State.PLAY, Direction.OUTGOING, 0x45, 0x45), // Mapped + PLAY_UPDATE_SIGN(State.PLAY, Direction.OUTGOING, 0x33, 0x46), // Mapped + PLAY_SOUND_EFFECT(State.PLAY, Direction.OUTGOING, -1, 0x47), + PLAY_PLAYER_LIST_HEADER_FOOTER(State.PLAY, Direction.OUTGOING, 0x47, 0x48), // Mapped + PLAY_COLLECT_ITEM(State.PLAY, Direction.OUTGOING, 0x0D, 0x49), // Mapped + PLAY_ENTITY_TELEPORT(State.PLAY, Direction.OUTGOING, 0x18, 0x4A), // Mapped + PLAY_ENTITY_PROPERTIES(State.PLAY, Direction.OUTGOING, 0x20, 0x4B), // Mapped + PLAY_ENTITY_EFFECT(State.PLAY, Direction.OUTGOING, 0x1D, 0x4C), // Mapped + + PLAY_MAP_CHUNK_BULK(State.PLAY, Direction.OUTGOING, 0x26, -1), + PLAY_SET_COMPRESSION(State.PLAY, Direction.OUTGOING, 0x46, -1), + PLAY_UPDATE_ENTITY_NBT(State.PLAY, Direction.OUTGOING, 0x49, -1); + + private static HashMap oldids = new HashMap<>(); + private static HashMap newids = new HashMap<>(); + + static { + for (PacketType pt : PacketType.values()) { + oldids.put(toShort((short) pt.getPacketID(), (short) pt.getDirection().ordinal(), (short) pt.getState().ordinal()), pt); + newids.put(toShort((short) pt.getNewPacketID(), (short) pt.getDirection().ordinal(), (short) pt.getState().ordinal()), pt); + } + } + + private State state; + private Direction direction; + private int packetID; + private int newPacketID = -1; + + PacketType(State state, Direction direction, int packetID) { + this.state = state; + this.direction = direction; + this.packetID = packetID; + this.newPacketID = packetID; + } + + PacketType(State state, Direction direction, int packetID, int newPacketID) { + this.state = state; + this.direction = direction; + this.packetID = packetID; + this.newPacketID = newPacketID; + } + + public static PacketType findNewPacket(State state, Direction direction, int id) { + return newids.get(toShort((short) id, (short) direction.ordinal(), (short) state.ordinal())); + } + + public static PacketType findOldPacket(State state, Direction direction, int id) { + return oldids.get(toShort((short) id, (short) direction.ordinal(), (short) state.ordinal())); + } + + public static PacketType getIncomingPacket(State state, int id) { + return findNewPacket(state, Direction.INCOMING, id); + } + + public static PacketType getOutgoingPacket(State state, int id) { + return findOldPacket(state, Direction.OUTGOING, id); + } + + private static short toShort(short id, short direction, short state) { + return (short) ((id & 0x00FF) | (direction << 8) & 0x0F00 | (state << 12) & 0xF000); + } + + public State getState() { + return state; + } + + public Direction getDirection() { + return direction; + } + + public int getPacketID() { + return packetID; + } + + public int getNewPacketID() { + return newPacketID; + } + +} diff --git a/src/main/java/us/myles/ViaVersion/packets/State.java b/common/src/main/java/us/myles/ViaVersion/packets/State.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/packets/State.java rename to common/src/main/java/us/myles/ViaVersion/packets/State.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java b/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java similarity index 99% rename from src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java rename to common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java index 8de79782d..599376e81 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java @@ -3,9 +3,9 @@ package us.myles.ViaVersion.protocols.base; import io.netty.channel.ChannelFuture; import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; -import net.md_5.bungee.api.ChatColor; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; diff --git a/src/main/java/us/myles/ViaVersion/protocols/base/ProtocolInfo.java b/common/src/main/java/us/myles/ViaVersion/protocols/base/ProtocolInfo.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/base/ProtocolInfo.java rename to common/src/main/java/us/myles/ViaVersion/protocols/base/ProtocolInfo.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_10to1_9_3/Protocol1_10To1_9_3_4.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_10to1_9_3/Protocol1_10To1_9_3_4.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_10to1_9_3/Protocol1_10To1_9_3_4.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_10to1_9_3/Protocol1_10To1_9_3_4.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_10to1_9_3/storage/ResourcePackTracker.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_10to1_9_3/storage/ResourcePackTracker.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_10to1_9_3/storage/ResourcePackTracker.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_10to1_9_3/storage/ResourcePackTracker.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Protocol1_9_1_2TO1_9_3_4.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Protocol1_9_1_2TO1_9_3_4.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Protocol1_9_1_2TO1_9_3_4.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/Protocol1_9_1_2TO1_9_3_4.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/BlockEntity.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/BlockEntity.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/BlockEntity.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/BlockEntity.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/Chunk1_9_3_4.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/Chunk1_9_3_4.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/Chunk1_9_3_4.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/Chunk1_9_3_4.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/ChunkSection1_9_3_4.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/ChunkSection1_9_3_4.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/ChunkSection1_9_3_4.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/ChunkSection1_9_3_4.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/types/Chunk1_9_3_4Type.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/types/Chunk1_9_3_4Type.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/types/Chunk1_9_3_4Type.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/types/Chunk1_9_3_4Type.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1to1_9/Protocol1_9_1TO1_9.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1to1_9/Protocol1_9_1TO1_9.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1to1_9/Protocol1_9_1TO1_9.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1to1_9/Protocol1_9_1TO1_9.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3TO1_9_1_2.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/Chunk1_9_1_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/Chunk1_9_1_2.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/Chunk1_9_1_2.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/Chunk1_9_1_2.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/ChunkSection1_9_1_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/ChunkSection1_9_1_2.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/ChunkSection1_9_1_2.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/ChunkSection1_9_1_2.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/FakeTileEntity.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/FakeTileEntity.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/FakeTileEntity.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/FakeTileEntity.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/storage/ClientWorld.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/storage/ClientWorld.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/storage/ClientWorld.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/storage/ClientWorld.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/types/Chunk1_9_1_2Type.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/types/Chunk1_9_1_2Type.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/types/Chunk1_9_1_2Type.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/types/Chunk1_9_1_2Type.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java similarity index 96% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java index f05f5bd0b..b9446c5fb 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java @@ -1,90 +1,90 @@ -package us.myles.ViaVersion.protocols.protocol1_9to1_8; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; - -import java.util.HashMap; - -@RequiredArgsConstructor -@Getter -public enum ArmorType { - - LEATHER_HELMET(1, 298, Material.LEATHER_HELMET), - LEATHER_CHESTPLATE(3, 299, Material.LEATHER_CHESTPLATE), - LEATHER_LEGGINGS(2, 300, Material.LEATHER_LEGGINGS), - LEATHER_BOOTS(1, 301, Material.LEATHER_BOOTS), - CHAINMAIL_HELMET(2, 302, Material.CHAINMAIL_HELMET), - CHAINMAIL_CHESTPLATE(5, 303, Material.CHAINMAIL_CHESTPLATE), - CHAINMAIL_LEGGINGS(4, 304, Material.CHAINMAIL_LEGGINGS), - CHAINMAIL_BOOTS(1, 305, Material.CHAINMAIL_BOOTS), - IRON_HELMET(2, 306, Material.IRON_HELMET), - IRON_CHESTPLATE(6, 307, Material.IRON_CHESTPLATE), - IRON_LEGGINGS(5, 308, Material.IRON_LEGGINGS), - IRON_BOOTS(2, 309, Material.IRON_BOOTS), - DIAMOND_HELMET(3, 310, Material.DIAMOND_HELMET), - DIAMOND_CHESTPLATE(8, 311, Material.DIAMOND_CHESTPLATE), - DIAMOND_LEGGINGS(6, 312, Material.DIAMOND_LEGGINGS), - DIAMOND_BOOTS(3, 313, Material.DIAMOND_BOOTS), - GOLD_HELMET(2, 314, Material.GOLD_HELMET), - GOLD_CHESTPLATE(5, 315, Material.GOLD_CHESTPLATE), - GOLD_LEGGINGS(3, 316, Material.GOLD_LEGGINGS), - GOLD_BOOTS(1, 317, Material.GOLD_BOOTS), - NONE(0, 0, Material.AIR); - - private static HashMap armor; - - static { - armor = new HashMap(); - for (ArmorType a : ArmorType.values()) { - armor.put(a.getType(), a); - } - } - - private final int armorPoints; - private final int id; - private final Material type; - - public static ArmorType findByType(Material type) { - ArmorType t = armor.get(type); - return t == null ? ArmorType.NONE : t; - } - - public static int calculateArmorPoints(ItemStack[] armor) { - int total = 0; - for (ItemStack anArmor : armor) { - if (anArmor != null) - total += findByType(anArmor.getType()).getArmorPoints(); - } - return total; - } - - public static ArmorType findById(int id) { - for (ArmorType a : ArmorType.values()) - if (a.getId() == id) - return a; - return ArmorType.NONE; - } - - public static boolean isArmor(Material material) { - for (ArmorType a : ArmorType.values()) - if (a.getType() == material) - return true; - return false; - } - - public static int calculateArmorPoints(int[] armor) { - int total = 0; - for (int anArmor : armor) { - if (anArmor != -1) - total += findById(anArmor).getArmorPoints(); - } - return total; - } - - public Material getType() { - return this.type; - } - +package us.myles.ViaVersion.protocols.protocol1_9to1_8; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.HashMap; + +@RequiredArgsConstructor +@Getter +public enum ArmorType { + + LEATHER_HELMET(1, 298, Material.LEATHER_HELMET), + LEATHER_CHESTPLATE(3, 299, Material.LEATHER_CHESTPLATE), + LEATHER_LEGGINGS(2, 300, Material.LEATHER_LEGGINGS), + LEATHER_BOOTS(1, 301, Material.LEATHER_BOOTS), + CHAINMAIL_HELMET(2, 302, Material.CHAINMAIL_HELMET), + CHAINMAIL_CHESTPLATE(5, 303, Material.CHAINMAIL_CHESTPLATE), + CHAINMAIL_LEGGINGS(4, 304, Material.CHAINMAIL_LEGGINGS), + CHAINMAIL_BOOTS(1, 305, Material.CHAINMAIL_BOOTS), + IRON_HELMET(2, 306, Material.IRON_HELMET), + IRON_CHESTPLATE(6, 307, Material.IRON_CHESTPLATE), + IRON_LEGGINGS(5, 308, Material.IRON_LEGGINGS), + IRON_BOOTS(2, 309, Material.IRON_BOOTS), + DIAMOND_HELMET(3, 310, Material.DIAMOND_HELMET), + DIAMOND_CHESTPLATE(8, 311, Material.DIAMOND_CHESTPLATE), + DIAMOND_LEGGINGS(6, 312, Material.DIAMOND_LEGGINGS), + DIAMOND_BOOTS(3, 313, Material.DIAMOND_BOOTS), + GOLD_HELMET(2, 314, Material.GOLD_HELMET), + GOLD_CHESTPLATE(5, 315, Material.GOLD_CHESTPLATE), + GOLD_LEGGINGS(3, 316, Material.GOLD_LEGGINGS), + GOLD_BOOTS(1, 317, Material.GOLD_BOOTS), + NONE(0, 0, Material.AIR); + + private static HashMap armor; + + static { + armor = new HashMap(); + for (ArmorType a : ArmorType.values()) { + armor.put(a.getType(), a); + } + } + + private final int armorPoints; + private final int id; + private final Material type; + + public static ArmorType findByType(Material type) { + ArmorType t = armor.get(type); + return t == null ? ArmorType.NONE : t; + } + + public static int calculateArmorPoints(ItemStack[] armor) { + int total = 0; + for (ItemStack anArmor : armor) { + if (anArmor != null) + total += findByType(anArmor.getType()).getArmorPoints(); + } + return total; + } + + public static ArmorType findById(int id) { + for (ArmorType a : ArmorType.values()) + if (a.getId() == id) + return a; + return ArmorType.NONE; + } + + public static boolean isArmor(Material material) { + for (ArmorType a : ArmorType.values()) + if (a.getType() == material) + return true; + return false; + } + + public static int calculateArmorPoints(int[] armor) { + int total = 0; + for (int anArmor : armor) { + if (anArmor != -1) + total += findById(anArmor).getArmorPoints(); + } + return total; + } + + public Material getType() { + return this.type; + } + } \ No newline at end of file diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ItemRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ItemRewriter.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ItemRewriter.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ItemRewriter.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/PlayerMovementMapper.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/PlayerMovementMapper.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/PlayerMovementMapper.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/PlayerMovementMapper.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ViaIdleThread.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ViaIdleThread.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ViaIdleThread.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ViaIdleThread.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chat/ChatRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chat/ChatRewriter.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chat/ChatRewriter.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chat/ChatRewriter.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chat/GameMode.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chat/GameMode.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chat/GameMode.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chat/GameMode.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/Chunk1_9to1_8.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/Chunk1_9to1_8.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/Chunk1_9to1_8.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/Chunk1_9to1_8.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/ArmorListener.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/ArmorListener.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/ArmorListener.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/ArmorListener.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/BlockListener.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/BlockListener.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/BlockListener.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/BlockListener.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/CommandBlockListener.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/CommandBlockListener.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/CommandBlockListener.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/CommandBlockListener.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/DeathListener.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/DeathListener.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/DeathListener.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/DeathListener.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/HandItemCache.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/HandItemCache.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/HandItemCache.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/HandItemCache.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/PaperPatch.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/PaperPatch.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/PaperPatch.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/PaperPatch.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataTypes.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataTypes.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataTypes.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataTypes.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/NewType.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/NewType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/NewType.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/NewType.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/Type.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/Type.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/Type.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/Type.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/EntityPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/EntityPackets.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/EntityPackets.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/EntityPackets.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/InventoryPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/InventoryPackets.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/InventoryPackets.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/InventoryPackets.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/PlayerPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/PlayerPackets.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/PlayerPackets.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/PlayerPackets.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/Effect.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/Effect.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/Effect.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/Effect.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/SoundCategory.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/SoundCategory.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/SoundCategory.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/SoundCategory.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/SoundEffect.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/SoundEffect.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/SoundEffect.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/SoundEffect.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/InventoryTracker.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/InventoryTracker.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/InventoryTracker.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/InventoryTracker.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/MovementTracker.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/MovementTracker.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/MovementTracker.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/MovementTracker.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/PlaceBlockTracker.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/PlaceBlockTracker.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/PlaceBlockTracker.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/PlaceBlockTracker.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/types/ChunkType.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/types/ChunkType.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/types/ChunkType.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/types/ChunkType.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_9_1/Protocol1_9TO1_9_1.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_9_1/Protocol1_9TO1_9_1.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_9_1/Protocol1_9TO1_9_1.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_9_1/Protocol1_9TO1_9_1.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/ItemRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/ItemRewriter.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/ItemRewriter.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/ItemRewriter.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/ProtocolSnapshotTo1_10.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/ProtocolSnapshotTo1_10.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/ProtocolSnapshotTo1_10.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/ProtocolSnapshotTo1_10.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/packets/InventoryPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/packets/InventoryPackets.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/packets/InventoryPackets.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/packets/InventoryPackets.java diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/storage/EntityTracker.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/storage/EntityTracker.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/storage/EntityTracker.java rename to common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/storage/EntityTracker.java diff --git a/src/main/java/us/myles/ViaVersion/update/UpdateUtil.java b/common/src/main/java/us/myles/ViaVersion/update/UpdateUtil.java similarity index 68% rename from src/main/java/us/myles/ViaVersion/update/UpdateUtil.java rename to common/src/main/java/us/myles/ViaVersion/update/UpdateUtil.java index fa06fe35f..03d2fc917 100644 --- a/src/main/java/us/myles/ViaVersion/update/UpdateUtil.java +++ b/common/src/main/java/us/myles/ViaVersion/update/UpdateUtil.java @@ -1,129 +1,123 @@ -package us.myles.ViaVersion.update; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; -import org.bukkit.scheduler.BukkitRunnable; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; -import us.myles.ViaVersion.api.ViaVersion; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.UUID; - -public class UpdateUtil { - - public final static String PREFIX = ChatColor.GREEN + "" + ChatColor.BOLD + "[ViaVersion] " + ChatColor.GREEN; - private final static String URL = "http://api.spiget.org/v2/resources/"; - private final static int PLUGIN = 19254; - private final static String LATEST_VERSION = "/versions/latest"; - - public static void sendUpdateMessage(final UUID uuid, final Plugin plugin) { - new BukkitRunnable() { - - @Override - public void run() { - final String message = getUpdateMessage(false); - if (message != null) { - new BukkitRunnable() { - - @Override - public void run() { - Player p = Bukkit.getPlayer(uuid); - if (p != null) { - p.sendMessage(PREFIX + message); - } - } - }.runTask(plugin); - } - } - }.runTaskAsynchronously(plugin); - } - - public static void sendUpdateMessage(final Plugin plugin) { - new BukkitRunnable() { - - @Override - public void run() { - final String message = getUpdateMessage(true); - if (message != null) { - new BukkitRunnable() { - - @Override - public void run() { - plugin.getLogger().warning(message); - } - }.runTask(plugin); - } - } - }.runTaskAsynchronously(plugin); - } - - private static String getUpdateMessage(boolean console) { - if (ViaVersion.getInstance().getVersion().equals("${project.version}")) { - return "You are using a debug/custom version, consider updating."; - } - String newestString = getNewestVersion(); - if (newestString == null) { - if (console) { - return "Could not check for updates, check your connection."; - } else { - return null; - } - } - Version current; - try { - current = new Version(ViaVersion.getInstance().getVersion()); - } catch (IllegalArgumentException e) { - return "You are using a custom version, consider updating."; - } - Version newest = new Version(newestString); - if (current.compareTo(newest) < 0) - return "There is a newer version available: " + newest.toString() + ", you're on: " + current.toString(); - else if (console && current.compareTo(newest) != 0) { - if (current.getTag().toLowerCase().startsWith("dev") || current.getTag().toLowerCase().startsWith("snapshot")) { - return "You are running a development version, please report any bugs to GitHub."; - } else { - return "You are running a newer version than is released!"; - } - } - return null; - } - - private static String getNewestVersion() { - try { - URL url = new URL(URL + PLUGIN + LATEST_VERSION + "?" + System.currentTimeMillis()); - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.setUseCaches(true); - connection.addRequestProperty("User-Agent", "ViaVersion " + ViaVersion.getInstance().getVersion()); - connection.setDoOutput(true); - BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); - String input; - String content = ""; - while ((input = br.readLine()) != null) { - content = content + input; - } - br.close(); - JSONParser parser = new JSONParser(); - JSONObject statistics; - try { - statistics = (JSONObject) parser.parse(content); - } catch (ParseException e) { - e.printStackTrace(); - return null; - } - return (String) statistics.get("name"); - } catch (MalformedURLException e) { - return null; - } catch (IOException e) { - return null; - } - } -} +package us.myles.ViaVersion.update; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import net.md_5.bungee.api.ChatColor; +import us.myles.ViaVersion.api.ViaVersion; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.UUID; + +public class UpdateUtil { + + public final static String PREFIX = ChatColor.GREEN + "" + ChatColor.BOLD + "[ViaVersion] " + ChatColor.GREEN; + private final static String URL = "http://api.spiget.org/v2/resources/"; + private final static int PLUGIN = 19254; + private final static String LATEST_VERSION = "/versions/latest"; + private final static Gson gson = new GsonBuilder().create(); + + public static void sendUpdateMessage(final UUID uuid) { + ViaVersion.getPlatform().runAsync(new Runnable() { + @Override + public void run() { + final String message = getUpdateMessage(false); + if (message != null) { + ViaVersion.getPlatform().runSync( + new Runnable() { + @Override + public void run() { + ViaVersion.getPlatform().sendMessage(uuid, PREFIX + message); + } + } + ); + } + } + }); + } + + public static void sendUpdateMessage() { + ViaVersion.getPlatform().runAsync(new Runnable() { + @Override + public void run() { + final String message = getUpdateMessage(true); + if (message != null) { + ViaVersion.getPlatform().runSync( + new Runnable() { + @Override + public void run() { + ViaVersion.getPlatform().getLogger().warning(message); + } + } + ); + } + } + }); + } + + private static String getUpdateMessage(boolean console) { + if (ViaVersion.getInstance().getVersion().equals("${project.version}")) { + return "You are using a debug/custom version, consider updating."; + } + String newestString = getNewestVersion(); + if (newestString == null) { + if (console) { + return "Could not check for updates, check your connection."; + } else { + return null; + } + } + Version current; + try { + current = new Version(ViaVersion.getInstance().getVersion()); + } catch (IllegalArgumentException e) { + return "You are using a custom version, consider updating."; + } + Version newest = new Version(newestString); + if (current.compareTo(newest) < 0) + return "There is a newer version available: " + newest.toString() + ", you're on: " + current.toString(); + else if (console && current.compareTo(newest) != 0) { + if (current.getTag().toLowerCase().startsWith("dev") || current.getTag().toLowerCase().startsWith("snapshot")) { + return "You are running a development version, please report any bugs to GitHub."; + } else { + return "You are running a newer version than is released!"; + } + } + return null; + } + + private static String getNewestVersion() { + try { + URL url = new URL(URL + PLUGIN + LATEST_VERSION + "?" + System.currentTimeMillis()); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setUseCaches(true); + connection.addRequestProperty("User-Agent", "ViaVersion " + ViaVersion.getInstance().getVersion()); + connection.setDoOutput(true); + BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String input; + String content = ""; + while ((input = br.readLine()) != null) { + content = content + input; + } + br.close(); + JsonObject statistics; + try { + statistics = gson.fromJson(content, JsonObject.class); + } catch (JsonParseException e) { + e.printStackTrace(); + return null; + } + return statistics.get("name").getAsString(); + } catch (MalformedURLException e) { + return null; + } catch (IOException e) { + return null; + } + } +} diff --git a/src/main/java/us/myles/ViaVersion/update/Version.java b/common/src/main/java/us/myles/ViaVersion/update/Version.java similarity index 96% rename from src/main/java/us/myles/ViaVersion/update/Version.java rename to common/src/main/java/us/myles/ViaVersion/update/Version.java index d96f4800a..f31784495 100644 --- a/src/main/java/us/myles/ViaVersion/update/Version.java +++ b/common/src/main/java/us/myles/ViaVersion/update/Version.java @@ -1,77 +1,77 @@ -package us.myles.ViaVersion.update; - -import org.apache.commons.lang.StringUtils; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class Version implements Comparable { - private static Pattern semVer = Pattern.compile("(?0|[1-9]\\d*)\\.(?0|[1-9]\\d*)(?:\\.(?0|[1-9]\\d*))?(?:-(?[A-z0-9.-]*))?"); - private int[] parts = new int[3]; - private String tag; - - public Version(String value) { - if (value == null) - throw new IllegalArgumentException("Version can not be null"); - - Matcher matcher = semVer.matcher(value); - if (!matcher.matches()) - throw new IllegalArgumentException("Invalid version format"); - parts[0] = Integer.parseInt(matcher.group("a")); - parts[1] = Integer.parseInt(matcher.group("b")); - parts[2] = matcher.group("c") == null ? 0 : Integer.parseInt(matcher.group("c")); - - tag = matcher.group("tag") == null ? "" : matcher.group("tag"); - } - - public static int compare(Version verA, Version verB) { - if (verA == verB) return 0; - if (verA == null) return -1; - if (verB == null) return 1; - - int max = Math.max(verA.parts.length, verB.parts.length); - - for (int i = 0; i < max; i += 1) { - int partA = i < verA.parts.length ? verA.parts[i] : 0; - int partB = i < verB.parts.length ? verB.parts[i] : 0; - if (partA < partB) return -1; - if (partA > partB) return 1; - } - - // Simple tag check - if (verA.tag.length() == 0 && verB.tag.length() > 0) - return 1; - if (verA.tag.length() > 0 && verB.tag.length() == 0) - return -1; - - return 0; - } - - public static boolean equals(Version verA, Version verB) { - return verA == verB || verA != null && verB != null && compare(verA, verB) == 0; - } - - @Override - public String toString() { - String[] split = new String[parts.length]; - - for (int i = 0; i < parts.length; i += 1) - split[i] = String.valueOf(parts[i]); - - return StringUtils.join(split, ".") + (tag.length() != 0 ? "-" + tag : ""); - } - - @Override - public int compareTo(Version that) { - return compare(this, that); - } - - @Override - public boolean equals(Object that) { - return that instanceof Version && equals(this, (Version) that); - } - - public String getTag() { - return tag; - } +package us.myles.ViaVersion.update; + +import org.apache.commons.lang.StringUtils; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Version implements Comparable { + private static Pattern semVer = Pattern.compile("(?0|[1-9]\\d*)\\.(?0|[1-9]\\d*)(?:\\.(?0|[1-9]\\d*))?(?:-(?[A-z0-9.-]*))?"); + private int[] parts = new int[3]; + private String tag; + + public Version(String value) { + if (value == null) + throw new IllegalArgumentException("Version can not be null"); + + Matcher matcher = semVer.matcher(value); + if (!matcher.matches()) + throw new IllegalArgumentException("Invalid version format"); + parts[0] = Integer.parseInt(matcher.group("a")); + parts[1] = Integer.parseInt(matcher.group("b")); + parts[2] = matcher.group("c") == null ? 0 : Integer.parseInt(matcher.group("c")); + + tag = matcher.group("tag") == null ? "" : matcher.group("tag"); + } + + public static int compare(Version verA, Version verB) { + if (verA == verB) return 0; + if (verA == null) return -1; + if (verB == null) return 1; + + int max = Math.max(verA.parts.length, verB.parts.length); + + for (int i = 0; i < max; i += 1) { + int partA = i < verA.parts.length ? verA.parts[i] : 0; + int partB = i < verB.parts.length ? verB.parts[i] : 0; + if (partA < partB) return -1; + if (partA > partB) return 1; + } + + // Simple tag check + if (verA.tag.length() == 0 && verB.tag.length() > 0) + return 1; + if (verA.tag.length() > 0 && verB.tag.length() == 0) + return -1; + + return 0; + } + + public static boolean equals(Version verA, Version verB) { + return verA == verB || verA != null && verB != null && compare(verA, verB) == 0; + } + + @Override + public String toString() { + String[] split = new String[parts.length]; + + for (int i = 0; i < parts.length; i += 1) + split[i] = String.valueOf(parts[i]); + + return StringUtils.join(split, ".") + (tag.length() != 0 ? "-" + tag : ""); + } + + @Override + public int compareTo(Version that) { + return compare(this, that); + } + + @Override + public boolean equals(Object that) { + return that instanceof Version && equals(this, (Version) that); + } + + public String getTag() { + return tag; + } } \ No newline at end of file diff --git a/src/main/java/us/myles/ViaVersion/util/ConcurrentList.java b/common/src/main/java/us/myles/ViaVersion/util/ConcurrentList.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/util/ConcurrentList.java rename to common/src/main/java/us/myles/ViaVersion/util/ConcurrentList.java diff --git a/src/main/java/us/myles/ViaVersion/util/EntityUtil.java b/common/src/main/java/us/myles/ViaVersion/util/EntityUtil.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/util/EntityUtil.java rename to common/src/main/java/us/myles/ViaVersion/util/EntityUtil.java diff --git a/src/main/java/us/myles/ViaVersion/util/ListWrapper.java b/common/src/main/java/us/myles/ViaVersion/util/ListWrapper.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/util/ListWrapper.java rename to common/src/main/java/us/myles/ViaVersion/util/ListWrapper.java diff --git a/src/main/java/us/myles/ViaVersion/util/PipelineUtil.java b/common/src/main/java/us/myles/ViaVersion/util/PipelineUtil.java similarity index 100% rename from src/main/java/us/myles/ViaVersion/util/PipelineUtil.java rename to common/src/main/java/us/myles/ViaVersion/util/PipelineUtil.java diff --git a/jar/pom.xml b/jar/pom.xml new file mode 100644 index 000000000..00754e50d --- /dev/null +++ b/jar/pom.xml @@ -0,0 +1,104 @@ + + + + viaversion-parent + us.myles + 1.0.0-ALPHA-16w38a + + 4.0.0 + + viaversion + + + ${project.name}-${project.version} + src/main/java + clean install + + + . + false + . + + LICENSE + + + + . + true + src/main/resources/ + + * + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + ${jdkVersion} + ${jdkVersion} + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.4.3 + + false + false + + + org.spacehq.opennbt + us.myles.viaversion.libs.opennbt + + + com.google.gson + us.myles.viaversion.libs.gson + + + org.javassist + us.myles.viaversion.libs.javassist + + + + + + package + + shade + + + + + + + + + + us.myles + viaversion-common + 1.0.0-ALPHA-16w38a + + + us.myles + viaversion-bukkit + 1.0.0-ALPHA-16w38a + + + us.myles + viaversion-bungee + 1.0.0-ALPHA-16w38a + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 952f6f711..07b79c27e 100644 --- a/pom.xml +++ b/pom.xml @@ -5,15 +5,22 @@ 4.0.0 us.myles - viaversion + viaversion-parent 1.0.0-ALPHA-16w38a - jar + pom ViaVersion Allow newer clients to join older server versions. 2016 https://www.spigotmc.org/resources/viaversion.19254/ + + common + bukkit + bungee + jar + + 3.3.3 @@ -24,106 +31,8 @@ ${projectEncoding} ${projectEncoding} 1.7 - - - - 1.8.8-R0.1-SNAPSHOT - - ${project.name}-${project.version} - src/main/java - clean install - - - - - . - false - . - - LICENSE - - - - . - true - src/main/resources/ - - * - - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.5.1 - - ${jdkVersion} - ${jdkVersion} - - - - - - - - org.apache.maven.plugins - maven-shade-plugin - 2.4.3 - - false - false - - - org.spacehq.opennbt - us.myles.viaversion.libs.opennbt - - - com.google.gson - us.myles.viaversion.libs.gson - - - org.javassist - us.myles.viaversion.libs.javassist - - - - - - package - - shade - - - - - - - @@ -145,27 +54,12 @@ - + - org.bukkit - bukkit - ${bukkitVersion} + org.projectlombok + lombok + 1.16.6 provided - true - - - junit - junit - - - gson - com.google.code.gson - - - persistence-api - javax.persistence - - @@ -204,20 +98,20 @@ true - + - org.projectlombok - lombok - 1.16.6 + commons-lang + commons-lang + 2.6 provided - + net.md-5 - bungeecord-api - 1.9-SNAPSHOT - provided + bungeecord-chat + 1.10-SNAPSHOT + From b146257b1adeca6921ab8f6fca54a5d8fce6a4dd Mon Sep 17 00:00:00 2001 From: Matsv Date: Sat, 24 Sep 2016 19:31:41 +0200 Subject: [PATCH 02/76] Abstract the BossBar for multi-platform support --- .../myles/ViaVersion/api/ViaVersionAPI.java | 5 +- .../us/myles/ViaVersion/boss/ViaBossBar.java | 225 ++---------------- .../us/myles/ViaVersion/api/boss/BossBar.java | 53 +++-- .../ViaVersion/api/data/UserConnection.java | 5 +- .../api/minecraft/metadata/Metadata.java | 17 +- .../us/myles/ViaVersion/boss/CommonBoss.java | 225 ++++++++++++++++++ jar/pom.xml | 2 +- 7 files changed, 280 insertions(+), 252 deletions(-) create mode 100644 common/src/main/java/us/myles/ViaVersion/boss/CommonBoss.java diff --git a/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java b/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java index 939109d17..124bd33bf 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java @@ -7,6 +7,7 @@ import us.myles.ViaVersion.api.boss.BossColor; import us.myles.ViaVersion.api.boss.BossStyle; import us.myles.ViaVersion.api.command.ViaVersionCommand; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; +import us.myles.ViaVersion.boss.ViaBossBar; import java.util.SortedSet; import java.util.UUID; @@ -80,7 +81,7 @@ public interface ViaVersionAPI { * @param title The title * @param color The color * @param style The style - * @return Bossbar instance + * @return BossBar instance */ BossBar createBossBar(String title, BossColor color, BossStyle style); @@ -91,7 +92,7 @@ public interface ViaVersionAPI { * @param health Number between 0 and 1 * @param color The color * @param style The style - * @return Bossbar instance + * @return BossBar instance */ BossBar createBossBar(String title, float health, BossColor color, BossStyle style); diff --git a/bukkit/src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java b/bukkit/src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java index eacbbfa86..6ec57ceb9 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java @@ -1,237 +1,42 @@ package us.myles.ViaVersion.boss; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; import lombok.Getter; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import org.apache.commons.lang.Validate; import org.bukkit.entity.Player; -import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.boss.BossBar; import us.myles.ViaVersion.api.boss.BossColor; -import us.myles.ViaVersion.api.boss.BossFlag; import us.myles.ViaVersion.api.boss.BossStyle; -import us.myles.ViaVersion.api.protocol.ProtocolVersion; -import us.myles.ViaVersion.api.type.Type; -import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; - -import java.util.*; @Getter -public class ViaBossBar implements BossBar { - private UUID uuid; - private String title; - private float health; - private BossColor color; - private BossStyle style; - private Set players; - private boolean visible; - private Set flags; +public class ViaBossBar extends CommonBoss { public ViaBossBar(String title, float health, BossColor color, BossStyle style) { - Validate.notNull(title, "Title cannot be null"); - Validate.isTrue((health >= 0 && health <= 1), "Health must be between 0 and 1"); - this.uuid = UUID.randomUUID(); - this.title = title; - this.health = health; - this.color = color == null ? BossColor.PURPLE : color; - this.style = style == null ? BossStyle.SOLID : style; - this.players = new HashSet<>(); - this.flags = new HashSet<>(); - visible = true; + super(title, health, color, style); } @Override - public BossBar setTitle(@NonNull String title) { - this.title = title; - sendPacket(UpdateAction.UPDATE_TITLE); - return this; - } - - @Override - public BossBar setHealth(float health) { - Validate.isTrue((health >= 0 && health <= 1), "Health must be between 0 and 1"); - this.health = health; - sendPacket(UpdateAction.UPDATE_HEALTH); - return this; - } - - @Override - public BossColor getColor() { - return color; - } - - @Override - public BossBar setColor(@NonNull BossColor color) { - this.color = color; - sendPacket(UpdateAction.UPDATE_STYLE); - return this; - } - - @Override - public BossBar setStyle(@NonNull BossStyle style) { - this.style = style; - sendPacket(UpdateAction.UPDATE_STYLE); - return this; - } - - @Override - public BossBar addPlayer(@NonNull Player player) { - return addPlayer(player.getUniqueId()); - } - - @Override - public BossBar addPlayer(UUID player) { - if (!players.contains(player)) { - players.add(player); - if (visible) - sendPacket(player, getPacket(UpdateAction.ADD)); + public BossBar addPlayer(Object player) { + if (player instanceof Player){ + addPlayer(((Player) player).getUniqueId()); + } else { + throw new IllegalArgumentException("The addPlayer argument has to be a Bukkit player on this platform"); } return this; } @Override - public BossBar removePlayer(@NonNull Player player) { - if (players.contains(player.getUniqueId())) { - players.remove(player.getUniqueId()); - sendPacket(player.getUniqueId(), getPacket(UpdateAction.REMOVE)); - } - return this; - } - - @Override - public BossBar addPlayers(@NonNull Player... players) { - for (Player p : players) + public BossBar addPlayers(Object... players) { + for (Object p : players) addPlayer(p); return this; } @Override - public BossBar addFlag(@NonNull BossFlag flag) { - if (!hasFlag(flag)) - flags.add(flag); - sendPacket(UpdateAction.UPDATE_FLAGS); - return this; - } - - @Override - public BossBar removeFlag(@NonNull BossFlag flag) { - if (hasFlag(flag)) - flags.remove(flag); - sendPacket(UpdateAction.UPDATE_FLAGS); - return this; - } - - @Override - public boolean hasFlag(@NonNull BossFlag flag) { - return flags.contains(flag); - } - - @Override - public Set getPlayers() { - return Collections.unmodifiableSet(players); - } - - @Override - public BossBar show() { - setVisible(true); - return this; - } - - @Override - public BossBar hide() { - setVisible(false); - return this; - } - - @Override - public boolean isVisible() { - return visible; - } - - private void setVisible(boolean value) { - if (visible != value) { - visible = value; - sendPacket(value ? UpdateAction.ADD : UpdateAction.REMOVE); + public BossBar removePlayer(Object player) { + if (player instanceof Player){ + removePlayer(((Player) player).getUniqueId()); + } else { + throw new IllegalArgumentException("The removePlayer argument has to be a Bukkit player on this platform"); } - } - - private void sendPacket(UpdateAction action) { - for (UUID uuid : new ArrayList<>(players)) { - ByteBuf buf = getPacket(action); - sendPacket(uuid, buf); - } - } - - private void sendPacket(UUID uuid, ByteBuf buf) { - if (!ViaVersion.getInstance().isPorted(uuid) || !(ViaVersion.getInstance().getPlayerVersion(uuid) >= ProtocolVersion.v1_9.getId())) { - players.remove(uuid); - buf.release(); - return; - } - ViaVersion.getInstance().sendRawPacket(uuid, buf); - } - - private ByteBuf getPacket(UpdateAction action) { - try { - ByteBuf buf = Unpooled.buffer(); - Type.VAR_INT.write(buf, 0x0C); // Boss bar packet - Type.UUID.write(buf, uuid); - Type.VAR_INT.write(buf, action.getId()); - switch (action) { - case ADD: - Type.STRING.write(buf, fixJson(title)); - buf.writeFloat(health); - Type.VAR_INT.write(buf, color.getId()); - Type.VAR_INT.write(buf, style.getId()); - buf.writeByte(flagToBytes()); - break; - case REMOVE: - break; - case UPDATE_HEALTH: - buf.writeFloat(health); - break; - case UPDATE_TITLE: - Type.STRING.write(buf, fixJson(title)); - break; - case UPDATE_STYLE: - Type.VAR_INT.write(buf, color.getId()); - Type.VAR_INT.write(buf, style.getId()); - break; - case UPDATE_FLAGS: - buf.writeByte(flagToBytes()); - break; - } - - return buf; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - private int flagToBytes() { - int bitmask = 0; - for (BossFlag flag : flags) - bitmask |= flag.getId(); - return bitmask; - } - - private String fixJson(String text) { - return Protocol1_9TO1_8.fixJson(text); - } - - @RequiredArgsConstructor - @Getter - private enum UpdateAction { - ADD(0), - REMOVE(1), - UPDATE_HEALTH(2), - UPDATE_TITLE(3), - UPDATE_STYLE(4), - UPDATE_FLAGS(5); - - private final int id; + return this; } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java b/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java index fe9d20489..4383aecf1 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java +++ b/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java @@ -1,17 +1,18 @@ package us.myles.ViaVersion.api.boss; -import org.bukkit.entity.Player; +import org.apache.commons.lang.NotImplementedException; +import us.myles.ViaVersion.api.Via; import java.util.Set; import java.util.UUID; -public interface BossBar { +public abstract class BossBar { /** * Get the current title * * @return the title */ - String getTitle(); + public abstract String getTitle(); /** * Change the title @@ -19,14 +20,14 @@ public interface BossBar { * @param title Title can be in either JSON or just text * @return The BossBar object */ - BossBar setTitle(String title); + public abstract BossBar setTitle(String title); /** * Get the health * * @return float between 0F - 1F */ - float getHealth(); + public abstract float getHealth(); /** * Change the health @@ -34,14 +35,14 @@ public interface BossBar { * @param health this float has to be between 0F - 1F * @return The BossBar object */ - BossBar setHealth(float health); + public abstract BossBar setHealth(float health); /** * Get the bossbar color * * @return The colour */ - BossColor getColor(); + public abstract BossColor getColor(); /** * Yay colors! @@ -49,14 +50,14 @@ public interface BossBar { * @param color Whatever color you want! * @return The BossBar object */ - BossBar setColor(BossColor color); + public abstract BossBar setColor(BossColor color); /** * Get the bosbar style * * @return BossStyle */ - BossStyle getStyle(); + public abstract BossStyle getStyle(); /** * Change the bosbar style @@ -64,7 +65,7 @@ public interface BossBar { * @param style BossStyle * @return The BossBar object */ - BossBar setStyle(BossStyle style); + public abstract BossBar setStyle(BossStyle style); /** * Show the bossbar to a player. @@ -72,7 +73,9 @@ public interface BossBar { * @param player The player * @return The BossBar object */ - BossBar addPlayer(Player player); + public BossBar addPlayer(Object player){ + throw new NotImplementedException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName()); + } /** * Show the bossbar to a player (uuid) @@ -80,15 +83,17 @@ public interface BossBar { * @param player uuid of the player * @return The BossBar object */ - BossBar addPlayer(UUID player); - + public abstract BossBar addPlayer(UUID player); + /** * add multiple players * * @param players list of players * @return The BossBar object */ - BossBar addPlayers(Player... players); + public BossBar addPlayers(Object... players){ + throw new NotImplementedException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName()); + } /** * Remove the bossbar from a player @@ -96,7 +101,11 @@ public interface BossBar { * @param player The player * @return The BossBar object */ - BossBar removePlayer(Player player); + public BossBar removePlayer(Object player){ + throw new NotImplementedException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName()); + } + + public abstract BossBar removePlayer(UUID uuid); /** * Add flags @@ -104,7 +113,7 @@ public interface BossBar { * @param flag The flag to add * @return The BossBar object */ - BossBar addFlag(BossFlag flag); + public abstract BossBar addFlag(BossFlag flag); /** * Remove flags. @@ -112,39 +121,39 @@ public interface BossBar { * @param flag The flag to remove * @return The BossBar object */ - BossBar removeFlag(BossFlag flag); + public abstract BossBar removeFlag(BossFlag flag); /** * @param flag The flag to check against * @return True if it has the flag */ - boolean hasFlag(BossFlag flag); + public abstract boolean hasFlag(BossFlag flag); /** * Get players * * @return UUIDS from players (sorry I lied) */ - Set getPlayers(); + public abstract Set getPlayers(); /** * Show the bossbar to everyone (In the getPlayer set) * * @return The BossBar object */ - BossBar show(); + public abstract BossBar show(); /** * Hide the bossbar from everyone (In the getPlayer set) * * @return The BossBar object */ - BossBar hide(); + public abstract BossBar hide(); /** * Is it visible? * * @return visibility changable with show() and hide() */ - boolean isVisible(); + public abstract boolean isVisible(); } diff --git a/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java b/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java index a22f77f2a..badb3b9e9 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java +++ b/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java @@ -6,6 +6,7 @@ import io.netty.channel.ChannelHandler; import io.netty.channel.socket.SocketChannel; import lombok.Data; import net.md_5.bungee.api.ChatColor; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.protocols.base.ProtocolInfo; @@ -144,10 +145,10 @@ public class UserConnection { pendingDisconnect = true; if (get(ProtocolInfo.class).getUuid() != null) { final UUID uuid = get(ProtocolInfo.class).getUuid(); - ViaVersion.getPlatform().runSync(new Runnable() { + Via.getPlatform().runSync(new Runnable() { @Override public void run() { - if (!ViaVersion.getPlatform().kickPlayer(uuid, ChatColor.translateAlternateColorCodes('&', reason))) { + if (!Via.getPlatform().kickPlayer(uuid, ChatColor.translateAlternateColorCodes('&', reason))) { getChannel().close(); // =) } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/Metadata.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/Metadata.java index 58215b791..03489dd82 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/Metadata.java +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/Metadata.java @@ -1,26 +1,13 @@ package us.myles.ViaVersion.api.minecraft.metadata; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; +import lombok.*; import us.myles.ViaVersion.api.type.Type; @AllArgsConstructor -@Getter -@Setter +@Data public class Metadata { private int id; private int typeID; private Type type; private Object value; - - @Override - public String toString() { - return "Metadata{" + - "id=" + id + - ", typeID=" + typeID + - ", type=" + type + - ", value=" + value + - '}'; - } } diff --git a/common/src/main/java/us/myles/ViaVersion/boss/CommonBoss.java b/common/src/main/java/us/myles/ViaVersion/boss/CommonBoss.java new file mode 100644 index 000000000..dc5441363 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/boss/CommonBoss.java @@ -0,0 +1,225 @@ +package us.myles.ViaVersion.boss; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import lombok.Getter; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang.Validate; +import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.boss.BossBar; +import us.myles.ViaVersion.api.boss.BossColor; +import us.myles.ViaVersion.api.boss.BossFlag; +import us.myles.ViaVersion.api.boss.BossStyle; +import us.myles.ViaVersion.api.protocol.ProtocolVersion; +import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; + +import java.util.*; + +@Getter +public abstract class CommonBoss extends BossBar { + private UUID uuid; + private String title; + private float health; + private BossColor color; + private BossStyle style; + private Set players; + private boolean visible; + private Set flags; + + public CommonBoss(String title, float health, BossColor color, BossStyle style) { + Validate.notNull(title, "Title cannot be null"); + Validate.isTrue((health >= 0 && health <= 1), "Health must be between 0 and 1"); + + this.uuid = UUID.randomUUID(); + this.title = title; + this.health = health; + this.color = color == null ? BossColor.PURPLE : color; + this.style = style == null ? BossStyle.SOLID : style; + this.players = new HashSet<>(); + this.flags = new HashSet<>(); + visible = true; + } + + @Override + public BossBar setTitle(@NonNull String title) { + this.title = title; + sendPacket(ViaBossBar.UpdateAction.UPDATE_TITLE); + return this; + } + + @Override + public BossBar setHealth(float health) { + Validate.isTrue((health >= 0 && health <= 1), "Health must be between 0 and 1"); + this.health = health; + sendPacket(ViaBossBar.UpdateAction.UPDATE_HEALTH); + return this; + } + + @Override + public BossColor getColor() { + return color; + } + + @Override + public BossBar setColor(@NonNull BossColor color) { + this.color = color; + sendPacket(ViaBossBar.UpdateAction.UPDATE_STYLE); + return this; + } + + @Override + public BossBar setStyle(@NonNull BossStyle style) { + this.style = style; + sendPacket(ViaBossBar.UpdateAction.UPDATE_STYLE); + return this; + } + + @Override + public BossBar addPlayer(UUID player) { + if (!players.contains(player)) { + players.add(player); + if (visible) + sendPacket(player, getPacket(ViaBossBar.UpdateAction.ADD)); + } + return this; + } + + @Override + public BossBar removePlayer(UUID uuid) { + if (players.contains(uuid)) { + players.remove(uuid); + sendPacket(uuid, getPacket(UpdateAction.REMOVE)); + } + return this; + } + + @Override + public BossBar addFlag(@NonNull BossFlag flag) { + if (!hasFlag(flag)) + flags.add(flag); + sendPacket(ViaBossBar.UpdateAction.UPDATE_FLAGS); + return this; + } + + @Override + public BossBar removeFlag(@NonNull BossFlag flag) { + if (hasFlag(flag)) + flags.remove(flag); + sendPacket(ViaBossBar.UpdateAction.UPDATE_FLAGS); + return this; + } + + @Override + public boolean hasFlag(@NonNull BossFlag flag) { + return flags.contains(flag); + } + + @Override + public Set getPlayers() { + return Collections.unmodifiableSet(players); + } + + @Override + public BossBar show() { + setVisible(true); + return this; + } + + @Override + public BossBar hide() { + setVisible(false); + return this; + } + + @Override + public boolean isVisible() { + return visible; + } + + private void setVisible(boolean value) { + if (visible != value) { + visible = value; + sendPacket(value ? ViaBossBar.UpdateAction.ADD : ViaBossBar.UpdateAction.REMOVE); + } + } + + private void sendPacket(UpdateAction action) { + for (UUID uuid : new ArrayList<>(players)) { + ByteBuf buf = getPacket(action); + sendPacket(uuid, buf); + } + } + + private void sendPacket(UUID uuid, ByteBuf buf) { + if (!ViaVersion.getInstance().isPorted(uuid) || !(ViaVersion.getInstance().getPlayerVersion(uuid) >= ProtocolVersion.v1_9.getId())) { + players.remove(uuid); + buf.release(); + return; + } + ViaVersion.getInstance().sendRawPacket(uuid, buf); + } + + private ByteBuf getPacket(UpdateAction action) { + try { + ByteBuf buf = Unpooled.buffer(); + Type.VAR_INT.write(buf, 0x0C); // Boss bar packet + Type.UUID.write(buf, uuid); + Type.VAR_INT.write(buf, action.getId()); + switch (action) { + case ADD: + Type.STRING.write(buf, fixJson(title)); + buf.writeFloat(health); + Type.VAR_INT.write(buf, color.getId()); + Type.VAR_INT.write(buf, style.getId()); + buf.writeByte(flagToBytes()); + break; + case REMOVE: + break; + case UPDATE_HEALTH: + buf.writeFloat(health); + break; + case UPDATE_TITLE: + Type.STRING.write(buf, fixJson(title)); + break; + case UPDATE_STYLE: + Type.VAR_INT.write(buf, color.getId()); + Type.VAR_INT.write(buf, style.getId()); + break; + case UPDATE_FLAGS: + buf.writeByte(flagToBytes()); + break; + } + + return buf; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + private int flagToBytes() { + int bitmask = 0; + for (BossFlag flag : flags) + bitmask |= flag.getId(); + return bitmask; + } + + private String fixJson(String text) { + return Protocol1_9TO1_8.fixJson(text); + } + + @RequiredArgsConstructor + @Getter + private enum UpdateAction { + ADD(0), + REMOVE(1), + UPDATE_HEALTH(2), + UPDATE_TITLE(3), + UPDATE_STYLE(4), + UPDATE_FLAGS(5); + + private final int id; + } +} diff --git a/jar/pom.xml b/jar/pom.xml index 00754e50d..a6e46573f 100644 --- a/jar/pom.xml +++ b/jar/pom.xml @@ -17,7 +17,7 @@ clean install - . + .https://github.com/MylesIsCool/ViaVersion/blob/master/ISSUE_TEMPLATE.md false . From 598863d43acc655dd980cadbaba473b413303b5a Mon Sep 17 00:00:00 2001 From: Matsv Date: Sat, 24 Sep 2016 20:12:12 +0200 Subject: [PATCH 03/76] Add onCommand and onTabComplete to the interface --- .../api/command/ViaVersionCommand.java | 20 +++++++++++++++++++ .../commands/ViaCommandHandler.java | 2 ++ jar/pom.xml | 2 +- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/us/myles/ViaVersion/api/command/ViaVersionCommand.java b/common/src/main/java/us/myles/ViaVersion/api/command/ViaVersionCommand.java index 707cac6b7..13b19bbfb 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/command/ViaVersionCommand.java +++ b/common/src/main/java/us/myles/ViaVersion/api/command/ViaVersionCommand.java @@ -1,5 +1,7 @@ package us.myles.ViaVersion.api.command; +import java.util.List; + public interface ViaVersionCommand { /** * Register your own subcommand inside ViaVersion @@ -24,4 +26,22 @@ public interface ViaVersionCommand { * @return ViaSubCommand instance */ ViaSubCommand getSubCommand(String name); + + /** + * Executed when the Command sender executes the command + * + * @param sender Sender object + * @param args arguments provided + * @return was successful + */ + boolean onCommand(ViaCommandSender sender, String[] args); + + /** + * Executed when the Command sender tab-completes + * + * @param sender Sender object + * @param args arguments provided + * @return was successful + */ + List onTabComplete(ViaCommandSender sender, String[] args); } diff --git a/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java b/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java index 9423b1837..ba7586cd8 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java @@ -41,6 +41,7 @@ public abstract class ViaCommandHandler implements ViaVersionCommand { return commandMap.get(name.toLowerCase()); } + @Override public boolean onCommand(ViaCommandSender sender, String[] args) { if (args.length == 0) { showHelp(sender); @@ -66,6 +67,7 @@ public abstract class ViaCommandHandler implements ViaVersionCommand { return result; } + @Override public List onTabComplete(ViaCommandSender sender, String[] args) { Set allowed = calculateAllowedCommands(sender); List output = new ArrayList<>(); diff --git a/jar/pom.xml b/jar/pom.xml index a6e46573f..00754e50d 100644 --- a/jar/pom.xml +++ b/jar/pom.xml @@ -17,7 +17,7 @@ clean install - .https://github.com/MylesIsCool/ViaVersion/blob/master/ISSUE_TEMPLATE.md + . false . From 05930ad7917fa3e4e1d1ca32451379e33951834b Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 25 Sep 2016 14:39:37 +0100 Subject: [PATCH 04/76] Add ViaManager and abstraction / Add todo list --- TODOLIST | 14 + .../us/myles/ViaVersion/ViaVersionPlugin.java | 423 ++---------------- .../myles/ViaVersion/api/ViaVersionAPI.java | 3 +- .../us/myles/ViaVersion/boss/ViaBossBar.java | 1 + .../myles/ViaVersion/bukkit/BukkitViaAPI.java | 127 ++++++ .../ViaVersion/bukkit/BukkitViaInjector.java | 233 ++++++++++ .../ViaVersion/handlers/ViaDecodeHandler.java | 1 - .../ViaVersion/listeners/UpdateListener.java | 1 - .../protocol1_9to1_8}/ArmorListener.java | 2 +- .../protocol1_9to1_8}/BlockListener.java | 2 +- .../CommandBlockListener.java | 2 +- .../protocol1_9to1_8}/DeathListener.java | 2 +- .../protocol1_9to1_8}/HandItemCache.java | 2 +- .../protocol1_9to1_8}/PaperPatch.java | 2 +- common/pom.xml | 1 + .../java/us/myles/ViaVersion/ViaManager.java | 84 ++++ .../myles/ViaVersion/api/PacketWrapper.java | 5 +- .../java/us/myles/ViaVersion/api/Via.java | 9 + .../java/us/myles/ViaVersion/api/ViaAPI.java | 100 +++++ .../ViaVersion/api/data/UserConnection.java | 1 - .../ViaVersion/api/platform/ViaInjector.java | 9 + .../ViaVersion/api/platform/ViaPlatform.java | 16 +- .../api/protocol/ProtocolPipeline.java | 6 +- .../api/protocol/ProtocolRegistry.java | 4 +- .../protocol1_9to1_8/Protocol1_9TO1_8.java | 2 +- .../storage/ClientChunks.java | 7 +- .../protocol1_9to1_8/types/ChunkType.java | 4 +- .../protocolsnapshotto1_10/ItemRewriter.java | 3 +- .../myles/ViaVersion/update/UpdateUtil.java | 20 +- .../us/myles/ViaVersion/util/ListWrapper.java | 1 - 30 files changed, 662 insertions(+), 425 deletions(-) create mode 100644 TODOLIST create mode 100644 bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaAPI.java create mode 100644 bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java rename {common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners => bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8}/ArmorListener.java (98%) rename {common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners => bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8}/BlockListener.java (93%) rename {common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners => bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8}/CommandBlockListener.java (98%) rename {common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners => bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8}/DeathListener.java (96%) rename {common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners => bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8}/HandItemCache.java (94%) rename {common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners => bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8}/PaperPatch.java (97%) create mode 100644 common/src/main/java/us/myles/ViaVersion/ViaManager.java create mode 100644 common/src/main/java/us/myles/ViaVersion/api/ViaAPI.java create mode 100644 common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java diff --git a/TODOLIST b/TODOLIST new file mode 100644 index 000000000..dcf12e9aa --- /dev/null +++ b/TODOLIST @@ -0,0 +1,14 @@ +Migrate EntityUtil to be cool +Fix 1.9to1.8 +Fix 1.9.3to1.9.1/2 +Fix 1.9.1/2to1.9.3/4 +Fix snapshot to 1.10 +Fix BaseProtocol +Fix BossBar to use Generics +Register Listeners Properly +Fix commands +Handle injector errors +Add new info to dump for platform +Migrate Bukkit types to our own :D + +Important: Create builder for ViaManager which allows supplying on the command exectutor, injector, platform :D \ No newline at end of file diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 0b72d9560..159e8d59d 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -1,71 +1,55 @@ package us.myles.ViaVersion; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.socket.SocketChannel; import lombok.Getter; -import lombok.NonNull; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; -import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.java.JavaPlugin; -import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.ViaAPI; import us.myles.ViaVersion.api.ViaVersion; -import us.myles.ViaVersion.api.ViaVersionAPI; -import us.myles.ViaVersion.api.boss.BossBar; -import us.myles.ViaVersion.api.boss.BossColor; -import us.myles.ViaVersion.api.boss.BossStyle; -import us.myles.ViaVersion.api.command.ViaVersionCommand; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; -import us.myles.ViaVersion.api.protocol.ProtocolVersion; -import us.myles.ViaVersion.boss.ViaBossBar; import us.myles.ViaVersion.bukkit.BukkitCommandHandler; +import us.myles.ViaVersion.bukkit.BukkitViaAPI; +import us.myles.ViaVersion.bukkit.BukkitViaInjector; import us.myles.ViaVersion.classgenerator.ClassGenerator; -import us.myles.ViaVersion.handlers.ViaVersionInitializer; import us.myles.ViaVersion.listeners.UpdateListener; -import us.myles.ViaVersion.protocols.base.ProtocolInfo; -import us.myles.ViaVersion.update.UpdateUtil; -import us.myles.ViaVersion.util.ConcurrentList; -import us.myles.ViaVersion.util.ListWrapper; -import us.myles.ViaVersion.util.ProtocolSupportUtil; import us.myles.ViaVersion.util.ReflectionUtil; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.*; +import java.util.UUID; import java.util.concurrent.Callable; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; -public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI, ViaPlatform { +public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { - private final Map portedPlayers = new ConcurrentHashMap<>(); - private List injectedFutures = new ArrayList<>(); - private List> injectedLists = new ArrayList<>(); private BukkitCommandHandler commandHandler; - private boolean debug = false; private boolean compatSpigotBuild = false; private boolean spigot = true; private boolean lateBind = false; private boolean protocolSupport = false; @Getter private ViaConfig conf; + @Getter + private ViaAPI api = new BukkitViaAPI(this); public ViaVersionPlugin() { + // Config magic + conf = new ViaConfig(this); + // Init platform + Via.init(this); + // For compatibility + ViaVersion.setInstance(this); + // Check if we're using protocol support too protocolSupport = Bukkit.getPluginManager().getPlugin("ProtocolSupport") != null; if (protocolSupport) { getLogger().info("Hooking into ProtocolSupport, to prevent issues!"); try { - patchLists(); + BukkitViaInjector.patchLists(); } catch (Exception e) { e.printStackTrace(); } @@ -74,27 +58,6 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI, ViaPl @Override public void onLoad() { - // Config magic - conf = new ViaConfig(this); - // Init platform - Via.init(this); - // For compatibility - ViaVersion.setInstance(this); - - // Handle reloads - if (System.getProperty("ViaVersion") != null) { - if (Bukkit.getPluginManager().getPlugin("ProtocolLib") != null) { - getLogger().severe("ViaVersion is already loaded, we're going to kick all the players... because otherwise we'll crash because of ProtocolLib."); - for (Player player : Bukkit.getOnlinePlayers()) { - player.kickPlayer(ChatColor.translateAlternateColorCodes('&', getConf().getReloadDisconnectMsg())); - } - - } else { - getLogger().severe("ViaVersion is already loaded, this should work fine. If you get any console errors, try rebooting."); - - } - } - // Spigot detector try { Class.forName("org.spigotmc.SpigotConfig"); @@ -111,35 +74,19 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI, ViaPl // Generate classes needed (only works if it's compat or ps) ClassGenerator.generate(); - lateBind = !isBinded(); + lateBind = !BukkitViaInjector.isBinded(); getLogger().info("ViaVersion " + getDescription().getVersion() + (compatSpigotBuild ? "compat" : "") + " is now loaded" + (lateBind ? ", waiting for boot. (late-bind)" : ", injecting!")); - if (!lateBind) - injectPacketHandler(); + if (!lateBind) { + Via.getManager().init(); + } } @Override public void onEnable() { - if (lateBind) - injectPacketHandler(); - if (conf.isCheckForUpdates()) - UpdateUtil.sendUpdateMessage(); - // Gather version :) - Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { - @Override - public void run() { - gatherProtocolVersion(); - // Check if there are any pipes to this version - if (ProtocolRegistry.SERVER_PROTOCOL != -1) { - getLogger().info("ViaVersion detected server version: " + ProtocolVersion.getProtocol(ProtocolRegistry.SERVER_PROTOCOL)); - if (!ProtocolRegistry.isWorkingPipe()) { - getLogger().warning("ViaVersion does not have any compatible versions for this server version, please read our resource page carefully."); - } - } - ProtocolRegistry.refreshVersions(); - } - }); - + if (lateBind) { + Via.getManager().init(); + } Bukkit.getPluginManager().registerEvents(new UpdateListener(), this); @@ -157,325 +104,18 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI, ViaPl @Override public void onDisable() { - getLogger().info("ViaVersion is disabling, if this is a reload and you experience issues consider rebooting."); - uninject(); + // TODO: Call ViaManager.destroy() } - public void gatherProtocolVersion() { - try { - Class serverClazz = ReflectionUtil.nms("MinecraftServer"); - Object server = ReflectionUtil.invokeStatic(serverClazz, "getServer"); - Class pingClazz = ReflectionUtil.nms("ServerPing"); - Object ping = null; - // Search for ping method - for (Field f : serverClazz.getDeclaredFields()) { - if (f.getType() != null) { - if (f.getType().getSimpleName().equals("ServerPing")) { - f.setAccessible(true); - ping = f.get(server); - } - } - } - if (ping != null) { - Object serverData = null; - for (Field f : pingClazz.getDeclaredFields()) { - if (f.getType() != null) { - if (f.getType().getSimpleName().endsWith("ServerData")) { - f.setAccessible(true); - serverData = f.get(ping); - } - } - } - if (serverData != null) { - int protocolVersion = -1; - for (Field f : serverData.getClass().getDeclaredFields()) { - if (f.getType() != null) { - if (f.getType() == int.class) { - f.setAccessible(true); - protocolVersion = (int) f.get(serverData); - } - } - } - if (protocolVersion != -1) { - ProtocolRegistry.SERVER_PROTOCOL = protocolVersion; - return; - } - } - } - } catch (Exception e) { - e.printStackTrace(); - // We couldn't work it out... We'll just use ping and hope for the best... - } - } - - public Object getServerConnection() throws Exception { - Class serverClazz = ReflectionUtil.nms("MinecraftServer"); - Object server = ReflectionUtil.invokeStatic(serverClazz, "getServer"); - Object connection = null; - for (Method m : serverClazz.getDeclaredMethods()) { - if (m.getReturnType() != null) { - if (m.getReturnType().getSimpleName().equals("ServerConnection")) { - if (m.getParameterTypes().length == 0) { - connection = m.invoke(server); - } - } - } - } - return connection; - } - - public void injectPacketHandler() { - try { - Object connection = getServerConnection(); - if (connection == null) { - getLogger().warning("We failed to find the core component 'ServerConnection', please file an issue on our GitHub."); - return; - } - for (Field field : connection.getClass().getDeclaredFields()) { - field.setAccessible(true); - final Object value = field.get(connection); - if (value instanceof List) { - // Inject the list - List wrapper = new ListWrapper((List) value) { - @Override - public synchronized void handleAdd(Object o) { - synchronized (this) { - if (o instanceof ChannelFuture) { - inject((ChannelFuture) o); - } - } - } - }; - injectedLists.add(new Pair<>(field, connection)); - field.set(connection, wrapper); - // Iterate through current list - synchronized (wrapper) { - for (Object o : (List) value) { - if (o instanceof ChannelFuture) { - inject((ChannelFuture) o); - } else { - break; // not the right list. - } - } - } - } - } - System.setProperty("ViaVersion", getDescription().getVersion()); - } catch (Exception e) { - getLogger().severe("Unable to inject ViaVersion, please post these details on our GitHub and ensure you're using a compatible server version."); - e.printStackTrace(); - } - } - - - public void patchLists() throws Exception { - Object connection = getServerConnection(); - if (connection == null) { - getLogger().warning("We failed to find the core component 'ServerConnection', please file an issue on our GitHub."); - return; - } - for (Field field : connection.getClass().getDeclaredFields()) { - field.setAccessible(true); - final Object value = field.get(connection); - if (value instanceof List) { - if (!(value instanceof ConcurrentList)) { - ConcurrentList list = new ConcurrentList(); - list.addAll((List) value); - field.set(connection, list); - } - } - } - } - - - public boolean isBinded() { - try { - Object connection = getServerConnection(); - if (connection == null) { - return false; - } - for (Field field : connection.getClass().getDeclaredFields()) { - field.setAccessible(true); - final Object value = field.get(connection); - if (value instanceof List) { - // Inject the list - synchronized (value) { - for (Object o : (List) value) { - if (o instanceof ChannelFuture) { - return true; - } else { - break; // not the right list. - } - } - } - } - } - } catch (Exception e) { - } - return false; - } - - private void inject(ChannelFuture future) { - try { - ChannelHandler bootstrapAcceptor = future.channel().pipeline().first(); - try { - ChannelInitializer oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class); - ChannelInitializer newInit = new ViaVersionInitializer(oldInit); - - ReflectionUtil.set(bootstrapAcceptor, "childHandler", newInit); - injectedFutures.add(future); - } catch (NoSuchFieldException e) { - // let's find who to blame! - ClassLoader cl = bootstrapAcceptor.getClass().getClassLoader(); - if (cl.getClass().getName().equals("org.bukkit.plugin.java.PluginClassLoader")) { - PluginDescriptionFile yaml = ReflectionUtil.get(cl, "description", PluginDescriptionFile.class); - throw new Exception("Unable to inject, due to " + bootstrapAcceptor.getClass().getName() + ", try without the plugin " + yaml.getName() + "?"); - } else { - throw new Exception("Unable to find core component 'childHandler', please check your plugins. issue: " + bootstrapAcceptor.getClass().getName()); - } - - } - } catch (Exception e) { - getLogger().severe("We failed to inject ViaVersion, have you got late-bind enabled with something else?"); - e.printStackTrace(); - } - } - - private void uninject() { - // TODO: Uninject from players currently online to prevent protocol lib issues. - for (ChannelFuture future : injectedFutures) { - ChannelHandler bootstrapAcceptor = future.channel().pipeline().first(); - try { - ChannelInitializer oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class); - if (oldInit instanceof ViaVersionInitializer) { - ReflectionUtil.set(bootstrapAcceptor, "childHandler", ((ViaVersionInitializer) oldInit).getOriginal()); - } - } catch (Exception e) { - System.out.println("Failed to remove injection handler, reload won't work with connections, please reboot!"); - } - } - injectedFutures.clear(); - - for (Pair pair : injectedLists) { - try { - Object o = pair.getKey().get(pair.getValue()); - if (o instanceof ListWrapper) { - pair.getKey().set(pair.getValue(), ((ListWrapper) o).getOriginalList()); - } - } catch (IllegalAccessException e) { - System.out.println("Failed to remove injection, reload won't work with connections, please reboot!"); - } - } - - injectedLists.clear(); - } - - @Override - public boolean isPorted(Player player) { - return isPorted(player.getUniqueId()); - } - - @Override - public int getPlayerVersion(@NonNull Player player) { - if (!isPorted(player)) - return getExternalVersion(player); - return portedPlayers.get(player.getUniqueId()).get(ProtocolInfo.class).getProtocolVersion(); - } - - @Override - public int getPlayerVersion(@NonNull UUID uuid) { - if (!isPorted(uuid)) - return getExternalVersion(Bukkit.getPlayer(uuid)); - return portedPlayers.get(uuid).get(ProtocolInfo.class).getProtocolVersion(); - } - - private int getExternalVersion(Player player) { - if (!isProtocolSupport()) { - return ProtocolRegistry.SERVER_PROTOCOL; - } else { - return ProtocolSupportUtil.getProtocolVersion(player); - } - } - - @Override - public boolean isPorted(UUID playerUUID) { - return portedPlayers.containsKey(playerUUID); - } - - @Override - public String getVersion() { - return getDescription().getVersion(); - } - - public UserConnection getConnection(UUID playerUUID) { - return portedPlayers.get(playerUUID); - } - - public UserConnection getConnection(Player player) { - return portedPlayers.get(player.getUniqueId()); - } - - public void sendRawPacket(Player player, ByteBuf packet) throws IllegalArgumentException { - sendRawPacket(player.getUniqueId(), packet); - } - - @Override - public void sendRawPacket(UUID uuid, ByteBuf packet) throws IllegalArgumentException { - if (!isPorted(uuid)) throw new IllegalArgumentException("This player is not controlled by ViaVersion!"); - UserConnection ci = portedPlayers.get(uuid); - ci.sendRawPacket(packet); - } - - @Override - public BossBar createBossBar(String title, BossColor color, BossStyle style) { - return new ViaBossBar(title, 1F, color, style); - } - - @Override - public BossBar createBossBar(String title, float health, BossColor color, BossStyle style) { - return new ViaBossBar(title, health, color, style); - } - - @Override - public boolean isDebug() { - return this.debug; - } - - public void setDebug(boolean value) { - this.debug = value; - } - - @Override - public ViaVersionCommand getCommandHandler() { - return commandHandler; - } - - @Override public boolean isCompatSpigotBuild() { return compatSpigotBuild; } - @Override - public SortedSet getSupportedVersions() { - SortedSet outputSet = new TreeSet<>(ProtocolRegistry.getSupportedVersions()); - outputSet.removeAll(getConf().getBlockedProtocols()); - return outputSet; - } - - @Override public boolean isSpigot() { return this.spigot; } - public void addPortedClient(UserConnection info) { - portedPlayers.put(info.get(ProtocolInfo.class).getUuid(), info); - } - - public void removePortedClient(UUID clientID) { - portedPlayers.remove(clientID); - } - public void run(final Runnable runnable, boolean wait) { try { Future f = Bukkit.getScheduler().callSyncMethod(Bukkit.getPluginManager().getPlugin("ViaVersion"), new Callable() { @@ -499,10 +139,6 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI, ViaPl return protocolSupport; } - public Map getPortedPlayers() { - return portedPlayers; - } - public boolean handlePPS(UserConnection info) { // Max PPS Checker if (conf.getMaxPPS() > 0) { @@ -576,4 +212,17 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI, ViaPl public boolean isPluginEnabled() { return Bukkit.getPluginManager().getPlugin("ViaVersion").isEnabled(); } + + @Override + public void onReload() { + if (Bukkit.getPluginManager().getPlugin("ProtocolLib") != null) { + getLogger().severe("ViaVersion is already loaded, we're going to kick all the players... because otherwise we'll crash because of ProtocolLib."); + for (Player player : Bukkit.getOnlinePlayers()) { + player.kickPlayer(ChatColor.translateAlternateColorCodes('&', getConf().getReloadDisconnectMsg())); + } + + } else { + getLogger().severe("ViaVersion is already loaded, this should work fine. If you get any console errors, try rebooting."); + } + } } diff --git a/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java b/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java index 124bd33bf..a962fd924 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java @@ -7,13 +7,12 @@ import us.myles.ViaVersion.api.boss.BossColor; import us.myles.ViaVersion.api.boss.BossStyle; import us.myles.ViaVersion.api.command.ViaVersionCommand; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; -import us.myles.ViaVersion.boss.ViaBossBar; import java.util.SortedSet; import java.util.UUID; @Deprecated -public interface ViaVersionAPI { +public interface ViaVersionAPI extends ViaAPI { /** * Is the player connection modified by ViaVersion? * diff --git a/bukkit/src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java b/bukkit/src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java index 6ec57ceb9..519c42fcd 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java @@ -8,6 +8,7 @@ import us.myles.ViaVersion.api.boss.BossStyle; @Getter public class ViaBossBar extends CommonBoss { + // TODO: Fix to use generics public ViaBossBar(String title, float health, BossColor color, BossStyle style) { super(title, health, color, style); diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaAPI.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaAPI.java new file mode 100644 index 000000000..3c833a92f --- /dev/null +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaAPI.java @@ -0,0 +1,127 @@ +package us.myles.ViaVersion.bukkit; + +import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.NonNull; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import us.myles.ViaVersion.ViaVersionPlugin; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.ViaAPI; +import us.myles.ViaVersion.api.ViaVersionAPI; +import us.myles.ViaVersion.api.boss.BossBar; +import us.myles.ViaVersion.api.boss.BossColor; +import us.myles.ViaVersion.api.boss.BossStyle; +import us.myles.ViaVersion.api.command.ViaVersionCommand; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.protocol.ProtocolRegistry; +import us.myles.ViaVersion.boss.ViaBossBar; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; +import us.myles.ViaVersion.util.ProtocolSupportUtil; + +import java.util.Map; +import java.util.SortedSet; +import java.util.TreeSet; +import java.util.UUID; + +@AllArgsConstructor +public class BukkitViaAPI implements ViaAPI, ViaVersionAPI { + public ViaVersionPlugin plugin; + + @Override + public int getPlayerVersion(@NonNull Player player) { + if (!isPorted(player)) + return getExternalVersion(player); + return getPortedPlayers().get(player.getUniqueId()).get(ProtocolInfo.class).getProtocolVersion(); + } + + @Override + public int getPlayerVersion(@NonNull UUID uuid) { + if (!isPorted(uuid)) + return getExternalVersion(Bukkit.getPlayer(uuid)); + return getPortedPlayers().get(uuid).get(ProtocolInfo.class).getProtocolVersion(); + } + + private int getExternalVersion(Player player) { + if (!isProtocolSupport()) { + return ProtocolRegistry.SERVER_PROTOCOL; + } else { + return ProtocolSupportUtil.getProtocolVersion(player); + } + } + + @Override + public boolean isPorted(Player player) { + return isPorted(player.getUniqueId()); + } + + @Override + public boolean isPorted(UUID playerUUID) { + return getPortedPlayers().containsKey(playerUUID); + } + + @Override + public String getVersion() { + return plugin.getDescription().getVersion(); + } + + @Override + public void sendRawPacket(UUID uuid, ByteBuf packet) throws IllegalArgumentException { + if (!isPorted(uuid)) throw new IllegalArgumentException("This player is not controlled by ViaVersion!"); + UserConnection ci = getPortedPlayers().get(uuid); + ci.sendRawPacket(packet); + } + + @Override + public void sendRawPacket(Player player, ByteBuf packet) throws IllegalArgumentException { + sendRawPacket(player.getUniqueId(), packet); + } + + @Override + public BossBar createBossBar(String title, BossColor color, BossStyle style) { + return new ViaBossBar(title, 1F, color, style); + } + + @Override + public BossBar createBossBar(String title, float health, BossColor color, BossStyle style) { + return new ViaBossBar(title, health, color, style); + } + + @Override + public boolean isDebug() { + return Via.getManager().isDebug(); + } + + @Override + public ViaVersionCommand getCommandHandler() { + return Via.getManager().getCommandHandler(); + } + + @Override + public SortedSet getSupportedVersions() { + SortedSet outputSet = new TreeSet<>(ProtocolRegistry.getSupportedVersions()); + outputSet.removeAll(Via.getPlatform().getConf().getBlockedProtocols()); + + return outputSet; + } + + @Override + public boolean isCompatSpigotBuild() { + return plugin.isCompatSpigotBuild(); + } + + + @Override + public boolean isSpigot() { + return plugin.isSpigot(); + } + + @Override + public boolean isProtocolSupport() { + return plugin.isProtocolSupport(); + } + + public Map getPortedPlayers() { + return Via.getManager().getPortedPlayers(); + } +} diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java new file mode 100644 index 000000000..f53ece720 --- /dev/null +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java @@ -0,0 +1,233 @@ +package us.myles.ViaVersion.bukkit; + +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.socket.SocketChannel; +import org.bukkit.plugin.PluginDescriptionFile; +import us.myles.ViaVersion.api.Pair; +import us.myles.ViaVersion.api.platform.ViaInjector; +import us.myles.ViaVersion.api.protocol.ProtocolRegistry; +import us.myles.ViaVersion.handlers.ViaVersionInitializer; +import us.myles.ViaVersion.util.ConcurrentList; +import us.myles.ViaVersion.util.ListWrapper; +import us.myles.ViaVersion.util.ReflectionUtil; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +public class BukkitViaInjector implements ViaInjector { + private List injectedFutures = new ArrayList<>(); + private List> injectedLists = new ArrayList<>(); + + @Override + public void inject() { + try { + Object connection = getServerConnection(); + if (connection == null) { + getLogger().warning("We failed to find the core component 'ServerConnection', please file an issue on our GitHub."); + return; + } + for (Field field : connection.getClass().getDeclaredFields()) { + field.setAccessible(true); + final Object value = field.get(connection); + if (value instanceof List) { + // Inject the list + List wrapper = new ListWrapper((List) value) { + @Override + public synchronized void handleAdd(Object o) { + synchronized (this) { + if (o instanceof ChannelFuture) { + injectChannelFuture((ChannelFuture) o); + } + } + } + }; + injectedLists.add(new Pair<>(field, connection)); + field.set(connection, wrapper); + // Iterate through current list + synchronized (wrapper) { + for (Object o : (List) value) { + if (o instanceof ChannelFuture) { + injectChannelFuture((ChannelFuture) o); + } else { + break; // not the right list. + } + } + } + } + } + + } catch (Exception e) { + getLogger().severe("Unable to inject ViaVersion, please post these details on our GitHub and ensure you're using a compatible server version."); + e.printStackTrace(); + } + } + + private void injectChannelFuture(ChannelFuture future) { + try { + ChannelHandler bootstrapAcceptor = future.channel().pipeline().first(); + try { + ChannelInitializer oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class); + ChannelInitializer newInit = new ViaVersionInitializer(oldInit); + + ReflectionUtil.set(bootstrapAcceptor, "childHandler", newInit); + injectedFutures.add(future); + } catch (NoSuchFieldException e) { + // let's find who to blame! + ClassLoader cl = bootstrapAcceptor.getClass().getClassLoader(); + if (cl.getClass().getName().equals("org.bukkit.plugin.java.PluginClassLoader")) { + PluginDescriptionFile yaml = ReflectionUtil.get(cl, "description", PluginDescriptionFile.class); + throw new Exception("Unable to inject, due to " + bootstrapAcceptor.getClass().getName() + ", try without the plugin " + yaml.getName() + "?"); + } else { + throw new Exception("Unable to find core component 'childHandler', please check your plugins. issue: " + bootstrapAcceptor.getClass().getName()); + } + + } + } catch (Exception e) { + getLogger().severe("We failed to inject ViaVersion, have you got late-bind enabled with something else?"); + e.printStackTrace(); + } + } + + @Override + public void uninject() { + // TODO: Uninject from players currently online to prevent protocol lib issues. + for (ChannelFuture future : injectedFutures) { + ChannelHandler bootstrapAcceptor = future.channel().pipeline().first(); + try { + ChannelInitializer oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class); + if (oldInit instanceof ViaVersionInitializer) { + ReflectionUtil.set(bootstrapAcceptor, "childHandler", ((ViaVersionInitializer) oldInit).getOriginal()); + } + } catch (Exception e) { + System.out.println("Failed to remove injection handler, reload won't work with connections, please reboot!"); + } + } + injectedFutures.clear(); + + for (Pair pair : injectedLists) { + try { + Object o = pair.getKey().get(pair.getValue()); + if (o instanceof ListWrapper) { + pair.getKey().set(pair.getValue(), ((ListWrapper) o).getOriginalList()); + } + } catch (IllegalAccessException e) { + System.out.println("Failed to remove injection, reload won't work with connections, please reboot!"); + } + } + + injectedLists.clear(); + } + + @Override + public int getServerProtocolVersion() { + try { + Class serverClazz = ReflectionUtil.nms("MinecraftServer"); + Object server = ReflectionUtil.invokeStatic(serverClazz, "getServer"); + Class pingClazz = ReflectionUtil.nms("ServerPing"); + Object ping = null; + // Search for ping method + for (Field f : serverClazz.getDeclaredFields()) { + if (f.getType() != null) { + if (f.getType().getSimpleName().equals("ServerPing")) { + f.setAccessible(true); + ping = f.get(server); + } + } + } + if (ping != null) { + Object serverData = null; + for (Field f : pingClazz.getDeclaredFields()) { + if (f.getType() != null) { + if (f.getType().getSimpleName().endsWith("ServerData")) { + f.setAccessible(true); + serverData = f.get(ping); + } + } + } + if (serverData != null) { + int protocolVersion = -1; + for (Field f : serverData.getClass().getDeclaredFields()) { + if (f.getType() != null) { + if (f.getType() == int.class) { + f.setAccessible(true); + protocolVersion = (int) f.get(serverData); + } + } + } + if (protocolVersion != -1) { + return protocolVersion; + } + } + } + } catch (Exception e) { + e.printStackTrace(); + // We couldn't work it out... We'll just use ping and hope for the best... + } + } + + public static Object getServerConnection() throws Exception { + Class serverClazz = ReflectionUtil.nms("MinecraftServer"); + Object server = ReflectionUtil.invokeStatic(serverClazz, "getServer"); + Object connection = null; + for (Method m : serverClazz.getDeclaredMethods()) { + if (m.getReturnType() != null) { + if (m.getReturnType().getSimpleName().equals("ServerConnection")) { + if (m.getParameterTypes().length == 0) { + connection = m.invoke(server); + } + } + } + } + return connection; + } + + public static void patchLists() throws Exception { + Object connection = getServerConnection(); + if (connection == null) { + getLogger().warning("We failed to find the core component 'ServerConnection', please file an issue on our GitHub."); + return; + } + for (Field field : connection.getClass().getDeclaredFields()) { + field.setAccessible(true); + final Object value = field.get(connection); + if (value instanceof List) { + if (!(value instanceof ConcurrentList)) { + ConcurrentList list = new ConcurrentList(); + list.addAll((List) value); + field.set(connection, list); + } + } + } + } + + public static boolean isBinded() { + try { + Object connection = getServerConnection(); + if (connection == null) { + return false; + } + for (Field field : connection.getClass().getDeclaredFields()) { + field.setAccessible(true); + final Object value = field.get(connection); + if (value instanceof List) { + // Inject the list + synchronized (value) { + for (Object o : (List) value) { + if (o instanceof ChannelFuture) { + return true; + } else { + break; // not the right list. + } + } + } + } + } + } catch (Exception e) { + } + return false; + } +} diff --git a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java index c7122233e..a947ee757 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java @@ -20,7 +20,6 @@ public class ViaDecodeHandler extends ByteToMessageDecoder { private final ByteToMessageDecoder minecraftDecoder; private final UserConnection info; - public static int PASSTHROUGH_ID = 1000; public ViaDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) { this.info = info; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/UpdateListener.java b/bukkit/src/main/java/us/myles/ViaVersion/listeners/UpdateListener.java index c71921d88..c7c9c044c 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/listeners/UpdateListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/listeners/UpdateListener.java @@ -15,5 +15,4 @@ public class UpdateListener implements Listener { UpdateUtil.sendUpdateMessage(e.getPlayer().getUniqueId()); } } - } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/ArmorListener.java b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/ArmorListener.java similarity index 98% rename from common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/ArmorListener.java rename to bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/ArmorListener.java index 36e012132..9e31d4c27 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/ArmorListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/ArmorListener.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.protocols.protocol1_9to1_8.listeners; +package us.myles.ViaVersion.listeners.protocol1_9to1_8; import org.bukkit.Bukkit; import org.bukkit.entity.HumanEntity; diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/BlockListener.java b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/BlockListener.java similarity index 93% rename from common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/BlockListener.java rename to bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/BlockListener.java index 8143caa91..1c4319021 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/BlockListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/BlockListener.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.protocols.protocol1_9to1_8.listeners; +package us.myles.ViaVersion.listeners.protocol1_9to1_8; import org.bukkit.block.Block; import org.bukkit.event.EventHandler; diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/CommandBlockListener.java b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/CommandBlockListener.java similarity index 98% rename from common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/CommandBlockListener.java rename to bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/CommandBlockListener.java index a18ec4f27..5f5c713b6 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/CommandBlockListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/CommandBlockListener.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.protocols.protocol1_9to1_8.listeners; +package us.myles.ViaVersion.listeners.protocol1_9to1_8; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufOutputStream; diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/DeathListener.java b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/DeathListener.java similarity index 96% rename from common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/DeathListener.java rename to bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/DeathListener.java index 51f91e4d0..07760f598 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/DeathListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/DeathListener.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.protocols.protocol1_9to1_8.listeners; +package us.myles.ViaVersion.listeners.protocol1_9to1_8; import org.bukkit.Bukkit; import org.bukkit.World; diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/HandItemCache.java b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/HandItemCache.java similarity index 94% rename from common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/HandItemCache.java rename to bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/HandItemCache.java index ed1791ca7..81abed547 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/HandItemCache.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/HandItemCache.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.protocols.protocol1_9to1_8.listeners; +package us.myles.ViaVersion.listeners.protocol1_9to1_8; import org.bukkit.Bukkit; import org.bukkit.entity.Player; diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/PaperPatch.java b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/PaperPatch.java similarity index 97% rename from common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/PaperPatch.java rename to bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/PaperPatch.java index bd59d0f2e..5a1e36371 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/PaperPatch.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/PaperPatch.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.protocols.protocol1_9to1_8.listeners; +package us.myles.ViaVersion.listeners.protocol1_9to1_8; import org.bukkit.Location; import org.bukkit.Material; diff --git a/common/pom.xml b/common/pom.xml index a8efbad02..427ec7ce4 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -7,6 +7,7 @@ us.myles 1.0.0-ALPHA-16w38a + 4.0.0 viaversion-common diff --git a/common/src/main/java/us/myles/ViaVersion/ViaManager.java b/common/src/main/java/us/myles/ViaVersion/ViaManager.java new file mode 100644 index 000000000..e891e04c4 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/ViaManager.java @@ -0,0 +1,84 @@ +package us.myles.ViaVersion; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import us.myles.ViaVersion.api.command.ViaVersionCommand; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.platform.ViaInjector; +import us.myles.ViaVersion.api.platform.ViaPlatform; +import us.myles.ViaVersion.api.protocol.ProtocolRegistry; +import us.myles.ViaVersion.api.protocol.ProtocolVersion; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; +import us.myles.ViaVersion.update.UpdateUtil; + +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +@Getter +public class ViaManager { + private ViaPlatform platform; + private final Map portedPlayers = new ConcurrentHashMap<>(); + @Setter + private boolean debug = false; + // Internals + private ViaInjector injector; + private ViaVersionCommand commandHandler; + + public ViaManager(ViaPlatform platform) { + this.platform = platform; + } + + public void init() { + if (System.getProperty("ViaVersion") != null) { + // Reload? + platform.onReload(); + } + // Check for updates + if (platform.getConf().isCheckForUpdates()) + UpdateUtil.sendUpdateMessage(); + // Inject + // TODO: Get errors + injector.inject(); + // Mark as injected + System.setProperty("ViaVersion", getPlatform().getPluginVersion()); + // If successful + // TODO: This method might run in onLoad, ensure sync tasks can still run if plugin not enabled. + platform.runSync(new Runnable() { + @Override + public void run() { + ProtocolRegistry.SERVER_PROTOCOL = injector.getServerProtocolVersion(); + + // Check if there are any pipes to this version + if (ProtocolRegistry.SERVER_PROTOCOL != -1) { + getPlatform().getLogger().info("ViaVersion detected server version: " + ProtocolVersion.getProtocol(ProtocolRegistry.SERVER_PROTOCOL)); + if (!ProtocolRegistry.isWorkingPipe()) { + getPlatform().getLogger().warning("ViaVersion does not have any compatible versions for this server version, please read our resource page carefully."); + } + } + ProtocolRegistry.refreshVersions(); + } + }); + + } + + public void destroy() { + // Uninject + getPlatform().getLogger().info("ViaVersion is disabling, if this is a reload and you experience issues consider rebooting."); + injector.uninject(); + } + + public void addPortedClient(UserConnection info) { + portedPlayers.put(info.get(ProtocolInfo.class).getUuid(), info); + } + + public void removePortedClient(UUID clientID) { + portedPlayers.remove(clientID); + } + + public UserConnection getConnection(UUID playerUUID) { + return portedPlayers.get(playerUUID); + } + +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java b/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java index 18d631225..10347f2ce 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java +++ b/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java @@ -12,7 +12,6 @@ import us.myles.ViaVersion.api.remapper.ValueCreator; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.api.type.TypeConverter; import us.myles.ViaVersion.exception.InformativeException; -import us.myles.ViaVersion.handlers.ViaDecodeHandler; import us.myles.ViaVersion.packets.Direction; import us.myles.ViaVersion.packets.State; import us.myles.ViaVersion.protocols.base.ProtocolInfo; @@ -25,6 +24,8 @@ import java.util.LinkedList; import java.util.List; public class PacketWrapper { + public static int PASSTHROUGH_ID = 1000; + private final ByteBuf inputBuffer; private final UserConnection userConnection; private boolean send = true; @@ -461,7 +462,7 @@ public class PacketWrapper { public void sendToServer() throws Exception { if (!isCancelled()) { ByteBuf output = inputBuffer == null ? Unpooled.buffer() : inputBuffer.alloc().buffer(); - Type.VAR_INT.write(output, ViaDecodeHandler.PASSTHROUGH_ID); // Pass through + Type.VAR_INT.write(output, PacketWrapper.PASSTHROUGH_ID); // Pass through writeToBuffer(output); diff --git a/common/src/main/java/us/myles/ViaVersion/api/Via.java b/common/src/main/java/us/myles/ViaVersion/api/Via.java index 06d2461d6..30983d426 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/Via.java +++ b/common/src/main/java/us/myles/ViaVersion/api/Via.java @@ -2,14 +2,23 @@ package us.myles.ViaVersion.api; import lombok.Getter; import org.apache.commons.lang.Validate; +import us.myles.ViaVersion.ViaManager; import us.myles.ViaVersion.api.platform.ViaPlatform; public class Via { @Getter private static ViaPlatform platform; + @Getter + private static ViaManager manager; public static void init(ViaPlatform platform) { Validate.isTrue(platform == null, "Platform is already set"); Via.platform = platform; + Via.manager = new ViaManager(platform); + } + + public static ViaAPI getAPI() { + Validate.isTrue(platform != null, "ViaVersion has not loaded the Platform"); + return Via.platform.getApi(); } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/ViaAPI.java b/common/src/main/java/us/myles/ViaVersion/api/ViaAPI.java new file mode 100644 index 000000000..f98eeaa3b --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/ViaAPI.java @@ -0,0 +1,100 @@ +package us.myles.ViaVersion.api; + +import io.netty.buffer.ByteBuf; +import us.myles.ViaVersion.api.boss.BossBar; +import us.myles.ViaVersion.api.boss.BossColor; +import us.myles.ViaVersion.api.boss.BossStyle; +import us.myles.ViaVersion.api.command.ViaVersionCommand; +import us.myles.ViaVersion.api.protocol.ProtocolRegistry; + +import java.util.SortedSet; +import java.util.UUID; + +/** + * Represents the ViaAPI + * + * @param The player type for the specific platform, for bukkit it's {@code ViaAPI} + */ +public interface ViaAPI { + /** + * Get protocol number from a player + * Will also retrieve version from ProtocolSupport if it's being used. + * + * @param player Platform player object, eg. Bukkit this is Player + * @return Protocol ID, For example (47=1.8-1.8.8, 107=1.9, 108=1.9.1) + */ + int getPlayerVersion(T player); + + /** + * Get protocol number from a player + * + * @param uuid UUID of a player + * @return Protocol ID, For example (47=1.8-1.8.8, 107=1.9, 108=1.9.1) + */ + int getPlayerVersion(UUID uuid); + + /** + * Is player using 1.9? + * + * @param playerUUID UUID of a player + * @return True if the client is on 1.9 + * @deprecated As of 0.9.9, because all players are ported use {@link #getPlayerVersion(UUID)} + */ + @Deprecated + boolean isPorted(UUID playerUUID); + + /** + * Get the version of the plugin + * + * @return Plugin version + */ + String getVersion(); + + /** + * Send a raw packet to the player (Use new IDs) + * + * @param player Platform player object, eg. Bukkit this is Player + * @param packet The packet, you need a VarInt ID then the packet contents. + * @throws IllegalArgumentException If not on 1.9 throws IllegalArg + */ + void sendRawPacket(T player, ByteBuf packet) throws IllegalArgumentException; + + /** + * Send a raw packet to the player (Use new IDs) + * + * @param uuid The uuid from the player to send packet + * @param packet The packet, you need a VarInt ID then the packet contents. + * @throws IllegalArgumentException If not on 1.9 throws IllegalArg + */ + void sendRawPacket(UUID uuid, ByteBuf packet) throws IllegalArgumentException; + + /** + * Create a new bossbar instance + * + * @param title The title + * @param color The color + * @param style The style + * @return BossBar instance + */ + BossBar createBossBar(String title, BossColor color, BossStyle style); + + /** + * Create a new bossbar instance + * + * @param title The title + * @param health Number between 0 and 1 + * @param color The color + * @param style The style + * @return BossBar instance + */ + BossBar createBossBar(String title, float health, BossColor color, BossStyle style); + + /** + * Get the supported protocol versions + * This method removes any blocked protocol versions. + * + * @return a list of protocol versions + * @see ProtocolRegistry#getSupportedVersions() for full list. + */ + SortedSet getSupportedVersions(); +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java b/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java index badb3b9e9..656e23980 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java +++ b/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java @@ -7,7 +7,6 @@ import io.netty.channel.socket.SocketChannel; import lombok.Data; import net.md_5.bungee.api.ChatColor; import us.myles.ViaVersion.api.Via; -import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import java.util.Map; diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java new file mode 100644 index 000000000..e39b73cab --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java @@ -0,0 +1,9 @@ +package us.myles.ViaVersion.api.platform; + +public interface ViaInjector { + public void inject(); + + public void uninject(); + + public int getServerProtocolVersion(); +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java index f72e85438..749db27f0 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java @@ -1,9 +1,17 @@ package us.myles.ViaVersion.api.platform; +import us.myles.ViaVersion.api.ViaAPI; +import us.myles.ViaVersion.api.ViaVersionConfig; + import java.util.UUID; import java.util.logging.Logger; -public interface ViaPlatform { +/** + * ViaPlatform represents a platform ViaVersion runs on + * + * @param - The player type for the platform, used for API related methods + */ +public interface ViaPlatform { public Logger getLogger(); public String getPlatformName(); @@ -19,4 +27,10 @@ public interface ViaPlatform { public boolean kickPlayer(UUID uuid, String message); public boolean isPluginEnabled(); + + public ViaAPI getApi(); + + public ViaVersionConfig getConf(); + + public void onReload(); } diff --git a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolPipeline.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolPipeline.java index fc43208df..1525cfee8 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolPipeline.java +++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolPipeline.java @@ -1,7 +1,7 @@ package us.myles.ViaVersion.api.protocol; import us.myles.ViaVersion.api.PacketWrapper; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.packets.Direction; @@ -74,7 +74,7 @@ public class ProtocolPipeline extends Protocol { super.transform(direction, state, packetWrapper); - if (ViaVersion.getInstance().isDebug()) { + if (Via.getManager().isDebug()) { // Debug packet String packet = "UNKNOWN"; @@ -109,7 +109,7 @@ public class ProtocolPipeline extends Protocol { } } String name = packet + "[" + userConnection.get(ProtocolInfo.class).getProtocolVersion() + "]"; - ViaPlatform platform = ViaVersion.getPlatform(); + ViaPlatform platform = Via.getPlatform(); String actualUsername = packetWrapper.user().get(ProtocolInfo.class).getUsername(); String username = actualUsername != null ? actualUsername + " " : ""; diff --git a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java index 59016e270..9f57a93fa 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java +++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java @@ -3,7 +3,7 @@ package us.myles.ViaVersion.api.protocol; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import us.myles.ViaVersion.api.Pair; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.protocols.base.BaseProtocol; import us.myles.ViaVersion.protocols.protocol1_10to1_9_3.Protocol1_10To1_9_3_4; import us.myles.ViaVersion.protocols.protocol1_9_1_2to1_9_3_4.Protocol1_9_1_2TO1_9_3_4; @@ -61,7 +61,7 @@ public class ProtocolRegistry { registryMap.get(version).put(output, protocol); } - if (ViaVersion.getPlatform().isPluginEnabled()) { + if (Via.getPlatform().isPluginEnabled()) { protocol.registerListeners(); refreshVersions(); } else { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java index 05cc8bcb8..4db6a2fdb 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java @@ -15,8 +15,8 @@ import us.myles.ViaVersion.api.remapper.ValueTransformer; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.api.type.types.version.Metadata1_8Type; import us.myles.ViaVersion.api.type.types.version.MetadataList1_8Type; +import us.myles.ViaVersion.listeners.protocol1_9to1_8.*; import us.myles.ViaVersion.protocols.base.ProtocolInfo; -import us.myles.ViaVersion.protocols.protocol1_9to1_8.listeners.*; import us.myles.ViaVersion.protocols.protocol1_9to1_8.packets.*; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.*; diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java index bb0395ece..a18514b5e 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java @@ -3,7 +3,7 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.storage; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import lombok.Getter; -import org.bukkit.Bukkit; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.data.StoredObject; import us.myles.ViaVersion.api.data.UserConnection; @@ -24,6 +24,7 @@ public class ClientChunks extends StoredObject { static { try { + // TODO: Abstract this ? mapChunkBulkRef = new ReflectionUtil.ClassReflection(ReflectionUtil.nms("PacketPlayOutMapChunkBulk")); mapChunkRef = new ReflectionUtil.ClassReflection(ReflectionUtil.nms("PacketPlayOutMapChunk")); if (ViaVersion.getInstance().isSpigot()) { @@ -31,7 +32,7 @@ public class ClientChunks extends StoredObject { worldRef = ReflectionUtil.nms("World"); } } catch (Exception e) { - Bukkit.getLogger().log(Level.WARNING, "Failed to initialise chunks reflection", e); + Via.getPlatform().getLogger().log(Level.WARNING, "Failed to initialise chunks reflection", e); } } @@ -83,7 +84,7 @@ public class ClientChunks extends StoredObject { list.add(chunkPacket); } } catch (Exception e) { - Bukkit.getLogger().log(Level.WARNING, "Failed to transform chunks bulk", e); + Via.getPlatform().getLogger().log(Level.WARNING, "Failed to transform chunks bulk", e); } return list; } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/types/ChunkType.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/types/ChunkType.java index 63c57a9ca..cf0d1e322 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/types/ChunkType.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/types/ChunkType.java @@ -2,7 +2,7 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.types; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import org.bukkit.Bukkit; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.minecraft.chunks.Chunk; import us.myles.ViaVersion.api.type.PartialType; @@ -134,7 +134,7 @@ public class ChunkType extends PartialType { // Check remaining bytes if (bytesLeft > 0) { - Bukkit.getLogger().log(Level.WARNING, bytesLeft + " Bytes left after reading chunks! (" + groundUp + ")"); + Via.getPlatform().getLogger().log(Level.WARNING, bytesLeft + " Bytes left after reading chunks! (" + groundUp + ")"); } // Return chunks diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/ItemRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/ItemRewriter.java index b684a7f37..ada23508d 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/ItemRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/ItemRewriter.java @@ -1,6 +1,5 @@ package us.myles.ViaVersion.protocols.protocolsnapshotto1_10; -import org.bukkit.Material; import org.spacehq.opennbt.tag.builtin.CompoundTag; import org.spacehq.opennbt.tag.builtin.StringTag; import us.myles.ViaVersion.api.minecraft.item.Item; @@ -31,7 +30,7 @@ public class ItemRewriter { } private static boolean hasEntityTag(Item item) { - if (item != null && item.getId() == Material.MONSTER_EGG.getId()) { + if (item != null && item.getId() == 383) { // Monster Egg CompoundTag tag = item.getTag(); if (tag != null && tag.contains("EntityTag") && tag.get("EntityTag") instanceof CompoundTag) { if (((CompoundTag) tag.get("EntityTag")).get("id") instanceof StringTag) { diff --git a/common/src/main/java/us/myles/ViaVersion/update/UpdateUtil.java b/common/src/main/java/us/myles/ViaVersion/update/UpdateUtil.java index 03d2fc917..254d5919b 100644 --- a/common/src/main/java/us/myles/ViaVersion/update/UpdateUtil.java +++ b/common/src/main/java/us/myles/ViaVersion/update/UpdateUtil.java @@ -5,7 +5,7 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import net.md_5.bungee.api.ChatColor; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import java.io.BufferedReader; import java.io.IOException; @@ -24,16 +24,16 @@ public class UpdateUtil { private final static Gson gson = new GsonBuilder().create(); public static void sendUpdateMessage(final UUID uuid) { - ViaVersion.getPlatform().runAsync(new Runnable() { + Via.getPlatform().runAsync(new Runnable() { @Override public void run() { final String message = getUpdateMessage(false); if (message != null) { - ViaVersion.getPlatform().runSync( + Via.getPlatform().runSync( new Runnable() { @Override public void run() { - ViaVersion.getPlatform().sendMessage(uuid, PREFIX + message); + Via.getPlatform().sendMessage(uuid, PREFIX + message); } } ); @@ -43,16 +43,16 @@ public class UpdateUtil { } public static void sendUpdateMessage() { - ViaVersion.getPlatform().runAsync(new Runnable() { + Via.getPlatform().runAsync(new Runnable() { @Override public void run() { final String message = getUpdateMessage(true); if (message != null) { - ViaVersion.getPlatform().runSync( + Via.getPlatform().runSync( new Runnable() { @Override public void run() { - ViaVersion.getPlatform().getLogger().warning(message); + Via.getPlatform().getLogger().warning(message); } } ); @@ -62,7 +62,7 @@ public class UpdateUtil { } private static String getUpdateMessage(boolean console) { - if (ViaVersion.getInstance().getVersion().equals("${project.version}")) { + if (Via.getPlatform().getPluginVersion().equals("${project.version}")) { return "You are using a debug/custom version, consider updating."; } String newestString = getNewestVersion(); @@ -75,7 +75,7 @@ public class UpdateUtil { } Version current; try { - current = new Version(ViaVersion.getInstance().getVersion()); + current = new Version(Via.getPlatform().getPluginVersion()); } catch (IllegalArgumentException e) { return "You are using a custom version, consider updating."; } @@ -97,7 +97,7 @@ public class UpdateUtil { URL url = new URL(URL + PLUGIN + LATEST_VERSION + "?" + System.currentTimeMillis()); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setUseCaches(true); - connection.addRequestProperty("User-Agent", "ViaVersion " + ViaVersion.getInstance().getVersion()); + connection.addRequestProperty("User-Agent", "ViaVersion " + Via.getPlatform().getPluginVersion()); connection.setDoOutput(true); BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); String input; diff --git a/common/src/main/java/us/myles/ViaVersion/util/ListWrapper.java b/common/src/main/java/us/myles/ViaVersion/util/ListWrapper.java index 7b19c96cf..f276d0eed 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/ListWrapper.java +++ b/common/src/main/java/us/myles/ViaVersion/util/ListWrapper.java @@ -6,7 +6,6 @@ import java.util.List; import java.util.ListIterator; public abstract class ListWrapper implements List { - public final Object lock = new Object(); private final List list; public ListWrapper(List inputList) { From 49b602994a5b4edba3c32706ad6769f8884766e2 Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 25 Sep 2016 15:00:05 +0100 Subject: [PATCH 05/76] Migrate Environment to our own type (todo javadocs for it) --- TODOLIST | 1 - .../java/us/myles/ViaVersion/api/Via.java | 5 ++ .../ViaVersion/api/minecraft/Environment.java | 32 +++++++++++++ .../protocols/base/BaseProtocol.java | 47 ++++++++++--------- .../chunks/BlockEntity.java | 4 +- .../types/Chunk1_9_3_4Type.java | 4 +- .../storage/ClientWorld.java | 20 +++----- .../types/Chunk1_9_1_2Type.java | 10 ++-- .../metadata/MetadataRewriter.java | 3 +- 9 files changed, 79 insertions(+), 47 deletions(-) create mode 100644 common/src/main/java/us/myles/ViaVersion/api/minecraft/Environment.java diff --git a/TODOLIST b/TODOLIST index dcf12e9aa..56d656c5e 100644 --- a/TODOLIST +++ b/TODOLIST @@ -1,7 +1,6 @@ Migrate EntityUtil to be cool Fix 1.9to1.8 Fix 1.9.3to1.9.1/2 -Fix 1.9.1/2to1.9.3/4 Fix snapshot to 1.10 Fix BaseProtocol Fix BossBar to use Generics diff --git a/common/src/main/java/us/myles/ViaVersion/api/Via.java b/common/src/main/java/us/myles/ViaVersion/api/Via.java index 30983d426..3eec7ed1e 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/Via.java +++ b/common/src/main/java/us/myles/ViaVersion/api/Via.java @@ -21,4 +21,9 @@ public class Via { Validate.isTrue(platform != null, "ViaVersion has not loaded the Platform"); return Via.platform.getApi(); } + + public static ViaVersionConfig getConfig() { + Validate.isTrue(platform != null, "ViaVersion has not loaded the Platform"); + return Via.platform.getConf(); + } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/Environment.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/Environment.java new file mode 100644 index 000000000..fb098741a --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/Environment.java @@ -0,0 +1,32 @@ +package us.myles.ViaVersion.api.minecraft; + +import java.util.HashMap; +import java.util.Map; + +public enum Environment { + NORMAL(0), + NETHER(-1), + END(1); + + private final int id; + private static final Map lookup = new HashMap<>(); + + static { + for (Environment env : values()) { + lookup.put(env.getId(), env); + } + } + + Environment(int id) { + this.id = id; + } + + public int getId() { + return id; + } + + + public static Environment getEnvironmentById(int id) { + return lookup.get(id); + } +} diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java b/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java index 599376e81..685fcdda9 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java @@ -1,21 +1,21 @@ package us.myles.ViaVersion.protocols.base; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; import io.netty.channel.ChannelFuture; import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; +import net.md_5.bungee.api.ChatColor; import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Pair; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.api.protocol.ProtocolPipeline; @@ -32,6 +32,7 @@ import java.util.UUID; import java.util.logging.Level; public class BaseProtocol extends Protocol { + private static Gson gson = new GsonBuilder().create(); // TODO: Possibly global gson provider? @Override protected void registerPackets() { @@ -48,30 +49,32 @@ public class BaseProtocol extends Protocol { ProtocolInfo info = wrapper.user().get(ProtocolInfo.class); String originalStatus = wrapper.get(Type.STRING, 0); try { - JSONObject json = (JSONObject) new JSONParser().parse(originalStatus); - JSONObject version = (JSONObject) json.get("version"); - int protocolVersion = ((Long) version.get("protocol")).intValue(); + JsonObject json = gson.fromJson(originalStatus, JsonObject.class); + JsonObject version = json.get("version").getAsJsonObject(); + int protocolVersion = ((Long) version.get("protocol").getAsLong()).intValue(); - if (ViaVersion.getConfig().isSendSupportedVersions()) //Send supported versions - version.put("supportedVersions", ViaVersion.getInstance().getSupportedVersions()); + if (Via.getConfig().isSendSupportedVersions()) //Send supported versions + version.add("supportedVersions", gson.toJsonTree(Via.getAPI().getSupportedVersions())); if (ProtocolRegistry.SERVER_PROTOCOL == -1) // Set the Server protocol if the detection on startup failed ProtocolRegistry.SERVER_PROTOCOL = protocolVersion; List> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), ProtocolRegistry.SERVER_PROTOCOL); if (protocols != null) { - if (protocolVersion != 9999) //Fix ServerListPlus - version.put("protocol", info.getProtocolVersion()); + if (protocolVersion != 9999) { + //Fix ServerListPlus + version.addProperty("protocol", info.getProtocolVersion()); + } } else { // not compatible :(, *plays very sad violin* wrapper.user().setActive(false); } - if (ViaVersion.getConfig().getBlockedProtocols().contains(info.getProtocolVersion())) - version.put("protocol", -1); // Show blocked versions as outdated + if (Via.getConfig().getBlockedProtocols().contains(info.getProtocolVersion())) + version.addProperty("protocol", -1); // Show blocked versions as outdated - wrapper.set(Type.STRING, 0, json.toJSONString()); // Update value - } catch (ParseException e) { + wrapper.set(Type.STRING, 0, gson.toJson(json)); // Update value + } catch (JsonParseException e) { e.printStackTrace(); } } @@ -100,14 +103,14 @@ public class BaseProtocol extends Protocol { info.setUuid(uuid); info.setUsername(wrapper.get(Type.STRING, 1)); // Add to ported clients - ((ViaVersionPlugin) ViaVersion.getInstance()).addPortedClient(wrapper.user()); + Via.getManager().addPortedClient(wrapper.user()); if (info.getPipeline().pipes().size() == 1 && info.getPipeline().pipes().get(0).getClass() == BaseProtocol.class) // Only base protocol wrapper.user().setActive(false); - if (ViaVersion.getInstance().isDebug()) { + if (Via.getManager().isDebug()) { // Print out the route to console - ((ViaVersionPlugin) ViaVersion.getInstance()).getLogger().log(Level.INFO, "{0} logged in with protocol {1}, Route: {2}", + Via.getPlatform().getLogger().log(Level.INFO, "{0} logged in with protocol {1}, Route: {2}", new Object[]{ wrapper.get(Type.STRING, 1), info.getProtocolVersion(), @@ -171,11 +174,11 @@ public class BaseProtocol extends Protocol { @Override public void handle(final PacketWrapper wrapper) throws Exception { int protocol = wrapper.user().get(ProtocolInfo.class).getProtocolVersion(); - if (ViaVersion.getConfig().getBlockedProtocols().contains(protocol)) { + if (Via.getConfig().getBlockedProtocols().contains(protocol)) { if (!wrapper.user().getChannel().isOpen()) return; PacketWrapper disconnectPacket = new PacketWrapper(0x00, null, wrapper.user()); // Disconnect Packet - Protocol1_9TO1_8.FIX_JSON.write(disconnectPacket, ChatColor.translateAlternateColorCodes('&', ViaVersion.getConfig().getBlockedDisconnectMsg())); + Protocol1_9TO1_8.FIX_JSON.write(disconnectPacket, ChatColor.translateAlternateColorCodes('&', Via.getConfig().getBlockedDisconnectMsg())); wrapper.cancel(); // cancel current // Send and close diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/BlockEntity.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/BlockEntity.java index 96ca9f985..bda4b1731 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/BlockEntity.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/BlockEntity.java @@ -3,7 +3,7 @@ package us.myles.ViaVersion.protocols.protocol1_9_1_2to1_9_3_4.chunks; import lombok.Getter; import org.spacehq.opennbt.tag.builtin.CompoundTag; import us.myles.ViaVersion.api.PacketWrapper; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.minecraft.Position; import us.myles.ViaVersion.api.type.Type; @@ -51,7 +51,7 @@ public class BlockEntity { updateBlockEntity(pos, (short) newId, tag, connection); } catch (Exception e) { - if (ViaVersion.getInstance().isDebug()) { + if (Via.getManager().isDebug()) { System.out.println("Block Entity: " + e.getMessage() + ": " + tag); } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/types/Chunk1_9_3_4Type.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/types/Chunk1_9_3_4Type.java index 684f1e4a3..c1552692e 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/types/Chunk1_9_3_4Type.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/types/Chunk1_9_3_4Type.java @@ -2,8 +2,8 @@ package us.myles.ViaVersion.protocols.protocol1_9_1_2to1_9_3_4.types; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import org.bukkit.World; import org.spacehq.opennbt.tag.builtin.CompoundTag; +import us.myles.ViaVersion.api.minecraft.Environment; import us.myles.ViaVersion.api.minecraft.chunks.Chunk; import us.myles.ViaVersion.api.minecraft.chunks.ChunkSection; import us.myles.ViaVersion.api.type.PartialType; @@ -48,7 +48,7 @@ public class Chunk1_9_3_4Type extends PartialType { sections[i] = section; section.readBlocks(input); section.readBlockLight(input); - if (world.getEnvironment() == World.Environment.NORMAL) { + if (world.getEnvironment() == Environment.NORMAL) { section.readSkyLight(input); } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/storage/ClientWorld.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/storage/ClientWorld.java index 8c67f60eb..9dcca3354 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/storage/ClientWorld.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/storage/ClientWorld.java @@ -1,13 +1,13 @@ package us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.storage; import lombok.Getter; -import org.bukkit.World; import us.myles.ViaVersion.api.data.StoredObject; import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.minecraft.Environment; @Getter public class ClientWorld extends StoredObject { - private World.Environment environment; + private Environment environment; public ClientWorld(UserConnection user) { super(user); @@ -17,17 +17,9 @@ public class ClientWorld extends StoredObject { this.environment = getEnvFromId(environmentId); } - private World.Environment getEnvFromId(int id) { - switch(id) { - case -1: - return World.Environment.NETHER; - case 0: - return World.Environment.NORMAL; - case 1: - return World.Environment.THE_END; - default: - return World.Environment.NETHER; - //throw new IllegalArgumentException("Invalid environment id:" + id); - } + private Environment getEnvFromId(int id) { + Environment output = Environment.getEnvironmentById(id); + if (output == null) return Environment.NETHER; + return output; } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/types/Chunk1_9_1_2Type.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/types/Chunk1_9_1_2Type.java index cb5d31c10..01dcd75db 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/types/Chunk1_9_1_2Type.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/types/Chunk1_9_1_2Type.java @@ -2,9 +2,9 @@ package us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.types; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import org.bukkit.World; import org.spacehq.opennbt.tag.builtin.CompoundTag; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.minecraft.Environment; import us.myles.ViaVersion.api.minecraft.chunks.Chunk; import us.myles.ViaVersion.api.minecraft.chunks.ChunkSection; import us.myles.ViaVersion.api.type.PartialType; @@ -27,8 +27,8 @@ public class Chunk1_9_1_2Type extends PartialType { @Override public Chunk read(ByteBuf input, ClientWorld world) throws Exception { - boolean replacePistons = world.getUser().get(ProtocolInfo.class).getPipeline().contains(Protocol1_10To1_9_3_4.class) && ViaVersion.getConfig().isReplacePistons(); - int replacementId = ViaVersion.getConfig().getPistonReplacementId(); + boolean replacePistons = world.getUser().get(ProtocolInfo.class).getPipeline().contains(Protocol1_10To1_9_3_4.class) && Via.getConfig().isReplacePistons(); + int replacementId = Via.getConfig().getPistonReplacementId(); int chunkX = input.readInt(); int chunkZ = input.readInt(); @@ -53,7 +53,7 @@ public class Chunk1_9_1_2Type extends PartialType { sections[i] = section; section.readBlocks(input); section.readBlockLight(input); - if (world.getEnvironment() == World.Environment.NORMAL) { + if (world.getEnvironment() == Environment.NORMAL) { section.readSkyLight(input); } if (replacePistons) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java index 5783a0cc7..3f45056b6 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java @@ -3,6 +3,7 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata; import org.bukkit.entity.EntityType; import org.bukkit.util.EulerAngle; import org.bukkit.util.Vector; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; @@ -140,7 +141,7 @@ public class MetadataRewriter { } } catch (Exception e) { list.remove(entry); - if (!ViaVersion.getConfig().isSuppressMetadataErrors() || ViaVersion.getInstance().isDebug()) { + if (!Via.getConfig().isSuppressMetadataErrors() || Via.getManager().isDebug()) { System.out.println("INCLUDE THIS IN YOUR ERROR LOG!"); if (type != null) System.out.println("An error occurred with entity meta data for " + type + " OldID: " + entry.getId()); From c4ffdc1b7cb5ce80b87ded0cee3143d5c632102f Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 25 Sep 2016 15:40:30 +0100 Subject: [PATCH 06/76] Migrate to our own types + use ids instead of materials --- TODOLIST | 4 +- .../ViaVersion/api/minecraft/EulerAngle.java | 12 +++++ .../ViaVersion/api/minecraft/Vector.java | 12 +++++ .../ViaVersion/api/minecraft/item/Item.java | 12 ----- .../us/myles/ViaVersion/api/type/Type.java | 4 +- .../type/types/minecraft/EulerAngleType.java | 8 +-- .../api/type/types/minecraft/VectorType.java | 2 +- .../us/myles/ViaVersion/boss/CommonBoss.java | 22 ++++---- .../chunks/FakeTileEntity.java | 53 +++++++++---------- .../protocol1_9to1_8/ItemRewriter.java | 15 +++--- .../protocol1_9to1_8/Protocol1_9TO1_8.java | 17 ++++-- .../protocol1_9to1_8/ViaIdleThread.java | 3 +- .../metadata/MetadataRewriter.java | 5 +- .../packets/EntityPackets.java | 17 +++--- .../packets/PlayerPackets.java | 12 ++--- .../packets/SpawnPackets.java | 3 +- .../packets/WorldPackets.java | 25 ++++----- .../storage/ClientChunks.java | 2 +- .../storage/EntityTracker.java | 19 ++++--- .../protocol1_9to1_8/types/ChunkType.java | 5 +- .../MetadataRewriter.java | 7 ++- 21 files changed, 130 insertions(+), 129 deletions(-) create mode 100644 common/src/main/java/us/myles/ViaVersion/api/minecraft/EulerAngle.java create mode 100644 common/src/main/java/us/myles/ViaVersion/api/minecraft/Vector.java diff --git a/TODOLIST b/TODOLIST index 56d656c5e..9b410a1df 100644 --- a/TODOLIST +++ b/TODOLIST @@ -1,8 +1,6 @@ Migrate EntityUtil to be cool Fix 1.9to1.8 -Fix 1.9.3to1.9.1/2 -Fix snapshot to 1.10 -Fix BaseProtocol +Migrate listeners in BaseProtocol Fix BossBar to use Generics Register Listeners Properly Fix commands diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/EulerAngle.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/EulerAngle.java new file mode 100644 index 000000000..607d41e56 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/EulerAngle.java @@ -0,0 +1,12 @@ +package us.myles.ViaVersion.api.minecraft; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class EulerAngle { + private float x; + private float y; + private float z; +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/Vector.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/Vector.java new file mode 100644 index 000000000..78b6b5bdc --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/Vector.java @@ -0,0 +1,12 @@ +package us.myles.ViaVersion.api.minecraft; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class Vector { + private int blockX; + private int blockY; + private int blockZ; +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/item/Item.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/item/Item.java index 35209c2e6..9bb8df568 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/minecraft/item/Item.java +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/item/Item.java @@ -1,7 +1,6 @@ package us.myles.ViaVersion.api.minecraft.item; import lombok.*; -import org.bukkit.inventory.ItemStack; import org.spacehq.opennbt.tag.builtin.CompoundTag; @Getter @@ -14,15 +13,4 @@ public class Item { private byte amount; private short data; private CompoundTag tag; - - /** - * Create an item from a bukkit stack (doesn't save NBT) - * - * @param stack The stack to convert from - * @return The output stack - */ - public static Item getItem(ItemStack stack) { - if (stack == null) return null; - return new Item((short) stack.getTypeId(), (byte) stack.getAmount(), stack.getDurability(), null); - } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/Type.java b/common/src/main/java/us/myles/ViaVersion/api/type/Type.java index 938ed4da9..be9d577ec 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/type/Type.java +++ b/common/src/main/java/us/myles/ViaVersion/api/type/Type.java @@ -2,10 +2,10 @@ package us.myles.ViaVersion.api.type; import lombok.Getter; -import org.bukkit.util.EulerAngle; -import org.bukkit.util.Vector; import org.spacehq.opennbt.tag.builtin.CompoundTag; +import us.myles.ViaVersion.api.minecraft.EulerAngle; import us.myles.ViaVersion.api.minecraft.Position; +import us.myles.ViaVersion.api.minecraft.Vector; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.type.types.*; import us.myles.ViaVersion.api.type.types.minecraft.*; diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/EulerAngleType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/EulerAngleType.java index 5d324dd62..f4287769a 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/EulerAngleType.java +++ b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/EulerAngleType.java @@ -1,7 +1,7 @@ package us.myles.ViaVersion.api.type.types.minecraft; import io.netty.buffer.ByteBuf; -import org.bukkit.util.EulerAngle; +import us.myles.ViaVersion.api.minecraft.EulerAngle; import us.myles.ViaVersion.api.type.Type; public class EulerAngleType extends Type { @@ -20,8 +20,8 @@ public class EulerAngleType extends Type { @Override public void write(ByteBuf buffer, EulerAngle object) throws Exception { - Type.FLOAT.write(buffer, (float) object.getX()); - Type.FLOAT.write(buffer, (float) object.getY()); - Type.FLOAT.write(buffer, (float) object.getZ()); + Type.FLOAT.write(buffer, object.getX()); + Type.FLOAT.write(buffer, object.getY()); + Type.FLOAT.write(buffer, object.getZ()); } } \ No newline at end of file diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/VectorType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/VectorType.java index 968e4413e..17299241d 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/VectorType.java +++ b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/VectorType.java @@ -1,7 +1,7 @@ package us.myles.ViaVersion.api.type.types.minecraft; import io.netty.buffer.ByteBuf; -import org.bukkit.util.Vector; +import us.myles.ViaVersion.api.minecraft.Vector; import us.myles.ViaVersion.api.type.Type; public class VectorType extends Type { diff --git a/common/src/main/java/us/myles/ViaVersion/boss/CommonBoss.java b/common/src/main/java/us/myles/ViaVersion/boss/CommonBoss.java index dc5441363..783339921 100644 --- a/common/src/main/java/us/myles/ViaVersion/boss/CommonBoss.java +++ b/common/src/main/java/us/myles/ViaVersion/boss/CommonBoss.java @@ -6,7 +6,7 @@ import lombok.Getter; import lombok.NonNull; import lombok.RequiredArgsConstructor; import org.apache.commons.lang.Validate; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.boss.BossBar; import us.myles.ViaVersion.api.boss.BossColor; import us.myles.ViaVersion.api.boss.BossFlag; @@ -45,7 +45,7 @@ public abstract class CommonBoss extends BossBar { @Override public BossBar setTitle(@NonNull String title) { this.title = title; - sendPacket(ViaBossBar.UpdateAction.UPDATE_TITLE); + sendPacket(CommonBoss.UpdateAction.UPDATE_TITLE); return this; } @@ -53,7 +53,7 @@ public abstract class CommonBoss extends BossBar { public BossBar setHealth(float health) { Validate.isTrue((health >= 0 && health <= 1), "Health must be between 0 and 1"); this.health = health; - sendPacket(ViaBossBar.UpdateAction.UPDATE_HEALTH); + sendPacket(CommonBoss.UpdateAction.UPDATE_HEALTH); return this; } @@ -65,14 +65,14 @@ public abstract class CommonBoss extends BossBar { @Override public BossBar setColor(@NonNull BossColor color) { this.color = color; - sendPacket(ViaBossBar.UpdateAction.UPDATE_STYLE); + sendPacket(CommonBoss.UpdateAction.UPDATE_STYLE); return this; } @Override public BossBar setStyle(@NonNull BossStyle style) { this.style = style; - sendPacket(ViaBossBar.UpdateAction.UPDATE_STYLE); + sendPacket(CommonBoss.UpdateAction.UPDATE_STYLE); return this; } @@ -81,7 +81,7 @@ public abstract class CommonBoss extends BossBar { if (!players.contains(player)) { players.add(player); if (visible) - sendPacket(player, getPacket(ViaBossBar.UpdateAction.ADD)); + sendPacket(player, getPacket(CommonBoss.UpdateAction.ADD)); } return this; } @@ -99,7 +99,7 @@ public abstract class CommonBoss extends BossBar { public BossBar addFlag(@NonNull BossFlag flag) { if (!hasFlag(flag)) flags.add(flag); - sendPacket(ViaBossBar.UpdateAction.UPDATE_FLAGS); + sendPacket(CommonBoss.UpdateAction.UPDATE_FLAGS); return this; } @@ -107,7 +107,7 @@ public abstract class CommonBoss extends BossBar { public BossBar removeFlag(@NonNull BossFlag flag) { if (hasFlag(flag)) flags.remove(flag); - sendPacket(ViaBossBar.UpdateAction.UPDATE_FLAGS); + sendPacket(CommonBoss.UpdateAction.UPDATE_FLAGS); return this; } @@ -141,7 +141,7 @@ public abstract class CommonBoss extends BossBar { private void setVisible(boolean value) { if (visible != value) { visible = value; - sendPacket(value ? ViaBossBar.UpdateAction.ADD : ViaBossBar.UpdateAction.REMOVE); + sendPacket(value ? CommonBoss.UpdateAction.ADD : CommonBoss.UpdateAction.REMOVE); } } @@ -153,12 +153,12 @@ public abstract class CommonBoss extends BossBar { } private void sendPacket(UUID uuid, ByteBuf buf) { - if (!ViaVersion.getInstance().isPorted(uuid) || !(ViaVersion.getInstance().getPlayerVersion(uuid) >= ProtocolVersion.v1_9.getId())) { + if (!Via.getAPI().isPorted(uuid) || !(Via.getAPI().getPlayerVersion(uuid) >= ProtocolVersion.v1_9.getId())) { players.remove(uuid); buf.release(); return; } - ViaVersion.getInstance().sendRawPacket(uuid, buf); + Via.getAPI().sendRawPacket(uuid, buf); } private ByteBuf getPacket(UpdateAction action) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/FakeTileEntity.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/FakeTileEntity.java index adeab98fd..620ab1e6a 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/FakeTileEntity.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/FakeTileEntity.java @@ -1,6 +1,5 @@ package us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.chunks; -import org.bukkit.Material; import org.spacehq.opennbt.tag.builtin.CompoundTag; import org.spacehq.opennbt.tag.builtin.IntTag; import org.spacehq.opennbt.tag.builtin.StringTag; @@ -18,28 +17,28 @@ public class FakeTileEntity { private static Map tileEntities = new ConcurrentHashMap<>(); static { - register(Material.FURNACE, "Furnace"); - register(Arrays.asList(Material.CHEST, Material.TRAPPED_CHEST), "Chest"); - register(Material.ENDER_CHEST, "EnderChest"); - register(Material.JUKEBOX, "RecordPlayer"); - register(Material.DISPENSER, "Trap"); - register(Material.DROPPER, "Dropper"); - register(Arrays.asList(Material.SIGN_POST, Material.WALL_SIGN), "Sign"); - register(Material.MOB_SPAWNER, "MobSpawner"); - register(Material.NOTE_BLOCK, "Music"); - register(Arrays.asList(Material.PISTON_BASE, Material.PISTON_EXTENSION, Material.PISTON_STICKY_BASE, Material.PISTON_MOVING_PIECE), "Piston"); - register(Arrays.asList(Material.BREWING_STAND, Material.CAULDRON), "Cauldron"); - register(Material.ENCHANTMENT_TABLE, "EnchantTable"); - register(Arrays.asList(Material.ENDER_PORTAL, Material.ENDER_PORTAL_FRAME), "Airportal"); - register(Material.BEACON, "Beacon"); - register(Arrays.asList(Material.SKULL, Material.SKULL_ITEM), "Skull"); - register(Arrays.asList(Material.DAYLIGHT_DETECTOR, Material.DAYLIGHT_DETECTOR_INVERTED), "DLDetector"); - register(Material.HOPPER, "Hopper"); - register(Arrays.asList(Material.REDSTONE_COMPARATOR, Material.REDSTONE_COMPARATOR_OFF, Material.REDSTONE_COMPARATOR_ON), "Comparator"); - register(Material.FLOWER_POT, "FlowerPot"); - register(Arrays.asList(Material.STANDING_BANNER, Material.WALL_BANNER, Material.BANNER), "Banner"); + register(Arrays.asList(61, 62), "Furnace"); + register(Arrays.asList(54, 146), "Chest"); + register(130, "EnderChest"); + register(84, "RecordPlayer"); + register(23, "Trap"); // Dispenser + register(158, "Dropper"); + register(Arrays.asList(63, 68), "Sign"); + register(52, "MobSpawner"); + register(25, "Music"); // Note Block + register(Arrays.asList(33, 34, 29, 36), "Piston"); + register(117, "Cauldron"); // Brewing stand + register(116, "EnchantTable"); + register(Arrays.asList(119, 120), "Airportal"); // End portal + register(138, "Beacon"); + register(144, "Skull"); + register(Arrays.asList(178, 151), "DLDetector"); + register(154, "Hopper"); + register(Arrays.asList(149, 150), "Comparator"); + register(140, "FlowerPot"); + register(Arrays.asList(176, 177), "Banner"); register(209, "EndGateway"); - register(Material.COMMAND.getId(), "Control"); + register(137, "Control"); } private static void register(Integer material, String name) { @@ -48,13 +47,9 @@ public class FakeTileEntity { tileEntities.put(material, comp); } - private static void register(Material material, String name) { - register(material.getId(), name); - } - - private static void register(List materials, String name) { - for (Material m : materials) - register(m.getId(), name); + private static void register(List materials, String name) { + for (int m : materials) + register(m, name); } public static boolean hasBlock(int block) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ItemRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ItemRewriter.java index 3d3b7b30b..6f663e37f 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ItemRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ItemRewriter.java @@ -1,6 +1,5 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8; -import org.bukkit.Material; import org.spacehq.opennbt.tag.builtin.CompoundTag; import org.spacehq.opennbt.tag.builtin.ListTag; import org.spacehq.opennbt.tag.builtin.StringTag; @@ -140,7 +139,7 @@ public class ItemRewriter { public static void toServer(Item item) { if (item != null) { - if (item.getId() == Material.MONSTER_EGG.getId() && item.getData() == 0) { + if (item.getId() == 383 && item.getData() == 0) { // Monster Egg CompoundTag tag = item.getTag(); int data = 0; if (tag != null && tag.get("EntityTag") instanceof CompoundTag) { @@ -155,7 +154,7 @@ public class ItemRewriter { item.setTag(tag); item.setData((short) data); } - if (item.getId() == Material.POTION.getId()) { + if (item.getId() == 373) { // Potion CompoundTag tag = item.getTag(); int data = 0; if (tag != null && tag.get("Potion") instanceof StringTag) { @@ -169,11 +168,11 @@ public class ItemRewriter { item.setTag(tag); item.setData((short) data); } - //Splash potion + // Splash potion if (item.getId() == 438) { CompoundTag tag = item.getTag(); int data = 0; - item.setId((short) Material.POTION.getId()); + item.setId((short) 373); // Potion if (tag != null && tag.get("Potion") instanceof StringTag) { StringTag potion = tag.get("Potion"); String potionName = potion.getValue().replace("minecraft:", ""); @@ -190,7 +189,7 @@ public class ItemRewriter { public static void toClient(Item item) { if (item != null) { - if (item.getId() == Material.MONSTER_EGG.getId() && item.getData() != 0) { + if (item.getId() == 383 && item.getData() != 0) { // Monster Egg CompoundTag tag = item.getTag(); if (tag == null) { tag = new CompoundTag("tag"); @@ -204,7 +203,7 @@ public class ItemRewriter { item.setTag(tag); item.setData((short) 0); } - if (item.getId() == Material.POTION.getId()) { + if (item.getId() == 373) { // Potion CompoundTag tag = item.getTag(); if (tag == null) { tag = new CompoundTag("tag"); @@ -219,7 +218,7 @@ public class ItemRewriter { item.setTag(tag); item.setData((short) 0); } - if (item.getId() == Material.WRITTEN_BOOK.getId()) { + if (item.getId() == 387) { // WRITTEN_BOOK CompoundTag tag = item.getTag(); if (tag == null) { tag = new CompoundTag("tag"); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java index 4db6a2fdb..68fde2799 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java @@ -6,7 +6,7 @@ import com.google.gson.JsonObject; import org.bukkit.Bukkit; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.PacketWrapper; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; @@ -15,7 +15,6 @@ import us.myles.ViaVersion.api.remapper.ValueTransformer; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.api.type.types.version.Metadata1_8Type; import us.myles.ViaVersion.api.type.types.version.MetadataList1_8Type; -import us.myles.ViaVersion.listeners.protocol1_9to1_8.*; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.protocol1_9to1_8.packets.*; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.*; @@ -53,7 +52,7 @@ public class Protocol1_9TO1_8 extends Protocol { try { gson.fromJson(line, JsonObject.class); } catch (Exception e) { - if (ViaVersion.getConfig().isForceJsonTransform()) { + if (Via.getConfig().isForceJsonTransform()) { return constructJson(line); } else { System.out.println("Invalid JSON String: \"" + line + "\" Please report this issue to the ViaVersion Github: " + e.getMessage()); @@ -86,7 +85,7 @@ public class Protocol1_9TO1_8 extends Protocol { }).get(10, TimeUnit.SECONDS); } catch (Exception e) { System.out.println("Error fetching hand item: " + e.getClass().getName()); - if (ViaVersion.getInstance().isDebug()) + if (Via.getManager().isDebug()) e.printStackTrace(); return null; } @@ -146,4 +145,14 @@ public class Protocol1_9TO1_8 extends Protocol { // Place block tracker userConnection.put(new PlaceBlockTracker(userConnection)); } + + public static boolean isSword(int id) { + if (id == 267) return true; // Iron + if (id == 268) return true; // Wood + if (id == 272) return true; // Stone + if (id == 276) return true; // Diamond + if (id == 283) return true; // Gold + + return false; + } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ViaIdleThread.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ViaIdleThread.java index c2498a4ed..2e3d086d0 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ViaIdleThread.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ViaIdleThread.java @@ -4,6 +4,7 @@ import io.netty.channel.ChannelHandlerContext; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.protocols.base.ProtocolInfo; @@ -29,7 +30,7 @@ public class ViaIdleThread extends BukkitRunnable { private Method handleFlying; public ViaIdleThread(Map portedPlayers) { - USE_NMS = ViaVersion.getConfig().isNMSPlayerTicking(); + USE_NMS = Via.getConfig().isNMSPlayerTicking(); this.portedPlayers = portedPlayers; Class idlePacketClass; diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java index 3f45056b6..713a9fdaf 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java @@ -1,10 +1,9 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata; import org.bukkit.entity.EntityType; -import org.bukkit.util.EulerAngle; -import org.bukkit.util.Vector; import us.myles.ViaVersion.api.Via; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.minecraft.EulerAngle; +import us.myles.ViaVersion.api.minecraft.Vector; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; import us.myles.ViaVersion.protocols.protocol1_9to1_8.ItemRewriter; diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/EntityPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/EntityPackets.java index 45d77585a..79235611a 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/EntityPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/EntityPackets.java @@ -1,8 +1,7 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.packets; -import org.bukkit.Material; import us.myles.ViaVersion.api.PacketWrapper; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; import us.myles.ViaVersion.api.protocol.Protocol; @@ -85,11 +84,11 @@ public class EntityPackets { @Override public void handle(PacketWrapper wrapper) throws Exception { int entityID = wrapper.get(Type.VAR_INT, 0); - if (ViaVersion.getConfig().isHologramPatch()) { + if (Via.getConfig().isHologramPatch()) { EntityTracker tracker = wrapper.user().get(EntityTracker.class); if (tracker.getKnownHolograms().contains(entityID)) { Double newValue = wrapper.get(Type.DOUBLE, 1); - newValue += (ViaVersion.getConfig().getHologramYOffset()); + newValue += (Via.getConfig().getHologramYOffset()); wrapper.set(Type.DOUBLE, 1, newValue); } } @@ -159,11 +158,9 @@ public class EntityPackets { Item stack = wrapper.get(Type.ITEM, 0); if (stack != null) { - if (Material.getMaterial(stack.getId()) != null) { - if (Material.getMaterial(stack.getId()).name().endsWith("SWORD")) { - entityTracker.getValidBlocking().add(entityID); - return; - } + if (Protocol1_9TO1_8.isSword(stack.getId())) { + entityTracker.getValidBlocking().add(entityID); + return; } } entityTracker.getValidBlocking().remove(entityID); @@ -231,7 +228,7 @@ public class EntityPackets { @Override public void handle(PacketWrapper wrapper) throws Exception { boolean showParticles = wrapper.read(Type.BOOLEAN); //In 1.8 = true->Show particles : false->Hide particles - boolean newEffect = ViaVersion.getConfig().isNewEffectIndicator(); + boolean newEffect = Via.getConfig().isNewEffectIndicator(); //0: hide, 1: shown without indictator, 2: shown with indicator, 3: hide with beacon indicator but we don't use it. wrapper.write(Type.BYTE, (byte) (showParticles ? newEffect ? 2 : 1 : 0)); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/PlayerPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/PlayerPackets.java index 6e14bae8f..f190257bf 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/PlayerPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/PlayerPackets.java @@ -2,11 +2,9 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.packets; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import org.bukkit.Material; import org.bukkit.entity.EntityType; -import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.PacketWrapper; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.api.remapper.PacketHandler; @@ -124,7 +122,7 @@ public class PlayerPackets { wrapper.passthrough(Type.STRING); // Name tag visibility - wrapper.write(Type.STRING, ViaVersion.getConfig().isPreventCollision() ? "never" : ""); + wrapper.write(Type.STRING, Via.getConfig().isPreventCollision() ? "never" : ""); wrapper.passthrough(Type.BYTE); // Colour } @@ -137,12 +135,12 @@ public class PlayerPackets { if (entityTracker.isAutoTeam() && player.equalsIgnoreCase(myName)) { if (mode == 4) { // since removing add to auto team - ((ViaVersionPlugin) ViaVersion.getInstance()).run(new Runnable() { + Via.getPlatform().runSync(new Runnable() { @Override public void run() { entityTracker.sendTeamPacket(true); } - }, false); + }); } else { // since adding remove from auto team entityTracker.sendTeamPacket(false); @@ -477,7 +475,7 @@ public class PlayerPackets { if (name.equalsIgnoreCase("MC|BSign")) { Item item = wrapper.passthrough(Type.ITEM); if (item != null) { - item.setId((short) Material.WRITTEN_BOOK.getId()); + item.setId((short) 387); // Written Book } } if (name.equalsIgnoreCase("MC|AutoCmd")) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java index 0ae3c7e70..a60e6a9de 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java @@ -1,6 +1,5 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.packets; -import org.bukkit.Material; import org.bukkit.entity.EntityType; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.minecraft.item.Item; @@ -104,7 +103,7 @@ public class SpawnPackets { public void write(PacketWrapper wrapper) throws Exception { wrapper.write(Type.VAR_INT, entityID); List meta = new ArrayList<>(); - Item item = new Item((short) Material.POTION.getId(), (byte) 1, (short) data, null); + Item item = new Item((short) 373, (byte) 1, (short) data, null); // Potion ItemRewriter.toClient(item); // Rewrite so that it gets the right nbt // TEMP FIX FOR POTIONS UNTIL WE FIGURE OUT HOW TO TRANSFORM SENT PACKETS Metadata potion = new Metadata(5, NewType.Slot.getTypeID(), Type.ITEM, item); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java index a9add7c8d..45c6d8117 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java @@ -1,10 +1,9 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.packets; -import org.bukkit.Material; import org.spacehq.opennbt.tag.builtin.CompoundTag; import org.spacehq.opennbt.tag.builtin.StringTag; import us.myles.ViaVersion.api.PacketWrapper; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.minecraft.Position; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.protocol.Protocol; @@ -168,7 +167,7 @@ public class WorldPackets { handler(new PacketHandler() { @Override public void handle(PacketWrapper wrapper) throws Exception { - if (ViaVersion.getConfig().isAutoTeam()) { + if (Via.getConfig().isAutoTeam()) { EntityTracker entityTracker = wrapper.user().get(EntityTracker.class); entityTracker.setAutoTeam(true); entityTracker.sendTeamPacket(true); @@ -259,19 +258,17 @@ public class WorldPackets { // Write item in hand Item item = Protocol1_9TO1_8.getHandItem(wrapper.user()); // Blocking patch - if (ViaVersion.getConfig().isShieldBlocking()) { + if (Via.getConfig().isShieldBlocking()) { if (item != null) { - if (Material.getMaterial(item.getId()) != null) { - if (Material.getMaterial(item.getId()).name().endsWith("SWORD")) { - if (hand == 0) { - EntityTracker tracker = wrapper.user().get(EntityTracker.class); - if (!tracker.isBlocking()) { - tracker.setBlocking(true); - Item shield = new Item((short) 442, (byte) 1, (short) 0, null); - tracker.setSecondHand(shield); - } - wrapper.cancel(); + if (Protocol1_9TO1_8.isSword(item.getId())) { + if (hand == 0) { + EntityTracker tracker = wrapper.user().get(EntityTracker.class); + if (!tracker.isBlocking()) { + tracker.setBlocking(true); + Item shield = new Item((short) 442, (byte) 1, (short) 0, null); + tracker.setSecondHand(shield); } + wrapper.cancel(); } } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java index a18514b5e..8573aa70b 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java @@ -54,7 +54,7 @@ public class ClientChunks extends StoredObject { int[] zcoords = mapChunkBulkRef.getFieldValue("b", packet, int[].class); Object[] chunkMaps = mapChunkBulkRef.getFieldValue("c", packet, Object[].class); - if (ViaVersion.getConfig().isAntiXRay() && ViaVersion.getInstance().isSpigot()) { //Spigot anti-xray patch + if (Via.getConfig().isAntiXRay() && Via.getInstance().isSpigot()) { //Spigot anti-xray patch try { Object world = mapChunkBulkRef.getFieldValue("world", packet, Object.class); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java index 298da7263..5b9541fbb 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java @@ -6,10 +6,9 @@ import com.google.common.collect.Sets; import io.netty.buffer.ByteBuf; import lombok.Getter; import lombok.Setter; -import org.bukkit.Material; import org.bukkit.entity.EntityType; import us.myles.ViaVersion.api.PacketWrapper; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.boss.BossBar; import us.myles.ViaVersion.api.boss.BossColor; import us.myles.ViaVersion.api.boss.BossStyle; @@ -39,7 +38,7 @@ public class EntityTracker extends StoredObject { private final Map bossBarMap = new ConcurrentHashMap<>(); private final Set validBlocking = Sets.newConcurrentHashSet(); private final Set knownHolograms = Sets.newConcurrentHashSet(); - private final Cache blockInteractions = CacheBuilder.newBuilder().maximumSize(10).expireAfterAccess(250, TimeUnit.MILLISECONDS).build(); + private final Cache blockInteractions = CacheBuilder.newBuilder().maximumSize(10).expireAfterAccess(250, TimeUnit.MILLISECONDS).build(); @Setter private boolean blocking = false; @Setter @@ -111,7 +110,7 @@ public class EntityTracker extends StoredObject { } public void addBlockInteraction(Position p) { - blockInteractions.put(p, Material.AIR); + blockInteractions.put(p, 0); } public void handleMetadata(int entityID, List metadataList) { @@ -153,7 +152,7 @@ public class EntityTracker extends StoredObject { if (metadata.getId() == 0) { // Byte byte data = (byte) metadata.getValue(); - if (entityID != getEntityID() && ViaVersion.getConfig().isShieldBlocking()) { + if (entityID != getEntityID() && Via.getConfig().isShieldBlocking()) { if ((data & 0x10) == 0x10) { if (validBlocking.contains(entityID)) { Item shield = new Item((short) 442, (byte) 1, (short) 0, null); @@ -180,7 +179,7 @@ public class EntityTracker extends StoredObject { Type.VAR_INT.write(buf, 0x25); // Relative Move Packet Type.VAR_INT.write(buf, entityID); buf.writeShort(0); - buf.writeShort((short) (128D * (ViaVersion.getConfig().getHologramYOffset() * 32D))); + buf.writeShort((short) (128D * (Via.getConfig().getHologramYOffset() * 32D))); buf.writeShort(0); buf.writeBoolean(true); getUser().sendRawPacket(buf, false); @@ -192,28 +191,28 @@ public class EntityTracker extends StoredObject { } UUID uuid = getUser().get(ProtocolInfo.class).getUuid(); // Boss bar - if (ViaVersion.getConfig().isBossbarPatch()) { + if (Via.getConfig().isBossbarPatch()) { if (type == EntityType.ENDER_DRAGON || type == EntityType.WITHER) { if (metadata.getId() == 2) { BossBar bar = bossBarMap.get(entityID); String title = (String) metadata.getValue(); title = title.isEmpty() ? (type == EntityType.ENDER_DRAGON ? "Ender Dragon" : "Wither") : title; if (bar == null) { - bar = ViaVersion.getInstance().createBossBar(title, BossColor.PINK, BossStyle.SOLID); + bar = Via.getAPI().createBossBar(title, BossColor.PINK, BossStyle.SOLID); bossBarMap.put(entityID, bar); bar.addPlayer(uuid); bar.show(); } else { bar.setTitle(title); } - } else if (metadata.getId() == 6 && !ViaVersion.getConfig().isBossbarAntiflicker()) { // If anti flicker is enabled, don't update health + } else if (metadata.getId() == 6 && !Via.getConfig().isBossbarAntiflicker()) { // If anti flicker is enabled, don't update health BossBar bar = bossBarMap.get(entityID); // Make health range between 0 and 1 float maxHealth = type == EntityType.ENDER_DRAGON ? 200.0f : 300.0f; float health = Math.max(0.0f, Math.min(((float) metadata.getValue()) / maxHealth, 1.0f)); if (bar == null) { String title = type == EntityType.ENDER_DRAGON ? "Ender Dragon" : "Wither"; - bar = ViaVersion.getInstance().createBossBar(title, health, BossColor.PINK, BossStyle.SOLID); + bar = Via.getAPI().createBossBar(title, health, BossColor.PINK, BossStyle.SOLID); bossBarMap.put(entityID, bar); bar.addPlayer(uuid); bar.show(); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/types/ChunkType.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/types/ChunkType.java index cf0d1e322..8ac1c6303 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/types/ChunkType.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/types/ChunkType.java @@ -3,7 +3,6 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.types; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import us.myles.ViaVersion.api.Via; -import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.minecraft.chunks.Chunk; import us.myles.ViaVersion.api.type.PartialType; import us.myles.ViaVersion.api.type.Type; @@ -49,8 +48,8 @@ public class ChunkType extends PartialType { @Override public Chunk read(ByteBuf input, ClientChunks param) throws Exception { - boolean replacePistons = param.getUser().get(ProtocolInfo.class).getPipeline().contains(Protocol1_10To1_9_3_4.class) && ViaVersion.getConfig().isReplacePistons(); - int replacementId = ViaVersion.getConfig().getPistonReplacementId(); + boolean replacePistons = param.getUser().get(ProtocolInfo.class).getPipeline().contains(Protocol1_10To1_9_3_4.class) && Via.getConfig().isReplacePistons(); + int replacementId = Via.getConfig().getPistonReplacementId(); int chunkX = input.readInt(); int chunkZ = input.readInt(); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java index 16d3c6114..7224c151b 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java @@ -1,7 +1,7 @@ package us.myles.ViaVersion.protocols.protocolsnapshotto1_10; import com.google.common.base.Optional; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata.NewType; @@ -75,8 +75,7 @@ public class MetadataRewriter { } return currentType; } catch (Exception e) { - ; - if (!ViaVersion.getConfig().isSuppressMetadataErrors() || ViaVersion.getInstance().isDebug()) { + if (!Via.getConfig().isSuppressMetadataErrors() || Via.getManager().isDebug()) { System.out.println("An error occurred with entity type rewriter"); System.out.println("Metadata: " + metadata); e.printStackTrace(); @@ -154,7 +153,7 @@ public class MetadataRewriter { } } catch (Exception e) { metadatas.remove(metadata); - if (!ViaVersion.getConfig().isSuppressMetadataErrors() || ViaVersion.getInstance().isDebug()) { + if (!Via.getConfig().isSuppressMetadataErrors() || Via.getManager().isDebug()) { System.out.println("An error occurred with entity metadata handler"); System.out.println("Metadata: " + metadata); e.printStackTrace(); From 848b0cf11352fca0fba231dbffece85a5fd90746 Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 25 Sep 2016 16:03:03 +0100 Subject: [PATCH 07/76] Make ViaCommandSender better, fix quite a few of the commands. --- .../bukkit/BukkitCommandSender.java | 17 +++++ .../ViaVersion/handlers/ViaDecodeHandler.java | 2 +- .../protocol1_9to1_8/ArmorListener.java | 9 ++- .../java/us/myles/ViaVersion/ViaManager.java | 3 +- .../ViaVersion/api/ViaVersionConfig.java | 5 ++ .../api/command/ViaCommandSender.java | 7 ++ .../ViaVersion/api/platform/ViaPlatform.java | 3 + .../commands/defaultsubs/AutoTeamSubCmd.java | 3 +- .../commands/defaultsubs/DebugSubCmd.java | 10 +-- .../defaultsubs/DisplayLeaksSubCmd.java | 1 - .../commands/defaultsubs/DumpSubCmd.java | 6 -- .../commands/defaultsubs/HelpSubCmd.java | 9 +-- .../commands/defaultsubs/ListSubCmd.java | 9 +-- .../commands/defaultsubs/PPSSubCmd.java | 14 ++-- .../commands/defaultsubs/ReloadSubCmd.java | 7 +- .../protocols/protocol1_9to1_8/ArmorType.java | 74 +++++++------------ 16 files changed, 87 insertions(+), 92 deletions(-) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandSender.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandSender.java index 64dbf26b6..2cc59c25b 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandSender.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandSender.java @@ -2,8 +2,11 @@ package us.myles.ViaVersion.bukkit; import lombok.AllArgsConstructor; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; import us.myles.ViaVersion.api.command.ViaCommandSender; +import java.util.UUID; + @AllArgsConstructor public class BukkitCommandSender implements ViaCommandSender { private CommandSender sender; @@ -17,4 +20,18 @@ public class BukkitCommandSender implements ViaCommandSender { public void sendMessage(String msg) { sender.sendMessage(msg); } + + @Override + public UUID getUUID() { + if (sender instanceof Player) { + return ((Player) sender).getUniqueId(); + } else { + return UUID.fromString(getName()); + } + } + + @Override + public String getName() { + return sender.getName(); + } } diff --git a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java index a947ee757..228388a24 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java @@ -48,7 +48,7 @@ public class ViaDecodeHandler extends ByteToMessageDecoder { // Transform ByteBuf newPacket = ctx.alloc().buffer(); try { - if (id == ViaDecodeHandler.PASSTHROUGH_ID) { + if (id == PacketWrapper.PASSTHROUGH_ID) { newPacket.writeBytes(bytebuf); } else { PacketWrapper wrapper = new PacketWrapper(id, bytebuf, info); diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/ArmorListener.java b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/ArmorListener.java index 9e31d4c27..38f8a5dad 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/ArmorListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/ArmorListener.java @@ -12,6 +12,7 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.inventory.CraftingInventory; +import org.bukkit.inventory.ItemStack; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.ViaListener; @@ -33,7 +34,11 @@ public class ArmorListener extends ViaListener { // Ensure that the player is on our pipe if (!isOnPipe(player)) return; - int armor = ArmorType.calculateArmorPoints(player.getInventory().getArmorContents()); + + int armor = 0; + for (ItemStack stack : player.getInventory().getArmorContents()) { + armor += ArmorType.findById(stack.getTypeId()).getArmorPoints(); + } PacketWrapper wrapper = new PacketWrapper(0x4B, null, getUserConnection(player)); try { @@ -58,7 +63,7 @@ public class ArmorListener extends ViaListener { if (human instanceof Player && e.getInventory() instanceof CraftingInventory) { final Player player = (Player) human; if (e.getCurrentItem() != null) { - if (ArmorType.isArmor(e.getCurrentItem().getType())) { + if (ArmorType.isArmor(e.getCurrentItem().getTypeId())) { sendDelayedArmorUpdate(player); return; } diff --git a/common/src/main/java/us/myles/ViaVersion/ViaManager.java b/common/src/main/java/us/myles/ViaVersion/ViaManager.java index e891e04c4..541e2e2fc 100644 --- a/common/src/main/java/us/myles/ViaVersion/ViaManager.java +++ b/common/src/main/java/us/myles/ViaVersion/ViaManager.java @@ -9,6 +9,7 @@ import us.myles.ViaVersion.api.platform.ViaInjector; import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.api.protocol.ProtocolVersion; +import us.myles.ViaVersion.commands.ViaCommandHandler; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.update.UpdateUtil; @@ -24,7 +25,7 @@ public class ViaManager { private boolean debug = false; // Internals private ViaInjector injector; - private ViaVersionCommand commandHandler; + private ViaCommandHandler commandHandler; public ViaManager(ViaPlatform platform) { this.platform = platform; diff --git a/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java b/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java index ac8c1d1cd..365392cd3 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java +++ b/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java @@ -217,4 +217,9 @@ public interface ViaVersionConfig { * @return Disconnect message */ String getReloadDisconnectMsg(); + + /** + * Reloads the config from disk + */ + void reloadConfig(); } diff --git a/common/src/main/java/us/myles/ViaVersion/api/command/ViaCommandSender.java b/common/src/main/java/us/myles/ViaVersion/api/command/ViaCommandSender.java index 8dacd6526..e47eec91b 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/command/ViaCommandSender.java +++ b/common/src/main/java/us/myles/ViaVersion/api/command/ViaCommandSender.java @@ -1,6 +1,13 @@ package us.myles.ViaVersion.api.command; +import java.util.UUID; + public interface ViaCommandSender { public boolean hasPermission(String permission); + public void sendMessage(String msg); + + public UUID getUUID(); + + public String getName(); } diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java index 749db27f0..3e1f10629 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java @@ -2,6 +2,7 @@ package us.myles.ViaVersion.api.platform; import us.myles.ViaVersion.api.ViaAPI; import us.myles.ViaVersion.api.ViaVersionConfig; +import us.myles.ViaVersion.api.command.ViaCommandSender; import java.util.UUID; import java.util.logging.Logger; @@ -22,6 +23,8 @@ public interface ViaPlatform { public void runSync(Runnable runnable); + public ViaCommandSender[] getOnlinePlayers(); + public void sendMessage(UUID uuid, String message); public boolean kickPlayer(UUID uuid, String message); diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/AutoTeamSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/AutoTeamSubCmd.java index dee8f5331..e495f1cb4 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/AutoTeamSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/AutoTeamSubCmd.java @@ -1,6 +1,7 @@ package us.myles.ViaVersion.commands.defaultsubs; import us.myles.ViaVersion.ViaVersionPlugin; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; @@ -20,7 +21,7 @@ public class AutoTeamSubCmd extends ViaSubCommand { public boolean execute(ViaCommandSender sender, String[] args) { ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); - boolean newValue = !ViaVersion.getConfig().isAutoTeam(); + boolean newValue = !Via.getConfig().isAutoTeam(); plugin.getConfig().set("auto-team", newValue); plugin.saveConfig(); sendMessage(sender, "&6We will %s", (newValue ? "&aautomatically team players" : "&cno longer auto team players")); diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DebugSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DebugSubCmd.java index 997f5670d..47396264c 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DebugSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DebugSubCmd.java @@ -1,8 +1,6 @@ package us.myles.ViaVersion.commands.defaultsubs; -import org.bukkit.command.CommandSender; -import us.myles.ViaVersion.ViaVersionPlugin; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; @@ -19,10 +17,8 @@ public class DebugSubCmd extends ViaSubCommand { @Override public boolean execute(ViaCommandSender sender, String[] args) { - ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); - - plugin.setDebug(!plugin.isDebug()); - sendMessage(sender, "&6Debug mode is now %s", (plugin.isDebug() ? "&aenabled" : "&cdisabled")); + Via.getManager().setDebug(!Via.getManager().isDebug()); + sendMessage(sender, "&6Debug mode is now %s", (Via.getManager().isDebug() ? "&aenabled" : "&cdisabled")); return true; } } diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DisplayLeaksSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DisplayLeaksSubCmd.java index 309b1a85c..5710105db 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DisplayLeaksSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DisplayLeaksSubCmd.java @@ -1,7 +1,6 @@ package us.myles.ViaVersion.commands.defaultsubs; import io.netty.util.ResourceLeakDetector; -import org.bukkit.command.CommandSender; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java index adb108ff7..eaa45d65a 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java @@ -3,12 +3,6 @@ package us.myles.ViaVersion.commands.defaultsubs; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; -import us.myles.ViaVersion.ViaVersionPlugin; -import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/HelpSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/HelpSubCmd.java index 6f674c18f..96983349a 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/HelpSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/HelpSubCmd.java @@ -1,11 +1,8 @@ package us.myles.ViaVersion.commands.defaultsubs; -import org.bukkit.command.CommandSender; -import us.myles.ViaVersion.ViaVersionPlugin; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; -import us.myles.ViaVersion.commands.ViaCommandHandler; public class HelpSubCmd extends ViaSubCommand { @Override @@ -20,9 +17,7 @@ public class HelpSubCmd extends ViaSubCommand { @Override public boolean execute(ViaCommandSender sender, String[] args) { - ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); - - ((ViaCommandHandler) plugin.getCommandHandler()).showHelp(sender); + Via.getManager().getCommandHandler().showHelp(sender); return true; } } diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ListSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ListSubCmd.java index 53c4047e1..c1e8e8458 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ListSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ListSubCmd.java @@ -1,9 +1,6 @@ package us.myles.ViaVersion.commands.defaultsubs; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; import us.myles.ViaVersion.api.protocol.ProtocolVersion; @@ -35,8 +32,8 @@ public class ListSubCmd extends ViaSubCommand { } }); - for (Player p : Bukkit.getOnlinePlayers()) { - int playerVersion = ViaVersion.getInstance().getPlayerVersion(p); + for (ViaCommandSender p : Via.getPlatform().getOnlinePlayers()) { + int playerVersion = Via.getAPI().getPlayerVersion(p.getUUID()); ProtocolVersion key = ProtocolVersion.getProtocol(playerVersion); if (!playerVersions.containsKey(key)) playerVersions.put(key, new HashSet()); diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/PPSSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/PPSSubCmd.java index 6cf98ae8e..c46d4ccac 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/PPSSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/PPSSubCmd.java @@ -1,10 +1,6 @@ package us.myles.ViaVersion.commands.defaultsubs; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import us.myles.ViaVersion.ViaVersionPlugin; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; import us.myles.ViaVersion.api.data.UserConnection; @@ -35,13 +31,13 @@ public class PPSSubCmd extends ViaSubCommand { int clients = 0; long max = 0; - for (Player p : Bukkit.getOnlinePlayers()) { - if (!ViaVersion.getInstance().isPorted(p)) + for (ViaCommandSender p : Via.getPlatform().getOnlinePlayers()) { + if (!Via.getAPI().isPorted(p.getUUID())) continue; - int playerVersion = ViaVersion.getInstance().getPlayerVersion(p); + int playerVersion = Via.getAPI().getPlayerVersion(p.getUUID()); if (!playerVersions.containsKey(playerVersion)) playerVersions.put(playerVersion, new HashSet()); - UserConnection uc = ((ViaVersionPlugin) ViaVersion.getInstance()).getConnection(p); + UserConnection uc = Via.getManager().getConnection(p.getUUID()); if (uc.getPacketsPerSecond() > -1) { playerVersions.get(playerVersion).add(p.getName() + " (" + uc.getPacketsPerSecond() + " PPS)"); totalPackets += uc.getPacketsPerSecond(); diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java index b919e4ab8..938651a36 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java @@ -1,7 +1,6 @@ package us.myles.ViaVersion.commands.defaultsubs; -import us.myles.ViaVersion.ViaVersionPlugin; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; @@ -18,9 +17,7 @@ public class ReloadSubCmd extends ViaSubCommand { @Override public boolean execute(ViaCommandSender sender, String[] args) { - ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); - - plugin.getConf().generateConfig(); + Via.getConfig().reloadConfig(); sendMessage(sender, "&6Configuration successfully reloaded! Some features may need a restart."); return true; } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java index b9446c5fb..a9cd642cc 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java @@ -2,8 +2,6 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; import java.util.HashMap; @@ -11,54 +9,39 @@ import java.util.HashMap; @Getter public enum ArmorType { - LEATHER_HELMET(1, 298, Material.LEATHER_HELMET), - LEATHER_CHESTPLATE(3, 299, Material.LEATHER_CHESTPLATE), - LEATHER_LEGGINGS(2, 300, Material.LEATHER_LEGGINGS), - LEATHER_BOOTS(1, 301, Material.LEATHER_BOOTS), - CHAINMAIL_HELMET(2, 302, Material.CHAINMAIL_HELMET), - CHAINMAIL_CHESTPLATE(5, 303, Material.CHAINMAIL_CHESTPLATE), - CHAINMAIL_LEGGINGS(4, 304, Material.CHAINMAIL_LEGGINGS), - CHAINMAIL_BOOTS(1, 305, Material.CHAINMAIL_BOOTS), - IRON_HELMET(2, 306, Material.IRON_HELMET), - IRON_CHESTPLATE(6, 307, Material.IRON_CHESTPLATE), - IRON_LEGGINGS(5, 308, Material.IRON_LEGGINGS), - IRON_BOOTS(2, 309, Material.IRON_BOOTS), - DIAMOND_HELMET(3, 310, Material.DIAMOND_HELMET), - DIAMOND_CHESTPLATE(8, 311, Material.DIAMOND_CHESTPLATE), - DIAMOND_LEGGINGS(6, 312, Material.DIAMOND_LEGGINGS), - DIAMOND_BOOTS(3, 313, Material.DIAMOND_BOOTS), - GOLD_HELMET(2, 314, Material.GOLD_HELMET), - GOLD_CHESTPLATE(5, 315, Material.GOLD_CHESTPLATE), - GOLD_LEGGINGS(3, 316, Material.GOLD_LEGGINGS), - GOLD_BOOTS(1, 317, Material.GOLD_BOOTS), - NONE(0, 0, Material.AIR); + LEATHER_HELMET(1, 298), + LEATHER_CHESTPLATE(3, 299), + LEATHER_LEGGINGS(2, 300), + LEATHER_BOOTS(1, 301), + CHAINMAIL_HELMET(2, 302), + CHAINMAIL_CHESTPLATE(5, 303), + CHAINMAIL_LEGGINGS(4, 304), + CHAINMAIL_BOOTS(1, 305), + IRON_HELMET(2, 306), + IRON_CHESTPLATE(6, 307), + IRON_LEGGINGS(5, 308), + IRON_BOOTS(2, 309), + DIAMOND_HELMET(3, 310), + DIAMOND_CHESTPLATE(8, 311), + DIAMOND_LEGGINGS(6, 312), + DIAMOND_BOOTS(3, 313), + GOLD_HELMET(2, 314), + GOLD_CHESTPLATE(5, 315), + GOLD_LEGGINGS(3, 316), + GOLD_BOOTS(1, 317), + NONE(0, 0); - private static HashMap armor; + private static HashMap armor; static { - armor = new HashMap(); + armor = new HashMap<>(); for (ArmorType a : ArmorType.values()) { - armor.put(a.getType(), a); + armor.put(a.getId(), a); } } private final int armorPoints; private final int id; - private final Material type; - - public static ArmorType findByType(Material type) { - ArmorType t = armor.get(type); - return t == null ? ArmorType.NONE : t; - } - - public static int calculateArmorPoints(ItemStack[] armor) { - int total = 0; - for (ItemStack anArmor : armor) { - if (anArmor != null) - total += findByType(anArmor.getType()).getArmorPoints(); - } - return total; - } public static ArmorType findById(int id) { for (ArmorType a : ArmorType.values()) @@ -67,9 +50,9 @@ public enum ArmorType { return ArmorType.NONE; } - public static boolean isArmor(Material material) { + public static boolean isArmor(int id) { for (ArmorType a : ArmorType.values()) - if (a.getType() == material) + if (a.getId() == id) return true; return false; } @@ -83,8 +66,7 @@ public enum ArmorType { return total; } - public Material getType() { - return this.type; + public int getId() { + return this.id; } - } \ No newline at end of file From 49d51de2633cc26236385e0b49949edd9aefd279 Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 25 Sep 2016 17:17:07 +0100 Subject: [PATCH 08/76] Start moving listeners away --- TODOLIST | 4 +- .../us/myles/ViaVersion/ViaVersionPlugin.java | 14 ++++- .../myles/ViaVersion/bukkit/BukkitViaAPI.java | 2 +- .../ViaVersion/bukkit/BukkitViaLoader.java | 51 +++++++++++++++++++ .../java/us/myles/ViaVersion/ViaManager.java | 2 + .../api/platform/ViaPlatformLoader.java | 5 ++ .../api/platform/providers/Provider.java | 4 ++ .../api/platform/providers/ViaProviders.java | 37 ++++++++++++++ .../protocols/base/BaseProtocol.java | 11 ---- .../protocol1_9to1_8/Protocol1_9TO1_8.java | 18 ------- 10 files changed, 115 insertions(+), 33 deletions(-) create mode 100644 bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java create mode 100644 common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatformLoader.java create mode 100644 common/src/main/java/us/myles/ViaVersion/api/platform/providers/Provider.java create mode 100644 common/src/main/java/us/myles/ViaVersion/api/platform/providers/ViaProviders.java diff --git a/TODOLIST b/TODOLIST index 9b410a1df..3c6f532e3 100644 --- a/TODOLIST +++ b/TODOLIST @@ -8,4 +8,6 @@ Handle injector errors Add new info to dump for platform Migrate Bukkit types to our own :D -Important: Create builder for ViaManager which allows supplying on the command exectutor, injector, platform :D \ No newline at end of file +Important: Create builder for ViaManager which allows supplying on the command exectutor, injector, platform :D + +Important: Add BukkitViaLoader to ViaManager sequence \ No newline at end of file diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 159e8d59d..3aee4194f 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -8,14 +8,15 @@ import org.bukkit.plugin.java.JavaPlugin; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaAPI; import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.bukkit.BukkitCommandHandler; +import us.myles.ViaVersion.bukkit.BukkitCommandSender; import us.myles.ViaVersion.bukkit.BukkitViaAPI; import us.myles.ViaVersion.bukkit.BukkitViaInjector; import us.myles.ViaVersion.classgenerator.ClassGenerator; -import us.myles.ViaVersion.listeners.UpdateListener; import us.myles.ViaVersion.util.ReflectionUtil; import java.util.UUID; @@ -88,7 +89,6 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { Via.getManager().init(); } - Bukkit.getPluginManager().registerEvents(new UpdateListener(), this); getCommand("viaversion").setExecutor(commandHandler = new BukkitCommandHandler()); getCommand("viaversion").setTabCompleter(commandHandler); @@ -189,6 +189,16 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { getServer().getScheduler().runTask(this, runnable); } + @Override + public ViaCommandSender[] getOnlinePlayers() { + ViaCommandSender[] array = new ViaCommandSender[Bukkit.getOnlinePlayers().size()]; + int i = 0; + for (Player player : Bukkit.getOnlinePlayers()) { + array[i++] = new BukkitCommandSender(player); + } + return array; + } + @Override public void sendMessage(UUID uuid, String message) { Player player = Bukkit.getPlayer(uuid); diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaAPI.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaAPI.java index 3c833a92f..c2e4bf66d 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaAPI.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaAPI.java @@ -26,7 +26,7 @@ import java.util.UUID; @AllArgsConstructor public class BukkitViaAPI implements ViaAPI, ViaVersionAPI { - public ViaVersionPlugin plugin; + private ViaVersionPlugin plugin; @Override public int getPlayerVersion(@NonNull Player player) { diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java new file mode 100644 index 000000000..b3e87fb44 --- /dev/null +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java @@ -0,0 +1,51 @@ +package us.myles.ViaVersion.bukkit; + +import lombok.AllArgsConstructor; +import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; +import us.myles.ViaVersion.ViaVersionPlugin; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.platform.ViaPlatformLoader; +import us.myles.ViaVersion.listeners.UpdateListener; +import us.myles.ViaVersion.listeners.protocol1_9to1_8.*; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.ViaIdleThread; + +@AllArgsConstructor +public class BukkitViaLoader implements ViaPlatformLoader { + private ViaVersionPlugin plugin; + + @Override + public void load() { + // Update Listener + Bukkit.getPluginManager().registerEvents(new UpdateListener(), plugin); + + /* Base Protocol */ + final ViaVersionPlugin plugin = (ViaVersionPlugin) Bukkit.getPluginManager().getPlugin("ViaVersion"); + + Bukkit.getPluginManager().registerEvents(new Listener() { + @EventHandler + public void onPlayerQuit(PlayerQuitEvent e) { + Via.getManager().removePortedClient(e.getPlayer().getUniqueId()); + } + }, plugin); + + /* 1.9 client to 1.8 server */ + new ArmorListener(plugin).register(); + new CommandBlockListener(plugin).register(); + new DeathListener(plugin).register(); + new BlockListener(plugin).register(); + + if (Bukkit.getVersion().toLowerCase().contains("paper") || Bukkit.getVersion().toLowerCase().contains("taco")) { + plugin.getLogger().info("Enabling PaperSpigot/TacoSpigot patch: Fixes block placement."); + new PaperPatch(plugin).register(); + } + if (plugin.getConf().isStimulatePlayerTick()) + new ViaIdleThread(Via.getManager().getPortedPlayers()).runTaskTimer(plugin, 1L, 1L); // Updates player's idle status + if (plugin.getConf().isItemCache()) { + new HandItemCache().runTaskTimerAsynchronously(plugin, 2L, 2L); // Updates player's items :) + HandItemCache.CACHE = true; + } + } +} diff --git a/common/src/main/java/us/myles/ViaVersion/ViaManager.java b/common/src/main/java/us/myles/ViaVersion/ViaManager.java index 541e2e2fc..6ea315204 100644 --- a/common/src/main/java/us/myles/ViaVersion/ViaManager.java +++ b/common/src/main/java/us/myles/ViaVersion/ViaManager.java @@ -7,6 +7,7 @@ import us.myles.ViaVersion.api.command.ViaVersionCommand; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.platform.ViaInjector; import us.myles.ViaVersion.api.platform.ViaPlatform; +import us.myles.ViaVersion.api.platform.ViaPlatformLoader; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.api.protocol.ProtocolVersion; import us.myles.ViaVersion.commands.ViaCommandHandler; @@ -26,6 +27,7 @@ public class ViaManager { // Internals private ViaInjector injector; private ViaCommandHandler commandHandler; + private ViaPlatformLoader loader; public ViaManager(ViaPlatform platform) { this.platform = platform; diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatformLoader.java b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatformLoader.java new file mode 100644 index 000000000..c535e90cd --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatformLoader.java @@ -0,0 +1,5 @@ +package us.myles.ViaVersion.api.platform; + +public interface ViaPlatformLoader { + public void load(); +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/providers/Provider.java b/common/src/main/java/us/myles/ViaVersion/api/platform/providers/Provider.java new file mode 100644 index 000000000..f9a6c4d77 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/providers/Provider.java @@ -0,0 +1,4 @@ +package us.myles.ViaVersion.api.platform.providers; + +public interface Provider { +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/providers/ViaProviders.java b/common/src/main/java/us/myles/ViaVersion/api/platform/providers/ViaProviders.java new file mode 100644 index 000000000..6c60cc4f8 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/providers/ViaProviders.java @@ -0,0 +1,37 @@ +package us.myles.ViaVersion.api.platform.providers; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ViaProviders { + private Map, Provider> providers = new HashMap<>(); + private List> lonelyProviders = new ArrayList<>(); + + public void require(Class provider) { + lonelyProviders.add(provider); + } + + public void register(Class provider, T value) { + providers.put(provider, value); + } + + public void use(Class provider, T value) { + if (lonelyProviders.contains(provider)) { + lonelyProviders.remove(provider); + } + providers.put(provider, value); + } + + public T get(Class provider) { + if (providers.containsKey(provider)) { + return (T) providers.get(provider); + } else { + if (lonelyProviders.contains(provider)) { + throw new IllegalStateException("There was no provider for " + provider + ", one is required!"); + } + return null; + } + } +} diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java b/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java index 685fcdda9..8cab352fc 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java @@ -9,10 +9,6 @@ import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; import net.md_5.bungee.api.ChatColor; import org.apache.commons.lang.StringUtils; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerQuitEvent; -import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Via; @@ -204,14 +200,7 @@ public class BaseProtocol extends Protocol { @Override protected void registerListeners() { - final ViaVersionPlugin plugin = (ViaVersionPlugin) Bukkit.getPluginManager().getPlugin("ViaVersion"); - Bukkit.getPluginManager().registerEvents(new Listener() { - @EventHandler - public void onPlayerQuit(PlayerQuitEvent e) { - plugin.removePortedClient(e.getPlayer().getUniqueId()); - } - }, plugin); } @Override diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java index 68fde2799..c5c596b92 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java @@ -3,8 +3,6 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; -import org.bukkit.Bukkit; -import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; @@ -103,23 +101,7 @@ public class Protocol1_9TO1_8 extends Protocol { @Override protected void registerListeners() { - ViaVersionPlugin plugin = (ViaVersionPlugin) Bukkit.getPluginManager().getPlugin("ViaVersion"); - new ArmorListener(plugin).register(); - new CommandBlockListener(plugin).register(); - new DeathListener(plugin).register(); - new BlockListener(plugin).register(); - - if (Bukkit.getVersion().toLowerCase().contains("paper") || Bukkit.getVersion().toLowerCase().contains("taco")) { - plugin.getLogger().info("Enabling PaperSpigot/TacoSpigot patch: Fixes block placement."); - new PaperPatch(plugin).register(); - } - if (plugin.getConf().isStimulatePlayerTick()) - new ViaIdleThread(plugin.getPortedPlayers()).runTaskTimer(plugin, 1L, 1L); // Updates player's idle status - if (plugin.getConf().isItemCache()) { - new HandItemCache().runTaskTimerAsynchronously(plugin, 2L, 2L); // Updates player's items :) - HandItemCache.CACHE = true; - } } @Override From 84ee4410a6948f497e198834bbe53a527411b6f0 Mon Sep 17 00:00:00 2001 From: Matsv Date: Sun, 25 Sep 2016 18:20:42 +0200 Subject: [PATCH 09/76] Use generics for bossbars --- TODOLIST | 1 - .../us/myles/ViaVersion/boss/ViaBossBar.java | 23 ++++++------------- .../us/myles/ViaVersion/api/boss/BossBar.java | 14 +++++++---- .../us/myles/ViaVersion/boss/CommonBoss.java | 2 +- 4 files changed, 18 insertions(+), 22 deletions(-) diff --git a/TODOLIST b/TODOLIST index 3c6f532e3..97fa7421c 100644 --- a/TODOLIST +++ b/TODOLIST @@ -1,7 +1,6 @@ Migrate EntityUtil to be cool Fix 1.9to1.8 Migrate listeners in BaseProtocol -Fix BossBar to use Generics Register Listeners Properly Fix commands Handle injector errors diff --git a/bukkit/src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java b/bukkit/src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java index 519c42fcd..7083ac7d8 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java @@ -7,37 +7,28 @@ import us.myles.ViaVersion.api.boss.BossColor; import us.myles.ViaVersion.api.boss.BossStyle; @Getter -public class ViaBossBar extends CommonBoss { - // TODO: Fix to use generics +public class ViaBossBar extends CommonBoss { public ViaBossBar(String title, float health, BossColor color, BossStyle style) { super(title, health, color, style); } @Override - public BossBar addPlayer(Object player) { - if (player instanceof Player){ - addPlayer(((Player) player).getUniqueId()); - } else { - throw new IllegalArgumentException("The addPlayer argument has to be a Bukkit player on this platform"); - } + public BossBar addPlayer(Player player) { + addPlayer(player.getUniqueId()); return this; } @Override - public BossBar addPlayers(Object... players) { - for (Object p : players) + public BossBar addPlayers(Player... players) { + for (Player p : players) addPlayer(p); return this; } @Override - public BossBar removePlayer(Object player) { - if (player instanceof Player){ - removePlayer(((Player) player).getUniqueId()); - } else { - throw new IllegalArgumentException("The removePlayer argument has to be a Bukkit player on this platform"); - } + public BossBar removePlayer(Player player) { + removePlayer(player.getUniqueId()); return this; } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java b/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java index 4383aecf1..71a4564ec 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java +++ b/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java @@ -6,7 +6,7 @@ import us.myles.ViaVersion.api.Via; import java.util.Set; import java.util.UUID; -public abstract class BossBar { +public abstract class BossBar { /** * Get the current title * @@ -72,8 +72,10 @@ public abstract class BossBar { * * @param player The player * @return The BossBar object + * @deprecated Deprecated use UUID's instead of Player objects {@link #addPlayer(UUID)} */ - public BossBar addPlayer(Object player){ + @Deprecated + public BossBar addPlayer(T player){ throw new NotImplementedException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName()); } @@ -90,8 +92,10 @@ public abstract class BossBar { * * @param players list of players * @return The BossBar object + * @deprecated Deprecated use UUID's instead of Player objects {@link #addPlayer(UUID)} */ - public BossBar addPlayers(Object... players){ + @Deprecated + public BossBar addPlayers(T... players){ throw new NotImplementedException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName()); } @@ -100,8 +104,10 @@ public abstract class BossBar { * * @param player The player * @return The BossBar object + * @deprecated Deprecated use UUID's instead of Player objects {@link #removePlayer(UUID)} */ - public BossBar removePlayer(Object player){ + @Deprecated + public BossBar removePlayer(T player){ throw new NotImplementedException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName()); } diff --git a/common/src/main/java/us/myles/ViaVersion/boss/CommonBoss.java b/common/src/main/java/us/myles/ViaVersion/boss/CommonBoss.java index 783339921..f43538a52 100644 --- a/common/src/main/java/us/myles/ViaVersion/boss/CommonBoss.java +++ b/common/src/main/java/us/myles/ViaVersion/boss/CommonBoss.java @@ -18,7 +18,7 @@ import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; import java.util.*; @Getter -public abstract class CommonBoss extends BossBar { +public abstract class CommonBoss extends BossBar { private UUID uuid; private String title; private float health; From 52610f7c66eeaae9fb0374c2281e806acf09167d Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 25 Sep 2016 18:06:04 +0100 Subject: [PATCH 10/76] Use HandItemProvider for 1.8 hand items --- .../us/myles/ViaVersion/ViaVersionPlugin.java | 5 +-- .../ViaVersion/bukkit/BukkitViaLoader.java | 38 +++++++++++++++++++ .../protocol1_9to1_8/HandItemCache.java | 8 +++- .../java/us/myles/ViaVersion/ViaManager.java | 32 +++++++++++----- .../ViaVersion/api/protocol/Protocol.java | 12 ++++++ .../api/protocol/ProtocolRegistry.java | 4 +- .../protocol1_9to1_8/Protocol1_9TO1_8.java | 32 +++------------- .../providers/HandItemProvider.java | 11 ++++++ 8 files changed, 99 insertions(+), 43 deletions(-) create mode 100644 common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/HandItemProvider.java diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 3aee4194f..0e4bde244 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -93,9 +93,6 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { getCommand("viaversion").setExecutor(commandHandler = new BukkitCommandHandler()); getCommand("viaversion").setTabCompleter(commandHandler); - // Register Protocol Listeners - ProtocolRegistry.registerListeners(); - // Warn them if they have anti-xray on and they aren't using spigot if (conf.isAntiXRay() && !spigot) { getLogger().info("You have anti-xray on in your config, since you're not using spigot it won't fix xray!"); @@ -104,7 +101,7 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { @Override public void onDisable() { - // TODO: Call ViaManager.destroy() + Via.getManager().destroy(); } public boolean isCompatSpigotBuild() { diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java index b3e87fb44..34ad57130 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java @@ -7,10 +7,18 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.platform.ViaPlatformLoader; import us.myles.ViaVersion.listeners.UpdateListener; import us.myles.ViaVersion.listeners.protocol1_9to1_8.*; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.protocol1_9to1_8.ViaIdleThread; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.HandItemProvider; + +import java.util.UUID; +import java.util.concurrent.Callable; +import java.util.concurrent.TimeUnit; @AllArgsConstructor public class BukkitViaLoader implements ViaPlatformLoader { @@ -32,6 +40,7 @@ public class BukkitViaLoader implements ViaPlatformLoader { }, plugin); /* 1.9 client to 1.8 server */ + new ArmorListener(plugin).register(); new CommandBlockListener(plugin).register(); new DeathListener(plugin).register(); @@ -47,5 +56,34 @@ public class BukkitViaLoader implements ViaPlatformLoader { new HandItemCache().runTaskTimerAsynchronously(plugin, 2L, 2L); // Updates player's items :) HandItemCache.CACHE = true; } + + /* Providers */ + Via.getManager().getProviders().use(HandItemProvider.class, new HandItemProvider() { + @Override + public Item getHandItem(final UserConnection info) { + if (HandItemCache.CACHE) { + return HandItemCache.getHandItem(info.get(ProtocolInfo.class).getUuid()); + } else { + try { + return Bukkit.getScheduler().callSyncMethod(Bukkit.getPluginManager().getPlugin("ViaVersion"), new Callable() { + @Override + public Item call() throws Exception { + UUID playerUUID = info.get(ProtocolInfo.class).getUuid(); + if (Bukkit.getPlayer(playerUUID) != null) { + return HandItemCache.convert(Bukkit.getPlayer(playerUUID).getItemInHand()); + } + return null; + } + }).get(10, TimeUnit.SECONDS); + } catch (Exception e) { + System.out.println("Error fetching hand item: " + e.getClass().getName()); + if (Via.getManager().isDebug()) + e.printStackTrace(); + return null; + } + } + } + }); + } } diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/HandItemCache.java b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/HandItemCache.java index 81abed547..9a05ad7b2 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/HandItemCache.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/HandItemCache.java @@ -2,6 +2,7 @@ package us.myles.ViaVersion.listeners.protocol1_9to1_8; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; import us.myles.ViaVersion.api.minecraft.item.Item; @@ -25,7 +26,7 @@ public class HandItemCache extends BukkitRunnable { List players = new ArrayList<>(handCache.keySet()); for (Player p : Bukkit.getOnlinePlayers()) { - handCache.put(p.getUniqueId(), Item.getItem(p.getItemInHand())); + handCache.put(p.getUniqueId(), convert(p.getItemInHand())); players.remove(p.getUniqueId()); } // Remove offline players @@ -33,4 +34,9 @@ public class HandItemCache extends BukkitRunnable { handCache.remove(uuid); } } + + public static Item convert(ItemStack itemInHand) { + if (itemInHand == null) return new Item((short) 0, (byte) 0, (short) 0, null); + return new Item((short) itemInHand.getTypeId(), (byte) itemInHand.getAmount(), itemInHand.getDurability(), null); + } } diff --git a/common/src/main/java/us/myles/ViaVersion/ViaManager.java b/common/src/main/java/us/myles/ViaVersion/ViaManager.java index 6ea315204..6f9227270 100644 --- a/common/src/main/java/us/myles/ViaVersion/ViaManager.java +++ b/common/src/main/java/us/myles/ViaVersion/ViaManager.java @@ -8,6 +8,7 @@ import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.platform.ViaInjector; import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.api.platform.ViaPlatformLoader; +import us.myles.ViaVersion.api.platform.providers.ViaProviders; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.api.protocol.ProtocolVersion; import us.myles.ViaVersion.commands.ViaCommandHandler; @@ -22,6 +23,7 @@ import java.util.concurrent.ConcurrentHashMap; public class ViaManager { private ViaPlatform platform; private final Map portedPlayers = new ConcurrentHashMap<>(); + private ViaProviders providers = new ViaProviders(); @Setter private boolean debug = false; // Internals @@ -51,20 +53,30 @@ public class ViaManager { platform.runSync(new Runnable() { @Override public void run() { - ProtocolRegistry.SERVER_PROTOCOL = injector.getServerProtocolVersion(); - - // Check if there are any pipes to this version - if (ProtocolRegistry.SERVER_PROTOCOL != -1) { - getPlatform().getLogger().info("ViaVersion detected server version: " + ProtocolVersion.getProtocol(ProtocolRegistry.SERVER_PROTOCOL)); - if (!ProtocolRegistry.isWorkingPipe()) { - getPlatform().getLogger().warning("ViaVersion does not have any compatible versions for this server version, please read our resource page carefully."); - } - } - ProtocolRegistry.refreshVersions(); + onServerLoaded(); } }); } + public void onServerLoaded() { + // Load Server Protocol + ProtocolRegistry.SERVER_PROTOCOL = injector.getServerProtocolVersion(); + // Check if there are any pipes to this version + if (ProtocolRegistry.SERVER_PROTOCOL != -1) { + getPlatform().getLogger().info("ViaVersion detected server version: " + ProtocolVersion.getProtocol(ProtocolRegistry.SERVER_PROTOCOL)); + if (!ProtocolRegistry.isWorkingPipe()) { + getPlatform().getLogger().warning("ViaVersion does not have any compatible versions for this server version, please read our resource page carefully."); + } + } + // Load Listeners / Tasks + ProtocolRegistry.onServerLoaded(); + + // Load Platform + loader.load(); + + // Refresh Versions + ProtocolRegistry.refreshVersions(); + } public void destroy() { // Uninject diff --git a/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java index 075063c2b..ea56d6191 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java +++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java @@ -5,6 +5,7 @@ import lombok.Getter; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.platform.providers.ViaProviders; import us.myles.ViaVersion.api.remapper.PacketRemapper; import us.myles.ViaVersion.exception.CancelException; import us.myles.ViaVersion.packets.Direction; @@ -47,11 +48,22 @@ public abstract class Protocol { /** * Register listeners for this protocol + * + * @deprecated No longer used as listeners are registered in {@link us.myles.ViaVersion.api.platform.ViaPlatformLoader#load} */ + @Deprecated protected void registerListeners() { } + /** + * Register providers for this protocol + * + * @param providers The current providers + */ + protected void registerProviders(ViaProviders providers) { + + } /** * Register the packets for this protocol */ diff --git a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java index 9f57a93fa..2b6aeb7a0 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java +++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java @@ -63,6 +63,7 @@ public class ProtocolRegistry { if (Via.getPlatform().isPluginEnabled()) { protocol.registerListeners(); + protocol.registerProviders(Via.getManager().getProviders()); refreshVersions(); } else { registerList.add(protocol); @@ -106,9 +107,10 @@ public class ProtocolRegistry { /** * Called when the server is enabled, to register any non registered listeners. */ - public static void registerListeners() { + public static void onServerLoaded() { for (Protocol protocol : registerList) { protocol.registerListeners(); + protocol.registerProviders(Via.getManager().getProviders()); } registerList.clear(); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java index c5c596b92..82a3c1939 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java @@ -8,19 +8,17 @@ import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; +import us.myles.ViaVersion.api.platform.providers.ViaProviders; import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.api.remapper.ValueTransformer; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.api.type.types.version.Metadata1_8Type; import us.myles.ViaVersion.api.type.types.version.MetadataList1_8Type; -import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.protocol1_9to1_8.packets.*; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.HandItemProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.*; import java.util.List; -import java.util.UUID; -import java.util.concurrent.Callable; -import java.util.concurrent.TimeUnit; public class Protocol1_9TO1_8 extends Protocol { @Deprecated @@ -67,27 +65,7 @@ public class Protocol1_9TO1_8 extends Protocol { } public static Item getHandItem(final UserConnection info) { - if (HandItemCache.CACHE) { - return HandItemCache.getHandItem(info.get(ProtocolInfo.class).getUuid()); - } else { - try { - return Bukkit.getScheduler().callSyncMethod(Bukkit.getPluginManager().getPlugin("ViaVersion"), new Callable() { - @Override - public Item call() throws Exception { - UUID playerUUID = info.get(ProtocolInfo.class).getUuid(); - if (Bukkit.getPlayer(playerUUID) != null) { - return Item.getItem(Bukkit.getPlayer(playerUUID).getItemInHand()); - } - return null; - } - }).get(10, TimeUnit.SECONDS); - } catch (Exception e) { - System.out.println("Error fetching hand item: " + e.getClass().getName()); - if (Via.getManager().isDebug()) - e.printStackTrace(); - return null; - } - } + return Via.getManager().getProviders().get(HandItemProvider.class).getHandItem(info); } @Override @@ -100,8 +78,8 @@ public class Protocol1_9TO1_8 extends Protocol { } @Override - protected void registerListeners() { - + protected void registerProviders(ViaProviders providers) { + providers.register(HandItemProvider.class, new HandItemProvider()); } @Override diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/HandItemProvider.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/HandItemProvider.java new file mode 100644 index 000000000..a839dc353 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/HandItemProvider.java @@ -0,0 +1,11 @@ +package us.myles.ViaVersion.protocols.protocol1_9to1_8.providers; + +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.minecraft.item.Item; +import us.myles.ViaVersion.api.platform.providers.Provider; + +public class HandItemProvider implements Provider { + public Item getHandItem(final UserConnection info) { + return new Item((short) 0, (byte) 0, (short) 0, null); + } +} From 7a7c3f15d8475cdaac29d8f301e388b1c9aa575e Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 25 Sep 2016 18:26:14 +0100 Subject: [PATCH 11/76] Add required provider for movement (for reflection caching) --- .../ViaVersion/bukkit/BukkitViaLoader.java | 2 - .../bukkit/BukkitViaMovementTransmitter.java | 99 +++++++++++++++++++ .../ViaVersion/api/platform/ViaPlatform.java | 2 + .../ViaVersion/api/protocol/Protocol.java | 4 +- .../protocol1_9to1_8/Protocol1_9TO1_8.java | 7 +- .../protocol1_9to1_8/ViaIdleThread.java | 99 +------------------ .../MovementTransmitterProvider.java | 26 +++++ 7 files changed, 139 insertions(+), 100 deletions(-) create mode 100644 bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaMovementTransmitter.java create mode 100644 common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/MovementTransmitterProvider.java diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java index 34ad57130..48e76ed00 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java @@ -50,8 +50,6 @@ public class BukkitViaLoader implements ViaPlatformLoader { plugin.getLogger().info("Enabling PaperSpigot/TacoSpigot patch: Fixes block placement."); new PaperPatch(plugin).register(); } - if (plugin.getConf().isStimulatePlayerTick()) - new ViaIdleThread(Via.getManager().getPortedPlayers()).runTaskTimer(plugin, 1L, 1L); // Updates player's idle status if (plugin.getConf().isItemCache()) { new HandItemCache().runTaskTimerAsynchronously(plugin, 2L, 2L); // Updates player's items :) HandItemCache.CACHE = true; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaMovementTransmitter.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaMovementTransmitter.java new file mode 100644 index 000000000..3bc4544d6 --- /dev/null +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaMovementTransmitter.java @@ -0,0 +1,99 @@ +package us.myles.ViaVersion.bukkit; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.MovementTracker; +import us.myles.ViaVersion.util.ReflectionUtil; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class BukkitViaMovementTransmitter extends MovementTransmitterProvider { + private static boolean USE_NMS = true; + // Used for packet mode + private Object idlePacket; + private Object idlePacket2; + // Use for nms + private Method getHandle; + private Field connection; + private Method handleFlying; + + public BukkitViaMovementTransmitter() { + USE_NMS = Via.getConfig().isNMSPlayerTicking(); + + Class idlePacketClass; + try { + idlePacketClass = ReflectionUtil.nms("PacketPlayInFlying"); + } catch (ClassNotFoundException e) { + throw new RuntimeException("Couldn't find idle packet, help!", e); + } + try { + idlePacket = idlePacketClass.newInstance(); + idlePacket2 = idlePacketClass.newInstance(); + + Field flying = idlePacketClass.getDeclaredField("f"); + flying.setAccessible(true); + + flying.set(idlePacket2, true); + } catch (NoSuchFieldException | InstantiationException | IllegalArgumentException | IllegalAccessException e) { + throw new RuntimeException("Couldn't make player idle packet, help!", e); + } + if (USE_NMS) { + try { + getHandle = ReflectionUtil.obc("entity.CraftPlayer").getDeclaredMethod("getHandle"); + } catch (NoSuchMethodException | ClassNotFoundException e) { + throw new RuntimeException("Couldn't find CraftPlayer", e); + } + + try { + connection = ReflectionUtil.nms("EntityPlayer").getDeclaredField("playerConnection"); + } catch (NoSuchFieldException | ClassNotFoundException e) { + throw new RuntimeException("Couldn't find Player Connection", e); + } + + try { + handleFlying = ReflectionUtil.nms("PlayerConnection").getDeclaredMethod("a", idlePacketClass); + } catch (NoSuchMethodException | ClassNotFoundException e) { + throw new RuntimeException("Couldn't find CraftPlayer", e); + } + } + } + + @Override + public Object getFlyingPacket() { + return idlePacket2; + } + + @Override + public Object getGroundPacket() { + return idlePacket; + } + + @Override + public void sendPlayer(UserConnection info) { + if (USE_NMS) { + Player player = Bukkit.getPlayer(info.get(ProtocolInfo.class).getUuid()); + if (player != null) { + try { + // Tick player + Object entityPlayer = getHandle.invoke(player); + Object pc = connection.get(entityPlayer); + if (pc != null) { + handleFlying.invoke(pc, (info.get(MovementTracker.class).isGround() ? idlePacket2 : idlePacket)); + // Tick world + info.get(MovementTracker.class).incrementIdlePacket(); + } + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); + } + } + } else { + super.sendPlayer(info); + } + } +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java index 3e1f10629..59ad00051 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java @@ -23,6 +23,8 @@ public interface ViaPlatform { public void runSync(Runnable runnable); + public void runRepeatingSync(Runnable runnable, Long ticks); + public ViaCommandSender[] getOnlinePlayers(); public void sendMessage(UUID uuid, String message); diff --git a/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java index ea56d6191..bac2b30be 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java +++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java @@ -57,11 +57,11 @@ public abstract class Protocol { } /** - * Register providers for this protocol + * Handle protocol registration phase, use this to register providers / tasks. * * @param providers The current providers */ - protected void registerProviders(ViaProviders providers) { + protected void register(ViaProviders providers) { } /** diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java index 82a3c1939..3a14a4340 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java @@ -16,6 +16,7 @@ import us.myles.ViaVersion.api.type.types.version.Metadata1_8Type; import us.myles.ViaVersion.api.type.types.version.MetadataList1_8Type; import us.myles.ViaVersion.protocols.protocol1_9to1_8.packets.*; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.HandItemProvider; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.*; import java.util.List; @@ -78,8 +79,12 @@ public class Protocol1_9TO1_8 extends Protocol { } @Override - protected void registerProviders(ViaProviders providers) { + protected void register(ViaProviders providers) { providers.register(HandItemProvider.class, new HandItemProvider()); + providers.require(MovementTransmitterProvider.class); + if (Via.getConfig().isStimulatePlayerTick()) { + Via.getPlatform().runRepeatingSync(new ViaIdleThread(), 1L); + } } @Override diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ViaIdleThread.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ViaIdleThread.java index 2e3d086d0..cfc9c6de5 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ViaIdleThread.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ViaIdleThread.java @@ -1,111 +1,20 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8; -import io.netty.channel.ChannelHandlerContext; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; import us.myles.ViaVersion.api.Via; -import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.protocols.base.ProtocolInfo; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.MovementTracker; -import us.myles.ViaVersion.util.PipelineUtil; -import us.myles.ViaVersion.util.ReflectionUtil; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Map; -import java.util.UUID; - -public class ViaIdleThread extends BukkitRunnable { - private static boolean USE_NMS = true; - private final Map portedPlayers; - // Used for packet mode - private Object idlePacket; - private Object idlePacket2; - // Use for nms - private Method getHandle; - private Field connection; - private Method handleFlying; - - public ViaIdleThread(Map portedPlayers) { - USE_NMS = Via.getConfig().isNMSPlayerTicking(); - - this.portedPlayers = portedPlayers; - Class idlePacketClass; - try { - idlePacketClass = ReflectionUtil.nms("PacketPlayInFlying"); - } catch (ClassNotFoundException e) { - throw new RuntimeException("Couldn't find idle packet, help!", e); - } - try { - idlePacket = idlePacketClass.newInstance(); - idlePacket2 = idlePacketClass.newInstance(); - - Field flying = idlePacketClass.getDeclaredField("f"); - flying.setAccessible(true); - - flying.set(idlePacket2, true); - } catch (NoSuchFieldException | InstantiationException | IllegalArgumentException | IllegalAccessException e) { - throw new RuntimeException("Couldn't make player idle packet, help!", e); - } - if (USE_NMS) { - try { - getHandle = ReflectionUtil.obc("entity.CraftPlayer").getDeclaredMethod("getHandle"); - } catch (NoSuchMethodException | ClassNotFoundException e) { - throw new RuntimeException("Couldn't find CraftPlayer", e); - } - - try { - connection = ReflectionUtil.nms("EntityPlayer").getDeclaredField("playerConnection"); - } catch (NoSuchFieldException | ClassNotFoundException e) { - throw new RuntimeException("Couldn't find Player Connection", e); - } - - try { - handleFlying = ReflectionUtil.nms("PlayerConnection").getDeclaredMethod("a", idlePacketClass); - } catch (NoSuchMethodException | ClassNotFoundException e) { - throw new RuntimeException("Couldn't find CraftPlayer", e); - } - } - } +public class ViaIdleThread implements Runnable { @Override public void run() { - for (UserConnection info : portedPlayers.values()) { + for (UserConnection info : Via.getManager().getPortedPlayers().values()) { if (info.get(ProtocolInfo.class).getPipeline().contains(Protocol1_9TO1_8.class)) { long nextIdleUpdate = info.get(MovementTracker.class).getNextIdlePacket(); if (nextIdleUpdate <= System.currentTimeMillis()) { if (info.getChannel().isOpen()) { - if (USE_NMS) { - Player player = Bukkit.getPlayer(info.get(ProtocolInfo.class).getUuid()); - if (player != null) { - try { - // Tick player - Object entityPlayer = getHandle.invoke(player); - Object pc = connection.get(entityPlayer); - if (pc != null) { - handleFlying.invoke(pc, (info.get(MovementTracker.class).isGround() ? idlePacket2 : idlePacket)); - // Tick world - info.get(MovementTracker.class).incrementIdlePacket(); - } - } catch (IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - } - } - } else { - // Old method using packets. - ChannelHandlerContext context = PipelineUtil.getContextBefore("decoder", info.getChannel().pipeline()); - if (context != null) { - if (info.get(MovementTracker.class).isGround()) { - context.fireChannelRead(idlePacket2); - } else { - context.fireChannelRead(idlePacket); - } - info.get(MovementTracker.class).incrementIdlePacket(); - } - } + Via.getManager().getProviders().get(MovementTransmitterProvider.class).sendPlayer(info); } } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/MovementTransmitterProvider.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/MovementTransmitterProvider.java new file mode 100644 index 000000000..311859e90 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/MovementTransmitterProvider.java @@ -0,0 +1,26 @@ +package us.myles.ViaVersion.protocols.protocol1_9to1_8.providers; + +import io.netty.channel.ChannelHandlerContext; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.platform.providers.Provider; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.MovementTracker; +import us.myles.ViaVersion.util.PipelineUtil; + +public abstract class MovementTransmitterProvider implements Provider { + public abstract Object getFlyingPacket(); + + public abstract Object getGroundPacket(); + + public void sendPlayer(UserConnection userConnection) { + // Old method using packets. + ChannelHandlerContext context = PipelineUtil.getContextBefore("decoder", userConnection.getChannel().pipeline()); + if (context != null) { + if (userConnection.get(MovementTracker.class).isGround()) { + context.fireChannelRead(getGroundPacket()); + } else { + context.fireChannelRead(getFlyingPacket()); + } + userConnection.get(MovementTracker.class).incrementIdlePacket(); + } + } +} From 4b94c8ad02868527f73cbc86a0e0869a3957e082 Mon Sep 17 00:00:00 2001 From: Matsv Date: Sun, 25 Sep 2016 19:50:50 +0200 Subject: [PATCH 12/76] Map all entity and object ids / parents and fix metadata searcher --- TODOLIST | 1 - .../protocol1_9to1_8/metadata/MetaIndex.java | 239 ++++++++-------- .../metadata/MetadataRewriter.java | 8 +- .../packets/PlayerPackets.java | 4 +- .../packets/SpawnPackets.java | 11 +- .../storage/EntityTracker.java | 26 +- .../us/myles/ViaVersion/util/EntityUtil.java | 254 ++++++++++++------ 7 files changed, 320 insertions(+), 223 deletions(-) diff --git a/TODOLIST b/TODOLIST index 97fa7421c..dd14be8a3 100644 --- a/TODOLIST +++ b/TODOLIST @@ -1,4 +1,3 @@ -Migrate EntityUtil to be cool Fix 1.9to1.8 Migrate listeners in BaseProtocol Register Listeners Properly diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java index c43dffd12..947bb8536 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java @@ -1,146 +1,159 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata; +import com.google.common.base.Optional; import lombok.Getter; -import org.bukkit.entity.*; +import us.myles.ViaVersion.api.Pair; +import us.myles.ViaVersion.util.EntityUtil; + +import java.util.HashMap; + +import static us.myles.ViaVersion.util.EntityUtil.EntityType.*; @Getter public enum MetaIndex { // entity - ENTITY_STATUS(org.bukkit.entity.Entity.class, 0, Type.Byte, NewType.Byte), - ENTITY_AIR(org.bukkit.entity.Entity.class, 1, Type.Short, NewType.VarInt), - ENTITY_SILENT(org.bukkit.entity.Entity.class, 4, Type.Byte, NewType.Boolean), + ENTITY_STATUS(ENTITY, 0, Type.Byte, NewType.Byte), + ENTITY_AIR(ENTITY, 1, Type.Short, NewType.VarInt), + ENTITY_SILENT(ENTITY, 4, Type.Byte, NewType.Boolean), // living entity - LIVINGENTITY_NAMETAG(LivingEntity.class, 2, Type.String, NewType.String), - LIVINGENTITY_ALWAYS_SHOW_NAMETAG(LivingEntity.class, 3, Type.Byte, NewType.Boolean), - LIVINGENTITY_HEALTH(LivingEntity.class, 6, Type.Float, NewType.Float), - LIVINGENTITY_POTION_EFFECT_COLOR(LivingEntity.class, 7, Type.Int, NewType.VarInt), - LIVINGENTITY_IS_POTION_AMBIENT(LivingEntity.class, 8, Type.Byte, NewType.Boolean), - LIVINGENTITY_NUMBER_OF_ARROWS_IN(LivingEntity.class, 9, Type.Byte, NewType.VarInt), - LIVINGENTITY_NO_AI(LivingEntity.class, 15, Type.Byte, 10, NewType.Byte), // in 1.9 this is combined with Left handed, oh. + LIVINGENTITY_NAMETAG(ENTITY_LIVING, 2, Type.String, NewType.String), + LIVINGENTITY_ALWAYS_SHOW_NAMETAG(ENTITY_LIVING, 3, Type.Byte, NewType.Boolean), + LIVINGENTITY_HEALTH(ENTITY_LIVING, 6, Type.Float, NewType.Float), + LIVINGENTITY_POTION_EFFECT_COLOR(ENTITY_LIVING, 7, Type.Int, NewType.VarInt), + LIVINGENTITY_IS_POTION_AMBIENT(ENTITY_LIVING, 8, Type.Byte, NewType.Boolean), + LIVINGENTITY_NUMBER_OF_ARROWS_IN(ENTITY_LIVING, 9, Type.Byte, NewType.VarInt), + LIVINGENTITY_NO_AI(ENTITY_LIVING, 15, Type.Byte, 10, NewType.Byte), // in 1.9 this is combined with Left handed, oh. // ageable - AGEABLE_AGE(Ageable.class, 12, Type.Byte, 11, NewType.Boolean), + AGEABLE_AGE(ENTITY_AGEABLE, 12, Type.Byte, 11, NewType.Boolean), // armour stand - STAND_INFO(ArmorStand.class, 10, Type.Byte, NewType.Byte), - STAND_HEAD_POS(ArmorStand.class, 11, Type.Rotation, NewType.Vector3F), - STAND_BODY_POS(ArmorStand.class, 12, Type.Rotation, NewType.Vector3F), - STAND_LA_POS(ArmorStand.class, 13, Type.Rotation, NewType.Vector3F), - STAND_RA_POS(ArmorStand.class, 14, Type.Rotation, NewType.Vector3F), - STAND_LL_POS(ArmorStand.class, 15, Type.Rotation, NewType.Vector3F), - STAND_RL_POS(ArmorStand.class, 16, Type.Rotation, NewType.Vector3F), + STAND_INFO(ARMOR_STAND, 10, Type.Byte, NewType.Byte), + STAND_HEAD_POS(ARMOR_STAND, 11, Type.Rotation, NewType.Vector3F), + STAND_BODY_POS(ARMOR_STAND, 12, Type.Rotation, NewType.Vector3F), + STAND_LA_POS(ARMOR_STAND, 13, Type.Rotation, NewType.Vector3F), + STAND_RA_POS(ARMOR_STAND, 14, Type.Rotation, NewType.Vector3F), + STAND_LL_POS(ARMOR_STAND, 15, Type.Rotation, NewType.Vector3F), + STAND_RL_POS(ARMOR_STAND, 16, Type.Rotation, NewType.Vector3F), // human, discountined? - PLAYER_SKIN_FLAGS(HumanEntity.class, 10, Type.Byte, 12, NewType.Byte), // unsigned on 1.8 - PLAYER_HUMAN_BYTE(HumanEntity.class, 16, Type.Byte, NewType.Discontinued), // unused on 1.8 - PLAYER_ADDITIONAL_HEARTS(HumanEntity.class, 17, Type.Float, 10, NewType.Float), - PLAYER_SCORE(HumanEntity.class, 18, Type.Int, 11, NewType.VarInt), - PLAYER_HAND(HumanEntity.class, -1, Type.NonExistent, 5, NewType.Byte), // new in 1.9 - SOMETHING_ANTICHEAT_PLUGINS_FOR_SOME_REASON_USE(HumanEntity.class, 11, Type.Byte, NewType.Discontinued), //For what we know, This doesn't exists. If you think it exists and knows what it does. Please tell us. + PLAYER_SKIN_FLAGS(ENTITY_HUMAN, 10, Type.Byte, 12, NewType.Byte), // unsigned on 1.8 + PLAYER_HUMAN_BYTE(ENTITY_HUMAN, 16, Type.Byte, NewType.Discontinued), // unused on 1.8 + PLAYER_ADDITIONAL_HEARTS(ENTITY_HUMAN, 17, Type.Float, 10, NewType.Float), + PLAYER_SCORE(ENTITY_HUMAN, 18, Type.Int, 11, NewType.VarInt), + PLAYER_HAND(ENTITY_HUMAN, -1, Type.NonExistent, 5, NewType.Byte), // new in 1.9 + SOMETHING_ANTICHEAT_PLUGINS_FOR_SOME_REASON_USE(ENTITY_HUMAN, 11, Type.Byte, NewType.Discontinued), //For what we know, This doesn't exists. If you think it exists and knows what it does. Please tell us. // horse - HORSE_INFO(Horse.class, 16, Type.Int, 12, NewType.Byte), - HORSE_TYPE(Horse.class, 19, Type.Byte, 13, NewType.VarInt), - HORSE_SUBTYPE(Horse.class, 20, Type.Int, 14, NewType.VarInt), - HORSE_OWNER(Horse.class, 21, Type.String, 15, NewType.OptUUID), - HORSE_ARMOR(Horse.class, 22, Type.Int, 16, NewType.VarInt), + HORSE_INFO(HORSE, 16, Type.Int, 12, NewType.Byte), + HORSE_TYPE(HORSE, 19, Type.Byte, 13, NewType.VarInt), + HORSE_SUBTYPE(HORSE, 20, Type.Int, 14, NewType.VarInt), + HORSE_OWNER(HORSE, 21, Type.String, 15, NewType.OptUUID), + HORSE_ARMOR(HORSE, 22, Type.Int, 16, NewType.VarInt), // bat - BAT_ISHANGING(Bat.class, 16, Type.Byte, 11, NewType.Byte), + BAT_ISHANGING(BAT, 16, Type.Byte, 11, NewType.Byte), // tameable - TAMING_INFO(Tameable.class, 16, Type.Byte, 12, NewType.Byte), - TAMING_OWNER(Tameable.class, 17, Type.String, 13, NewType.OptUUID), + TAMING_INFO(ENTITY_TAMEABLE_ANIMAL, 16, Type.Byte, 12, NewType.Byte), + TAMING_OWNER(ENTITY_TAMEABLE_ANIMAL, 17, Type.String, 13, NewType.OptUUID), // ocelot - OCELOT_TYPE(Ocelot.class, 18, Type.Byte, 14, NewType.VarInt), + OCELOT_TYPE(OCELOT, 18, Type.Byte, 14, NewType.VarInt), // wolf - WOLF_HEALTH(Wolf.class, 18, Type.Float, 14, NewType.Float), - WOLF_BEGGING(Wolf.class, 19, Type.Byte, 15, NewType.Boolean), - WOLF_COLLAR(Wolf.class, 20, Type.Byte, 16, NewType.VarInt), + WOLF_HEALTH(WOLF, 18, Type.Float, 14, NewType.Float), + WOLF_BEGGING(WOLF, 19, Type.Byte, 15, NewType.Boolean), + WOLF_COLLAR(WOLF, 20, Type.Byte, 16, NewType.VarInt), // pig - PIG_SADDLE(Pig.class, 16, Type.Byte, 12, NewType.Boolean), + PIG_SADDLE(PIG, 16, Type.Byte, 12, NewType.Boolean), // rabbit - RABBIT_TYPE(Rabbit.class, 18, Type.Byte, 12, NewType.VarInt), + RABBIT_TYPE(RABBIT, 18, Type.Byte, 12, NewType.VarInt), // sheep - SHEEP_COLOR(Sheep.class, 16, Type.Byte, 12, NewType.Byte), + SHEEP_COLOR(SHEEP, 16, Type.Byte, 12, NewType.Byte), // villager - VILLAGER_PROFESSION(Villager.class, 16, Type.Int, 12, NewType.VarInt), + VILLAGER_PROFESSION(VILLAGER, 16, Type.Int, 12, NewType.VarInt), // enderman - ENDERMAN_BLOCK(Enderman.class, 16, Type.Short, 11, NewType.BlockID), // special case - ENDERMAN_BLOCKDATA(Enderman.class, 17, Type.Byte, 11, NewType.BlockID), // special case - ENDERMAN_ISSCREAMING(Enderman.class, 18, Type.Byte, 12, NewType.Boolean), + ENDERMAN_BLOCK(ENDERMAN, 16, Type.Short, 11, NewType.BlockID), // special case + ENDERMAN_BLOCKDATA(ENDERMAN, 17, Type.Byte, 11, NewType.BlockID), // special case + ENDERMAN_ISSCREAMING(ENDERMAN, 18, Type.Byte, 12, NewType.Boolean), // zombie - ZOMBIE_ISCHILD(Zombie.class, 12, Type.Byte, 11, NewType.Boolean), - ZOMBIE_ISVILLAGER(Zombie.class, 13, Type.Byte, 12, NewType.VarInt), - ZOMBIE_ISCONVERTING(Zombie.class, 14, Type.Byte, 13, NewType.Boolean), + ZOMBIE_ISCHILD(ZOMBIE, 12, Type.Byte, 11, NewType.Boolean), + ZOMBIE_ISVILLAGER(ZOMBIE, 13, Type.Byte, 12, NewType.VarInt), + ZOMBIE_ISCONVERTING(ZOMBIE, 14, Type.Byte, 13, NewType.Boolean), // ZOMBIE_RISINGHANDS added in 1.9 // blaze - BLAZE_ONFIRE(Blaze.class, 16, Type.Byte, 11, NewType.Byte), + BLAZE_ONFIRE(BLAZE, 16, Type.Byte, 11, NewType.Byte), // spider - SPIDER_CIMBING(Spider.class, 16, Type.Byte, 11, NewType.Byte), + SPIDER_CIMBING(SPIDER, 16, Type.Byte, 11, NewType.Byte), // creeper - CREEPER_FUSE(Creeper.class, 16, Type.Byte, 11, NewType.VarInt), // -1 idle, 1 is fuse - CREEPER_ISPOWERED(Creeper.class, 17, Type.Byte, 12, NewType.Boolean), - CREEPER_ISIGNITED(Creeper.class, 18, Type.Byte, 13, NewType.Boolean), + CREEPER_FUSE(CREEPER, 16, Type.Byte, 11, NewType.VarInt), // -1 idle, 1 is fuse + CREEPER_ISPOWERED(CREEPER, 17, Type.Byte, 12, NewType.Boolean), + CREEPER_ISIGNITED(CREEPER, 18, Type.Byte, 13, NewType.Boolean), // ghast - GHAST_ISATTACKING(Ghast.class, 16, Type.Byte, 11, NewType.Boolean), + GHAST_ISATTACKING(GHAST, 16, Type.Byte, 11, NewType.Boolean), // slime - SLIME_SIZE(Slime.class, 16, Type.Byte, 11, NewType.VarInt), + SLIME_SIZE(SLIME, 16, Type.Byte, 11, NewType.VarInt), // skeleton - SKELETON_TYPE(Skeleton.class, 13, Type.Byte, 11, NewType.VarInt), + SKELETON_TYPE(SKELETON, 13, Type.Byte, 11, NewType.VarInt), // witch - WITCH_AGGRO(Witch.class, 21, Type.Byte, 11, NewType.Boolean), + WITCH_AGGRO(WITCH, 21, Type.Byte, 11, NewType.Boolean), // iron golem - IRON_PLAYERMADE(IronGolem.class, 16, Type.Byte, 11, NewType.Byte), + IRON_PLAYERMADE(IRON_GOLEM, 16, Type.Byte, 11, NewType.Byte), // wither - WITHER_TARGET1(Wither.class, 17, Type.Int, 11, NewType.VarInt), - WITHER_TARGET2(Wither.class, 18, Type.Int, 12, NewType.VarInt), - WITHER_TARGET3(Wither.class, 19, Type.Int, 13, NewType.VarInt), - WITHER_INVULN_TIME(Wither.class, 20, Type.Int, 14, NewType.VarInt), - WITHER_PROPERTIES(Wither.class, 10, Type.Byte, NewType.Byte), - WITHER_UNKNOWN(Wither.class, 11, Type.Byte, NewType.Discontinued), + WITHER_TARGET1(WITHER, 17, Type.Int, 11, NewType.VarInt), + WITHER_TARGET2(WITHER, 18, Type.Int, 12, NewType.VarInt), + WITHER_TARGET3(WITHER, 19, Type.Int, 13, NewType.VarInt), + WITHER_INVULN_TIME(WITHER, 20, Type.Int, 14, NewType.VarInt), + WITHER_PROPERTIES(WITHER, 10, Type.Byte, NewType.Byte), + WITHER_UNKNOWN(WITHER, 11, Type.Byte, NewType.Discontinued), // wither skull - WITHERSKULL_INVULN(WitherSkull.class, 10, Type.Byte, 5, NewType.Boolean), + WITHERSKULL_INVULN(WITHER_SKULL, 10, Type.Byte, 5, NewType.Boolean), // guardian - GUARDIAN_INFO(Guardian.class, 16, Type.Int, 11, NewType.Byte), - GUARDIAN_TARGET(Guardian.class, 17, Type.Int, 12, NewType.VarInt), + GUARDIAN_INFO(GUARDIAN, 16, Type.Int, 11, NewType.Byte), + GUARDIAN_TARGET(GUARDIAN, 17, Type.Int, 12, NewType.VarInt), // boat - BOAT_SINCEHIT(Boat.class, 17, Type.Int, 5, NewType.VarInt), - BOAT_FORWARDDIR(Boat.class, 18, Type.Int, 6, NewType.VarInt), - BOAT_DMGTAKEN(Boat.class, 19, Type.Float, 7, NewType.Float), + BOAT_SINCEHIT(BOAT, 17, Type.Int, 5, NewType.VarInt), + BOAT_FORWARDDIR(BOAT, 18, Type.Int, 6, NewType.VarInt), + BOAT_DMGTAKEN(BOAT, 19, Type.Float, 7, NewType.Float), // BOAT_TYPE in 1.9 // minecart - MINECART_SHAKINGPOWER(Minecart.class, 17, Type.Int, 5, NewType.VarInt), - MINECART_SHAKINGDIRECTION(Minecart.class, 18, Type.Int, 6, NewType.VarInt), - MINECART_DAMAGETAKEN(Minecart.class, 19, Type.Float, 7, NewType.Float), // also shaking modifier :P - MINECART_BLOCK(Minecart.class, 20, Type.Int, 8, NewType.VarInt), - MINECART_BLOCK_Y(Minecart.class, 21, Type.Int, 9, NewType.VarInt), - MINECART_SHOWBLOCK(Minecart.class, 22, Type.Byte, 10, NewType.Boolean), + MINECART_SHAKINGPOWER(MINECART_ABSTRACT, 17, Type.Int, 5, NewType.VarInt), + MINECART_SHAKINGDIRECTION(MINECART_ABSTRACT, 18, Type.Int, 6, NewType.VarInt), + MINECART_DAMAGETAKEN(MINECART_ABSTRACT, 19, Type.Float, 7, NewType.Float), // also shaking modifier :P + MINECART_BLOCK(MINECART_ABSTRACT, 20, Type.Int, 8, NewType.VarInt), + MINECART_BLOCK_Y(MINECART_ABSTRACT, 21, Type.Int, 9, NewType.VarInt), + MINECART_SHOWBLOCK(MINECART_ABSTRACT, 22, Type.Byte, 10, NewType.Boolean), // Command minecart (they are still broken) - MINECART_COMMANDBLOCK_COMMAND(Minecart.class, 23, Type.String, 11, NewType.String), - MINECART_COMMANDBLOCK_OUTPUT(Minecart.class, 24, Type.String, 12, NewType.Chat), + MINECART_COMMANDBLOCK_COMMAND(MINECART_ABSTRACT, 23, Type.String, 11, NewType.String), + MINECART_COMMANDBLOCK_OUTPUT(MINECART_ABSTRACT, 24, Type.String, 12, NewType.Chat), // furnace cart - FURNACECART_ISPOWERED(Minecart.class, 16, Type.Byte, 11, NewType.Boolean), + FURNACECART_ISPOWERED(MINECART_ABSTRACT, 16, Type.Byte, 11, NewType.Boolean), // item drop - ITEM_ITEM(Item.class, 10, Type.Slot, 5, NewType.Slot), + ITEM_ITEM(DROPPED_ITEM, 10, Type.Slot, 5, NewType.Slot), // arrow - ARROW_ISCRIT(Arrow.class, 16, Type.Byte, 5, NewType.Byte), + ARROW_ISCRIT(ARROW, 16, Type.Byte, 5, NewType.Byte), // firework - FIREWORK_INFO(Firework.class, 8, Type.Slot, 5, NewType.Slot), + FIREWORK_INFO(FIREWORK, 8, Type.Slot, 5, NewType.Slot), // item frame - ITEMFRAME_ITEM(ItemFrame.class, 8, Type.Slot, 5, NewType.Slot), - ITEMFRAME_ROTATION(ItemFrame.class, 9, Type.Byte, 6, NewType.VarInt), + ITEMFRAME_ITEM(ITEM_FRAME, 8, Type.Slot, 5, NewType.Slot), + ITEMFRAME_ROTATION(ITEM_FRAME, 9, Type.Byte, 6, NewType.VarInt), // ender crystal - ENDERCRYSTAL_HEALTH(EnderCrystal.class, 8, Type.Int, NewType.Discontinued), + ENDERCRYSTAL_HEALTH(ENDER_CRYSTAL, 8, Type.Int, NewType.Discontinued), // Ender dragon boss bar issues - ENDERDRAGON_UNKNOWN(EnderDragon.class, 5, Type.Byte, NewType.Discontinued), - ENDERDRAGON_NAME(EnderDragon.class, 10, Type.String, NewType.Discontinued), + ENDERDRAGON_UNKNOWN(ENDER_DRAGON, 5, Type.Byte, NewType.Discontinued), + ENDERDRAGON_NAME(ENDER_DRAGON, 10, Type.String, NewType.Discontinued), // Normal Ender dragon - ENDERDRAGON_FLAG(EnderDragon.class, 15, Type.Byte, NewType.Discontinued), - ENDERDRAGON_PHASE(EnderDragon.class, 11, Type.Byte, NewType.VarInt); + ENDERDRAGON_FLAG(ENDER_DRAGON, 15, Type.Byte, NewType.Discontinued), + ENDERDRAGON_PHASE(ENDER_DRAGON, 11, Type.Byte, NewType.VarInt); - private Class clazz; + private static final HashMap, MetaIndex> metadataRewrites = new HashMap<>(); + + static { + for (MetaIndex index : MetaIndex.values()) + metadataRewrites.put(new Pair<>(index.getClazz(), index.getIndex()), index); + } + + private EntityUtil.EntityType clazz; private int newIndex; private NewType newType; private Type oldType; private int index; - MetaIndex(Class type, int index, Type oldType, NewType newType) { + MetaIndex(EntityUtil.EntityType type, int index, Type oldType, NewType newType) { this.clazz = type; this.index = index; this.newIndex = index; @@ -148,7 +161,7 @@ public enum MetaIndex { this.newType = newType; } - MetaIndex(Class type, int index, Type oldType, int newIndex, NewType newType) { + MetaIndex(EntityUtil.EntityType type, int index, Type oldType, int newIndex, NewType newType) { this.clazz = type; this.index = index; this.oldType = oldType; @@ -156,37 +169,29 @@ public enum MetaIndex { this.newType = newType; } - public static MetaIndex getIndex(EntityType type, int index) { - Class entityClass = type == null ? LivingEntity.class : type.getEntityClass(); - if (entityClass == null) { - System.out.println("Could not get entity class for " + type); - return null; + private static Optional getIndex(EntityUtil.EntityType type, int index) { + Pair pair = new Pair<>(type, index); + if (metadataRewrites.containsKey(pair)) { + return Optional.of(metadataRewrites.get(pair)); } - for (MetaIndex mi : MetaIndex.values()) { - if (mi.getIndex() == index) { - // To fix issue with armour stands colliding with new values - if (mi.getApplicableClass().equals(LivingEntity.class)) continue; - if ((mi.getApplicableClass().isAssignableFrom(entityClass) || - mi.getApplicableClass().equals(entityClass))) { - return mi; - } + return Optional.absent(); + } + + public static MetaIndex searchIndex(EntityUtil.EntityType type, int index) { + EntityUtil.EntityType currentType = type; + do { + Optional optMeta = getIndex(currentType, index); + + if (optMeta.isPresent()){ + return optMeta.get(); } - } - // fall back to living entity - for (MetaIndex mi : MetaIndex.values()) { - if (mi.getIndex() == index) { - if (mi.getApplicableClass().isAssignableFrom(LivingEntity.class) || - mi.getApplicableClass().equals(LivingEntity.class)) { - return mi; - } - } - } + + currentType = currentType.getParent(); + } while (currentType != null); + return null; } - public Class getApplicableClass() { - return this.clazz; - } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java index 713a9fdaf..6a3ce503d 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java @@ -1,6 +1,5 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata; -import org.bukkit.entity.EntityType; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.minecraft.EulerAngle; import us.myles.ViaVersion.api.minecraft.Vector; @@ -8,17 +7,18 @@ import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; import us.myles.ViaVersion.protocols.protocol1_9to1_8.ItemRewriter; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; +import us.myles.ViaVersion.util.EntityUtil; import java.util.ArrayList; import java.util.List; import java.util.UUID; public class MetadataRewriter { - public static void transform(EntityType type, List list) { + public static void transform(EntityUtil.EntityType type, List list) { short id = -1; int data = -1; for (Metadata entry : new ArrayList<>(list)) { - MetaIndex metaIndex = MetaIndex.getIndex(type, entry.getId()); + MetaIndex metaIndex = MetaIndex.searchIndex(type, entry.getId()); try { if (metaIndex != null) { if (metaIndex.getNewType() != NewType.Discontinued) { @@ -38,7 +38,7 @@ public class MetadataRewriter { entry.setValue(((Integer) value).byteValue()); } // After writing the last one - if (metaIndex == MetaIndex.ENTITY_STATUS && type == EntityType.PLAYER) { + if (metaIndex == MetaIndex.ENTITY_STATUS && type == EntityUtil.EntityType.PLAYER) { Byte val = 0; if ((((Byte) value) & 0x10) == 0x10) { // Player eating/aiming/drinking val = 1; diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/PlayerPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/PlayerPackets.java index f190257bf..7b3455f4c 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/PlayerPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/PlayerPackets.java @@ -2,7 +2,6 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.packets; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import org.bukkit.entity.EntityType; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.minecraft.item.Item; @@ -20,6 +19,7 @@ import us.myles.ViaVersion.protocols.protocol1_9to1_8.chat.ChatRewriter; import us.myles.ViaVersion.protocols.protocol1_9to1_8.chat.GameMode; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.EntityTracker; +import us.myles.ViaVersion.util.EntityUtil; public class PlayerPackets { public static void register(Protocol protocol) { @@ -165,7 +165,7 @@ public class PlayerPackets { public void handle(PacketWrapper wrapper) throws Exception { int entityID = wrapper.get(Type.INT, 0); EntityTracker tracker = wrapper.user().get(EntityTracker.class); - tracker.getClientEntityTypes().put(entityID, EntityType.PLAYER); + tracker.getClientEntityTypes().put(entityID, EntityUtil.EntityType.PLAYER); tracker.setEntityID(entityID); } }); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java index a60e6a9de..d286f2067 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java @@ -1,6 +1,5 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.packets; -import org.bukkit.entity.EntityType; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; @@ -96,7 +95,7 @@ public class SpawnPackets { final int data = wrapper.get(Type.INT, 0); // Data int typeID = wrapper.get(Type.BYTE, 0); - if (EntityUtil.getTypeFromID(typeID, true) == EntityType.SPLASH_POTION) { + if (EntityUtil.getTypeFromID(typeID, true) == EntityUtil.EntityType.SPLASH_POTION) { // Convert this to meta data, woo! PacketWrapper metaPacket = wrapper.create(0x39, new ValueCreator() { @Override @@ -130,7 +129,7 @@ public class SpawnPackets { public void handle(PacketWrapper wrapper) throws Exception { int entityID = wrapper.get(Type.VAR_INT, 0); EntityTracker tracker = wrapper.user().get(EntityTracker.class); - tracker.getClientEntityTypes().put(entityID, EntityType.EXPERIENCE_ORB); + tracker.getClientEntityTypes().put(entityID, EntityUtil.EntityType.EXPERIENCE_ORB); tracker.sendMetadataBuffer(entityID); } }); @@ -156,7 +155,7 @@ public class SpawnPackets { // Currently only lightning uses this int entityID = wrapper.get(Type.VAR_INT, 0); EntityTracker tracker = wrapper.user().get(EntityTracker.class); - tracker.getClientEntityTypes().put(entityID, EntityType.LIGHTNING); + tracker.getClientEntityTypes().put(entityID, EntityUtil.EntityType.LIGHTNING); tracker.sendMetadataBuffer(entityID); } }); @@ -247,7 +246,7 @@ public class SpawnPackets { public void handle(PacketWrapper wrapper) throws Exception { int entityID = wrapper.get(Type.VAR_INT, 0); EntityTracker tracker = wrapper.user().get(EntityTracker.class); - tracker.getClientEntityTypes().put(entityID, EntityType.PAINTING); + tracker.getClientEntityTypes().put(entityID, EntityUtil.EntityType.PAINTING); tracker.sendMetadataBuffer(entityID); } }); @@ -281,7 +280,7 @@ public class SpawnPackets { public void handle(PacketWrapper wrapper) throws Exception { int entityID = wrapper.get(Type.VAR_INT, 0); EntityTracker tracker = wrapper.user().get(EntityTracker.class); - tracker.getClientEntityTypes().put(entityID, EntityType.PLAYER); + tracker.getClientEntityTypes().put(entityID, EntityUtil.EntityType.PLAYER); tracker.sendMetadataBuffer(entityID); } }); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java index 5b9541fbb..6e5cefa07 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java @@ -6,7 +6,6 @@ import com.google.common.collect.Sets; import io.netty.buffer.ByteBuf; import lombok.Getter; import lombok.Setter; -import org.bukkit.entity.EntityType; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.boss.BossBar; @@ -24,6 +23,7 @@ import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; import us.myles.ViaVersion.protocols.protocol1_9to1_8.chat.GameMode; import us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata.MetadataRewriter; import us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata.NewType; +import us.myles.ViaVersion.util.EntityUtil; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -32,7 +32,7 @@ import java.util.concurrent.TimeUnit; @Getter public class EntityTracker extends StoredObject { private final Map uuidMap = new ConcurrentHashMap<>(); - private final Map clientEntityTypes = new ConcurrentHashMap<>(); + private final Map clientEntityTypes = new ConcurrentHashMap<>(); private final Map> metadataBuffer = new ConcurrentHashMap<>(); private final Map vehicleMap = new ConcurrentHashMap<>(); private final Map bossBarMap = new ConcurrentHashMap<>(); @@ -118,37 +118,37 @@ public class EntityTracker extends StoredObject { return; } - EntityType type = clientEntityTypes.get(entityID); + EntityUtil.EntityType type = clientEntityTypes.get(entityID); for (Metadata metadata : new ArrayList<>(metadataList)) { // Fix: wither (crash fix) - if (type == EntityType.WITHER) { + if (type == EntityUtil.EntityType.WITHER) { if (metadata.getId() == 10) { metadataList.remove(metadata); //metadataList.add(new Metadata(10, NewType.Byte.getTypeID(), Type.BYTE, 0)); } } // Fix: enderdragon (crash fix) - if (type == EntityType.ENDER_DRAGON) { + if (type == EntityUtil.EntityType.ENDER_DRAGON) { if (metadata.getId() == 11) { metadataList.remove(metadata); // metadataList.add(new Metadata(11, NewType.Byte.getTypeID(), Type.VAR_INT, 0)); } } - if (type == EntityType.SKELETON) { + if (type == EntityUtil.EntityType.SKELETON) { if ((getMetaByIndex(metadataList, 12)) == null) { metadataList.add(new Metadata(12, NewType.Boolean.getTypeID(), Type.BOOLEAN, true)); } } //ECHOPET Patch - if (type == EntityType.HORSE) { + if (type == EntityUtil.EntityType.HORSE) { // Wrong metadata value from EchoPet, patch since it's discontinued. (https://github.com/DSH105/EchoPet/blob/06947a8b08ce40be9a518c2982af494b3b99d140/modules/API/src/main/java/com/dsh105/echopet/compat/api/entity/HorseArmour.java#L22) if (metadata.getId() == 16 && (int) metadata.getValue() == Integer.MIN_VALUE) metadata.setValue(0); } - if (type == EntityType.PLAYER) { + if (type == EntityUtil.EntityType.PLAYER) { if (metadata.getId() == 0) { // Byte byte data = (byte) metadata.getValue(); @@ -164,7 +164,7 @@ public class EntityTracker extends StoredObject { } } } - if (type == EntityType.ARMOR_STAND && ViaVersion.getConfig().isHologramPatch()) { + if (type == EntityUtil.EntityType.ARMOR_STAND && Via.getConfig().isHologramPatch()) { if (metadata.getId() == 0 && getMetaByIndex(metadataList, 10) != null) { Metadata meta = getMetaByIndex(metadataList, 10); //Only happens if the armorstand is small byte data = (byte) metadata.getValue(); @@ -192,11 +192,11 @@ public class EntityTracker extends StoredObject { UUID uuid = getUser().get(ProtocolInfo.class).getUuid(); // Boss bar if (Via.getConfig().isBossbarPatch()) { - if (type == EntityType.ENDER_DRAGON || type == EntityType.WITHER) { + if (type == EntityUtil.EntityType.ENDER_DRAGON || type == EntityUtil.EntityType.WITHER) { if (metadata.getId() == 2) { BossBar bar = bossBarMap.get(entityID); String title = (String) metadata.getValue(); - title = title.isEmpty() ? (type == EntityType.ENDER_DRAGON ? "Ender Dragon" : "Wither") : title; + title = title.isEmpty() ? (type == EntityUtil.EntityType.ENDER_DRAGON ? "Ender Dragon" : "Wither") : title; if (bar == null) { bar = Via.getAPI().createBossBar(title, BossColor.PINK, BossStyle.SOLID); bossBarMap.put(entityID, bar); @@ -208,10 +208,10 @@ public class EntityTracker extends StoredObject { } else if (metadata.getId() == 6 && !Via.getConfig().isBossbarAntiflicker()) { // If anti flicker is enabled, don't update health BossBar bar = bossBarMap.get(entityID); // Make health range between 0 and 1 - float maxHealth = type == EntityType.ENDER_DRAGON ? 200.0f : 300.0f; + float maxHealth = type == EntityUtil.EntityType.ENDER_DRAGON ? 200.0f : 300.0f; float health = Math.max(0.0f, Math.min(((float) metadata.getValue()) / maxHealth, 1.0f)); if (bar == null) { - String title = type == EntityType.ENDER_DRAGON ? "Ender Dragon" : "Wither"; + String title = type == EntityUtil.EntityType.ENDER_DRAGON ? "Ender Dragon" : "Wither"; bar = Via.getAPI().createBossBar(title, health, BossColor.PINK, BossStyle.SOLID); bossBarMap.put(entityID, bar); bar.addPlayer(uuid); diff --git a/common/src/main/java/us/myles/ViaVersion/util/EntityUtil.java b/common/src/main/java/us/myles/ViaVersion/util/EntityUtil.java index 696f8a576..d1a3075dd 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/EntityUtil.java +++ b/common/src/main/java/us/myles/ViaVersion/util/EntityUtil.java @@ -1,92 +1,186 @@ package us.myles.ViaVersion.util; -import org.bukkit.entity.EntityType; +import com.google.common.base.Optional; +import lombok.AllArgsConstructor; +import lombok.Getter; +import us.myles.ViaVersion.api.Via; public class EntityUtil { public static EntityType getTypeFromID(int typeID, boolean isObject) { - if (isObject) { - return getObjectFromID(typeID); - } else { - return EntityType.fromId(typeID); + Optional type; + + if (isObject) + type = PCObjectTypes.getPCEntity(typeID); + else + type = EntityType.findById(typeID); + + if (!type.isPresent()) { + Via.getPlatform().getLogger().severe("Could not find type id " + typeID + " isObject=" + isObject); + return EntityType.ENTITY; // Fall back to the basic ENTITY + } + + return type.get(); + } + + @AllArgsConstructor + @Getter + public enum EntityType { + ENTITY(-1), + DROPPED_ITEM(1, EntityType.ENTITY), + EXPERIENCE_ORB(2, EntityType.ENTITY), + LEASH_HITCH(8, EntityType.ENTITY), // Actually entity hanging but it doesn't make a lot of difference for metadata + PAINTING(9, EntityType.ENTITY), // Actually entity hanging but it doesn't make a lot of difference for metadata + ARROW(10, EntityType.ENTITY), + SNOWBALL(11, EntityType.ENTITY), // Actually EntityProjectile + FIREBALL(12, EntityType.ENTITY), + SMALL_FIREBALL(13, EntityType.ENTITY), + ENDER_PEARL(14, EntityType.ENTITY), // Actually EntityProjectile + ENDER_SIGNAL(15, EntityType.ENTITY), + THROWN_EXP_BOTTLE(17, EntityType.ENTITY), + ITEM_FRAME(18, EntityType.ENTITY), // Actually EntityHanging + WITHER_SKULL(19, EntityType.ENTITY), + PRIMED_TNT(20, EntityType.ENTITY), + FALLING_BLOCK(21, EntityType.ENTITY), + FIREWORK(22, EntityType.ENTITY), + TIPPED_ARROW(23, EntityType.ARROW), + SPECTRAL_ARROW(24, EntityType.ARROW), + SHULKER_BULLET(25, EntityType.ENTITY), + DRAGON_FIREBALL(26, EntityType.FIREBALL), + + ENTITY_LIVING(-1, ENTITY), + ENTITY_INSENTIENT(-1, ENTITY_LIVING), + ENTITY_AGEABLE(-1, ENTITY_INSENTIENT), + ENTITY_TAMEABLE_ANIMAL(-1, ENTITY_AGEABLE), + ENTITY_HUMAN(-1, ENTITY_LIVING), + + ARMOR_STAND(30, EntityType.ENTITY_LIVING), + + // Vehicles + MINECART_ABSTRACT(-1, ENTITY), + MINECART_COMMAND(40, MINECART_ABSTRACT), + BOAT(41, ENTITY), + MINECART_RIDEABLE(42, MINECART_ABSTRACT), + MINECART_CHEST(43, MINECART_ABSTRACT), + MINECART_FURNACE(44, MINECART_ABSTRACT), + MINECART_TNT(45, MINECART_ABSTRACT), + MINECART_HOPPER(46, MINECART_ABSTRACT), + MINECART_MOB_SPAWNER(47, MINECART_ABSTRACT), + + CREEPER(50, ENTITY_INSENTIENT), + SKELETON(51, ENTITY_INSENTIENT), + SPIDER(52, ENTITY_INSENTIENT), + GIANT(53, ENTITY_INSENTIENT), + ZOMBIE(54, ENTITY_INSENTIENT), + SLIME(55, ENTITY_INSENTIENT), + GHAST(56, ENTITY_INSENTIENT), + PIG_ZOMBIE(57, ZOMBIE), + ENDERMAN(58, ENTITY_INSENTIENT), + CAVE_SPIDER(59, SPIDER), + SILVERFISH(60, ENTITY_INSENTIENT), + BLAZE(61, ENTITY_INSENTIENT), + MAGMA_CUBE(62, SLIME), + ENDER_DRAGON(63, ENTITY_INSENTIENT), + WITHER(64, ENTITY_INSENTIENT), + BAT(65, ENTITY_INSENTIENT), + WITCH(66, ENTITY_INSENTIENT), + ENDERMITE(67, ENTITY_INSENTIENT), + GUARDIAN(68, ENTITY_INSENTIENT), + IRON_GOLEM(99, ENTITY_INSENTIENT), // moved up to avoid illegal forward references + SHULKER(69, EntityType.IRON_GOLEM), + PIG(90, ENTITY_AGEABLE), + SHEEP(91, ENTITY_AGEABLE), + COW(92, ENTITY_AGEABLE), + CHICKEN(93, ENTITY_AGEABLE), + SQUID(94, ENTITY_INSENTIENT), + WOLF(95, ENTITY_TAMEABLE_ANIMAL), + MUSHROOM_COW(96, COW), + SNOWMAN(97, EntityType.IRON_GOLEM), + OCELOT(98, ENTITY_TAMEABLE_ANIMAL), + HORSE(100, ENTITY_AGEABLE), + RABBIT(101, ENTITY_AGEABLE), + POLAR_BEAR(102, ENTITY_AGEABLE), + VILLAGER(120, ENTITY_AGEABLE), + ENDER_CRYSTAL(200, ENTITY), + SPLASH_POTION(-1, ENTITY), + LINGERING_POTION(-1, SPLASH_POTION), + AREA_EFFECT_CLOUD(-1, ENTITY), + EGG(-1, ENTITY), + FISHING_HOOK(-1, ENTITY), + LIGHTNING(-1, ENTITY), + WEATHER(-1, ENTITY), + PLAYER(-1, ENTITY_HUMAN), + COMPLEX_PART(-1, ENTITY); + + private final int id; + private final EntityType parent; + + EntityType(int id) { + this.id = id; + this.parent = null; + } + + public static Optional findById(int id) { + if (id == -1) // Check if this is called + return Optional.absent(); + + for (EntityType ent : EntityType.values()) + if (ent.getId() == id) + return Optional.of(ent); + + return Optional.absent(); } } - // based on http://wiki.vg/index.php?title=Entities - public static EntityType getObjectFromID(int objectID) { - EntityType type; - switch (objectID) { - case 2: - type = EntityType.DROPPED_ITEM; - break; - case 77: - type = EntityType.LEASH_HITCH; - break; - case 60: - type = EntityType.ARROW; - break; - case 61: - type = EntityType.SNOWBALL; - break; - case 63: - type = EntityType.FIREBALL; - break; - case 64: - type = EntityType.SMALL_FIREBALL; - break; - case 65: - type = EntityType.ENDER_PEARL; - break; - case 72: - type = EntityType.ENDER_SIGNAL; - break; - case 75: - type = EntityType.THROWN_EXP_BOTTLE; - break; - case 71: - type = EntityType.ITEM_FRAME; - break; - case 66: - type = EntityType.WITHER_SKULL; - break; - case 50: - type = EntityType.PRIMED_TNT; - break; - case 70: - type = EntityType.FALLING_BLOCK; - break; - case 76: - type = EntityType.FIREWORK; - break; - case 78: - type = EntityType.ARMOR_STAND; - break; - case 1: - type = EntityType.BOAT; - break; - case 10: - type = EntityType.MINECART; - break; - case 51: - type = EntityType.ENDER_CRYSTAL; - break; - case 73: - type = EntityType.SPLASH_POTION; - break; - case 62: - type = EntityType.EGG; - break; - case 90: - type = EntityType.FISHING_HOOK; - break; - default: - type = EntityType.fromId(objectID); - if (type == null) { - System.out.println("Unable to find entity type for " + objectID); - type = EntityType.UNKNOWN; - } - break; + @AllArgsConstructor + @Getter + public enum PCObjectTypes { + BOAT(1, EntityType.BOAT), + ITEM(2, EntityType.DROPPED_ITEM), + AREA_EFFECT_CLOUD(3, EntityType.AREA_EFFECT_CLOUD), + MINECART(10, EntityType.MINECART_ABSTRACT), + TNT_PRIMED(50, EntityType.PRIMED_TNT), + ENDER_CRYSTAL(51, EntityType.ENDER_CRYSTAL), + TIPPED_ARROW(60, EntityType.TIPPED_ARROW), + SNOWBALL(61, EntityType.SNOWBALL), + EGG(62, EntityType.EGG), + FIREBALL(63, EntityType.FIREBALL), + SMALL_FIREBALL(64, EntityType.SMALL_FIREBALL), + ENDER_PEARL(65, EntityType.ENDER_PEARL), + WITHER_SKULL(66, EntityType.WITHER_SKULL), + SHULKER_BULLET(67, EntityType.SHULKER_BULLET), + FALLING_BLOCK(70, EntityType.FALLING_BLOCK), + ITEM_FRAME(71, EntityType.ITEM_FRAME), + ENDER_SIGNAL(72, EntityType.ENDER_SIGNAL), + POTION(73, EntityType.SPLASH_POTION), + THROWN_EXP_BOTTLE(75, EntityType.THROWN_EXP_BOTTLE), + FIREWORK(76, EntityType.FIREWORK), + LEASH(77, EntityType.LEASH_HITCH), + ARMOR_STAND(78, EntityType.ARMOR_STAND), + FISHIHNG_HOOK(90, EntityType.FISHING_HOOK), + SPECTRAL_ARROW(91, EntityType.SPECTRAL_ARROW), + DRAGON_FIREBALL(93, EntityType.DRAGON_FIREBALL); + + private final int id; + private final EntityType type; + + public static Optional findById(int id) { + if (id == -1) + return Optional.absent(); + + for (PCObjectTypes ent : PCObjectTypes.values()) + if (ent.getId() == id) + return Optional.of(ent); + + return Optional.absent(); + } + + public static Optional getPCEntity(int id) { + Optional output = findById(id); + + if (!output.isPresent()) + return Optional.absent(); + return Optional.of(output.get().getType()); } - return type; } } From d3f5ebdba78f35bc5f7e1ad328d475643dc6c44c Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 25 Sep 2016 18:52:37 +0100 Subject: [PATCH 13/76] Update TODO --- TODOLIST | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/TODOLIST b/TODOLIST index dd14be8a3..cc3daf07b 100644 --- a/TODOLIST +++ b/TODOLIST @@ -1,11 +1,7 @@ Fix 1.9to1.8 -Migrate listeners in BaseProtocol -Register Listeners Properly Fix commands Handle injector errors Add new info to dump for platform Migrate Bukkit types to our own :D -Important: Create builder for ViaManager which allows supplying on the command exectutor, injector, platform :D - -Important: Add BukkitViaLoader to ViaManager sequence \ No newline at end of file +Important: Create builder for ViaManager which allows supplying on the command exectutor, injector, platform :D \ No newline at end of file From 30d477c6d226ac26067371ef55090101c81f8d68 Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 25 Sep 2016 19:34:24 +0100 Subject: [PATCH 14/76] Add Bulk Chunks, need to do full packet reading as a fallback though --- .../bukkit/BukkitViaBulkChunkTranslator.java | 80 +++++++++++++++++++ .../ViaVersion/bukkit/BukkitViaLoader.java | 4 + .../protocol1_9to1_8/Protocol1_9TO1_8.java | 4 + .../packets/WorldPackets.java | 24 ++++++ .../BulkChunkTranslatorProvider.java | 17 ++++ .../storage/ClientChunks.java | 66 +-------------- 6 files changed, 132 insertions(+), 63 deletions(-) create mode 100644 bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaBulkChunkTranslator.java create mode 100644 common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaBulkChunkTranslator.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaBulkChunkTranslator.java new file mode 100644 index 000000000..66b6ab226 --- /dev/null +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaBulkChunkTranslator.java @@ -0,0 +1,80 @@ +package us.myles.ViaVersion.bukkit; + +import com.google.common.collect.Lists; +import us.myles.ViaVersion.ViaVersionPlugin; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks; +import us.myles.ViaVersion.util.ReflectionUtil; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.logging.Level; + +public class BukkitViaBulkChunkTranslator extends BulkChunkTranslatorProvider { + // Reflection + private static ReflectionUtil.ClassReflection mapChunkBulkRef; + private static ReflectionUtil.ClassReflection mapChunkRef; + private static Method obfuscateRef; + + static { + try { + // TODO: Abstract this ? + mapChunkBulkRef = new ReflectionUtil.ClassReflection(ReflectionUtil.nms("PacketPlayOutMapChunkBulk")); + mapChunkRef = new ReflectionUtil.ClassReflection(ReflectionUtil.nms("PacketPlayOutMapChunk")); + if (((ViaVersionPlugin) Via.getPlatform()).isSpigot()) { + obfuscateRef = Class.forName("org.spigotmc.AntiXray").getMethod("obfuscate", int.class, int.class, int.class, byte[].class, ReflectionUtil.nms("World")); + } + } catch (Exception e) { + Via.getPlatform().getLogger().log(Level.WARNING, "Failed to initialise chunks reflection", e); + } + } + + @Override + public List transformMapChunkBulk(Object packet, ClientChunks clientChunks) { + List list = Lists.newArrayList(); + try { + int[] xcoords = mapChunkBulkRef.getFieldValue("a", packet, int[].class); + int[] zcoords = mapChunkBulkRef.getFieldValue("b", packet, int[].class); + Object[] chunkMaps = mapChunkBulkRef.getFieldValue("c", packet, Object[].class); + + if (Via.getConfig().isAntiXRay() && ((ViaVersionPlugin) Via.getPlatform()).isSpigot()) { //Spigot anti-xray patch + try { + Object world = mapChunkBulkRef.getFieldValue("world", packet, Object.class); + + for (int i = 0; i < xcoords.length; ++i) { + Object spigotConfig = ReflectionUtil.getPublic(world, "spigotConfig", Object.class); + Object antiXrayInstance = ReflectionUtil.getPublic(spigotConfig, "antiXrayInstance", Object.class); + + Object b = ReflectionUtil.get(chunkMaps[i], "b", Object.class); + Object a = ReflectionUtil.get(chunkMaps[i], "a", Object.class); + + obfuscateRef.invoke(antiXrayInstance, xcoords[i], zcoords[i], b, a, world); + } + } catch (Exception e) { + // not spigot, or it failed. + } + } + for (int i = 0; i < chunkMaps.length; i++) { + int x = xcoords[i]; + int z = zcoords[i]; + Object chunkMap = chunkMaps[i]; + Object chunkPacket = mapChunkRef.newInstance(); + mapChunkRef.setFieldValue("a", chunkPacket, x); + mapChunkRef.setFieldValue("b", chunkPacket, z); + mapChunkRef.setFieldValue("c", chunkPacket, chunkMap); + mapChunkRef.setFieldValue("d", chunkPacket, true); // Chunk bulk chunks are always ground-up + clientChunks.getBulkChunks().add(ClientChunks.toLong(x, z)); // Store for later + list.add(chunkPacket); + } + } catch (Exception e) { + Via.getPlatform().getLogger().log(Level.WARNING, "Failed to transform chunks bulk", e); + } + return list; + } + + @Override + public boolean isEnabled() { + return true; + } +} diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java index 48e76ed00..9c6e7bf7b 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java @@ -14,7 +14,9 @@ import us.myles.ViaVersion.listeners.UpdateListener; import us.myles.ViaVersion.listeners.protocol1_9to1_8.*; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.protocol1_9to1_8.ViaIdleThread; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.HandItemProvider; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; import java.util.UUID; import java.util.concurrent.Callable; @@ -56,6 +58,8 @@ public class BukkitViaLoader implements ViaPlatformLoader { } /* Providers */ + Via.getManager().getProviders().use(BulkChunkTranslatorProvider.class, new BukkitViaBulkChunkTranslator()); + Via.getManager().getProviders().use(MovementTransmitterProvider.class, new BukkitViaMovementTransmitter()); Via.getManager().getProviders().use(HandItemProvider.class, new HandItemProvider() { @Override public Item getHandItem(final UserConnection info) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java index 3a14a4340..8926966ff 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java @@ -15,6 +15,7 @@ import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.api.type.types.version.Metadata1_8Type; import us.myles.ViaVersion.api.type.types.version.MetadataList1_8Type; import us.myles.ViaVersion.protocols.protocol1_9to1_8.packets.*; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.HandItemProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.*; @@ -81,6 +82,7 @@ public class Protocol1_9TO1_8 extends Protocol { @Override protected void register(ViaProviders providers) { providers.register(HandItemProvider.class, new HandItemProvider()); + providers.register(BulkChunkTranslatorProvider.class, new BulkChunkTranslatorProvider()); providers.require(MovementTransmitterProvider.class); if (Via.getConfig().isStimulatePlayerTick()) { Via.getPlatform().runRepeatingSync(new ViaIdleThread(), 1L); @@ -89,6 +91,8 @@ public class Protocol1_9TO1_8 extends Protocol { @Override public boolean isFiltered(Class packetClass) { + if (!Via.getManager().getProviders().get(BulkChunkTranslatorProvider.class).isEnabled()) + return false; return packetClass.getName().endsWith("PacketPlayOutMapChunkBulk"); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java index 45c6d8117..8139ce841 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java @@ -125,6 +125,30 @@ public class WorldPackets { } }); + // Bulk Chunk Packet + protocol.registerOutgoing(State.PLAY, 0x26, -1, new PacketRemapper() { + @Override + public void registerMap() { + handler(new PacketHandler() { + @Override + public void handle(PacketWrapper wrapper) throws Exception { +// ClientChunks clientChunks = wrapper.user().get(ClientChunks.class); +// Chunk1_9to1_8 chunk = (Chunk1_9to1_8) wrapper.passthrough(new ChunkType(clientChunks)); +// if (chunk.isUnloadPacket()) +// wrapper.setId(0x1D); +// +// // eat any other data (Usually happens with unload packets) +// wrapper.read(Type.REMAINING_BYTES); + // TODO: Implement Bulk Chunks + // Boolean + // Column Count + + wrapper.cancel(); + } + }); + } + }); + // Update Block Entity Packet protocol.registerOutgoing(State.PLAY, 0x35, 0x09, new PacketRemapper() { @Override diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java new file mode 100644 index 000000000..c84698fdb --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java @@ -0,0 +1,17 @@ +package us.myles.ViaVersion.protocols.protocol1_9to1_8.providers; + +import us.myles.ViaVersion.api.platform.providers.Provider; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks; + +import java.util.Arrays; +import java.util.List; + +public class BulkChunkTranslatorProvider implements Provider { + public List transformMapChunkBulk(Object packet, ClientChunks clientChunks) { + return Arrays.asList(packet); + } + + public boolean isEnabled() { + return false; + } +} diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java index 8573aa70b..67c7fe36d 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java @@ -1,40 +1,18 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.storage; -import com.google.common.collect.Lists; import com.google.common.collect.Sets; import lombok.Getter; import us.myles.ViaVersion.api.Via; -import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.data.StoredObject; import us.myles.ViaVersion.api.data.UserConnection; -import us.myles.ViaVersion.util.ReflectionUtil; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider; -import java.lang.reflect.Method; import java.util.List; import java.util.Set; -import java.util.logging.Level; @Getter public class ClientChunks extends StoredObject { - // Reflection - private static ReflectionUtil.ClassReflection mapChunkBulkRef; - private static ReflectionUtil.ClassReflection mapChunkRef; - private static Method obfuscateRef; - private static Class worldRef; - static { - try { - // TODO: Abstract this ? - mapChunkBulkRef = new ReflectionUtil.ClassReflection(ReflectionUtil.nms("PacketPlayOutMapChunkBulk")); - mapChunkRef = new ReflectionUtil.ClassReflection(ReflectionUtil.nms("PacketPlayOutMapChunk")); - if (ViaVersion.getInstance().isSpigot()) { - obfuscateRef = Class.forName("org.spigotmc.AntiXray").getMethod("obfuscate", int.class, int.class, int.class, byte[].class, ReflectionUtil.nms("World")); - worldRef = ReflectionUtil.nms("World"); - } - } catch (Exception e) { - Via.getPlatform().getLogger().log(Level.WARNING, "Failed to initialise chunks reflection", e); - } - } private final Set loadedChunks = Sets.newConcurrentHashSet(); private final Set bulkChunks = Sets.newConcurrentHashSet(); @@ -43,49 +21,11 @@ public class ClientChunks extends StoredObject { super(user); } - private static long toLong(int msw, int lsw) { + public static long toLong(int msw, int lsw) { return ((long) msw << 32) + lsw - -2147483648L; } public List transformMapChunkBulk(Object packet) { - List list = Lists.newArrayList(); - try { - int[] xcoords = mapChunkBulkRef.getFieldValue("a", packet, int[].class); - int[] zcoords = mapChunkBulkRef.getFieldValue("b", packet, int[].class); - Object[] chunkMaps = mapChunkBulkRef.getFieldValue("c", packet, Object[].class); - - if (Via.getConfig().isAntiXRay() && Via.getInstance().isSpigot()) { //Spigot anti-xray patch - try { - Object world = mapChunkBulkRef.getFieldValue("world", packet, Object.class); - - for (int i = 0; i < xcoords.length; ++i) { - Object spigotConfig = ReflectionUtil.getPublic(world, "spigotConfig", Object.class); - Object antiXrayInstance = ReflectionUtil.getPublic(spigotConfig, "antiXrayInstance", Object.class); - - Object b = ReflectionUtil.get(chunkMaps[i], "b", Object.class); - Object a = ReflectionUtil.get(chunkMaps[i], "a", Object.class); - - obfuscateRef.invoke(antiXrayInstance, xcoords[i], zcoords[i], b, a, world); - } - } catch (Exception e) { - // not spigot, or it failed. - } - } - for (int i = 0; i < chunkMaps.length; i++) { - int x = xcoords[i]; - int z = zcoords[i]; - Object chunkMap = chunkMaps[i]; - Object chunkPacket = mapChunkRef.newInstance(); - mapChunkRef.setFieldValue("a", chunkPacket, x); - mapChunkRef.setFieldValue("b", chunkPacket, z); - mapChunkRef.setFieldValue("c", chunkPacket, chunkMap); - mapChunkRef.setFieldValue("d", chunkPacket, true); // Chunk bulk chunks are always ground-up - bulkChunks.add(toLong(x, z)); // Store for later - list.add(chunkPacket); - } - } catch (Exception e) { - Via.getPlatform().getLogger().log(Level.WARNING, "Failed to transform chunks bulk", e); - } - return list; + return Via.getManager().getProviders().get(BulkChunkTranslatorProvider.class).transformMapChunkBulk(packet, this); } } From 79d353d458fe9a07cfcf590b925cd50f8b0fe4b9 Mon Sep 17 00:00:00 2001 From: Matsv Date: Sun, 25 Sep 2016 20:41:34 +0200 Subject: [PATCH 15/76] Basic configuration api and add platform specific dump info --- .../java/us/myles/ViaVersion/ViaConfig.java | 19 +++++++- .../us/myles/ViaVersion/ViaVersionPlugin.java | 45 ++++++++++++++++--- .../ViaVersion/api/ViaVersionConfig.java | 5 --- .../configuration/ConfigurationProvider.java | 26 +++++++++++ .../ViaVersion/api/platform/ViaPlatform.java | 35 +++++++++------ .../commands/defaultsubs/AutoTeamSubCmd.java | 11 +++-- .../commands/defaultsubs/DontBugMeSubCmd.java | 13 +++--- .../commands/defaultsubs/DumpSubCmd.java | 21 +++++---- .../commands/defaultsubs/ReloadSubCmd.java | 2 +- .../myles/ViaVersion/dump/DumpTemplate.java | 3 +- .../us/myles/ViaVersion/dump/VersionInfo.java | 4 +- 11 files changed, 132 insertions(+), 52 deletions(-) create mode 100644 common/src/main/java/us/myles/ViaVersion/api/configuration/ConfigurationProvider.java diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaConfig.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaConfig.java index 35f2aab4e..d3b30aa63 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaConfig.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaConfig.java @@ -1,12 +1,14 @@ package us.myles.ViaVersion; import us.myles.ViaVersion.api.ViaVersionConfig; +import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import us.myles.ViaVersion.util.Configuration; import java.io.File; import java.util.List; +import java.util.Map; -public class ViaConfig implements ViaVersionConfig { +public class ViaConfig implements ViaVersionConfig, ConfigurationProvider { private final ViaVersionPlugin plugin; public ViaConfig(ViaVersionPlugin plugin) { @@ -185,4 +187,19 @@ public class ViaConfig implements ViaVersionConfig { public String getReloadDisconnectMsg() { return plugin.getConfig().getString("reload-disconnect-msg", "Server reload, please rejoin!"); } + + @Override + public void set(String path, Object value) { + plugin.getConfig().set(path, value); + } + + @Override + public void saveConfig() { + plugin.saveConfig(); + } + + @Override + public Map getValues() { + return plugin.getConfig().getValues(false); + } } diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 0e4bde244..f935b0107 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -1,14 +1,18 @@ package us.myles.ViaVersion; +import com.google.gson.Gson; +import com.google.gson.JsonObject; import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaAPI; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.command.ViaCommandSender; +import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; @@ -17,8 +21,11 @@ import us.myles.ViaVersion.bukkit.BukkitCommandSender; import us.myles.ViaVersion.bukkit.BukkitViaAPI; import us.myles.ViaVersion.bukkit.BukkitViaInjector; import us.myles.ViaVersion.classgenerator.ClassGenerator; +import us.myles.ViaVersion.dump.PluginInfo; import us.myles.ViaVersion.util.ReflectionUtil; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; import java.util.concurrent.Callable; import java.util.concurrent.Future; @@ -89,7 +96,6 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { Via.getManager().init(); } - getCommand("viaversion").setExecutor(commandHandler = new BukkitCommandHandler()); getCommand("viaversion").setTabCompleter(commandHandler); @@ -177,13 +183,23 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { } @Override - public void runAsync(Runnable runnable) { - getServer().getScheduler().runTaskAsynchronously(this, runnable); + public int runAsync(Runnable runnable) { + return getServer().getScheduler().runTaskAsynchronously(this, runnable).getTaskId(); } @Override - public void runSync(Runnable runnable) { - getServer().getScheduler().runTask(this, runnable); + public int runSync(Runnable runnable) { + return getServer().getScheduler().runTask(this, runnable).getTaskId(); + } + + @Override + public int runRepeatingSync(Runnable runnable, Long ticks) { + return getServer().getScheduler().runTaskTimer(this, runnable, ticks, 0).getTaskId(); // TODO or the other way around? + } + + @Override + public void cancelTask(int taskId) { + getServer().getScheduler().cancelTask(taskId); } @Override @@ -220,6 +236,11 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { return Bukkit.getPluginManager().getPlugin("ViaVersion").isEnabled(); } + @Override + public ConfigurationProvider getConfigurationProvider() { + return conf; + } + @Override public void onReload() { if (Bukkit.getPluginManager().getPlugin("ProtocolLib") != null) { @@ -232,4 +253,18 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { getLogger().severe("ViaVersion is already loaded, this should work fine. If you get any console errors, try rebooting."); } } + + @Override + public JsonObject getDump() { + JsonObject platformSpecific = new JsonObject(); + + List plugins = new ArrayList<>(); + for (Plugin p : Bukkit.getPluginManager().getPlugins()) + plugins.add(new PluginInfo(p.isEnabled(), p.getDescription().getName(), p.getDescription().getVersion(), p.getDescription().getMain(), p.getDescription().getAuthors())); + + platformSpecific.add("plugins", new Gson().toJsonTree(plugins)); + // TODO more? ProtocolLib things etc? + + return platformSpecific; + } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java b/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java index 365392cd3..ac8c1d1cd 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java +++ b/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java @@ -217,9 +217,4 @@ public interface ViaVersionConfig { * @return Disconnect message */ String getReloadDisconnectMsg(); - - /** - * Reloads the config from disk - */ - void reloadConfig(); } diff --git a/common/src/main/java/us/myles/ViaVersion/api/configuration/ConfigurationProvider.java b/common/src/main/java/us/myles/ViaVersion/api/configuration/ConfigurationProvider.java new file mode 100644 index 000000000..5a1457e60 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/configuration/ConfigurationProvider.java @@ -0,0 +1,26 @@ +package us.myles.ViaVersion.api.configuration; + +import java.util.Map; + +public interface ConfigurationProvider { + + /** + * Sets the specified path to the given value. + * + * @param path Path of the object to set. + * @param value New value to set the path to + */ + void set(String path, Object value); + + /** + * Saves the config + */ + void saveConfig(); + + /** + * Get all the configuration values + * + * @return Map with key->values + */ + Map getValues(); +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java index 59ad00051..5ab61b11f 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java @@ -1,8 +1,11 @@ package us.myles.ViaVersion.api.platform; +import com.google.gson.JsonObject; +import jdk.nashorn.internal.runtime.regexp.joni.Config; import us.myles.ViaVersion.api.ViaAPI; import us.myles.ViaVersion.api.ViaVersionConfig; import us.myles.ViaVersion.api.command.ViaCommandSender; +import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import java.util.UUID; import java.util.logging.Logger; @@ -13,29 +16,35 @@ import java.util.logging.Logger; * @param - The player type for the platform, used for API related methods */ public interface ViaPlatform { - public Logger getLogger(); + Logger getLogger(); - public String getPlatformName(); + String getPlatformName(); - public String getPluginVersion(); + String getPluginVersion(); - public void runAsync(Runnable runnable); + int runAsync(Runnable runnable); - public void runSync(Runnable runnable); + int runSync(Runnable runnable); - public void runRepeatingSync(Runnable runnable, Long ticks); + int runRepeatingSync(Runnable runnable, Long ticks); - public ViaCommandSender[] getOnlinePlayers(); + void cancelTask(int taskId); - public void sendMessage(UUID uuid, String message); + ViaCommandSender[] getOnlinePlayers(); - public boolean kickPlayer(UUID uuid, String message); + void sendMessage(UUID uuid, String message); - public boolean isPluginEnabled(); + boolean kickPlayer(UUID uuid, String message); - public ViaAPI getApi(); + boolean isPluginEnabled(); - public ViaVersionConfig getConf(); + ViaAPI getApi(); - public void onReload(); + ViaVersionConfig getConf(); + + ConfigurationProvider getConfigurationProvider(); + + void onReload(); + + JsonObject getDump(); } diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/AutoTeamSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/AutoTeamSubCmd.java index e495f1cb4..eeecc9188 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/AutoTeamSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/AutoTeamSubCmd.java @@ -1,10 +1,9 @@ package us.myles.ViaVersion.commands.defaultsubs; -import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.Via; -import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; +import us.myles.ViaVersion.api.configuration.ConfigurationProvider; public class AutoTeamSubCmd extends ViaSubCommand { @Override @@ -19,11 +18,11 @@ public class AutoTeamSubCmd extends ViaSubCommand { @Override public boolean execute(ViaCommandSender sender, String[] args) { - ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); - + ConfigurationProvider provider = Via.getPlatform().getConfigurationProvider(); boolean newValue = !Via.getConfig().isAutoTeam(); - plugin.getConfig().set("auto-team", newValue); - plugin.saveConfig(); + + provider.set("auto-team", newValue); + provider.saveConfig(); sendMessage(sender, "&6We will %s", (newValue ? "&aautomatically team players" : "&cno longer auto team players")); sendMessage(sender, "&6All players will need to re-login for the change to take place."); diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DontBugMeSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DontBugMeSubCmd.java index b35ecf382..95d92d27d 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DontBugMeSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DontBugMeSubCmd.java @@ -1,10 +1,9 @@ package us.myles.ViaVersion.commands.defaultsubs; -import org.bukkit.command.CommandSender; -import us.myles.ViaVersion.ViaVersionPlugin; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; +import us.myles.ViaVersion.api.configuration.ConfigurationProvider; public class DontBugMeSubCmd extends ViaSubCommand { @Override @@ -19,11 +18,11 @@ public class DontBugMeSubCmd extends ViaSubCommand { @Override public boolean execute(ViaCommandSender sender, String[] args) { - ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); + ConfigurationProvider provider = Via.getPlatform().getConfigurationProvider(); + boolean newValue = !Via.getConfig().isCheckForUpdates(); - boolean newValue = !ViaVersion.getConfig().isCheckForUpdates(); - plugin.getConfig().set("checkforupdates", newValue); - plugin.saveConfig(); + provider.set("checkforupdates", newValue); + provider.saveConfig(); sendMessage(sender, "&6We will %snotify you about updates.", (newValue ? "&a" : "&cnot ")); return true; diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java index eaa45d65a..0b90c8c52 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java @@ -3,6 +3,8 @@ package us.myles.ViaVersion.commands.defaultsubs; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; +import net.md_5.bungee.api.ChatColor; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; @@ -37,22 +39,19 @@ public class DumpSubCmd extends ViaSubCommand { @Override public boolean execute(final ViaCommandSender sender, String[] args) { VersionInfo version = new VersionInfo( - Bukkit.getServer().getVersion(), - Bukkit.getServer().getBukkitVersion(), System.getProperty("java.version"), System.getProperty("os.name"), ProtocolRegistry.SERVER_PROTOCOL, - ProtocolRegistry.getSupportedVersions()); + ProtocolRegistry.getSupportedVersions(), + Via.getPlatform().getPlatformName(), + Via.getPlatform().getPluginVersion() + ); - List plugins = new ArrayList<>(); - for (Plugin p : Bukkit.getPluginManager().getPlugins()) - plugins.add(new PluginInfo(p.isEnabled(), p.getDescription().getName(), p.getDescription().getVersion(), p.getDescription().getMain(), p.getDescription().getAuthors())); + Map configuration = Via.getPlatform().getConfigurationProvider().getValues(); - Map configuration = ((ViaVersionPlugin) ViaVersion.getInstance()).getConfig().getValues(false); + final DumpTemplate template = new DumpTemplate(version, configuration, Via.getPlatform().getDump()); - final DumpTemplate template = new DumpTemplate(version, configuration, plugins); - - Bukkit.getScheduler().runTaskAsynchronously((ViaVersionPlugin) ViaVersion.getInstance(), new Runnable() { + Via.getPlatform().runAsync(new Runnable() { @Override public void run() { try { @@ -75,7 +74,7 @@ public class DumpSubCmd extends ViaSubCommand { sender.sendMessage(ChatColor.GREEN + "We've made a dump with useful information, report your issue and provide this url: " + getUrl(output.get("key").getAsString())); } catch (Exception e) { sender.sendMessage(ChatColor.RED + "Failed to dump, please check the console for more information"); - ((ViaVersionPlugin) ViaVersion.getInstance()).getLogger().log(Level.WARNING, "Could not paste ViaVersion dump to Hastebin", e); + Via.getPlatform().getLogger().log(Level.WARNING, "Could not paste ViaVersion dump to Hastebin", e); } } }); diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java index 938651a36..176cfb6f5 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java @@ -17,7 +17,7 @@ public class ReloadSubCmd extends ViaSubCommand { @Override public boolean execute(ViaCommandSender sender, String[] args) { - Via.getConfig().reloadConfig(); + Via.getPlatform().getConfigurationProvider().saveConfig(); sendMessage(sender, "&6Configuration successfully reloaded! Some features may need a restart."); return true; } diff --git a/common/src/main/java/us/myles/ViaVersion/dump/DumpTemplate.java b/common/src/main/java/us/myles/ViaVersion/dump/DumpTemplate.java index e6b5451ba..4722fe54f 100644 --- a/common/src/main/java/us/myles/ViaVersion/dump/DumpTemplate.java +++ b/common/src/main/java/us/myles/ViaVersion/dump/DumpTemplate.java @@ -1,5 +1,6 @@ package us.myles.ViaVersion.dump; +import com.google.gson.JsonObject; import lombok.AllArgsConstructor; import lombok.Data; @@ -11,5 +12,5 @@ import java.util.Map; public class DumpTemplate { private VersionInfo versionInfo; private Map configuration; - private List plugins; + private JsonObject platformDump; } diff --git a/common/src/main/java/us/myles/ViaVersion/dump/VersionInfo.java b/common/src/main/java/us/myles/ViaVersion/dump/VersionInfo.java index 75dcef344..9e0da92de 100644 --- a/common/src/main/java/us/myles/ViaVersion/dump/VersionInfo.java +++ b/common/src/main/java/us/myles/ViaVersion/dump/VersionInfo.java @@ -8,11 +8,11 @@ import java.util.Set; @Data @AllArgsConstructor public class VersionInfo { - private String version; - private String bukkitVersion; private String javaVersion; private String operatingSystem; private int serverProtocol; private Set enabledPipelines; + private String platformName; + private String platformVersion; } From 471076cbe10a5cd21e30ac3d64e88f8c0c3b770e Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 25 Sep 2016 19:44:05 +0100 Subject: [PATCH 16/76] Update Changelog --- TODOLIST | 4 ---- 1 file changed, 4 deletions(-) diff --git a/TODOLIST b/TODOLIST index cc3daf07b..ade1fa489 100644 --- a/TODOLIST +++ b/TODOLIST @@ -1,7 +1,3 @@ -Fix 1.9to1.8 -Fix commands Handle injector errors -Add new info to dump for platform -Migrate Bukkit types to our own :D Important: Create builder for ViaManager which allows supplying on the command exectutor, injector, platform :D \ No newline at end of file From 669cbcd1429c1319af734f2fb8859aa4ff3409c6 Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 25 Sep 2016 20:05:58 +0100 Subject: [PATCH 17/76] Fix maven so it compiles --- bukkit/pom.xml | 2 +- .../us/myles/ViaVersion/api/ViaListener.java | 4 +-- .../us/myles/ViaVersion/api/ViaVersion.java | 2 +- .../ViaVersion/bukkit/BukkitViaInjector.java | 30 +++++++++++-------- bungee/pom.xml | 2 +- common/pom.xml | 3 +- .../java/us/myles/ViaVersion/ViaManager.java | 24 ++++++++++++--- .../ViaVersion/api/platform/ViaInjector.java | 6 ++-- .../api/protocol/ProtocolRegistry.java | 4 +-- jar/pom.xml | 11 ------- pom.xml | 18 +++++++++-- 11 files changed, 64 insertions(+), 42 deletions(-) diff --git a/bukkit/pom.xml b/bukkit/pom.xml index 50dd3a05c..442e0e9d9 100644 --- a/bukkit/pom.xml +++ b/bukkit/pom.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - viaversion + viaversion-parent us.myles 1.0.0-ALPHA-16w38a diff --git a/bukkit/src/main/java/us/myles/ViaVersion/api/ViaListener.java b/bukkit/src/main/java/us/myles/ViaVersion/api/ViaListener.java index 48453d862..e7953a31a 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/api/ViaListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/api/ViaListener.java @@ -37,8 +37,8 @@ public abstract class ViaListener implements Listener { * @return The UserConnection */ protected UserConnection getUserConnection(@NonNull UUID uuid) { - if (!plugin.isPorted(uuid)) return null; - return plugin.getConnection(uuid); + if (!Via.getAPI().isPorted(uuid)) return null; + return Via.getManager().getConnection(uuid); } /** diff --git a/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersion.java b/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersion.java index 99655a2fe..c6dff9729 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersion.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersion.java @@ -13,7 +13,7 @@ public class ViaVersion { public static void setInstance(ViaVersionPlugin plugin) { Validate.isTrue(instance == null, "Instance is already set"); - ViaVersion.instance = plugin; + ViaVersion.instance = (ViaVersionAPI) plugin.getApi(); ViaVersion.config = plugin.getConf(); } } diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java index f53ece720..fe389fee0 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java @@ -6,6 +6,7 @@ import io.netty.channel.ChannelInitializer; import io.netty.channel.socket.SocketChannel; import org.bukkit.plugin.PluginDescriptionFile; import us.myles.ViaVersion.api.Pair; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaInjector; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.handlers.ViaVersionInitializer; @@ -23,12 +24,11 @@ public class BukkitViaInjector implements ViaInjector { private List> injectedLists = new ArrayList<>(); @Override - public void inject() { + public void inject() throws Exception { try { Object connection = getServerConnection(); if (connection == null) { - getLogger().warning("We failed to find the core component 'ServerConnection', please file an issue on our GitHub."); - return; + throw new Exception("We failed to find the core component 'ServerConnection', please file an issue on our GitHub."); } for (Field field : connection.getClass().getDeclaredFields()) { field.setAccessible(true); @@ -40,7 +40,11 @@ public class BukkitViaInjector implements ViaInjector { public synchronized void handleAdd(Object o) { synchronized (this) { if (o instanceof ChannelFuture) { - injectChannelFuture((ChannelFuture) o); + try { + injectChannelFuture((ChannelFuture) o); + } catch (Exception e) { + e.printStackTrace(); + } } } } @@ -61,12 +65,12 @@ public class BukkitViaInjector implements ViaInjector { } } catch (Exception e) { - getLogger().severe("Unable to inject ViaVersion, please post these details on our GitHub and ensure you're using a compatible server version."); - e.printStackTrace(); + Via.getPlatform().getLogger().severe("Unable to inject ViaVersion, please post these details on our GitHub and ensure you're using a compatible server version."); + throw e; } } - private void injectChannelFuture(ChannelFuture future) { + private void injectChannelFuture(ChannelFuture future) throws Exception { try { ChannelHandler bootstrapAcceptor = future.channel().pipeline().first(); try { @@ -87,8 +91,8 @@ public class BukkitViaInjector implements ViaInjector { } } catch (Exception e) { - getLogger().severe("We failed to inject ViaVersion, have you got late-bind enabled with something else?"); - e.printStackTrace(); + Via.getPlatform().getLogger().severe("We failed to inject ViaVersion, have you got late-bind enabled with something else?"); + throw e; } } @@ -123,7 +127,7 @@ public class BukkitViaInjector implements ViaInjector { } @Override - public int getServerProtocolVersion() { + public int getServerProtocolVersion() throws Exception { try { Class serverClazz = ReflectionUtil.nms("MinecraftServer"); Object server = ReflectionUtil.invokeStatic(serverClazz, "getServer"); @@ -164,9 +168,9 @@ public class BukkitViaInjector implements ViaInjector { } } } catch (Exception e) { - e.printStackTrace(); - // We couldn't work it out... We'll just use ping and hope for the best... + throw new Exception("Failed to get server", e); } + throw new Exception("Failed to get server"); } public static Object getServerConnection() throws Exception { @@ -188,7 +192,7 @@ public class BukkitViaInjector implements ViaInjector { public static void patchLists() throws Exception { Object connection = getServerConnection(); if (connection == null) { - getLogger().warning("We failed to find the core component 'ServerConnection', please file an issue on our GitHub."); + Via.getPlatform().getLogger().warning("We failed to find the core component 'ServerConnection', please file an issue on our GitHub."); return; } for (Field field : connection.getClass().getDeclaredFields()) { diff --git a/bungee/pom.xml b/bungee/pom.xml index 613d7bb07..ec14a3b79 100644 --- a/bungee/pom.xml +++ b/bungee/pom.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - viaversion + viaversion-parent us.myles 1.0.0-ALPHA-16w38a diff --git a/common/pom.xml b/common/pom.xml index 427ec7ce4..5debfe016 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - viaversion + viaversion-parent us.myles 1.0.0-ALPHA-16w38a @@ -11,5 +11,4 @@ 4.0.0 viaversion-common - \ No newline at end of file diff --git a/common/src/main/java/us/myles/ViaVersion/ViaManager.java b/common/src/main/java/us/myles/ViaVersion/ViaManager.java index 6f9227270..23e098783 100644 --- a/common/src/main/java/us/myles/ViaVersion/ViaManager.java +++ b/common/src/main/java/us/myles/ViaVersion/ViaManager.java @@ -44,8 +44,13 @@ public class ViaManager { if (platform.getConf().isCheckForUpdates()) UpdateUtil.sendUpdateMessage(); // Inject - // TODO: Get errors - injector.inject(); + try { + injector.inject(); + } catch (Exception e) { + getPlatform().getLogger().severe("ViaVersion failed to inject:"); + e.printStackTrace(); + return; + } // Mark as injected System.setProperty("ViaVersion", getPlatform().getPluginVersion()); // If successful @@ -58,9 +63,15 @@ public class ViaManager { }); } + public void onServerLoaded() { // Load Server Protocol - ProtocolRegistry.SERVER_PROTOCOL = injector.getServerProtocolVersion(); + try { + ProtocolRegistry.SERVER_PROTOCOL = injector.getServerProtocolVersion(); + } catch (Exception e) { + getPlatform().getLogger().severe("ViaVersion failed to get the server protocol!"); + e.printStackTrace(); + } // Check if there are any pipes to this version if (ProtocolRegistry.SERVER_PROTOCOL != -1) { getPlatform().getLogger().info("ViaVersion detected server version: " + ProtocolVersion.getProtocol(ProtocolRegistry.SERVER_PROTOCOL)); @@ -81,7 +92,12 @@ public class ViaManager { public void destroy() { // Uninject getPlatform().getLogger().info("ViaVersion is disabling, if this is a reload and you experience issues consider rebooting."); - injector.uninject(); + try { + injector.uninject(); + } catch (Exception e) { + getPlatform().getLogger().severe("ViaVersion failed to uninject:"); + e.printStackTrace(); + } } public void addPortedClient(UserConnection info) { diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java index e39b73cab..38d5ffc45 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java @@ -1,9 +1,9 @@ package us.myles.ViaVersion.api.platform; public interface ViaInjector { - public void inject(); + public void inject() throws Exception; - public void uninject(); + public void uninject() throws Exception; - public int getServerProtocolVersion(); + public int getServerProtocolVersion() throws Exception; } diff --git a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java index 2b6aeb7a0..7c1f6c9b6 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java +++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java @@ -63,7 +63,7 @@ public class ProtocolRegistry { if (Via.getPlatform().isPluginEnabled()) { protocol.registerListeners(); - protocol.registerProviders(Via.getManager().getProviders()); + protocol.register(Via.getManager().getProviders()); refreshVersions(); } else { registerList.add(protocol); @@ -110,7 +110,7 @@ public class ProtocolRegistry { public static void onServerLoaded() { for (Protocol protocol : registerList) { protocol.registerListeners(); - protocol.registerProviders(Via.getManager().getProviders()); + protocol.register(Via.getManager().getProviders()); } registerList.clear(); } diff --git a/jar/pom.xml b/jar/pom.xml index 00754e50d..a58022ad7 100644 --- a/jar/pom.xml +++ b/jar/pom.xml @@ -35,17 +35,6 @@ - - - org.apache.maven.plugins - maven-compiler-plugin - 3.5.1 - - ${jdkVersion} - ${jdkVersion} - - - org.javassist @@ -114,4 +114,18 @@ + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + ${maven.compiler.source} + ${maven.compiler.target} + + + + From 32afa2a9a38474c75fa0e5241110e056c70f5219 Mon Sep 17 00:00:00 2001 From: Matsv Date: Sun, 25 Sep 2016 21:10:41 +0200 Subject: [PATCH 18/76] Fix building and change versions --- bukkit/pom.xml | 4 ++-- bungee/pom.xml | 2 +- common/pom.xml | 2 +- jar/pom.xml | 9 ++++----- pom.xml | 16 +--------------- 5 files changed, 9 insertions(+), 24 deletions(-) diff --git a/bukkit/pom.xml b/bukkit/pom.xml index 442e0e9d9..933f19df6 100644 --- a/bukkit/pom.xml +++ b/bukkit/pom.xml @@ -5,7 +5,7 @@ viaversion-parent us.myles - 1.0.0-ALPHA-16w38a + 1.0.0-ALPHA-modules 4.0.0 @@ -21,7 +21,7 @@ us.myles viaversion-common - 1.0.0-ALPHA-16w38a + 1.0.0-ALPHA-modules provided diff --git a/bungee/pom.xml b/bungee/pom.xml index ec14a3b79..a0dd671ca 100644 --- a/bungee/pom.xml +++ b/bungee/pom.xml @@ -5,7 +5,7 @@ viaversion-parent us.myles - 1.0.0-ALPHA-16w38a + 1.0.0-ALPHA-modules 4.0.0 diff --git a/common/pom.xml b/common/pom.xml index 5debfe016..8477ad2cb 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -5,7 +5,7 @@ viaversion-parent us.myles - 1.0.0-ALPHA-16w38a + 1.0.0-ALPHA-modules 4.0.0 diff --git a/jar/pom.xml b/jar/pom.xml index a58022ad7..be3612bb2 100644 --- a/jar/pom.xml +++ b/jar/pom.xml @@ -5,7 +5,7 @@ viaversion-parent us.myles - 1.0.0-ALPHA-16w38a + 1.0.0-ALPHA-modules 4.0.0 @@ -13,7 +13,6 @@ ${project.name}-${project.version} - src/main/java clean install @@ -76,17 +75,17 @@ us.myles viaversion-common - 1.0.0-ALPHA-16w38a + 1.0.0-ALPHA-modules us.myles viaversion-bukkit - 1.0.0-ALPHA-16w38a + 1.0.0-ALPHA-modules us.myles viaversion-bungee - 1.0.0-ALPHA-16w38a + 1.0.0-ALPHA-modules diff --git a/pom.xml b/pom.xml index d98ae3321..5ea252786 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ us.myles viaversion-parent - 1.0.0-ALPHA-16w38a + 1.0.0-ALPHA-modules pom ViaVersion @@ -114,18 +114,4 @@ - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.5.1 - - ${maven.compiler.source} - ${maven.compiler.target} - - - - From 573374866bb2ad27db3e1aca3c469b84d26c82fc Mon Sep 17 00:00:00 2001 From: Matsv Date: Sun, 25 Sep 2016 21:17:09 +0200 Subject: [PATCH 19/76] Optimize imports & reformat code --- .../main/java/us/myles/ViaVersion/ViaVersionPlugin.java | 1 - .../us/myles/ViaVersion/bukkit/BukkitViaInjector.java | 1 - .../java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java | 1 - common/src/main/java/us/myles/ViaVersion/ViaManager.java | 2 -- common/src/main/java/us/myles/ViaVersion/api/ViaAPI.java | 1 - .../main/java/us/myles/ViaVersion/api/boss/BossBar.java | 8 ++++---- .../myles/ViaVersion/api/command/ViaVersionCommand.java | 4 ++-- .../api/configuration/ConfigurationProvider.java | 4 ++-- .../myles/ViaVersion/api/minecraft/metadata/Metadata.java | 3 ++- .../us/myles/ViaVersion/api/platform/ViaPlatform.java | 1 - .../java/us/myles/ViaVersion/api/protocol/Protocol.java | 1 + .../myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java | 3 --- .../main/java/us/myles/ViaVersion/dump/DumpTemplate.java | 1 - .../protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java | 2 +- .../protocols/protocol1_9to1_8/metadata/MetaIndex.java | 2 +- .../java/us/myles/ViaVersion/util/ConcurrentList.java | 3 ++- 16 files changed, 15 insertions(+), 23 deletions(-) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index f935b0107..c02783ebd 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -15,7 +15,6 @@ import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.platform.ViaPlatform; -import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.bukkit.BukkitCommandHandler; import us.myles.ViaVersion.bukkit.BukkitCommandSender; import us.myles.ViaVersion.bukkit.BukkitViaAPI; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java index fe389fee0..f6aab8bed 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java @@ -8,7 +8,6 @@ import org.bukkit.plugin.PluginDescriptionFile; import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaInjector; -import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.handlers.ViaVersionInitializer; import us.myles.ViaVersion.util.ConcurrentList; import us.myles.ViaVersion.util.ListWrapper; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java index 9c6e7bf7b..944dd766c 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java @@ -13,7 +13,6 @@ import us.myles.ViaVersion.api.platform.ViaPlatformLoader; import us.myles.ViaVersion.listeners.UpdateListener; import us.myles.ViaVersion.listeners.protocol1_9to1_8.*; import us.myles.ViaVersion.protocols.base.ProtocolInfo; -import us.myles.ViaVersion.protocols.protocol1_9to1_8.ViaIdleThread; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.HandItemProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; diff --git a/common/src/main/java/us/myles/ViaVersion/ViaManager.java b/common/src/main/java/us/myles/ViaVersion/ViaManager.java index 23e098783..d0dcdd41f 100644 --- a/common/src/main/java/us/myles/ViaVersion/ViaManager.java +++ b/common/src/main/java/us/myles/ViaVersion/ViaManager.java @@ -1,9 +1,7 @@ package us.myles.ViaVersion; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; -import us.myles.ViaVersion.api.command.ViaVersionCommand; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.platform.ViaInjector; import us.myles.ViaVersion.api.platform.ViaPlatform; diff --git a/common/src/main/java/us/myles/ViaVersion/api/ViaAPI.java b/common/src/main/java/us/myles/ViaVersion/api/ViaAPI.java index f98eeaa3b..39d58bf01 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/ViaAPI.java +++ b/common/src/main/java/us/myles/ViaVersion/api/ViaAPI.java @@ -4,7 +4,6 @@ import io.netty.buffer.ByteBuf; import us.myles.ViaVersion.api.boss.BossBar; import us.myles.ViaVersion.api.boss.BossColor; import us.myles.ViaVersion.api.boss.BossStyle; -import us.myles.ViaVersion.api.command.ViaVersionCommand; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import java.util.SortedSet; diff --git a/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java b/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java index 71a4564ec..a7b1988e2 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java +++ b/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java @@ -75,7 +75,7 @@ public abstract class BossBar { * @deprecated Deprecated use UUID's instead of Player objects {@link #addPlayer(UUID)} */ @Deprecated - public BossBar addPlayer(T player){ + public BossBar addPlayer(T player) { throw new NotImplementedException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName()); } @@ -86,7 +86,7 @@ public abstract class BossBar { * @return The BossBar object */ public abstract BossBar addPlayer(UUID player); - + /** * add multiple players * @@ -95,7 +95,7 @@ public abstract class BossBar { * @deprecated Deprecated use UUID's instead of Player objects {@link #addPlayer(UUID)} */ @Deprecated - public BossBar addPlayers(T... players){ + public BossBar addPlayers(T... players) { throw new NotImplementedException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName()); } @@ -107,7 +107,7 @@ public abstract class BossBar { * @deprecated Deprecated use UUID's instead of Player objects {@link #removePlayer(UUID)} */ @Deprecated - public BossBar removePlayer(T player){ + public BossBar removePlayer(T player) { throw new NotImplementedException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName()); } diff --git a/common/src/main/java/us/myles/ViaVersion/api/command/ViaVersionCommand.java b/common/src/main/java/us/myles/ViaVersion/api/command/ViaVersionCommand.java index 13b19bbfb..983f960cc 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/command/ViaVersionCommand.java +++ b/common/src/main/java/us/myles/ViaVersion/api/command/ViaVersionCommand.java @@ -31,7 +31,7 @@ public interface ViaVersionCommand { * Executed when the Command sender executes the command * * @param sender Sender object - * @param args arguments provided + * @param args arguments provided * @return was successful */ boolean onCommand(ViaCommandSender sender, String[] args); @@ -40,7 +40,7 @@ public interface ViaVersionCommand { * Executed when the Command sender tab-completes * * @param sender Sender object - * @param args arguments provided + * @param args arguments provided * @return was successful */ List onTabComplete(ViaCommandSender sender, String[] args); diff --git a/common/src/main/java/us/myles/ViaVersion/api/configuration/ConfigurationProvider.java b/common/src/main/java/us/myles/ViaVersion/api/configuration/ConfigurationProvider.java index 5a1457e60..66caaee7b 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/configuration/ConfigurationProvider.java +++ b/common/src/main/java/us/myles/ViaVersion/api/configuration/ConfigurationProvider.java @@ -7,7 +7,7 @@ public interface ConfigurationProvider { /** * Sets the specified path to the given value. * - * @param path Path of the object to set. + * @param path Path of the object to set. * @param value New value to set the path to */ void set(String path, Object value); @@ -22,5 +22,5 @@ public interface ConfigurationProvider { * * @return Map with key->values */ - Map getValues(); + Map getValues(); } diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/Metadata.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/Metadata.java index 03489dd82..1f4b1c261 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/Metadata.java +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/Metadata.java @@ -1,6 +1,7 @@ package us.myles.ViaVersion.api.minecraft.metadata; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Data; import us.myles.ViaVersion.api.type.Type; @AllArgsConstructor diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java index 5ab61b11f..42739cf6f 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java @@ -1,7 +1,6 @@ package us.myles.ViaVersion.api.platform; import com.google.gson.JsonObject; -import jdk.nashorn.internal.runtime.regexp.joni.Config; import us.myles.ViaVersion.api.ViaAPI; import us.myles.ViaVersion.api.ViaVersionConfig; import us.myles.ViaVersion.api.command.ViaCommandSender; diff --git a/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java index bac2b30be..e28c32644 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java +++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java @@ -64,6 +64,7 @@ public abstract class Protocol { protected void register(ViaProviders providers) { } + /** * Register the packets for this protocol */ diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java index 0b90c8c52..9938cab8a 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java @@ -9,7 +9,6 @@ import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.dump.DumpTemplate; -import us.myles.ViaVersion.dump.PluginInfo; import us.myles.ViaVersion.dump.VersionInfo; import java.io.InputStreamReader; @@ -18,8 +17,6 @@ import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.List; import java.util.Map; import java.util.logging.Level; diff --git a/common/src/main/java/us/myles/ViaVersion/dump/DumpTemplate.java b/common/src/main/java/us/myles/ViaVersion/dump/DumpTemplate.java index 4722fe54f..6c35344a6 100644 --- a/common/src/main/java/us/myles/ViaVersion/dump/DumpTemplate.java +++ b/common/src/main/java/us/myles/ViaVersion/dump/DumpTemplate.java @@ -4,7 +4,6 @@ import com.google.gson.JsonObject; import lombok.AllArgsConstructor; import lombok.Data; -import java.util.List; import java.util.Map; @Data diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java index 0953941ed..8d837a37f 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chunks/ChunkSection1_9to1_8.java @@ -46,7 +46,7 @@ public class ChunkSection1_9to1_8 implements ChunkSection { setBlock(index(x, y, z), type, data); } - public int getBlockId(int x, int y, int z){ + public int getBlockId(int x, int y, int z) { int index = blocks[index(x, y, z)]; return palette.get(index) >> 4; } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java index 947bb8536..b84ded186 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java @@ -183,7 +183,7 @@ public enum MetaIndex { do { Optional optMeta = getIndex(currentType, index); - if (optMeta.isPresent()){ + if (optMeta.isPresent()) { return optMeta.get(); } diff --git a/common/src/main/java/us/myles/ViaVersion/util/ConcurrentList.java b/common/src/main/java/us/myles/ViaVersion/util/ConcurrentList.java index 39d3f8f2e..524b9145f 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/ConcurrentList.java +++ b/common/src/main/java/us/myles/ViaVersion/util/ConcurrentList.java @@ -8,9 +8,10 @@ import java.util.*; /** * Created by wea_ondara licensed under MIT * Same license as in LICENSE - * + *

* Taken from: * https://github.com/weaondara/BungeePerms/blob/master/src/main/java/net/alpenblock/bungeeperms/util/ConcurrentList.java + * * @param List Type */ public class ConcurrentList extends ArrayList { From e56bce2f311d2e631a194c9cb5203335acb6b521 Mon Sep 17 00:00:00 2001 From: Matsv Date: Sun, 25 Sep 2016 21:33:47 +0200 Subject: [PATCH 20/76] Create builder for ViaManager --- TODOLIST | 2 -- .../java/us/myles/ViaVersion/ViaVersionPlugin.java | 10 ++++++++-- .../src/main/java/us/myles/ViaVersion/ViaManager.java | 8 +++----- common/src/main/java/us/myles/ViaVersion/api/Via.java | 9 +++++---- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/TODOLIST b/TODOLIST index ade1fa489..177bbbce7 100644 --- a/TODOLIST +++ b/TODOLIST @@ -1,3 +1 @@ Handle injector errors - -Important: Create builder for ViaManager which allows supplying on the command exectutor, injector, platform :D \ No newline at end of file diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index c02783ebd..ae25d90aa 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -45,8 +45,14 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { public ViaVersionPlugin() { // Config magic conf = new ViaConfig(this); + // Command handler + commandHandler = new BukkitCommandHandler(); // Init platform - Via.init(this); + Via.init(ViaManager.builder() + .platform(this) + .commandHandler(commandHandler) + .injector(new BukkitViaInjector()) + .build()); // For compatibility ViaVersion.setInstance(this); @@ -95,7 +101,7 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { Via.getManager().init(); } - getCommand("viaversion").setExecutor(commandHandler = new BukkitCommandHandler()); + getCommand("viaversion").setExecutor(commandHandler); getCommand("viaversion").setTabCompleter(commandHandler); // Warn them if they have anti-xray on and they aren't using spigot diff --git a/common/src/main/java/us/myles/ViaVersion/ViaManager.java b/common/src/main/java/us/myles/ViaVersion/ViaManager.java index d0dcdd41f..5f4846332 100644 --- a/common/src/main/java/us/myles/ViaVersion/ViaManager.java +++ b/common/src/main/java/us/myles/ViaVersion/ViaManager.java @@ -1,5 +1,6 @@ package us.myles.ViaVersion; +import lombok.Builder; import lombok.Getter; import lombok.Setter; import us.myles.ViaVersion.api.data.UserConnection; @@ -18,9 +19,10 @@ import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @Getter +@Builder public class ViaManager { - private ViaPlatform platform; private final Map portedPlayers = new ConcurrentHashMap<>(); + private ViaPlatform platform; private ViaProviders providers = new ViaProviders(); @Setter private boolean debug = false; @@ -29,10 +31,6 @@ public class ViaManager { private ViaCommandHandler commandHandler; private ViaPlatformLoader loader; - public ViaManager(ViaPlatform platform) { - this.platform = platform; - } - public void init() { if (System.getProperty("ViaVersion") != null) { // Reload? diff --git a/common/src/main/java/us/myles/ViaVersion/api/Via.java b/common/src/main/java/us/myles/ViaVersion/api/Via.java index 3eec7ed1e..be852c468 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/Via.java +++ b/common/src/main/java/us/myles/ViaVersion/api/Via.java @@ -11,10 +11,11 @@ public class Via { @Getter private static ViaManager manager; - public static void init(ViaPlatform platform) { - Validate.isTrue(platform == null, "Platform is already set"); - Via.platform = platform; - Via.manager = new ViaManager(platform); + public static void init(ViaManager viaManager) { + Validate.isTrue(manager == null, "ViaManager is already set"); + + Via.platform = viaManager.getPlatform(); + Via.manager = viaManager; } public static ViaAPI getAPI() { From 08713947b77e00502aaed11b936ccd41d315d574 Mon Sep 17 00:00:00 2001 From: Matsv Date: Sun, 25 Sep 2016 21:42:22 +0200 Subject: [PATCH 21/76] Add BukkitViaLoader to the builder and limit the builder methods --- .../main/java/us/myles/ViaVersion/ViaVersionPlugin.java | 6 ++---- common/src/main/java/us/myles/ViaVersion/ViaManager.java | 9 ++++++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index ae25d90aa..2b0b7c2ea 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -15,10 +15,7 @@ import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.platform.ViaPlatform; -import us.myles.ViaVersion.bukkit.BukkitCommandHandler; -import us.myles.ViaVersion.bukkit.BukkitCommandSender; -import us.myles.ViaVersion.bukkit.BukkitViaAPI; -import us.myles.ViaVersion.bukkit.BukkitViaInjector; +import us.myles.ViaVersion.bukkit.*; import us.myles.ViaVersion.classgenerator.ClassGenerator; import us.myles.ViaVersion.dump.PluginInfo; import us.myles.ViaVersion.util.ReflectionUtil; @@ -52,6 +49,7 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { .platform(this) .commandHandler(commandHandler) .injector(new BukkitViaInjector()) + .loader(new BukkitViaLoader(this)) .build()); // For compatibility ViaVersion.setInstance(this); diff --git a/common/src/main/java/us/myles/ViaVersion/ViaManager.java b/common/src/main/java/us/myles/ViaVersion/ViaManager.java index 5f4846332..951490e06 100644 --- a/common/src/main/java/us/myles/ViaVersion/ViaManager.java +++ b/common/src/main/java/us/myles/ViaVersion/ViaManager.java @@ -19,7 +19,6 @@ import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @Getter -@Builder public class ViaManager { private final Map portedPlayers = new ConcurrentHashMap<>(); private ViaPlatform platform; @@ -31,6 +30,14 @@ public class ViaManager { private ViaCommandHandler commandHandler; private ViaPlatformLoader loader; + @Builder + public ViaManager(ViaPlatform platform, ViaInjector injector, ViaCommandHandler commandHandler, ViaPlatformLoader loader) { + this.platform = platform; + this.injector = injector; + this.commandHandler = commandHandler; + this.loader = loader; + } + public void init() { if (System.getProperty("ViaVersion") != null) { // Reload? From 0fe9ccf4a82f479ccad10fedd91f4afea60e25a3 Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 25 Sep 2016 20:43:32 +0100 Subject: [PATCH 22/76] Make pom.xml better --- bukkit/pom.xml | 2 +- jar/pom.xml | 10 +++++----- pom.xml | 3 ++- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/bukkit/pom.xml b/bukkit/pom.xml index 933f19df6..a4d179ed1 100644 --- a/bukkit/pom.xml +++ b/bukkit/pom.xml @@ -21,7 +21,7 @@ us.myles viaversion-common - 1.0.0-ALPHA-modules + ${parent.version} provided diff --git a/jar/pom.xml b/jar/pom.xml index be3612bb2..bcfabc952 100644 --- a/jar/pom.xml +++ b/jar/pom.xml @@ -8,11 +8,11 @@ 1.0.0-ALPHA-modules 4.0.0 - + viaversion-jar viaversion - ${project.name}-${project.version} + ViaVersion-${project.version} clean install @@ -75,17 +75,17 @@ us.myles viaversion-common - 1.0.0-ALPHA-modules + ${parent.version} us.myles viaversion-bukkit - 1.0.0-ALPHA-modules + ${parent.version} us.myles viaversion-bungee - 1.0.0-ALPHA-modules + ${parent.version} diff --git a/pom.xml b/pom.xml index 5ea252786..2f923cd7d 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,8 @@ 1.0.0-ALPHA-modules pom - ViaVersion + viaversion-parent + Allow newer clients to join older server versions. 2016 https://www.spigotmc.org/resources/viaversion.19254/ From a1fbca11f0fed61b1be9c0bab096ce86fc673ccd Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 25 Sep 2016 21:02:12 +0100 Subject: [PATCH 23/76] Queue tasks & Fix PPS --- .../us/myles/ViaVersion/ViaVersionPlugin.java | 50 ++++++++++--------- .../ViaVersion/handlers/ViaDecodeHandler.java | 3 +- .../ViaVersion/handlers/ViaEncodeHandler.java | 4 +- 3 files changed, 31 insertions(+), 26 deletions(-) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 2b0b7c2ea..418fd6494 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -23,9 +23,6 @@ import us.myles.ViaVersion.util.ReflectionUtil; import java.util.ArrayList; import java.util.List; import java.util.UUID; -import java.util.concurrent.Callable; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { @@ -38,6 +35,8 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { private ViaConfig conf; @Getter private ViaAPI api = new BukkitViaAPI(this); + private List queuedTasks = new ArrayList<>(); + private List asyncQueuedTasks = new ArrayList<>(); public ViaVersionPlugin() { // Config magic @@ -106,6 +105,18 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { if (conf.isAntiXRay() && !spigot) { getLogger().info("You have anti-xray on in your config, since you're not using spigot it won't fix xray!"); } + + // Run queued tasks + for (Runnable r : queuedTasks) { + Bukkit.getScheduler().runTask(this, r); + } + queuedTasks.clear(); + + // Run async queued tasks + for (Runnable r : asyncQueuedTasks) { + Bukkit.getScheduler().runTaskAsynchronously(this, r); + } + asyncQueuedTasks.clear(); } @Override @@ -122,25 +133,6 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { return this.spigot; } - public void run(final Runnable runnable, boolean wait) { - try { - Future f = Bukkit.getScheduler().callSyncMethod(Bukkit.getPluginManager().getPlugin("ViaVersion"), new Callable() { - @Override - public Boolean call() throws Exception { - runnable.run(); - return true; - } - }); - if (wait) { - f.get(10, TimeUnit.SECONDS); - } - } catch (Exception e) { - System.out.println("Failed to run task: " + e.getClass().getName()); - if (ViaVersion.getInstance().isDebug()) - e.printStackTrace(); - } - } - public boolean isProtocolSupport() { return protocolSupport; } @@ -187,12 +179,22 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { @Override public int runAsync(Runnable runnable) { - return getServer().getScheduler().runTaskAsynchronously(this, runnable).getTaskId(); + if (isPluginEnabled()) { + return getServer().getScheduler().runTaskAsynchronously(this, runnable).getTaskId(); + } else { + asyncQueuedTasks.add(runnable); + return -1; + } } @Override public int runSync(Runnable runnable) { - return getServer().getScheduler().runTask(this, runnable).getTaskId(); + if (isPluginEnabled()) { + return getServer().getScheduler().runTask(this, runnable).getTaskId(); + } else { + queuedTasks.add(runnable); + return -1; + } } @Override diff --git a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java index 228388a24..13216ab98 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java @@ -5,6 +5,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ByteToMessageDecoder; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.type.Type; @@ -38,7 +39,7 @@ public class ViaDecodeHandler extends ByteToMessageDecoder { boolean second = info.incrementReceived(); // Check PPS if (second) { - if (((ViaVersionPlugin) ViaVersion.getInstance()).handlePPS(info)) + if (((ViaVersionPlugin) Via.getPlatform()).handlePPS(info)) return; } diff --git a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java index fd0f5d2e2..9ef555c9e 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java @@ -3,7 +3,9 @@ package us.myles.ViaVersion.handlers; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; +import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.type.Type; @@ -27,7 +29,7 @@ public class ViaEncodeHandler extends MessageToByteEncoder { @Override protected void encode(final ChannelHandlerContext ctx, Object o, final ByteBuf bytebuf) throws Exception { - if (ViaVersion.getInstance().isCompatSpigotBuild()) { + if (((ViaVersionPlugin) Via.getPlatform()).isCompatSpigotBuild()) { Field ver = minecraftEncoder.getClass().getDeclaredField("version"); ver.setAccessible(true); ver.set(minecraftEncoder, ver.get(this)); From b371c14a273584601971c5f7a69db49707811ff7 Mon Sep 17 00:00:00 2001 From: Myles Date: Mon, 26 Sep 2016 01:44:21 +0100 Subject: [PATCH 24/76] Add Sponge Support --- TODOLIST | 3 +- bukkit/pom.xml | 15 +- .../bukkit/BukkitViaBulkChunkTranslator.java | 5 +- .../ViaVersion/listeners/UpdateListener.java | 4 +- bukkit/src/main/resources/plugin.yml | 1 + bungee/pom.xml | 13 ++ .../protocol1_9to1_8/Protocol1_9TO1_8.java | 5 +- .../BulkChunkTranslatorProvider.java | 2 +- jar/pom.xml | 17 +- pom.xml | 3 +- sponge/pom.xml | 72 +++++++ .../myles/ViaVersion/sponge/VersionInfo.java | 5 + .../us/myles/ViaVersion/SpongePlugin.java | 163 +++++++++++++++ .../ViaVersion/sponge/LoggerWrapper.java | 125 +++++++++++ .../ViaVersion/sponge/SpongeBossBar.java | 35 ++++ .../sponge/SpongeCommandHandler.java | 47 +++++ .../sponge/SpongeCommandSender.java | 39 ++++ .../ViaVersion/sponge/SpongeConfigAPI.java | 183 ++++++++++++++++ .../myles/ViaVersion/sponge/SpongeViaAPI.java | 81 +++++++ .../ViaVersion/sponge/SpongeViaInjector.java | 197 ++++++++++++++++++ .../ViaVersion/sponge/SpongeViaLoader.java | 72 +++++++ .../sponge/handlers/ViaDecodeHandler.java | 90 ++++++++ .../sponge/handlers/ViaEncodeHandler.java | 72 +++++++ .../sponge/handlers/ViaPacketHandler.java | 35 ++++ .../handlers/ViaVersionInitializer.java | 48 +++++ .../sponge/listeners/ClientLeaveListener.java | 12 ++ .../sponge/listeners/UpdateListener.java | 16 ++ .../SpongeViaBulkChunkTranslator.java | 55 +++++ .../SpongeViaMovementTransmitter.java | 41 ++++ .../sponge/util/ReflectionUtil.java | 130 ++++++++++++ 30 files changed, 1570 insertions(+), 16 deletions(-) create mode 100644 sponge/pom.xml create mode 100644 sponge/src/main/java-templates/us/myles/ViaVersion/sponge/VersionInfo.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/LoggerWrapper.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeBossBar.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeCommandHandler.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeCommandSender.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeConfigAPI.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaAPI.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaLoader.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaDecodeHandler.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaEncodeHandler.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaPacketHandler.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaVersionInitializer.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/ClientLeaveListener.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/UpdateListener.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaBulkChunkTranslator.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaMovementTransmitter.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/util/ReflectionUtil.java diff --git a/TODOLIST b/TODOLIST index 177bbbce7..7186f5903 100644 --- a/TODOLIST +++ b/TODOLIST @@ -1 +1,2 @@ -Handle injector errors +PORT STUFF TO GUAVA :D (so we dont need to include commons) +Test on SpongeForge, only tested SpongeVanilla \ No newline at end of file diff --git a/bukkit/pom.xml b/bukkit/pom.xml index a4d179ed1..62680b6dd 100644 --- a/bukkit/pom.xml +++ b/bukkit/pom.xml @@ -16,12 +16,25 @@ 1.8.8-R0.1-SNAPSHOT + + + + . + true + src/main/resources/ + + * + + + + + us.myles viaversion-common - ${parent.version} + ${project.parent.version} provided diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaBulkChunkTranslator.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaBulkChunkTranslator.java index 66b6ab226..7f9a6bcd2 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaBulkChunkTranslator.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaBulkChunkTranslator.java @@ -19,7 +19,6 @@ public class BukkitViaBulkChunkTranslator extends BulkChunkTranslatorProvider { static { try { - // TODO: Abstract this ? mapChunkBulkRef = new ReflectionUtil.ClassReflection(ReflectionUtil.nms("PacketPlayOutMapChunkBulk")); mapChunkRef = new ReflectionUtil.ClassReflection(ReflectionUtil.nms("PacketPlayOutMapChunk")); if (((ViaVersionPlugin) Via.getPlatform()).isSpigot()) { @@ -74,7 +73,7 @@ public class BukkitViaBulkChunkTranslator extends BulkChunkTranslatorProvider { } @Override - public boolean isEnabled() { - return true; + public boolean isFiltered(Class packetClass) { + return packetClass.getName().endsWith("PacketPlayOutMapChunkBulk"); } } diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/UpdateListener.java b/bukkit/src/main/java/us/myles/ViaVersion/listeners/UpdateListener.java index c7c9c044c..dc0942192 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/listeners/UpdateListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/listeners/UpdateListener.java @@ -3,7 +3,7 @@ package us.myles.ViaVersion.listeners; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.update.UpdateUtil; public class UpdateListener implements Listener { @@ -11,7 +11,7 @@ public class UpdateListener implements Listener { @EventHandler public void onJoin(PlayerJoinEvent e) { if (e.getPlayer().hasPermission("viaversion.update") - && ViaVersion.getConfig().isCheckForUpdates()) { + && Via.getConfig().isCheckForUpdates()) { UpdateUtil.sendUpdateMessage(e.getPlayer().getUniqueId()); } } diff --git a/bukkit/src/main/resources/plugin.yml b/bukkit/src/main/resources/plugin.yml index 764d152a8..524051b93 100644 --- a/bukkit/src/main/resources/plugin.yml +++ b/bukkit/src/main/resources/plugin.yml @@ -2,6 +2,7 @@ name: ViaVersion main: us.myles.ViaVersion.ViaVersionPlugin authors: [_MylesC, Matsv] version: ${project.version} +description: Allow newer Minecraft versions to connect to an older server version. load: postworld loadbefore: [ProtocolLib, ProxyPipe, SpigotLib, SkinRestorer] softdepend: [ProtocolSupport, PacketListenerApi] diff --git a/bungee/pom.xml b/bungee/pom.xml index a0dd671ca..bfad5ebd0 100644 --- a/bungee/pom.xml +++ b/bungee/pom.xml @@ -11,6 +11,19 @@ viaversion-bungee + + + + . + true + src/main/resources/ + + * + + + + + diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java index 8926966ff..517ab5acb 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java @@ -91,9 +91,8 @@ public class Protocol1_9TO1_8 extends Protocol { @Override public boolean isFiltered(Class packetClass) { - if (!Via.getManager().getProviders().get(BulkChunkTranslatorProvider.class).isEnabled()) - return false; - return packetClass.getName().endsWith("PacketPlayOutMapChunkBulk"); + return Via.getManager().getProviders().get(BulkChunkTranslatorProvider.class).isFiltered(packetClass); + } @Override diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java index c84698fdb..aa8982a27 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java @@ -11,7 +11,7 @@ public class BulkChunkTranslatorProvider implements Provider { return Arrays.asList(packet); } - public boolean isEnabled() { + public boolean isFiltered(Class packet) { return false; } } diff --git a/jar/pom.xml b/jar/pom.xml index bcfabc952..36f1ac584 100644 --- a/jar/pom.xml +++ b/jar/pom.xml @@ -18,7 +18,7 @@ . false - . + ../ LICENSE @@ -57,6 +57,10 @@ org.javassist us.myles.viaversion.libs.javassist + + org.apache + us.myles.viaversion.libs.apache + @@ -75,17 +79,22 @@ us.myles viaversion-common - ${parent.version} + ${project.parent.version} us.myles viaversion-bukkit - ${parent.version} + ${project.parent.version} us.myles viaversion-bungee - ${parent.version} + ${project.parent.version} + + + us.myles + viaversion-sponge + ${project.parent.version} diff --git a/pom.xml b/pom.xml index 2f923cd7d..3cd69f629 100644 --- a/pom.xml +++ b/pom.xml @@ -19,6 +19,7 @@ common bukkit bungee + sponge jar @@ -104,7 +105,7 @@ commons-lang commons-lang 2.6 - provided + compile diff --git a/sponge/pom.xml b/sponge/pom.xml new file mode 100644 index 000000000..115e29b0f --- /dev/null +++ b/sponge/pom.xml @@ -0,0 +1,72 @@ + + + + viaversion-parent + us.myles + 1.0.0-ALPHA-modules + + 4.0.0 + + viaversion-sponge + + + 1.8 + 1.8 + + + + + sponge + http://repo.spongepowered.org/maven + + + + + + + . + true + src/main/resources/ + + * + + + + + + org.codehaus.mojo + templating-maven-plugin + 1.0.0 + + + filter-src + + filter-sources + + + + + + + + + + + us.myles + viaversion-common + ${project.parent.version} + provided + + + + + org.spongepowered + spongeapi + 4.1.0 + provided + + + + \ No newline at end of file diff --git a/sponge/src/main/java-templates/us/myles/ViaVersion/sponge/VersionInfo.java b/sponge/src/main/java-templates/us/myles/ViaVersion/sponge/VersionInfo.java new file mode 100644 index 000000000..960f6a88d --- /dev/null +++ b/sponge/src/main/java-templates/us/myles/ViaVersion/sponge/VersionInfo.java @@ -0,0 +1,5 @@ +package us.myles.ViaVersion.sponge; + +public class VersionInfo { + public static final String VERSION = "${project.version}"; +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java b/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java new file mode 100644 index 000000000..e4567df6c --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java @@ -0,0 +1,163 @@ +package us.myles.ViaVersion; + +import com.google.gson.JsonObject; +import com.google.inject.Inject; +import org.spongepowered.api.Game; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.game.state.GameStartedServerEvent; +import org.spongepowered.api.plugin.Plugin; +import org.spongepowered.api.plugin.PluginContainer; +import org.spongepowered.api.scheduler.SpongeExecutorService; +import org.spongepowered.api.text.serializer.TextSerializers; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.ViaAPI; +import us.myles.ViaVersion.api.ViaVersionConfig; +import us.myles.ViaVersion.api.command.ViaCommandSender; +import us.myles.ViaVersion.api.configuration.ConfigurationProvider; +import us.myles.ViaVersion.api.platform.ViaPlatform; +import us.myles.ViaVersion.sponge.*; + +import java.util.Arrays; +import java.util.UUID; +import java.util.concurrent.TimeUnit; +import java.util.logging.Logger; + +@Plugin(id = "viaversion", + name = "ViaVersion", + version = VersionInfo.VERSION, + authors = {"_MylesC", "Matsv"}, + description = "Allow newer Minecraft versions to connect to an older server version." +) +public class SpongePlugin implements ViaPlatform { + @Inject + private Game game; + @Inject + private PluginContainer container; + + private SpongeExecutorService asyncExecutor; + private SpongeExecutorService syncExecutor; + private SpongeConfigAPI conf = new SpongeConfigAPI(this); + private SpongeViaAPI api = new SpongeViaAPI(); + private Logger logger; + + @Listener + public void onServerStart(GameStartedServerEvent event) { + // Setup Logger + logger = new LoggerWrapper(container.getLogger()); + // Setup Plugin + syncExecutor = game.getScheduler().createSyncExecutor(this); + asyncExecutor = game.getScheduler().createAsyncExecutor(this); + SpongeCommandHandler commandHandler = new SpongeCommandHandler(); + game.getCommandManager().register(this, commandHandler, Arrays.asList("viaversion", "viaver")); + // Init platform + Via.init(ViaManager.builder() + .platform(this) + .commandHandler(commandHandler) + .injector(new SpongeViaInjector()) + .loader(new SpongeViaLoader(this)) + .build()); + + // Inject! + Via.getManager().init(); + } + + @Override + public Logger getLogger() { + return logger; + } + + @Override + public String getPlatformName() { + return "Sponge"; + } + + @Override + public String getPluginVersion() { + return container.getVersion().orElse("Unknown Version"); + } + + @Override + public int runAsync(Runnable runnable) { + asyncExecutor.execute(runnable); + return -1; + } + + @Override + public int runSync(Runnable runnable) { + syncExecutor.execute(runnable); + return -1; + } + + @Override + public int runRepeatingSync(Runnable runnable, Long ticks) { + Long time = ticks * 50L; + syncExecutor.scheduleAtFixedRate(runnable, time, time, TimeUnit.MILLISECONDS); + // use id? + return -1; + } + + @Override + public void cancelTask(int taskId) { + // oh. + } + + @Override + public ViaCommandSender[] getOnlinePlayers() { + ViaCommandSender[] array = new ViaCommandSender[game.getServer().getOnlinePlayers().size()]; + int i = 0; + for (Player player : game.getServer().getOnlinePlayers()) { + array[i++] = new SpongeCommandSender(player); + } + return array; + } + + @Override + public void sendMessage(UUID uuid, String message) { + for (Player player : game.getServer().getOnlinePlayers()) { + if (player.getUniqueId().equals(uuid)) + player.sendMessage(TextSerializers.LEGACY_FORMATTING_CODE.deserialize(message)); + } + } + + @Override + public boolean kickPlayer(UUID uuid, String message) { + for (Player player : game.getServer().getOnlinePlayers()) { + if (player.getUniqueId().equals(uuid)) { + player.kick(TextSerializers.LEGACY_FORMATTING_CODE.deserialize(message)); + return true; + } + } + return false; + } + + @Override + public boolean isPluginEnabled() { + return true; + } + + @Override + public ViaAPI getApi() { + return api; + } + + @Override + public ViaVersionConfig getConf() { + return conf; + } + + @Override + public ConfigurationProvider getConfigurationProvider() { + return conf; + } + + @Override + public void onReload() { + // TODO: Warning? + } + + @Override + public JsonObject getDump() { + return new JsonObject(); + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/LoggerWrapper.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/LoggerWrapper.java new file mode 100644 index 000000000..63050bf9a --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/LoggerWrapper.java @@ -0,0 +1,125 @@ +package us.myles.ViaVersion.sponge; + +import org.slf4j.Logger; + +import java.util.logging.Level; +import java.util.logging.LogRecord; + +public class LoggerWrapper extends java.util.logging.Logger { + private final Logger base; + + public LoggerWrapper(Logger logger) { + super("logger", null); + this.base = logger; + } + + @Override + public void log(LogRecord record) { + log(record.getLevel(), record.getMessage()); + } + + @Override + public void log(Level level, String msg) { + if (level == Level.FINEST) { + base.trace(msg); + return; + } + if (level == Level.FINE) { + base.debug(msg); + return; + } + if (level == Level.WARNING) { + base.warn(msg); + return; + } + if (level == Level.SEVERE) { + base.error(msg); + return; + } + if (level == Level.INFO) { + base.info(msg); + return; + } + base.trace(msg); + return; + } + + @Override + public void log(Level level, String msg, Object param1) { + if (level == Level.FINEST) { + base.trace(msg, param1); + return; + } + if (level == Level.FINE) { + base.debug(msg, param1); + return; + } + if (level == Level.WARNING) { + base.warn(msg, param1); + return; + } + if (level == Level.SEVERE) { + base.error(msg, param1); + return; + } + if (level == Level.INFO) { + base.info(msg, param1); + return; + } + base.trace(msg, param1); + return; + } + + @Override + public void log(Level level, String msg, Object[] params) { + if (level == Level.FINEST) { + base.trace(msg, params); + return; + } + if (level == Level.FINE) { + base.debug(msg, params); + return; + } + if (level == Level.WARNING) { + base.warn(msg, params); + return; + } + if (level == Level.SEVERE) { + base.error(msg, params); + return; + } + if (level == Level.INFO) { + base.info(msg, params); + return; + } + base.trace(msg, params); + return; + } + + @Override + public void log(Level level, String msg, Throwable params) { + if (level == Level.FINEST) { + base.trace(msg, params); + return; + } + if (level == Level.FINE) { + base.debug(msg, params); + return; + } + if (level == Level.WARNING) { + base.warn(msg, params); + return; + } + if (level == Level.SEVERE) { + base.error(msg, params); + return; + } + if (level == Level.INFO) { + base.info(msg, params); + return; + } + base.trace(msg, params); + return; + } + +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeBossBar.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeBossBar.java new file mode 100644 index 000000000..ae29531c7 --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeBossBar.java @@ -0,0 +1,35 @@ +package us.myles.ViaVersion.sponge; + +import lombok.Getter; +import org.spongepowered.api.entity.living.player.Player; +import us.myles.ViaVersion.api.boss.BossBar; +import us.myles.ViaVersion.api.boss.BossColor; +import us.myles.ViaVersion.api.boss.BossStyle; +import us.myles.ViaVersion.boss.CommonBoss; + +@Getter +public class SpongeBossBar extends CommonBoss { + + public SpongeBossBar(String title, float health, BossColor color, BossStyle style) { + super(title, health, color, style); + } + + @Override + public BossBar addPlayer(Player player) { + addPlayer(player.getUniqueId()); + return this; + } + + @Override + public BossBar addPlayers(Player... players) { + for (Player p : players) + addPlayer(p); + return this; + } + + @Override + public BossBar removePlayer(Player player) { + removePlayer(player.getUniqueId()); + return this; + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeCommandHandler.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeCommandHandler.java new file mode 100644 index 000000000..a87c03805 --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeCommandHandler.java @@ -0,0 +1,47 @@ +package us.myles.ViaVersion.sponge; + +import org.spongepowered.api.command.CommandCallable; +import org.spongepowered.api.command.CommandException; +import org.spongepowered.api.command.CommandResult; +import org.spongepowered.api.command.CommandSource; +import org.spongepowered.api.text.Text; +import us.myles.ViaVersion.commands.ViaCommandHandler; + +import java.util.List; +import java.util.Optional; + +public class SpongeCommandHandler extends ViaCommandHandler implements CommandCallable { + + @Override + public CommandResult process(CommandSource source, String arguments) throws CommandException { + String[] args = arguments.length() > 0 ? arguments.split(" ") : new String[0]; + onCommand(new SpongeCommandSender(source), args); + return CommandResult.success(); + } + + @Override + public List getSuggestions(CommandSource source, String arguments) throws CommandException { + String[] args = arguments.length() > 0 ? arguments.split(" ") : new String[0]; + return onTabComplete(new SpongeCommandSender(source), args); + } + + @Override + public boolean testPermission(CommandSource source) { + return source.hasPermission("viaversion.admin"); + } + + @Override + public Optional getShortDescription(CommandSource source) { + return Optional.of(Text.of("Shows ViaVersion Version and more.")); + } + + @Override + public Optional getHelp(CommandSource source) { + return Optional.empty(); + } + + @Override + public Text getUsage(CommandSource source) { + return Text.of("Usage /viaversion"); + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeCommandSender.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeCommandSender.java new file mode 100644 index 000000000..b4c29a260 --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeCommandSender.java @@ -0,0 +1,39 @@ +package us.myles.ViaVersion.sponge; + +import lombok.AllArgsConstructor; +import org.spongepowered.api.command.CommandSource; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.text.serializer.TextSerializer; +import org.spongepowered.api.text.serializer.TextSerializers; +import us.myles.ViaVersion.api.command.ViaCommandSender; + +import java.util.UUID; + +@AllArgsConstructor +public class SpongeCommandSender implements ViaCommandSender { + private CommandSource source; + + @Override + public boolean hasPermission(String permission) { + return source.hasPermission(permission); + } + + @Override + public void sendMessage(String msg) { + source.sendMessage(TextSerializers.LEGACY_FORMATTING_CODE.deserialize(msg)); + } + + @Override + public UUID getUUID() { + if (source instanceof Player) { + return ((Player) source).getUniqueId(); + } else { + return UUID.fromString(getName()); + } + } + + @Override + public String getName() { + return source.getName(); + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeConfigAPI.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeConfigAPI.java new file mode 100644 index 000000000..df02666e9 --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeConfigAPI.java @@ -0,0 +1,183 @@ +package us.myles.ViaVersion.sponge; + +import us.myles.ViaVersion.SpongePlugin; +import us.myles.ViaVersion.api.ViaVersionConfig; +import us.myles.ViaVersion.api.configuration.ConfigurationProvider; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class SpongeConfigAPI implements ViaVersionConfig, ConfigurationProvider{ + private final SpongePlugin spongePlugin; + + public SpongeConfigAPI(SpongePlugin spongePlugin) { + this.spongePlugin = spongePlugin; + } + + @Override + public boolean isCheckForUpdates() { + return false; + } + + @Override + public boolean isPreventCollision() { + return false; + } + + @Override + public boolean isNewEffectIndicator() { + return false; + } + + @Override + public boolean isShowNewDeathMessages() { + return false; + } + + @Override + public boolean isSuppressMetadataErrors() { + return false; + } + + @Override + public boolean isShieldBlocking() { + return false; + } + + @Override + public boolean isHologramPatch() { + return false; + } + + @Override + public boolean isBossbarPatch() { + return false; + } + + @Override + public boolean isBossbarAntiflicker() { + return false; + } + + @Override + public boolean isUnknownEntitiesSuppressed() { + return false; + } + + @Override + public double getHologramYOffset() { + return 0; + } + + @Override + public boolean isAutoTeam() { + return false; + } + + @Override + public boolean isBlockBreakPatch() { + return false; + } + + @Override + public int getMaxPPS() { + return 0; + } + + @Override + public String getMaxPPSKickMessage() { + return null; + } + + @Override + public int getTrackingPeriod() { + return 0; + } + + @Override + public int getWarningPPS() { + return 0; + } + + @Override + public int getMaxWarnings() { + return 0; + } + + @Override + public String getMaxWarningsKickMessage() { + return null; + } + + @Override + public boolean isAntiXRay() { + return false; + } + + @Override + public boolean isSendSupportedVersions() { + return false; + } + + @Override + public boolean isStimulatePlayerTick() { + return false; + } + + @Override + public boolean isItemCache() { + return false; + } + + @Override + public boolean isNMSPlayerTicking() { + return false; + } + + @Override + public boolean isReplacePistons() { + return false; + } + + @Override + public int getPistonReplacementId() { + return 0; + } + + @Override + public boolean isForceJsonTransform() { + return false; + } + + @Override + public List getBlockedProtocols() { + return Arrays.asList(0); + } + + @Override + public String getBlockedDisconnectMsg() { + return "Boop"; + } + + @Override + public String getReloadDisconnectMsg() { + return "Beep"; + } + + @Override + public void set(String path, Object value) { + + } + + @Override + public void saveConfig() { + + } + + @Override + public Map getValues() { + return new HashMap<>(); + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaAPI.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaAPI.java new file mode 100644 index 000000000..f0628a7f1 --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaAPI.java @@ -0,0 +1,81 @@ +package us.myles.ViaVersion.sponge; + +import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.NonNull; +import org.spongepowered.api.entity.living.player.Player; +import us.myles.ViaVersion.SpongePlugin; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.ViaAPI; +import us.myles.ViaVersion.api.boss.BossBar; +import us.myles.ViaVersion.api.boss.BossColor; +import us.myles.ViaVersion.api.boss.BossStyle; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.protocol.ProtocolRegistry; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; + +import java.util.Map; +import java.util.SortedSet; +import java.util.TreeSet; +import java.util.UUID; + +public class SpongeViaAPI implements ViaAPI { + + @Override + public int getPlayerVersion(@NonNull Player player) { + if (!isPorted(player.getUniqueId())) + return ProtocolRegistry.SERVER_PROTOCOL; + return getPortedPlayers().get(player.getUniqueId()).get(ProtocolInfo.class).getProtocolVersion(); + } + + @Override + public int getPlayerVersion(@NonNull UUID uuid) { + if (!isPorted(uuid)) + return ProtocolRegistry.SERVER_PROTOCOL; + return getPortedPlayers().get(uuid).get(ProtocolInfo.class).getProtocolVersion(); + } + + @Override + public boolean isPorted(UUID playerUUID) { + return getPortedPlayers().containsKey(playerUUID); + } + + @Override + public String getVersion() { + return Via.getPlatform().getPluginVersion(); + } + + @Override + public void sendRawPacket(UUID uuid, ByteBuf packet) throws IllegalArgumentException { + if (!isPorted(uuid)) throw new IllegalArgumentException("This player is not controlled by ViaVersion!"); + UserConnection ci = getPortedPlayers().get(uuid); + ci.sendRawPacket(packet); + } + + @Override + public void sendRawPacket(Player player, ByteBuf packet) throws IllegalArgumentException { + sendRawPacket(player.getUniqueId(), packet); + } + + @Override + public BossBar createBossBar(String title, BossColor color, BossStyle style) { + return new SpongeBossBar(title, 1F, color, style); + } + + @Override + public BossBar createBossBar(String title, float health, BossColor color, BossStyle style) { + return new SpongeBossBar(title, health, color, style); + } + + @Override + public SortedSet getSupportedVersions() { + SortedSet outputSet = new TreeSet<>(ProtocolRegistry.getSupportedVersions()); + outputSet.removeAll(Via.getPlatform().getConf().getBlockedProtocols()); + + return outputSet; + } + + public Map getPortedPlayers() { + return Via.getManager().getPortedPlayers(); + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java new file mode 100644 index 000000000..e704cc356 --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java @@ -0,0 +1,197 @@ +package us.myles.ViaVersion.sponge; + +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.socket.SocketChannel; +import us.myles.ViaVersion.api.Pair; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.platform.ViaInjector; +import us.myles.ViaVersion.sponge.handlers.ViaVersionInitializer; +import us.myles.ViaVersion.sponge.util.ReflectionUtil; +import us.myles.ViaVersion.util.ListWrapper; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.List; + +public class SpongeViaInjector implements ViaInjector { + private List injectedFutures = new ArrayList<>(); + private List> injectedLists = new ArrayList<>(); + + @Override + public void inject() throws Exception { + try { + Object connection = getServerConnection(); + if (connection == null) { + throw new Exception("We failed to find the core component 'ServerConnection', please file an issue on our GitHub."); + } + for (Field field : connection.getClass().getDeclaredFields()) { + field.setAccessible(true); + final Object value = field.get(connection); + if (value instanceof List) { + // Inject the list + List wrapper = new ListWrapper((List) value) { + @Override + public synchronized void handleAdd(Object o) { + synchronized (this) { + if (o instanceof ChannelFuture) { + try { + injectChannelFuture((ChannelFuture) o); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + }; + injectedLists.add(new Pair<>(field, connection)); + field.set(connection, wrapper); + // Iterate through current list + synchronized (wrapper) { + for (Object o : (List) value) { + if (o instanceof ChannelFuture) { + injectChannelFuture((ChannelFuture) o); + } else { + break; // not the right list. + } + } + } + } + } + + } catch (Exception e) { + Via.getPlatform().getLogger().severe("Unable to inject ViaVersion, please post these details on our GitHub and ensure you're using a compatible server version."); + throw e; + } + } + + private void injectChannelFuture(ChannelFuture future) throws Exception { + try { + ChannelHandler bootstrapAcceptor = future.channel().pipeline().first(); + try { + ChannelInitializer oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class); + ChannelInitializer newInit = new ViaVersionInitializer(oldInit); + + ReflectionUtil.set(bootstrapAcceptor, "childHandler", newInit); + injectedFutures.add(future); + } catch (NoSuchFieldException e) { + throw new Exception("Unable to find core component 'childHandler', please check your plugins. issue: " + bootstrapAcceptor.getClass().getName()); + + } + } catch (Exception e) { + Via.getPlatform().getLogger().severe("We failed to inject ViaVersion, have you got late-bind enabled with something else?"); + throw e; + } + } + + @Override + public void uninject() { + // TODO: Uninject from players currently online + for (ChannelFuture future : injectedFutures) { + ChannelHandler bootstrapAcceptor = future.channel().pipeline().first(); + try { + ChannelInitializer oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class); + if (oldInit instanceof ViaVersionInitializer) { + ReflectionUtil.set(bootstrapAcceptor, "childHandler", ((ViaVersionInitializer) oldInit).getOriginal()); + } + } catch (Exception e) { + System.out.println("Failed to remove injection handler, reload won't work with connections, please reboot!"); + } + } + injectedFutures.clear(); + + for (Pair pair : injectedLists) { + try { + Object o = pair.getKey().get(pair.getValue()); + if (o instanceof ListWrapper) { + pair.getKey().set(pair.getValue(), ((ListWrapper) o).getOriginalList()); + } + } catch (IllegalAccessException e) { + System.out.println("Failed to remove injection, reload won't work with connections, please reboot!"); + } + } + + injectedLists.clear(); + } + + public static Object getServer() throws Exception { + Class serverClazz = Class.forName("net.minecraft.server.MinecraftServer"); + for (Method m : serverClazz.getDeclaredMethods()) { + if (m.getParameterCount() == 0) { + if ((m.getModifiers() & Modifier.STATIC) == Modifier.STATIC) { + if (m.getReturnType().equals(serverClazz)) { + return m.invoke(null); + } + } + } + } + throw new Exception("Could not find MinecraftServer static field!"); + } + + @Override + public int getServerProtocolVersion() throws Exception { + try { + Class serverClazz = Class.forName("net.minecraft.server.MinecraftServer"); + Object server = getServer(); + Class pingClazz = Class.forName("net.minecraft.network.ServerStatusResponse"); + Object ping = null; + // Search for ping method + for (Field f : serverClazz.getDeclaredFields()) { + if (f.getType() != null) { + if (f.getType().getSimpleName().equals("ServerStatusResponse")) { + f.setAccessible(true); + ping = f.get(server); + } + } + } + if (ping != null) { + Object serverData = null; + for (Field f : pingClazz.getDeclaredFields()) { + if (f.getType() != null) { + if (f.getType().getSimpleName().endsWith("MinecraftProtocolVersionIdentifier")) { + f.setAccessible(true); + serverData = f.get(ping); + } + } + } + if (serverData != null) { + int protocolVersion = -1; + for (Field f : serverData.getClass().getDeclaredFields()) { + if (f.getType() != null) { + if (f.getType() == int.class) { + f.setAccessible(true); + protocolVersion = (int) f.get(serverData); + } + } + } + if (protocolVersion != -1) { + return protocolVersion; + } + } + } + } catch (Exception e) { + throw new Exception("Failed to get server", e); + } + throw new Exception("Failed to get server"); + } + + public static Object getServerConnection() throws Exception { + Class serverClazz = Class.forName("net.minecraft.server.MinecraftServer"); + Object server = getServer(); + Object connection = null; + for (Method m : serverClazz.getDeclaredMethods()) { + if (m.getReturnType() != null) { + if (m.getReturnType().getSimpleName().equals("NetworkSystem")) { + if (m.getParameterTypes().length == 0) { + connection = m.invoke(server); + } + } + } + } + return connection; + } + +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaLoader.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaLoader.java new file mode 100644 index 000000000..b11eb5948 --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaLoader.java @@ -0,0 +1,72 @@ +package us.myles.ViaVersion.sponge; + +import lombok.AllArgsConstructor; +import org.spongepowered.api.Sponge; +import us.myles.ViaVersion.SpongePlugin; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.platform.ViaPlatformLoader; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; +import us.myles.ViaVersion.sponge.listeners.ClientLeaveListener; +import us.myles.ViaVersion.sponge.listeners.UpdateListener; +import us.myles.ViaVersion.sponge.providers.SpongeViaBulkChunkTranslator; +import us.myles.ViaVersion.sponge.providers.SpongeViaMovementTransmitter; + +@AllArgsConstructor +public class SpongeViaLoader implements ViaPlatformLoader { + private SpongePlugin plugin; + + @Override + public void load() { + // Update Listener + Sponge.getEventManager().registerListeners(plugin, new UpdateListener()); +// + /* Base Protocol */ + Sponge.getEventManager().registerListeners(plugin, new ClientLeaveListener()); +// /* 1.9 client to 1.8 server */ +// +// new ArmorListener(plugin).register(); +// new CommandBlockListener(plugin).register(); +// new DeathListener(plugin).register(); +// new BlockListener(plugin).register(); +// +// if (Bukkit.getVersion().toLowerCase().contains("paper") || Bukkit.getVersion().toLowerCase().contains("taco")) { +// plugin.getLogger().info("Enabling PaperSpigot/TacoSpigot patch: Fixes block placement."); +// new PaperPatch(plugin).register(); +// } +// if (plugin.getConf().isItemCache()) { +// new HandItemCache().runTaskTimerAsynchronously(plugin, 2L, 2L); // Updates player's items :) +// HandItemCache.CACHE = true; +// } +// +// /* Providers */ + Via.getManager().getProviders().use(BulkChunkTranslatorProvider.class, new SpongeViaBulkChunkTranslator()); + Via.getManager().getProviders().use(MovementTransmitterProvider.class, new SpongeViaMovementTransmitter()); +// Via.getManager().getProviders().use(HandItemProvider.class, new HandItemProvider() { +// @Override +// public Item getHandItem(final UserConnection info) { +// if (HandItemCache.CACHE) { +// return HandItemCache.getHandItem(info.get(ProtocolInfo.class).getUuid()); +// } else { +// try { +// return Bukkit.getScheduler().callSyncMethod(Bukkit.getPluginManager().getPlugin("ViaVersion"), new Callable() { +// @Override +// public Item call() throws Exception { +// UUID playerUUID = info.get(ProtocolInfo.class).getUuid(); +// if (Bukkit.getPlayer(playerUUID) != null) { +// return HandItemCache.convert(Bukkit.getPlayer(playerUUID).getItemInHand()); +// } +// return null; +// } +// }).get(10, TimeUnit.SECONDS); +// } catch (Exception e) { +// System.out.println("Error fetching hand item: " + e.getClass().getName()); +// if (Via.getManager().isDebug()) +// e.printStackTrace(); +// return null; +// } +// } +// } +// }); + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaDecodeHandler.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaDecodeHandler.java new file mode 100644 index 000000000..b2bce7c0b --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaDecodeHandler.java @@ -0,0 +1,90 @@ +package us.myles.ViaVersion.sponge.handlers; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.exception.CancelException; +import us.myles.ViaVersion.packets.Direction; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; +import us.myles.ViaVersion.util.PipelineUtil; + +import java.lang.reflect.InvocationTargetException; +import java.util.List; + +public class ViaDecodeHandler extends ByteToMessageDecoder { + + private final ByteToMessageDecoder minecraftDecoder; + private final UserConnection info; + + public ViaDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) { + this.info = info; + this.minecraftDecoder = minecraftDecoder; + } + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf bytebuf, List list) throws Exception { + // use transformers + if (bytebuf.readableBytes() > 0) { + // Ignore if pending disconnect + if (info.isPendingDisconnect()) { + return; + } + // Increment received + boolean second = info.incrementReceived(); + // Check PPS + // TODO implement pps +// if (second) { +// if (((ViaVersionPlugin) Via.getPlatform()).handlePPS(info)) +// return; +// } + + if (info.isActive()) { + // Handle ID + int id = Type.VAR_INT.read(bytebuf); + // Transform + ByteBuf newPacket = ctx.alloc().buffer(); + try { + if (id == PacketWrapper.PASSTHROUGH_ID) { + newPacket.writeBytes(bytebuf); + } else { + PacketWrapper wrapper = new PacketWrapper(id, bytebuf, info); + ProtocolInfo protInfo = info.get(ProtocolInfo.class); + protInfo.getPipeline().transform(Direction.INCOMING, protInfo.getState(), wrapper); + wrapper.writeToBuffer(newPacket); + } + + bytebuf.clear(); + bytebuf = newPacket; + } catch (Exception e) { + // Clear Buffer + bytebuf.clear(); + // Release Packet, be free! + newPacket.release(); + throw e; + } + } + + // call minecraft decoder + try { + list.addAll(PipelineUtil.callDecode(this.minecraftDecoder, ctx, bytebuf)); + } catch (InvocationTargetException e) { + if (e.getCause() instanceof Exception) { + throw (Exception) e.getCause(); + } + } finally { + if (info.isActive()) { + bytebuf.release(); + } + } + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + if (PipelineUtil.containsCause(cause, CancelException.class)) return; + super.exceptionCaught(ctx, cause); + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaEncodeHandler.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaEncodeHandler.java new file mode 100644 index 000000000..ce6faef49 --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaEncodeHandler.java @@ -0,0 +1,72 @@ +package us.myles.ViaVersion.sponge.handlers; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; +import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.exception.CancelException; +import us.myles.ViaVersion.packets.Direction; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; +import us.myles.ViaVersion.util.PipelineUtil; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; + +public class ViaEncodeHandler extends MessageToByteEncoder { + private final UserConnection info; + private final MessageToByteEncoder minecraftEncoder; + + public ViaEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) { + this.info = info; + this.minecraftEncoder = minecraftEncoder; + } + + + @Override + protected void encode(final ChannelHandlerContext ctx, Object o, final ByteBuf bytebuf) throws Exception { + // handle the packet type + if (!(o instanceof ByteBuf)) { + // call minecraft encoder + try { + PipelineUtil.callEncode(this.minecraftEncoder, ctx, o, bytebuf); + } catch (InvocationTargetException e) { + if (e.getCause() instanceof Exception) { + throw (Exception) e.getCause(); + } + } + } + if (bytebuf.readableBytes() == 0) { + throw new CancelException(); + } + // Increment sent + info.incrementSent(); + if (info.isActive()) { + // Handle ID + int id = Type.VAR_INT.read(bytebuf); + // Transform + ByteBuf oldPacket = bytebuf.copy(); + bytebuf.clear(); + + try { + PacketWrapper wrapper = new PacketWrapper(id, oldPacket, info); + ProtocolInfo protInfo = info.get(ProtocolInfo.class); + protInfo.getPipeline().transform(Direction.OUTGOING, protInfo.getState(), wrapper); + wrapper.writeToBuffer(bytebuf); + } catch (Exception e) { + bytebuf.clear(); + throw e; + } finally { + oldPacket.release(); + } + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + if (PipelineUtil.containsCause(cause, CancelException.class)) return; + super.exceptionCaught(ctx, cause); + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaPacketHandler.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaPacketHandler.java new file mode 100644 index 000000000..07e4deb03 --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaPacketHandler.java @@ -0,0 +1,35 @@ +package us.myles.ViaVersion.sponge.handlers; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToMessageEncoder; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; + +import java.util.List; + +public class ViaPacketHandler extends MessageToMessageEncoder { + private final UserConnection info; + + public ViaPacketHandler(UserConnection info) { + this.info = info; + } + + @Override + protected void encode(ChannelHandlerContext ctx, Object o, List list) throws Exception { + // Split chunks bulk packet up in to single chunks packets before it reached the encoder. + // This will prevent issues with several plugins and other protocol handlers due to the chunks being sent twice. + // It also sends the chunks in the right order possible resolving some issues with added chunks/block/entity data. + if (!(o instanceof ByteBuf)) { + info.setLastPacket(o); + /* This transformer is more for fixing issues which we find hard at packet level :) */ + if (info.isActive()) { + if (info.get(ProtocolInfo.class).getPipeline().filter(o, list)) { + return; + } + } + } + + list.add(o); + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaVersionInitializer.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaVersionInitializer.java new file mode 100644 index 000000000..2a29c110b --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaVersionInitializer.java @@ -0,0 +1,48 @@ +package us.myles.ViaVersion.sponge.handlers; + +import io.netty.channel.Channel; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.ByteToMessageDecoder; +import io.netty.handler.codec.MessageToByteEncoder; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.protocol.ProtocolPipeline; + +import java.lang.reflect.Method; + +public class ViaVersionInitializer extends ChannelInitializer { + + private final ChannelInitializer original; + private Method method; + + public ViaVersionInitializer(ChannelInitializer oldInit) { + this.original = oldInit; + try { + this.method = ChannelInitializer.class.getDeclaredMethod("initChannel", Channel.class); + this.method.setAccessible(true); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + } + + public ChannelInitializer getOriginal() { + return original; + } + + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + UserConnection info = new UserConnection(socketChannel); + // init protocol + new ProtocolPipeline(info); + // Add originals + this.method.invoke(this.original, socketChannel); + // Add our transformers + MessageToByteEncoder encoder = new ViaEncodeHandler(info, (MessageToByteEncoder) socketChannel.pipeline().get("encoder")); + ByteToMessageDecoder decoder = new ViaDecodeHandler(info, (ByteToMessageDecoder) socketChannel.pipeline().get("decoder")); + ViaPacketHandler chunkHandler = new ViaPacketHandler(info); + + socketChannel.pipeline().replace("encoder", "encoder", encoder); + socketChannel.pipeline().replace("decoder", "decoder", decoder); + socketChannel.pipeline().addAfter("packet_handler", "viaversion_packet_handler", chunkHandler); + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/ClientLeaveListener.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/ClientLeaveListener.java new file mode 100644 index 000000000..20ef79688 --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/ClientLeaveListener.java @@ -0,0 +1,12 @@ +package us.myles.ViaVersion.sponge.listeners; + +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.network.ClientConnectionEvent; +import us.myles.ViaVersion.api.Via; + +public class ClientLeaveListener { + @Listener + public void onDisconnect(ClientConnectionEvent.Disconnect disconnect) { + Via.getManager().removePortedClient(disconnect.getTargetEntity().getUniqueId()); + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/UpdateListener.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/UpdateListener.java new file mode 100644 index 000000000..010570a63 --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/UpdateListener.java @@ -0,0 +1,16 @@ +package us.myles.ViaVersion.sponge.listeners; + +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.network.ClientConnectionEvent; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.update.UpdateUtil; + +public class UpdateListener { + @Listener + public void onJoin(ClientConnectionEvent.Join join) { + if (join.getTargetEntity().hasPermission("viaversion.update") + && Via.getConfig().isCheckForUpdates()) { + UpdateUtil.sendUpdateMessage(join.getTargetEntity().getUniqueId()); + } + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaBulkChunkTranslator.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaBulkChunkTranslator.java new file mode 100644 index 000000000..f10b3597d --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaBulkChunkTranslator.java @@ -0,0 +1,55 @@ +package us.myles.ViaVersion.sponge.providers; + +import com.google.common.collect.Lists; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks; +import us.myles.ViaVersion.sponge.util.ReflectionUtil; + +import java.util.List; +import java.util.logging.Level; + +public class SpongeViaBulkChunkTranslator extends BulkChunkTranslatorProvider { + // Reflection + private static ReflectionUtil.ClassReflection mapChunkBulkRef; + private static ReflectionUtil.ClassReflection mapChunkRef; + + static { + try { + mapChunkBulkRef = new ReflectionUtil.ClassReflection(Class.forName("net.minecraft.network.play.server.S26PacketMapChunkBulk")); + mapChunkRef = new ReflectionUtil.ClassReflection(Class.forName("net.minecraft.network.play.server.S21PacketChunkData")); + } catch (Exception e) { + Via.getPlatform().getLogger().log(Level.WARNING, "Failed to initialise chunks reflection", e); + } + } + + @Override + public List transformMapChunkBulk(Object packet, ClientChunks clientChunks) { + List list = Lists.newArrayList(); + try { + int[] xcoords = mapChunkBulkRef.getFieldValue("field_149266_a", packet, int[].class); + int[] zcoords = mapChunkBulkRef.getFieldValue("field_149264_b", packet, int[].class); + Object[] chunkMaps = mapChunkBulkRef.getFieldValue("field_179755_c", packet, Object[].class); + for (int i = 0; i < chunkMaps.length; i++) { + int x = xcoords[i]; + int z = zcoords[i]; + Object chunkMap = chunkMaps[i]; + Object chunkPacket = mapChunkRef.newInstance(); + mapChunkRef.setFieldValue("field_149284_a", chunkPacket, x); + mapChunkRef.setFieldValue("field_149282_b", chunkPacket, z); + mapChunkRef.setFieldValue("field_179758_c", chunkPacket, chunkMap); + mapChunkRef.setFieldValue("field_149279_g", chunkPacket, true); // Chunk bulk chunks are always ground-up + clientChunks.getBulkChunks().add(ClientChunks.toLong(x, z)); // Store for later + list.add(chunkPacket); + } + } catch (Exception e) { + Via.getPlatform().getLogger().log(Level.WARNING, "Failed to transform chunks bulk", e); + } + return list; + } + + @Override + public boolean isFiltered(Class packetClass) { + return packetClass.getName().endsWith("S26PacketMapChunkBulk"); + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaMovementTransmitter.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaMovementTransmitter.java new file mode 100644 index 000000000..fb469a259 --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaMovementTransmitter.java @@ -0,0 +1,41 @@ +package us.myles.ViaVersion.sponge.providers; + +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; + +import java.lang.reflect.Field; + +public class SpongeViaMovementTransmitter extends MovementTransmitterProvider { + // Used for packet mode + private Object idlePacket; + private Object idlePacket2; + + public SpongeViaMovementTransmitter() { + Class idlePacketClass; + try { + idlePacketClass = Class.forName("net.minecraft.network.play.client.C03PacketPlayer"); + } catch (ClassNotFoundException e) { + throw new RuntimeException("Couldn't find idle packet, help!", e); + } + try { + idlePacket = idlePacketClass.newInstance(); + idlePacket2 = idlePacketClass.newInstance(); + + Field flying = idlePacketClass.getDeclaredField("field_149474_g"); + flying.setAccessible(true); + + flying.set(idlePacket2, true); + } catch (NoSuchFieldException | InstantiationException | IllegalArgumentException | IllegalAccessException e) { + throw new RuntimeException("Couldn't make player idle packet, help!", e); + } + } + + @Override + public Object getFlyingPacket() { + return idlePacket2; + } + + @Override + public Object getGroundPacket() { + return idlePacket; + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/util/ReflectionUtil.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/util/ReflectionUtil.java new file mode 100644 index 000000000..cb025a014 --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/util/ReflectionUtil.java @@ -0,0 +1,130 @@ +package us.myles.ViaVersion.sponge.util; + +import com.google.common.collect.Maps; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; + +public class ReflectionUtil { + + public static Object invokeStatic(Class clazz, String method) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Method m = clazz.getDeclaredMethod(method); + return m.invoke(null); + } + + public static Object invoke(Object o, String method) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Method m = o.getClass().getDeclaredMethod(method); + return m.invoke(o); + } + + public static T getStatic(Class clazz, String f, Class t) throws NoSuchFieldException, IllegalAccessException { + Field field = clazz.getDeclaredField(f); + field.setAccessible(true); + return (T) field.get(null); + } + + public static T getSuper(Object o, String f, Class t) throws NoSuchFieldException, IllegalAccessException { + Field field = o.getClass().getSuperclass().getDeclaredField(f); + field.setAccessible(true); + return (T) field.get(o); + } + + public static T get(Object instance, Class clazz, String f, Class t) throws NoSuchFieldException, IllegalAccessException { + Field field = clazz.getDeclaredField(f); + field.setAccessible(true); + return (T) field.get(instance); + } + + public static T get(Object o, String f, Class t) throws NoSuchFieldException, IllegalAccessException { + Field field = o.getClass().getDeclaredField(f); + field.setAccessible(true); + return (T) field.get(o); + } + + public static T getPublic(Object o, String f, Class t) throws NoSuchFieldException, IllegalAccessException { + Field field = o.getClass().getField(f); + field.setAccessible(true); + return (T) field.get(o); + } + + + public static void set(Object o, String f, Object value) throws NoSuchFieldException, IllegalAccessException { + Field field = o.getClass().getDeclaredField(f); + field.setAccessible(true); + field.set(o, value); + } + + public static final class ClassReflection { + private final Class handle; + private final Map fields = Maps.newConcurrentMap(); + private final Map methods = Maps.newConcurrentMap(); + + public ClassReflection(Class handle) { + this(handle, true); + } + + public ClassReflection(Class handle, boolean recursive) { + this.handle = handle; + scanFields(handle, recursive); + scanMethods(handle, recursive); + } + + private void scanFields(Class host, boolean recursive) { + if (host.getSuperclass() != null && recursive) { + scanFields(host.getSuperclass(), true); + } + + for (Field field : host.getDeclaredFields()) { + field.setAccessible(true); + fields.put(field.getName(), field); + } + } + + private void scanMethods(Class host, boolean recursive) { + if (host.getSuperclass() != null && recursive) { + scanMethods(host.getSuperclass(), true); + } + + for (Method method : host.getDeclaredMethods()) { + method.setAccessible(true); + methods.put(method.getName(), method); + } + } + + public Object newInstance() throws IllegalAccessException, InstantiationException { + return handle.newInstance(); + } + + public Field getField(String name) { + return fields.get(name); + } + + public void setFieldValue(String fieldName, Object instance, Object value) throws IllegalAccessException { + getField(fieldName).set(instance, value); + } + + public T getFieldValue(String fieldName, Object instance, Class type) throws IllegalAccessException { + return type.cast(getField(fieldName).get(instance)); + } + + public T invokeMethod(Class type, String methodName, Object instance, Object... args) throws InvocationTargetException, IllegalAccessException { + return type.cast(getMethod(methodName).invoke(instance, args)); + } + + public Method getMethod(String name) { + return methods.get(name); + } + + public Collection getFields() { + return Collections.unmodifiableCollection(fields.values()); + } + + public Collection getMethods() { + return Collections.unmodifiableCollection(methods.values()); + } + } +} From 4840db095cb91b8db5bf1edee8f8c8e1c5037bbf Mon Sep 17 00:00:00 2001 From: Matsv Date: Mon, 26 Sep 2016 11:02:54 +0200 Subject: [PATCH 25/76] Fix metadata --- .../protocols/protocol1_9to1_8/metadata/MetaIndex.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java index b84ded186..be627a532 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java @@ -15,10 +15,10 @@ public enum MetaIndex { // entity ENTITY_STATUS(ENTITY, 0, Type.Byte, NewType.Byte), ENTITY_AIR(ENTITY, 1, Type.Short, NewType.VarInt), + ENTITY_NAMETAG(ENTITY, 2, Type.String, NewType.String), // in the entity class @ spigot 1.8.8, blame wiki.vg + ENTITY_ALWAYS_SHOW_NAMETAG(ENTITY, 3, Type.Byte, NewType.Boolean), // in the entity class @ Spigot 1.8.8, blame wiki.vg ENTITY_SILENT(ENTITY, 4, Type.Byte, NewType.Boolean), // living entity - LIVINGENTITY_NAMETAG(ENTITY_LIVING, 2, Type.String, NewType.String), - LIVINGENTITY_ALWAYS_SHOW_NAMETAG(ENTITY_LIVING, 3, Type.Byte, NewType.Boolean), LIVINGENTITY_HEALTH(ENTITY_LIVING, 6, Type.Float, NewType.Float), LIVINGENTITY_POTION_EFFECT_COLOR(ENTITY_LIVING, 7, Type.Int, NewType.VarInt), LIVINGENTITY_IS_POTION_AMBIENT(ENTITY_LIVING, 8, Type.Byte, NewType.Boolean), From 9a8a6e5b166cf26c1adfd793824295e22b7c43ef Mon Sep 17 00:00:00 2001 From: Matsv Date: Mon, 26 Sep 2016 11:16:20 +0200 Subject: [PATCH 26/76] Implement PPS for Sponge --- .../us/myles/ViaVersion/ViaVersionPlugin.java | 30 ----------------- .../ViaVersion/handlers/ViaDecodeHandler.java | 2 +- .../ViaVersion/api/data/UserConnection.java | 32 +++++++++++++++++++ .../sponge/handlers/ViaDecodeHandler.java | 10 +++--- 4 files changed, 38 insertions(+), 36 deletions(-) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 418fd6494..eaf67ba9f 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -137,36 +137,6 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { return protocolSupport; } - public boolean handlePPS(UserConnection info) { - // Max PPS Checker - if (conf.getMaxPPS() > 0) { - if (info.getPacketsPerSecond() >= conf.getMaxPPS()) { - info.disconnect(conf.getMaxPPSKickMessage().replace("%pps", ((Long) info.getPacketsPerSecond()).intValue() + "")); - return true; // don't send current packet - } - } - - // Tracking PPS Checker - if (conf.getMaxWarnings() > 0 && conf.getTrackingPeriod() > 0) { - if (info.getSecondsObserved() > conf.getTrackingPeriod()) { - // Reset - info.setWarnings(0); - info.setSecondsObserved(1); - } else { - info.setSecondsObserved(info.getSecondsObserved() + 1); - if (info.getPacketsPerSecond() >= conf.getWarningPPS()) { - info.setWarnings(info.getWarnings() + 1); - } - - if (info.getWarnings() >= conf.getMaxWarnings()) { - info.disconnect(conf.getMaxWarningsKickMessage().replace("%pps", ((Long) info.getPacketsPerSecond()).intValue() + "")); - return true; // don't send current packet - } - } - } - return false; - } - @Override public String getPlatformName() { return "Bukkit"; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java index 13216ab98..e021349a7 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java @@ -39,7 +39,7 @@ public class ViaDecodeHandler extends ByteToMessageDecoder { boolean second = info.incrementReceived(); // Check PPS if (second) { - if (((ViaVersionPlugin) Via.getPlatform()).handlePPS(info)) + if (info.handlePPS()) return; } diff --git a/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java b/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java index 656e23980..a4da34d05 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java +++ b/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java @@ -7,6 +7,7 @@ import io.netty.channel.socket.SocketChannel; import lombok.Data; import net.md_5.bungee.api.ChatColor; import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.ViaVersionConfig; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import java.util.Map; @@ -133,6 +134,37 @@ public class UserConnection { return false; } + public boolean handlePPS() { + ViaVersionConfig conf = Via.getConfig(); + // Max PPS Checker + if (conf.getMaxPPS() > 0) { + if (getPacketsPerSecond() >= conf.getMaxPPS()) { + disconnect(conf.getMaxPPSKickMessage().replace("%pps", ((Long) getPacketsPerSecond()).intValue() + "")); + return true; // don't send current packet + } + } + + // Tracking PPS Checker + if (conf.getMaxWarnings() > 0 && conf.getTrackingPeriod() > 0) { + if (getSecondsObserved() > conf.getTrackingPeriod()) { + // Reset + setWarnings(0); + setSecondsObserved(1); + } else { + setSecondsObserved(getSecondsObserved() + 1); + if (getPacketsPerSecond() >= conf.getWarningPPS()) { + setWarnings(getWarnings() + 1); + } + + if (getWarnings() >= conf.getMaxWarnings()) { + disconnect(conf.getMaxWarningsKickMessage().replace("%pps", ((Long) getPacketsPerSecond()).intValue() + "")); + return true; // don't send current packet + } + } + } + return false; + } + /** * Disconnect a connection * diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaDecodeHandler.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaDecodeHandler.java index b2bce7c0b..bd42d7f60 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaDecodeHandler.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaDecodeHandler.java @@ -4,6 +4,7 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ByteToMessageDecoder; import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.exception.CancelException; @@ -35,11 +36,10 @@ public class ViaDecodeHandler extends ByteToMessageDecoder { // Increment received boolean second = info.incrementReceived(); // Check PPS - // TODO implement pps -// if (second) { -// if (((ViaVersionPlugin) Via.getPlatform()).handlePPS(info)) -// return; -// } + if (second) { + if (info.handlePPS()) + return; + } if (info.isActive()) { // Handle ID From 90dabce0d28f8840c81da0ffbf542bcb6e4c4d7b Mon Sep 17 00:00:00 2001 From: Myles Date: Mon, 26 Sep 2016 11:48:06 +0100 Subject: [PATCH 27/76] Sponge: Fix dump, add load message, move loading, handle reload And fix travis --- .travis.yml | 2 +- TODOLIST | 7 ++++- .../java/us/myles/ViaVersion/ViaManager.java | 1 - .../us/myles/ViaVersion/SpongePlugin.java | 26 ++++++++++++++++--- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 74e44a99b..f87395083 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ sudo: false language: java -jdk: oraclejdk7 +jdk: oraclejdk8 cache: directories: diff --git a/TODOLIST b/TODOLIST index 7186f5903..e4e40f1b1 100644 --- a/TODOLIST +++ b/TODOLIST @@ -1,2 +1,7 @@ PORT STUFF TO GUAVA :D (so we dont need to include commons) -Test on SpongeForge, only tested SpongeVanilla \ No newline at end of file +Test on SpongeForge, only tested SpongeVanilla +Stop using new Gson() everywhere +Java docs (for platforms etc) +Config implementation for sponge +Port bukkit listeners to sponge maybe +Fix task ids, methods for sponge \ No newline at end of file diff --git a/common/src/main/java/us/myles/ViaVersion/ViaManager.java b/common/src/main/java/us/myles/ViaVersion/ViaManager.java index 951490e06..60a9254aa 100644 --- a/common/src/main/java/us/myles/ViaVersion/ViaManager.java +++ b/common/src/main/java/us/myles/ViaVersion/ViaManager.java @@ -57,7 +57,6 @@ public class ViaManager { // Mark as injected System.setProperty("ViaVersion", getPlatform().getPluginVersion()); // If successful - // TODO: This method might run in onLoad, ensure sync tasks can still run if plugin not enabled. platform.runSync(new Runnable() { @Override public void run() { diff --git a/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java b/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java index e4567df6c..b235d06be 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java +++ b/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java @@ -1,10 +1,12 @@ package us.myles.ViaVersion; +import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.inject.Inject; import org.spongepowered.api.Game; import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.game.state.GameAboutToStartServerEvent; import org.spongepowered.api.event.game.state.GameStartedServerEvent; import org.spongepowered.api.plugin.Plugin; import org.spongepowered.api.plugin.PluginContainer; @@ -16,9 +18,12 @@ import us.myles.ViaVersion.api.ViaVersionConfig; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import us.myles.ViaVersion.api.platform.ViaPlatform; +import us.myles.ViaVersion.dump.PluginInfo; import us.myles.ViaVersion.sponge.*; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.logging.Logger; @@ -42,7 +47,7 @@ public class SpongePlugin implements ViaPlatform { private Logger logger; @Listener - public void onServerStart(GameStartedServerEvent event) { + public void onServerStart(GameAboutToStartServerEvent event) { // Setup Logger logger = new LoggerWrapper(container.getLogger()); // Setup Plugin @@ -50,6 +55,7 @@ public class SpongePlugin implements ViaPlatform { asyncExecutor = game.getScheduler().createAsyncExecutor(this); SpongeCommandHandler commandHandler = new SpongeCommandHandler(); game.getCommandManager().register(this, commandHandler, Arrays.asList("viaversion", "viaver")); + getLogger().info("ViaVersion " + getPluginVersion() + " is now loaded, injecting!"); // Init platform Via.init(ViaManager.builder() .platform(this) @@ -153,11 +159,25 @@ public class SpongePlugin implements ViaPlatform { @Override public void onReload() { - // TODO: Warning? + getLogger().severe("ViaVersion is already loaded, this should work fine. If you get any console errors, try rebooting."); } @Override public JsonObject getDump() { - return new JsonObject(); + JsonObject platformSpecific = new JsonObject(); + + List plugins = new ArrayList<>(); + for (PluginContainer p : game.getPluginManager().getPlugins()) { + plugins.add(new PluginInfo( + true, + p.getName(), + p.getVersion().orElse("Unknown Version"), + p.getInstance().isPresent() ? p.getInstance().get().getClass().getCanonicalName() : "Unknown", + p.getAuthors() + )); + } + platformSpecific.add("plugins", new Gson().toJsonTree(plugins)); + + return platformSpecific; } } From e136d1db940ae22a9534c82ebc4b2474acd3edad Mon Sep 17 00:00:00 2001 From: Matsv Date: Mon, 26 Sep 2016 13:25:28 +0200 Subject: [PATCH 28/76] Basic Bungee structure --- .../us/myles/ViaVersion/ViaVersionPlugin.java | 1 - .../ViaVersion/handlers/ViaDecodeHandler.java | 3 - .../ViaVersion/handlers/ViaEncodeHandler.java | 1 - bungee/pom.xml | 20 +- .../main/java/us/myles/ViaVersion/Bungee.java | 124 ++++++++++++- .../ViaVersion/bungee/BungeeBossBar.java | 34 ++++ .../myles/ViaVersion/bungee/BungeeViaAPI.java | 78 ++++++++ .../ViaVersion/bungee/BungeeViaInjector.java | 20 ++ .../ViaVersion/bungee/BungeeViaLoader.java | 10 + .../bungee/command/BungeeCommandSender.java | 38 ++++ .../bungee/config/BungeeConfigProvider.java | 175 ++++++++++++++++++ pom.xml | 6 - 12 files changed, 490 insertions(+), 20 deletions(-) create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeBossBar.java create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaAPI.java create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaInjector.java create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaLoader.java create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommandSender.java create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/config/BungeeConfigProvider.java diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index eaf67ba9f..844905033 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -13,7 +13,6 @@ import us.myles.ViaVersion.api.ViaAPI; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; -import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.bukkit.*; import us.myles.ViaVersion.classgenerator.ClassGenerator; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java index e021349a7..1d376c58d 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java @@ -3,10 +3,7 @@ package us.myles.ViaVersion.handlers; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ByteToMessageDecoder; -import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.PacketWrapper; -import us.myles.ViaVersion.api.Via; -import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.exception.CancelException; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java index 9ef555c9e..67cac1581 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java @@ -6,7 +6,6 @@ import io.netty.handler.codec.MessageToByteEncoder; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Via; -import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.exception.CancelException; diff --git a/bungee/pom.xml b/bungee/pom.xml index bfad5ebd0..0a8ee274f 100644 --- a/bungee/pom.xml +++ b/bungee/pom.xml @@ -24,13 +24,31 @@ + + + + bungeecord-repo + https://oss.sonatype.org/content/repositories/snapshots + + + net.md-5 bungeecord-api - 1.9-SNAPSHOT + 1.10-SNAPSHOT provided + + us.myles + viaversion-common + 1.0.0-ALPHA-modules + + + us.myles + viaversion-common + 1.0.0-ALPHA-modules + \ No newline at end of file diff --git a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java b/bungee/src/main/java/us/myles/ViaVersion/Bungee.java index e5f3f4758..2e3284c29 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java +++ b/bungee/src/main/java/us/myles/ViaVersion/Bungee.java @@ -1,18 +1,126 @@ package us.myles.ViaVersion; +import com.google.gson.JsonObject; +import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Plugin; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.ViaAPI; +import us.myles.ViaVersion.api.ViaVersionConfig; +import us.myles.ViaVersion.api.command.ViaCommandSender; +import us.myles.ViaVersion.api.configuration.ConfigurationProvider; +import us.myles.ViaVersion.api.platform.ViaPlatform; +import us.myles.ViaVersion.bungee.BungeeViaAPI; +import us.myles.ViaVersion.bungee.BungeeViaInjector; +import us.myles.ViaVersion.bungee.BungeeViaLoader; +import us.myles.ViaVersion.bungee.command.BungeeCommandSender; +import us.myles.ViaVersion.bungee.config.BungeeConfigProvider; -import static net.md_5.bungee.api.ChatColor.RED; +import java.util.UUID; +import java.util.concurrent.TimeUnit; -public class Bungee extends Plugin { +public class Bungee extends Plugin implements ViaPlatform { + + private BungeeViaAPI api; + private BungeeConfigProvider config; + + @Override + public void onLoad() { + api = new BungeeViaAPI(); + config = new BungeeConfigProvider(); + } @Override public void onEnable() { - getLogger().severe(RED + "==============================================="); - getLogger().severe(RED + "ViaVersion is NOT a Bungeecord plugin."); - getLogger().severe(RED + "Install this plugin on all your spigot/bukkit"); - getLogger().severe(RED + "servers and use the latest Bungeecord version"); - getLogger().severe(RED + "to make ViaVersion work with BungeeCord."); - getLogger().severe(RED + "==============================================="); + Via.init(ViaManager.builder() + .platform(this) + .injector(new BungeeViaInjector()) + .loader(new BungeeViaLoader()) + .build()); } + + @Override + public String getPlatformName() { + return "BungeeCord"; + } + + @Override + public String getPluginVersion() { + return getDescription().getVersion(); + } + + @Override + public int runAsync(Runnable runnable) { + return getProxy().getScheduler().runAsync(this, runnable).getId(); + } + + @Override + public int runSync(Runnable runnable) { + return getProxy().getScheduler().runAsync(this, runnable).getId(); // TODO don't run sync @ Bungee? + } + + @Override + public int runRepeatingSync(Runnable runnable, Long ticks) { + return getProxy().getScheduler().schedule(this, runnable, 0, ticks * 50, TimeUnit.MILLISECONDS).getId(); + } + + @Override + public void cancelTask(int taskId) { + getProxy().getScheduler().cancel(taskId); + } + + @Override + public ViaCommandSender[] getOnlinePlayers() { + ViaCommandSender[] array = new ViaCommandSender[getProxy().getPlayers().size()]; + int i = 0; + for (ProxiedPlayer player : getProxy().getPlayers()) { + array[i++] = new BungeeCommandSender(player); + } + return array; + } + + @Override + public void sendMessage(UUID uuid, String message) { + getProxy().getPlayer(uuid).sendMessage(new TextComponent(message)); + } + + @Override + public boolean kickPlayer(UUID uuid, String message) { + if (getProxy().getPlayer(uuid) != null) { + getProxy().getPlayer(uuid).disconnect(new TextComponent(message)); + return true; + } + return false; + } + + @Override + public boolean isPluginEnabled() { + return true; + } + + @Override + public ViaAPI getApi() { + return api; + } + + @Override + public ViaVersionConfig getConf() { + return config; + } + + @Override + public ConfigurationProvider getConfigurationProvider() { + return config; + } + + @Override + public void onReload() { + // TODO handle + } + + @Override + public JsonObject getDump() { + return null; + } + } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeBossBar.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeBossBar.java new file mode 100644 index 000000000..e377921c5 --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeBossBar.java @@ -0,0 +1,34 @@ +package us.myles.ViaVersion.bungee; + +import net.md_5.bungee.api.connection.ProxiedPlayer; +import us.myles.ViaVersion.api.boss.BossBar; +import us.myles.ViaVersion.api.boss.BossColor; +import us.myles.ViaVersion.api.boss.BossStyle; +import us.myles.ViaVersion.boss.CommonBoss; + +public class BungeeBossBar extends CommonBoss { + + public BungeeBossBar(String title, float health, BossColor color, BossStyle style) { + super(title, health, color, style); + } + + + @Override + public BossBar addPlayer(ProxiedPlayer player) { + addPlayer(player.getUniqueId()); + return this; + } + + @Override + public BossBar addPlayers(ProxiedPlayer... players) { + for (ProxiedPlayer p : players) + addPlayer(p); + return this; + } + + @Override + public BossBar removePlayer(ProxiedPlayer player) { + removePlayer(player.getUniqueId()); + return this; + } +} diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaAPI.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaAPI.java new file mode 100644 index 000000000..ce33fed0b --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaAPI.java @@ -0,0 +1,78 @@ +package us.myles.ViaVersion.bungee; + +import io.netty.buffer.ByteBuf; +import lombok.NonNull; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.ViaAPI; +import us.myles.ViaVersion.api.boss.BossBar; +import us.myles.ViaVersion.api.boss.BossColor; +import us.myles.ViaVersion.api.boss.BossStyle; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.protocol.ProtocolRegistry; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; + +import java.util.Map; +import java.util.SortedSet; +import java.util.TreeSet; +import java.util.UUID; + +public class BungeeViaAPI implements ViaAPI { + @Override + public int getPlayerVersion(@NonNull ProxiedPlayer player) { + if (!isPorted(player.getUniqueId())) + return ProtocolRegistry.SERVER_PROTOCOL; + return getPortedPlayers().get(player.getUniqueId()).get(ProtocolInfo.class).getProtocolVersion(); + } + + @Override + public int getPlayerVersion(@NonNull UUID uuid) { + if (!isPorted(uuid)) + return ProtocolRegistry.SERVER_PROTOCOL; + return getPortedPlayers().get(uuid).get(ProtocolInfo.class).getProtocolVersion(); + } + + @Override + public boolean isPorted(UUID playerUUID) { + return getPortedPlayers().containsKey(playerUUID); + } + + @Override + public String getVersion() { + return Via.getPlatform().getPluginVersion(); + } + + @Override + public void sendRawPacket(UUID uuid, ByteBuf packet) throws IllegalArgumentException { + if (!isPorted(uuid)) throw new IllegalArgumentException("This player is not controlled by ViaVersion!"); + UserConnection ci = getPortedPlayers().get(uuid); + ci.sendRawPacket(packet); + } + + @Override + public void sendRawPacket(ProxiedPlayer player, ByteBuf packet) throws IllegalArgumentException { + sendRawPacket(player.getUniqueId(), packet); + } + + @Override + public BossBar createBossBar(String title, BossColor color, BossStyle style) { + return new BungeeBossBar(title, 1F, color, style); + } + + @Override + public BossBar createBossBar(String title, float health, BossColor color, BossStyle style) { + return new BungeeBossBar(title, health, color, style); + } + + @Override + public SortedSet getSupportedVersions() { + SortedSet outputSet = new TreeSet<>(ProtocolRegistry.getSupportedVersions()); + outputSet.removeAll(Via.getPlatform().getConf().getBlockedProtocols()); + + return outputSet; + } + + public Map getPortedPlayers() { + return Via.getManager().getPortedPlayers(); + } +} diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaInjector.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaInjector.java new file mode 100644 index 000000000..17214b49f --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaInjector.java @@ -0,0 +1,20 @@ +package us.myles.ViaVersion.bungee; + +import us.myles.ViaVersion.api.platform.ViaInjector; + +public class BungeeViaInjector implements ViaInjector { + @Override + public void inject() throws Exception { + + } + + @Override + public void uninject() throws Exception { + + } + + @Override + public int getServerProtocolVersion() throws Exception { + return 47; + } +} diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaLoader.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaLoader.java new file mode 100644 index 000000000..fd179b048 --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaLoader.java @@ -0,0 +1,10 @@ +package us.myles.ViaVersion.bungee; + +import us.myles.ViaVersion.api.platform.ViaPlatformLoader; + +public class BungeeViaLoader implements ViaPlatformLoader { + @Override + public void load() { + + } +} diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommandSender.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommandSender.java new file mode 100644 index 000000000..e5f21482c --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommandSender.java @@ -0,0 +1,38 @@ +package us.myles.ViaVersion.bungee.command; + +import lombok.AllArgsConstructor; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import us.myles.ViaVersion.api.command.ViaCommandSender; + +import java.util.UUID; + +@AllArgsConstructor +public class BungeeCommandSender implements ViaCommandSender { + private CommandSender sender; + + @Override + public boolean hasPermission(String permission) { + return sender.hasPermission(permission); + } + + @Override + public void sendMessage(String msg) { + sender.sendMessage(new TextComponent(msg)); + } + + @Override + public UUID getUUID() { + if (sender instanceof ProxiedPlayer) { + return ((ProxiedPlayer) sender).getUniqueId(); + } else { + return UUID.fromString(getName()); + } + } + + @Override + public String getName() { + return sender.getName(); + } +} diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/config/BungeeConfigProvider.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/config/BungeeConfigProvider.java new file mode 100644 index 000000000..d2eb518f2 --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/config/BungeeConfigProvider.java @@ -0,0 +1,175 @@ +package us.myles.ViaVersion.bungee.config; + +import us.myles.ViaVersion.api.ViaVersionConfig; +import us.myles.ViaVersion.api.configuration.ConfigurationProvider; + +import java.util.List; +import java.util.Map; + +// TODO implement +public class BungeeConfigProvider implements ViaVersionConfig, ConfigurationProvider { + @Override + public boolean isCheckForUpdates() { + return false; + } + + @Override + public boolean isPreventCollision() { + return false; + } + + @Override + public boolean isNewEffectIndicator() { + return false; + } + + @Override + public boolean isShowNewDeathMessages() { + return false; + } + + @Override + public boolean isSuppressMetadataErrors() { + return false; + } + + @Override + public boolean isShieldBlocking() { + return false; + } + + @Override + public boolean isHologramPatch() { + return false; + } + + @Override + public boolean isBossbarPatch() { + return false; + } + + @Override + public boolean isBossbarAntiflicker() { + return false; + } + + @Override + public boolean isUnknownEntitiesSuppressed() { + return false; + } + + @Override + public double getHologramYOffset() { + return 0; + } + + @Override + public boolean isAutoTeam() { + return false; + } + + @Override + public boolean isBlockBreakPatch() { + return false; + } + + @Override + public int getMaxPPS() { + return 0; + } + + @Override + public String getMaxPPSKickMessage() { + return null; + } + + @Override + public int getTrackingPeriod() { + return 0; + } + + @Override + public int getWarningPPS() { + return 0; + } + + @Override + public int getMaxWarnings() { + return 0; + } + + @Override + public String getMaxWarningsKickMessage() { + return null; + } + + @Override + public boolean isAntiXRay() { + return false; + } + + @Override + public boolean isSendSupportedVersions() { + return false; + } + + @Override + public boolean isStimulatePlayerTick() { + return false; + } + + @Override + public boolean isItemCache() { + return false; + } + + @Override + public boolean isNMSPlayerTicking() { + return false; + } + + @Override + public boolean isReplacePistons() { + return false; + } + + @Override + public int getPistonReplacementId() { + return 0; + } + + @Override + public boolean isForceJsonTransform() { + return false; + } + + @Override + public List getBlockedProtocols() { + return null; + } + + @Override + public String getBlockedDisconnectMsg() { + return null; + } + + @Override + public String getReloadDisconnectMsg() { + return null; + } + + @Override + public void set(String path, Object value) { + + } + + @Override + public void saveConfig() { + + } + + @Override + public Map getValues() { + return null; + } +} diff --git a/pom.xml b/pom.xml index 3cd69f629..5c778885a 100644 --- a/pom.xml +++ b/pom.xml @@ -48,12 +48,6 @@ spacehq-repo https://repo.spacehq.org/content/repositories/releases/ - - - - bungeecord-repo - https://oss.sonatype.org/content/repositories/snapshots - From 14daca5fea91273f236609be49acd79179d2f3fe Mon Sep 17 00:00:00 2001 From: Myles Date: Mon, 26 Sep 2016 13:11:46 +0100 Subject: [PATCH 29/76] Fix 1.9.4+ support and also fix sponge support to work better. Tested on SpongeVanilla + SpongeForge (1.8.8 & 1.9.4) --- TODOLIST | 3 +- .../bukkit/BukkitViaBulkChunkTranslator.java | 2 + .../bukkit/BukkitViaMovementTransmitter.java | 6 +- .../ViaVersion/sponge/SpongeViaInjector.java | 57 ++----------------- .../SpongeViaBulkChunkTranslator.java | 3 + .../SpongeViaMovementTransmitter.java | 6 +- 6 files changed, 23 insertions(+), 54 deletions(-) diff --git a/TODOLIST b/TODOLIST index e4e40f1b1..d6b06797d 100644 --- a/TODOLIST +++ b/TODOLIST @@ -4,4 +4,5 @@ Stop using new Gson() everywhere Java docs (for platforms etc) Config implementation for sponge Port bukkit listeners to sponge maybe -Fix task ids, methods for sponge \ No newline at end of file +Fix task ids, methods for sponge +Find all the TODO's and check they're done. \ No newline at end of file diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaBulkChunkTranslator.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaBulkChunkTranslator.java index 7f9a6bcd2..82244c31d 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaBulkChunkTranslator.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaBulkChunkTranslator.java @@ -24,6 +24,8 @@ public class BukkitViaBulkChunkTranslator extends BulkChunkTranslatorProvider { if (((ViaVersionPlugin) Via.getPlatform()).isSpigot()) { obfuscateRef = Class.forName("org.spigotmc.AntiXray").getMethod("obfuscate", int.class, int.class, int.class, byte[].class, ReflectionUtil.nms("World")); } + } catch (ClassNotFoundException e) { + // Ignore as server is probably 1.9+ } catch (Exception e) { Via.getPlatform().getLogger().log(Level.WARNING, "Failed to initialise chunks reflection", e); } diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaMovementTransmitter.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaMovementTransmitter.java index 3bc4544d6..81806eedb 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaMovementTransmitter.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaMovementTransmitter.java @@ -30,7 +30,7 @@ public class BukkitViaMovementTransmitter extends MovementTransmitterProvider { try { idlePacketClass = ReflectionUtil.nms("PacketPlayInFlying"); } catch (ClassNotFoundException e) { - throw new RuntimeException("Couldn't find idle packet, help!", e); + return; // We'll hope this is 1.9.4+ } try { idlePacket = idlePacketClass.newInstance(); @@ -66,11 +66,15 @@ public class BukkitViaMovementTransmitter extends MovementTransmitterProvider { @Override public Object getFlyingPacket() { + if (idlePacket == null) + throw new NullPointerException("Could not locate flying packet"); return idlePacket2; } @Override public Object getGroundPacket() { + if (idlePacket == null) + throw new NullPointerException("Could not locate flying packet"); return idlePacket; } diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java index e704cc356..8ff70607a 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java @@ -4,6 +4,8 @@ import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelInitializer; import io.netty.channel.socket.SocketChannel; +import org.spongepowered.api.MinecraftVersion; +import org.spongepowered.api.Sponge; import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaInjector; @@ -118,64 +120,17 @@ public class SpongeViaInjector implements ViaInjector { } public static Object getServer() throws Exception { - Class serverClazz = Class.forName("net.minecraft.server.MinecraftServer"); - for (Method m : serverClazz.getDeclaredMethods()) { - if (m.getParameterCount() == 0) { - if ((m.getModifiers() & Modifier.STATIC) == Modifier.STATIC) { - if (m.getReturnType().equals(serverClazz)) { - return m.invoke(null); - } - } - } - } - throw new Exception("Could not find MinecraftServer static field!"); + return Sponge.getServer(); } @Override public int getServerProtocolVersion() throws Exception { + MinecraftVersion mcv = Sponge.getPlatform().getMinecraftVersion(); try { - Class serverClazz = Class.forName("net.minecraft.server.MinecraftServer"); - Object server = getServer(); - Class pingClazz = Class.forName("net.minecraft.network.ServerStatusResponse"); - Object ping = null; - // Search for ping method - for (Field f : serverClazz.getDeclaredFields()) { - if (f.getType() != null) { - if (f.getType().getSimpleName().equals("ServerStatusResponse")) { - f.setAccessible(true); - ping = f.get(server); - } - } - } - if (ping != null) { - Object serverData = null; - for (Field f : pingClazz.getDeclaredFields()) { - if (f.getType() != null) { - if (f.getType().getSimpleName().endsWith("MinecraftProtocolVersionIdentifier")) { - f.setAccessible(true); - serverData = f.get(ping); - } - } - } - if (serverData != null) { - int protocolVersion = -1; - for (Field f : serverData.getClass().getDeclaredFields()) { - if (f.getType() != null) { - if (f.getType() == int.class) { - f.setAccessible(true); - protocolVersion = (int) f.get(serverData); - } - } - } - if (protocolVersion != -1) { - return protocolVersion; - } - } - } + return (int) mcv.getClass().getDeclaredMethod("getProtocol").invoke(mcv); } catch (Exception e) { - throw new Exception("Failed to get server", e); + throw new Exception("Failed to get server protocol", e); } - throw new Exception("Failed to get server"); } public static Object getServerConnection() throws Exception { diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaBulkChunkTranslator.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaBulkChunkTranslator.java index f10b3597d..f6fa5ef86 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaBulkChunkTranslator.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaBulkChunkTranslator.java @@ -15,9 +15,12 @@ public class SpongeViaBulkChunkTranslator extends BulkChunkTranslatorProvider { private static ReflectionUtil.ClassReflection mapChunkRef; static { + try { mapChunkBulkRef = new ReflectionUtil.ClassReflection(Class.forName("net.minecraft.network.play.server.S26PacketMapChunkBulk")); mapChunkRef = new ReflectionUtil.ClassReflection(Class.forName("net.minecraft.network.play.server.S21PacketChunkData")); + } catch (ClassNotFoundException e) { + // Ignore as server is probably 1.9+ } catch (Exception e) { Via.getPlatform().getLogger().log(Level.WARNING, "Failed to initialise chunks reflection", e); } diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaMovementTransmitter.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaMovementTransmitter.java index fb469a259..346b5f08b 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaMovementTransmitter.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaMovementTransmitter.java @@ -14,7 +14,7 @@ public class SpongeViaMovementTransmitter extends MovementTransmitterProvider { try { idlePacketClass = Class.forName("net.minecraft.network.play.client.C03PacketPlayer"); } catch (ClassNotFoundException e) { - throw new RuntimeException("Couldn't find idle packet, help!", e); + return; // We'll hope this is 1.9.4+ } try { idlePacket = idlePacketClass.newInstance(); @@ -31,11 +31,15 @@ public class SpongeViaMovementTransmitter extends MovementTransmitterProvider { @Override public Object getFlyingPacket() { + if (idlePacket == null) + throw new NullPointerException("Could not locate flying packet"); return idlePacket2; } @Override public Object getGroundPacket() { + if (idlePacket == null) + throw new NullPointerException("Could not locate flying packet"); return idlePacket; } } From 30bb91fc8af3cb9d4c67e1ba070c892b7449d211 Mon Sep 17 00:00:00 2001 From: Myles Date: Mon, 26 Sep 2016 13:14:38 +0100 Subject: [PATCH 30/76] Revert Mats moving the repo --- bungee/pom.xml | 8 -------- pom.xml | 6 ++++++ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/bungee/pom.xml b/bungee/pom.xml index 0a8ee274f..ce5ba81b2 100644 --- a/bungee/pom.xml +++ b/bungee/pom.xml @@ -24,14 +24,6 @@ - - - - bungeecord-repo - https://oss.sonatype.org/content/repositories/snapshots - - - diff --git a/pom.xml b/pom.xml index 5c778885a..3cd69f629 100644 --- a/pom.xml +++ b/pom.xml @@ -48,6 +48,12 @@ spacehq-repo https://repo.spacehq.org/content/repositories/releases/ + + + + bungeecord-repo + https://oss.sonatype.org/content/repositories/snapshots + From 42efc736c322f2879f82b0bcfa0f346b9f0a301c Mon Sep 17 00:00:00 2001 From: Matsv Date: Mon, 26 Sep 2016 14:36:10 +0200 Subject: [PATCH 31/76] Cleanup metadata --- .../api/minecraft/metadata/MetaType.java | 20 ++ .../api/minecraft/metadata/Metadata.java | 4 +- .../metadata/types/MetaType1_8.java} | 7 +- .../metadata/types/MetaType1_9.java} | 7 +- .../type/types/version/Metadata1_8Type.java | 10 +- .../type/types/version/Metadata1_9Type.java | 10 +- .../protocol1_9to1_8/metadata/MetaIndex.java | 184 +++++++++--------- .../metadata/MetadataRewriter.java | 38 ++-- .../protocol1_9to1_8/metadata/Type.java | 23 --- .../packets/SpawnPackets.java | 4 +- .../storage/EntityTracker.java | 4 +- .../MetadataRewriter.java | 12 +- pom.xml | 7 + 13 files changed, 163 insertions(+), 167 deletions(-) create mode 100644 common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/MetaType.java rename common/src/main/java/us/myles/ViaVersion/{protocols/protocol1_9to1_8/metadata/MetadataTypes.java => api/minecraft/metadata/types/MetaType1_8.java} (69%) rename common/src/main/java/us/myles/ViaVersion/{protocols/protocol1_9to1_8/metadata/NewType.java => api/minecraft/metadata/types/MetaType1_9.java} (75%) delete mode 100644 common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/Type.java diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/MetaType.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/MetaType.java new file mode 100644 index 000000000..31f2c40e8 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/MetaType.java @@ -0,0 +1,20 @@ +package us.myles.ViaVersion.api.minecraft.metadata; + +import us.myles.ViaVersion.api.type.Type; + +public interface MetaType { + + /** + * Get the write/read type + * + * @return Type instance + */ + Type getType(); + + /** + * Get type id from the specific MetaDataType + * + * @return Type id as an integer + */ + int getTypeID(); +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/Metadata.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/Metadata.java index 1f4b1c261..68fdeca43 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/Metadata.java +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/Metadata.java @@ -2,13 +2,11 @@ package us.myles.ViaVersion.api.minecraft.metadata; import lombok.AllArgsConstructor; import lombok.Data; -import us.myles.ViaVersion.api.type.Type; @AllArgsConstructor @Data public class Metadata { private int id; - private int typeID; - private Type type; + private MetaType metaType; private Object value; } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataTypes.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_8.java similarity index 69% rename from common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataTypes.java rename to common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_8.java index 36060f9bd..7d75b39fe 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataTypes.java +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_8.java @@ -1,12 +1,13 @@ -package us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata; +package us.myles.ViaVersion.api.minecraft.metadata.types; import lombok.Getter; import lombok.RequiredArgsConstructor; +import us.myles.ViaVersion.api.minecraft.metadata.MetaType; import us.myles.ViaVersion.api.type.Type; @RequiredArgsConstructor @Getter -public enum MetadataTypes { +public enum MetaType1_8 implements MetaType { Byte(0, Type.BYTE), Short(1, Type.SHORT), Int(2, Type.INT), @@ -20,7 +21,7 @@ public enum MetadataTypes { private final int typeID; private final Type type; - public static MetadataTypes byId(int id) { + public static MetaType1_8 byId(int id) { return values()[id]; } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/NewType.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_9.java similarity index 75% rename from common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/NewType.java rename to common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_9.java index 53ae361f2..30be6bef2 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/NewType.java +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_9.java @@ -1,12 +1,13 @@ -package us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata; +package us.myles.ViaVersion.api.minecraft.metadata.types; import lombok.Getter; import lombok.RequiredArgsConstructor; +import us.myles.ViaVersion.api.minecraft.metadata.MetaType; import us.myles.ViaVersion.api.type.Type; @RequiredArgsConstructor @Getter -public enum NewType { +public enum MetaType1_9 implements MetaType { Byte(0, Type.BYTE), VarInt(1, Type.VAR_INT), Float(2, Type.FLOAT), @@ -25,7 +26,7 @@ public enum NewType { private final int typeID; private final Type type; - public static NewType byId(int id) { + public static MetaType1_9 byId(int id) { return values()[id]; } diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/types/version/Metadata1_8Type.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/version/Metadata1_8Type.java index cb46b8256..6f3ad63e7 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/type/types/version/Metadata1_8Type.java +++ b/common/src/main/java/us/myles/ViaVersion/api/type/types/version/Metadata1_8Type.java @@ -3,8 +3,8 @@ package us.myles.ViaVersion.api.type.types.version; import io.netty.buffer.ByteBuf; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; +import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_8; import us.myles.ViaVersion.api.type.types.minecraft.MetaTypeTemplate; -import us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata.MetadataTypes; public class Metadata1_8Type extends MetaTypeTemplate { @@ -13,15 +13,15 @@ public class Metadata1_8Type extends MetaTypeTemplate { byte item = buffer.readByte(); if (item == 127) return null; // end of metadata int typeID = (item & 0xE0) >> 5; - MetadataTypes type = MetadataTypes.byId(typeID); + MetaType1_8 type = MetaType1_8.byId(typeID); int id = item & 0x1F; - return new Metadata(id, typeID, type.getType(), type.getType().read(buffer)); + return new Metadata(id, type, type.getType().read(buffer)); } @Override public void write(ByteBuf buffer, Metadata meta) throws Exception { - byte item = (byte) (meta.getTypeID() << 5 | meta.getId() & 0x1F); + byte item = (byte) (meta.getMetaType().getTypeID() << 5 | meta.getId() & 0x1F); buffer.writeByte(item); - meta.getType().write(buffer, meta.getValue()); + meta.getMetaType().getType().write(buffer, meta.getValue()); } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/types/version/Metadata1_9Type.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/version/Metadata1_9Type.java index fb541263c..7d87f7931 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/type/types/version/Metadata1_9Type.java +++ b/common/src/main/java/us/myles/ViaVersion/api/type/types/version/Metadata1_9Type.java @@ -2,8 +2,8 @@ package us.myles.ViaVersion.api.type.types.version; import io.netty.buffer.ByteBuf; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; +import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_9; import us.myles.ViaVersion.api.type.types.minecraft.MetaTypeTemplate; -import us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata.NewType; public class Metadata1_9Type extends MetaTypeTemplate { @@ -12,9 +12,9 @@ public class Metadata1_9Type extends MetaTypeTemplate { short index = buffer.readUnsignedByte(); if (index == 0xff) return null; //End of metadata - NewType type = NewType.byId(buffer.readByte()); + MetaType1_9 type = MetaType1_9.byId(buffer.readByte()); - return new Metadata(index, type.getTypeID(), type.getType(), type.getType().read(buffer)); + return new Metadata(index, type, type.getType().read(buffer)); } @Override @@ -23,8 +23,8 @@ public class Metadata1_9Type extends MetaTypeTemplate { buffer.writeByte(255); } else { buffer.writeByte(object.getId()); - buffer.writeByte(object.getTypeID()); - object.getType().write(buffer, object.getValue()); + buffer.writeByte(object.getMetaType().getTypeID()); + object.getMetaType().getType().write(buffer, object.getValue()); } } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java index be627a532..08ccfb5d4 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java @@ -3,6 +3,8 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata; import com.google.common.base.Optional; import lombok.Getter; import us.myles.ViaVersion.api.Pair; +import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_8; +import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_9; import us.myles.ViaVersion.util.EntityUtil; import java.util.HashMap; @@ -13,132 +15,132 @@ import static us.myles.ViaVersion.util.EntityUtil.EntityType.*; public enum MetaIndex { // entity - ENTITY_STATUS(ENTITY, 0, Type.Byte, NewType.Byte), - ENTITY_AIR(ENTITY, 1, Type.Short, NewType.VarInt), - ENTITY_NAMETAG(ENTITY, 2, Type.String, NewType.String), // in the entity class @ spigot 1.8.8, blame wiki.vg - ENTITY_ALWAYS_SHOW_NAMETAG(ENTITY, 3, Type.Byte, NewType.Boolean), // in the entity class @ Spigot 1.8.8, blame wiki.vg - ENTITY_SILENT(ENTITY, 4, Type.Byte, NewType.Boolean), + ENTITY_STATUS(ENTITY, 0, MetaType1_8.Byte, MetaType1_9.Byte), + ENTITY_AIR(ENTITY, 1, MetaType1_8.Short, MetaType1_9.VarInt), + ENTITY_NAMETAG(ENTITY, 2, MetaType1_8.String, MetaType1_9.String), // in the entity class @ spigot 1.8.8, blame wiki.vg + ENTITY_ALWAYS_SHOW_NAMETAG(ENTITY, 3, MetaType1_8.Byte, MetaType1_9.Boolean), // in the entity class @ Spigot 1.8.8, blame wiki.vg + ENTITY_SILENT(ENTITY, 4, MetaType1_8.Byte, MetaType1_9.Boolean), // living entity - LIVINGENTITY_HEALTH(ENTITY_LIVING, 6, Type.Float, NewType.Float), - LIVINGENTITY_POTION_EFFECT_COLOR(ENTITY_LIVING, 7, Type.Int, NewType.VarInt), - LIVINGENTITY_IS_POTION_AMBIENT(ENTITY_LIVING, 8, Type.Byte, NewType.Boolean), - LIVINGENTITY_NUMBER_OF_ARROWS_IN(ENTITY_LIVING, 9, Type.Byte, NewType.VarInt), - LIVINGENTITY_NO_AI(ENTITY_LIVING, 15, Type.Byte, 10, NewType.Byte), // in 1.9 this is combined with Left handed, oh. + LIVINGENTITY_HEALTH(ENTITY_LIVING, 6, MetaType1_8.Float, MetaType1_9.Float), + LIVINGENTITY_POTION_EFFECT_COLOR(ENTITY_LIVING, 7, MetaType1_8.Int, MetaType1_9.VarInt), + LIVINGENTITY_IS_POTION_AMBIENT(ENTITY_LIVING, 8, MetaType1_8.Byte, MetaType1_9.Boolean), + LIVINGENTITY_NUMBER_OF_ARROWS_IN(ENTITY_LIVING, 9, MetaType1_8.Byte, MetaType1_9.VarInt), + LIVINGENTITY_NO_AI(ENTITY_LIVING, 15, MetaType1_8.Byte, 10, MetaType1_9.Byte), // in 1.9 this is combined with Left handed, oh. // ageable - AGEABLE_AGE(ENTITY_AGEABLE, 12, Type.Byte, 11, NewType.Boolean), + AGEABLE_AGE(ENTITY_AGEABLE, 12, MetaType1_8.Byte, 11, MetaType1_9.Boolean), // armour stand - STAND_INFO(ARMOR_STAND, 10, Type.Byte, NewType.Byte), - STAND_HEAD_POS(ARMOR_STAND, 11, Type.Rotation, NewType.Vector3F), - STAND_BODY_POS(ARMOR_STAND, 12, Type.Rotation, NewType.Vector3F), - STAND_LA_POS(ARMOR_STAND, 13, Type.Rotation, NewType.Vector3F), - STAND_RA_POS(ARMOR_STAND, 14, Type.Rotation, NewType.Vector3F), - STAND_LL_POS(ARMOR_STAND, 15, Type.Rotation, NewType.Vector3F), - STAND_RL_POS(ARMOR_STAND, 16, Type.Rotation, NewType.Vector3F), + STAND_INFO(ARMOR_STAND, 10, MetaType1_8.Byte, MetaType1_9.Byte), + STAND_HEAD_POS(ARMOR_STAND, 11, MetaType1_8.Rotation, MetaType1_9.Vector3F), + STAND_BODY_POS(ARMOR_STAND, 12, MetaType1_8.Rotation, MetaType1_9.Vector3F), + STAND_LA_POS(ARMOR_STAND, 13, MetaType1_8.Rotation, MetaType1_9.Vector3F), + STAND_RA_POS(ARMOR_STAND, 14, MetaType1_8.Rotation, MetaType1_9.Vector3F), + STAND_LL_POS(ARMOR_STAND, 15, MetaType1_8.Rotation, MetaType1_9.Vector3F), + STAND_RL_POS(ARMOR_STAND, 16, MetaType1_8.Rotation, MetaType1_9.Vector3F), // human, discountined? - PLAYER_SKIN_FLAGS(ENTITY_HUMAN, 10, Type.Byte, 12, NewType.Byte), // unsigned on 1.8 - PLAYER_HUMAN_BYTE(ENTITY_HUMAN, 16, Type.Byte, NewType.Discontinued), // unused on 1.8 - PLAYER_ADDITIONAL_HEARTS(ENTITY_HUMAN, 17, Type.Float, 10, NewType.Float), - PLAYER_SCORE(ENTITY_HUMAN, 18, Type.Int, 11, NewType.VarInt), - PLAYER_HAND(ENTITY_HUMAN, -1, Type.NonExistent, 5, NewType.Byte), // new in 1.9 - SOMETHING_ANTICHEAT_PLUGINS_FOR_SOME_REASON_USE(ENTITY_HUMAN, 11, Type.Byte, NewType.Discontinued), //For what we know, This doesn't exists. If you think it exists and knows what it does. Please tell us. + PLAYER_SKIN_FLAGS(ENTITY_HUMAN, 10, MetaType1_8.Byte, 12, MetaType1_9.Byte), // unsigned on 1.8 + PLAYER_HUMAN_BYTE(ENTITY_HUMAN, 16, MetaType1_8.Byte, MetaType1_9.Discontinued), // unused on 1.8 + PLAYER_ADDITIONAL_HEARTS(ENTITY_HUMAN, 17, MetaType1_8.Float, 10, MetaType1_9.Float), + PLAYER_SCORE(ENTITY_HUMAN, 18, MetaType1_8.Int, 11, MetaType1_9.VarInt), + PLAYER_HAND(ENTITY_HUMAN, -1, MetaType1_8.NonExistent, 5, MetaType1_9.Byte), // new in 1.9 + SOMETHING_ANTICHEAT_PLUGINS_FOR_SOME_REASON_USE(ENTITY_HUMAN, 11, MetaType1_8.Byte, MetaType1_9.Discontinued), //For what we know, This doesn't exists. If you think it exists and knows what it does. Please tell us. // horse - HORSE_INFO(HORSE, 16, Type.Int, 12, NewType.Byte), - HORSE_TYPE(HORSE, 19, Type.Byte, 13, NewType.VarInt), - HORSE_SUBTYPE(HORSE, 20, Type.Int, 14, NewType.VarInt), - HORSE_OWNER(HORSE, 21, Type.String, 15, NewType.OptUUID), - HORSE_ARMOR(HORSE, 22, Type.Int, 16, NewType.VarInt), + HORSE_INFO(HORSE, 16, MetaType1_8.Int, 12, MetaType1_9.Byte), + HORSE_TYPE(HORSE, 19, MetaType1_8.Byte, 13, MetaType1_9.VarInt), + HORSE_SUBTYPE(HORSE, 20, MetaType1_8.Int, 14, MetaType1_9.VarInt), + HORSE_OWNER(HORSE, 21, MetaType1_8.String, 15, MetaType1_9.OptUUID), + HORSE_ARMOR(HORSE, 22, MetaType1_8.Int, 16, MetaType1_9.VarInt), // bat - BAT_ISHANGING(BAT, 16, Type.Byte, 11, NewType.Byte), + BAT_ISHANGING(BAT, 16, MetaType1_8.Byte, 11, MetaType1_9.Byte), // tameable - TAMING_INFO(ENTITY_TAMEABLE_ANIMAL, 16, Type.Byte, 12, NewType.Byte), - TAMING_OWNER(ENTITY_TAMEABLE_ANIMAL, 17, Type.String, 13, NewType.OptUUID), + TAMING_INFO(ENTITY_TAMEABLE_ANIMAL, 16, MetaType1_8.Byte, 12, MetaType1_9.Byte), + TAMING_OWNER(ENTITY_TAMEABLE_ANIMAL, 17, MetaType1_8.String, 13, MetaType1_9.OptUUID), // ocelot - OCELOT_TYPE(OCELOT, 18, Type.Byte, 14, NewType.VarInt), + OCELOT_TYPE(OCELOT, 18, MetaType1_8.Byte, 14, MetaType1_9.VarInt), // wolf - WOLF_HEALTH(WOLF, 18, Type.Float, 14, NewType.Float), - WOLF_BEGGING(WOLF, 19, Type.Byte, 15, NewType.Boolean), - WOLF_COLLAR(WOLF, 20, Type.Byte, 16, NewType.VarInt), + WOLF_HEALTH(WOLF, 18, MetaType1_8.Float, 14, MetaType1_9.Float), + WOLF_BEGGING(WOLF, 19, MetaType1_8.Byte, 15, MetaType1_9.Boolean), + WOLF_COLLAR(WOLF, 20, MetaType1_8.Byte, 16, MetaType1_9.VarInt), // pig - PIG_SADDLE(PIG, 16, Type.Byte, 12, NewType.Boolean), + PIG_SADDLE(PIG, 16, MetaType1_8.Byte, 12, MetaType1_9.Boolean), // rabbit - RABBIT_TYPE(RABBIT, 18, Type.Byte, 12, NewType.VarInt), + RABBIT_TYPE(RABBIT, 18, MetaType1_8.Byte, 12, MetaType1_9.VarInt), // sheep - SHEEP_COLOR(SHEEP, 16, Type.Byte, 12, NewType.Byte), + SHEEP_COLOR(SHEEP, 16, MetaType1_8.Byte, 12, MetaType1_9.Byte), // villager - VILLAGER_PROFESSION(VILLAGER, 16, Type.Int, 12, NewType.VarInt), + VILLAGER_PROFESSION(VILLAGER, 16, MetaType1_8.Int, 12, MetaType1_9.VarInt), // enderman - ENDERMAN_BLOCK(ENDERMAN, 16, Type.Short, 11, NewType.BlockID), // special case - ENDERMAN_BLOCKDATA(ENDERMAN, 17, Type.Byte, 11, NewType.BlockID), // special case - ENDERMAN_ISSCREAMING(ENDERMAN, 18, Type.Byte, 12, NewType.Boolean), + ENDERMAN_BLOCK(ENDERMAN, 16, MetaType1_8.Short, 11, MetaType1_9.BlockID), // special case + ENDERMAN_BLOCKDATA(ENDERMAN, 17, MetaType1_8.Byte, 11, MetaType1_9.BlockID), // special case + ENDERMAN_ISSCREAMING(ENDERMAN, 18, MetaType1_8.Byte, 12, MetaType1_9.Boolean), // zombie - ZOMBIE_ISCHILD(ZOMBIE, 12, Type.Byte, 11, NewType.Boolean), - ZOMBIE_ISVILLAGER(ZOMBIE, 13, Type.Byte, 12, NewType.VarInt), - ZOMBIE_ISCONVERTING(ZOMBIE, 14, Type.Byte, 13, NewType.Boolean), + ZOMBIE_ISCHILD(ZOMBIE, 12, MetaType1_8.Byte, 11, MetaType1_9.Boolean), + ZOMBIE_ISVILLAGER(ZOMBIE, 13, MetaType1_8.Byte, 12, MetaType1_9.VarInt), + ZOMBIE_ISCONVERTING(ZOMBIE, 14, MetaType1_8.Byte, 13, MetaType1_9.Boolean), // ZOMBIE_RISINGHANDS added in 1.9 // blaze - BLAZE_ONFIRE(BLAZE, 16, Type.Byte, 11, NewType.Byte), + BLAZE_ONFIRE(BLAZE, 16, MetaType1_8.Byte, 11, MetaType1_9.Byte), // spider - SPIDER_CIMBING(SPIDER, 16, Type.Byte, 11, NewType.Byte), + SPIDER_CIMBING(SPIDER, 16, MetaType1_8.Byte, 11, MetaType1_9.Byte), // creeper - CREEPER_FUSE(CREEPER, 16, Type.Byte, 11, NewType.VarInt), // -1 idle, 1 is fuse - CREEPER_ISPOWERED(CREEPER, 17, Type.Byte, 12, NewType.Boolean), - CREEPER_ISIGNITED(CREEPER, 18, Type.Byte, 13, NewType.Boolean), + CREEPER_FUSE(CREEPER, 16, MetaType1_8.Byte, 11, MetaType1_9.VarInt), // -1 idle, 1 is fuse + CREEPER_ISPOWERED(CREEPER, 17, MetaType1_8.Byte, 12, MetaType1_9.Boolean), + CREEPER_ISIGNITED(CREEPER, 18, MetaType1_8.Byte, 13, MetaType1_9.Boolean), // ghast - GHAST_ISATTACKING(GHAST, 16, Type.Byte, 11, NewType.Boolean), + GHAST_ISATTACKING(GHAST, 16, MetaType1_8.Byte, 11, MetaType1_9.Boolean), // slime - SLIME_SIZE(SLIME, 16, Type.Byte, 11, NewType.VarInt), + SLIME_SIZE(SLIME, 16, MetaType1_8.Byte, 11, MetaType1_9.VarInt), // skeleton - SKELETON_TYPE(SKELETON, 13, Type.Byte, 11, NewType.VarInt), + SKELETON_TYPE(SKELETON, 13, MetaType1_8.Byte, 11, MetaType1_9.VarInt), // witch - WITCH_AGGRO(WITCH, 21, Type.Byte, 11, NewType.Boolean), + WITCH_AGGRO(WITCH, 21, MetaType1_8.Byte, 11, MetaType1_9.Boolean), // iron golem - IRON_PLAYERMADE(IRON_GOLEM, 16, Type.Byte, 11, NewType.Byte), + IRON_PLAYERMADE(IRON_GOLEM, 16, MetaType1_8.Byte, 11, MetaType1_9.Byte), // wither - WITHER_TARGET1(WITHER, 17, Type.Int, 11, NewType.VarInt), - WITHER_TARGET2(WITHER, 18, Type.Int, 12, NewType.VarInt), - WITHER_TARGET3(WITHER, 19, Type.Int, 13, NewType.VarInt), - WITHER_INVULN_TIME(WITHER, 20, Type.Int, 14, NewType.VarInt), - WITHER_PROPERTIES(WITHER, 10, Type.Byte, NewType.Byte), - WITHER_UNKNOWN(WITHER, 11, Type.Byte, NewType.Discontinued), + WITHER_TARGET1(WITHER, 17, MetaType1_8.Int, 11, MetaType1_9.VarInt), + WITHER_TARGET2(WITHER, 18, MetaType1_8.Int, 12, MetaType1_9.VarInt), + WITHER_TARGET3(WITHER, 19, MetaType1_8.Int, 13, MetaType1_9.VarInt), + WITHER_INVULN_TIME(WITHER, 20, MetaType1_8.Int, 14, MetaType1_9.VarInt), + WITHER_PROPERTIES(WITHER, 10, MetaType1_8.Byte, MetaType1_9.Byte), + WITHER_UNKNOWN(WITHER, 11, MetaType1_8.Byte, MetaType1_9.Discontinued), // wither skull - WITHERSKULL_INVULN(WITHER_SKULL, 10, Type.Byte, 5, NewType.Boolean), + WITHERSKULL_INVULN(WITHER_SKULL, 10, MetaType1_8.Byte, 5, MetaType1_9.Boolean), // guardian - GUARDIAN_INFO(GUARDIAN, 16, Type.Int, 11, NewType.Byte), - GUARDIAN_TARGET(GUARDIAN, 17, Type.Int, 12, NewType.VarInt), + GUARDIAN_INFO(GUARDIAN, 16, MetaType1_8.Int, 11, MetaType1_9.Byte), + GUARDIAN_TARGET(GUARDIAN, 17, MetaType1_8.Int, 12, MetaType1_9.VarInt), // boat - BOAT_SINCEHIT(BOAT, 17, Type.Int, 5, NewType.VarInt), - BOAT_FORWARDDIR(BOAT, 18, Type.Int, 6, NewType.VarInt), - BOAT_DMGTAKEN(BOAT, 19, Type.Float, 7, NewType.Float), + BOAT_SINCEHIT(BOAT, 17, MetaType1_8.Int, 5, MetaType1_9.VarInt), + BOAT_FORWARDDIR(BOAT, 18, MetaType1_8.Int, 6, MetaType1_9.VarInt), + BOAT_DMGTAKEN(BOAT, 19, MetaType1_8.Float, 7, MetaType1_9.Float), // BOAT_TYPE in 1.9 // minecart - MINECART_SHAKINGPOWER(MINECART_ABSTRACT, 17, Type.Int, 5, NewType.VarInt), - MINECART_SHAKINGDIRECTION(MINECART_ABSTRACT, 18, Type.Int, 6, NewType.VarInt), - MINECART_DAMAGETAKEN(MINECART_ABSTRACT, 19, Type.Float, 7, NewType.Float), // also shaking modifier :P - MINECART_BLOCK(MINECART_ABSTRACT, 20, Type.Int, 8, NewType.VarInt), - MINECART_BLOCK_Y(MINECART_ABSTRACT, 21, Type.Int, 9, NewType.VarInt), - MINECART_SHOWBLOCK(MINECART_ABSTRACT, 22, Type.Byte, 10, NewType.Boolean), + MINECART_SHAKINGPOWER(MINECART_ABSTRACT, 17, MetaType1_8.Int, 5, MetaType1_9.VarInt), + MINECART_SHAKINGDIRECTION(MINECART_ABSTRACT, 18, MetaType1_8.Int, 6, MetaType1_9.VarInt), + MINECART_DAMAGETAKEN(MINECART_ABSTRACT, 19, MetaType1_8.Float, 7, MetaType1_9.Float), // also shaking modifier :P + MINECART_BLOCK(MINECART_ABSTRACT, 20, MetaType1_8.Int, 8, MetaType1_9.VarInt), + MINECART_BLOCK_Y(MINECART_ABSTRACT, 21, MetaType1_8.Int, 9, MetaType1_9.VarInt), + MINECART_SHOWBLOCK(MINECART_ABSTRACT, 22, MetaType1_8.Byte, 10, MetaType1_9.Boolean), // Command minecart (they are still broken) - MINECART_COMMANDBLOCK_COMMAND(MINECART_ABSTRACT, 23, Type.String, 11, NewType.String), - MINECART_COMMANDBLOCK_OUTPUT(MINECART_ABSTRACT, 24, Type.String, 12, NewType.Chat), + MINECART_COMMANDBLOCK_COMMAND(MINECART_ABSTRACT, 23, MetaType1_8.String, 11, MetaType1_9.String), + MINECART_COMMANDBLOCK_OUTPUT(MINECART_ABSTRACT, 24, MetaType1_8.String, 12, MetaType1_9.Chat), // furnace cart - FURNACECART_ISPOWERED(MINECART_ABSTRACT, 16, Type.Byte, 11, NewType.Boolean), + FURNACECART_ISPOWERED(MINECART_ABSTRACT, 16, MetaType1_8.Byte, 11, MetaType1_9.Boolean), // item drop - ITEM_ITEM(DROPPED_ITEM, 10, Type.Slot, 5, NewType.Slot), + ITEM_ITEM(DROPPED_ITEM, 10, MetaType1_8.Slot, 5, MetaType1_9.Slot), // arrow - ARROW_ISCRIT(ARROW, 16, Type.Byte, 5, NewType.Byte), + ARROW_ISCRIT(ARROW, 16, MetaType1_8.Byte, 5, MetaType1_9.Byte), // firework - FIREWORK_INFO(FIREWORK, 8, Type.Slot, 5, NewType.Slot), + FIREWORK_INFO(FIREWORK, 8, MetaType1_8.Slot, 5, MetaType1_9.Slot), // item frame - ITEMFRAME_ITEM(ITEM_FRAME, 8, Type.Slot, 5, NewType.Slot), - ITEMFRAME_ROTATION(ITEM_FRAME, 9, Type.Byte, 6, NewType.VarInt), + ITEMFRAME_ITEM(ITEM_FRAME, 8, MetaType1_8.Slot, 5, MetaType1_9.Slot), + ITEMFRAME_ROTATION(ITEM_FRAME, 9, MetaType1_8.Byte, 6, MetaType1_9.VarInt), // ender crystal - ENDERCRYSTAL_HEALTH(ENDER_CRYSTAL, 8, Type.Int, NewType.Discontinued), + ENDERCRYSTAL_HEALTH(ENDER_CRYSTAL, 8, MetaType1_8.Int, MetaType1_9.Discontinued), // Ender dragon boss bar issues - ENDERDRAGON_UNKNOWN(ENDER_DRAGON, 5, Type.Byte, NewType.Discontinued), - ENDERDRAGON_NAME(ENDER_DRAGON, 10, Type.String, NewType.Discontinued), + ENDERDRAGON_UNKNOWN(ENDER_DRAGON, 5, MetaType1_8.Byte, MetaType1_9.Discontinued), + ENDERDRAGON_NAME(ENDER_DRAGON, 10, MetaType1_8.String, MetaType1_9.Discontinued), // Normal Ender dragon - ENDERDRAGON_FLAG(ENDER_DRAGON, 15, Type.Byte, NewType.Discontinued), - ENDERDRAGON_PHASE(ENDER_DRAGON, 11, Type.Byte, NewType.VarInt); + ENDERDRAGON_FLAG(ENDER_DRAGON, 15, MetaType1_8.Byte, MetaType1_9.Discontinued), + ENDERDRAGON_PHASE(ENDER_DRAGON, 11, MetaType1_8.Byte, MetaType1_9.VarInt); private static final HashMap, MetaIndex> metadataRewrites = new HashMap<>(); @@ -149,11 +151,11 @@ public enum MetaIndex { private EntityUtil.EntityType clazz; private int newIndex; - private NewType newType; - private Type oldType; + private MetaType1_9 newType; + private MetaType1_8 oldType; private int index; - MetaIndex(EntityUtil.EntityType type, int index, Type oldType, NewType newType) { + MetaIndex(EntityUtil.EntityType type, int index, MetaType1_8 oldType, MetaType1_9 newType) { this.clazz = type; this.index = index; this.newIndex = index; @@ -161,7 +163,7 @@ public enum MetaIndex { this.newType = newType; } - MetaIndex(EntityUtil.EntityType type, int index, Type oldType, int newIndex, NewType newType) { + MetaIndex(EntityUtil.EntityType type, int index, MetaType1_8 oldType, int newIndex, MetaType1_9 newType) { this.clazz = type; this.index = index; this.oldType = oldType; diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java index 6a3ce503d..5966d249a 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java @@ -4,7 +4,10 @@ import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.minecraft.EulerAngle; import us.myles.ViaVersion.api.minecraft.Vector; import us.myles.ViaVersion.api.minecraft.item.Item; +import us.myles.ViaVersion.api.minecraft.metadata.MetaType; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; +import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_8; +import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_9; import us.myles.ViaVersion.protocols.protocol1_9to1_8.ItemRewriter; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; import us.myles.ViaVersion.util.EntityUtil; @@ -21,20 +24,19 @@ public class MetadataRewriter { MetaIndex metaIndex = MetaIndex.searchIndex(type, entry.getId()); try { if (metaIndex != null) { - if (metaIndex.getNewType() != NewType.Discontinued) { - if (metaIndex.getNewType() != NewType.BlockID || id != -1 && data == -1 || id == -1 && data != -1) { // block ID is only written if we have both parts + if (metaIndex.getNewType() != MetaType1_9.Discontinued) { + if (metaIndex.getNewType() != MetaType1_9.BlockID || id != -1 && data == -1 || id == -1 && data != -1) { // block ID is only written if we have both parts entry.setId(metaIndex.getNewIndex()); - entry.setTypeID(metaIndex.getNewType().getTypeID()); + entry.setMetaType(metaIndex.getNewType()); } Object value = entry.getValue(); switch (metaIndex.getNewType()) { case Byte: - entry.setType(us.myles.ViaVersion.api.type.Type.BYTE); // convert from int, byte - if (metaIndex.getOldType() == Type.Byte) { + if (metaIndex.getOldType() == MetaType1_8.Byte) { entry.setValue(value); } - if (metaIndex.getOldType() == Type.Int) { + if (metaIndex.getOldType() == MetaType1_8.Int) { entry.setValue(((Integer) value).byteValue()); } // After writing the last one @@ -44,13 +46,12 @@ public class MetadataRewriter { val = 1; } int newIndex = MetaIndex.PLAYER_HAND.getNewIndex(); - int typeID = MetaIndex.PLAYER_HAND.getNewType().getTypeID(); - Metadata metadata = new Metadata(newIndex, typeID, us.myles.ViaVersion.api.type.Type.BYTE, val); + MetaType metaType = MetaIndex.PLAYER_HAND.getNewType(); + Metadata metadata = new Metadata(newIndex, metaType, val); list.add(metadata); } break; case OptUUID: - entry.setType(us.myles.ViaVersion.api.type.Type.OPTIONAL_UUID); String owner = (String) value; UUID toWrite = null; if (owner.length() != 0) { @@ -62,12 +63,11 @@ public class MetadataRewriter { entry.setValue(toWrite); break; case BlockID: - entry.setType(us.myles.ViaVersion.api.type.Type.VAR_INT); // if we have both sources :)) - if (metaIndex.getOldType() == Type.Byte) { + if (metaIndex.getOldType() == MetaType1_8.Byte) { data = (Byte) value; } - if (metaIndex.getOldType() == Type.Short) { + if (metaIndex.getOldType() == MetaType1_8.Short) { id = (Short) value; } if (id != -1 && data != -1) { @@ -80,50 +80,42 @@ public class MetadataRewriter { } break; case VarInt: - entry.setType(us.myles.ViaVersion.api.type.Type.VAR_INT); // convert from int, short, byte - if (metaIndex.getOldType() == Type.Byte) { + if (metaIndex.getOldType() == MetaType1_8.Byte) { entry.setValue(((Byte) value).intValue()); } - if (metaIndex.getOldType() == Type.Short) { + if (metaIndex.getOldType() == MetaType1_8.Short) { entry.setValue(((Short) value).intValue()); } - if (metaIndex.getOldType() == Type.Int) { + if (metaIndex.getOldType() == MetaType1_8.Int) { entry.setValue(value); } break; case Float: - entry.setType(us.myles.ViaVersion.api.type.Type.FLOAT); entry.setValue(value); break; case String: - entry.setType(us.myles.ViaVersion.api.type.Type.STRING); entry.setValue(value); break; case Boolean: - entry.setType(us.myles.ViaVersion.api.type.Type.BOOLEAN); if (metaIndex == MetaIndex.AGEABLE_AGE) entry.setValue((Byte) value < 0); else entry.setValue((Byte) value != 0); break; case Slot: - entry.setType(us.myles.ViaVersion.api.type.Type.ITEM); entry.setValue(value); ItemRewriter.toClient((Item) entry.getValue()); break; case Position: - entry.setType(us.myles.ViaVersion.api.type.Type.VECTOR); Vector vector = (Vector) value; entry.setValue(vector); break; case Vector3F: - entry.setType(us.myles.ViaVersion.api.type.Type.ROTATION); EulerAngle angle = (EulerAngle) value; entry.setValue(angle); break; case Chat: - entry.setType(us.myles.ViaVersion.api.type.Type.STRING); value = Protocol1_9TO1_8.fixJson((String) value); entry.setValue(value); break; diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/Type.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/Type.java deleted file mode 100644 index 18bb90b4b..000000000 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/Type.java +++ /dev/null @@ -1,23 +0,0 @@ -package us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@Getter -public enum Type { - Byte(0), - Short(1), - Int(2), - Float(3), - String(4), - Slot(5), - Position(6), - Rotation(7), - NonExistent(-1); - private final int typeID; - - public static Type byId(int id) { - return values()[id]; - } -} diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java index d286f2067..5274c11f6 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java @@ -3,6 +3,7 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.packets; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; +import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_9; import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.api.remapper.PacketHandler; import us.myles.ViaVersion.api.remapper.PacketRemapper; @@ -15,7 +16,6 @@ import us.myles.ViaVersion.packets.State; import us.myles.ViaVersion.protocols.protocol1_9to1_8.ItemRewriter; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; import us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata.MetadataRewriter; -import us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata.NewType; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.EntityTracker; import us.myles.ViaVersion.util.EntityUtil; @@ -105,7 +105,7 @@ public class SpawnPackets { Item item = new Item((short) 373, (byte) 1, (short) data, null); // Potion ItemRewriter.toClient(item); // Rewrite so that it gets the right nbt // TEMP FIX FOR POTIONS UNTIL WE FIGURE OUT HOW TO TRANSFORM SENT PACKETS - Metadata potion = new Metadata(5, NewType.Slot.getTypeID(), Type.ITEM, item); + Metadata potion = new Metadata(5, MetaType1_9.Slot, item); meta.add(potion); wrapper.write(Types1_9.METADATA_LIST, meta); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java index 6e5cefa07..9fc8f18fb 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java @@ -16,13 +16,13 @@ import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.minecraft.Position; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; +import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_9; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.api.type.types.version.Types1_9; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; import us.myles.ViaVersion.protocols.protocol1_9to1_8.chat.GameMode; import us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata.MetadataRewriter; -import us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata.NewType; import us.myles.ViaVersion.util.EntityUtil; import java.util.*; @@ -137,7 +137,7 @@ public class EntityTracker extends StoredObject { if (type == EntityUtil.EntityType.SKELETON) { if ((getMetaByIndex(metadataList, 12)) == null) { - metadataList.add(new Metadata(12, NewType.Boolean.getTypeID(), Type.BOOLEAN, true)); + metadataList.add(new Metadata(12, MetaType1_9.Boolean, true)); } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java index 7224c151b..5c42e7714 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java @@ -3,8 +3,7 @@ package us.myles.ViaVersion.protocols.protocolsnapshotto1_10; import com.google.common.base.Optional; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; -import us.myles.ViaVersion.api.type.Type; -import us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata.NewType; +import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_9; import java.util.ArrayList; import java.util.List; @@ -41,7 +40,7 @@ public class MetadataRewriter { if (options.isPresent()) { int value = (int) options.get().getValue(); if (value > 0 && value < 6) { - metadata.add(new Metadata(16, NewType.VarInt.getTypeID(), Type.VAR_INT, value - 1)); // Add profession type to new metadata + metadata.add(new Metadata(16, MetaType1_9.VarInt, value - 1)); // Add profession type to new metadata return 27; } if (value == 6) { @@ -90,8 +89,7 @@ public class MetadataRewriter { if (type == 4 || type == 68) { // Guardians int oldid = metadata.getId(); if (oldid == 12) { - metadata.setType(Type.BOOLEAN); - metadata.setTypeID(NewType.Boolean.getTypeID()); + metadata.setMetaType(MetaType1_9.Boolean); boolean val = (((byte) metadata.getValue()) & 0x02) == 0x02; metadata.setValue(val); } @@ -144,9 +142,9 @@ public class MetadataRewriter { // Chested Horse if (metadata.getId() == 13) { if ((((byte) metadata.getValue()) & 0x08) == 0x08) { - metadatas.add(new Metadata(15, NewType.Boolean.getTypeID(), Type.BOOLEAN, true)); + metadatas.add(new Metadata(15, MetaType1_9.Boolean, true)); } else { - metadatas.add(new Metadata(15, NewType.Boolean.getTypeID(), Type.BOOLEAN, false)); + metadatas.add(new Metadata(15, MetaType1_9.Boolean, false)); } } } diff --git a/pom.xml b/pom.xml index 3cd69f629..5e478606b 100644 --- a/pom.xml +++ b/pom.xml @@ -114,6 +114,13 @@ bungeecord-chat 1.10-SNAPSHOT + + + + com.google.guava + guava + 19.0 + From 42edffb3092accb232a69a1c38246e3e593814de Mon Sep 17 00:00:00 2001 From: Myles Date: Mon, 26 Sep 2016 13:50:20 +0100 Subject: [PATCH 32/76] Change reflection to NMSUtil, and start work on Bungee (doesn't work) --- .../us/myles/ViaVersion/ViaVersionPlugin.java | 3 +- .../bukkit/BukkitViaBulkChunkTranslator.java | 7 +- .../ViaVersion/bukkit/BukkitViaInjector.java | 7 +- .../bukkit/BukkitViaMovementTransmitter.java | 9 +- .../classgenerator/ClassGenerator.java | 5 +- .../CommandBlockListener.java | 11 +- .../us/myles/ViaVersion/util/NMSUtil.java | 20 +++ .../myles/ViaVersion/util/ReflectionUtil.java | 145 ------------------ bungee/pom.xml | 13 +- .../main/java/us/myles/ViaVersion/Bungee.java | 11 +- .../ViaVersion/bungee/BungeeViaInjector.java | 26 +++- .../bungee/handlers/ViaDecodeHandler.java | 89 +++++++++++ .../bungee/handlers/ViaEncodeHandler.java | 70 +++++++++ .../bungee/handlers/ViaPacketHandler.java | 35 +++++ .../handlers/ViaVersionInitializer.java | 48 ++++++ .../ViaVersion}/util/ReflectionUtil.java | 9 +- .../ViaVersion/sponge/SpongeViaInjector.java | 3 +- .../SpongeViaBulkChunkTranslator.java | 2 +- 18 files changed, 335 insertions(+), 178 deletions(-) create mode 100644 bukkit/src/main/java/us/myles/ViaVersion/util/NMSUtil.java delete mode 100644 bukkit/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaDecodeHandler.java create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaEncodeHandler.java create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaPacketHandler.java create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaVersionInitializer.java rename {sponge/src/main/java/us/myles/ViaVersion/sponge => common/src/main/java/us/myles/ViaVersion}/util/ReflectionUtil.java (94%) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 844905033..75a5aea71 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -17,6 +17,7 @@ import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.bukkit.*; import us.myles.ViaVersion.classgenerator.ClassGenerator; import us.myles.ViaVersion.dump.PluginInfo; +import us.myles.ViaVersion.util.NMSUtil; import us.myles.ViaVersion.util.ReflectionUtil; import java.util.ArrayList; @@ -76,7 +77,7 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { // Check if it's a spigot build with a protocol mod try { - compatSpigotBuild = ReflectionUtil.nms("PacketEncoder").getDeclaredField("version") != null; + compatSpigotBuild = NMSUtil.nms("PacketEncoder").getDeclaredField("version") != null; } catch (Exception e) { compatSpigotBuild = false; } diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaBulkChunkTranslator.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaBulkChunkTranslator.java index 82244c31d..dc57fa445 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaBulkChunkTranslator.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaBulkChunkTranslator.java @@ -5,6 +5,7 @@ import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks; +import us.myles.ViaVersion.util.NMSUtil; import us.myles.ViaVersion.util.ReflectionUtil; import java.lang.reflect.Method; @@ -19,10 +20,10 @@ public class BukkitViaBulkChunkTranslator extends BulkChunkTranslatorProvider { static { try { - mapChunkBulkRef = new ReflectionUtil.ClassReflection(ReflectionUtil.nms("PacketPlayOutMapChunkBulk")); - mapChunkRef = new ReflectionUtil.ClassReflection(ReflectionUtil.nms("PacketPlayOutMapChunk")); + mapChunkBulkRef = new ReflectionUtil.ClassReflection(NMSUtil.nms("PacketPlayOutMapChunkBulk")); + mapChunkRef = new ReflectionUtil.ClassReflection(NMSUtil.nms("PacketPlayOutMapChunk")); if (((ViaVersionPlugin) Via.getPlatform()).isSpigot()) { - obfuscateRef = Class.forName("org.spigotmc.AntiXray").getMethod("obfuscate", int.class, int.class, int.class, byte[].class, ReflectionUtil.nms("World")); + obfuscateRef = Class.forName("org.spigotmc.AntiXray").getMethod("obfuscate", int.class, int.class, int.class, byte[].class, NMSUtil.nms("World")); } } catch (ClassNotFoundException e) { // Ignore as server is probably 1.9+ diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java index f6aab8bed..dd06a2e45 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java @@ -11,6 +11,7 @@ import us.myles.ViaVersion.api.platform.ViaInjector; import us.myles.ViaVersion.handlers.ViaVersionInitializer; import us.myles.ViaVersion.util.ConcurrentList; import us.myles.ViaVersion.util.ListWrapper; +import us.myles.ViaVersion.util.NMSUtil; import us.myles.ViaVersion.util.ReflectionUtil; import java.lang.reflect.Field; @@ -128,9 +129,9 @@ public class BukkitViaInjector implements ViaInjector { @Override public int getServerProtocolVersion() throws Exception { try { - Class serverClazz = ReflectionUtil.nms("MinecraftServer"); + Class serverClazz = NMSUtil.nms("MinecraftServer"); Object server = ReflectionUtil.invokeStatic(serverClazz, "getServer"); - Class pingClazz = ReflectionUtil.nms("ServerPing"); + Class pingClazz = NMSUtil.nms("ServerPing"); Object ping = null; // Search for ping method for (Field f : serverClazz.getDeclaredFields()) { @@ -173,7 +174,7 @@ public class BukkitViaInjector implements ViaInjector { } public static Object getServerConnection() throws Exception { - Class serverClazz = ReflectionUtil.nms("MinecraftServer"); + Class serverClazz = NMSUtil.nms("MinecraftServer"); Object server = ReflectionUtil.invokeStatic(serverClazz, "getServer"); Object connection = null; for (Method m : serverClazz.getDeclaredMethods()) { diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaMovementTransmitter.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaMovementTransmitter.java index 81806eedb..316783853 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaMovementTransmitter.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaMovementTransmitter.java @@ -7,6 +7,7 @@ import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.MovementTracker; +import us.myles.ViaVersion.util.NMSUtil; import us.myles.ViaVersion.util.ReflectionUtil; import java.lang.reflect.Field; @@ -28,7 +29,7 @@ public class BukkitViaMovementTransmitter extends MovementTransmitterProvider { Class idlePacketClass; try { - idlePacketClass = ReflectionUtil.nms("PacketPlayInFlying"); + idlePacketClass = NMSUtil.nms("PacketPlayInFlying"); } catch (ClassNotFoundException e) { return; // We'll hope this is 1.9.4+ } @@ -45,19 +46,19 @@ public class BukkitViaMovementTransmitter extends MovementTransmitterProvider { } if (USE_NMS) { try { - getHandle = ReflectionUtil.obc("entity.CraftPlayer").getDeclaredMethod("getHandle"); + getHandle = NMSUtil.obc("entity.CraftPlayer").getDeclaredMethod("getHandle"); } catch (NoSuchMethodException | ClassNotFoundException e) { throw new RuntimeException("Couldn't find CraftPlayer", e); } try { - connection = ReflectionUtil.nms("EntityPlayer").getDeclaredField("playerConnection"); + connection = NMSUtil.nms("EntityPlayer").getDeclaredField("playerConnection"); } catch (NoSuchFieldException | ClassNotFoundException e) { throw new RuntimeException("Couldn't find Player Connection", e); } try { - handleFlying = ReflectionUtil.nms("PlayerConnection").getDeclaredMethod("a", idlePacketClass); + handleFlying = NMSUtil.nms("PlayerConnection").getDeclaredMethod("a", idlePacketClass); } catch (NoSuchMethodException | ClassNotFoundException e) { throw new RuntimeException("Couldn't find CraftPlayer", e); } diff --git a/bukkit/src/main/java/us/myles/ViaVersion/classgenerator/ClassGenerator.java b/bukkit/src/main/java/us/myles/ViaVersion/classgenerator/ClassGenerator.java index d29089d02..f9daaa86f 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/classgenerator/ClassGenerator.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/classgenerator/ClassGenerator.java @@ -8,6 +8,7 @@ import org.bukkit.plugin.Plugin; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.handlers.ViaDecodeHandler; import us.myles.ViaVersion.handlers.ViaEncodeHandler; +import us.myles.ViaVersion.util.NMSUtil; import us.myles.ViaVersion.util.ReflectionUtil; public class ClassGenerator { @@ -27,8 +28,8 @@ public class ClassGenerator { } if (ViaVersion.getInstance().isCompatSpigotBuild()) { - Class decodeSuper = ReflectionUtil.nms("PacketDecoder"); - Class encodeSuper = ReflectionUtil.nms("PacketEncoder"); + Class decodeSuper = NMSUtil.nms("PacketDecoder"); + Class encodeSuper = NMSUtil.nms("PacketEncoder"); // Generate the classes addSpigotCompatibility(pool, ViaDecodeHandler.class, decodeSuper); addSpigotCompatibility(pool, ViaEncodeHandler.class, encodeSuper); diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/CommandBlockListener.java b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/CommandBlockListener.java index 5f5c713b6..43b49b392 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/CommandBlockListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/CommandBlockListener.java @@ -23,6 +23,7 @@ import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.minecraft.Position; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; +import us.myles.ViaVersion.util.NMSUtil; import us.myles.ViaVersion.util.ReflectionUtil; import java.io.DataOutput; @@ -88,7 +89,7 @@ public class CommandBlockListener extends ViaListener { return; CommandBlock cmd = (CommandBlock) b.getState(); - Object tileEntityCommand = ReflectionUtil.get(cmd, "commandBlock", ReflectionUtil.nms("TileEntityCommand")); + Object tileEntityCommand = ReflectionUtil.get(cmd, "commandBlock", NMSUtil.nms("TileEntityCommand")); Object updatePacket = ReflectionUtil.invoke(tileEntityCommand, "getUpdatePacket"); PacketWrapper wrapper = generatePacket(updatePacket, getUserConnection(player)); @@ -98,12 +99,12 @@ public class CommandBlockListener extends ViaListener { private PacketWrapper generatePacket(Object updatePacket, UserConnection usr) throws Exception { PacketWrapper wrapper = new PacketWrapper(0x09, null, usr); // Update block entity - long[] pos = getPosition(ReflectionUtil.get(updatePacket, "a", ReflectionUtil.nms("BlockPosition"))); + long[] pos = getPosition(ReflectionUtil.get(updatePacket, "a", NMSUtil.nms("BlockPosition"))); wrapper.write(Type.POSITION, new Position(pos[0], pos[1], pos[2])); //Block position wrapper.write(Type.BYTE, (byte) 2); // Action id always 2 - CompoundTag nbt = getNBT(ReflectionUtil.get(updatePacket, "c", ReflectionUtil.nms("NBTTagCompound"))); + CompoundTag nbt = getNBT(ReflectionUtil.get(updatePacket, "c", NMSUtil.nms("NBTTagCompound"))); if (nbt == null) { wrapper.write(Type.BYTE, (byte) 0); //If nbt is null. Use 0 as nbt return wrapper; @@ -125,12 +126,12 @@ public class CommandBlockListener extends ViaListener { } private boolean isR1() { - return ReflectionUtil.getVersion().equals("v1_8_R1"); + return NMSUtil.getVersion().equals("v1_8_R1"); } private CompoundTag getNBT(Object obj) throws Exception { ByteBuf buf = Unpooled.buffer(); - Method m = ReflectionUtil.nms("NBTCompressedStreamTools").getMethod("a", ReflectionUtil.nms("NBTTagCompound"), DataOutput.class); + Method m = NMSUtil.nms("NBTCompressedStreamTools").getMethod("a", NMSUtil.nms("NBTTagCompound"), DataOutput.class); m.invoke(null, obj, new DataOutputStream(new ByteBufOutputStream(buf))); try { return Type.NBT.read(buf); diff --git a/bukkit/src/main/java/us/myles/ViaVersion/util/NMSUtil.java b/bukkit/src/main/java/us/myles/ViaVersion/util/NMSUtil.java new file mode 100644 index 000000000..578ef49b5 --- /dev/null +++ b/bukkit/src/main/java/us/myles/ViaVersion/util/NMSUtil.java @@ -0,0 +1,20 @@ +package us.myles.ViaVersion.util; + +import org.bukkit.Bukkit; + +public class NMSUtil { + private static String BASE = Bukkit.getServer().getClass().getPackage().getName(); + private static String NMS = BASE.replace("org.bukkit.craftbukkit", "net.minecraft.server"); + + public static Class nms(String className) throws ClassNotFoundException { + return Class.forName(NMS + "." + className); + } + + public static Class obc(String className) throws ClassNotFoundException { + return Class.forName(BASE + "." + className); + } + + public static String getVersion() { + return BASE.substring(BASE.lastIndexOf('.') + 1); + } +} diff --git a/bukkit/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java b/bukkit/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java deleted file mode 100644 index 307ae2601..000000000 --- a/bukkit/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java +++ /dev/null @@ -1,145 +0,0 @@ -package us.myles.ViaVersion.util; - -import com.google.common.collect.Maps; -import org.bukkit.Bukkit; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.Collections; -import java.util.Map; - -public class ReflectionUtil { - private static String BASE = Bukkit.getServer().getClass().getPackage().getName(); - private static String NMS = BASE.replace("org.bukkit.craftbukkit", "net.minecraft.server"); - - public static Class nms(String className) throws ClassNotFoundException { - return Class.forName(NMS + "." + className); - } - - public static Class obc(String className) throws ClassNotFoundException { - return Class.forName(BASE + "." + className); - } - - public static String getVersion() { - return BASE.substring(BASE.lastIndexOf('.') + 1); - } - - public static Object invokeStatic(Class clazz, String method) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { - Method m = clazz.getDeclaredMethod(method); - return m.invoke(null); - } - - public static Object invoke(Object o, String method) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { - Method m = o.getClass().getDeclaredMethod(method); - return m.invoke(o); - } - - public static T getStatic(Class clazz, String f, Class t) throws NoSuchFieldException, IllegalAccessException { - Field field = clazz.getDeclaredField(f); - field.setAccessible(true); - return (T) field.get(null); - } - - public static T getSuper(Object o, String f, Class t) throws NoSuchFieldException, IllegalAccessException { - Field field = o.getClass().getSuperclass().getDeclaredField(f); - field.setAccessible(true); - return (T) field.get(o); - } - - public static T get(Object instance, Class clazz, String f, Class t) throws NoSuchFieldException, IllegalAccessException { - Field field = clazz.getDeclaredField(f); - field.setAccessible(true); - return (T) field.get(instance); - } - - public static T get(Object o, String f, Class t) throws NoSuchFieldException, IllegalAccessException { - Field field = o.getClass().getDeclaredField(f); - field.setAccessible(true); - return (T) field.get(o); - } - - public static T getPublic(Object o, String f, Class t) throws NoSuchFieldException, IllegalAccessException { - Field field = o.getClass().getField(f); - field.setAccessible(true); - return (T) field.get(o); - } - - - public static void set(Object o, String f, Object value) throws NoSuchFieldException, IllegalAccessException { - Field field = o.getClass().getDeclaredField(f); - field.setAccessible(true); - field.set(o, value); - } - - public static final class ClassReflection { - private final Class handle; - private final Map fields = Maps.newConcurrentMap(); - private final Map methods = Maps.newConcurrentMap(); - - public ClassReflection(Class handle) { - this(handle, true); - } - - public ClassReflection(Class handle, boolean recursive) { - this.handle = handle; - scanFields(handle, recursive); - scanMethods(handle, recursive); - } - - private void scanFields(Class host, boolean recursive) { - if (host.getSuperclass() != null && recursive) { - scanFields(host.getSuperclass(), true); - } - - for (Field field : host.getDeclaredFields()) { - field.setAccessible(true); - fields.put(field.getName(), field); - } - } - - private void scanMethods(Class host, boolean recursive) { - if (host.getSuperclass() != null && recursive) { - scanMethods(host.getSuperclass(), true); - } - - for (Method method : host.getDeclaredMethods()) { - method.setAccessible(true); - methods.put(method.getName(), method); - } - } - - public Object newInstance() throws IllegalAccessException, InstantiationException { - return handle.newInstance(); - } - - public Field getField(String name) { - return fields.get(name); - } - - public void setFieldValue(String fieldName, Object instance, Object value) throws IllegalAccessException { - getField(fieldName).set(instance, value); - } - - public T getFieldValue(String fieldName, Object instance, Class type) throws IllegalAccessException { - return type.cast(getField(fieldName).get(instance)); - } - - public T invokeMethod(Class type, String methodName, Object instance, Object... args) throws InvocationTargetException, IllegalAccessException { - return type.cast(getMethod(methodName).invoke(instance, args)); - } - - public Method getMethod(String name) { - return methods.get(name); - } - - public Collection getFields() { - return Collections.unmodifiableCollection(fields.values()); - } - - public Collection getMethods() { - return Collections.unmodifiableCollection(methods.values()); - } - } -} diff --git a/bungee/pom.xml b/bungee/pom.xml index ce5ba81b2..ccb0e47aa 100644 --- a/bungee/pom.xml +++ b/bungee/pom.xml @@ -25,18 +25,23 @@ - + net.md-5 bungeecord-api 1.10-SNAPSHOT provided + + - us.myles - viaversion-common - 1.0.0-ALPHA-modules + net.md-5 + bungeecord-proxy + 1.4.7-SNAPSHOT + provided + + us.myles viaversion-common diff --git a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java b/bungee/src/main/java/us/myles/ViaVersion/Bungee.java index 2e3284c29..0b825c6d2 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java +++ b/bungee/src/main/java/us/myles/ViaVersion/Bungee.java @@ -28,10 +28,7 @@ public class Bungee extends Plugin implements ViaPlatform { public void onLoad() { api = new BungeeViaAPI(); config = new BungeeConfigProvider(); - } - - @Override - public void onEnable() { + // Init platform Via.init(ViaManager.builder() .platform(this) .injector(new BungeeViaInjector()) @@ -39,6 +36,12 @@ public class Bungee extends Plugin implements ViaPlatform { .build()); } + @Override + public void onEnable() { + // Inject + Via.getManager().init(); + } + @Override public String getPlatformName() { return "BungeeCord"; diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaInjector.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaInjector.java index 17214b49f..6482cb397 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaInjector.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaInjector.java @@ -1,18 +1,38 @@ package us.myles.ViaVersion.bungee; +import io.netty.channel.Channel; +import io.netty.channel.ChannelInitializer; +import net.md_5.bungee.netty.PipelineUtils; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaInjector; +import us.myles.ViaVersion.bungee.handlers.ViaVersionInitializer; +import us.myles.ViaVersion.util.ReflectionUtil; public class BungeeViaInjector implements ViaInjector { @Override public void inject() throws Exception { + try { + try { + ChannelInitializer oldInit = PipelineUtils.SERVER_CHILD; + ChannelInitializer newInit = new ViaVersionInitializer(oldInit); + ReflectionUtil.setStatic(PipelineUtils.class, "SERVER_CHILD", newInit); + } catch (NoSuchFieldException e) { + throw new Exception("Unable to find core component 'childHandler', please check your plugins. issue: "); + + } + } catch (Exception e) { + Via.getPlatform().getLogger().severe("Unable to inject ViaVersion, please post these details on our GitHub and ensure you're using a compatible server version."); + throw e; + } } - @Override - public void uninject() throws Exception { - + public void uninject() { + // TODO: Uninject from players currently online + Via.getPlatform().getLogger().severe("ViaVersion cannot remove itself from Bungee without a reboot!"); } + @Override public int getServerProtocolVersion() throws Exception { return 47; diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaDecodeHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaDecodeHandler.java new file mode 100644 index 000000000..017c6a7dd --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaDecodeHandler.java @@ -0,0 +1,89 @@ +package us.myles.ViaVersion.bungee.handlers; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.exception.CancelException; +import us.myles.ViaVersion.packets.Direction; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; +import us.myles.ViaVersion.util.PipelineUtil; + +import java.lang.reflect.InvocationTargetException; +import java.util.List; + +public class ViaDecodeHandler extends ByteToMessageDecoder { + + private final ByteToMessageDecoder minecraftDecoder; + private final UserConnection info; + + public ViaDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) { + this.info = info; + this.minecraftDecoder = minecraftDecoder; + } + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf bytebuf, List list) throws Exception { + // use transformers + if (bytebuf.readableBytes() > 0) { + // Ignore if pending disconnect + if (info.isPendingDisconnect()) { + return; + } + // Increment received + boolean second = info.incrementReceived(); + // Check PPS + if (second) { + if (info.handlePPS()) + return; + } + + if (info.isActive()) { + // Handle ID + int id = Type.VAR_INT.read(bytebuf); + // Transform + ByteBuf newPacket = ctx.alloc().buffer(); + try { + if (id == PacketWrapper.PASSTHROUGH_ID) { + newPacket.writeBytes(bytebuf); + } else { + PacketWrapper wrapper = new PacketWrapper(id, bytebuf, info); + ProtocolInfo protInfo = info.get(ProtocolInfo.class); + protInfo.getPipeline().transform(Direction.INCOMING, protInfo.getState(), wrapper); + wrapper.writeToBuffer(newPacket); + } + + bytebuf.clear(); + bytebuf = newPacket; + } catch (Exception e) { + // Clear Buffer + bytebuf.clear(); + // Release Packet, be free! + newPacket.release(); + throw e; + } + } + + // call minecraft decoder + try { + list.addAll(PipelineUtil.callDecode(this.minecraftDecoder, ctx, bytebuf)); + } catch (InvocationTargetException e) { + if (e.getCause() instanceof Exception) { + throw (Exception) e.getCause(); + } + } finally { + if (info.isActive()) { + bytebuf.release(); + } + } + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + if (PipelineUtil.containsCause(cause, CancelException.class)) return; + super.exceptionCaught(ctx, cause); + } +} diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaEncodeHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaEncodeHandler.java new file mode 100644 index 000000000..119fb5b13 --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaEncodeHandler.java @@ -0,0 +1,70 @@ +package us.myles.ViaVersion.bungee.handlers; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; +import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.exception.CancelException; +import us.myles.ViaVersion.packets.Direction; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; +import us.myles.ViaVersion.util.PipelineUtil; + +import java.lang.reflect.InvocationTargetException; + +public class ViaEncodeHandler extends MessageToByteEncoder { + private final UserConnection info; + private final MessageToByteEncoder minecraftEncoder; + + public ViaEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) { + this.info = info; + this.minecraftEncoder = minecraftEncoder; + } + + + @Override + protected void encode(final ChannelHandlerContext ctx, Object o, final ByteBuf bytebuf) throws Exception { + // handle the packet type + if (!(o instanceof ByteBuf)) { + // call minecraft encoder + try { + PipelineUtil.callEncode(this.minecraftEncoder, ctx, o, bytebuf); + } catch (InvocationTargetException e) { + if (e.getCause() instanceof Exception) { + throw (Exception) e.getCause(); + } + } + } + if (bytebuf.readableBytes() == 0) { + throw new CancelException(); + } + // Increment sent + info.incrementSent(); + if (info.isActive()) { + // Handle ID + int id = Type.VAR_INT.read(bytebuf); + // Transform + ByteBuf oldPacket = bytebuf.copy(); + bytebuf.clear(); + + try { + PacketWrapper wrapper = new PacketWrapper(id, oldPacket, info); + ProtocolInfo protInfo = info.get(ProtocolInfo.class); + protInfo.getPipeline().transform(Direction.OUTGOING, protInfo.getState(), wrapper); + wrapper.writeToBuffer(bytebuf); + } catch (Exception e) { + bytebuf.clear(); + throw e; + } finally { + oldPacket.release(); + } + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + if (PipelineUtil.containsCause(cause, CancelException.class)) return; + super.exceptionCaught(ctx, cause); + } +} diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaPacketHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaPacketHandler.java new file mode 100644 index 000000000..62d1e44fa --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaPacketHandler.java @@ -0,0 +1,35 @@ +package us.myles.ViaVersion.bungee.handlers; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToMessageEncoder; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; + +import java.util.List; + +public class ViaPacketHandler extends MessageToMessageEncoder { + private final UserConnection info; + + public ViaPacketHandler(UserConnection info) { + this.info = info; + } + + @Override + protected void encode(ChannelHandlerContext ctx, Object o, List list) throws Exception { + // Split chunks bulk packet up in to single chunks packets before it reached the encoder. + // This will prevent issues with several plugins and other protocol handlers due to the chunks being sent twice. + // It also sends the chunks in the right order possible resolving some issues with added chunks/block/entity data. + if (!(o instanceof ByteBuf)) { + info.setLastPacket(o); + /* This transformer is more for fixing issues which we find hard at packet level :) */ + if (info.isActive()) { + if (info.get(ProtocolInfo.class).getPipeline().filter(o, list)) { + return; + } + } + } + + list.add(o); + } +} diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaVersionInitializer.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaVersionInitializer.java new file mode 100644 index 000000000..ea5808344 --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaVersionInitializer.java @@ -0,0 +1,48 @@ +package us.myles.ViaVersion.bungee.handlers; + +import io.netty.channel.Channel; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.ByteToMessageDecoder; +import io.netty.handler.codec.MessageToByteEncoder; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.protocol.ProtocolPipeline; + +import java.lang.reflect.Method; + +public class ViaVersionInitializer extends ChannelInitializer { + + private final ChannelInitializer original; + private Method method; + + public ViaVersionInitializer(ChannelInitializer oldInit) { + this.original = oldInit; + try { + this.method = ChannelInitializer.class.getDeclaredMethod("initChannel", Channel.class); + this.method.setAccessible(true); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + } + + public ChannelInitializer getOriginal() { + return original; + } + + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + UserConnection info = new UserConnection(socketChannel); + // init protocol + new ProtocolPipeline(info); + // Add originals + this.method.invoke(this.original, socketChannel); + // Add our transformers + MessageToByteEncoder encoder = new ViaEncodeHandler(info, (MessageToByteEncoder) socketChannel.pipeline().get("encoder")); + ByteToMessageDecoder decoder = new ViaDecodeHandler(info, (ByteToMessageDecoder) socketChannel.pipeline().get("decoder")); + ViaPacketHandler chunkHandler = new ViaPacketHandler(info); + + socketChannel.pipeline().replace("encoder", "encoder", encoder); + socketChannel.pipeline().replace("decoder", "decoder", decoder); + socketChannel.pipeline().addAfter("packet_handler", "viaversion_packet_handler", chunkHandler); + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/util/ReflectionUtil.java b/common/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java similarity index 94% rename from sponge/src/main/java/us/myles/ViaVersion/sponge/util/ReflectionUtil.java rename to common/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java index cb025a014..f44622297 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/util/ReflectionUtil.java +++ b/common/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.sponge.util; +package us.myles.ViaVersion.util; import com.google.common.collect.Maps; @@ -27,6 +27,12 @@ public class ReflectionUtil { return (T) field.get(null); } + public static void setStatic(Class clazz, String f, Object value) throws NoSuchFieldException, IllegalAccessException { + Field field = clazz.getDeclaredField(f); + field.setAccessible(true); + field.set(null, value); + } + public static T getSuper(Object o, String f, Class t) throws NoSuchFieldException, IllegalAccessException { Field field = o.getClass().getSuperclass().getDeclaredField(f); field.setAccessible(true); @@ -58,6 +64,7 @@ public class ReflectionUtil { field.set(o, value); } + public static final class ClassReflection { private final Class handle; private final Map fields = Maps.newConcurrentMap(); diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java index 8ff70607a..fea7d41ea 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java @@ -10,12 +10,11 @@ import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaInjector; import us.myles.ViaVersion.sponge.handlers.ViaVersionInitializer; -import us.myles.ViaVersion.sponge.util.ReflectionUtil; +import us.myles.ViaVersion.util.ReflectionUtil; import us.myles.ViaVersion.util.ListWrapper; import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaBulkChunkTranslator.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaBulkChunkTranslator.java index f6fa5ef86..052fa2bd9 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaBulkChunkTranslator.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaBulkChunkTranslator.java @@ -4,7 +4,7 @@ import com.google.common.collect.Lists; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks; -import us.myles.ViaVersion.sponge.util.ReflectionUtil; +import us.myles.ViaVersion.util.ReflectionUtil; import java.util.List; import java.util.logging.Level; From cdab5b3f5b44ee1c7a3dab433d2edb8639a93f54 Mon Sep 17 00:00:00 2001 From: Myles Date: Mon, 26 Sep 2016 14:48:46 +0100 Subject: [PATCH 33/76] Inject into Bungee, (does not get past login from when i've tested) Also add commands --- .../main/java/us/myles/ViaVersion/Bungee.java | 7 +++ .../bungee/command/BungeeCommand.java | 19 +++++++ .../bungee/command/BungeeCommandHandler.java | 7 +++ .../bungee/config/BungeeConfigProvider.java | 3 +- .../bungee/handlers/ViaDecodeHandler.java | 24 ++++++-- .../bungee/handlers/ViaEncodeHandler.java | 39 ++++++++----- .../handlers/ViaVersionInitializer.java | 15 +++-- .../bungee/util/BungeePipelineUtil.java | 56 +++++++++++++++++++ .../myles/ViaVersion/util/ReflectionUtil.java | 5 ++ 9 files changed, 151 insertions(+), 24 deletions(-) create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommand.java create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommandHandler.java create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java diff --git a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java b/bungee/src/main/java/us/myles/ViaVersion/Bungee.java index 0b825c6d2..a5ba702de 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java +++ b/bungee/src/main/java/us/myles/ViaVersion/Bungee.java @@ -1,6 +1,7 @@ package us.myles.ViaVersion; import com.google.gson.JsonObject; +import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Plugin; @@ -10,6 +11,8 @@ import us.myles.ViaVersion.api.ViaVersionConfig; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import us.myles.ViaVersion.api.platform.ViaPlatform; +import us.myles.ViaVersion.bungee.command.BungeeCommand; +import us.myles.ViaVersion.bungee.command.BungeeCommandHandler; import us.myles.ViaVersion.bungee.BungeeViaAPI; import us.myles.ViaVersion.bungee.BungeeViaInjector; import us.myles.ViaVersion.bungee.BungeeViaLoader; @@ -23,16 +26,20 @@ public class Bungee extends Plugin implements ViaPlatform { private BungeeViaAPI api; private BungeeConfigProvider config; + private BungeeCommandHandler commandHandler; @Override public void onLoad() { api = new BungeeViaAPI(); config = new BungeeConfigProvider(); + commandHandler = new BungeeCommandHandler(); + ProxyServer.getInstance().getPluginManager().registerCommand(this, new BungeeCommand(commandHandler)); // Init platform Via.init(ViaManager.builder() .platform(this) .injector(new BungeeViaInjector()) .loader(new BungeeViaLoader()) + .commandHandler(commandHandler) .build()); } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommand.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommand.java new file mode 100644 index 000000000..19b33f211 --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommand.java @@ -0,0 +1,19 @@ +package us.myles.ViaVersion.bungee.command; + +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.plugin.Command; + +public class BungeeCommand extends Command { + private final BungeeCommandHandler handler; + + public BungeeCommand(BungeeCommandHandler handler) { + super("viaversion"); // TODO PERMS HERE + this.handler = handler; + } + + @Override + public void execute(CommandSender commandSender, String[] strings) { + handler.onCommand(new BungeeCommandSender(commandSender), strings); + } + +} diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommandHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommandHandler.java new file mode 100644 index 000000000..f6d2b2a6d --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommandHandler.java @@ -0,0 +1,7 @@ +package us.myles.ViaVersion.bungee.command; + +import us.myles.ViaVersion.commands.ViaCommandHandler; + +public class BungeeCommandHandler extends ViaCommandHandler { + +} diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/config/BungeeConfigProvider.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/config/BungeeConfigProvider.java index d2eb518f2..688d367a7 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/config/BungeeConfigProvider.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/config/BungeeConfigProvider.java @@ -3,6 +3,7 @@ package us.myles.ViaVersion.bungee.config; import us.myles.ViaVersion.api.ViaVersionConfig; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -145,7 +146,7 @@ public class BungeeConfigProvider implements ViaVersionConfig, ConfigurationProv @Override public List getBlockedProtocols() { - return null; + return Arrays.asList(); } @Override diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaDecodeHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaDecodeHandler.java index 017c6a7dd..cb7073118 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaDecodeHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaDecodeHandler.java @@ -3,9 +3,14 @@ package us.myles.ViaVersion.bungee.handlers; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ByteToMessageDecoder; +import io.netty.handler.codec.MessageToMessageDecoder; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.protocol.MinecraftDecoder; +import net.md_5.bungee.protocol.Protocol; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.bungee.util.BungeePipelineUtil; import us.myles.ViaVersion.exception.CancelException; import us.myles.ViaVersion.packets.Direction; import us.myles.ViaVersion.protocols.base.ProtocolInfo; @@ -14,12 +19,13 @@ import us.myles.ViaVersion.util.PipelineUtil; import java.lang.reflect.InvocationTargetException; import java.util.List; -public class ViaDecodeHandler extends ByteToMessageDecoder { +public class ViaDecodeHandler extends MinecraftDecoder { - private final ByteToMessageDecoder minecraftDecoder; + private final MinecraftDecoder minecraftDecoder; private final UserConnection info; - public ViaDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) { + public ViaDecodeHandler(UserConnection info, MinecraftDecoder minecraftDecoder) { + super(Protocol.HANDSHAKE, true, ProxyServer.getInstance().getProtocolVersion()); this.info = info; this.minecraftDecoder = minecraftDecoder; } @@ -68,7 +74,7 @@ public class ViaDecodeHandler extends ByteToMessageDecoder { // call minecraft decoder try { - list.addAll(PipelineUtil.callDecode(this.minecraftDecoder, ctx, bytebuf)); + list.addAll(BungeePipelineUtil.callDecode(this.minecraftDecoder, ctx, bytebuf)); } catch (InvocationTargetException e) { if (e.getCause() instanceof Exception) { throw (Exception) e.getCause(); @@ -86,4 +92,14 @@ public class ViaDecodeHandler extends ByteToMessageDecoder { if (PipelineUtil.containsCause(cause, CancelException.class)) return; super.exceptionCaught(ctx, cause); } + + @Override + public void setProtocol(Protocol protocol) { + this.minecraftDecoder.setProtocol(protocol); + } + + @Override + public void setProtocolVersion(int protocolVersion) { + this.minecraftDecoder.setProtocolVersion(protocolVersion); + } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaEncodeHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaEncodeHandler.java index 119fb5b13..b6cdb8767 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaEncodeHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaEncodeHandler.java @@ -3,9 +3,14 @@ package us.myles.ViaVersion.bungee.handlers; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.protocol.DefinedPacket; +import net.md_5.bungee.protocol.MinecraftEncoder; +import net.md_5.bungee.protocol.Protocol; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.bungee.util.BungeePipelineUtil; import us.myles.ViaVersion.exception.CancelException; import us.myles.ViaVersion.packets.Direction; import us.myles.ViaVersion.protocols.base.ProtocolInfo; @@ -13,27 +18,25 @@ import us.myles.ViaVersion.util.PipelineUtil; import java.lang.reflect.InvocationTargetException; -public class ViaEncodeHandler extends MessageToByteEncoder { +public class ViaEncodeHandler extends MinecraftEncoder { private final UserConnection info; - private final MessageToByteEncoder minecraftEncoder; + private final MinecraftEncoder minecraftEncoder; - public ViaEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) { + public ViaEncodeHandler(UserConnection info, MinecraftEncoder minecraftEncoder) { + super(Protocol.HANDSHAKE, true, ProxyServer.getInstance().getProtocolVersion()); this.info = info; this.minecraftEncoder = minecraftEncoder; } @Override - protected void encode(final ChannelHandlerContext ctx, Object o, final ByteBuf bytebuf) throws Exception { - // handle the packet type - if (!(o instanceof ByteBuf)) { - // call minecraft encoder - try { - PipelineUtil.callEncode(this.minecraftEncoder, ctx, o, bytebuf); - } catch (InvocationTargetException e) { - if (e.getCause() instanceof Exception) { - throw (Exception) e.getCause(); - } + protected void encode(final ChannelHandlerContext ctx, DefinedPacket o, final ByteBuf bytebuf) throws Exception { + // call minecraft encoder + try { + BungeePipelineUtil.callEncode(this.minecraftEncoder, ctx, o, bytebuf); + } catch (InvocationTargetException e) { + if (e.getCause() instanceof Exception) { + throw (Exception) e.getCause(); } } if (bytebuf.readableBytes() == 0) { @@ -67,4 +70,14 @@ public class ViaEncodeHandler extends MessageToByteEncoder { if (PipelineUtil.containsCause(cause, CancelException.class)) return; super.exceptionCaught(ctx, cause); } + + @Override + public void setProtocol(Protocol protocol) { + this.minecraftEncoder.setProtocol(protocol); + } + + @Override + public void setProtocolVersion(int protocolVersion) { + this.minecraftEncoder.setProtocolVersion(protocolVersion); + } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaVersionInitializer.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaVersionInitializer.java index ea5808344..bf1be261f 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaVersionInitializer.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaVersionInitializer.java @@ -5,6 +5,9 @@ import io.netty.channel.ChannelInitializer; import io.netty.channel.socket.SocketChannel; import io.netty.handler.codec.ByteToMessageDecoder; import io.netty.handler.codec.MessageToByteEncoder; +import io.netty.handler.codec.MessageToMessageDecoder; +import net.md_5.bungee.protocol.MinecraftDecoder; +import net.md_5.bungee.protocol.MinecraftEncoder; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.protocol.ProtocolPipeline; @@ -37,12 +40,12 @@ public class ViaVersionInitializer extends ChannelInitializer { // Add originals this.method.invoke(this.original, socketChannel); // Add our transformers - MessageToByteEncoder encoder = new ViaEncodeHandler(info, (MessageToByteEncoder) socketChannel.pipeline().get("encoder")); - ByteToMessageDecoder decoder = new ViaDecodeHandler(info, (ByteToMessageDecoder) socketChannel.pipeline().get("decoder")); - ViaPacketHandler chunkHandler = new ViaPacketHandler(info); + ViaEncodeHandler encoder = new ViaEncodeHandler(info, (MinecraftEncoder) socketChannel.pipeline().get("packet-encoder")); + ViaDecodeHandler decoder = new ViaDecodeHandler(info, (MinecraftDecoder) socketChannel.pipeline().get("packet-decoder")); +// ViaPacketHandler chunkHandler = new ViaPacketHandler(info); - socketChannel.pipeline().replace("encoder", "encoder", encoder); - socketChannel.pipeline().replace("decoder", "decoder", decoder); - socketChannel.pipeline().addAfter("packet_handler", "viaversion_packet_handler", chunkHandler); + socketChannel.pipeline().replace("packet-encoder", "packet-encoder", encoder); + socketChannel.pipeline().replace("packet-decoder", "packet-decoder", decoder); +// socketChannel.pipeline().addAfter("packet_handler", "viaversion_packet_handler", chunkHandler); } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java new file mode 100644 index 000000000..0b8934680 --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java @@ -0,0 +1,56 @@ +package us.myles.ViaVersion.bungee.util; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import io.netty.handler.codec.MessageToByteEncoder; +import io.netty.handler.codec.MessageToMessageDecoder; +import net.md_5.bungee.protocol.DefinedPacket; +import net.md_5.bungee.protocol.MinecraftDecoder; +import net.md_5.bungee.protocol.MinecraftEncoder; +import us.myles.ViaVersion.Bungee; +import us.myles.ViaVersion.util.PipelineUtil; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +public class BungeePipelineUtil { + private static Method DECODE_METHOD; + private static Method ENCODE_METHOD; + + static { + try { + DECODE_METHOD = MinecraftDecoder.class.getDeclaredMethod("decode", ChannelHandlerContext.class, ByteBuf.class, List.class); + DECODE_METHOD.setAccessible(true); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + System.out.println("Netty issue?"); + } + try { + ENCODE_METHOD = MinecraftEncoder.class.getDeclaredMethod("encode", ChannelHandlerContext.class, DefinedPacket.class, ByteBuf.class); + ENCODE_METHOD.setAccessible(true); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + System.out.println("Netty issue?"); + } + } + public static List callDecode(MessageToMessageDecoder decoder, ChannelHandlerContext ctx, Object input) throws InvocationTargetException { + List output = new ArrayList<>(); + try { + BungeePipelineUtil.DECODE_METHOD.invoke(decoder, ctx, input, output); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return output; + } + + public static void callEncode(MessageToByteEncoder encoder, ChannelHandlerContext ctx, Object msg, ByteBuf output) throws InvocationTargetException { + try { + BungeePipelineUtil.ENCODE_METHOD.invoke(encoder, ctx, msg, output); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } +} diff --git a/common/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java b/common/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java index f44622297..6febc6c1a 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java +++ b/common/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java @@ -5,6 +5,7 @@ import com.google.common.collect.Maps; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.util.Collection; import java.util.Collections; import java.util.Map; @@ -30,6 +31,10 @@ public class ReflectionUtil { public static void setStatic(Class clazz, String f, Object value) throws NoSuchFieldException, IllegalAccessException { Field field = clazz.getDeclaredField(f); field.setAccessible(true); + // Remove any final stuff + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); field.set(null, value); } From 3411c3d144862d7b62f0b6be9206031432374980 Mon Sep 17 00:00:00 2001 From: Myles Date: Mon, 26 Sep 2016 17:57:36 +0100 Subject: [PATCH 34/76] Add encoder name --- .../java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java | 5 +++++ .../java/us/myles/ViaVersion/bungee/BungeeViaInjector.java | 5 +++++ .../src/main/java/us/myles/ViaVersion/api/PacketWrapper.java | 1 + .../java/us/myles/ViaVersion/api/data/UserConnection.java | 4 ++-- .../java/us/myles/ViaVersion/api/platform/ViaInjector.java | 2 ++ .../java/us/myles/ViaVersion/sponge/SpongeViaInjector.java | 5 +++++ 6 files changed, 20 insertions(+), 2 deletions(-) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java index dd06a2e45..437997e18 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java @@ -173,6 +173,11 @@ public class BukkitViaInjector implements ViaInjector { throw new Exception("Failed to get server"); } + @Override + public String getEncoderName() { + return "encoder"; + } + public static Object getServerConnection() throws Exception { Class serverClazz = NMSUtil.nms("MinecraftServer"); Object server = ReflectionUtil.invokeStatic(serverClazz, "getServer"); diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaInjector.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaInjector.java index 6482cb397..2c9de6455 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaInjector.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaInjector.java @@ -37,4 +37,9 @@ public class BungeeViaInjector implements ViaInjector { public int getServerProtocolVersion() throws Exception { return 47; } + + @Override + public String getEncoderName() { + return "packet-encoder"; + } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java b/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java index 10347f2ce..8322063b5 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java +++ b/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java @@ -460,6 +460,7 @@ public class PacketWrapper { * @throws Exception If it failed to write */ public void sendToServer() throws Exception { + // TODO: Fix for bungee if (!isCancelled()) { ByteBuf output = inputBuffer == null ? Unpooled.buffer() : inputBuffer.alloc().buffer(); Type.VAR_INT.write(output, PacketWrapper.PASSTHROUGH_ID); // Pass through diff --git a/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java b/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java index a4da34d05..9a393af8a 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java +++ b/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java @@ -73,7 +73,7 @@ public class UserConnection { * @param currentThread Should it run in the same thread */ public void sendRawPacket(final ByteBuf packet, boolean currentThread) { - final ChannelHandler handler = channel.pipeline().get("encoder"); + final ChannelHandler handler = channel.pipeline().get(Via.getManager().getInjector().getEncoderName()); if (currentThread) { channel.pipeline().context(handler).writeAndFlush(packet); } else { @@ -93,7 +93,7 @@ public class UserConnection { * @return ChannelFuture of the packet being sent */ public ChannelFuture sendRawPacketFuture(final ByteBuf packet) { - final ChannelHandler handler = channel.pipeline().get("encoder"); + final ChannelHandler handler = channel.pipeline().get(Via.getManager().getInjector().getEncoderName()); return channel.pipeline().context(handler).writeAndFlush(packet); } diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java index 38d5ffc45..0523e9758 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java @@ -6,4 +6,6 @@ public interface ViaInjector { public void uninject() throws Exception; public int getServerProtocolVersion() throws Exception; + + public String getEncoderName(); } diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java index fea7d41ea..7524023b3 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java @@ -132,6 +132,11 @@ public class SpongeViaInjector implements ViaInjector { } } + @Override + public String getEncoderName() { + return "encoder"; + } + public static Object getServerConnection() throws Exception { Class serverClazz = Class.forName("net.minecraft.server.MinecraftServer"); Object server = getServer(); From 8b9a1750de524d790f91e2b3c7ec27b8baa2f117 Mon Sep 17 00:00:00 2001 From: Myles Date: Mon, 26 Sep 2016 20:12:34 +0100 Subject: [PATCH 35/76] Basic Config API for sponge, need to do comments --- TODOLIST | 3 +- .../java/us/myles/ViaVersion/ViaConfig.java | 7 +- .../main/java/us/myles/ViaVersion/Bungee.java | 6 +- ...nfigProvider.java => BungeeConfigAPI.java} | 7 +- .../configuration/ConfigurationProvider.java | 5 + .../commands/defaultsubs/ReloadSubCmd.java | 2 +- .../us/myles/ViaVersion/SpongePlugin.java | 15 +- .../ViaVersion/sponge/SpongeConfigAPI.java | 182 +++++++++++++----- 8 files changed, 173 insertions(+), 54 deletions(-) rename bungee/src/main/java/us/myles/ViaVersion/bungee/config/{BungeeConfigProvider.java => BungeeConfigAPI.java} (95%) diff --git a/TODOLIST b/TODOLIST index d6b06797d..f3b52ace6 100644 --- a/TODOLIST +++ b/TODOLIST @@ -1,8 +1,7 @@ PORT STUFF TO GUAVA :D (so we dont need to include commons) -Test on SpongeForge, only tested SpongeVanilla Stop using new Gson() everywhere Java docs (for platforms etc) -Config implementation for sponge +Add comments to sponge api Port bukkit listeners to sponge maybe Fix task ids, methods for sponge Find all the TODO's and check they're done. \ No newline at end of file diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaConfig.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaConfig.java index d3b30aa63..d63372589 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaConfig.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaConfig.java @@ -13,7 +13,7 @@ public class ViaConfig implements ViaVersionConfig, ConfigurationProvider { public ViaConfig(ViaVersionPlugin plugin) { this.plugin = plugin; - generateConfig(); + reloadConfig(); } public void generateConfig() { @@ -198,6 +198,11 @@ public class ViaConfig implements ViaVersionConfig, ConfigurationProvider { plugin.saveConfig(); } + @Override + public void reloadConfig() { + generateConfig(); + } + @Override public Map getValues() { return plugin.getConfig().getValues(false); diff --git a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java b/bungee/src/main/java/us/myles/ViaVersion/Bungee.java index a5ba702de..71c4af280 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java +++ b/bungee/src/main/java/us/myles/ViaVersion/Bungee.java @@ -17,7 +17,7 @@ import us.myles.ViaVersion.bungee.BungeeViaAPI; import us.myles.ViaVersion.bungee.BungeeViaInjector; import us.myles.ViaVersion.bungee.BungeeViaLoader; import us.myles.ViaVersion.bungee.command.BungeeCommandSender; -import us.myles.ViaVersion.bungee.config.BungeeConfigProvider; +import us.myles.ViaVersion.bungee.config.BungeeConfigAPI; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -25,13 +25,13 @@ import java.util.concurrent.TimeUnit; public class Bungee extends Plugin implements ViaPlatform { private BungeeViaAPI api; - private BungeeConfigProvider config; + private BungeeConfigAPI config; private BungeeCommandHandler commandHandler; @Override public void onLoad() { api = new BungeeViaAPI(); - config = new BungeeConfigProvider(); + config = new BungeeConfigAPI(); commandHandler = new BungeeCommandHandler(); ProxyServer.getInstance().getPluginManager().registerCommand(this, new BungeeCommand(commandHandler)); // Init platform diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/config/BungeeConfigProvider.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/config/BungeeConfigAPI.java similarity index 95% rename from bungee/src/main/java/us/myles/ViaVersion/bungee/config/BungeeConfigProvider.java rename to bungee/src/main/java/us/myles/ViaVersion/bungee/config/BungeeConfigAPI.java index 688d367a7..4b4ca1bfb 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/config/BungeeConfigProvider.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/config/BungeeConfigAPI.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.Map; // TODO implement -public class BungeeConfigProvider implements ViaVersionConfig, ConfigurationProvider { +public class BungeeConfigAPI implements ViaVersionConfig, ConfigurationProvider { @Override public boolean isCheckForUpdates() { return false; @@ -169,6 +169,11 @@ public class BungeeConfigProvider implements ViaVersionConfig, ConfigurationProv } + @Override + public void reloadConfig() { + + } + @Override public Map getValues() { return null; diff --git a/common/src/main/java/us/myles/ViaVersion/api/configuration/ConfigurationProvider.java b/common/src/main/java/us/myles/ViaVersion/api/configuration/ConfigurationProvider.java index 66caaee7b..1566598eb 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/configuration/ConfigurationProvider.java +++ b/common/src/main/java/us/myles/ViaVersion/api/configuration/ConfigurationProvider.java @@ -17,6 +17,11 @@ public interface ConfigurationProvider { */ void saveConfig(); + /** + * Reloads the config + */ + void reloadConfig(); + /** * Get all the configuration values * diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java index 176cfb6f5..8a1bf109c 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java @@ -17,7 +17,7 @@ public class ReloadSubCmd extends ViaSubCommand { @Override public boolean execute(ViaCommandSender sender, String[] args) { - Via.getPlatform().getConfigurationProvider().saveConfig(); + Via.getPlatform().getConfigurationProvider().reloadConfig(); sendMessage(sender, "&6Configuration successfully reloaded! Some features may need a restart."); return true; } diff --git a/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java b/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java index b235d06be..0e4ba8f88 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java +++ b/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java @@ -3,7 +3,11 @@ package us.myles.ViaVersion; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.inject.Inject; +import ninja.leaping.configurate.commented.CommentedConfigurationNode; +import ninja.leaping.configurate.loader.ConfigurationLoader; +import ninja.leaping.configurate.yaml.YAMLConfigurationLoader; import org.spongepowered.api.Game; +import org.spongepowered.api.config.DefaultConfig; import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.game.state.GameAboutToStartServerEvent; @@ -21,6 +25,7 @@ import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.dump.PluginInfo; import us.myles.ViaVersion.sponge.*; +import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -37,13 +42,18 @@ import java.util.logging.Logger; public class SpongePlugin implements ViaPlatform { @Inject private Game game; + @Inject private PluginContainer container; + @Inject + @DefaultConfig(sharedRoot = false) + private File defaultConfig; + + private SpongeViaAPI api = new SpongeViaAPI(); private SpongeExecutorService asyncExecutor; private SpongeExecutorService syncExecutor; - private SpongeConfigAPI conf = new SpongeConfigAPI(this); - private SpongeViaAPI api = new SpongeViaAPI(); + private SpongeConfigAPI conf; private Logger logger; @Listener @@ -51,6 +61,7 @@ public class SpongePlugin implements ViaPlatform { // Setup Logger logger = new LoggerWrapper(container.getLogger()); // Setup Plugin + conf = new SpongeConfigAPI(defaultConfig.getParentFile()); syncExecutor = game.getScheduler().createSyncExecutor(this); asyncExecutor = game.getScheduler().createAsyncExecutor(this); SpongeCommandHandler commandHandler = new SpongeCommandHandler(); diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeConfigAPI.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeConfigAPI.java index df02666e9..d5f85d6fb 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeConfigAPI.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeConfigAPI.java @@ -1,64 +1,70 @@ package us.myles.ViaVersion.sponge; -import us.myles.ViaVersion.SpongePlugin; +import org.yaml.snakeyaml.Yaml; import us.myles.ViaVersion.api.ViaVersionConfig; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.io.*; +import java.net.URL; +import java.util.*; -public class SpongeConfigAPI implements ViaVersionConfig, ConfigurationProvider{ - private final SpongePlugin spongePlugin; +public class SpongeConfigAPI implements ViaVersionConfig, ConfigurationProvider { + private final File defaultConfig; + private Map config; + private ThreadLocal yaml = new ThreadLocal() { + @Override + protected Yaml initialValue() { + return new Yaml(); + } + }; - public SpongeConfigAPI(SpongePlugin spongePlugin) { - this.spongePlugin = spongePlugin; + public SpongeConfigAPI(File defaultConfig) { + this.defaultConfig = defaultConfig; + reloadConfig(); } - @Override public boolean isCheckForUpdates() { - return false; + return getBoolean("checkforupdates", true); } @Override public boolean isPreventCollision() { - return false; + return getBoolean("prevent-collision", true); } @Override public boolean isNewEffectIndicator() { - return false; + return getBoolean("use-new-effect-indicator", true); } @Override public boolean isShowNewDeathMessages() { - return false; + return getBoolean("use-new-deathmessages", false); } @Override public boolean isSuppressMetadataErrors() { - return false; + return getBoolean("suppress-metadata-errors", false); } @Override public boolean isShieldBlocking() { - return false; + return getBoolean("shield-blocking", true); } @Override public boolean isHologramPatch() { - return false; + return getBoolean("hologram-patch", false); } @Override public boolean isBossbarPatch() { - return false; + return getBoolean("bossbar-patch", true); } @Override public boolean isBossbarAntiflicker() { - return false; + return getBoolean("bossbar-anti-flicker", false); } @Override @@ -68,12 +74,7 @@ public class SpongeConfigAPI implements ViaVersionConfig, ConfigurationProvider{ @Override public double getHologramYOffset() { - return 0; - } - - @Override - public boolean isAutoTeam() { - return false; + return getDouble("hologram-y", -0.96D); } @Override @@ -83,101 +84,194 @@ public class SpongeConfigAPI implements ViaVersionConfig, ConfigurationProvider{ @Override public int getMaxPPS() { - return 0; + return getInt("max-pps", 140); } @Override public String getMaxPPSKickMessage() { - return null; + return getString("max-pps-kick-msg", "Sending packets too fast? lag?"); } @Override public int getTrackingPeriod() { - return 0; + return getInt("tracking-period", 6); } @Override public int getWarningPPS() { - return 0; + return getInt("tracking-warning-pps", 120); } @Override public int getMaxWarnings() { - return 0; + return getInt("tracking-max-warnings", 3); } @Override public String getMaxWarningsKickMessage() { - return null; + return getString("tracking-max-kick-msg", "You are sending too many packets, :("); } @Override public boolean isAntiXRay() { - return false; + return getBoolean("anti-xray-patch", true); } @Override public boolean isSendSupportedVersions() { - return false; + return getBoolean("send-supported-versions", false); } @Override public boolean isStimulatePlayerTick() { - return false; + return getBoolean("simulate-pt", true); } @Override public boolean isItemCache() { - return false; + return getBoolean("item-cache", true); } @Override public boolean isNMSPlayerTicking() { - return false; + return getBoolean("nms-player-ticking", true); } @Override public boolean isReplacePistons() { - return false; + return getBoolean("replace-pistons", false); } @Override public int getPistonReplacementId() { - return 0; + return getInt("replacement-piston-id", 0); + } + + public boolean isAutoTeam() { + // Collision has to be enabled first + return isPreventCollision() && getBoolean("auto-team", true); } @Override public boolean isForceJsonTransform() { - return false; + return getBoolean("force-json-transform", false); } @Override public List getBlockedProtocols() { - return Arrays.asList(0); + return getIntegerList("block-protocols"); } @Override public String getBlockedDisconnectMsg() { - return "Boop"; + return getString("block-disconnect-msg", "You are using an unsupported Minecraft version!"); } @Override public String getReloadDisconnectMsg() { - return "Beep"; + return getString("reload-disconnect-msg", "Server reload, please rejoin!"); } @Override public void set(String path, Object value) { - + config.put(path, value); } @Override public void saveConfig() { + if (!defaultConfig.isDirectory()) { + defaultConfig.mkdir(); + } + File config = new File(defaultConfig, "config.yml"); + try (FileWriter fw = new FileWriter(config)) { + yaml.get().dump(this.config, fw); + } catch (IOException e) { + e.printStackTrace(); + } + } + @Override + public void reloadConfig() { + if (!defaultConfig.isDirectory()) { + defaultConfig.mkdir(); + } + File config = new File(defaultConfig, "config.yml"); + URL jarConfigFile = this.getClass().getClassLoader().getResource("config.yml"); + this.config = null; + if (config.exists()) { + try (FileInputStream input = new FileInputStream(config)) { + this.config = (Map) yaml.get().load(input); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (this.config == null) { + this.config = new HashMap<>(); + } + Map defaults; + try (InputStream stream = jarConfigFile.openStream()) { + defaults = (Map) yaml.get().load(stream); + } catch (IOException e) { + e.printStackTrace(); + return; + } + // Merge with defaultLoader + for (Object key : this.config.keySet()) { + // Set option in new conf if exists + if (defaults.containsKey(key)) { + defaults.put(key, this.config.get(key)); + } + } + this.config = defaults; + // Save + saveConfig(); + + } + + public boolean getBoolean(String key, boolean def) { + if (this.config.containsKey(key)) { + return (boolean) this.config.get(key); + } else { + return def; + } + } + + public String getString(String key, String def) { + if (this.config.containsKey(key)) { + return (String) this.config.get(key); + } else { + return def; + } + } + + public int getInt(String key, int def) { + if (this.config.containsKey(key)) { + return (int) this.config.get(key); + } else { + return def; + } + } + + public double getDouble(String key, double def) { + if (this.config.containsKey(key)) { + return (double) this.config.get(key); + } else { + return def; + } + } + + public List getIntegerList(String key) { + if (this.config.containsKey(key)) { + return (List) this.config.get(key); + } else { + return new ArrayList<>(); + } } @Override public Map getValues() { - return new HashMap<>(); + return (Map) ((Map) this.config); } } From 51c469882b64645fa8e93660c5a899293cb1ef50 Mon Sep 17 00:00:00 2001 From: Matsv Date: Mon, 26 Sep 2016 22:30:59 +0200 Subject: [PATCH 36/76] Port Bukkit listeners to Sponge --- TODOLIST | 1 - .../us/myles/ViaVersion/ViaVersionPlugin.java | 1 - .../bukkit/BukkitViaMovementTransmitter.java | 1 - .../classgenerator/ClassGenerator.java | 1 - .../listeners/ViaBukkitListener.java | 53 ++++++ .../protocol1_9to1_8/ArmorListener.java | 7 +- .../protocol1_9to1_8/BlockListener.java | 4 +- .../CommandBlockListener.java | 4 +- .../protocol1_9to1_8/DeathListener.java | 8 +- .../protocol1_9to1_8/PaperPatch.java | 4 +- .../main/java/us/myles/ViaVersion/Bungee.java | 4 +- .../ViaVersion/bungee/BungeeViaInjector.java | 1 + .../bungee/handlers/ViaDecodeHandler.java | 2 - .../bungee/handlers/ViaEncodeHandler.java | 1 - .../handlers/ViaVersionInitializer.java | 3 - .../bungee/util/BungeePipelineUtil.java | 4 +- .../us/myles/ViaVersion/api/ViaListener.java | 41 +---- .../protocols/protocol1_9to1_8/ArmorType.java | 62 +++---- sponge/pom.xml | 2 +- .../us/myles/ViaVersion/SpongePlugin.java | 4 - .../sponge/SpongeCommandSender.java | 1 - .../ViaVersion/sponge/SpongeConfigAPI.java | 5 +- .../myles/ViaVersion/sponge/SpongeViaAPI.java | 2 - .../ViaVersion/sponge/SpongeViaInjector.java | 2 +- .../ViaVersion/sponge/SpongeViaLoader.java | 18 +- .../sponge/handlers/ViaDecodeHandler.java | 1 - .../sponge/handlers/ViaEncodeHandler.java | 2 - .../sponge/listeners/ViaSpongeListener.java | 49 ++++++ .../protocol1_9to1_8/ArmorListener.java | 114 +++++++++++++ .../protocol1_9to1_8/BlockListener.java | 29 ++++ .../CommandBlockListener.java | 156 ++++++++++++++++++ .../protocol1_9to1_8/DeathListener.java | 65 ++++++++ 32 files changed, 538 insertions(+), 114 deletions(-) create mode 100644 bukkit/src/main/java/us/myles/ViaVersion/listeners/ViaBukkitListener.java rename {bukkit => common}/src/main/java/us/myles/ViaVersion/api/ViaListener.java (51%) create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/ViaSpongeListener.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/ArmorListener.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/BlockListener.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/CommandBlockListener.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/DeathListener.java diff --git a/TODOLIST b/TODOLIST index f3b52ace6..6f03b3481 100644 --- a/TODOLIST +++ b/TODOLIST @@ -2,6 +2,5 @@ PORT STUFF TO GUAVA :D (so we dont need to include commons) Stop using new Gson() everywhere Java docs (for platforms etc) Add comments to sponge api -Port bukkit listeners to sponge maybe Fix task ids, methods for sponge Find all the TODO's and check they're done. \ No newline at end of file diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 75a5aea71..51389604e 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -18,7 +18,6 @@ import us.myles.ViaVersion.bukkit.*; import us.myles.ViaVersion.classgenerator.ClassGenerator; import us.myles.ViaVersion.dump.PluginInfo; import us.myles.ViaVersion.util.NMSUtil; -import us.myles.ViaVersion.util.ReflectionUtil; import java.util.ArrayList; import java.util.List; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaMovementTransmitter.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaMovementTransmitter.java index 316783853..f5da163d5 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaMovementTransmitter.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaMovementTransmitter.java @@ -8,7 +8,6 @@ import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.MovementTracker; import us.myles.ViaVersion.util.NMSUtil; -import us.myles.ViaVersion.util.ReflectionUtil; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/classgenerator/ClassGenerator.java b/bukkit/src/main/java/us/myles/ViaVersion/classgenerator/ClassGenerator.java index f9daaa86f..310390da5 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/classgenerator/ClassGenerator.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/classgenerator/ClassGenerator.java @@ -9,7 +9,6 @@ import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.handlers.ViaDecodeHandler; import us.myles.ViaVersion.handlers.ViaEncodeHandler; import us.myles.ViaVersion.util.NMSUtil; -import us.myles.ViaVersion.util.ReflectionUtil; public class ClassGenerator { private static HandlerConstructor constructor = new BasicHandlerConstructor(); diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/ViaBukkitListener.java b/bukkit/src/main/java/us/myles/ViaVersion/listeners/ViaBukkitListener.java new file mode 100644 index 000000000..f76f31b71 --- /dev/null +++ b/bukkit/src/main/java/us/myles/ViaVersion/listeners/ViaBukkitListener.java @@ -0,0 +1,53 @@ +package us.myles.ViaVersion.listeners; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NonNull; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.plugin.Plugin; +import us.myles.ViaVersion.ViaVersionPlugin; +import us.myles.ViaVersion.api.ViaListener; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.protocol.Protocol; + +@Getter(AccessLevel.PROTECTED) +public class ViaBukkitListener extends ViaListener implements Listener { + private final Plugin plugin; + + public ViaBukkitListener(ViaVersionPlugin plugin, Class requiredPipeline) { + super(requiredPipeline); + this.plugin = plugin; + } + + /** + * Get the UserConnection from a player + * + * @param player Player object + * @return The UserConnection + */ + protected UserConnection getUserConnection(@NonNull Player player) { + return getUserConnection(player.getUniqueId()); + } + + /** + * Checks if the player is on the selected pipe + * + * @param player Player Object + * @return True if on pipe + */ + protected boolean isOnPipe(Player player) { + return isOnPipe(player.getUniqueId()); + } + + /** + * Register as Bukkit event + */ + @Override + public void register() { + if (isRegistered()) return; + + plugin.getServer().getPluginManager().registerEvents(this, plugin); + setRegistered(true); + } +} diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/ArmorListener.java b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/ArmorListener.java index 38f8a5dad..1d55fa8d8 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/ArmorListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/ArmorListener.java @@ -15,14 +15,15 @@ import org.bukkit.inventory.CraftingInventory; import org.bukkit.inventory.ItemStack; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.PacketWrapper; -import us.myles.ViaVersion.api.ViaListener; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.listeners.ViaBukkitListener; import us.myles.ViaVersion.protocols.protocol1_9to1_8.ArmorType; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; import java.util.UUID; -public class ArmorListener extends ViaListener { +public class ArmorListener extends ViaBukkitListener { private static final UUID ARMOR_ATTRIBUTE = UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150"); @@ -107,7 +108,7 @@ public class ArmorListener extends ViaListener { public void sendDelayedArmorUpdate(final Player player) { if (!isOnPipe(player)) return; // Don't start a task if the player is not on the pipe - Bukkit.getScheduler().scheduleSyncDelayedTask(getPlugin(), new Runnable() { + Via.getPlatform().runSync(new Runnable() { @Override public void run() { sendArmorUpdate(player); diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/BlockListener.java b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/BlockListener.java index 1c4319021..964bad178 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/BlockListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/BlockListener.java @@ -5,12 +5,12 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockPlaceEvent; import us.myles.ViaVersion.ViaVersionPlugin; -import us.myles.ViaVersion.api.ViaListener; import us.myles.ViaVersion.api.minecraft.Position; +import us.myles.ViaVersion.listeners.ViaBukkitListener; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.EntityTracker; -public class BlockListener extends ViaListener { +public class BlockListener extends ViaBukkitListener { public BlockListener(ViaVersionPlugin plugin) { super(plugin, Protocol1_9TO1_8.class); diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/CommandBlockListener.java b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/CommandBlockListener.java index 43b49b392..b12a99f7e 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/CommandBlockListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/CommandBlockListener.java @@ -18,10 +18,10 @@ import org.spacehq.opennbt.tag.builtin.ByteTag; import org.spacehq.opennbt.tag.builtin.CompoundTag; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.PacketWrapper; -import us.myles.ViaVersion.api.ViaListener; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.minecraft.Position; import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.listeners.ViaBukkitListener; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; import us.myles.ViaVersion.util.NMSUtil; import us.myles.ViaVersion.util.ReflectionUtil; @@ -30,7 +30,7 @@ import java.io.DataOutput; import java.io.DataOutputStream; import java.lang.reflect.Method; -public class CommandBlockListener extends ViaListener { +public class CommandBlockListener extends ViaBukkitListener { public CommandBlockListener(ViaVersionPlugin plugin) { super(plugin, Protocol1_9TO1_8.class); diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/DeathListener.java b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/DeathListener.java index 07760f598..9cb82857e 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/DeathListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/DeathListener.java @@ -1,6 +1,5 @@ package us.myles.ViaVersion.listeners.protocol1_9to1_8; -import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -8,12 +7,13 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.entity.PlayerDeathEvent; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.PacketWrapper; -import us.myles.ViaVersion.api.ViaListener; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.listeners.ViaBukkitListener; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; -public class DeathListener extends ViaListener { +public class DeathListener extends ViaBukkitListener { public DeathListener(ViaVersionPlugin plugin) { super(plugin, Protocol1_9TO1_8.class); } @@ -34,7 +34,7 @@ public class DeathListener extends ViaListener { } private void sendPacket(final Player p, final String msg) { - Bukkit.getScheduler().runTask(getPlugin(), new Runnable() { + Via.getPlatform().runSync(new Runnable() { @Override public void run() { PacketWrapper wrapper = new PacketWrapper(0x2C, null, getUserConnection(p)); diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/PaperPatch.java b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/PaperPatch.java index 5a1e36371..38e24701e 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/PaperPatch.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/PaperPatch.java @@ -6,10 +6,10 @@ import org.bukkit.block.BlockFace; import org.bukkit.event.EventHandler; import org.bukkit.event.block.BlockPlaceEvent; import us.myles.ViaVersion.ViaVersionPlugin; -import us.myles.ViaVersion.api.ViaListener; +import us.myles.ViaVersion.listeners.ViaBukkitListener; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; -public class PaperPatch extends ViaListener { +public class PaperPatch extends ViaBukkitListener { public PaperPatch(ViaVersionPlugin plugin) { super(plugin, Protocol1_9TO1_8.class); diff --git a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java b/bungee/src/main/java/us/myles/ViaVersion/Bungee.java index 71c4af280..f3a0c5e3c 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java +++ b/bungee/src/main/java/us/myles/ViaVersion/Bungee.java @@ -11,11 +11,11 @@ import us.myles.ViaVersion.api.ViaVersionConfig; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import us.myles.ViaVersion.api.platform.ViaPlatform; -import us.myles.ViaVersion.bungee.command.BungeeCommand; -import us.myles.ViaVersion.bungee.command.BungeeCommandHandler; import us.myles.ViaVersion.bungee.BungeeViaAPI; import us.myles.ViaVersion.bungee.BungeeViaInjector; import us.myles.ViaVersion.bungee.BungeeViaLoader; +import us.myles.ViaVersion.bungee.command.BungeeCommand; +import us.myles.ViaVersion.bungee.command.BungeeCommandHandler; import us.myles.ViaVersion.bungee.command.BungeeCommandSender; import us.myles.ViaVersion.bungee.config.BungeeConfigAPI; diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaInjector.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaInjector.java index 2c9de6455..8b3f04d3c 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaInjector.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaInjector.java @@ -26,6 +26,7 @@ public class BungeeViaInjector implements ViaInjector { throw e; } } + @Override public void uninject() { // TODO: Uninject from players currently online diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaDecodeHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaDecodeHandler.java index cb7073118..cde90c1ec 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaDecodeHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaDecodeHandler.java @@ -2,8 +2,6 @@ package us.myles.ViaVersion.bungee.handlers; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToMessageDecoder; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.protocol.MinecraftDecoder; import net.md_5.bungee.protocol.Protocol; diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaEncodeHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaEncodeHandler.java index b6cdb8767..dbe0b01e3 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaEncodeHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaEncodeHandler.java @@ -2,7 +2,6 @@ package us.myles.ViaVersion.bungee.handlers; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToByteEncoder; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.protocol.DefinedPacket; import net.md_5.bungee.protocol.MinecraftEncoder; diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaVersionInitializer.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaVersionInitializer.java index bf1be261f..e15899e4c 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaVersionInitializer.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaVersionInitializer.java @@ -3,9 +3,6 @@ package us.myles.ViaVersion.bungee.handlers; import io.netty.channel.Channel; import io.netty.channel.ChannelInitializer; import io.netty.channel.socket.SocketChannel; -import io.netty.handler.codec.ByteToMessageDecoder; -import io.netty.handler.codec.MessageToByteEncoder; -import io.netty.handler.codec.MessageToMessageDecoder; import net.md_5.bungee.protocol.MinecraftDecoder; import net.md_5.bungee.protocol.MinecraftEncoder; import us.myles.ViaVersion.api.data.UserConnection; diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java index 0b8934680..f6f3aa22e 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java @@ -2,14 +2,11 @@ package us.myles.ViaVersion.bungee.util; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; import io.netty.handler.codec.MessageToByteEncoder; import io.netty.handler.codec.MessageToMessageDecoder; import net.md_5.bungee.protocol.DefinedPacket; import net.md_5.bungee.protocol.MinecraftDecoder; import net.md_5.bungee.protocol.MinecraftEncoder; -import us.myles.ViaVersion.Bungee; -import us.myles.ViaVersion.util.PipelineUtil; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -36,6 +33,7 @@ public class BungeePipelineUtil { System.out.println("Netty issue?"); } } + public static List callDecode(MessageToMessageDecoder decoder, ChannelHandlerContext ctx, Object input) throws InvocationTargetException { List output = new ArrayList<>(); try { diff --git a/bukkit/src/main/java/us/myles/ViaVersion/api/ViaListener.java b/common/src/main/java/us/myles/ViaVersion/api/ViaListener.java similarity index 51% rename from bukkit/src/main/java/us/myles/ViaVersion/api/ViaListener.java rename to common/src/main/java/us/myles/ViaVersion/api/ViaListener.java index e7953a31a..8b661ce5d 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/api/ViaListener.java +++ b/common/src/main/java/us/myles/ViaVersion/api/ViaListener.java @@ -1,12 +1,6 @@ package us.myles.ViaVersion.api; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import org.bukkit.entity.Player; -import org.bukkit.event.Listener; -import us.myles.ViaVersion.ViaVersionPlugin; +import lombok.*; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.protocols.base.ProtocolInfo; @@ -14,22 +8,12 @@ import us.myles.ViaVersion.protocols.base.ProtocolInfo; import java.util.UUID; @Getter(AccessLevel.PROTECTED) +@Setter(AccessLevel.PROTECTED) @RequiredArgsConstructor -public abstract class ViaListener implements Listener { - private final ViaVersionPlugin plugin; +public abstract class ViaListener { private final Class requiredPipeline; private boolean registered = false; - /** - * Get the UserConnection from a player - * - * @param player Player object - * @return The UserConnection - */ - protected UserConnection getUserConnection(@NonNull Player player) { - return getUserConnection(player.getUniqueId()); - } - /** * Get the UserConnection from an UUID * @@ -41,16 +25,6 @@ public abstract class ViaListener implements Listener { return Via.getManager().getConnection(uuid); } - /** - * Checks if the player is on the selected pipe - * - * @param player Player Object - * @return True if on pipe - */ - protected boolean isOnPipe(Player player) { - return isOnPipe(player.getUniqueId()); - } - /** * Checks if the UUID is on the selected pipe * @@ -64,12 +38,7 @@ public abstract class ViaListener implements Listener { } /** - * Register as Bukkit event + * Register the event */ - public void register() { - if (registered) return; - - plugin.getServer().getPluginManager().registerEvents(this, plugin); - registered = true; - } + public abstract void register(); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java index a9cd642cc..b99a8e433 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java @@ -9,27 +9,27 @@ import java.util.HashMap; @Getter public enum ArmorType { - LEATHER_HELMET(1, 298), - LEATHER_CHESTPLATE(3, 299), - LEATHER_LEGGINGS(2, 300), - LEATHER_BOOTS(1, 301), - CHAINMAIL_HELMET(2, 302), - CHAINMAIL_CHESTPLATE(5, 303), - CHAINMAIL_LEGGINGS(4, 304), - CHAINMAIL_BOOTS(1, 305), - IRON_HELMET(2, 306), - IRON_CHESTPLATE(6, 307), - IRON_LEGGINGS(5, 308), - IRON_BOOTS(2, 309), - DIAMOND_HELMET(3, 310), - DIAMOND_CHESTPLATE(8, 311), - DIAMOND_LEGGINGS(6, 312), - DIAMOND_BOOTS(3, 313), - GOLD_HELMET(2, 314), - GOLD_CHESTPLATE(5, 315), - GOLD_LEGGINGS(3, 316), - GOLD_BOOTS(1, 317), - NONE(0, 0); + LEATHER_HELMET(1, 298, "minecraft:leather_helmet"), + LEATHER_CHESTPLATE(3, 299, "minecraft:leather_chestplate"), + LEATHER_LEGGINGS(2, 300, "minecraft:leather_leggings"), + LEATHER_BOOTS(1, 301, "minecraft:leather_boots"), + CHAINMAIL_HELMET(2, 302, "minecraft:chainmail_helmet"), + CHAINMAIL_CHESTPLATE(5, 303, "minecraft:chainmail_chestplate"), + CHAINMAIL_LEGGINGS(4, 304, "minecraft:chainmail_leggings"), + CHAINMAIL_BOOTS(1, 305, "minecraft:chainmail_boots"), + IRON_HELMET(2, 306, "minecraft:iron_helmet"), + IRON_CHESTPLATE(6, 307, "minecraft:iron_chestplate"), + IRON_LEGGINGS(5, 308, "minecraft:iron_leggings"), + IRON_BOOTS(2, 309, "minecraft:iron_boots"), + DIAMOND_HELMET(3, 310, "minecraft:diamond_helmet"), + DIAMOND_CHESTPLATE(8, 311, "minecraft:diamond_chestplate"), + DIAMOND_LEGGINGS(6, 312, "minecraft:diamond_leggings"), + DIAMOND_BOOTS(3, 313, "minecraft:diamond_boots"), + GOLD_HELMET(2, 314, "minecraft:gold_helmet"), + GOLD_CHESTPLATE(5, 315, "minecraft:gold_chestplate"), + GOLD_LEGGINGS(3, 316, "minecraft:gold_leggings"), + GOLD_BOOTS(1, 317, "minecraft:gold_boots"), + NONE(0, 0, "none"); private static HashMap armor; @@ -42,6 +42,7 @@ public enum ArmorType { private final int armorPoints; private final int id; + private final String type; public static ArmorType findById(int id) { for (ArmorType a : ArmorType.values()) @@ -50,6 +51,13 @@ public enum ArmorType { return ArmorType.NONE; } + public static ArmorType findByType(String type) { + for (ArmorType a : ArmorType.values()) + if (a.getType().equals(type)) + return a; + return NONE; + } + public static boolean isArmor(int id) { for (ArmorType a : ArmorType.values()) if (a.getId() == id) @@ -57,13 +65,11 @@ public enum ArmorType { return false; } - public static int calculateArmorPoints(int[] armor) { - int total = 0; - for (int anArmor : armor) { - if (anArmor != -1) - total += findById(anArmor).getArmorPoints(); - } - return total; + public static boolean isArmor(String type) { + for (ArmorType a : ArmorType.values()) + if (a.getType().equals(type)) + return true; + return false; } public int getId() { diff --git a/sponge/pom.xml b/sponge/pom.xml index 115e29b0f..fb41d0443 100644 --- a/sponge/pom.xml +++ b/sponge/pom.xml @@ -64,7 +64,7 @@ org.spongepowered spongeapi - 4.1.0 + LATEST provided diff --git a/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java b/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java index 0e4ba8f88..11854ee83 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java +++ b/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java @@ -3,15 +3,11 @@ package us.myles.ViaVersion; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.inject.Inject; -import ninja.leaping.configurate.commented.CommentedConfigurationNode; -import ninja.leaping.configurate.loader.ConfigurationLoader; -import ninja.leaping.configurate.yaml.YAMLConfigurationLoader; import org.spongepowered.api.Game; import org.spongepowered.api.config.DefaultConfig; import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.game.state.GameAboutToStartServerEvent; -import org.spongepowered.api.event.game.state.GameStartedServerEvent; import org.spongepowered.api.plugin.Plugin; import org.spongepowered.api.plugin.PluginContainer; import org.spongepowered.api.scheduler.SpongeExecutorService; diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeCommandSender.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeCommandSender.java index b4c29a260..68e66cb37 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeCommandSender.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeCommandSender.java @@ -3,7 +3,6 @@ package us.myles.ViaVersion.sponge; import lombok.AllArgsConstructor; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.entity.living.player.Player; -import org.spongepowered.api.text.serializer.TextSerializer; import org.spongepowered.api.text.serializer.TextSerializers; import us.myles.ViaVersion.api.command.ViaCommandSender; diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeConfigAPI.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeConfigAPI.java index d5f85d6fb..e94282226 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeConfigAPI.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeConfigAPI.java @@ -6,7 +6,10 @@ import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import java.io.*; import java.net.URL; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public class SpongeConfigAPI implements ViaVersionConfig, ConfigurationProvider { private final File defaultConfig; diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaAPI.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaAPI.java index f0628a7f1..769081be2 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaAPI.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaAPI.java @@ -1,10 +1,8 @@ package us.myles.ViaVersion.sponge; import io.netty.buffer.ByteBuf; -import lombok.AllArgsConstructor; import lombok.NonNull; import org.spongepowered.api.entity.living.player.Player; -import us.myles.ViaVersion.SpongePlugin; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaAPI; import us.myles.ViaVersion.api.boss.BossBar; diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java index 7524023b3..cfedde3a3 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java @@ -10,8 +10,8 @@ import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaInjector; import us.myles.ViaVersion.sponge.handlers.ViaVersionInitializer; -import us.myles.ViaVersion.util.ReflectionUtil; import us.myles.ViaVersion.util.ListWrapper; +import us.myles.ViaVersion.util.ReflectionUtil; import java.lang.reflect.Field; import java.lang.reflect.Method; diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaLoader.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaLoader.java index b11eb5948..deb5e97de 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaLoader.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaLoader.java @@ -9,6 +9,10 @@ import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTransla import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; import us.myles.ViaVersion.sponge.listeners.ClientLeaveListener; import us.myles.ViaVersion.sponge.listeners.UpdateListener; +import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.ArmorListener; +import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.BlockListener; +import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.CommandBlockListener; +import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.DeathListener; import us.myles.ViaVersion.sponge.providers.SpongeViaBulkChunkTranslator; import us.myles.ViaVersion.sponge.providers.SpongeViaMovementTransmitter; @@ -25,15 +29,11 @@ public class SpongeViaLoader implements ViaPlatformLoader { Sponge.getEventManager().registerListeners(plugin, new ClientLeaveListener()); // /* 1.9 client to 1.8 server */ // -// new ArmorListener(plugin).register(); -// new CommandBlockListener(plugin).register(); -// new DeathListener(plugin).register(); -// new BlockListener(plugin).register(); -// -// if (Bukkit.getVersion().toLowerCase().contains("paper") || Bukkit.getVersion().toLowerCase().contains("taco")) { -// plugin.getLogger().info("Enabling PaperSpigot/TacoSpigot patch: Fixes block placement."); -// new PaperPatch(plugin).register(); -// } + new ArmorListener(plugin).register(); + new CommandBlockListener(plugin).register(); + new DeathListener(plugin).register(); + new BlockListener(plugin).register(); + // if (plugin.getConf().isItemCache()) { // new HandItemCache().runTaskTimerAsynchronously(plugin, 2L, 2L); // Updates player's items :) // HandItemCache.CACHE = true; diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaDecodeHandler.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaDecodeHandler.java index bd42d7f60..943d87094 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaDecodeHandler.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaDecodeHandler.java @@ -4,7 +4,6 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ByteToMessageDecoder; import us.myles.ViaVersion.api.PacketWrapper; -import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.exception.CancelException; diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaEncodeHandler.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaEncodeHandler.java index ce6faef49..06e51f05f 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaEncodeHandler.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaEncodeHandler.java @@ -4,7 +4,6 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; import us.myles.ViaVersion.api.PacketWrapper; -import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.exception.CancelException; @@ -12,7 +11,6 @@ import us.myles.ViaVersion.packets.Direction; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.util.PipelineUtil; -import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; public class ViaEncodeHandler extends MessageToByteEncoder { diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/ViaSpongeListener.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/ViaSpongeListener.java new file mode 100644 index 000000000..b000b7ee0 --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/ViaSpongeListener.java @@ -0,0 +1,49 @@ +package us.myles.ViaVersion.sponge.listeners; + +import lombok.Getter; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.entity.living.player.Player; +import us.myles.ViaVersion.SpongePlugin; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.ViaListener; +import us.myles.ViaVersion.api.protocol.Protocol; + +import java.lang.reflect.Field; + +public class ViaSpongeListener extends ViaListener { + private static Field entityIdField; + + @Getter + private final SpongePlugin plugin; + + public ViaSpongeListener(SpongePlugin plugin, Class requiredPipeline) { + super(requiredPipeline); + this.plugin = plugin; + } + + @Override + public void register() { + if (isRegistered()) return; + + Sponge.getEventManager().registerListeners(plugin, this); + setRegistered(true); + } + + // Hey sponge, please create a getEntityId method :'( + protected int getEntityId(Player p) { + try { + if (entityIdField == null) { + entityIdField = p.getClass().getSuperclass().getSuperclass().getSuperclass().getDeclaredField("field_145783_c"); + entityIdField.setAccessible(true); + } + + return entityIdField.getInt(p); + } catch (Exception e) { + Via.getPlatform().getLogger().severe("Could not get the entity id, please report this on our Github"); + e.printStackTrace(); + } + + Via.getPlatform().getLogger().severe("Could not get the entity id, please report this on our Github"); + return -1; + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/ArmorListener.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/ArmorListener.java new file mode 100644 index 000000000..5c8924e00 --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/ArmorListener.java @@ -0,0 +1,114 @@ +package us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8; + +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.action.InteractEvent; +import org.spongepowered.api.event.entity.living.humanoid.player.RespawnPlayerEvent; +import org.spongepowered.api.event.filter.cause.Root; +import org.spongepowered.api.event.item.inventory.ClickInventoryEvent; +import org.spongepowered.api.event.network.ClientConnectionEvent; +import org.spongepowered.api.item.inventory.ItemStack; +import org.spongepowered.api.item.inventory.transaction.SlotTransaction; +import us.myles.ViaVersion.SpongePlugin; +import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.ArmorType; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; +import us.myles.ViaVersion.sponge.listeners.ViaSpongeListener; + +import java.util.Optional; +import java.util.UUID; + +public class ArmorListener extends ViaSpongeListener { + private static final UUID ARMOR_ATTRIBUTE = UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150"); + + public ArmorListener(SpongePlugin plugin) { + super(plugin, Protocol1_9TO1_8.class); + } + + // + public void sendArmorUpdate(Player player) { + // Ensure that the player is on our pipe + if (!isOnPipe(player.getUniqueId())) return; + + + int armor = 0; + + // TODO is there a method like getArmorContents? + armor += calculate(player.getHelmet()); + armor += calculate(player.getChestplate()); + armor += calculate(player.getLeggings()); + armor += calculate(player.getBoots()); + + PacketWrapper wrapper = new PacketWrapper(0x4B, null, getUserConnection(player.getUniqueId())); + try { + wrapper.write(Type.VAR_INT, getEntityId(player)); // Player ID + wrapper.write(Type.INT, 1); // only 1 property + wrapper.write(Type.STRING, "generic.armor"); + wrapper.write(Type.DOUBLE, 0D); //default 0 armor + wrapper.write(Type.VAR_INT, 1); // 1 modifier + wrapper.write(Type.UUID, ARMOR_ATTRIBUTE); // armor modifier uuid + wrapper.write(Type.DOUBLE, (double) armor); // the modifier value + wrapper.write(Type.BYTE, (byte) 0);// the modifier operation, 0 is add number + + wrapper.send(Protocol1_9TO1_8.class); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private int calculate(Optional itemStack) { + if (itemStack.isPresent()) + return ArmorType.findByType(itemStack.get().getItem().getType().getId()).getArmorPoints(); + + return 0; + } + + @Listener + public void onInventoryClick(ClickInventoryEvent e, @Root Player player) { + for (SlotTransaction transaction : e.getTransactions()) { + if (ArmorType.isArmor(transaction.getFinal().getType().getId()) || + ArmorType.isArmor(e.getCursorTransaction().getFinal().getType().getId())) { + sendDelayedArmorUpdate(player); + break; + } + } + } + + @Listener + public void onInteract(InteractEvent event, @Root Player player) { + if (player.getItemInHand().isPresent()) { + if (ArmorType.isArmor(player.getItemInHand().get().getItem().getId())) + sendDelayedArmorUpdate(player); + } + } + + @Listener + public void onJoin(ClientConnectionEvent.Join e) { + sendArmorUpdate(e.getTargetEntity()); + } + + @Listener + public void onRespawn(RespawnPlayerEvent e) { + if (!isOnPipe(e.getTargetEntity().getUniqueId())) return; + + sendDelayedArmorUpdate(e.getTargetEntity()); + } + + // TODO find world change event +// @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) +// public void onWorldChange(PlayerChangedWorldEvent e) { +// sendArmorUpdate(e.getPlayer()); +// } +// + public void sendDelayedArmorUpdate(final Player player) { + if (!isOnPipe(player.getUniqueId())) return; // Don't start a task if the player is not on the pipe + Via.getPlatform().runSync(new Runnable() { + @Override + public void run() { + sendArmorUpdate(player); + } + }); + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/BlockListener.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/BlockListener.java new file mode 100644 index 000000000..5019e32d4 --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/BlockListener.java @@ -0,0 +1,29 @@ +package us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8; + +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.block.ChangeBlockEvent; +import org.spongepowered.api.event.filter.cause.Root; +import org.spongepowered.api.world.Location; +import us.myles.ViaVersion.SpongePlugin; +import us.myles.ViaVersion.api.minecraft.Position; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.EntityTracker; +import us.myles.ViaVersion.sponge.listeners.ViaSpongeListener; + +public class BlockListener extends ViaSpongeListener { + + public BlockListener(SpongePlugin plugin) { + super(plugin, Protocol1_9TO1_8.class); + } + + @Listener // TODO is there better way to do this? + public void placeBlock(ChangeBlockEvent.Place e, @Root Player player) { + if (isOnPipe(player.getUniqueId())) { + Location loc = e.getTransactions().get(0).getFinal().getLocation().get(); + getUserConnection(player.getUniqueId()) + .get(EntityTracker.class) + .addBlockInteraction(new Position((long) loc.getX(), (long) loc.getY(), (long) loc.getZ())); + } + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/CommandBlockListener.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/CommandBlockListener.java new file mode 100644 index 000000000..610385503 --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/CommandBlockListener.java @@ -0,0 +1,156 @@ +package us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufOutputStream; +import io.netty.buffer.Unpooled; +import org.spacehq.opennbt.tag.builtin.ByteTag; +import org.spacehq.opennbt.tag.builtin.CompoundTag; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.block.tileentity.CommandBlock; +import org.spongepowered.api.block.tileentity.TileEntity; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.block.InteractBlockEvent; +import org.spongepowered.api.event.entity.living.humanoid.player.RespawnPlayerEvent; +import org.spongepowered.api.event.filter.cause.Root; +import org.spongepowered.api.event.network.ClientConnectionEvent; +import org.spongepowered.api.world.Location; +import org.spongepowered.api.world.World; +import us.myles.ViaVersion.SpongePlugin; +import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.minecraft.Position; +import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; +import us.myles.ViaVersion.sponge.listeners.ViaSpongeListener; +import us.myles.ViaVersion.util.ReflectionUtil; + +import java.io.DataOutput; +import java.io.DataOutputStream; +import java.lang.reflect.Method; +import java.util.Optional; + +// TODO Change to bytebuf to not use reflection bullshit? +public class CommandBlockListener extends ViaSpongeListener { + public CommandBlockListener(SpongePlugin plugin) { + super(plugin, Protocol1_9TO1_8.class); + } + + @Listener + public void onJoin(ClientConnectionEvent.Join e) { + sendOp(e.getTargetEntity()); + } + + @Listener + public void onRespawn(RespawnPlayerEvent e) { + if (!isOnPipe(e.getTargetEntity().getUniqueId())) return; + + Sponge.getScheduler().createTaskBuilder().delayTicks(1).execute(new Runnable() { + @Override + public void run() { + sendOp(e.getTargetEntity()); + } + }).submit(getPlugin()); + } + + @Listener + public void onInteract(InteractBlockEvent e, @Root Player player) { + Optional> location = e.getTargetBlock().getLocation(); + if (!location.isPresent()) return; + Optional optTile = location.get().getTileEntity(); + if (!optTile.isPresent()) return; + TileEntity block = optTile.get(); + if (block instanceof CommandBlock) { + CommandBlock cmd = (CommandBlock) block; + try { + sendCommandBlockPacket(cmd, player); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + +// TODO Change world +// @EventHandler(priority = EventPriority.MONITOR) +// public void onWorldChange(PlayerChangedWorldEvent e) { +// sendOp(e.getPlayer()); +// } + +// @EventHandler(ignoreCancelled = true) +// public void onInteract(PlayerInteractEvent e) { +// if (e.getAction() == Action.RIGHT_CLICK_BLOCK && isOnPipe(e.getPlayer()) && e.getPlayer().isOp()) { +// try { +// sendCommandBlockPacket(e.getClickedBlock(), e.getPlayer()); +// } catch (Exception ex) { +// ex.printStackTrace(); +// } +// } +// } + + private void sendOp(Player p) { + // TODO Is there an isOp check? + if (p.hasPermission("viaversion.commandblocks") && isOnPipe(p.getUniqueId())) { + try { + PacketWrapper wrapper = new PacketWrapper(0x1B, null, getUserConnection(p.getUniqueId())); // Entity status + + wrapper.write(Type.INT, getEntityId(p)); // Entity ID + wrapper.write(Type.BYTE, (byte) 26); //Hardcoded op permission level + + wrapper.send(Protocol1_9TO1_8.class); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + private void sendCommandBlockPacket(CommandBlock b, Player player) throws Exception { + Method m = b.getClass().getDeclaredMethod("func_145844_m"); + m.setAccessible(true); + + Object updatePacket = m.invoke(b); + + PacketWrapper wrapper = generatePacket(updatePacket, getUserConnection(player.getUniqueId())); + wrapper.send(Protocol1_9TO1_8.class); + } + + // + private PacketWrapper generatePacket(Object updatePacket, UserConnection usr) throws Exception { + PacketWrapper wrapper = new PacketWrapper(0x09, null, usr); // Update block entity + + long[] pos = getPosition(ReflectionUtil.get(updatePacket, "field_179824_a", Class.forName("net.minecraft.util.BlockPos"))); + + wrapper.write(Type.POSITION, new Position(pos[0], pos[1], pos[2])); //Block position + wrapper.write(Type.BYTE, (byte) 2); // Action id always 2 + + CompoundTag nbt = getNBT(ReflectionUtil.get(updatePacket, "field_148860_e", Class.forName("net.minecraft.nbt.NBTTagCompound"))); + if (nbt == null) { + wrapper.write(Type.BYTE, (byte) 0); //If nbt is null. Use 0 as nbt + return wrapper; + } + nbt.put(new ByteTag("powered", (byte) 0)); + nbt.put(new ByteTag("auto", (byte) 0)); + nbt.put(new ByteTag("conditionMet", (byte) 0)); + + wrapper.write(Type.NBT, nbt); // NBT TAG + return wrapper; + } + + private long[] getPosition(Object obj) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException { + return new long[]{ + (long) ReflectionUtil.getSuper(obj, "field_177962_a", int.class), //X + (long) ReflectionUtil.getSuper(obj, "field_177960_b", int.class), //Y + (long) ReflectionUtil.getSuper(obj, "field_177961_c", int.class) //Z + }; + } + + private CompoundTag getNBT(Object obj) throws Exception { + ByteBuf buf = Unpooled.buffer(); + Method m = Class.forName("net.minecraft.nbt.CompressedStreamTools").getMethod("func_74800_a", Class.forName("net.minecraft.nbt.NBTTagCompound"), DataOutput.class); + m.invoke(null, obj, new DataOutputStream(new ByteBufOutputStream(buf))); + try { + return Type.NBT.read(buf); + } finally { + buf.release(); + } + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/DeathListener.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/DeathListener.java new file mode 100644 index 000000000..eece82ce0 --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/DeathListener.java @@ -0,0 +1,65 @@ +package us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8; + +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.Order; +import org.spongepowered.api.event.entity.DestructEntityEvent; +import org.spongepowered.api.world.World; +import us.myles.ViaVersion.SpongePlugin; +import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; +import us.myles.ViaVersion.sponge.listeners.ViaSpongeListener; + +import java.util.Optional; + +public class DeathListener extends ViaSpongeListener { + public DeathListener(SpongePlugin plugin) { + super(plugin, Protocol1_9TO1_8.class); + } + + @Listener(order = Order.LAST) + public void onDeath(DestructEntityEvent.Death e) { + if (!(e.getTargetEntity() instanceof Player)) + return; + + Player p = (Player) e.getTargetEntity(); + if (isOnPipe(p.getUniqueId()) && Via.getConfig().isShowNewDeathMessages() && checkGamerule(p.getWorld())) { + sendPacket(p, e.getMessage().toPlain()); + } + } + + public boolean checkGamerule(World w) { + Optional gamerule = w.getGameRule("showDeathMessages"); + + if (gamerule.isPresent()) { + try { + return Boolean.parseBoolean(gamerule.get()); + } catch (Exception e) { + return false; + } + } + return false; + } + + private void sendPacket(final Player p, final String msg) { + Via.getPlatform().runSync(new Runnable() { + @Override + public void run() { + PacketWrapper wrapper = new PacketWrapper(0x2C, null, getUserConnection(p.getUniqueId())); + try { + int entityId = getEntityId(p); + wrapper.write(Type.VAR_INT, 2); // Event - Entity dead + wrapper.write(Type.VAR_INT, entityId); // Player ID + wrapper.write(Type.INT, entityId); // Entity ID + Protocol1_9TO1_8.FIX_JSON.write(wrapper, msg); // Message + + wrapper.send(Protocol1_9TO1_8.class); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } +} From ff3d76a3872af5a6a47099b119bd8b4e81815590 Mon Sep 17 00:00:00 2001 From: Matsv Date: Mon, 26 Sep 2016 22:45:54 +0200 Subject: [PATCH 37/76] Move the todo list to #505 --- TODOLIST | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 TODOLIST diff --git a/TODOLIST b/TODOLIST deleted file mode 100644 index 6f03b3481..000000000 --- a/TODOLIST +++ /dev/null @@ -1,6 +0,0 @@ -PORT STUFF TO GUAVA :D (so we dont need to include commons) -Stop using new Gson() everywhere -Java docs (for platforms etc) -Add comments to sponge api -Fix task ids, methods for sponge -Find all the TODO's and check they're done. \ No newline at end of file From 396998c7fc9e091cc4d50ab75b277d4036069e8d Mon Sep 17 00:00:00 2001 From: Myles Date: Tue, 27 Sep 2016 17:31:10 +0100 Subject: [PATCH 38/76] Factor & Javadoc update --- .../java/us/myles/ViaVersion/ViaConfig.java | 2 +- .../us/myles/ViaVersion/ViaVersionPlugin.java | 10 ++- .../myles/ViaVersion/api/ViaVersionAPI.java | 4 +- .../BasicHandlerConstructor.java | 6 +- .../classgenerator/ClassGenerator.java | 8 +- .../classgenerator/HandlerConstructor.java | 2 +- .../{ => commands}/BukkitCommandHandler.java | 2 +- .../{ => commands}/BukkitCommandSender.java | 2 +- .../handlers/ViaDecodeHandler.java | 2 +- .../handlers/ViaEncodeHandler.java | 2 +- .../handlers/ViaPacketHandler.java | 2 +- .../handlers/ViaVersionInitializer.java | 6 +- .../listeners/UpdateListener.java | 2 +- .../listeners/ViaBukkitListener.java | 2 +- .../protocol1_9to1_8/ArmorListener.java | 4 +- .../protocol1_9to1_8/BlockListener.java | 4 +- .../CommandBlockListener.java | 6 +- .../protocol1_9to1_8/DeathListener.java | 4 +- .../protocol1_9to1_8/HandItemCache.java | 2 +- .../protocol1_9to1_8/PaperPatch.java | 4 +- .../bukkit/{ => platform}/BukkitViaAPI.java | 4 +- .../{ => platform}/BukkitViaInjector.java | 6 +- .../{ => platform}/BukkitViaLoader.java | 8 +- .../BukkitViaBulkChunkTranslator.java | 4 +- .../BukkitViaMovementTransmitter.java | 4 +- .../{ => bukkit}/util/Configuration.java | 2 +- .../ViaVersion/{ => bukkit}/util/NMSUtil.java | 2 +- .../util/ProtocolSupportUtil.java | 2 +- .../main/java/us/myles/ViaVersion/Bungee.java | 14 +-- .../{command => commands}/BungeeCommand.java | 2 +- .../BungeeCommandHandler.java | 2 +- .../BungeeCommandSender.java | 2 +- .../bungee/{ => platform}/BungeeBossBar.java | 2 +- .../{config => platform}/BungeeConfigAPI.java | 2 +- .../bungee/{ => platform}/BungeeViaAPI.java | 2 +- .../{ => platform}/BungeeViaInjector.java | 2 +- .../{ => platform}/BungeeViaLoader.java | 2 +- .../myles/ViaVersion/api/PacketWrapper.java | 8 +- .../java/us/myles/ViaVersion/api/Via.java | 15 ++++ .../us/myles/ViaVersion/api/ViaListener.java | 1 - .../us/myles/ViaVersion/api/boss/BossBar.java | 6 ++ .../api/command/ViaCommandSender.java | 29 ++++++- .../ViaVersion/api/command/ViaSubCommand.java | 12 +-- .../api/command/ViaVersionCommand.java | 2 +- .../ViaVersion/api/platform/ViaInjector.java | 29 ++++++- .../ViaVersion/api/platform/ViaPlatform.java | 87 +++++++++++++++++++ .../api/platform/ViaPlatformLoader.java | 5 +- .../api/platform/providers/ViaProviders.java | 4 +- .../ViaVersion/api/protocol/Protocol.java | 4 +- .../api/protocol/ProtocolRegistry.java | 8 +- .../api/remapper/PacketRemapper.java | 2 +- .../api/type/types/version/Types1_8.java | 4 +- .../commands/ViaCommandHandler.java | 25 +++++- .../commands/defaultsubs/PPSSubCmd.java | 2 - .../exception/InformativeException.java | 2 +- .../myles/ViaVersion/packets/PacketType.java | 4 +- .../protocols/base/BaseProtocol.java | 7 +- .../Protocol1_10To1_9_3_4.java | 4 +- .../chunks/ChunkSection1_9_3_4.java | 2 +- .../chunks/ChunkSection1_9_1_2.java | 2 +- .../chunks/FakeTileEntity.java | 2 +- .../types/Chunk1_9_1_2Type.java | 4 +- .../protocols/protocol1_9to1_8/ArmorType.java | 26 ++++++ .../protocol1_9to1_8/Protocol1_9TO1_8.java | 4 +- .../protocol1_9to1_8/chat/ChatRewriter.java | 6 ++ .../packets/EntityPackets.java | 2 +- .../packets/SpawnPackets.java | 2 +- .../BulkChunkTranslatorProvider.java | 13 +++ .../protocol1_9to1_8/sounds/Effect.java | 2 +- .../storage/EntityTracker.java | 4 +- .../storage/PlaceBlockTracker.java | 9 ++ .../us/myles/ViaVersion/update/Version.java | 23 ++++- .../myles/ViaVersion/util/PipelineUtil.java | 32 +++++++ .../us/myles/ViaVersion/SpongePlugin.java | 7 ++ .../{ => commands}/SpongeCommandHandler.java | 2 +- .../{ => commands}/SpongeCommandSender.java | 2 +- .../sponge/{ => platform}/SpongeBossBar.java | 2 +- .../{ => platform}/SpongeConfigAPI.java | 2 +- .../sponge/{ => platform}/SpongeViaAPI.java | 2 +- .../{ => platform}/SpongeViaInjector.java | 2 +- .../{ => platform}/SpongeViaLoader.java | 2 +- .../sponge/{ => util}/LoggerWrapper.java | 2 +- 82 files changed, 415 insertions(+), 139 deletions(-) rename bukkit/src/main/java/us/myles/ViaVersion/{ => bukkit}/classgenerator/BasicHandlerConstructor.java (77%) rename bukkit/src/main/java/us/myles/ViaVersion/{ => bukkit}/classgenerator/ClassGenerator.java (97%) rename bukkit/src/main/java/us/myles/ViaVersion/{ => bukkit}/classgenerator/HandlerConstructor.java (89%) rename bukkit/src/main/java/us/myles/ViaVersion/bukkit/{ => commands}/BukkitCommandHandler.java (94%) rename bukkit/src/main/java/us/myles/ViaVersion/bukkit/{ => commands}/BukkitCommandSender.java (94%) rename bukkit/src/main/java/us/myles/ViaVersion/{ => bukkit}/handlers/ViaDecodeHandler.java (98%) rename bukkit/src/main/java/us/myles/ViaVersion/{ => bukkit}/handlers/ViaEncodeHandler.java (98%) rename bukkit/src/main/java/us/myles/ViaVersion/{ => bukkit}/handlers/ViaPacketHandler.java (96%) rename bukkit/src/main/java/us/myles/ViaVersion/{ => bukkit}/handlers/ViaVersionInitializer.java (91%) rename bukkit/src/main/java/us/myles/ViaVersion/{ => bukkit}/listeners/UpdateListener.java (91%) rename bukkit/src/main/java/us/myles/ViaVersion/{ => bukkit}/listeners/ViaBukkitListener.java (96%) rename bukkit/src/main/java/us/myles/ViaVersion/{ => bukkit}/listeners/protocol1_9to1_8/ArmorListener.java (97%) rename bukkit/src/main/java/us/myles/ViaVersion/{ => bukkit}/listeners/protocol1_9to1_8/BlockListener.java (88%) rename bukkit/src/main/java/us/myles/ViaVersion/{ => bukkit}/listeners/protocol1_9to1_8/CommandBlockListener.java (96%) rename bukkit/src/main/java/us/myles/ViaVersion/{ => bukkit}/listeners/protocol1_9to1_8/DeathListener.java (94%) rename bukkit/src/main/java/us/myles/ViaVersion/{ => bukkit}/listeners/protocol1_9to1_8/HandItemCache.java (95%) rename bukkit/src/main/java/us/myles/ViaVersion/{ => bukkit}/listeners/protocol1_9to1_8/PaperPatch.java (94%) rename bukkit/src/main/java/us/myles/ViaVersion/bukkit/{ => platform}/BukkitViaAPI.java (97%) rename bukkit/src/main/java/us/myles/ViaVersion/bukkit/{ => platform}/BukkitViaInjector.java (98%) rename bukkit/src/main/java/us/myles/ViaVersion/bukkit/{ => platform}/BukkitViaLoader.java (92%) rename bukkit/src/main/java/us/myles/ViaVersion/bukkit/{ => providers}/BukkitViaBulkChunkTranslator.java (97%) rename bukkit/src/main/java/us/myles/ViaVersion/bukkit/{ => providers}/BukkitViaMovementTransmitter.java (97%) rename bukkit/src/main/java/us/myles/ViaVersion/{ => bukkit}/util/Configuration.java (99%) rename bukkit/src/main/java/us/myles/ViaVersion/{ => bukkit}/util/NMSUtil.java (93%) rename bukkit/src/main/java/us/myles/ViaVersion/{ => bukkit}/util/ProtocolSupportUtil.java (96%) rename bungee/src/main/java/us/myles/ViaVersion/bungee/{command => commands}/BungeeCommand.java (91%) rename bungee/src/main/java/us/myles/ViaVersion/bungee/{command => commands}/BungeeCommandHandler.java (73%) rename bungee/src/main/java/us/myles/ViaVersion/bungee/{command => commands}/BungeeCommandSender.java (95%) rename bungee/src/main/java/us/myles/ViaVersion/bungee/{ => platform}/BungeeBossBar.java (95%) rename bungee/src/main/java/us/myles/ViaVersion/bungee/{config => platform}/BungeeConfigAPI.java (98%) rename bungee/src/main/java/us/myles/ViaVersion/bungee/{ => platform}/BungeeViaAPI.java (98%) rename bungee/src/main/java/us/myles/ViaVersion/bungee/{ => platform}/BungeeViaInjector.java (97%) rename bungee/src/main/java/us/myles/ViaVersion/bungee/{ => platform}/BungeeViaLoader.java (78%) rename sponge/src/main/java/us/myles/ViaVersion/sponge/{ => commands}/SpongeCommandHandler.java (97%) rename sponge/src/main/java/us/myles/ViaVersion/sponge/{ => commands}/SpongeCommandSender.java (95%) rename sponge/src/main/java/us/myles/ViaVersion/sponge/{ => platform}/SpongeBossBar.java (95%) rename sponge/src/main/java/us/myles/ViaVersion/sponge/{ => platform}/SpongeConfigAPI.java (99%) rename sponge/src/main/java/us/myles/ViaVersion/sponge/{ => platform}/SpongeViaAPI.java (98%) rename sponge/src/main/java/us/myles/ViaVersion/sponge/{ => platform}/SpongeViaInjector.java (99%) rename sponge/src/main/java/us/myles/ViaVersion/sponge/{ => platform}/SpongeViaLoader.java (98%) rename sponge/src/main/java/us/myles/ViaVersion/sponge/{ => util}/LoggerWrapper.java (98%) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaConfig.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaConfig.java index d63372589..b1e1fec38 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaConfig.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaConfig.java @@ -2,7 +2,7 @@ package us.myles.ViaVersion; import us.myles.ViaVersion.api.ViaVersionConfig; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; -import us.myles.ViaVersion.util.Configuration; +import us.myles.ViaVersion.bukkit.util.Configuration; import java.io.File; import java.util.List; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 51389604e..72d7cacb2 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -14,10 +14,14 @@ import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import us.myles.ViaVersion.api.platform.ViaPlatform; -import us.myles.ViaVersion.bukkit.*; -import us.myles.ViaVersion.classgenerator.ClassGenerator; +import us.myles.ViaVersion.bukkit.classgenerator.ClassGenerator; +import us.myles.ViaVersion.bukkit.commands.BukkitCommandHandler; +import us.myles.ViaVersion.bukkit.commands.BukkitCommandSender; +import us.myles.ViaVersion.bukkit.platform.BukkitViaAPI; +import us.myles.ViaVersion.bukkit.platform.BukkitViaInjector; +import us.myles.ViaVersion.bukkit.platform.BukkitViaLoader; import us.myles.ViaVersion.dump.PluginInfo; -import us.myles.ViaVersion.util.NMSUtil; +import us.myles.ViaVersion.bukkit.util.NMSUtil; import java.util.ArrayList; import java.util.List; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java b/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java index a962fd924..a1dfcf212 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/api/ViaVersionAPI.java @@ -103,9 +103,9 @@ public interface ViaVersionAPI extends ViaAPI { boolean isDebug(); /** - * Get ViaVersions command handler + * Get ViaVersions commands handler * - * @return command handler + * @return commands handler */ ViaVersionCommand getCommandHandler(); diff --git a/bukkit/src/main/java/us/myles/ViaVersion/classgenerator/BasicHandlerConstructor.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/BasicHandlerConstructor.java similarity index 77% rename from bukkit/src/main/java/us/myles/ViaVersion/classgenerator/BasicHandlerConstructor.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/BasicHandlerConstructor.java index d94d4feaf..7ef143b6d 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/classgenerator/BasicHandlerConstructor.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/BasicHandlerConstructor.java @@ -1,10 +1,10 @@ -package us.myles.ViaVersion.classgenerator; +package us.myles.ViaVersion.bukkit.classgenerator; import io.netty.handler.codec.ByteToMessageDecoder; import io.netty.handler.codec.MessageToByteEncoder; import us.myles.ViaVersion.api.data.UserConnection; -import us.myles.ViaVersion.handlers.ViaDecodeHandler; -import us.myles.ViaVersion.handlers.ViaEncodeHandler; +import us.myles.ViaVersion.bukkit.handlers.ViaDecodeHandler; +import us.myles.ViaVersion.bukkit.handlers.ViaEncodeHandler; public class BasicHandlerConstructor implements HandlerConstructor { @Override diff --git a/bukkit/src/main/java/us/myles/ViaVersion/classgenerator/ClassGenerator.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/ClassGenerator.java similarity index 97% rename from bukkit/src/main/java/us/myles/ViaVersion/classgenerator/ClassGenerator.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/ClassGenerator.java index 310390da5..95d25daa4 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/classgenerator/ClassGenerator.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/ClassGenerator.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.classgenerator; +package us.myles.ViaVersion.bukkit.classgenerator; import javassist.*; import javassist.expr.ConstructorCall; @@ -6,9 +6,9 @@ import javassist.expr.ExprEditor; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; import us.myles.ViaVersion.api.ViaVersion; -import us.myles.ViaVersion.handlers.ViaDecodeHandler; -import us.myles.ViaVersion.handlers.ViaEncodeHandler; -import us.myles.ViaVersion.util.NMSUtil; +import us.myles.ViaVersion.bukkit.handlers.ViaDecodeHandler; +import us.myles.ViaVersion.bukkit.handlers.ViaEncodeHandler; +import us.myles.ViaVersion.bukkit.util.NMSUtil; public class ClassGenerator { private static HandlerConstructor constructor = new BasicHandlerConstructor(); diff --git a/bukkit/src/main/java/us/myles/ViaVersion/classgenerator/HandlerConstructor.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/HandlerConstructor.java similarity index 89% rename from bukkit/src/main/java/us/myles/ViaVersion/classgenerator/HandlerConstructor.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/HandlerConstructor.java index 19a5423c4..ab16e9967 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/classgenerator/HandlerConstructor.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/HandlerConstructor.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.classgenerator; +package us.myles.ViaVersion.bukkit.classgenerator; import io.netty.handler.codec.ByteToMessageDecoder; import io.netty.handler.codec.MessageToByteEncoder; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/commands/BukkitCommandHandler.java similarity index 94% rename from bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandHandler.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/commands/BukkitCommandHandler.java index a5b0a6d64..11bf9771f 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandHandler.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/commands/BukkitCommandHandler.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.bukkit; +package us.myles.ViaVersion.bukkit.commands; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandSender.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/commands/BukkitCommandSender.java similarity index 94% rename from bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandSender.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/commands/BukkitCommandSender.java index 2cc59c25b..e1288ca29 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandSender.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/commands/BukkitCommandSender.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.bukkit; +package us.myles.ViaVersion.bukkit.commands; import lombok.AllArgsConstructor; import org.bukkit.command.CommandSender; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaDecodeHandler.java similarity index 98% rename from bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaDecodeHandler.java index 1d376c58d..0fe3b1d39 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaDecodeHandler.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.handlers; +package us.myles.ViaVersion.bukkit.handlers; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaEncodeHandler.java similarity index 98% rename from bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaEncodeHandler.java index 67cac1581..edc4ec43c 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaEncodeHandler.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaEncodeHandler.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.handlers; +package us.myles.ViaVersion.bukkit.handlers; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaPacketHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaPacketHandler.java similarity index 96% rename from bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaPacketHandler.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaPacketHandler.java index a0205a8b5..ae09c9e01 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaPacketHandler.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaPacketHandler.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.handlers; +package us.myles.ViaVersion.bukkit.handlers; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaVersionInitializer.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaVersionInitializer.java similarity index 91% rename from bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaVersionInitializer.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaVersionInitializer.java index ccd70da1e..716e38310 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaVersionInitializer.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaVersionInitializer.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.handlers; +package us.myles.ViaVersion.bukkit.handlers; import io.netty.channel.Channel; import io.netty.channel.ChannelInitializer; @@ -7,8 +7,8 @@ import io.netty.handler.codec.ByteToMessageDecoder; import io.netty.handler.codec.MessageToByteEncoder; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.protocol.ProtocolPipeline; -import us.myles.ViaVersion.classgenerator.ClassGenerator; -import us.myles.ViaVersion.classgenerator.HandlerConstructor; +import us.myles.ViaVersion.bukkit.classgenerator.ClassGenerator; +import us.myles.ViaVersion.bukkit.classgenerator.HandlerConstructor; import java.lang.reflect.Method; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/UpdateListener.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/UpdateListener.java similarity index 91% rename from bukkit/src/main/java/us/myles/ViaVersion/listeners/UpdateListener.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/UpdateListener.java index dc0942192..3d7f74eb9 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/listeners/UpdateListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/UpdateListener.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.listeners; +package us.myles.ViaVersion.bukkit.listeners; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/ViaBukkitListener.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/ViaBukkitListener.java similarity index 96% rename from bukkit/src/main/java/us/myles/ViaVersion/listeners/ViaBukkitListener.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/ViaBukkitListener.java index f76f31b71..a94bca5d3 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/listeners/ViaBukkitListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/ViaBukkitListener.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.listeners; +package us.myles.ViaVersion.bukkit.listeners; import lombok.AccessLevel; import lombok.Getter; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/ArmorListener.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/ArmorListener.java similarity index 97% rename from bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/ArmorListener.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/ArmorListener.java index 1d55fa8d8..2880f47e4 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/ArmorListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/ArmorListener.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.listeners.protocol1_9to1_8; +package us.myles.ViaVersion.bukkit.listeners.protocol1_9to1_8; import org.bukkit.Bukkit; import org.bukkit.entity.HumanEntity; @@ -17,7 +17,7 @@ import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.type.Type; -import us.myles.ViaVersion.listeners.ViaBukkitListener; +import us.myles.ViaVersion.bukkit.listeners.ViaBukkitListener; import us.myles.ViaVersion.protocols.protocol1_9to1_8.ArmorType; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/BlockListener.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/BlockListener.java similarity index 88% rename from bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/BlockListener.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/BlockListener.java index 964bad178..801e406cd 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/BlockListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/BlockListener.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.listeners.protocol1_9to1_8; +package us.myles.ViaVersion.bukkit.listeners.protocol1_9to1_8; import org.bukkit.block.Block; import org.bukkit.event.EventHandler; @@ -6,7 +6,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockPlaceEvent; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.minecraft.Position; -import us.myles.ViaVersion.listeners.ViaBukkitListener; +import us.myles.ViaVersion.bukkit.listeners.ViaBukkitListener; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.EntityTracker; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/CommandBlockListener.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/CommandBlockListener.java similarity index 96% rename from bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/CommandBlockListener.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/CommandBlockListener.java index b12a99f7e..7477023b1 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/CommandBlockListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/CommandBlockListener.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.listeners.protocol1_9to1_8; +package us.myles.ViaVersion.bukkit.listeners.protocol1_9to1_8; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufOutputStream; @@ -21,9 +21,9 @@ import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.minecraft.Position; import us.myles.ViaVersion.api.type.Type; -import us.myles.ViaVersion.listeners.ViaBukkitListener; +import us.myles.ViaVersion.bukkit.listeners.ViaBukkitListener; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; -import us.myles.ViaVersion.util.NMSUtil; +import us.myles.ViaVersion.bukkit.util.NMSUtil; import us.myles.ViaVersion.util.ReflectionUtil; import java.io.DataOutput; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/DeathListener.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/DeathListener.java similarity index 94% rename from bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/DeathListener.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/DeathListener.java index 9cb82857e..5ac730080 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/DeathListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/DeathListener.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.listeners.protocol1_9to1_8; +package us.myles.ViaVersion.bukkit.listeners.protocol1_9to1_8; import org.bukkit.World; import org.bukkit.entity.Player; @@ -10,7 +10,7 @@ import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.type.Type; -import us.myles.ViaVersion.listeners.ViaBukkitListener; +import us.myles.ViaVersion.bukkit.listeners.ViaBukkitListener; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; public class DeathListener extends ViaBukkitListener { diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/HandItemCache.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/HandItemCache.java similarity index 95% rename from bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/HandItemCache.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/HandItemCache.java index 9a05ad7b2..a7a288982 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/HandItemCache.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/HandItemCache.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.listeners.protocol1_9to1_8; +package us.myles.ViaVersion.bukkit.listeners.protocol1_9to1_8; import org.bukkit.Bukkit; import org.bukkit.entity.Player; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/PaperPatch.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/PaperPatch.java similarity index 94% rename from bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/PaperPatch.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/PaperPatch.java index 38e24701e..5fbd1562a 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/PaperPatch.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/PaperPatch.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.listeners.protocol1_9to1_8; +package us.myles.ViaVersion.bukkit.listeners.protocol1_9to1_8; import org.bukkit.Location; import org.bukkit.Material; @@ -6,7 +6,7 @@ import org.bukkit.block.BlockFace; import org.bukkit.event.EventHandler; import org.bukkit.event.block.BlockPlaceEvent; import us.myles.ViaVersion.ViaVersionPlugin; -import us.myles.ViaVersion.listeners.ViaBukkitListener; +import us.myles.ViaVersion.bukkit.listeners.ViaBukkitListener; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; public class PaperPatch extends ViaBukkitListener { diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaAPI.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaAPI.java similarity index 97% rename from bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaAPI.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaAPI.java index c2e4bf66d..9d3cff21e 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaAPI.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaAPI.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.bukkit; +package us.myles.ViaVersion.bukkit.platform; import io.netty.buffer.ByteBuf; import lombok.AllArgsConstructor; @@ -17,7 +17,7 @@ import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.boss.ViaBossBar; import us.myles.ViaVersion.protocols.base.ProtocolInfo; -import us.myles.ViaVersion.util.ProtocolSupportUtil; +import us.myles.ViaVersion.bukkit.util.ProtocolSupportUtil; import java.util.Map; import java.util.SortedSet; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java similarity index 98% rename from bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java index 437997e18..769f35764 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaInjector.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.bukkit; +package us.myles.ViaVersion.bukkit.platform; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandler; @@ -8,10 +8,10 @@ import org.bukkit.plugin.PluginDescriptionFile; import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaInjector; -import us.myles.ViaVersion.handlers.ViaVersionInitializer; +import us.myles.ViaVersion.bukkit.handlers.ViaVersionInitializer; import us.myles.ViaVersion.util.ConcurrentList; import us.myles.ViaVersion.util.ListWrapper; -import us.myles.ViaVersion.util.NMSUtil; +import us.myles.ViaVersion.bukkit.util.NMSUtil; import us.myles.ViaVersion.util.ReflectionUtil; import java.lang.reflect.Field; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaLoader.java similarity index 92% rename from bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaLoader.java index 944dd766c..28b6f23cf 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaLoader.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaLoader.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.bukkit; +package us.myles.ViaVersion.bukkit.platform; import lombok.AllArgsConstructor; import org.bukkit.Bukkit; @@ -10,8 +10,10 @@ import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.platform.ViaPlatformLoader; -import us.myles.ViaVersion.listeners.UpdateListener; -import us.myles.ViaVersion.listeners.protocol1_9to1_8.*; +import us.myles.ViaVersion.bukkit.listeners.UpdateListener; +import us.myles.ViaVersion.bukkit.listeners.protocol1_9to1_8.*; +import us.myles.ViaVersion.bukkit.providers.BukkitViaBulkChunkTranslator; +import us.myles.ViaVersion.bukkit.providers.BukkitViaMovementTransmitter; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.HandItemProvider; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaBulkChunkTranslator.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitViaBulkChunkTranslator.java similarity index 97% rename from bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaBulkChunkTranslator.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitViaBulkChunkTranslator.java index dc57fa445..25d8370b5 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaBulkChunkTranslator.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitViaBulkChunkTranslator.java @@ -1,11 +1,11 @@ -package us.myles.ViaVersion.bukkit; +package us.myles.ViaVersion.bukkit.providers; import com.google.common.collect.Lists; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks; -import us.myles.ViaVersion.util.NMSUtil; +import us.myles.ViaVersion.bukkit.util.NMSUtil; import us.myles.ViaVersion.util.ReflectionUtil; import java.lang.reflect.Method; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaMovementTransmitter.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitViaMovementTransmitter.java similarity index 97% rename from bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaMovementTransmitter.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitViaMovementTransmitter.java index f5da163d5..30bcaf1b4 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitViaMovementTransmitter.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitViaMovementTransmitter.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.bukkit; +package us.myles.ViaVersion.bukkit.providers; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -7,7 +7,7 @@ import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.MovementTracker; -import us.myles.ViaVersion.util.NMSUtil; +import us.myles.ViaVersion.bukkit.util.NMSUtil; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/util/Configuration.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/util/Configuration.java similarity index 99% rename from bukkit/src/main/java/us/myles/ViaVersion/util/Configuration.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/util/Configuration.java index 447f53f1e..0e3ba1797 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/util/Configuration.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/util/Configuration.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.util; +package us.myles.ViaVersion.bukkit.util; import com.google.common.base.Joiner; import com.google.common.collect.Lists; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/util/NMSUtil.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/util/NMSUtil.java similarity index 93% rename from bukkit/src/main/java/us/myles/ViaVersion/util/NMSUtil.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/util/NMSUtil.java index 578ef49b5..d01884ecb 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/util/NMSUtil.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/util/NMSUtil.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.util; +package us.myles.ViaVersion.bukkit.util; import org.bukkit.Bukkit; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/util/ProtocolSupportUtil.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/util/ProtocolSupportUtil.java similarity index 96% rename from bukkit/src/main/java/us/myles/ViaVersion/util/ProtocolSupportUtil.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/util/ProtocolSupportUtil.java index 66458a0a5..f740893f8 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/util/ProtocolSupportUtil.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/util/ProtocolSupportUtil.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.util; +package us.myles.ViaVersion.bukkit.util; import org.bukkit.entity.Player; diff --git a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java b/bungee/src/main/java/us/myles/ViaVersion/Bungee.java index f3a0c5e3c..b8805a582 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java +++ b/bungee/src/main/java/us/myles/ViaVersion/Bungee.java @@ -11,13 +11,13 @@ import us.myles.ViaVersion.api.ViaVersionConfig; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import us.myles.ViaVersion.api.platform.ViaPlatform; -import us.myles.ViaVersion.bungee.BungeeViaAPI; -import us.myles.ViaVersion.bungee.BungeeViaInjector; -import us.myles.ViaVersion.bungee.BungeeViaLoader; -import us.myles.ViaVersion.bungee.command.BungeeCommand; -import us.myles.ViaVersion.bungee.command.BungeeCommandHandler; -import us.myles.ViaVersion.bungee.command.BungeeCommandSender; -import us.myles.ViaVersion.bungee.config.BungeeConfigAPI; +import us.myles.ViaVersion.bungee.platform.BungeeViaAPI; +import us.myles.ViaVersion.bungee.platform.BungeeViaInjector; +import us.myles.ViaVersion.bungee.platform.BungeeViaLoader; +import us.myles.ViaVersion.bungee.commands.BungeeCommand; +import us.myles.ViaVersion.bungee.commands.BungeeCommandHandler; +import us.myles.ViaVersion.bungee.commands.BungeeCommandSender; +import us.myles.ViaVersion.bungee.platform.BungeeConfigAPI; import java.util.UUID; import java.util.concurrent.TimeUnit; diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommand.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommand.java similarity index 91% rename from bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommand.java rename to bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommand.java index 19b33f211..933fe75f8 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommand.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommand.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.bungee.command; +package us.myles.ViaVersion.bungee.commands; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.plugin.Command; diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommandHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommandHandler.java similarity index 73% rename from bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommandHandler.java rename to bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommandHandler.java index f6d2b2a6d..4e1cbefd5 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommandHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommandHandler.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.bungee.command; +package us.myles.ViaVersion.bungee.commands; import us.myles.ViaVersion.commands.ViaCommandHandler; diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommandSender.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommandSender.java similarity index 95% rename from bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommandSender.java rename to bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommandSender.java index e5f21482c..d80a8702e 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/command/BungeeCommandSender.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommandSender.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.bungee.command; +package us.myles.ViaVersion.bungee.commands; import lombok.AllArgsConstructor; import net.md_5.bungee.api.CommandSender; diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeBossBar.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeBossBar.java similarity index 95% rename from bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeBossBar.java rename to bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeBossBar.java index e377921c5..538246ec2 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeBossBar.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeBossBar.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.bungee; +package us.myles.ViaVersion.bungee.platform; import net.md_5.bungee.api.connection.ProxiedPlayer; import us.myles.ViaVersion.api.boss.BossBar; diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/config/BungeeConfigAPI.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java similarity index 98% rename from bungee/src/main/java/us/myles/ViaVersion/bungee/config/BungeeConfigAPI.java rename to bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java index 4b4ca1bfb..cc4e784e6 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/config/BungeeConfigAPI.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.bungee.config; +package us.myles.ViaVersion.bungee.platform; import us.myles.ViaVersion.api.ViaVersionConfig; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaAPI.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaAPI.java similarity index 98% rename from bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaAPI.java rename to bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaAPI.java index ce33fed0b..51b7a9c3e 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaAPI.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaAPI.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.bungee; +package us.myles.ViaVersion.bungee.platform; import io.netty.buffer.ByteBuf; import lombok.NonNull; diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaInjector.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java similarity index 97% rename from bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaInjector.java rename to bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java index 8b3f04d3c..67ed4b3ac 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaInjector.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.bungee; +package us.myles.ViaVersion.bungee.platform; import io.netty.channel.Channel; import io.netty.channel.ChannelInitializer; diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaLoader.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java similarity index 78% rename from bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaLoader.java rename to bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java index fd179b048..b78346e85 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/BungeeViaLoader.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.bungee; +package us.myles.ViaVersion.bungee.platform; import us.myles.ViaVersion.api.platform.ViaPlatformLoader; diff --git a/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java b/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java index 8322063b5..0f4d4307a 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java +++ b/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java @@ -24,7 +24,7 @@ import java.util.LinkedList; import java.util.List; public class PacketWrapper { - public static int PASSTHROUGH_ID = 1000; + public static final int PASSTHROUGH_ID = 1000; private final ByteBuf inputBuffer; private final UserConnection userConnection; @@ -32,8 +32,8 @@ public class PacketWrapper { @Setter @Getter private int id = -1; - private LinkedList> readableObjects = new LinkedList<>(); - private List> packetValues = new ArrayList<>(); + private final LinkedList> readableObjects = new LinkedList<>(); + private final List> packetValues = new ArrayList<>(); public PacketWrapper(int packetID, ByteBuf inputBuffer, UserConnection userConnection) { this.id = packetID; @@ -404,7 +404,7 @@ public class PacketWrapper { * @param index The index to start from * @param pipeline The pipeline * @return The current packetwrapper - * @throws Exception + * @throws Exception If it fails to transform a packet, exception will be thrown */ public PacketWrapper apply(Direction direction, State state, int index, List pipeline) throws Exception { for (int i = index; i < pipeline.size(); i++) { // Copy to prevent from removal. diff --git a/common/src/main/java/us/myles/ViaVersion/api/Via.java b/common/src/main/java/us/myles/ViaVersion/api/Via.java index be852c468..62b592bad 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/Via.java +++ b/common/src/main/java/us/myles/ViaVersion/api/Via.java @@ -11,6 +11,11 @@ public class Via { @Getter private static ViaManager manager; + /** + * Register the ViaManager associated with the platform. + * + * @param viaManager The ViaManager + */ public static void init(ViaManager viaManager) { Validate.isTrue(manager == null, "ViaManager is already set"); @@ -18,11 +23,21 @@ public class Via { Via.manager = viaManager; } + /** + * Get the API associated with the current platform. + * + * @return API instance + */ public static ViaAPI getAPI() { Validate.isTrue(platform != null, "ViaVersion has not loaded the Platform"); return Via.platform.getApi(); } + /** + * Get the config associated with the current platform. + * + * @return Config instance + */ public static ViaVersionConfig getConfig() { Validate.isTrue(platform != null, "ViaVersion has not loaded the Platform"); return Via.platform.getConf(); diff --git a/common/src/main/java/us/myles/ViaVersion/api/ViaListener.java b/common/src/main/java/us/myles/ViaVersion/api/ViaListener.java index 8b661ce5d..243a00212 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/ViaListener.java +++ b/common/src/main/java/us/myles/ViaVersion/api/ViaListener.java @@ -21,7 +21,6 @@ public abstract class ViaListener { * @return The UserConnection */ protected UserConnection getUserConnection(@NonNull UUID uuid) { - if (!Via.getAPI().isPorted(uuid)) return null; return Via.getManager().getConnection(uuid); } diff --git a/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java b/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java index a7b1988e2..da4c519ad 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java +++ b/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java @@ -111,6 +111,12 @@ public abstract class BossBar { throw new NotImplementedException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName()); } + /** + * Removes the bossbar from a player + * + * @param uuid The platers YYUD + * @return The BossBar object + */ public abstract BossBar removePlayer(UUID uuid); /** diff --git a/common/src/main/java/us/myles/ViaVersion/api/command/ViaCommandSender.java b/common/src/main/java/us/myles/ViaVersion/api/command/ViaCommandSender.java index e47eec91b..78cf19f7a 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/command/ViaCommandSender.java +++ b/common/src/main/java/us/myles/ViaVersion/api/command/ViaCommandSender.java @@ -3,11 +3,32 @@ package us.myles.ViaVersion.api.command; import java.util.UUID; public interface ViaCommandSender { - public boolean hasPermission(String permission); + /** + * Check if the sender has a permission. + * + * @param permission Permission string eg. viaversion.admin + * @return True if the sender has the permission + */ + boolean hasPermission(String permission); - public void sendMessage(String msg); + /** + * Send a message to the sender + * + * @param msg The message to send + */ + void sendMessage(String msg); - public UUID getUUID(); + /** + * Get the senders UUID. + * + * @return The senders UUID + */ + UUID getUUID(); - public String getName(); + /** + * Get the senders name. + * + * @return The senders name + */ + String getName(); } diff --git a/common/src/main/java/us/myles/ViaVersion/api/command/ViaSubCommand.java b/common/src/main/java/us/myles/ViaVersion/api/command/ViaSubCommand.java index 86df89e65..0c206fd10 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/command/ViaSubCommand.java +++ b/common/src/main/java/us/myles/ViaVersion/api/command/ViaSubCommand.java @@ -9,14 +9,14 @@ public abstract class ViaSubCommand { /** * Subcommand name * - * @return The command name + * @return The commands name */ public abstract String name(); /** * subcommand description, this'll show in /viaversion list * - * @return The command description + * @return The commands description */ public abstract String description(); @@ -24,7 +24,7 @@ public abstract class ViaSubCommand { * Usage example: * "playerversion [name]" * - * @return The command usage + * @return The commands usage */ public String usage() { return name(); @@ -33,7 +33,7 @@ public abstract class ViaSubCommand { /** * Permission, null for everyone * - * @return The permission required to use the command + * @return The permission required to use the commands */ public String permission() { return "viaversion.admin"; @@ -44,7 +44,7 @@ public abstract class ViaSubCommand { * * @param sender Command sender * @param args Arguments - * @return command executed succesfully if false, show usage + * @return commands executed succesfully if false, show usage */ public abstract boolean execute(ViaCommandSender sender, String[] args); @@ -66,7 +66,7 @@ public abstract class ViaSubCommand { /** * Send message formatted / colored * - * @param sender command sender + * @param sender commands sender * @param message string message * @param args optional objects */ diff --git a/common/src/main/java/us/myles/ViaVersion/api/command/ViaVersionCommand.java b/common/src/main/java/us/myles/ViaVersion/api/command/ViaVersionCommand.java index 983f960cc..c60037af0 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/command/ViaVersionCommand.java +++ b/common/src/main/java/us/myles/ViaVersion/api/command/ViaVersionCommand.java @@ -28,7 +28,7 @@ public interface ViaVersionCommand { ViaSubCommand getSubCommand(String name); /** - * Executed when the Command sender executes the command + * Executed when the Command sender executes the commands * * @param sender Sender object * @param args arguments provided diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java index 0523e9758..86a0c3af8 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java @@ -1,11 +1,32 @@ package us.myles.ViaVersion.api.platform; public interface ViaInjector { - public void inject() throws Exception; + /** + * Inject into the current Platform + * + * @throws Exception If there is an error with injecting + */ + void inject() throws Exception; - public void uninject() throws Exception; + /** + * Uninject into the current Platform + * + * @throws Exception If there is an error with uninjecting + */ + void uninject() throws Exception; - public int getServerProtocolVersion() throws Exception; + /** + * Get the server protocol version + * + * @return The server protocol integer + * @throws Exception If there is an error with getting this info, eg. not binded. + */ + int getServerProtocolVersion() throws Exception; - public String getEncoderName(); + /** + * Get the name of the encoder for then netty pipeline for this platform. + * + * @return The name + */ + String getEncoderName(); } diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java index 42739cf6f..84a927c0f 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java @@ -15,35 +15,122 @@ import java.util.logging.Logger; * @param - The player type for the platform, used for API related methods */ public interface ViaPlatform { + /** + * Get the logger for this platform + * + * @return Java Logger (may be a wrapper) + */ Logger getLogger(); + /** + * Get the platform name + * + * @return Platform Name (simply its name) + */ String getPlatformName(); + /** + * Get the plugin version + * + * @return Plugin version as a semver string + */ String getPluginVersion(); + /** + * Run a task Async + * + * @param runnable The task to run + * @return The Task ID + */ int runAsync(Runnable runnable); + /** + * Run a task Sync + * + * @param runnable The task to run + * @return The Task ID + */ int runSync(Runnable runnable); + /** + * Run a task at a repeating interval. + * Initial interval is the same as repeat. + * + * @param runnable The task to run + * @param ticks The interval to run it at + * @return The Task ID + */ int runRepeatingSync(Runnable runnable, Long ticks); + /** + * Cancel a task + * + * @param taskId The task ID to cancel + */ void cancelTask(int taskId); + /** + * Get the online players + * + * @return Array of ViaCommandSender + */ ViaCommandSender[] getOnlinePlayers(); + /** + * Send a message to a player + * + * @param uuid The player's UUID + * @param message The message to send + */ void sendMessage(UUID uuid, String message); + /** + * Kick a player for a reason + * + * @param uuid The player's UUID + * @param message The message to kick them with + * @return True if it was successful + */ boolean kickPlayer(UUID uuid, String message); + /** + * Check if the plugin is enabled. + * + * @return True if it is enabled + */ boolean isPluginEnabled(); + /** + * Get the API for this platform + * + * @return The API for the platform + */ ViaAPI getApi(); + /** + * Get the config API for this platform + * + * @return The config API + */ ViaVersionConfig getConf(); + /** + * Get the backend configuration provider for this platform. + * (On some platforms this returns the same as getConf()) + * + * @return The configuration provider + */ ConfigurationProvider getConfigurationProvider(); + /** + * Called when a reload happens + */ void onReload(); + /** + * Get the JSON data required for /viaversion dump + * + * @return The json data + */ JsonObject getDump(); } diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatformLoader.java b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatformLoader.java index c535e90cd..e8c4503bf 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatformLoader.java +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatformLoader.java @@ -1,5 +1,8 @@ package us.myles.ViaVersion.api.platform; public interface ViaPlatformLoader { - public void load(); + /** + * Initialise the loading for a platform, eg. registering listeners / providers / events etc. + */ + void load(); } diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/providers/ViaProviders.java b/common/src/main/java/us/myles/ViaVersion/api/platform/providers/ViaProviders.java index 6c60cc4f8..6911a5217 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/platform/providers/ViaProviders.java +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/providers/ViaProviders.java @@ -6,8 +6,8 @@ import java.util.List; import java.util.Map; public class ViaProviders { - private Map, Provider> providers = new HashMap<>(); - private List> lonelyProviders = new ArrayList<>(); + private final Map, Provider> providers = new HashMap<>(); + private final List> lonelyProviders = new ArrayList<>(); public void require(Class provider) { lonelyProviders.add(provider); diff --git a/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java index e28c32644..c2c5a8711 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java +++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java @@ -16,8 +16,8 @@ import java.util.List; import java.util.Map; public abstract class Protocol { - private Map, ProtocolPacket> incoming = new HashMap<>(); - private Map, ProtocolPacket> outgoing = new HashMap<>(); + private final Map, ProtocolPacket> incoming = new HashMap<>(); + private final Map, ProtocolPacket> outgoing = new HashMap<>(); public Protocol() { registerPackets(); diff --git a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java index 7c1f6c9b6..b736d88bb 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java +++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java @@ -20,10 +20,10 @@ public class ProtocolRegistry { public static final Protocol BASE_PROTOCOL = new BaseProtocol(); public static int SERVER_PROTOCOL = -1; // Input Version -> Output Version & Protocol (Allows fast lookup) - private static Map> registryMap = new ConcurrentHashMap<>(); - private static Map, List>> pathCache = new ConcurrentHashMap<>(); - private static List registerList = Lists.newCopyOnWriteArrayList(); - private static Set supportedVersions = Sets.newConcurrentHashSet(); + private static final Map> registryMap = new ConcurrentHashMap<>(); + private static final Map, List>> pathCache = new ConcurrentHashMap<>(); + private static final List registerList = Lists.newCopyOnWriteArrayList(); + private static final Set supportedVersions = Sets.newConcurrentHashSet(); static { // Base Protocol diff --git a/common/src/main/java/us/myles/ViaVersion/api/remapper/PacketRemapper.java b/common/src/main/java/us/myles/ViaVersion/api/remapper/PacketRemapper.java index c323e8aea..354f05614 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/remapper/PacketRemapper.java +++ b/common/src/main/java/us/myles/ViaVersion/api/remapper/PacketRemapper.java @@ -9,7 +9,7 @@ import java.util.ArrayList; import java.util.List; public abstract class PacketRemapper { - private List> valueRemappers = new ArrayList<>(); + private final List> valueRemappers = new ArrayList<>(); public PacketRemapper() { registerMap(); diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/types/version/Types1_8.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/version/Types1_8.java index cb0241801..49ca88fae 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/type/types/version/Types1_8.java +++ b/common/src/main/java/us/myles/ViaVersion/api/type/types/version/Types1_8.java @@ -9,10 +9,10 @@ public class Types1_8 { /** * Metadata list type for 1.8 */ - public static Type> METADATA_LIST = new MetadataList1_8Type(); + public static final Type> METADATA_LIST = new MetadataList1_8Type(); /** * Metadata type for 1.8 */ - public static Type METADATA = new Metadata1_8Type(); + public static final Type METADATA = new Metadata1_8Type(); } diff --git a/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java b/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java index ba7586cd8..1c93b3ebe 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java @@ -12,7 +12,7 @@ import us.myles.ViaVersion.commands.defaultsubs.*; import java.util.*; public abstract class ViaCommandHandler implements ViaVersionCommand { - private Map commandMap; + private final Map commandMap; public ViaCommandHandler() { commandMap = new HashMap<>(); @@ -49,14 +49,14 @@ public abstract class ViaCommandHandler implements ViaVersionCommand { } if (!hasSubCommand(args[0])) { - sender.sendMessage(color("&cThis command is not found")); + sender.sendMessage(color("&cThis commands is not found")); showHelp(sender); return false; } ViaSubCommand handler = getSubCommand(args[0]); if (!hasPermission(sender, handler.permission())) { - sender.sendMessage(color("&cYou are not allowed to use this command!")); + sender.sendMessage(color("&cYou are not allowed to use this commands!")); return false; } @@ -100,10 +100,14 @@ public abstract class ViaCommandHandler implements ViaVersionCommand { return output; } + /** + * Shows the ViaVersion help to a sender + * @param sender The sender to send the help to + */ public void showHelp(ViaCommandSender sender) { Set allowed = calculateAllowedCommands(sender); if (allowed.size() == 0) { - sender.sendMessage(color("&cYou are not allowed to use this command!")); + sender.sendMessage(color("&cYou are not allowed to use this commands!")); return; } sender.sendMessage(color("&aViaVersion &c" + Via.getPlatform().getPluginVersion())); @@ -137,6 +141,12 @@ public abstract class ViaCommandHandler implements ViaVersionCommand { registerSubCommand(new ReloadSubCmd()); } + /** + * Replaces colour codes in a string + * + * @param string String to replace + * @return The output String + */ public static String color(String string) { try { string = ChatColor.translateAlternateColorCodes('&', string); //Dont replace all & with $ like we did before. @@ -145,6 +155,13 @@ public abstract class ViaCommandHandler implements ViaVersionCommand { return string; } + /** + * Send a colour coded string with replacements to a user + * + * @param sender The target to send the message to + * @param message The message + * @param args The objects to replace + */ public static void sendMessage(@NonNull ViaCommandSender sender, String message, Object... args) { sender.sendMessage(color(args == null ? message : String.format(message, args))); } diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/PPSSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/PPSSubCmd.java index c46d4ccac..69890b3b5 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/PPSSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/PPSSubCmd.java @@ -32,8 +32,6 @@ public class PPSSubCmd extends ViaSubCommand { long max = 0; for (ViaCommandSender p : Via.getPlatform().getOnlinePlayers()) { - if (!Via.getAPI().isPorted(p.getUUID())) - continue; int playerVersion = Via.getAPI().getPlayerVersion(p.getUUID()); if (!playerVersions.containsKey(playerVersion)) playerVersions.put(playerVersion, new HashSet()); diff --git a/common/src/main/java/us/myles/ViaVersion/exception/InformativeException.java b/common/src/main/java/us/myles/ViaVersion/exception/InformativeException.java index 6599eb0a0..3cad1f55a 100644 --- a/common/src/main/java/us/myles/ViaVersion/exception/InformativeException.java +++ b/common/src/main/java/us/myles/ViaVersion/exception/InformativeException.java @@ -4,7 +4,7 @@ import java.util.HashMap; import java.util.Map; public class InformativeException extends Exception { - Map info = new HashMap<>(); + final Map info = new HashMap<>(); int sources = 0; public InformativeException(Throwable cause) { diff --git a/common/src/main/java/us/myles/ViaVersion/packets/PacketType.java b/common/src/main/java/us/myles/ViaVersion/packets/PacketType.java index 9aade55b8..b3077806b 100644 --- a/common/src/main/java/us/myles/ViaVersion/packets/PacketType.java +++ b/common/src/main/java/us/myles/ViaVersion/packets/PacketType.java @@ -140,8 +140,8 @@ public enum PacketType { PLAY_SET_COMPRESSION(State.PLAY, Direction.OUTGOING, 0x46, -1), PLAY_UPDATE_ENTITY_NBT(State.PLAY, Direction.OUTGOING, 0x49, -1); - private static HashMap oldids = new HashMap<>(); - private static HashMap newids = new HashMap<>(); + private static final HashMap oldids = new HashMap<>(); + private static final HashMap newids = new HashMap<>(); static { for (PacketType pt : PacketType.values()) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java b/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java index 8cab352fc..e454468bc 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java @@ -28,7 +28,7 @@ import java.util.UUID; import java.util.logging.Level; public class BaseProtocol extends Protocol { - private static Gson gson = new GsonBuilder().create(); // TODO: Possibly global gson provider? + private final static Gson gson = new GsonBuilder().create(); // TODO: Possibly global gson provider? @Override protected void registerPackets() { @@ -198,11 +198,6 @@ public class BaseProtocol extends Protocol { // Nothing gets added, ProtocolPipeline handles ProtocolInfo } - @Override - protected void registerListeners() { - - } - @Override public void transform(Direction direction, State state, PacketWrapper packetWrapper) throws Exception { super.transform(direction, state, packetWrapper); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_10to1_9_3/Protocol1_10To1_9_3_4.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_10to1_9_3/Protocol1_10To1_9_3_4.java index 70fbf44df..7d05cadc6 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_10to1_9_3/Protocol1_10To1_9_3_4.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_10to1_9_3/Protocol1_10To1_9_3_4.java @@ -23,13 +23,13 @@ public class Protocol1_10To1_9_3_4 extends Protocol { @Deprecated public static final Type METADATA = new Metadata1_9Type(); - public static ValueTransformer toNewPitch = new ValueTransformer(Type.FLOAT) { + public static final ValueTransformer toNewPitch = new ValueTransformer(Type.FLOAT) { @Override public Float transform(PacketWrapper wrapper, Short inputValue) throws Exception { return inputValue / 63.5F; } }; - public static ValueTransformer, List> transformMetadata = new ValueTransformer, List>(Types1_9.METADATA_LIST) { + public static final ValueTransformer, List> transformMetadata = new ValueTransformer, List>(Types1_9.METADATA_LIST) { @Override public List transform(PacketWrapper wrapper, List inputValue) throws Exception { List metaList = new CopyOnWriteArrayList<>(inputValue); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/ChunkSection1_9_3_4.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/ChunkSection1_9_3_4.java index 4ea0b0afb..ff3d9a9a0 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/ChunkSection1_9_3_4.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_1_2to1_9_3_4/chunks/ChunkSection1_9_3_4.java @@ -103,7 +103,7 @@ public class ChunkSection1_9_3_4 implements ChunkSection { * * * @param input The buffer to read from. - * @throws Exception + * @throws Exception If it fails to read */ public void readBlocks(ByteBuf input) throws Exception { palette.clear(); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/ChunkSection1_9_1_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/ChunkSection1_9_1_2.java index 17993598f..0e7ed30d9 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/ChunkSection1_9_1_2.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/ChunkSection1_9_1_2.java @@ -103,7 +103,7 @@ public class ChunkSection1_9_1_2 implements ChunkSection { * * * @param input The buffer to read from. - * @throws Exception + * @throws Exception If it failed to read properly */ public void readBlocks(ByteBuf input) throws Exception { palette.clear(); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/FakeTileEntity.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/FakeTileEntity.java index 620ab1e6a..62250aff1 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/FakeTileEntity.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/chunks/FakeTileEntity.java @@ -14,7 +14,7 @@ import java.util.concurrent.ConcurrentHashMap; * It requires now to have all tile entity data included in the chunk packet, otherwise it'll crash. */ public class FakeTileEntity { - private static Map tileEntities = new ConcurrentHashMap<>(); + private static final Map tileEntities = new ConcurrentHashMap<>(); static { register(Arrays.asList(61, 62), "Furnace"); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/types/Chunk1_9_1_2Type.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/types/Chunk1_9_1_2Type.java index 01dcd75db..a1459db83 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/types/Chunk1_9_1_2Type.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/types/Chunk1_9_1_2Type.java @@ -72,9 +72,7 @@ public class Chunk1_9_1_2Type extends PartialType { } @Override - public void write(ByteBuf output, ClientWorld world, Chunk input) throws Exception { - Chunk chunk = input; - + public void write(ByteBuf output, ClientWorld world, Chunk chunk) throws Exception { output.writeInt(chunk.getX()); output.writeInt(chunk.getZ()); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java index b99a8e433..9f3e30508 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java @@ -44,6 +44,12 @@ public enum ArmorType { private final int id; private final String type; + /** + * Find an armour type by the item id + * @param id ID of the item + * + * @return Return the ArmourType, ArmourType.NONE if not found + */ public static ArmorType findById(int id) { for (ArmorType a : ArmorType.values()) if (a.getId() == id) @@ -51,6 +57,12 @@ public enum ArmorType { return ArmorType.NONE; } + /** + * Find an armour type by the item string + * @param type String name for the item + * + * @return Return the ArmourType, ArmourType.NONE if not found + */ public static ArmorType findByType(String type) { for (ArmorType a : ArmorType.values()) if (a.getType().equals(type)) @@ -58,6 +70,11 @@ public enum ArmorType { return NONE; } + /** + * Check if an item id is armour + * @param id The item ID + * @return True if the item is a piece of armour + */ public static boolean isArmor(int id) { for (ArmorType a : ArmorType.values()) if (a.getId() == id) @@ -65,6 +82,11 @@ public enum ArmorType { return false; } + /** + * Check if an item id is armour + * @param type The item material name + * @return True if the item is a piece of armour + */ public static boolean isArmor(String type) { for (ArmorType a : ArmorType.values()) if (a.getType().equals(type)) @@ -72,6 +94,10 @@ public enum ArmorType { return false; } + /** + * Get the Minecraft ID for the Armour Type + * @return The ID + */ public int getId() { return this.id; } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java index 517ab5acb..4f4d33dda 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java @@ -28,8 +28,8 @@ public class Protocol1_9TO1_8 extends Protocol { @Deprecated public static Type METADATA = new Metadata1_8Type(); - private static Gson gson = new GsonBuilder().create(); - public static ValueTransformer FIX_JSON = new ValueTransformer(Type.STRING) { + private static final Gson gson = new GsonBuilder().create(); + public static final ValueTransformer FIX_JSON = new ValueTransformer(Type.STRING) { @Override public String transform(PacketWrapper wrapper, String line) { return fixJson(line); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chat/ChatRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chat/ChatRewriter.java index ad757c201..c26b460ef 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chat/ChatRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/chat/ChatRewriter.java @@ -6,6 +6,12 @@ import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.EntityTracker; public class ChatRewriter { + /** + * Rewrite chat being sent to the client so that gamemode issues don't occur. + * + * @param obj The json object being sent by the server + * @param user The player involved. (Required for Gamemode info) + */ public static void toClient(JsonObject obj, UserConnection user) { //Check gamemode change if (obj.get("translate") != null && obj.get("translate").getAsString().equals("gameMode.changed")) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/EntityPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/EntityPackets.java index 79235611a..e36317a60 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/EntityPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/EntityPackets.java @@ -20,7 +20,7 @@ import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.EntityTracker; import java.util.List; public class EntityPackets { - public static ValueTransformer toNewShort = new ValueTransformer(Type.SHORT) { + public static final ValueTransformer toNewShort = new ValueTransformer(Type.SHORT) { @Override public Short transform(PacketWrapper wrapper, Byte inputValue) { return (short) (inputValue * 128); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java index 5274c11f6..d3d905255 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java @@ -23,7 +23,7 @@ import java.util.ArrayList; import java.util.List; public class SpawnPackets { - public static ValueTransformer toNewDouble = new ValueTransformer(Type.DOUBLE) { + public static final ValueTransformer toNewDouble = new ValueTransformer(Type.DOUBLE) { @Override public Double transform(PacketWrapper wrapper, Integer inputValue) { return inputValue / 32D; diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java index aa8982a27..8a4ff5647 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java @@ -7,10 +7,23 @@ import java.util.Arrays; import java.util.List; public class BulkChunkTranslatorProvider implements Provider { + /** + * Transforms a Bulk Chunk packet into Chunk Packets + * + * @param packet The NMS Packet + * @param clientChunks The ClientChunks object for the current player + * @return A List of all the output packets + */ public List transformMapChunkBulk(Object packet, ClientChunks clientChunks) { return Arrays.asList(packet); } + /** + * Check if a packet of a class should be filtered + * + * @param packet NMS Packet + * @return True if it should be filtered into transformmapChunkBulk + */ public boolean isFiltered(Class packet) { return false; } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/Effect.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/Effect.java index b6a348e57..964ef9611 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/Effect.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/sounds/Effect.java @@ -4,7 +4,7 @@ import java.util.HashMap; public class Effect { - private static HashMap effects; + private final static HashMap effects; static { effects = new HashMap<>(); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java index 9fc8f18fb..294d7eee2 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java @@ -98,9 +98,7 @@ public class EntityTracker extends StoredObject { public boolean interactedBlockRecently(int x, int y, int z) { if (blockInteractions.size() == 0) return false; - Iterator it = blockInteractions.asMap().keySet().iterator(); - while (it.hasNext()) { - Position p = it.next(); + for (Position p : blockInteractions.asMap().keySet()) { if (p.getX() == x) if (p.getY() == y) if (p.getZ() == z) diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/PlaceBlockTracker.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/PlaceBlockTracker.java index a8ea3fe73..d3e5d718f 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/PlaceBlockTracker.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/PlaceBlockTracker.java @@ -16,10 +16,19 @@ public class PlaceBlockTracker extends StoredObject { super(user); } + /** + * Check if a certain amount of time has passed + * + * @param ms The amount of time in MS + * @return True if it has passed + */ public boolean isExpired(int ms) { return System.currentTimeMillis() > (lastPlaceTimestamp + ms); } + /** + * Set the last place time to the current time + */ public void updateTime() { lastPlaceTimestamp = System.currentTimeMillis(); } diff --git a/common/src/main/java/us/myles/ViaVersion/update/Version.java b/common/src/main/java/us/myles/ViaVersion/update/Version.java index f31784495..6ab1c0e3f 100644 --- a/common/src/main/java/us/myles/ViaVersion/update/Version.java +++ b/common/src/main/java/us/myles/ViaVersion/update/Version.java @@ -6,8 +6,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class Version implements Comparable { - private static Pattern semVer = Pattern.compile("(?0|[1-9]\\d*)\\.(?0|[1-9]\\d*)(?:\\.(?0|[1-9]\\d*))?(?:-(?[A-z0-9.-]*))?"); - private int[] parts = new int[3]; + private static final Pattern semVer = Pattern.compile("(?0|[1-9]\\d*)\\.(?0|[1-9]\\d*)(?:\\.(?0|[1-9]\\d*))?(?:-(?[A-z0-9.-]*))?"); + private final int[] parts = new int[3]; private String tag; public Version(String value) { @@ -24,6 +24,13 @@ public class Version implements Comparable { tag = matcher.group("tag") == null ? "" : matcher.group("tag"); } + /** + * Compare two versions + * + * @param verA The first version + * @param verB The second + * @return 0 if they are the same, 1 if versionA is newer, -1 if versionA is older + */ public static int compare(Version verA, Version verB) { if (verA == verB) return 0; if (verA == null) return -1; @@ -47,6 +54,13 @@ public class Version implements Comparable { return 0; } + /** + * Check if a version is the same + * + * @param verA The first + * @param verB The second + * @return True if they are the same + */ public static boolean equals(Version verA, Version verB) { return verA == verB || verA != null && verB != null && compare(verA, verB) == 0; } @@ -71,6 +85,11 @@ public class Version implements Comparable { return that instanceof Version && equals(this, (Version) that); } + /** + * Get the tag, eg. -ALPHA + * + * @return The version tag + */ public String getTag() { return tag; } diff --git a/common/src/main/java/us/myles/ViaVersion/util/PipelineUtil.java b/common/src/main/java/us/myles/ViaVersion/util/PipelineUtil.java index 84449596c..05b92e9d5 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/PipelineUtil.java +++ b/common/src/main/java/us/myles/ViaVersion/util/PipelineUtil.java @@ -32,6 +32,15 @@ public class PipelineUtil { } } + /** + * Call the decode method on a netty ByteToMessageDecoder + * + * @param decoder The decoder + * @param ctx The current context + * @param input The packet to decode + * @return A list of the decoders output + * @throws InvocationTargetException If an exception happens while executing + */ public static List callDecode(ByteToMessageDecoder decoder, ChannelHandlerContext ctx, Object input) throws InvocationTargetException { List output = new ArrayList<>(); try { @@ -42,6 +51,15 @@ public class PipelineUtil { return output; } + /** + * Call the encode method on a netty MessageToByteEncoder + * + * @param encoder The encoder + * @param ctx The current context + * @param msg The packet to encode + * @param output The bytebuf to write the output to + * @throws InvocationTargetException If an exception happens while executing + */ public static void callEncode(MessageToByteEncoder encoder, ChannelHandlerContext ctx, Object msg, ByteBuf output) throws InvocationTargetException { try { PipelineUtil.ENCODE_METHOD.invoke(encoder, ctx, msg, output); @@ -50,6 +68,13 @@ public class PipelineUtil { } } + /** + * Check if a stack trace contains a certain exception + * + * @param t The throwable + * @param c The exception to look for + * @return True if the stack trace contained it as its cause. + */ public static boolean containsCause(Throwable t, Class c) { while (t != null) { t = t.getCause(); @@ -59,6 +84,13 @@ public class PipelineUtil { return false; } + /** + * Get the context for a the channel handler before a certain name. + * + * @param name The name of the channel handler + * @param pipeline The pipeline to target + * @return The ChannelHandler before the one requested. + */ public static ChannelHandlerContext getContextBefore(String name, ChannelPipeline pipeline) { boolean mark = false; for (String s : pipeline.names()) { diff --git a/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java b/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java index 11854ee83..fb52fb9c1 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java +++ b/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java @@ -20,6 +20,13 @@ import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.dump.PluginInfo; import us.myles.ViaVersion.sponge.*; +import us.myles.ViaVersion.sponge.commands.SpongeCommandHandler; +import us.myles.ViaVersion.sponge.commands.SpongeCommandSender; +import us.myles.ViaVersion.sponge.platform.SpongeConfigAPI; +import us.myles.ViaVersion.sponge.platform.SpongeViaAPI; +import us.myles.ViaVersion.sponge.platform.SpongeViaInjector; +import us.myles.ViaVersion.sponge.platform.SpongeViaLoader; +import us.myles.ViaVersion.sponge.util.LoggerWrapper; import java.io.File; import java.util.ArrayList; diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeCommandHandler.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/commands/SpongeCommandHandler.java similarity index 97% rename from sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeCommandHandler.java rename to sponge/src/main/java/us/myles/ViaVersion/sponge/commands/SpongeCommandHandler.java index a87c03805..a28bcef55 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeCommandHandler.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/commands/SpongeCommandHandler.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.sponge; +package us.myles.ViaVersion.sponge.commands; import org.spongepowered.api.command.CommandCallable; import org.spongepowered.api.command.CommandException; diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeCommandSender.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/commands/SpongeCommandSender.java similarity index 95% rename from sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeCommandSender.java rename to sponge/src/main/java/us/myles/ViaVersion/sponge/commands/SpongeCommandSender.java index 68e66cb37..b095c90bf 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeCommandSender.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/commands/SpongeCommandSender.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.sponge; +package us.myles.ViaVersion.sponge.commands; import lombok.AllArgsConstructor; import org.spongepowered.api.command.CommandSource; diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeBossBar.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeBossBar.java similarity index 95% rename from sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeBossBar.java rename to sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeBossBar.java index ae29531c7..df03b6d31 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeBossBar.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeBossBar.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.sponge; +package us.myles.ViaVersion.sponge.platform; import lombok.Getter; import org.spongepowered.api.entity.living.player.Player; diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeConfigAPI.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeConfigAPI.java similarity index 99% rename from sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeConfigAPI.java rename to sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeConfigAPI.java index e94282226..e2ad17622 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeConfigAPI.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeConfigAPI.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.sponge; +package us.myles.ViaVersion.sponge.platform; import org.yaml.snakeyaml.Yaml; import us.myles.ViaVersion.api.ViaVersionConfig; diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaAPI.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaAPI.java similarity index 98% rename from sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaAPI.java rename to sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaAPI.java index 769081be2..c23452b80 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaAPI.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaAPI.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.sponge; +package us.myles.ViaVersion.sponge.platform; import io.netty.buffer.ByteBuf; import lombok.NonNull; diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaInjector.java similarity index 99% rename from sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java rename to sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaInjector.java index cfedde3a3..819248415 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaInjector.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaInjector.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.sponge; +package us.myles.ViaVersion.sponge.platform; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandler; diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaLoader.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaLoader.java similarity index 98% rename from sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaLoader.java rename to sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaLoader.java index deb5e97de..ae6e123cd 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/SpongeViaLoader.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaLoader.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.sponge; +package us.myles.ViaVersion.sponge.platform; import lombok.AllArgsConstructor; import org.spongepowered.api.Sponge; diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/LoggerWrapper.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/util/LoggerWrapper.java similarity index 98% rename from sponge/src/main/java/us/myles/ViaVersion/sponge/LoggerWrapper.java rename to sponge/src/main/java/us/myles/ViaVersion/sponge/util/LoggerWrapper.java index 63050bf9a..8c69bf2d4 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/LoggerWrapper.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/util/LoggerWrapper.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.sponge; +package us.myles.ViaVersion.sponge.util; import org.slf4j.Logger; From d5108061c1f226a5590f621b3a4186e5bd97eb4d Mon Sep 17 00:00:00 2001 From: Myles Date: Tue, 27 Sep 2016 17:38:56 +0100 Subject: [PATCH 39/76] Implement World Change --- .../protocol1_9to1_8/ArmorListener.java | 19 +++++++++---------- .../protocol1_9to1_8/BlockListener.java | 2 +- .../CommandBlockListener.java | 2 +- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/ArmorListener.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/ArmorListener.java index 5c8924e00..2b6460f99 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/ArmorListener.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/ArmorListener.java @@ -3,6 +3,7 @@ package us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8; import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.action.InteractEvent; +import org.spongepowered.api.event.entity.DisplaceEntityEvent; import org.spongepowered.api.event.entity.living.humanoid.player.RespawnPlayerEvent; import org.spongepowered.api.event.filter.cause.Root; import org.spongepowered.api.event.item.inventory.ClickInventoryEvent; @@ -34,8 +35,6 @@ public class ArmorListener extends ViaSpongeListener { int armor = 0; - - // TODO is there a method like getArmorContents? armor += calculate(player.getHelmet()); armor += calculate(player.getChestplate()); armor += calculate(player.getLeggings()); @@ -91,17 +90,17 @@ public class ArmorListener extends ViaSpongeListener { @Listener public void onRespawn(RespawnPlayerEvent e) { - if (!isOnPipe(e.getTargetEntity().getUniqueId())) return; - sendDelayedArmorUpdate(e.getTargetEntity()); } - // TODO find world change event -// @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) -// public void onWorldChange(PlayerChangedWorldEvent e) { -// sendArmorUpdate(e.getPlayer()); -// } -// + @Listener + public void onWorldChange(DisplaceEntityEvent.Teleport e) { + if (!(e.getTargetEntity() instanceof Player)) return; + if (!e.getFromTransform().getExtent().getUniqueId().equals(e.getToTransform().getExtent().getUniqueId())) { + sendArmorUpdate((Player) e.getTargetEntity()); + } + } + public void sendDelayedArmorUpdate(final Player player) { if (!isOnPipe(player.getUniqueId())) return; // Don't start a task if the player is not on the pipe Via.getPlatform().runSync(new Runnable() { diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/BlockListener.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/BlockListener.java index 5019e32d4..482554866 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/BlockListener.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/BlockListener.java @@ -17,7 +17,7 @@ public class BlockListener extends ViaSpongeListener { super(plugin, Protocol1_9TO1_8.class); } - @Listener // TODO is there better way to do this? + @Listener public void placeBlock(ChangeBlockEvent.Place e, @Root Player player) { if (isOnPipe(player.getUniqueId())) { Location loc = e.getTransactions().get(0).getFinal().getLocation().get(); diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/CommandBlockListener.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/CommandBlockListener.java index 610385503..0027f17a2 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/CommandBlockListener.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/CommandBlockListener.java @@ -30,7 +30,7 @@ import java.io.DataOutputStream; import java.lang.reflect.Method; import java.util.Optional; -// TODO Change to bytebuf to not use reflection bullshit? +// TODO Change to bytebuf to not use reflection bullsh*t public class CommandBlockListener extends ViaSpongeListener { public CommandBlockListener(SpongePlugin plugin) { super(plugin, Protocol1_9TO1_8.class); From 866e494d3c9857e143185246519b8b9e5881f661 Mon Sep 17 00:00:00 2001 From: Myles Date: Tue, 27 Sep 2016 17:48:56 +0100 Subject: [PATCH 40/76] Remove Commons --- common/src/main/java/us/myles/ViaVersion/api/Via.java | 8 ++++---- .../main/java/us/myles/ViaVersion/api/boss/BossBar.java | 7 +++---- .../main/java/us/myles/ViaVersion/boss/CommonBoss.java | 8 ++++---- .../us/myles/ViaVersion/commands/ViaCommandHandler.java | 4 ++-- .../us/myles/ViaVersion/protocols/base/BaseProtocol.java | 5 +++-- .../src/main/java/us/myles/ViaVersion/update/Version.java | 4 ++-- jar/pom.xml | 4 ---- pom.xml | 8 -------- 8 files changed, 18 insertions(+), 30 deletions(-) diff --git a/common/src/main/java/us/myles/ViaVersion/api/Via.java b/common/src/main/java/us/myles/ViaVersion/api/Via.java index 62b592bad..6339ef84e 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/Via.java +++ b/common/src/main/java/us/myles/ViaVersion/api/Via.java @@ -1,7 +1,7 @@ package us.myles.ViaVersion.api; +import com.google.common.base.Preconditions; import lombok.Getter; -import org.apache.commons.lang.Validate; import us.myles.ViaVersion.ViaManager; import us.myles.ViaVersion.api.platform.ViaPlatform; @@ -17,7 +17,7 @@ public class Via { * @param viaManager The ViaManager */ public static void init(ViaManager viaManager) { - Validate.isTrue(manager == null, "ViaManager is already set"); + Preconditions.checkArgument(manager == null, "ViaManager is already set"); Via.platform = viaManager.getPlatform(); Via.manager = viaManager; @@ -29,7 +29,7 @@ public class Via { * @return API instance */ public static ViaAPI getAPI() { - Validate.isTrue(platform != null, "ViaVersion has not loaded the Platform"); + Preconditions.checkArgument(platform != null, "ViaVersion has not loaded the Platform"); return Via.platform.getApi(); } @@ -39,7 +39,7 @@ public class Via { * @return Config instance */ public static ViaVersionConfig getConfig() { - Validate.isTrue(platform != null, "ViaVersion has not loaded the Platform"); + Preconditions.checkArgument(platform != null, "ViaVersion has not loaded the Platform"); return Via.platform.getConf(); } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java b/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java index da4c519ad..76737c23b 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java +++ b/common/src/main/java/us/myles/ViaVersion/api/boss/BossBar.java @@ -1,6 +1,5 @@ package us.myles.ViaVersion.api.boss; -import org.apache.commons.lang.NotImplementedException; import us.myles.ViaVersion.api.Via; import java.util.Set; @@ -76,7 +75,7 @@ public abstract class BossBar { */ @Deprecated public BossBar addPlayer(T player) { - throw new NotImplementedException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName()); + throw new UnsupportedOperationException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName()); } /** @@ -96,7 +95,7 @@ public abstract class BossBar { */ @Deprecated public BossBar addPlayers(T... players) { - throw new NotImplementedException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName()); + throw new UnsupportedOperationException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName()); } /** @@ -108,7 +107,7 @@ public abstract class BossBar { */ @Deprecated public BossBar removePlayer(T player) { - throw new NotImplementedException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName()); + throw new UnsupportedOperationException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName()); } /** diff --git a/common/src/main/java/us/myles/ViaVersion/boss/CommonBoss.java b/common/src/main/java/us/myles/ViaVersion/boss/CommonBoss.java index f43538a52..7cc89d0c5 100644 --- a/common/src/main/java/us/myles/ViaVersion/boss/CommonBoss.java +++ b/common/src/main/java/us/myles/ViaVersion/boss/CommonBoss.java @@ -1,11 +1,11 @@ package us.myles.ViaVersion.boss; +import com.google.common.base.Preconditions; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import lombok.Getter; import lombok.NonNull; import lombok.RequiredArgsConstructor; -import org.apache.commons.lang.Validate; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.boss.BossBar; import us.myles.ViaVersion.api.boss.BossColor; @@ -29,8 +29,8 @@ public abstract class CommonBoss extends BossBar { private Set flags; public CommonBoss(String title, float health, BossColor color, BossStyle style) { - Validate.notNull(title, "Title cannot be null"); - Validate.isTrue((health >= 0 && health <= 1), "Health must be between 0 and 1"); + Preconditions.checkNotNull(title, "Title cannot be null"); + Preconditions.checkArgument((health >= 0 && health <= 1), "Health must be between 0 and 1"); this.uuid = UUID.randomUUID(); this.title = title; @@ -51,7 +51,7 @@ public abstract class CommonBoss extends BossBar { @Override public BossBar setHealth(float health) { - Validate.isTrue((health >= 0 && health <= 1), "Health must be between 0 and 1"); + Preconditions.checkArgument((health >= 0 && health <= 1), "Health must be between 0 and 1"); this.health = health; sendPacket(CommonBoss.UpdateAction.UPDATE_HEALTH); return this; diff --git a/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java b/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java index 1c93b3ebe..f4774baa2 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java @@ -1,8 +1,8 @@ package us.myles.ViaVersion.commands; +import com.google.common.base.Preconditions; import lombok.NonNull; import net.md_5.bungee.api.ChatColor; -import org.apache.commons.lang.Validate; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; @@ -25,7 +25,7 @@ public abstract class ViaCommandHandler implements ViaVersionCommand { @Override public void registerSubCommand(@NonNull ViaSubCommand command) throws Exception { - Validate.isTrue(command.name().matches("^[a-z0-9_-]{3,15}$"), command.name() + " is not a valid subcommand name"); + Preconditions.checkArgument(command.name().matches("^[a-z0-9_-]{3,15}$"), command.name() + " is not a valid subcommand name"); if (hasSubCommand(command.name())) throw new Exception("ViaSubCommand " + command.name() + " does already exists!"); //Maybe another exception later. commandMap.put(command.name().toLowerCase(), command); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java b/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java index e454468bc..f6130020b 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java @@ -1,5 +1,7 @@ package us.myles.ViaVersion.protocols.base; +import com.google.common.base.Joiner; +import com.google.common.base.Strings; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; @@ -8,7 +10,6 @@ import io.netty.channel.ChannelFuture; import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; import net.md_5.bungee.api.ChatColor; -import org.apache.commons.lang.StringUtils; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Via; @@ -110,7 +111,7 @@ public class BaseProtocol extends Protocol { new Object[]{ wrapper.get(Type.STRING, 1), info.getProtocolVersion(), - StringUtils.join(info.getPipeline().pipes(), ", ") + Joiner.on(", ").join(info.getPipeline().pipes(), ", ") }); } } diff --git a/common/src/main/java/us/myles/ViaVersion/update/Version.java b/common/src/main/java/us/myles/ViaVersion/update/Version.java index 6ab1c0e3f..c15609523 100644 --- a/common/src/main/java/us/myles/ViaVersion/update/Version.java +++ b/common/src/main/java/us/myles/ViaVersion/update/Version.java @@ -1,6 +1,6 @@ package us.myles.ViaVersion.update; -import org.apache.commons.lang.StringUtils; +import com.google.common.base.Joiner; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -72,7 +72,7 @@ public class Version implements Comparable { for (int i = 0; i < parts.length; i += 1) split[i] = String.valueOf(parts[i]); - return StringUtils.join(split, ".") + (tag.length() != 0 ? "-" + tag : ""); + return Joiner.on(".").join(split) + (tag.length() != 0 ? "-" + tag : ""); } @Override diff --git a/jar/pom.xml b/jar/pom.xml index 36f1ac584..8a13e4d97 100644 --- a/jar/pom.xml +++ b/jar/pom.xml @@ -57,10 +57,6 @@ org.javassist us.myles.viaversion.libs.javassist - - org.apache - us.myles.viaversion.libs.apache - diff --git a/pom.xml b/pom.xml index 5e478606b..6f0b6387c 100644 --- a/pom.xml +++ b/pom.xml @@ -100,14 +100,6 @@ true - - - commons-lang - commons-lang - 2.6 - compile - - net.md-5 From 8ea3623a79e6e343c5efdede4a21c0d98334762a Mon Sep 17 00:00:00 2001 From: Matsv Date: Tue, 27 Sep 2016 19:15:39 +0200 Subject: [PATCH 41/76] Stop using new Gson() everywhere (#505) --- .../us/myles/ViaVersion/ViaVersionPlugin.java | 6 +-- .../commands/defaultsubs/DumpSubCmd.java | 8 ++-- .../protocols/base/BaseProtocol.java | 11 ++---- .../protocol1_9to1_8/Protocol1_9TO1_8.java | 37 +++++++++---------- .../myles/ViaVersion/update/UpdateUtil.java | 6 +-- .../us/myles/ViaVersion/util/EntityUtil.java | 1 + .../us/myles/ViaVersion/util/GsonUtil.java | 31 ++++++++++++++++ .../us/myles/ViaVersion/SpongePlugin.java | 6 +-- 8 files changed, 64 insertions(+), 42 deletions(-) create mode 100644 common/src/main/java/us/myles/ViaVersion/util/GsonUtil.java diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 72d7cacb2..9cc8ef380 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -1,6 +1,5 @@ package us.myles.ViaVersion; -import com.google.gson.Gson; import com.google.gson.JsonObject; import lombok.Getter; import org.bukkit.Bukkit; @@ -20,8 +19,9 @@ import us.myles.ViaVersion.bukkit.commands.BukkitCommandSender; import us.myles.ViaVersion.bukkit.platform.BukkitViaAPI; import us.myles.ViaVersion.bukkit.platform.BukkitViaInjector; import us.myles.ViaVersion.bukkit.platform.BukkitViaLoader; -import us.myles.ViaVersion.dump.PluginInfo; import us.myles.ViaVersion.bukkit.util.NMSUtil; +import us.myles.ViaVersion.dump.PluginInfo; +import us.myles.ViaVersion.util.GsonUtil; import java.util.ArrayList; import java.util.List; @@ -240,7 +240,7 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { for (Plugin p : Bukkit.getPluginManager().getPlugins()) plugins.add(new PluginInfo(p.isEnabled(), p.getDescription().getName(), p.getDescription().getVersion(), p.getDescription().getMain(), p.getDescription().getAuthors())); - platformSpecific.add("plugins", new Gson().toJsonTree(plugins)); + platformSpecific.add("plugins", GsonUtil.getGson().toJsonTree(plugins)); // TODO more? ProtocolLib things etc? return platformSpecific; diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java index 9938cab8a..afe0ac19f 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java @@ -1,7 +1,5 @@ package us.myles.ViaVersion.commands.defaultsubs; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import net.md_5.bungee.api.ChatColor; import us.myles.ViaVersion.api.Via; @@ -10,6 +8,7 @@ import us.myles.ViaVersion.api.command.ViaSubCommand; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.dump.DumpTemplate; import us.myles.ViaVersion.dump.VersionInfo; +import us.myles.ViaVersion.util.GsonUtil; import java.io.InputStreamReader; import java.io.InvalidObjectException; @@ -21,7 +20,6 @@ import java.util.Map; import java.util.logging.Level; public class DumpSubCmd extends ViaSubCommand { - private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); @Override public String name() { @@ -59,10 +57,10 @@ public class DumpSubCmd extends ViaSubCommand { con.setDoOutput(true); OutputStream out = con.getOutputStream(); - out.write(gson.toJson(template).getBytes(Charset.forName("UTF-8"))); + out.write(GsonUtil.getGson().toJson(template).getBytes(Charset.forName("UTF-8"))); out.close(); - JsonObject output = gson.fromJson(new InputStreamReader(con.getInputStream()), JsonObject.class); + JsonObject output = GsonUtil.getGson().fromJson(new InputStreamReader(con.getInputStream()), JsonObject.class); con.getInputStream().close(); if (!output.has("key")) diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java b/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java index f6130020b..c95b51fba 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java @@ -1,9 +1,6 @@ package us.myles.ViaVersion.protocols.base; import com.google.common.base.Joiner; -import com.google.common.base.Strings; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import io.netty.channel.ChannelFuture; @@ -23,13 +20,13 @@ import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.packets.Direction; import us.myles.ViaVersion.packets.State; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; +import us.myles.ViaVersion.util.GsonUtil; import java.util.List; import java.util.UUID; import java.util.logging.Level; public class BaseProtocol extends Protocol { - private final static Gson gson = new GsonBuilder().create(); // TODO: Possibly global gson provider? @Override protected void registerPackets() { @@ -46,12 +43,12 @@ public class BaseProtocol extends Protocol { ProtocolInfo info = wrapper.user().get(ProtocolInfo.class); String originalStatus = wrapper.get(Type.STRING, 0); try { - JsonObject json = gson.fromJson(originalStatus, JsonObject.class); + JsonObject json = GsonUtil.getGson().fromJson(originalStatus, JsonObject.class); JsonObject version = json.get("version").getAsJsonObject(); int protocolVersion = ((Long) version.get("protocol").getAsLong()).intValue(); if (Via.getConfig().isSendSupportedVersions()) //Send supported versions - version.add("supportedVersions", gson.toJsonTree(Via.getAPI().getSupportedVersions())); + version.add("supportedVersions", GsonUtil.getGson().toJsonTree(Via.getAPI().getSupportedVersions())); if (ProtocolRegistry.SERVER_PROTOCOL == -1) // Set the Server protocol if the detection on startup failed ProtocolRegistry.SERVER_PROTOCOL = protocolVersion; @@ -70,7 +67,7 @@ public class BaseProtocol extends Protocol { if (Via.getConfig().getBlockedProtocols().contains(info.getProtocolVersion())) version.addProperty("protocol", -1); // Show blocked versions as outdated - wrapper.set(Type.STRING, 0, gson.toJson(json)); // Update value + wrapper.set(Type.STRING, 0, GsonUtil.getGson().toJson(json)); // Update value } catch (JsonParseException e) { e.printStackTrace(); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java index 4f4d33dda..ed8a0e456 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java @@ -1,7 +1,5 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Via; @@ -19,22 +17,21 @@ import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTransla import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.HandItemProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.*; +import us.myles.ViaVersion.util.GsonUtil; import java.util.List; public class Protocol1_9TO1_8 extends Protocol { - @Deprecated - public static Type> METADATA_LIST = new MetadataList1_8Type(); - @Deprecated - public static Type METADATA = new Metadata1_8Type(); - - private static final Gson gson = new GsonBuilder().create(); public static final ValueTransformer FIX_JSON = new ValueTransformer(Type.STRING) { @Override public String transform(PacketWrapper wrapper, String line) { return fixJson(line); } }; + @Deprecated + public static Type> METADATA_LIST = new MetadataList1_8Type(); + @Deprecated + public static Type METADATA = new Metadata1_8Type(); public static String fixJson(String line) { if (line == null || line.equalsIgnoreCase("null")) { @@ -48,7 +45,7 @@ public class Protocol1_9TO1_8 extends Protocol { } } try { - gson.fromJson(line, JsonObject.class); + GsonUtil.getGson().fromJson(line, JsonObject.class); } catch (Exception e) { if (Via.getConfig().isForceJsonTransform()) { return constructJson(line); @@ -63,13 +60,23 @@ public class Protocol1_9TO1_8 extends Protocol { private static String constructJson(String text) { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("text", text); - return gson.toJson(jsonObject); + return GsonUtil.getGson().toJson(jsonObject); } public static Item getHandItem(final UserConnection info) { return Via.getManager().getProviders().get(HandItemProvider.class).getHandItem(info); } + public static boolean isSword(int id) { + if (id == 267) return true; // Iron + if (id == 268) return true; // Wood + if (id == 272) return true; // Stone + if (id == 276) return true; // Diamond + if (id == 283) return true; // Gold + + return false; + } + @Override protected void registerPackets() { SpawnPackets.register(this); @@ -113,14 +120,4 @@ public class Protocol1_9TO1_8 extends Protocol { // Place block tracker userConnection.put(new PlaceBlockTracker(userConnection)); } - - public static boolean isSword(int id) { - if (id == 267) return true; // Iron - if (id == 268) return true; // Wood - if (id == 272) return true; // Stone - if (id == 276) return true; // Diamond - if (id == 283) return true; // Gold - - return false; - } } diff --git a/common/src/main/java/us/myles/ViaVersion/update/UpdateUtil.java b/common/src/main/java/us/myles/ViaVersion/update/UpdateUtil.java index 254d5919b..32abb3d5a 100644 --- a/common/src/main/java/us/myles/ViaVersion/update/UpdateUtil.java +++ b/common/src/main/java/us/myles/ViaVersion/update/UpdateUtil.java @@ -1,11 +1,10 @@ package us.myles.ViaVersion.update; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import net.md_5.bungee.api.ChatColor; import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.util.GsonUtil; import java.io.BufferedReader; import java.io.IOException; @@ -21,7 +20,6 @@ public class UpdateUtil { private final static String URL = "http://api.spiget.org/v2/resources/"; private final static int PLUGIN = 19254; private final static String LATEST_VERSION = "/versions/latest"; - private final static Gson gson = new GsonBuilder().create(); public static void sendUpdateMessage(final UUID uuid) { Via.getPlatform().runAsync(new Runnable() { @@ -108,7 +106,7 @@ public class UpdateUtil { br.close(); JsonObject statistics; try { - statistics = gson.fromJson(content, JsonObject.class); + statistics = GsonUtil.getGson().fromJson(content, JsonObject.class); } catch (JsonParseException e) { e.printStackTrace(); return null; diff --git a/common/src/main/java/us/myles/ViaVersion/util/EntityUtil.java b/common/src/main/java/us/myles/ViaVersion/util/EntityUtil.java index d1a3075dd..1daa36912 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/EntityUtil.java +++ b/common/src/main/java/us/myles/ViaVersion/util/EntityUtil.java @@ -5,6 +5,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import us.myles.ViaVersion.api.Via; +// 1.10 Entity / Object ids public class EntityUtil { public static EntityType getTypeFromID(int typeID, boolean isObject) { diff --git a/common/src/main/java/us/myles/ViaVersion/util/GsonUtil.java b/common/src/main/java/us/myles/ViaVersion/util/GsonUtil.java new file mode 100644 index 000000000..b60c6f9e0 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/util/GsonUtil.java @@ -0,0 +1,31 @@ +package us.myles.ViaVersion.util; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import lombok.Getter; +import lombok.experimental.UtilityClass; + +@UtilityClass +@Getter +public class GsonUtil { + private final Gson gson = getGsonBuilder().create(); + + /** + * Get google's Gson magic + * + * @return Gson instance + */ + public Gson getGson() { + return gson; + } + + /** + * Get the GsonBuilder in case you want to add other stuff + * + * @return GsonBuilder instance + */ + public GsonBuilder getGsonBuilder() { + return new GsonBuilder(); + } + +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java b/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java index fb52fb9c1..d2725bf6e 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java +++ b/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java @@ -1,6 +1,5 @@ package us.myles.ViaVersion; -import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.inject.Inject; import org.spongepowered.api.Game; @@ -19,7 +18,7 @@ import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.dump.PluginInfo; -import us.myles.ViaVersion.sponge.*; +import us.myles.ViaVersion.sponge.VersionInfo; import us.myles.ViaVersion.sponge.commands.SpongeCommandHandler; import us.myles.ViaVersion.sponge.commands.SpongeCommandSender; import us.myles.ViaVersion.sponge.platform.SpongeConfigAPI; @@ -27,6 +26,7 @@ import us.myles.ViaVersion.sponge.platform.SpongeViaAPI; import us.myles.ViaVersion.sponge.platform.SpongeViaInjector; import us.myles.ViaVersion.sponge.platform.SpongeViaLoader; import us.myles.ViaVersion.sponge.util.LoggerWrapper; +import us.myles.ViaVersion.util.GsonUtil; import java.io.File; import java.util.ArrayList; @@ -190,7 +190,7 @@ public class SpongePlugin implements ViaPlatform { p.getAuthors() )); } - platformSpecific.add("plugins", new Gson().toJsonTree(plugins)); + platformSpecific.add("plugins", GsonUtil.getGson().toJsonTree(plugins)); return platformSpecific; } From 045416958808a362e278e4d81baf3eb016dcd216 Mon Sep 17 00:00:00 2001 From: Matsv Date: Tue, 27 Sep 2016 19:38:13 +0200 Subject: [PATCH 42/76] Add viaver alias --- .../java/us/myles/ViaVersion/bungee/commands/BungeeCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommand.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommand.java index 933fe75f8..b2a2b4137 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommand.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommand.java @@ -7,7 +7,7 @@ public class BungeeCommand extends Command { private final BungeeCommandHandler handler; public BungeeCommand(BungeeCommandHandler handler) { - super("viaversion"); // TODO PERMS HERE + super("viaversion", "", "viaver"); // The CommandHandler will handle the permission this.handler = handler; } From 36301a595b8aabe6905f65ae0bf78c2a22eae6e4 Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 29 Sep 2016 15:25:18 +0100 Subject: [PATCH 43/76] Fix Bungee Support (Excluding Chunks) + Rename Handlers --- .../BasicHandlerConstructor.java | 12 ++-- .../bukkit/classgenerator/ClassGenerator.java | 16 +++--- ...zer.java => BukkitChannelInitializer.java} | 6 +- ...eHandler.java => BukkitDecodeHandler.java} | 4 +- ...eHandler.java => BukkitEncodeHandler.java} | 4 +- ...tHandler.java => BukkitPacketHandler.java} | 4 +- .../bukkit/platform/BukkitViaInjector.java | 8 +-- ...zer.java => BungeeChannelInitializer.java} | 21 +++---- ...eHandler.java => BungeeDecodeHandler.java} | 42 +++----------- ...eHandler.java => BungeeEncodeHandler.java} | 56 +++++++++---------- .../bungee/handlers/ViaPacketHandler.java | 35 ------------ .../bungee/platform/BungeeViaInjector.java | 6 +- .../bungee/util/BungeePipelineUtil.java | 31 ++++++++-- ...zer.java => SpongeChannelInitializer.java} | 10 ++-- ...eHandler.java => SpongeDecodeHandler.java} | 4 +- ...eHandler.java => SpongeEncodeHandler.java} | 4 +- ...tHandler.java => SpongePacketHandler.java} | 4 +- .../sponge/platform/SpongeViaInjector.java | 8 +-- 18 files changed, 115 insertions(+), 160 deletions(-) rename bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/{ViaVersionInitializer.java => BukkitChannelInitializer.java} (89%) rename bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/{ViaDecodeHandler.java => BukkitDecodeHandler.java} (95%) rename bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/{ViaEncodeHandler.java => BukkitEncodeHandler.java} (94%) rename bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/{ViaPacketHandler.java => BukkitPacketHandler.java} (91%) rename bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/{ViaVersionInitializer.java => BungeeChannelInitializer.java} (52%) rename bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/{ViaDecodeHandler.java => BungeeDecodeHandler.java} (62%) rename bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/{ViaEncodeHandler.java => BungeeEncodeHandler.java} (55%) delete mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaPacketHandler.java rename sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/{ViaVersionInitializer.java => SpongeChannelInitializer.java} (74%) rename sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/{ViaDecodeHandler.java => SpongeDecodeHandler.java} (95%) rename sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/{ViaEncodeHandler.java => SpongeEncodeHandler.java} (93%) rename sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/{ViaPacketHandler.java => SpongePacketHandler.java} (91%) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/BasicHandlerConstructor.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/BasicHandlerConstructor.java index 7ef143b6d..d7908de01 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/BasicHandlerConstructor.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/BasicHandlerConstructor.java @@ -3,17 +3,17 @@ package us.myles.ViaVersion.bukkit.classgenerator; import io.netty.handler.codec.ByteToMessageDecoder; import io.netty.handler.codec.MessageToByteEncoder; import us.myles.ViaVersion.api.data.UserConnection; -import us.myles.ViaVersion.bukkit.handlers.ViaDecodeHandler; -import us.myles.ViaVersion.bukkit.handlers.ViaEncodeHandler; +import us.myles.ViaVersion.bukkit.handlers.BukkitDecodeHandler; +import us.myles.ViaVersion.bukkit.handlers.BukkitEncodeHandler; public class BasicHandlerConstructor implements HandlerConstructor { @Override - public ViaEncodeHandler newEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) { - return new ViaEncodeHandler(info, minecraftEncoder); + public BukkitEncodeHandler newEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) { + return new BukkitEncodeHandler(info, minecraftEncoder); } @Override - public ViaDecodeHandler newDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) { - return new ViaDecodeHandler(info, minecraftDecoder); + public BukkitDecodeHandler newDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) { + return new BukkitDecodeHandler(info, minecraftDecoder); } } diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/ClassGenerator.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/ClassGenerator.java index 95d25daa4..ea4137a0a 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/ClassGenerator.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/ClassGenerator.java @@ -6,8 +6,8 @@ import javassist.expr.ExprEditor; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; import us.myles.ViaVersion.api.ViaVersion; -import us.myles.ViaVersion.bukkit.handlers.ViaDecodeHandler; -import us.myles.ViaVersion.bukkit.handlers.ViaEncodeHandler; +import us.myles.ViaVersion.bukkit.handlers.BukkitDecodeHandler; +import us.myles.ViaVersion.bukkit.handlers.BukkitEncodeHandler; import us.myles.ViaVersion.bukkit.util.NMSUtil; public class ClassGenerator { @@ -30,14 +30,14 @@ public class ClassGenerator { Class decodeSuper = NMSUtil.nms("PacketDecoder"); Class encodeSuper = NMSUtil.nms("PacketEncoder"); // Generate the classes - addSpigotCompatibility(pool, ViaDecodeHandler.class, decodeSuper); - addSpigotCompatibility(pool, ViaEncodeHandler.class, encodeSuper); + addSpigotCompatibility(pool, BukkitDecodeHandler.class, decodeSuper); + addSpigotCompatibility(pool, BukkitEncodeHandler.class, encodeSuper); } else { Class decodeSuper = Class.forName(getPSPackage() + ".wrapped.WrappedDecoder"); Class encodeSuper = Class.forName(getPSPackage() + ".wrapped.WrappedEncoder"); // Generate the classes - addPSCompatibility(pool, ViaDecodeHandler.class, decodeSuper); - addPSCompatibility(pool, ViaEncodeHandler.class, encodeSuper); + addPSCompatibility(pool, BukkitDecodeHandler.class, decodeSuper); + addPSCompatibility(pool, BukkitEncodeHandler.class, encodeSuper); } @@ -53,10 +53,10 @@ public class ClassGenerator { pool.importPackage("io.netty.handler.codec"); // Implement Methods generated.addMethod(CtMethod.make("public MessageToByteEncoder newEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) {\n" + - " return new ViaEncodeHandler(info, minecraftEncoder);\n" + + " return new BukkitEncodeHandler(info, minecraftEncoder);\n" + " }", generated)); generated.addMethod(CtMethod.make("public ByteToMessageDecoder newDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) {\n" + - " return new ViaDecodeHandler(info, minecraftDecoder);\n" + + " return new BukkitDecodeHandler(info, minecraftDecoder);\n" + " }", generated)); constructor = (HandlerConstructor) generated.toClass(HandlerConstructor.class.getClassLoader()).newInstance(); diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaVersionInitializer.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitChannelInitializer.java similarity index 89% rename from bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaVersionInitializer.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitChannelInitializer.java index 716e38310..a4529ad3a 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaVersionInitializer.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitChannelInitializer.java @@ -12,12 +12,12 @@ import us.myles.ViaVersion.bukkit.classgenerator.HandlerConstructor; import java.lang.reflect.Method; -public class ViaVersionInitializer extends ChannelInitializer { +public class BukkitChannelInitializer extends ChannelInitializer { private final ChannelInitializer original; private Method method; - public ViaVersionInitializer(ChannelInitializer oldInit) { + public BukkitChannelInitializer(ChannelInitializer oldInit) { this.original = oldInit; try { this.method = ChannelInitializer.class.getDeclaredMethod("initChannel", Channel.class); @@ -43,7 +43,7 @@ public class ViaVersionInitializer extends ChannelInitializer { // Add our transformers MessageToByteEncoder encoder = constructor.newEncodeHandler(info, (MessageToByteEncoder) socketChannel.pipeline().get("encoder")); ByteToMessageDecoder decoder = constructor.newDecodeHandler(info, (ByteToMessageDecoder) socketChannel.pipeline().get("decoder")); - ViaPacketHandler chunkHandler = new ViaPacketHandler(info); + BukkitPacketHandler chunkHandler = new BukkitPacketHandler(info); socketChannel.pipeline().replace("encoder", "encoder", encoder); socketChannel.pipeline().replace("decoder", "decoder", decoder); diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaDecodeHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitDecodeHandler.java similarity index 95% rename from bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaDecodeHandler.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitDecodeHandler.java index 0fe3b1d39..59f2f3e18 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaDecodeHandler.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitDecodeHandler.java @@ -14,12 +14,12 @@ import us.myles.ViaVersion.util.PipelineUtil; import java.lang.reflect.InvocationTargetException; import java.util.List; -public class ViaDecodeHandler extends ByteToMessageDecoder { +public class BukkitDecodeHandler extends ByteToMessageDecoder { private final ByteToMessageDecoder minecraftDecoder; private final UserConnection info; - public ViaDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) { + public BukkitDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) { this.info = info; this.minecraftDecoder = minecraftDecoder; } diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaEncodeHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitEncodeHandler.java similarity index 94% rename from bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaEncodeHandler.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitEncodeHandler.java index edc4ec43c..e22a8b359 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaEncodeHandler.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitEncodeHandler.java @@ -16,11 +16,11 @@ import us.myles.ViaVersion.util.PipelineUtil; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; -public class ViaEncodeHandler extends MessageToByteEncoder { +public class BukkitEncodeHandler extends MessageToByteEncoder { private final UserConnection info; private final MessageToByteEncoder minecraftEncoder; - public ViaEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) { + public BukkitEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) { this.info = info; this.minecraftEncoder = minecraftEncoder; } diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaPacketHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitPacketHandler.java similarity index 91% rename from bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaPacketHandler.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitPacketHandler.java index ae09c9e01..d3b352dac 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaPacketHandler.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitPacketHandler.java @@ -8,10 +8,10 @@ import us.myles.ViaVersion.protocols.base.ProtocolInfo; import java.util.List; -public class ViaPacketHandler extends MessageToMessageEncoder { +public class BukkitPacketHandler extends MessageToMessageEncoder { private final UserConnection info; - public ViaPacketHandler(UserConnection info) { + public BukkitPacketHandler(UserConnection info) { this.info = info; } diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java index 769f35764..ea10015d2 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java @@ -8,7 +8,7 @@ import org.bukkit.plugin.PluginDescriptionFile; import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaInjector; -import us.myles.ViaVersion.bukkit.handlers.ViaVersionInitializer; +import us.myles.ViaVersion.bukkit.handlers.BukkitChannelInitializer; import us.myles.ViaVersion.util.ConcurrentList; import us.myles.ViaVersion.util.ListWrapper; import us.myles.ViaVersion.bukkit.util.NMSUtil; @@ -75,7 +75,7 @@ public class BukkitViaInjector implements ViaInjector { ChannelHandler bootstrapAcceptor = future.channel().pipeline().first(); try { ChannelInitializer oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class); - ChannelInitializer newInit = new ViaVersionInitializer(oldInit); + ChannelInitializer newInit = new BukkitChannelInitializer(oldInit); ReflectionUtil.set(bootstrapAcceptor, "childHandler", newInit); injectedFutures.add(future); @@ -103,8 +103,8 @@ public class BukkitViaInjector implements ViaInjector { ChannelHandler bootstrapAcceptor = future.channel().pipeline().first(); try { ChannelInitializer oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class); - if (oldInit instanceof ViaVersionInitializer) { - ReflectionUtil.set(bootstrapAcceptor, "childHandler", ((ViaVersionInitializer) oldInit).getOriginal()); + if (oldInit instanceof BukkitChannelInitializer) { + ReflectionUtil.set(bootstrapAcceptor, "childHandler", ((BukkitChannelInitializer) oldInit).getOriginal()); } } catch (Exception e) { System.out.println("Failed to remove injection handler, reload won't work with connections, please reboot!"); diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaVersionInitializer.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeChannelInitializer.java similarity index 52% rename from bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaVersionInitializer.java rename to bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeChannelInitializer.java index e15899e4c..ceea247f9 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaVersionInitializer.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeChannelInitializer.java @@ -3,19 +3,17 @@ package us.myles.ViaVersion.bungee.handlers; import io.netty.channel.Channel; import io.netty.channel.ChannelInitializer; import io.netty.channel.socket.SocketChannel; -import net.md_5.bungee.protocol.MinecraftDecoder; -import net.md_5.bungee.protocol.MinecraftEncoder; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.protocol.ProtocolPipeline; import java.lang.reflect.Method; -public class ViaVersionInitializer extends ChannelInitializer { +public class BungeeChannelInitializer extends ChannelInitializer { private final ChannelInitializer original; private Method method; - public ViaVersionInitializer(ChannelInitializer oldInit) { + public BungeeChannelInitializer(ChannelInitializer oldInit) { this.original = oldInit; try { this.method = ChannelInitializer.class.getDeclaredMethod("initChannel", Channel.class); @@ -25,10 +23,6 @@ public class ViaVersionInitializer extends ChannelInitializer { } } - public ChannelInitializer getOriginal() { - return original; - } - @Override protected void initChannel(SocketChannel socketChannel) throws Exception { UserConnection info = new UserConnection(socketChannel); @@ -37,12 +31,11 @@ public class ViaVersionInitializer extends ChannelInitializer { // Add originals this.method.invoke(this.original, socketChannel); // Add our transformers - ViaEncodeHandler encoder = new ViaEncodeHandler(info, (MinecraftEncoder) socketChannel.pipeline().get("packet-encoder")); - ViaDecodeHandler decoder = new ViaDecodeHandler(info, (MinecraftDecoder) socketChannel.pipeline().get("packet-decoder")); -// ViaPacketHandler chunkHandler = new ViaPacketHandler(info); + BungeeEncodeHandler encoder = new BungeeEncodeHandler(info); + BungeeDecodeHandler decoder = new BungeeDecodeHandler(info); + + socketChannel.pipeline().addBefore("packet-encoder", "via-encoder", encoder); + socketChannel.pipeline().addBefore("packet-decoder", "via-decoder", decoder); - socketChannel.pipeline().replace("packet-encoder", "packet-encoder", encoder); - socketChannel.pipeline().replace("packet-decoder", "packet-decoder", decoder); -// socketChannel.pipeline().addAfter("packet_handler", "viaversion_packet_handler", chunkHandler); } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaDecodeHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeDecodeHandler.java similarity index 62% rename from bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaDecodeHandler.java rename to bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeDecodeHandler.java index cde90c1ec..898df7d11 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaDecodeHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeDecodeHandler.java @@ -1,35 +1,30 @@ package us.myles.ViaVersion.bungee.handlers; import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.protocol.MinecraftDecoder; -import net.md_5.bungee.protocol.Protocol; +import io.netty.handler.codec.MessageToMessageDecoder; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.type.Type; -import us.myles.ViaVersion.bungee.util.BungeePipelineUtil; import us.myles.ViaVersion.exception.CancelException; import us.myles.ViaVersion.packets.Direction; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.util.PipelineUtil; -import java.lang.reflect.InvocationTargetException; import java.util.List; -public class ViaDecodeHandler extends MinecraftDecoder { +@ChannelHandler.Sharable +public class BungeeDecodeHandler extends MessageToMessageDecoder { - private final MinecraftDecoder minecraftDecoder; private final UserConnection info; - public ViaDecodeHandler(UserConnection info, MinecraftDecoder minecraftDecoder) { - super(Protocol.HANDSHAKE, true, ProxyServer.getInstance().getProtocolVersion()); + public BungeeDecodeHandler(UserConnection info) { this.info = info; - this.minecraftDecoder = minecraftDecoder; } @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf bytebuf, List list) throws Exception { + protected void decode(final ChannelHandlerContext ctx, ByteBuf bytebuf, List out) throws Exception { // use transformers if (bytebuf.readableBytes() > 0) { // Ignore if pending disconnect @@ -68,20 +63,11 @@ public class ViaDecodeHandler extends MinecraftDecoder { newPacket.release(); throw e; } + } else { + bytebuf.retain(); } - // call minecraft decoder - try { - list.addAll(BungeePipelineUtil.callDecode(this.minecraftDecoder, ctx, bytebuf)); - } catch (InvocationTargetException e) { - if (e.getCause() instanceof Exception) { - throw (Exception) e.getCause(); - } - } finally { - if (info.isActive()) { - bytebuf.release(); - } - } + out.add(bytebuf); } } @@ -90,14 +76,4 @@ public class ViaDecodeHandler extends MinecraftDecoder { if (PipelineUtil.containsCause(cause, CancelException.class)) return; super.exceptionCaught(ctx, cause); } - - @Override - public void setProtocol(Protocol protocol) { - this.minecraftDecoder.setProtocol(protocol); - } - - @Override - public void setProtocolVersion(int protocolVersion) { - this.minecraftDecoder.setProtocolVersion(protocolVersion); - } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaEncodeHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java similarity index 55% rename from bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaEncodeHandler.java rename to bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java index dbe0b01e3..4b8dc0563 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaEncodeHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java @@ -1,11 +1,9 @@ package us.myles.ViaVersion.bungee.handlers; import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.protocol.DefinedPacket; -import net.md_5.bungee.protocol.MinecraftEncoder; -import net.md_5.bungee.protocol.Protocol; +import io.netty.handler.codec.MessageToMessageEncoder; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.type.Type; @@ -15,32 +13,38 @@ import us.myles.ViaVersion.packets.Direction; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.util.PipelineUtil; -import java.lang.reflect.InvocationTargetException; +import java.util.List; -public class ViaEncodeHandler extends MinecraftEncoder { +@ChannelHandler.Sharable +public class BungeeEncodeHandler extends MessageToMessageEncoder { private final UserConnection info; - private final MinecraftEncoder minecraftEncoder; + private boolean handledCompression = false; - public ViaEncodeHandler(UserConnection info, MinecraftEncoder minecraftEncoder) { - super(Protocol.HANDSHAKE, true, ProxyServer.getInstance().getProtocolVersion()); + public BungeeEncodeHandler(UserConnection info) { this.info = info; - this.minecraftEncoder = minecraftEncoder; } @Override - protected void encode(final ChannelHandlerContext ctx, DefinedPacket o, final ByteBuf bytebuf) throws Exception { - // call minecraft encoder - try { - BungeePipelineUtil.callEncode(this.minecraftEncoder, ctx, o, bytebuf); - } catch (InvocationTargetException e) { - if (e.getCause() instanceof Exception) { - throw (Exception) e.getCause(); - } - } + protected void encode(final ChannelHandlerContext ctx, ByteBuf bytebuf, List out) throws Exception { if (bytebuf.readableBytes() == 0) { throw new CancelException(); } + boolean needsCompress = false; + if (!handledCompression) { + if (ctx.pipeline().names().indexOf("compress") > ctx.pipeline().names().indexOf("via-encoder")) { + // Need to decompress this packet due to bad order + bytebuf = BungeePipelineUtil.decompress(ctx, bytebuf); + ChannelHandler encoder = ctx.pipeline().get("via-decoder"); + ChannelHandler decoder = ctx.pipeline().get("via-encoder"); + ctx.pipeline().remove(encoder); + ctx.pipeline().remove(decoder); + ctx.pipeline().addAfter("decompress", "via-decoder", encoder); + ctx.pipeline().addAfter("compress", "via-encoder", decoder); + needsCompress = true; + handledCompression = true; + } + } // Increment sent info.incrementSent(); if (info.isActive()) { @@ -62,6 +66,11 @@ public class ViaEncodeHandler extends MinecraftEncoder { oldPacket.release(); } } + + if (needsCompress) { + bytebuf = BungeePipelineUtil.compress(ctx, bytebuf); + } + out.add(bytebuf.retain()); } @Override @@ -70,13 +79,4 @@ public class ViaEncodeHandler extends MinecraftEncoder { super.exceptionCaught(ctx, cause); } - @Override - public void setProtocol(Protocol protocol) { - this.minecraftEncoder.setProtocol(protocol); - } - - @Override - public void setProtocolVersion(int protocolVersion) { - this.minecraftEncoder.setProtocolVersion(protocolVersion); - } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaPacketHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaPacketHandler.java deleted file mode 100644 index 62d1e44fa..000000000 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaPacketHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -package us.myles.ViaVersion.bungee.handlers; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToMessageEncoder; -import us.myles.ViaVersion.api.data.UserConnection; -import us.myles.ViaVersion.protocols.base.ProtocolInfo; - -import java.util.List; - -public class ViaPacketHandler extends MessageToMessageEncoder { - private final UserConnection info; - - public ViaPacketHandler(UserConnection info) { - this.info = info; - } - - @Override - protected void encode(ChannelHandlerContext ctx, Object o, List list) throws Exception { - // Split chunks bulk packet up in to single chunks packets before it reached the encoder. - // This will prevent issues with several plugins and other protocol handlers due to the chunks being sent twice. - // It also sends the chunks in the right order possible resolving some issues with added chunks/block/entity data. - if (!(o instanceof ByteBuf)) { - info.setLastPacket(o); - /* This transformer is more for fixing issues which we find hard at packet level :) */ - if (info.isActive()) { - if (info.get(ProtocolInfo.class).getPipeline().filter(o, list)) { - return; - } - } - } - - list.add(o); - } -} diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java index 67ed4b3ac..bc2690616 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java @@ -5,7 +5,7 @@ import io.netty.channel.ChannelInitializer; import net.md_5.bungee.netty.PipelineUtils; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaInjector; -import us.myles.ViaVersion.bungee.handlers.ViaVersionInitializer; +import us.myles.ViaVersion.bungee.handlers.BungeeChannelInitializer; import us.myles.ViaVersion.util.ReflectionUtil; public class BungeeViaInjector implements ViaInjector { @@ -14,7 +14,7 @@ public class BungeeViaInjector implements ViaInjector { try { try { ChannelInitializer oldInit = PipelineUtils.SERVER_CHILD; - ChannelInitializer newInit = new ViaVersionInitializer(oldInit); + ChannelInitializer newInit = new BungeeChannelInitializer(oldInit); ReflectionUtil.setStatic(PipelineUtils.class, "SERVER_CHILD", newInit); } catch (NoSuchFieldException e) { @@ -41,6 +41,6 @@ public class BungeeViaInjector implements ViaInjector { @Override public String getEncoderName() { - return "packet-encoder"; + return "via-encoder"; } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java index f6f3aa22e..535df323c 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java @@ -4,6 +4,7 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; import io.netty.handler.codec.MessageToMessageDecoder; +import io.netty.handler.codec.MessageToMessageEncoder; import net.md_5.bungee.protocol.DefinedPacket; import net.md_5.bungee.protocol.MinecraftDecoder; import net.md_5.bungee.protocol.MinecraftEncoder; @@ -19,14 +20,14 @@ public class BungeePipelineUtil { static { try { - DECODE_METHOD = MinecraftDecoder.class.getDeclaredMethod("decode", ChannelHandlerContext.class, ByteBuf.class, List.class); + DECODE_METHOD = MessageToMessageDecoder.class.getDeclaredMethod("decode", ChannelHandlerContext.class, Object.class, List.class); DECODE_METHOD.setAccessible(true); } catch (NoSuchMethodException e) { e.printStackTrace(); System.out.println("Netty issue?"); } try { - ENCODE_METHOD = MinecraftEncoder.class.getDeclaredMethod("encode", ChannelHandlerContext.class, DefinedPacket.class, ByteBuf.class); + ENCODE_METHOD = MessageToByteEncoder.class.getDeclaredMethod("encode", ChannelHandlerContext.class, Object.class, ByteBuf.class); ENCODE_METHOD.setAccessible(true); } catch (NoSuchMethodException e) { e.printStackTrace(); @@ -34,7 +35,7 @@ public class BungeePipelineUtil { } } - public static List callDecode(MessageToMessageDecoder decoder, ChannelHandlerContext ctx, Object input) throws InvocationTargetException { + public static List callDecode(MessageToMessageDecoder decoder, ChannelHandlerContext ctx, ByteBuf input) throws InvocationTargetException { List output = new ArrayList<>(); try { BungeePipelineUtil.DECODE_METHOD.invoke(decoder, ctx, input, output); @@ -44,11 +45,31 @@ public class BungeePipelineUtil { return output; } - public static void callEncode(MessageToByteEncoder encoder, ChannelHandlerContext ctx, Object msg, ByteBuf output) throws InvocationTargetException { + public static ByteBuf callEncode(MessageToByteEncoder encoder, ChannelHandlerContext ctx, ByteBuf input) throws InvocationTargetException { + ByteBuf output = ctx.alloc().buffer(); try { - BungeePipelineUtil.ENCODE_METHOD.invoke(encoder, ctx, msg, output); + BungeePipelineUtil.ENCODE_METHOD.invoke(encoder, ctx, input, output); } catch (IllegalAccessException e) { e.printStackTrace(); } + return output; + } + + public static ByteBuf decompress(ChannelHandlerContext ctx, ByteBuf bytebuf) { + try { + return (ByteBuf) callDecode((MessageToMessageDecoder) ctx.pipeline().get("decompress"), ctx.pipeline().context("decompress"), bytebuf).get(0); + } catch (InvocationTargetException e) { + e.printStackTrace(); + return ctx.alloc().buffer(); + } + } + + public static ByteBuf compress(ChannelHandlerContext ctx, ByteBuf bytebuf) { + try { + return callEncode((MessageToByteEncoder) ctx.pipeline().get("compress"), ctx.pipeline().context("compress"), bytebuf); + } catch (InvocationTargetException e) { + e.printStackTrace(); + return ctx.alloc().buffer(); + } } } diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaVersionInitializer.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeChannelInitializer.java similarity index 74% rename from sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaVersionInitializer.java rename to sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeChannelInitializer.java index 2a29c110b..88248d769 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaVersionInitializer.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeChannelInitializer.java @@ -10,12 +10,12 @@ import us.myles.ViaVersion.api.protocol.ProtocolPipeline; import java.lang.reflect.Method; -public class ViaVersionInitializer extends ChannelInitializer { +public class SpongeChannelInitializer extends ChannelInitializer { private final ChannelInitializer original; private Method method; - public ViaVersionInitializer(ChannelInitializer oldInit) { + public SpongeChannelInitializer(ChannelInitializer oldInit) { this.original = oldInit; try { this.method = ChannelInitializer.class.getDeclaredMethod("initChannel", Channel.class); @@ -37,9 +37,9 @@ public class ViaVersionInitializer extends ChannelInitializer { // Add originals this.method.invoke(this.original, socketChannel); // Add our transformers - MessageToByteEncoder encoder = new ViaEncodeHandler(info, (MessageToByteEncoder) socketChannel.pipeline().get("encoder")); - ByteToMessageDecoder decoder = new ViaDecodeHandler(info, (ByteToMessageDecoder) socketChannel.pipeline().get("decoder")); - ViaPacketHandler chunkHandler = new ViaPacketHandler(info); + MessageToByteEncoder encoder = new SpongeEncodeHandler(info, (MessageToByteEncoder) socketChannel.pipeline().get("encoder")); + ByteToMessageDecoder decoder = new SpongeDecodeHandler(info, (ByteToMessageDecoder) socketChannel.pipeline().get("decoder")); + SpongePacketHandler chunkHandler = new SpongePacketHandler(info); socketChannel.pipeline().replace("encoder", "encoder", encoder); socketChannel.pipeline().replace("decoder", "decoder", decoder); diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaDecodeHandler.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeDecodeHandler.java similarity index 95% rename from sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaDecodeHandler.java rename to sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeDecodeHandler.java index 943d87094..8ee2180db 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaDecodeHandler.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeDecodeHandler.java @@ -14,12 +14,12 @@ import us.myles.ViaVersion.util.PipelineUtil; import java.lang.reflect.InvocationTargetException; import java.util.List; -public class ViaDecodeHandler extends ByteToMessageDecoder { +public class SpongeDecodeHandler extends ByteToMessageDecoder { private final ByteToMessageDecoder minecraftDecoder; private final UserConnection info; - public ViaDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) { + public SpongeDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) { this.info = info; this.minecraftDecoder = minecraftDecoder; } diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaEncodeHandler.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeEncodeHandler.java similarity index 93% rename from sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaEncodeHandler.java rename to sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeEncodeHandler.java index 06e51f05f..8f12b42a4 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaEncodeHandler.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeEncodeHandler.java @@ -13,11 +13,11 @@ import us.myles.ViaVersion.util.PipelineUtil; import java.lang.reflect.InvocationTargetException; -public class ViaEncodeHandler extends MessageToByteEncoder { +public class SpongeEncodeHandler extends MessageToByteEncoder { private final UserConnection info; private final MessageToByteEncoder minecraftEncoder; - public ViaEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) { + public SpongeEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) { this.info = info; this.minecraftEncoder = minecraftEncoder; } diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaPacketHandler.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongePacketHandler.java similarity index 91% rename from sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaPacketHandler.java rename to sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongePacketHandler.java index 07e4deb03..905685c7e 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaPacketHandler.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongePacketHandler.java @@ -8,10 +8,10 @@ import us.myles.ViaVersion.protocols.base.ProtocolInfo; import java.util.List; -public class ViaPacketHandler extends MessageToMessageEncoder { +public class SpongePacketHandler extends MessageToMessageEncoder { private final UserConnection info; - public ViaPacketHandler(UserConnection info) { + public SpongePacketHandler(UserConnection info) { this.info = info; } diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaInjector.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaInjector.java index 819248415..17301cb22 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaInjector.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaInjector.java @@ -9,7 +9,7 @@ import org.spongepowered.api.Sponge; import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaInjector; -import us.myles.ViaVersion.sponge.handlers.ViaVersionInitializer; +import us.myles.ViaVersion.sponge.handlers.SpongeChannelInitializer; import us.myles.ViaVersion.util.ListWrapper; import us.myles.ViaVersion.util.ReflectionUtil; @@ -74,7 +74,7 @@ public class SpongeViaInjector implements ViaInjector { ChannelHandler bootstrapAcceptor = future.channel().pipeline().first(); try { ChannelInitializer oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class); - ChannelInitializer newInit = new ViaVersionInitializer(oldInit); + ChannelInitializer newInit = new SpongeChannelInitializer(oldInit); ReflectionUtil.set(bootstrapAcceptor, "childHandler", newInit); injectedFutures.add(future); @@ -95,8 +95,8 @@ public class SpongeViaInjector implements ViaInjector { ChannelHandler bootstrapAcceptor = future.channel().pipeline().first(); try { ChannelInitializer oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class); - if (oldInit instanceof ViaVersionInitializer) { - ReflectionUtil.set(bootstrapAcceptor, "childHandler", ((ViaVersionInitializer) oldInit).getOriginal()); + if (oldInit instanceof SpongeChannelInitializer) { + ReflectionUtil.set(bootstrapAcceptor, "childHandler", ((SpongeChannelInitializer) oldInit).getOriginal()); } } catch (Exception e) { System.out.println("Failed to remove injection handler, reload won't work with connections, please reboot!"); From aeec7e5f952f9d0a357dec543f38960b9ea2763c Mon Sep 17 00:00:00 2001 From: Matsv Date: Thu, 29 Sep 2016 16:33:14 +0200 Subject: [PATCH 44/76] Start working on packet-level chunk bulks --- .../BukkitViaBulkChunkTranslator.java | 7 +- .../myles/ViaVersion/api/PacketWrapper.java | 2 +- .../api/protocol/ProtocolRegistry.java | 6 +- .../api/type/types/CustomByteType.java | 26 +++++++ .../packets/WorldPackets.java | 36 +++++++--- .../BulkChunkTranslatorProvider.java | 72 ++++++++++++++++++- .../storage/ClientChunks.java | 4 +- .../us/myles/ViaVersion/util/GsonUtil.java | 2 - .../SpongeViaBulkChunkTranslator.java | 5 ++ 9 files changed, 136 insertions(+), 24 deletions(-) create mode 100644 common/src/main/java/us/myles/ViaVersion/api/type/types/CustomByteType.java diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitViaBulkChunkTranslator.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitViaBulkChunkTranslator.java index 25d8370b5..fd4a3a271 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitViaBulkChunkTranslator.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitViaBulkChunkTranslator.java @@ -3,9 +3,9 @@ package us.myles.ViaVersion.bukkit.providers; import com.google.common.collect.Lists; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.bukkit.util.NMSUtil; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks; -import us.myles.ViaVersion.bukkit.util.NMSUtil; import us.myles.ViaVersion.util.ReflectionUtil; import java.lang.reflect.Method; @@ -79,4 +79,9 @@ public class BukkitViaBulkChunkTranslator extends BulkChunkTranslatorProvider { public boolean isFiltered(Class packetClass) { return packetClass.getName().endsWith("PacketPlayOutMapChunkBulk"); } + + @Override + public boolean isPacketLevel() { + return false; + } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java b/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java index 0f4d4307a..7c3441825 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java +++ b/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java @@ -358,7 +358,7 @@ public class PacketWrapper { * Be careful not to send packets twice. * (Sends it after current) *
- * This method is no longer used, it's favoured to use send(Protocol) as it will handle the pipeline properly. + * This method is no longer used, it's favoured to use {@link #send(Class)} as it will handle the pipeline properly. * * @throws Exception if it fails to write */ diff --git a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java index b736d88bb..51f32af25 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java +++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java @@ -27,13 +27,13 @@ public class ProtocolRegistry { static { // Base Protocol - registerProtocol(BASE_PROTOCOL, Arrays.asList(), -1); + registerProtocol(BASE_PROTOCOL, Collections.emptyList(), -1); // Register built in protocols registerProtocol(new Protocol1_9TO1_8(), Collections.singletonList(ProtocolVersion.v1_9.getId()), ProtocolVersion.v1_8.getId()); registerProtocol(new Protocol1_9_1TO1_9(), Arrays.asList(ProtocolVersion.v1_9_1.getId(), ProtocolVersion.v1_9_2.getId()), ProtocolVersion.v1_9.getId()); - registerProtocol(new Protocol1_9_3TO1_9_1_2(), Arrays.asList(ProtocolVersion.v1_9_3.getId()), ProtocolVersion.v1_9_2.getId()); + registerProtocol(new Protocol1_9_3TO1_9_1_2(), Collections.singletonList(ProtocolVersion.v1_9_3.getId()), ProtocolVersion.v1_9_2.getId()); // Only supported for 1.9.4 server to 1.9 (nothing else) - registerProtocol(new Protocol1_9TO1_9_1(), Arrays.asList(ProtocolVersion.v1_9.getId()), ProtocolVersion.v1_9_2.getId()); + registerProtocol(new Protocol1_9TO1_9_1(), Collections.singletonList(ProtocolVersion.v1_9.getId()), ProtocolVersion.v1_9_2.getId()); registerProtocol(new Protocol1_9_1_2TO1_9_3_4(), Arrays.asList(ProtocolVersion.v1_9_1.getId(), ProtocolVersion.v1_9_2.getId()), ProtocolVersion.v1_9_3.getId()); registerProtocol(new Protocol1_10To1_9_3_4(), Collections.singletonList(ProtocolVersion.v1_10.getId()), ProtocolVersion.v1_9_3.getId()); diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/types/CustomByteType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/CustomByteType.java new file mode 100644 index 000000000..097209490 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/type/types/CustomByteType.java @@ -0,0 +1,26 @@ +package us.myles.ViaVersion.api.type.types; + +import io.netty.buffer.ByteBuf; +import us.myles.ViaVersion.api.type.PartialType; + +public class CustomByteType extends PartialType { + + public CustomByteType(Integer param) { + super(param, byte[].class); + } + + @Override + public byte[] read(ByteBuf byteBuf, Integer integer) throws Exception { + if (byteBuf.readableBytes() < integer) throw new RuntimeException("Readable bytes does not match expected!"); + + byte[] byteArray = new byte[integer]; + byteBuf.readBytes(byteArray); + + return byteArray; + } + + @Override + public void write(ByteBuf byteBuf, Integer integer, byte[] bytes) throws Exception { + byteBuf.writeBytes(bytes); + } +} \ No newline at end of file diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java index 8139ce841..2b7301ce1 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java @@ -1,5 +1,7 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.packets; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import org.spacehq.opennbt.tag.builtin.CompoundTag; import org.spacehq.opennbt.tag.builtin.StringTag; import us.myles.ViaVersion.api.PacketWrapper; @@ -15,6 +17,7 @@ import us.myles.ViaVersion.packets.State; import us.myles.ViaVersion.protocols.protocol1_9to1_8.ItemRewriter; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; import us.myles.ViaVersion.protocols.protocol1_9to1_8.chunks.Chunk1_9to1_8; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.sounds.Effect; import us.myles.ViaVersion.protocols.protocol1_9to1_8.sounds.SoundEffect; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks; @@ -22,6 +25,9 @@ import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.EntityTracker; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.PlaceBlockTracker; import us.myles.ViaVersion.protocols.protocol1_9to1_8.types.ChunkType; +import java.io.IOException; +import java.util.List; + public class WorldPackets { public static void register(Protocol protocol) { // Sign Update Packet @@ -132,18 +138,26 @@ public class WorldPackets { handler(new PacketHandler() { @Override public void handle(PacketWrapper wrapper) throws Exception { -// ClientChunks clientChunks = wrapper.user().get(ClientChunks.class); -// Chunk1_9to1_8 chunk = (Chunk1_9to1_8) wrapper.passthrough(new ChunkType(clientChunks)); -// if (chunk.isUnloadPacket()) -// wrapper.setId(0x1D); -// -// // eat any other data (Usually happens with unload packets) -// wrapper.read(Type.REMAINING_BYTES); - // TODO: Implement Bulk Chunks - // Boolean - // Column Count + wrapper.cancel(); // Cancel the packet from being sent + BulkChunkTranslatorProvider provider = Via.getManager().getProviders().get(BulkChunkTranslatorProvider.class); - wrapper.cancel(); + // Don't read the packet + if (!provider.isPacketLevel()) + return; + + List list = provider.transformMapChunkBulk(wrapper, wrapper.user().get(ClientChunks.class)); + for (Object obj : list) { + if (!(obj instanceof PacketWrapper)) + throw new IOException("transformMapChunkBulk returned the wrong object type"); + + PacketWrapper output = (PacketWrapper) obj; + + ByteBuf buffer = Unpooled.buffer(); + output.writeToBuffer(buffer); + + PacketWrapper chunkPacket = new PacketWrapper(0x21, buffer, wrapper.user()); + chunkPacket.send(Protocol1_9TO1_8.class, false); + } } }); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java index 8a4ff5647..dc98c66de 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java @@ -1,9 +1,13 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.providers; +import lombok.Data; +import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.platform.providers.Provider; +import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.api.type.types.CustomByteType; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks; -import java.util.Arrays; +import java.util.ArrayList; import java.util.List; public class BulkChunkTranslatorProvider implements Provider { @@ -14,10 +18,42 @@ public class BulkChunkTranslatorProvider implements Provider { * @param clientChunks The ClientChunks object for the current player * @return A List of all the output packets */ - public List transformMapChunkBulk(Object packet, ClientChunks clientChunks) { - return Arrays.asList(packet); + public List transformMapChunkBulk(Object packet, ClientChunks clientChunks) throws Exception { + if (!(packet instanceof PacketWrapper)) + throw new IllegalArgumentException("The default packet has to be a PacketWrapper for transformMapChunkBulk, unexpected " + packet.getClass()); + + List packets = new ArrayList<>(); + PacketWrapper wrapper = (PacketWrapper) packet; + + boolean skyLight = wrapper.read(Type.BOOLEAN); + int count = wrapper.read(Type.VAR_INT); + + ChunkBulkSection[] metas = new ChunkBulkSection[count]; + for (int i = 0; i < count; i++) { + metas[i] = ChunkBulkSection.read(wrapper, skyLight); + } + + for (ChunkBulkSection meta : metas) { + CustomByteType customByteType = new CustomByteType(meta.getLength()); + meta.setData(wrapper.read(customByteType)); + + // Construct chunk packet + PacketWrapper chunkPacket = new PacketWrapper(0x21, null, wrapper.user()); + chunkPacket.write(Type.INT, meta.getX()); + chunkPacket.write(Type.INT, meta.getZ()); + chunkPacket.write(Type.BOOLEAN, true); // Always ground-up + chunkPacket.write(Type.UNSIGNED_SHORT, meta.getBitMask() & 0x0F); + chunkPacket.write(Type.VAR_INT, meta.getLength()); + chunkPacket.write(customByteType, meta.getData()); + + clientChunks.getBulkChunks().add(ClientChunks.toLong(meta.getX(), meta.getZ())); // Store for later + packets.add(chunkPacket); + } + + return packets; } + /** * Check if a packet of a class should be filtered * @@ -27,4 +63,34 @@ public class BulkChunkTranslatorProvider implements Provider { public boolean isFiltered(Class packet) { return false; } + + /** + * Check if the packet should be provided as PacketWrapper + * + * @return True if enabled + */ + public boolean isPacketLevel() { + return true; + } + + @Data + private static class ChunkBulkSection { + private int x; + private int z; + private int bitMask; + private int length; + private byte[] data; + + public static ChunkBulkSection read(PacketWrapper wrapper, boolean skylight) throws Exception { + ChunkBulkSection bulkSection = new ChunkBulkSection(); + bulkSection.setX(wrapper.read(Type.INT)); + bulkSection.setZ(wrapper.read(Type.INT)); + bulkSection.setBitMask(wrapper.read(Type.UNSIGNED_SHORT)); + + int bitCount = Integer.bitCount(bulkSection.getBitMask()); + bulkSection.setLength((bitCount * ((4096 * 2) + 2048)) + (skylight ? bitCount * 2048 : 0) + 256); // Thanks MCProtocolLib + + return bulkSection; + } + } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java index 67c7fe36d..e4149ef73 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/ClientChunks.java @@ -12,8 +12,6 @@ import java.util.Set; @Getter public class ClientChunks extends StoredObject { - - private final Set loadedChunks = Sets.newConcurrentHashSet(); private final Set bulkChunks = Sets.newConcurrentHashSet(); @@ -25,7 +23,7 @@ public class ClientChunks extends StoredObject { return ((long) msw << 32) + lsw - -2147483648L; } - public List transformMapChunkBulk(Object packet) { + public List transformMapChunkBulk(Object packet) throws Exception { return Via.getManager().getProviders().get(BulkChunkTranslatorProvider.class).transformMapChunkBulk(packet, this); } } diff --git a/common/src/main/java/us/myles/ViaVersion/util/GsonUtil.java b/common/src/main/java/us/myles/ViaVersion/util/GsonUtil.java index b60c6f9e0..38af3892e 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/GsonUtil.java +++ b/common/src/main/java/us/myles/ViaVersion/util/GsonUtil.java @@ -2,11 +2,9 @@ package us.myles.ViaVersion.util; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import lombok.Getter; import lombok.experimental.UtilityClass; @UtilityClass -@Getter public class GsonUtil { private final Gson gson = getGsonBuilder().create(); diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaBulkChunkTranslator.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaBulkChunkTranslator.java index 052fa2bd9..04bc61172 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaBulkChunkTranslator.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/providers/SpongeViaBulkChunkTranslator.java @@ -55,4 +55,9 @@ public class SpongeViaBulkChunkTranslator extends BulkChunkTranslatorProvider { public boolean isFiltered(Class packetClass) { return packetClass.getName().endsWith("S26PacketMapChunkBulk"); } + + @Override + public boolean isPacketLevel() { + return false; + } } From b0d64bfebd9d756d3c859d47c7bea5a1a8331e4d Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 29 Sep 2016 20:40:58 +0100 Subject: [PATCH 45/76] Fix a bug in chunks (still not working fully) Also remove bungeecord-proxy --- bungee/pom.xml | 8 -------- .../bungee/platform/BungeeViaInjector.java | 19 +++++++++++++------ .../bungee/platform/BungeeViaLoader.java | 5 ++++- .../packets/WorldPackets.java | 3 +-- .../myles/ViaVersion/util/ReflectionUtil.java | 4 ---- 5 files changed, 18 insertions(+), 21 deletions(-) diff --git a/bungee/pom.xml b/bungee/pom.xml index ccb0e47aa..75dfd9844 100644 --- a/bungee/pom.xml +++ b/bungee/pom.xml @@ -33,14 +33,6 @@ provided - - - net.md-5 - bungeecord-proxy - 1.4.7-SNAPSHOT - provided - - us.myles diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java index bc2690616..ef1b2719f 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java @@ -2,24 +2,31 @@ package us.myles.ViaVersion.bungee.platform; import io.netty.channel.Channel; import io.netty.channel.ChannelInitializer; -import net.md_5.bungee.netty.PipelineUtils; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaInjector; import us.myles.ViaVersion.bungee.handlers.BungeeChannelInitializer; -import us.myles.ViaVersion.util.ReflectionUtil; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; public class BungeeViaInjector implements ViaInjector { @Override public void inject() throws Exception { try { try { - ChannelInitializer oldInit = PipelineUtils.SERVER_CHILD; - ChannelInitializer newInit = new BungeeChannelInitializer(oldInit); - ReflectionUtil.setStatic(PipelineUtils.class, "SERVER_CHILD", newInit); + Class pipelineUtils = Class.forName("net.md_5.bungee.netty.PipelineUtils"); + Field field = pipelineUtils.getDeclaredField("SERVER_CHILD"); + field.setAccessible(true); + // Remove any final stuff + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); + + BungeeChannelInitializer newInit = new BungeeChannelInitializer((ChannelInitializer) field.get(null)); + field.set(null, newInit); } catch (NoSuchFieldException e) { throw new Exception("Unable to find core component 'childHandler', please check your plugins. issue: "); - } } catch (Exception e) { Via.getPlatform().getLogger().severe("Unable to inject ViaVersion, please post these details on our GitHub and ensure you're using a compatible server version."); diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java index b78346e85..343e16fdc 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java @@ -5,6 +5,9 @@ import us.myles.ViaVersion.api.platform.ViaPlatformLoader; public class BungeeViaLoader implements ViaPlatformLoader { @Override public void load() { - + // TODO: Movement Transmitter + // TODO: Config + // TODO: Platform specific commands + // TODO: Get rid of bungeecord-proxy just use reflection } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java index 2b7301ce1..b4552defd 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java @@ -151,10 +151,9 @@ public class WorldPackets { throw new IOException("transformMapChunkBulk returned the wrong object type"); PacketWrapper output = (PacketWrapper) obj; - ByteBuf buffer = Unpooled.buffer(); + output.setId(-1); // -1 for no writing of id output.writeToBuffer(buffer); - PacketWrapper chunkPacket = new PacketWrapper(0x21, buffer, wrapper.user()); chunkPacket.send(Protocol1_9TO1_8.class, false); } diff --git a/common/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java b/common/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java index 6febc6c1a..dbf3af7ee 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java +++ b/common/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java @@ -31,10 +31,6 @@ public class ReflectionUtil { public static void setStatic(Class clazz, String f, Object value) throws NoSuchFieldException, IllegalAccessException { Field field = clazz.getDeclaredField(f); field.setAccessible(true); - // Remove any final stuff - Field modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); field.set(null, value); } From 31c9332e5664e6599ff2c1293c91a4524f08548c Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 29 Sep 2016 20:46:31 +0100 Subject: [PATCH 46/76] Fix chunks for BungeeCord --- .../protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java index dc98c66de..3d06352fa 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/providers/BulkChunkTranslatorProvider.java @@ -42,7 +42,7 @@ public class BulkChunkTranslatorProvider implements Provider { chunkPacket.write(Type.INT, meta.getX()); chunkPacket.write(Type.INT, meta.getZ()); chunkPacket.write(Type.BOOLEAN, true); // Always ground-up - chunkPacket.write(Type.UNSIGNED_SHORT, meta.getBitMask() & 0x0F); + chunkPacket.write(Type.UNSIGNED_SHORT, meta.getBitMask()); chunkPacket.write(Type.VAR_INT, meta.getLength()); chunkPacket.write(customByteType, meta.getData()); From 10fc8f846d8a3a24b4961a41953ed60c5bf12cb5 Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 29 Sep 2016 21:29:58 +0100 Subject: [PATCH 47/76] Fix PacketWrapper sending and implement Movement Transmitter for Bungee --- .../bukkit/platform/BukkitViaInjector.java | 5 +++ .../bungee/platform/BungeeConfigAPI.java | 2 +- .../bungee/platform/BungeeViaInjector.java | 5 +++ .../bungee/platform/BungeeViaLoader.java | 5 ++- .../providers/BungeeMovementTransmitter.java | 34 +++++++++++++++++++ .../myles/ViaVersion/api/PacketWrapper.java | 7 ++-- .../ViaVersion/api/platform/ViaInjector.java | 7 ++++ .../myles/ViaVersion/util/PipelineUtil.java | 1 + .../sponge/platform/SpongeViaInjector.java | 5 +++ 9 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/providers/BungeeMovementTransmitter.java diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java index ea10015d2..7eccdaf93 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java @@ -178,6 +178,11 @@ public class BukkitViaInjector implements ViaInjector { return "encoder"; } + @Override + public String getDecoderName() { + return "decoder"; + } + public static Object getServerConnection() throws Exception { Class serverClazz = NMSUtil.nms("MinecraftServer"); Object server = ReflectionUtil.invokeStatic(serverClazz, "getServer"); diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java index cc4e784e6..9b1cdadb7 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java @@ -116,7 +116,7 @@ public class BungeeConfigAPI implements ViaVersionConfig, ConfigurationProvider @Override public boolean isStimulatePlayerTick() { - return false; + return true; } @Override diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java index ef1b2719f..948247652 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java @@ -50,4 +50,9 @@ public class BungeeViaInjector implements ViaInjector { public String getEncoderName() { return "via-encoder"; } + + @Override + public String getDecoderName() { + return "via-decoder"; + } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java index 343e16fdc..18dd21080 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java @@ -1,6 +1,9 @@ package us.myles.ViaVersion.bungee.platform; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaPlatformLoader; +import us.myles.ViaVersion.bungee.providers.BungeeMovementTransmitter; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; public class BungeeViaLoader implements ViaPlatformLoader { @Override @@ -8,6 +11,6 @@ public class BungeeViaLoader implements ViaPlatformLoader { // TODO: Movement Transmitter // TODO: Config // TODO: Platform specific commands - // TODO: Get rid of bungeecord-proxy just use reflection + Via.getManager().getProviders().use(MovementTransmitterProvider.class, new BungeeMovementTransmitter()); } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/providers/BungeeMovementTransmitter.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/providers/BungeeMovementTransmitter.java new file mode 100644 index 000000000..7f1d37206 --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/providers/BungeeMovementTransmitter.java @@ -0,0 +1,34 @@ +package us.myles.ViaVersion.bungee.providers; + +import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.packets.State; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.MovementTracker; + +public class BungeeMovementTransmitter extends MovementTransmitterProvider { + @Override + public Object getFlyingPacket() { + return null; + } + + @Override + public Object getGroundPacket() { + return null; + } + + public void sendPlayer(UserConnection userConnection) { + if (userConnection.get(ProtocolInfo.class).getState() == State.PLAY) { + PacketWrapper wrapper = new PacketWrapper(0x03, null, userConnection); + wrapper.write(Type.BOOLEAN, userConnection.get(MovementTracker.class).isGround()); + try { + wrapper.sendToServer(); + } catch (Exception e) { + e.printStackTrace(); + } + // PlayerPackets will increment idle + } + } +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java b/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java index 7c3441825..de15e497e 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java +++ b/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java @@ -455,19 +455,16 @@ public class PacketWrapper { /** * Send the current packet to the server. - * (Ensure the ID is suitable for the server version) + * (Ensure the ID is suitable for viaversion) * * @throws Exception If it failed to write */ public void sendToServer() throws Exception { - // TODO: Fix for bungee if (!isCancelled()) { ByteBuf output = inputBuffer == null ? Unpooled.buffer() : inputBuffer.alloc().buffer(); - Type.VAR_INT.write(output, PacketWrapper.PASSTHROUGH_ID); // Pass through - writeToBuffer(output); - PipelineUtil.getContextBefore("decompress", user().getChannel().pipeline()).fireChannelRead(output); + user().getChannel().pipeline().context(Via.getManager().getInjector().getDecoderName()).fireChannelRead(output); } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java index 86a0c3af8..14f853a2b 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaInjector.java @@ -29,4 +29,11 @@ public interface ViaInjector { * @return The name */ String getEncoderName(); + + /** + * Get the name of the decoder for then netty pipeline for this platform. + * + * @return The name + */ + String getDecoderName(); } diff --git a/common/src/main/java/us/myles/ViaVersion/util/PipelineUtil.java b/common/src/main/java/us/myles/ViaVersion/util/PipelineUtil.java index 05b92e9d5..fca66ada5 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/PipelineUtil.java +++ b/common/src/main/java/us/myles/ViaVersion/util/PipelineUtil.java @@ -95,6 +95,7 @@ public class PipelineUtil { boolean mark = false; for (String s : pipeline.names()) { if (mark) { + System.out.println("Context before: " + s); return pipeline.context(pipeline.get(s)); } if (s.equalsIgnoreCase(name)) diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaInjector.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaInjector.java index 17301cb22..3e7a5545a 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaInjector.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaInjector.java @@ -137,6 +137,11 @@ public class SpongeViaInjector implements ViaInjector { return "encoder"; } + @Override + public String getDecoderName() { + return "decoder"; + } + public static Object getServerConnection() throws Exception { Class serverClazz = Class.forName("net.minecraft.server.MinecraftServer"); Object server = getServer(); From eb72db9a5f30d608840ee3b6d87e1af65223addb Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 29 Sep 2016 21:30:09 +0100 Subject: [PATCH 48/76] Update TODO --- .../us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java | 1 - 1 file changed, 1 deletion(-) diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java index 18dd21080..0cd351d36 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java @@ -8,7 +8,6 @@ import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmit public class BungeeViaLoader implements ViaPlatformLoader { @Override public void load() { - // TODO: Movement Transmitter // TODO: Config // TODO: Platform specific commands Via.getManager().getProviders().use(MovementTransmitterProvider.class, new BungeeMovementTransmitter()); From 23f1589c286f8f7ab59efda1dca4d30ad71a160d Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 29 Sep 2016 22:35:51 +0100 Subject: [PATCH 49/76] Update commands to add new platform specific command also add platform to updater. --- bukkit/src/main/resources/plugin.yml | 2 +- .../us/myles/ViaVersion/bungee/commands/BungeeCommand.java | 2 +- .../us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java | 3 +-- .../us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java | 1 - .../src/main/java/us/myles/ViaVersion/update/UpdateUtil.java | 2 +- sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java | 2 +- 6 files changed, 5 insertions(+), 7 deletions(-) diff --git a/bukkit/src/main/resources/plugin.yml b/bukkit/src/main/resources/plugin.yml index 524051b93..d2cf3947c 100644 --- a/bukkit/src/main/resources/plugin.yml +++ b/bukkit/src/main/resources/plugin.yml @@ -9,4 +9,4 @@ softdepend: [ProtocolSupport, PacketListenerApi] commands: viaversion: description: Shows ViaVersion Version and more. - aliases: [viaver] \ No newline at end of file + aliases: [viaver, vvbukkit] \ No newline at end of file diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommand.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommand.java index b2a2b4137..b5114b9b4 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommand.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommand.java @@ -7,7 +7,7 @@ public class BungeeCommand extends Command { private final BungeeCommandHandler handler; public BungeeCommand(BungeeCommandHandler handler) { - super("viaversion", "", "viaver"); // The CommandHandler will handle the permission + super("viaversion", "", "viaver", "vvbungee"); // The CommandHandler will handle the permission this.handler = handler; } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java index 948247652..b3a0efe48 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java @@ -36,14 +36,13 @@ public class BungeeViaInjector implements ViaInjector { @Override public void uninject() { - // TODO: Uninject from players currently online Via.getPlatform().getLogger().severe("ViaVersion cannot remove itself from Bungee without a reboot!"); } @Override public int getServerProtocolVersion() throws Exception { - return 47; + return 47; // TODO Config Option } @Override diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java index 0cd351d36..436a99216 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java @@ -9,7 +9,6 @@ public class BungeeViaLoader implements ViaPlatformLoader { @Override public void load() { // TODO: Config - // TODO: Platform specific commands Via.getManager().getProviders().use(MovementTransmitterProvider.class, new BungeeMovementTransmitter()); } } diff --git a/common/src/main/java/us/myles/ViaVersion/update/UpdateUtil.java b/common/src/main/java/us/myles/ViaVersion/update/UpdateUtil.java index 32abb3d5a..cfcc67ff5 100644 --- a/common/src/main/java/us/myles/ViaVersion/update/UpdateUtil.java +++ b/common/src/main/java/us/myles/ViaVersion/update/UpdateUtil.java @@ -95,7 +95,7 @@ public class UpdateUtil { URL url = new URL(URL + PLUGIN + LATEST_VERSION + "?" + System.currentTimeMillis()); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setUseCaches(true); - connection.addRequestProperty("User-Agent", "ViaVersion " + Via.getPlatform().getPluginVersion()); + connection.addRequestProperty("User-Agent", "ViaVersion " + Via.getPlatform().getPluginVersion() + " " + Via.getPlatform().getPlatformName()); connection.setDoOutput(true); BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); String input; diff --git a/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java b/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java index d2725bf6e..33e9a4830 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java +++ b/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java @@ -68,7 +68,7 @@ public class SpongePlugin implements ViaPlatform { syncExecutor = game.getScheduler().createSyncExecutor(this); asyncExecutor = game.getScheduler().createAsyncExecutor(this); SpongeCommandHandler commandHandler = new SpongeCommandHandler(); - game.getCommandManager().register(this, commandHandler, Arrays.asList("viaversion", "viaver")); + game.getCommandManager().register(this, commandHandler, Arrays.asList("viaversion", "viaver", "vvsponge")); getLogger().info("ViaVersion " + getPluginVersion() + " is now loaded, injecting!"); // Init platform Via.init(ViaManager.builder() From 771c00b1462af81655af6559f3f6e1b54056116f Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 29 Sep 2016 22:55:08 +0100 Subject: [PATCH 50/76] Implement Task Ids --- .../us/myles/ViaVersion/ViaVersionPlugin.java | 26 ++++++++++------- .../bukkit/platform/BukkitTaskId.java | 11 ++++++++ .../main/java/us/myles/ViaVersion/Bungee.java | 28 ++++++++++--------- .../bungee/platform/BungeeTaskId.java | 11 ++++++++ .../myles/ViaVersion/api/platform/TaskId.java | 11 ++++++++ .../ViaVersion/api/platform/ViaPlatform.java | 8 +++--- .../us/myles/ViaVersion/SpongePlugin.java | 28 +++++++++---------- .../sponge/platform/SpongeTaskId.java | 12 ++++++++ 8 files changed, 94 insertions(+), 41 deletions(-) create mode 100644 bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitTaskId.java create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeTaskId.java create mode 100644 common/src/main/java/us/myles/ViaVersion/api/platform/TaskId.java create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeTaskId.java diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 9cc8ef380..74862c742 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -12,10 +12,12 @@ import us.myles.ViaVersion.api.ViaAPI; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; +import us.myles.ViaVersion.api.platform.TaskId; import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.bukkit.classgenerator.ClassGenerator; import us.myles.ViaVersion.bukkit.commands.BukkitCommandHandler; import us.myles.ViaVersion.bukkit.commands.BukkitCommandSender; +import us.myles.ViaVersion.bukkit.platform.BukkitTaskId; import us.myles.ViaVersion.bukkit.platform.BukkitViaAPI; import us.myles.ViaVersion.bukkit.platform.BukkitViaInjector; import us.myles.ViaVersion.bukkit.platform.BukkitViaLoader; @@ -151,33 +153,37 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { } @Override - public int runAsync(Runnable runnable) { + public TaskId runAsync(Runnable runnable) { if (isPluginEnabled()) { - return getServer().getScheduler().runTaskAsynchronously(this, runnable).getTaskId(); + return new BukkitTaskId(getServer().getScheduler().runTaskAsynchronously(this, runnable).getTaskId()); } else { asyncQueuedTasks.add(runnable); - return -1; + return new BukkitTaskId(null); } } @Override - public int runSync(Runnable runnable) { + public TaskId runSync(Runnable runnable) { if (isPluginEnabled()) { - return getServer().getScheduler().runTask(this, runnable).getTaskId(); + return new BukkitTaskId(getServer().getScheduler().runTask(this, runnable).getTaskId()); } else { queuedTasks.add(runnable); - return -1; + return new BukkitTaskId(null); } } @Override - public int runRepeatingSync(Runnable runnable, Long ticks) { - return getServer().getScheduler().runTaskTimer(this, runnable, ticks, 0).getTaskId(); // TODO or the other way around? + public TaskId runRepeatingSync(Runnable runnable, Long ticks) { + return new BukkitTaskId(getServer().getScheduler().runTaskTimer(this, runnable, ticks, 0).getTaskId()); } @Override - public void cancelTask(int taskId) { - getServer().getScheduler().cancelTask(taskId); + public void cancelTask(TaskId taskId) { + if (taskId == null) return; + if (taskId.getObject() == null) return; + if (taskId instanceof BukkitTaskId) { + getServer().getScheduler().cancelTask((Integer) taskId.getObject()); + } } @Override diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitTaskId.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitTaskId.java new file mode 100644 index 000000000..50685a297 --- /dev/null +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitTaskId.java @@ -0,0 +1,11 @@ +package us.myles.ViaVersion.bukkit.platform; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import us.myles.ViaVersion.api.platform.TaskId; + +@Getter +@AllArgsConstructor +public class BukkitTaskId implements TaskId { + private Integer object; +} diff --git a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java b/bungee/src/main/java/us/myles/ViaVersion/Bungee.java index b8805a582..f8cb3b654 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java +++ b/bungee/src/main/java/us/myles/ViaVersion/Bungee.java @@ -10,14 +10,12 @@ import us.myles.ViaVersion.api.ViaAPI; import us.myles.ViaVersion.api.ViaVersionConfig; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; +import us.myles.ViaVersion.api.platform.TaskId; import us.myles.ViaVersion.api.platform.ViaPlatform; -import us.myles.ViaVersion.bungee.platform.BungeeViaAPI; -import us.myles.ViaVersion.bungee.platform.BungeeViaInjector; -import us.myles.ViaVersion.bungee.platform.BungeeViaLoader; +import us.myles.ViaVersion.bungee.platform.*; import us.myles.ViaVersion.bungee.commands.BungeeCommand; import us.myles.ViaVersion.bungee.commands.BungeeCommandHandler; import us.myles.ViaVersion.bungee.commands.BungeeCommandSender; -import us.myles.ViaVersion.bungee.platform.BungeeConfigAPI; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -60,23 +58,27 @@ public class Bungee extends Plugin implements ViaPlatform { } @Override - public int runAsync(Runnable runnable) { - return getProxy().getScheduler().runAsync(this, runnable).getId(); + public TaskId runAsync(Runnable runnable) { + return new BungeeTaskId(getProxy().getScheduler().runAsync(this, runnable).getId()); } @Override - public int runSync(Runnable runnable) { - return getProxy().getScheduler().runAsync(this, runnable).getId(); // TODO don't run sync @ Bungee? + public TaskId runSync(Runnable runnable) { + return new BungeeTaskId(getProxy().getScheduler().runAsync(this, runnable).getId()); } @Override - public int runRepeatingSync(Runnable runnable, Long ticks) { - return getProxy().getScheduler().schedule(this, runnable, 0, ticks * 50, TimeUnit.MILLISECONDS).getId(); + public TaskId runRepeatingSync(Runnable runnable, Long ticks) { + return new BungeeTaskId(getProxy().getScheduler().schedule(this, runnable, 0, ticks * 50, TimeUnit.MILLISECONDS).getId()); } @Override - public void cancelTask(int taskId) { - getProxy().getScheduler().cancel(taskId); + public void cancelTask(TaskId taskId) { + if (taskId == null) return; + if (taskId.getObject() == null) return; + if (taskId instanceof BungeeTaskId) { + getProxy().getScheduler().cancel((Integer) taskId.getObject()); + } } @Override @@ -125,7 +127,7 @@ public class Bungee extends Plugin implements ViaPlatform { @Override public void onReload() { - // TODO handle + // Injector prints a message <3 } @Override diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeTaskId.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeTaskId.java new file mode 100644 index 000000000..cde0c6098 --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeTaskId.java @@ -0,0 +1,11 @@ +package us.myles.ViaVersion.bungee.platform; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import us.myles.ViaVersion.api.platform.TaskId; + +@Getter +@AllArgsConstructor +public class BungeeTaskId implements TaskId { + private Integer object; +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/TaskId.java b/common/src/main/java/us/myles/ViaVersion/api/platform/TaskId.java new file mode 100644 index 000000000..44993bc2c --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/TaskId.java @@ -0,0 +1,11 @@ +package us.myles.ViaVersion.api.platform; + +public interface TaskId { + /** + * Returns the actual object represented by this TaskId + * Null if task cannot be cancelled. + * + * @return Platform based Object (don't assume) + */ + Object getObject(); +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java index 84a927c0f..3a92e7f18 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java @@ -42,7 +42,7 @@ public interface ViaPlatform { * @param runnable The task to run * @return The Task ID */ - int runAsync(Runnable runnable); + TaskId runAsync(Runnable runnable); /** * Run a task Sync @@ -50,7 +50,7 @@ public interface ViaPlatform { * @param runnable The task to run * @return The Task ID */ - int runSync(Runnable runnable); + TaskId runSync(Runnable runnable); /** * Run a task at a repeating interval. @@ -60,14 +60,14 @@ public interface ViaPlatform { * @param ticks The interval to run it at * @return The Task ID */ - int runRepeatingSync(Runnable runnable, Long ticks); + TaskId runRepeatingSync(Runnable runnable, Long ticks); /** * Cancel a task * * @param taskId The task ID to cancel */ - void cancelTask(int taskId); + void cancelTask(TaskId taskId); /** * Get the online players diff --git a/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java b/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java index 33e9a4830..fd0b9b18a 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java +++ b/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java @@ -16,15 +16,13 @@ import us.myles.ViaVersion.api.ViaAPI; import us.myles.ViaVersion.api.ViaVersionConfig; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; +import us.myles.ViaVersion.api.platform.TaskId; import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.dump.PluginInfo; import us.myles.ViaVersion.sponge.VersionInfo; import us.myles.ViaVersion.sponge.commands.SpongeCommandHandler; import us.myles.ViaVersion.sponge.commands.SpongeCommandSender; -import us.myles.ViaVersion.sponge.platform.SpongeConfigAPI; -import us.myles.ViaVersion.sponge.platform.SpongeViaAPI; -import us.myles.ViaVersion.sponge.platform.SpongeViaInjector; -import us.myles.ViaVersion.sponge.platform.SpongeViaLoader; +import us.myles.ViaVersion.sponge.platform.*; import us.myles.ViaVersion.sponge.util.LoggerWrapper; import us.myles.ViaVersion.util.GsonUtil; @@ -98,28 +96,30 @@ public class SpongePlugin implements ViaPlatform { } @Override - public int runAsync(Runnable runnable) { + public TaskId runAsync(Runnable runnable) { asyncExecutor.execute(runnable); - return -1; + return new SpongeTaskId(null); } @Override - public int runSync(Runnable runnable) { + public TaskId runSync(Runnable runnable) { syncExecutor.execute(runnable); - return -1; + return new SpongeTaskId(null); } @Override - public int runRepeatingSync(Runnable runnable, Long ticks) { + public TaskId runRepeatingSync(Runnable runnable, Long ticks) { Long time = ticks * 50L; - syncExecutor.scheduleAtFixedRate(runnable, time, time, TimeUnit.MILLISECONDS); - // use id? - return -1; + return new SpongeTaskId(syncExecutor.scheduleAtFixedRate(runnable, time, time, TimeUnit.MILLISECONDS).getTask()); } @Override - public void cancelTask(int taskId) { - // oh. + public void cancelTask(TaskId taskId) { + if (taskId == null) return; + if (taskId.getObject() == null) return; + if (taskId instanceof SpongeTaskId) { + ((SpongeTaskId) taskId).getObject().cancel(); + } } @Override diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeTaskId.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeTaskId.java new file mode 100644 index 000000000..879fa041c --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeTaskId.java @@ -0,0 +1,12 @@ +package us.myles.ViaVersion.sponge.platform; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.spongepowered.api.scheduler.Task; +import us.myles.ViaVersion.api.platform.TaskId; + +@Getter +@AllArgsConstructor +public class SpongeTaskId implements TaskId { + private Task object; +} From b7b322a52580c9fe41a252bb0e8843472ded9c2e Mon Sep 17 00:00:00 2001 From: Myles Date: Fri, 30 Sep 2016 00:34:16 +0100 Subject: [PATCH 51/76] Full config api for all platforms using snakeyaml + comments --- .../java/us/myles/ViaVersion/ViaConfig.java | 210 ------------------ .../us/myles/ViaVersion/ViaVersionPlugin.java | 9 +- .../CommandBlockListener.java | 2 +- .../bukkit/platform/BukkitConfigAPI.java | 173 +++++++++++++++ .../bukkit/platform/BukkitViaAPI.java | 2 +- .../bukkit/platform/BukkitViaInjector.java | 2 +- .../BukkitViaMovementTransmitter.java | 2 +- .../main/java/us/myles/ViaVersion/Bungee.java | 4 +- .../bungee/platform/BungeeConfigAPI.java | 95 ++++---- .../bungee/platform/BungeeViaLoader.java | 1 - .../bungee/util/BungeePipelineUtil.java | 4 - common/pom.xml | 10 + .../myles/ViaVersion/api/PacketWrapper.java | 1 - .../commands/ViaCommandHandler.java | 1 + .../protocols/protocol1_9to1_8/ArmorType.java | 7 +- .../myles/ViaVersion/util/CommentStore.java | 99 ++------- .../java/us/myles/ViaVersion/util/Config.java | 150 +++++++++++++ .../myles/ViaVersion/util/ReflectionUtil.java | 1 - .../src/main/resources/config.yml | 2 +- .../sponge/platform/SpongeConfigAPI.java | 138 ++---------- 20 files changed, 427 insertions(+), 486 deletions(-) delete mode 100644 bukkit/src/main/java/us/myles/ViaVersion/ViaConfig.java create mode 100644 bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitConfigAPI.java rename bukkit/src/main/java/us/myles/ViaVersion/bukkit/util/Configuration.java => common/src/main/java/us/myles/ViaVersion/util/CommentStore.java (67%) create mode 100644 common/src/main/java/us/myles/ViaVersion/util/Config.java rename {bukkit => common}/src/main/resources/config.yml (99%) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaConfig.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaConfig.java deleted file mode 100644 index b1e1fec38..000000000 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaConfig.java +++ /dev/null @@ -1,210 +0,0 @@ -package us.myles.ViaVersion; - -import us.myles.ViaVersion.api.ViaVersionConfig; -import us.myles.ViaVersion.api.configuration.ConfigurationProvider; -import us.myles.ViaVersion.bukkit.util.Configuration; - -import java.io.File; -import java.util.List; -import java.util.Map; - -public class ViaConfig implements ViaVersionConfig, ConfigurationProvider { - private final ViaVersionPlugin plugin; - - public ViaConfig(ViaVersionPlugin plugin) { - this.plugin = plugin; - reloadConfig(); - } - - public void generateConfig() { - File file = new File(plugin.getDataFolder(), "config.yml"); - if (file.exists()) { - // Update conf options - Configuration oldConfig = new Configuration(file); - oldConfig.reload(false); // Load current options from conf - file.delete(); // Delete old conf - plugin.saveDefaultConfig(); // Generate new conf - Configuration newConfig = new Configuration(file); - newConfig.reload(true); // Load default options - for (String key : oldConfig.getKeys(false)) { - // Set option in new conf if exists - if (newConfig.contains(key)) { - newConfig.set(key, oldConfig.get(key)); - } - } - newConfig.save(); - } else { - plugin.saveDefaultConfig(); - } - } - - @Override - public boolean isCheckForUpdates() { - return plugin.getConfig().getBoolean("checkforupdates", true); - } - - @Override - public boolean isPreventCollision() { - return plugin.getConfig().getBoolean("prevent-collision", true); - } - - @Override - public boolean isNewEffectIndicator() { - return plugin.getConfig().getBoolean("use-new-effect-indicator", true); - } - - @Override - public boolean isShowNewDeathMessages() { - return plugin.getConfig().getBoolean("use-new-deathmessages", false); - } - - @Override - public boolean isSuppressMetadataErrors() { - return plugin.getConfig().getBoolean("suppress-metadata-errors", false); - } - - @Override - public boolean isShieldBlocking() { - return plugin.getConfig().getBoolean("shield-blocking", true); - } - - @Override - public boolean isHologramPatch() { - return plugin.getConfig().getBoolean("hologram-patch", false); - } - - @Override - public boolean isBossbarPatch() { - return plugin.getConfig().getBoolean("bossbar-patch", true); - } - - @Override - public boolean isBossbarAntiflicker() { - return plugin.getConfig().getBoolean("bossbar-anti-flicker", false); - } - - @Override - public boolean isUnknownEntitiesSuppressed() { - return false; - } - - @Override - public double getHologramYOffset() { - return plugin.getConfig().getDouble("hologram-y", -0.96D); - } - - @Override - public boolean isBlockBreakPatch() { - return false; - } - - @Override - public int getMaxPPS() { - return plugin.getConfig().getInt("max-pps", 140); - } - - @Override - public String getMaxPPSKickMessage() { - return plugin.getConfig().getString("max-pps-kick-msg", "Sending packets too fast? lag?"); - } - - @Override - public int getTrackingPeriod() { - return plugin.getConfig().getInt("tracking-period", 6); - } - - @Override - public int getWarningPPS() { - return plugin.getConfig().getInt("tracking-warning-pps", 120); - } - - @Override - public int getMaxWarnings() { - return plugin.getConfig().getInt("tracking-max-warnings", 3); - } - - @Override - public String getMaxWarningsKickMessage() { - return plugin.getConfig().getString("tracking-max-kick-msg", "You are sending too many packets, :("); - } - - @Override - public boolean isAntiXRay() { - return plugin.getConfig().getBoolean("anti-xray-patch", true); - } - - @Override - public boolean isSendSupportedVersions() { - return plugin.getConfig().getBoolean("send-supported-versions", false); - } - - @Override - public boolean isStimulatePlayerTick() { - return plugin.getConfig().getBoolean("simulate-pt", true); - } - - @Override - public boolean isItemCache() { - return plugin.getConfig().getBoolean("item-cache", true); - } - - @Override - public boolean isNMSPlayerTicking() { - return plugin.getConfig().getBoolean("nms-player-ticking", true); - } - - @Override - public boolean isReplacePistons() { - return plugin.getConfig().getBoolean("replace-pistons", false); - } - - @Override - public int getPistonReplacementId() { - return plugin.getConfig().getInt("replacement-piston-id", 0); - } - - public boolean isAutoTeam() { - // Collision has to be enabled first - return isPreventCollision() && plugin.getConfig().getBoolean("auto-team", true); - } - - @Override - public boolean isForceJsonTransform() { - return plugin.getConfig().getBoolean("force-json-transform", false); - } - - @Override - public List getBlockedProtocols() { - return plugin.getConfig().getIntegerList("block-protocols"); - } - - @Override - public String getBlockedDisconnectMsg() { - return plugin.getConfig().getString("block-disconnect-msg", "You are using an unsupported Minecraft version!"); - } - - @Override - public String getReloadDisconnectMsg() { - return plugin.getConfig().getString("reload-disconnect-msg", "Server reload, please rejoin!"); - } - - @Override - public void set(String path, Object value) { - plugin.getConfig().set(path, value); - } - - @Override - public void saveConfig() { - plugin.saveConfig(); - } - - @Override - public void reloadConfig() { - generateConfig(); - } - - @Override - public Map getValues() { - return plugin.getConfig().getValues(false); - } -} diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 74862c742..70603a278 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -17,10 +17,7 @@ import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.bukkit.classgenerator.ClassGenerator; import us.myles.ViaVersion.bukkit.commands.BukkitCommandHandler; import us.myles.ViaVersion.bukkit.commands.BukkitCommandSender; -import us.myles.ViaVersion.bukkit.platform.BukkitTaskId; -import us.myles.ViaVersion.bukkit.platform.BukkitViaAPI; -import us.myles.ViaVersion.bukkit.platform.BukkitViaInjector; -import us.myles.ViaVersion.bukkit.platform.BukkitViaLoader; +import us.myles.ViaVersion.bukkit.platform.*; import us.myles.ViaVersion.bukkit.util.NMSUtil; import us.myles.ViaVersion.dump.PluginInfo; import us.myles.ViaVersion.util.GsonUtil; @@ -37,7 +34,7 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { private boolean lateBind = false; private boolean protocolSupport = false; @Getter - private ViaConfig conf; + private BukkitConfigAPI conf; @Getter private ViaAPI api = new BukkitViaAPI(this); private List queuedTasks = new ArrayList<>(); @@ -45,7 +42,7 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { public ViaVersionPlugin() { // Config magic - conf = new ViaConfig(this); + conf = new BukkitConfigAPI(); // Command handler commandHandler = new BukkitCommandHandler(); // Init platform diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/CommandBlockListener.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/CommandBlockListener.java index 7477023b1..e75aa3af8 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/CommandBlockListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/protocol1_9to1_8/CommandBlockListener.java @@ -22,8 +22,8 @@ import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.minecraft.Position; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.bukkit.listeners.ViaBukkitListener; -import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; import us.myles.ViaVersion.bukkit.util.NMSUtil; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; import us.myles.ViaVersion.util.ReflectionUtil; import java.io.DataOutput; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitConfigAPI.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitConfigAPI.java new file mode 100644 index 000000000..3ed1fd2f5 --- /dev/null +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitConfigAPI.java @@ -0,0 +1,173 @@ +package us.myles.ViaVersion.bukkit.platform; + +import us.myles.ViaVersion.ViaVersionPlugin; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.ViaVersionConfig; +import us.myles.ViaVersion.util.Config; + +import java.io.File; +import java.util.Arrays; +import java.util.List; + +public class BukkitConfigAPI extends Config implements ViaVersionConfig { + private static List UNSUPPORTED = Arrays.asList(); + + public BukkitConfigAPI() { + super(new File(((ViaVersionPlugin) Via.getPlatform()).getDataFolder(), "config.yml")); + } + + @Override + public boolean isCheckForUpdates() { + return getBoolean("checkforupdates", true); + } + + @Override + public boolean isPreventCollision() { + return getBoolean("prevent-collision", true); + } + + @Override + public boolean isNewEffectIndicator() { + return getBoolean("use-new-effect-indicator", true); + } + + @Override + public boolean isShowNewDeathMessages() { + return getBoolean("use-new-deathmessages", false); + } + + @Override + public boolean isSuppressMetadataErrors() { + return getBoolean("suppress-metadata-errors", false); + } + + @Override + public boolean isShieldBlocking() { + return getBoolean("shield-blocking", true); + } + + @Override + public boolean isHologramPatch() { + return getBoolean("hologram-patch", false); + } + + @Override + public boolean isBossbarPatch() { + return getBoolean("bossbar-patch", true); + } + + @Override + public boolean isBossbarAntiflicker() { + return getBoolean("bossbar-anti-flicker", false); + } + + @Override + public boolean isUnknownEntitiesSuppressed() { + return false; + } + + @Override + public double getHologramYOffset() { + return getDouble("hologram-y", -0.96D); + } + + @Override + public boolean isBlockBreakPatch() { + return false; + } + + @Override + public int getMaxPPS() { + return getInt("max-pps", 800); + } + + @Override + public String getMaxPPSKickMessage() { + return getString("max-pps-kick-msg", "Sending packets too fast? lag?"); + } + + @Override + public int getTrackingPeriod() { + return getInt("tracking-period", 6); + } + + @Override + public int getWarningPPS() { + return getInt("tracking-warning-pps", 120); + } + + @Override + public int getMaxWarnings() { + return getInt("tracking-max-warnings", 3); + } + + @Override + public String getMaxWarningsKickMessage() { + return getString("tracking-max-kick-msg", "You are sending too many packets, :("); + } + + @Override + public boolean isAntiXRay() { + return getBoolean("anti-xray-patch", true); + } + + @Override + public boolean isSendSupportedVersions() { + return getBoolean("send-supported-versions", false); + } + + @Override + public boolean isStimulatePlayerTick() { + return getBoolean("simulate-pt", true); + } + + @Override + public boolean isItemCache() { + return getBoolean("item-cache", true); + } + + @Override + public boolean isNMSPlayerTicking() { + return getBoolean("nms-player-ticking", true); + } + + @Override + public boolean isReplacePistons() { + return getBoolean("replace-pistons", false); + } + + @Override + public int getPistonReplacementId() { + return getInt("replacement-piston-id", 0); + } + + public boolean isAutoTeam() { + // Collision has to be enabled first + return isPreventCollision() && getBoolean("auto-team", true); + } + + @Override + public boolean isForceJsonTransform() { + return getBoolean("force-json-transform", false); + } + + @Override + public List getBlockedProtocols() { + return getIntegerList("block-protocols"); + } + + @Override + public String getBlockedDisconnectMsg() { + return getString("block-disconnect-msg", "You are using an unsupported Minecraft version!"); + } + + @Override + public String getReloadDisconnectMsg() { + return getString("reload-disconnect-msg", "Server reload, please rejoin!"); + } + + @Override + public List getUnsupportedOptions() { + return UNSUPPORTED; + } +} diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaAPI.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaAPI.java index 9d3cff21e..d76cece62 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaAPI.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaAPI.java @@ -16,8 +16,8 @@ import us.myles.ViaVersion.api.command.ViaVersionCommand; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.boss.ViaBossBar; -import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.bukkit.util.ProtocolSupportUtil; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; import java.util.Map; import java.util.SortedSet; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java index 7eccdaf93..ef06a642e 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java @@ -9,9 +9,9 @@ import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaInjector; import us.myles.ViaVersion.bukkit.handlers.BukkitChannelInitializer; +import us.myles.ViaVersion.bukkit.util.NMSUtil; import us.myles.ViaVersion.util.ConcurrentList; import us.myles.ViaVersion.util.ListWrapper; -import us.myles.ViaVersion.bukkit.util.NMSUtil; import us.myles.ViaVersion.util.ReflectionUtil; import java.lang.reflect.Field; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitViaMovementTransmitter.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitViaMovementTransmitter.java index 30bcaf1b4..4c9147d98 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitViaMovementTransmitter.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitViaMovementTransmitter.java @@ -4,10 +4,10 @@ import org.bukkit.Bukkit; import org.bukkit.entity.Player; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.bukkit.util.NMSUtil; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.MovementTracker; -import us.myles.ViaVersion.bukkit.util.NMSUtil; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; diff --git a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java b/bungee/src/main/java/us/myles/ViaVersion/Bungee.java index f8cb3b654..b8670fe47 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java +++ b/bungee/src/main/java/us/myles/ViaVersion/Bungee.java @@ -12,10 +12,10 @@ import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import us.myles.ViaVersion.api.platform.TaskId; import us.myles.ViaVersion.api.platform.ViaPlatform; -import us.myles.ViaVersion.bungee.platform.*; import us.myles.ViaVersion.bungee.commands.BungeeCommand; import us.myles.ViaVersion.bungee.commands.BungeeCommandHandler; import us.myles.ViaVersion.bungee.commands.BungeeCommandSender; +import us.myles.ViaVersion.bungee.platform.*; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -29,7 +29,7 @@ public class Bungee extends Plugin implements ViaPlatform { @Override public void onLoad() { api = new BungeeViaAPI(); - config = new BungeeConfigAPI(); + config = new BungeeConfigAPI(getDataFolder()); commandHandler = new BungeeCommandHandler(); ProxyServer.getInstance().getPluginManager().registerCommand(this, new BungeeCommand(commandHandler)); // Init platform diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java index 9b1cdadb7..19092b5f9 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java @@ -1,57 +1,66 @@ package us.myles.ViaVersion.bungee.platform; import us.myles.ViaVersion.api.ViaVersionConfig; -import us.myles.ViaVersion.api.configuration.ConfigurationProvider; +import us.myles.ViaVersion.util.Config; +import java.io.File; import java.util.Arrays; import java.util.List; -import java.util.Map; -// TODO implement -public class BungeeConfigAPI implements ViaVersionConfig, ConfigurationProvider { +public class BungeeConfigAPI extends Config implements ViaVersionConfig { + private static List UNSUPPORTED = Arrays.asList("nms-player-ticking", "item-cache", "anti-xray-patch"); + + public BungeeConfigAPI(File configFile) { + super(new File(configFile, "config.yml")); + } + @Override + public List getUnsupportedOptions() { + return UNSUPPORTED; + } + public boolean isCheckForUpdates() { - return false; + return getBoolean("checkforupdates", true); } @Override public boolean isPreventCollision() { - return false; + return getBoolean("prevent-collision", true); } @Override public boolean isNewEffectIndicator() { - return false; + return getBoolean("use-new-effect-indicator", true); } @Override public boolean isShowNewDeathMessages() { - return false; + return getBoolean("use-new-deathmessages", false); } @Override public boolean isSuppressMetadataErrors() { - return false; + return getBoolean("suppress-metadata-errors", false); } @Override public boolean isShieldBlocking() { - return false; + return getBoolean("shield-blocking", true); } @Override public boolean isHologramPatch() { - return false; + return getBoolean("hologram-patch", false); } @Override public boolean isBossbarPatch() { - return false; + return getBoolean("bossbar-patch", true); } @Override public boolean isBossbarAntiflicker() { - return false; + return getBoolean("bossbar-anti-flicker", false); } @Override @@ -61,12 +70,7 @@ public class BungeeConfigAPI implements ViaVersionConfig, ConfigurationProvider @Override public double getHologramYOffset() { - return 0; - } - - @Override - public boolean isAutoTeam() { - return false; + return getDouble("hologram-y", -0.96D); } @Override @@ -76,32 +80,32 @@ public class BungeeConfigAPI implements ViaVersionConfig, ConfigurationProvider @Override public int getMaxPPS() { - return 0; + return getInt("max-pps", 800); } @Override public String getMaxPPSKickMessage() { - return null; + return getString("max-pps-kick-msg", "Sending packets too fast? lag?"); } @Override public int getTrackingPeriod() { - return 0; + return getInt("tracking-period", 6); } @Override public int getWarningPPS() { - return 0; + return getInt("tracking-warning-pps", 120); } @Override public int getMaxWarnings() { - return 0; + return getInt("tracking-max-warnings", 3); } @Override public String getMaxWarningsKickMessage() { - return null; + return getString("tracking-max-kick-msg", "You are sending too many packets, :("); } @Override @@ -111,12 +115,12 @@ public class BungeeConfigAPI implements ViaVersionConfig, ConfigurationProvider @Override public boolean isSendSupportedVersions() { - return false; + return getBoolean("send-supported-versions", false); } @Override public boolean isStimulatePlayerTick() { - return true; + return getBoolean("simulate-pt", true); } @Override @@ -131,51 +135,36 @@ public class BungeeConfigAPI implements ViaVersionConfig, ConfigurationProvider @Override public boolean isReplacePistons() { - return false; + return getBoolean("replace-pistons", false); } @Override public int getPistonReplacementId() { - return 0; + return getInt("replacement-piston-id", 0); + } + + public boolean isAutoTeam() { + // Collision has to be enabled first + return isPreventCollision() && getBoolean("auto-team", true); } @Override public boolean isForceJsonTransform() { - return false; + return getBoolean("force-json-transform", false); } @Override public List getBlockedProtocols() { - return Arrays.asList(); + return getIntegerList("block-protocols"); } @Override public String getBlockedDisconnectMsg() { - return null; + return getString("block-disconnect-msg", "You are using an unsupported Minecraft version!"); } @Override public String getReloadDisconnectMsg() { - return null; - } - - @Override - public void set(String path, Object value) { - - } - - @Override - public void saveConfig() { - - } - - @Override - public void reloadConfig() { - - } - - @Override - public Map getValues() { - return null; + return getString("reload-disconnect-msg", "Server reload, please rejoin!"); } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java index 436a99216..9e44f86af 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java @@ -8,7 +8,6 @@ import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmit public class BungeeViaLoader implements ViaPlatformLoader { @Override public void load() { - // TODO: Config Via.getManager().getProviders().use(MovementTransmitterProvider.class, new BungeeMovementTransmitter()); } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java index 535df323c..5d81f876a 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java @@ -4,10 +4,6 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; import io.netty.handler.codec.MessageToMessageDecoder; -import io.netty.handler.codec.MessageToMessageEncoder; -import net.md_5.bungee.protocol.DefinedPacket; -import net.md_5.bungee.protocol.MinecraftDecoder; -import net.md_5.bungee.protocol.MinecraftEncoder; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; diff --git a/common/pom.xml b/common/pom.xml index 8477ad2cb..fa13a94c6 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -11,4 +11,14 @@ 4.0.0 viaversion-common + + + + + org.yaml + snakeyaml + 1.18-SNAPSHOT + provided + + \ No newline at end of file diff --git a/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java b/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java index de15e497e..7d4f7730d 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java +++ b/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java @@ -15,7 +15,6 @@ import us.myles.ViaVersion.exception.InformativeException; import us.myles.ViaVersion.packets.Direction; import us.myles.ViaVersion.packets.State; import us.myles.ViaVersion.protocols.base.ProtocolInfo; -import us.myles.ViaVersion.util.PipelineUtil; import java.io.IOException; import java.util.ArrayList; diff --git a/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java b/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java index f4774baa2..00ac8421b 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/ViaCommandHandler.java @@ -102,6 +102,7 @@ public abstract class ViaCommandHandler implements ViaVersionCommand { /** * Shows the ViaVersion help to a sender + * * @param sender The sender to send the help to */ public void showHelp(ViaCommandSender sender) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java index 9f3e30508..b4f830521 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java @@ -46,8 +46,8 @@ public enum ArmorType { /** * Find an armour type by the item id - * @param id ID of the item * + * @param id ID of the item * @return Return the ArmourType, ArmourType.NONE if not found */ public static ArmorType findById(int id) { @@ -59,8 +59,8 @@ public enum ArmorType { /** * Find an armour type by the item string - * @param type String name for the item * + * @param type String name for the item * @return Return the ArmourType, ArmourType.NONE if not found */ public static ArmorType findByType(String type) { @@ -72,6 +72,7 @@ public enum ArmorType { /** * Check if an item id is armour + * * @param id The item ID * @return True if the item is a piece of armour */ @@ -84,6 +85,7 @@ public enum ArmorType { /** * Check if an item id is armour + * * @param type The item material name * @return True if the item is a piece of armour */ @@ -96,6 +98,7 @@ public enum ArmorType { /** * Get the Minecraft ID for the Armour Type + * * @return The ID */ public int getId() { diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/util/Configuration.java b/common/src/main/java/us/myles/ViaVersion/util/CommentStore.java similarity index 67% rename from bukkit/src/main/java/us/myles/ViaVersion/bukkit/util/Configuration.java rename to common/src/main/java/us/myles/ViaVersion/util/CommentStore.java index 0e3ba1797..12bd9b031 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/util/Configuration.java +++ b/common/src/main/java/us/myles/ViaVersion/util/CommentStore.java @@ -1,29 +1,25 @@ -package us.myles.ViaVersion.bukkit.util; +package us.myles.ViaVersion.util; import com.google.common.base.Joiner; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import org.bukkit.Bukkit; -import org.bukkit.configuration.InvalidConfigurationException; -import org.bukkit.configuration.file.YamlConfiguration; +import com.google.common.io.CharStreams; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; +import java.io.*; import java.util.Arrays; import java.util.List; import java.util.Map; -import java.util.logging.Level; import java.util.regex.Pattern; -public class Configuration extends YamlConfiguration { +public class CommentStore { private final Map> headers = Maps.newConcurrentMap(); - private final File file; + private final char pathSeperator; + private final int indents; private List mainHeader = Lists.newArrayList(); - private boolean loadHeaders; - public Configuration(File file) { - this.file = file; + public CommentStore(char pathSeperator, int indents) { + this.pathSeperator = pathSeperator; + this.indents = indents; } /** @@ -65,43 +61,13 @@ public class Configuration extends YamlConfiguration { return headers.get(key); } - public T get(String key, Class type) { - return type.cast(get(key)); - } - - /** - * Reload config from file. - */ - public void reload() { - reload(headers.isEmpty()); - } - - /** - * Reload config from file. - * - * @param loadHeaders Whether or not to load headers. - */ - public void reload(boolean loadHeaders) { - this.loadHeaders = loadHeaders; - try { - load(file); - } catch (Exception e) { - Bukkit.getLogger().log(Level.WARNING, "failed to reload file", e); - } - } - - @Override - public void loadFromString(String contents) throws InvalidConfigurationException { - if (!loadHeaders) { - super.loadFromString(contents); - return; - } + public void storeComments(InputStream inputStream) throws IOException { + InputStreamReader reader = new InputStreamReader(inputStream); + String contents = CharStreams.toString(reader); StringBuilder memoryData = new StringBuilder(); - // Parse headers - final int indentLength = options().indent(); - final String pathSeparator = Character.toString(options().pathSeparator()); + final String pathSeparator = Character.toString(this.pathSeperator); int currentIndents = 0; String key = ""; List headers = Lists.newArrayList(); @@ -122,12 +88,12 @@ public class Configuration extends YamlConfiguration { continue; } - int indents = indent / indentLength; + int indents = indent / this.indents; if (indents <= currentIndents) { // Remove last section of key String[] array = key.split(Pattern.quote(pathSeparator)); int backspace = currentIndents - indents + 1; - key = join(array, options().pathSeparator(), 0, array.length - backspace); + key = join(array, this.pathSeperator, 0, array.length - backspace); } // Add new section to key @@ -143,32 +109,13 @@ public class Configuration extends YamlConfiguration { headers = Lists.newArrayList(); } } - - // Parse remaining text - super.loadFromString(memoryData.toString()); - - // Clear bukkit header - options().header(null); } - /** - * Save config to file - */ - public void save() { - if (headers.isEmpty() && mainHeader.isEmpty()) { - try { - super.save(file); - } catch (IOException e) { - Bukkit.getLogger().log(Level.WARNING, "Failed to save file", e); - } - return; - } - + public void writeComments(String yaml, File output) throws IOException { // Custom save - final int indentLength = options().indent(); - final String pathSeparator = Character.toString(options().pathSeparator()); - String content = saveToString(); - StringBuilder fileData = new StringBuilder(buildHeader()); + final int indentLength = this.indents; + final String pathSeparator = Character.toString(this.pathSeperator); + StringBuilder fileData = new StringBuilder(); int currentIndents = 0; String key = ""; for (String h : mainHeader) { @@ -176,7 +123,7 @@ public class Configuration extends YamlConfiguration { fileData.append("#> ").append(h).append('\n'); } - for (String line : content.split("\n")) { + for (String line : yaml.split("\n")) { if (line.isEmpty()) continue; // Skip empty lines int indent = getSuccessiveCharCount(line, ' '); int indents = indent / indentLength; @@ -185,7 +132,7 @@ public class Configuration extends YamlConfiguration { // Remove last section of key String[] array = key.split(Pattern.quote(pathSeparator)); int backspace = currentIndents - indents + 1; - key = join(array, options().pathSeparator(), 0, array.length - backspace); + key = join(array, this.pathSeperator, 0, array.length - backspace); } // Add new section to key @@ -203,11 +150,9 @@ public class Configuration extends YamlConfiguration { // Write data to file FileWriter writer = null; try { - writer = new FileWriter(file); + writer = new FileWriter(output); writer.write(fileData.toString()); writer.flush(); - } catch (IOException e) { - Bukkit.getLogger().log(Level.WARNING, "Failed to save file", e); } finally { if (writer != null) { try { diff --git a/common/src/main/java/us/myles/ViaVersion/util/Config.java b/common/src/main/java/us/myles/ViaVersion/util/Config.java new file mode 100644 index 000000000..91dc44884 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/util/Config.java @@ -0,0 +1,150 @@ +package us.myles.ViaVersion.util; + +import org.yaml.snakeyaml.Yaml; +import us.myles.ViaVersion.api.configuration.ConfigurationProvider; + +import java.io.*; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public abstract class Config implements ConfigurationProvider { + private static ThreadLocal yaml = new ThreadLocal() { + @Override + protected Yaml initialValue() { + return new Yaml(); + } + }; + private CommentStore commentStore = new CommentStore('.', 2); + private final File configFile; + private Map config; + + public Config(File configFile) { + this.configFile = configFile; + reloadConfig(); + } + + public Map loadConfig(File location) { + List unsupported = getUnsupportedOptions(); + URL jarConfigFile = Config.class.getClassLoader().getResource("config.yml"); + try { + commentStore.storeComments(jarConfigFile.openStream()); + for (String option : unsupported) { + List comments = commentStore.header(option); + if (comments != null) { + comments.clear(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + Map config = null; + if (location.exists()) { + try (FileInputStream input = new FileInputStream(location)) { + config = (Map) yaml.get().load(input); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (config == null) { + config = new HashMap<>(); + } + + Map defaults = config; + try (InputStream stream = jarConfigFile.openStream()) { + defaults = (Map) yaml.get().load(stream); + for (String option : unsupported) { + defaults.remove(option); + } + // Merge with defaultLoader + for (Object key : config.keySet()) { + // Set option in new conf if exists + if (defaults.containsKey(key) && !unsupported.contains(key.toString())) { + defaults.put((String) key, config.get(key)); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + // Save + saveConfig(location, defaults); + + return defaults; + } + + public void saveConfig(File location, Map config) { + try { + commentStore.writeComments(yaml.get().dump(config), location); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public abstract List getUnsupportedOptions(); + + @Override + public void set(String path, Object value) { + set(path, value); + } + + @Override + public void saveConfig() { + this.configFile.getParentFile().mkdirs(); + saveConfig(this.configFile, this.config); + } + + @Override + public void reloadConfig() { + this.configFile.getParentFile().mkdirs(); + this.config = loadConfig(this.configFile); + } + + @Override + public Map getValues() { + return this.config; + } + + public boolean getBoolean(String key, boolean def) { + if (this.config.containsKey(key)) { + return (boolean) this.config.get(key); + } else { + return def; + } + } + + public String getString(String key, String def) { + if (this.config.containsKey(key)) { + return (String) this.config.get(key); + } else { + return def; + } + } + + public int getInt(String key, int def) { + if (this.config.containsKey(key)) { + return (int) this.config.get(key); + } else { + return def; + } + } + + public double getDouble(String key, double def) { + if (this.config.containsKey(key)) { + return (double) this.config.get(key); + } else { + return def; + } + } + + public List getIntegerList(String key) { + if (this.config.containsKey(key)) { + return (List) this.config.get(key); + } else { + return new ArrayList<>(); + } + } +} diff --git a/common/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java b/common/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java index dbf3af7ee..f44622297 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java +++ b/common/src/main/java/us/myles/ViaVersion/util/ReflectionUtil.java @@ -5,7 +5,6 @@ import com.google.common.collect.Maps; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.lang.reflect.Modifier; import java.util.Collection; import java.util.Collections; import java.util.Map; diff --git a/bukkit/src/main/resources/config.yml b/common/src/main/resources/config.yml similarity index 99% rename from bukkit/src/main/resources/config.yml rename to common/src/main/resources/config.yml index aac3ad695..ffb3bdf32 100644 --- a/bukkit/src/main/resources/config.yml +++ b/common/src/main/resources/config.yml @@ -32,7 +32,7 @@ reload-disconnect-msg: "Server reload, please rejoin!" # # What is the maximum per second a client can send (Use %pps to display their pps) # Use -1 to disable. -max-pps: 600 +max-pps: 800 max-pps-kick-msg: "You are sending too many packets!" # # We can also kick them if over a period they send over a threshold a certain amount of times. diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeConfigAPI.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeConfigAPI.java index e2ad17622..abab23463 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeConfigAPI.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeConfigAPI.java @@ -1,29 +1,22 @@ package us.myles.ViaVersion.sponge.platform; -import org.yaml.snakeyaml.Yaml; import us.myles.ViaVersion.api.ViaVersionConfig; -import us.myles.ViaVersion.api.configuration.ConfigurationProvider; +import us.myles.ViaVersion.util.Config; -import java.io.*; -import java.net.URL; -import java.util.ArrayList; -import java.util.HashMap; +import java.io.File; +import java.util.Arrays; import java.util.List; -import java.util.Map; -public class SpongeConfigAPI implements ViaVersionConfig, ConfigurationProvider { - private final File defaultConfig; - private Map config; - private ThreadLocal yaml = new ThreadLocal() { - @Override - protected Yaml initialValue() { - return new Yaml(); - } - }; +public class SpongeConfigAPI extends Config implements ViaVersionConfig { + private static List UNSUPPORTED = Arrays.asList("anti-xray-patch"); - public SpongeConfigAPI(File defaultConfig) { - this.defaultConfig = defaultConfig; - reloadConfig(); + public SpongeConfigAPI(File configFile) { + super(new File(configFile, "config.yml")); + } + + @Override + public List getUnsupportedOptions() { + return UNSUPPORTED; } public boolean isCheckForUpdates() { @@ -87,7 +80,7 @@ public class SpongeConfigAPI implements ViaVersionConfig, ConfigurationProvider @Override public int getMaxPPS() { - return getInt("max-pps", 140); + return getInt("max-pps", 800); } @Override @@ -117,7 +110,7 @@ public class SpongeConfigAPI implements ViaVersionConfig, ConfigurationProvider @Override public boolean isAntiXRay() { - return getBoolean("anti-xray-patch", true); + return false; } @Override @@ -174,107 +167,4 @@ public class SpongeConfigAPI implements ViaVersionConfig, ConfigurationProvider public String getReloadDisconnectMsg() { return getString("reload-disconnect-msg", "Server reload, please rejoin!"); } - - @Override - public void set(String path, Object value) { - config.put(path, value); - } - - @Override - public void saveConfig() { - if (!defaultConfig.isDirectory()) { - defaultConfig.mkdir(); - } - File config = new File(defaultConfig, "config.yml"); - try (FileWriter fw = new FileWriter(config)) { - yaml.get().dump(this.config, fw); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void reloadConfig() { - if (!defaultConfig.isDirectory()) { - defaultConfig.mkdir(); - } - File config = new File(defaultConfig, "config.yml"); - URL jarConfigFile = this.getClass().getClassLoader().getResource("config.yml"); - this.config = null; - if (config.exists()) { - try (FileInputStream input = new FileInputStream(config)) { - this.config = (Map) yaml.get().load(input); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if (this.config == null) { - this.config = new HashMap<>(); - } - Map defaults; - try (InputStream stream = jarConfigFile.openStream()) { - defaults = (Map) yaml.get().load(stream); - } catch (IOException e) { - e.printStackTrace(); - return; - } - // Merge with defaultLoader - for (Object key : this.config.keySet()) { - // Set option in new conf if exists - if (defaults.containsKey(key)) { - defaults.put(key, this.config.get(key)); - } - } - this.config = defaults; - // Save - saveConfig(); - - } - - public boolean getBoolean(String key, boolean def) { - if (this.config.containsKey(key)) { - return (boolean) this.config.get(key); - } else { - return def; - } - } - - public String getString(String key, String def) { - if (this.config.containsKey(key)) { - return (String) this.config.get(key); - } else { - return def; - } - } - - public int getInt(String key, int def) { - if (this.config.containsKey(key)) { - return (int) this.config.get(key); - } else { - return def; - } - } - - public double getDouble(String key, double def) { - if (this.config.containsKey(key)) { - return (double) this.config.get(key); - } else { - return def; - } - } - - public List getIntegerList(String key) { - if (this.config.containsKey(key)) { - return (List) this.config.get(key); - } else { - return new ArrayList<>(); - } - } - - @Override - public Map getValues() { - return (Map) ((Map) this.config); - } } From b2df970af5767bddf15bf877b338609cf8fb4ac1 Mon Sep 17 00:00:00 2001 From: Matsv Date: Fri, 30 Sep 2016 16:20:29 +0200 Subject: [PATCH 52/76] Implement removePortedClient on Bungee --- .../src/main/java/us/myles/ViaVersion/Bungee.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java b/bungee/src/main/java/us/myles/ViaVersion/Bungee.java index b8670fe47..f60c51d9c 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java +++ b/bungee/src/main/java/us/myles/ViaVersion/Bungee.java @@ -4,7 +4,10 @@ import com.google.gson.JsonObject; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.event.PlayerDisconnectEvent; +import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.api.plugin.Plugin; +import net.md_5.bungee.event.EventHandler; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaAPI; import us.myles.ViaVersion.api.ViaVersionConfig; @@ -20,7 +23,7 @@ import us.myles.ViaVersion.bungee.platform.*; import java.util.UUID; import java.util.concurrent.TimeUnit; -public class Bungee extends Plugin implements ViaPlatform { +public class Bungee extends Plugin implements ViaPlatform, Listener { private BungeeViaAPI api; private BungeeConfigAPI config; @@ -39,6 +42,8 @@ public class Bungee extends Plugin implements ViaPlatform { .loader(new BungeeViaLoader()) .commandHandler(commandHandler) .build()); + + getProxy().getPluginManager().registerListener(this, this); } @Override @@ -132,7 +137,12 @@ public class Bungee extends Plugin implements ViaPlatform { @Override public JsonObject getDump() { - return null; + return new JsonObject(); + } + + @EventHandler + public void onQuit(PlayerDisconnectEvent e) { + Via.getManager().removePortedClient(e.getPlayer().getUniqueId()); } } From 655e14b36e8b90eebd498c0d7b99a4e6ff1a8aae Mon Sep 17 00:00:00 2001 From: Myles Date: Fri, 30 Sep 2016 16:30:28 +0100 Subject: [PATCH 53/76] Make dumping pretty print + add Bungee dumping --- .../{Bungee.java => BungeePlugin.java} | 18 ++++++++++++++++-- bungee/src/main/resources/bungee.yml | 4 ++-- .../commands/defaultsubs/DumpSubCmd.java | 2 +- 3 files changed, 19 insertions(+), 5 deletions(-) rename bungee/src/main/java/us/myles/ViaVersion/{Bungee.java => BungeePlugin.java} (84%) diff --git a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java similarity index 84% rename from bungee/src/main/java/us/myles/ViaVersion/Bungee.java rename to bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java index f60c51d9c..425a158db 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/Bungee.java +++ b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java @@ -19,11 +19,16 @@ import us.myles.ViaVersion.bungee.commands.BungeeCommand; import us.myles.ViaVersion.bungee.commands.BungeeCommandHandler; import us.myles.ViaVersion.bungee.commands.BungeeCommandSender; import us.myles.ViaVersion.bungee.platform.*; +import us.myles.ViaVersion.dump.PluginInfo; +import us.myles.ViaVersion.util.GsonUtil; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; -public class Bungee extends Plugin implements ViaPlatform, Listener { +public class BungeePlugin extends Plugin implements ViaPlatform, Listener { private BungeeViaAPI api; private BungeeConfigAPI config; @@ -137,7 +142,16 @@ public class Bungee extends Plugin implements ViaPlatform, Listener { @Override public JsonObject getDump() { - return new JsonObject(); + JsonObject platformSpecific = new JsonObject(); + + List plugins = new ArrayList<>(); + for (Plugin p : ProxyServer.getInstance().getPluginManager().getPlugins()) + plugins.add(new PluginInfo(true, p.getDescription().getName(), p.getDescription().getVersion(), p.getDescription().getMain(), Arrays.asList(p.getDescription().getAuthor()))); + + platformSpecific.add("plugins", GsonUtil.getGson().toJsonTree(plugins)); + // TODO more? ProtocolLib things etc? + + return platformSpecific; } @EventHandler diff --git a/bungee/src/main/resources/bungee.yml b/bungee/src/main/resources/bungee.yml index 216d2e7cf..37b6dc108 100644 --- a/bungee/src/main/resources/bungee.yml +++ b/bungee/src/main/resources/bungee.yml @@ -1,4 +1,4 @@ name: ViaVersion -main: us.myles.ViaVersion.Bungee -author: _MylesC +main: us.myles.ViaVersion.BungeePlugin +author: _MylesC, Matsv version: ${project.version} \ No newline at end of file diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java index afe0ac19f..6c99ee559 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java @@ -57,7 +57,7 @@ public class DumpSubCmd extends ViaSubCommand { con.setDoOutput(true); OutputStream out = con.getOutputStream(); - out.write(GsonUtil.getGson().toJson(template).getBytes(Charset.forName("UTF-8"))); + out.write(GsonUtil.getGsonBuilder().setPrettyPrinting().create().toJson(template).getBytes(Charset.forName("UTF-8"))); out.close(); JsonObject output = GsonUtil.getGson().fromJson(new InputStreamReader(con.getInputStream()), JsonObject.class); From 7031d431daade91f39580c4d89443abe9da6b76b Mon Sep 17 00:00:00 2001 From: Matsv Date: Fri, 30 Sep 2016 20:08:39 +0200 Subject: [PATCH 54/76] Implement 1_11 entity / parent class structure and patch holograms the other way around! Thanks for fixing Mojang :-) #482 --- .../bukkit/platform/BukkitConfigAPI.java | 2 +- .../bungee/platform/BungeeConfigAPI.java | 2 +- .../entities/Entity1_10Types.java} | 16 +- .../api/entities/Entity1_11Types.java | 241 ++++++++++++++++++ .../protocol1_9to1_8/metadata/MetaIndex.java | 18 +- .../metadata/MetadataRewriter.java | 6 +- .../packets/PlayerPackets.java | 4 +- .../packets/SpawnPackets.java | 16 +- .../storage/EntityTracker.java | 26 +- .../MetadataRewriter.java | 93 +++++-- .../ProtocolSnapshotTo1_10.java | 76 +++++- .../storage/EntityTracker.java | 41 ++- common/src/main/resources/config.yml | 17 +- .../sponge/platform/SpongeConfigAPI.java | 2 +- 14 files changed, 471 insertions(+), 89 deletions(-) rename common/src/main/java/us/myles/ViaVersion/{util/EntityUtil.java => api/entities/Entity1_10Types.java} (94%) create mode 100644 common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_11Types.java diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitConfigAPI.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitConfigAPI.java index 3ed1fd2f5..c7141606f 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitConfigAPI.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitConfigAPI.java @@ -33,7 +33,7 @@ public class BukkitConfigAPI extends Config implements ViaVersionConfig { @Override public boolean isShowNewDeathMessages() { - return getBoolean("use-new-deathmessages", false); + return getBoolean("use-new-deathmessages", true); } @Override diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java index 19092b5f9..6b94997ac 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java @@ -35,7 +35,7 @@ public class BungeeConfigAPI extends Config implements ViaVersionConfig { @Override public boolean isShowNewDeathMessages() { - return getBoolean("use-new-deathmessages", false); + return getBoolean("use-new-deathmessages", true); } @Override diff --git a/common/src/main/java/us/myles/ViaVersion/util/EntityUtil.java b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_10Types.java similarity index 94% rename from common/src/main/java/us/myles/ViaVersion/util/EntityUtil.java rename to common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_10Types.java index 1daa36912..5eb990872 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/EntityUtil.java +++ b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_10Types.java @@ -1,4 +1,4 @@ -package us.myles.ViaVersion.util; +package us.myles.ViaVersion.api.entities; import com.google.common.base.Optional; import lombok.AllArgsConstructor; @@ -6,13 +6,13 @@ import lombok.Getter; import us.myles.ViaVersion.api.Via; // 1.10 Entity / Object ids -public class EntityUtil { +public class Entity1_10Types { - public static EntityType getTypeFromID(int typeID, boolean isObject) { + public static EntityType getTypeFromId(int typeID, boolean isObject) { Optional type; if (isObject) - type = PCObjectTypes.getPCEntity(typeID); + type = ObjectTypes.getPCEntity(typeID); else type = EntityType.findById(typeID); @@ -135,7 +135,7 @@ public class EntityUtil { @AllArgsConstructor @Getter - public enum PCObjectTypes { + public enum ObjectTypes { BOAT(1, EntityType.BOAT), ITEM(2, EntityType.DROPPED_ITEM), AREA_EFFECT_CLOUD(3, EntityType.AREA_EFFECT_CLOUD), @@ -165,11 +165,11 @@ public class EntityUtil { private final int id; private final EntityType type; - public static Optional findById(int id) { + public static Optional findById(int id) { if (id == -1) return Optional.absent(); - for (PCObjectTypes ent : PCObjectTypes.values()) + for (ObjectTypes ent : ObjectTypes.values()) if (ent.getId() == id) return Optional.of(ent); @@ -177,7 +177,7 @@ public class EntityUtil { } public static Optional getPCEntity(int id) { - Optional output = findById(id); + Optional output = findById(id); if (!output.isPresent()) return Optional.absent(); diff --git a/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_11Types.java b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_11Types.java new file mode 100644 index 000000000..a04c8fe25 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_11Types.java @@ -0,0 +1,241 @@ +package us.myles.ViaVersion.api.entities; + +import com.google.common.base.Optional; +import lombok.AllArgsConstructor; +import lombok.Getter; +import us.myles.ViaVersion.api.Via; + +// 1.11 Entity / Object ids TODO maybe in the future instead of copying it, some api. +public class Entity1_11Types { + public static EntityType getTypeFromId(int typeID, boolean isObject) { + Optional type; + + if (isObject) + type = ObjectTypes.getPCEntity(typeID); + else + type = EntityType.findById(typeID); + + if (!type.isPresent()) { + Via.getPlatform().getLogger().severe("Could not find type id " + typeID + " isObject=" + isObject); + return EntityType.ENTITY; // Fall back to the basic ENTITY + } + + return type.get(); + } + + @AllArgsConstructor + @Getter + public enum EntityType { + ENTITY(-1), + DROPPED_ITEM(1, ENTITY), + EXPERIENCE_ORB(2, ENTITY), + LEASH_HITCH(8, ENTITY), // Actually entity hanging but it doesn't make a lot of difference for metadata + PAINTING(9, ENTITY), // Actually entity hanging but it doesn't make a lot of difference for metadata + ARROW(10, ENTITY), + SNOWBALL(11, ENTITY), // Actually EntityProjectile + FIREBALL(12, ENTITY), + SMALL_FIREBALL(13, ENTITY), + ENDER_PEARL(14, ENTITY), // Actually EntityProjectile + ENDER_SIGNAL(15, ENTITY), + THROWN_EXP_BOTTLE(17, ENTITY), + ITEM_FRAME(18, ENTITY), // Actually EntityHanging + WITHER_SKULL(19, ENTITY), + PRIMED_TNT(20, ENTITY), + FALLING_BLOCK(21, ENTITY), + FIREWORK(22, ENTITY), + TIPPED_ARROW(23, ARROW), + SPECTRAL_ARROW(24, ARROW), + SHULKER_BULLET(25, ENTITY), + DRAGON_FIREBALL(26, FIREBALL), + EVOCATION_FANGS(33, ENTITY), + + + ENTITY_LIVING(-1, ENTITY), + ENTITY_INSENTIENT(-1, ENTITY_LIVING), + ENTITY_AGEABLE(-1, ENTITY_INSENTIENT), + ENTITY_TAMEABLE_ANIMAL(-1, ENTITY_AGEABLE), + ENTITY_HUMAN(-1, ENTITY_LIVING), + + ARMOR_STAND(30, ENTITY_LIVING), + EVOCATION_ILLAGER(34, ENTITY_INSENTIENT), + VEX(35, ENTITY_INSENTIENT), + VINDICATION_ILLAGER(36, ENTITY_INSENTIENT), + + // Vehicles + MINECART_ABSTRACT(-1, ENTITY), + MINECART_COMMAND(40, MINECART_ABSTRACT), + BOAT(41, ENTITY), + MINECART_RIDEABLE(42, MINECART_ABSTRACT), + MINECART_CHEST(43, MINECART_ABSTRACT), + MINECART_FURNACE(44, MINECART_ABSTRACT), + MINECART_TNT(45, MINECART_ABSTRACT), + MINECART_HOPPER(46, MINECART_ABSTRACT), + MINECART_MOB_SPAWNER(47, MINECART_ABSTRACT), + + CREEPER(50, ENTITY_INSENTIENT), + + ABSTRACT_SKELETON(-1, ENTITY_INSENTIENT), + SKELETON(51, ABSTRACT_SKELETON), + WITHER_SKELETON(5, ABSTRACT_SKELETON), + STRAY(6, ABSTRACT_SKELETON), + + SPIDER(52, ENTITY_INSENTIENT), + GIANT(53, ENTITY_INSENTIENT), + + ZOMBIE(54, ENTITY_INSENTIENT), + HUSK(23, ZOMBIE), + ZOMBIE_VILLAGER(27, ZOMBIE), + + SLIME(55, ENTITY_INSENTIENT), + GHAST(56, ENTITY_INSENTIENT), + PIG_ZOMBIE(57, ZOMBIE), + ENDERMAN(58, ENTITY_INSENTIENT), + CAVE_SPIDER(59, SPIDER), + SILVERFISH(60, ENTITY_INSENTIENT), + BLAZE(61, ENTITY_INSENTIENT), + MAGMA_CUBE(62, SLIME), + ENDER_DRAGON(63, ENTITY_INSENTIENT), + WITHER(64, ENTITY_INSENTIENT), + BAT(65, ENTITY_INSENTIENT), + WITCH(66, ENTITY_INSENTIENT), + ENDERMITE(67, ENTITY_INSENTIENT), + + GUARDIAN(68, ENTITY_INSENTIENT), + ELDER_GUARDIAN(4, EntityType.GUARDIAN), // Moved down to avoid illegal forward reference + + IRON_GOLEM(99, ENTITY_INSENTIENT), // moved up to avoid illegal forward references + SHULKER(69, EntityType.IRON_GOLEM), + PIG(90, ENTITY_AGEABLE), + SHEEP(91, ENTITY_AGEABLE), + COW(92, ENTITY_AGEABLE), + CHICKEN(93, ENTITY_AGEABLE), + SQUID(94, ENTITY_INSENTIENT), + WOLF(95, ENTITY_TAMEABLE_ANIMAL), + MUSHROOM_COW(96, COW), + SNOWMAN(97, EntityType.IRON_GOLEM), + OCELOT(98, ENTITY_TAMEABLE_ANIMAL), + + ABSTRACT_HORSE(-1, ENTITY_AGEABLE), + HORSE(100, ABSTRACT_HORSE), + SKELETON_HORSE(28, ABSTRACT_HORSE), + ZOMBIE_HORSE(29, ABSTRACT_HORSE), + + CHESTED_HORSE(-1, ABSTRACT_HORSE), + DONKEY(31, CHESTED_HORSE), + MULE(32, CHESTED_HORSE), + LIAMA(103, CHESTED_HORSE), + + + RABBIT(101, ENTITY_AGEABLE), + POLAR_BEAR(102, ENTITY_AGEABLE), + VILLAGER(120, ENTITY_AGEABLE), + ENDER_CRYSTAL(200, ENTITY), + SPLASH_POTION(-1, ENTITY), + LINGERING_POTION(-1, SPLASH_POTION), + AREA_EFFECT_CLOUD(-1, ENTITY), + EGG(-1, ENTITY), + FISHING_HOOK(-1, ENTITY), + LIGHTNING(-1, ENTITY), + WEATHER(-1, ENTITY), + PLAYER(-1, ENTITY_HUMAN), + COMPLEX_PART(-1, ENTITY), + LIAMA_SPIT(-1, ENTITY); + + private final int id; + private final EntityType parent; + + EntityType(int id) { + this.id = id; + this.parent = null; + } + + public static Optional findById(int id) { + if (id == -1) // Check if this is called + return Optional.absent(); + + for (EntityType ent : EntityType.values()) + if (ent.getId() == id) + return Optional.of(ent); + + return Optional.absent(); + } + + public boolean is(EntityType type) { + return this == type; + } + + public boolean is(EntityType... types) { + for (EntityType type : types) + if (is(type)) + return true; + return false; + } + + public boolean isOrHasParent(EntityType type) { + EntityType parent = this; + + do { + if (parent == type) + return true; + + parent = type.getParent(); + } while (parent != null); + + return false; + } + } + + @AllArgsConstructor + @Getter + public enum ObjectTypes { + BOAT(1, EntityType.BOAT), + ITEM(2, EntityType.DROPPED_ITEM), + AREA_EFFECT_CLOUD(3, EntityType.AREA_EFFECT_CLOUD), + MINECART(10, EntityType.MINECART_ABSTRACT), + TNT_PRIMED(50, EntityType.PRIMED_TNT), + ENDER_CRYSTAL(51, EntityType.ENDER_CRYSTAL), + TIPPED_ARROW(60, EntityType.TIPPED_ARROW), + SNOWBALL(61, EntityType.SNOWBALL), + EGG(62, EntityType.EGG), + FIREBALL(63, EntityType.FIREBALL), + SMALL_FIREBALL(64, EntityType.SMALL_FIREBALL), + ENDER_PEARL(65, EntityType.ENDER_PEARL), + WITHER_SKULL(66, EntityType.WITHER_SKULL), + SHULKER_BULLET(67, EntityType.SHULKER_BULLET), + LIAMA_SPIT(68, EntityType.LIAMA_SPIT), + FALLING_BLOCK(70, EntityType.FALLING_BLOCK), + ITEM_FRAME(71, EntityType.ITEM_FRAME), + ENDER_SIGNAL(72, EntityType.ENDER_SIGNAL), + POTION(73, EntityType.SPLASH_POTION), + THROWN_EXP_BOTTLE(75, EntityType.THROWN_EXP_BOTTLE), + FIREWORK(76, EntityType.FIREWORK), + LEASH(77, EntityType.LEASH_HITCH), + ARMOR_STAND(78, EntityType.ARMOR_STAND), + EVOCATION_FANGS(39, EntityType.EVOCATION_FANGS), + FISHIHNG_HOOK(90, EntityType.FISHING_HOOK), + SPECTRAL_ARROW(91, EntityType.SPECTRAL_ARROW), + DRAGON_FIREBALL(93, EntityType.DRAGON_FIREBALL); + + private final int id; + private final EntityType type; + + public static Optional findById(int id) { + if (id == -1) + return Optional.absent(); + + for (ObjectTypes ent : ObjectTypes.values()) + if (ent.getId() == id) + return Optional.of(ent); + + return Optional.absent(); + } + + public static Optional getPCEntity(int id) { + Optional output = findById(id); + + if (!output.isPresent()) + return Optional.absent(); + return Optional.of(output.get().getType()); + } + } +} diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java index 08ccfb5d4..ffe476089 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetaIndex.java @@ -3,13 +3,13 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata; import com.google.common.base.Optional; import lombok.Getter; import us.myles.ViaVersion.api.Pair; +import us.myles.ViaVersion.api.entities.Entity1_10Types; import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_8; import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_9; -import us.myles.ViaVersion.util.EntityUtil; import java.util.HashMap; -import static us.myles.ViaVersion.util.EntityUtil.EntityType.*; +import static us.myles.ViaVersion.api.entities.Entity1_10Types.EntityType.*; @Getter public enum MetaIndex { @@ -142,20 +142,20 @@ public enum MetaIndex { ENDERDRAGON_FLAG(ENDER_DRAGON, 15, MetaType1_8.Byte, MetaType1_9.Discontinued), ENDERDRAGON_PHASE(ENDER_DRAGON, 11, MetaType1_8.Byte, MetaType1_9.VarInt); - private static final HashMap, MetaIndex> metadataRewrites = new HashMap<>(); + private static final HashMap, MetaIndex> metadataRewrites = new HashMap<>(); static { for (MetaIndex index : MetaIndex.values()) metadataRewrites.put(new Pair<>(index.getClazz(), index.getIndex()), index); } - private EntityUtil.EntityType clazz; + private Entity1_10Types.EntityType clazz; private int newIndex; private MetaType1_9 newType; private MetaType1_8 oldType; private int index; - MetaIndex(EntityUtil.EntityType type, int index, MetaType1_8 oldType, MetaType1_9 newType) { + MetaIndex(Entity1_10Types.EntityType type, int index, MetaType1_8 oldType, MetaType1_9 newType) { this.clazz = type; this.index = index; this.newIndex = index; @@ -163,7 +163,7 @@ public enum MetaIndex { this.newType = newType; } - MetaIndex(EntityUtil.EntityType type, int index, MetaType1_8 oldType, int newIndex, MetaType1_9 newType) { + MetaIndex(Entity1_10Types.EntityType type, int index, MetaType1_8 oldType, int newIndex, MetaType1_9 newType) { this.clazz = type; this.index = index; this.oldType = oldType; @@ -171,7 +171,7 @@ public enum MetaIndex { this.newType = newType; } - private static Optional getIndex(EntityUtil.EntityType type, int index) { + private static Optional getIndex(Entity1_10Types.EntityType type, int index) { Pair pair = new Pair<>(type, index); if (metadataRewrites.containsKey(pair)) { return Optional.of(metadataRewrites.get(pair)); @@ -180,8 +180,8 @@ public enum MetaIndex { return Optional.absent(); } - public static MetaIndex searchIndex(EntityUtil.EntityType type, int index) { - EntityUtil.EntityType currentType = type; + public static MetaIndex searchIndex(Entity1_10Types.EntityType type, int index) { + Entity1_10Types.EntityType currentType = type; do { Optional optMeta = getIndex(currentType, index); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java index 5966d249a..1fecbb7d8 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/metadata/MetadataRewriter.java @@ -1,6 +1,7 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata; import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.entities.Entity1_10Types; import us.myles.ViaVersion.api.minecraft.EulerAngle; import us.myles.ViaVersion.api.minecraft.Vector; import us.myles.ViaVersion.api.minecraft.item.Item; @@ -10,14 +11,13 @@ import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_8; import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_9; import us.myles.ViaVersion.protocols.protocol1_9to1_8.ItemRewriter; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; -import us.myles.ViaVersion.util.EntityUtil; import java.util.ArrayList; import java.util.List; import java.util.UUID; public class MetadataRewriter { - public static void transform(EntityUtil.EntityType type, List list) { + public static void transform(Entity1_10Types.EntityType type, List list) { short id = -1; int data = -1; for (Metadata entry : new ArrayList<>(list)) { @@ -40,7 +40,7 @@ public class MetadataRewriter { entry.setValue(((Integer) value).byteValue()); } // After writing the last one - if (metaIndex == MetaIndex.ENTITY_STATUS && type == EntityUtil.EntityType.PLAYER) { + if (metaIndex == MetaIndex.ENTITY_STATUS && type == Entity1_10Types.EntityType.PLAYER) { Byte val = 0; if ((((Byte) value) & 0x10) == 0x10) { // Player eating/aiming/drinking val = 1; diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/PlayerPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/PlayerPackets.java index 7b3455f4c..aa8559ad0 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/PlayerPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/PlayerPackets.java @@ -4,6 +4,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.entities.Entity1_10Types; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.api.remapper.PacketHandler; @@ -19,7 +20,6 @@ import us.myles.ViaVersion.protocols.protocol1_9to1_8.chat.ChatRewriter; import us.myles.ViaVersion.protocols.protocol1_9to1_8.chat.GameMode; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.EntityTracker; -import us.myles.ViaVersion.util.EntityUtil; public class PlayerPackets { public static void register(Protocol protocol) { @@ -165,7 +165,7 @@ public class PlayerPackets { public void handle(PacketWrapper wrapper) throws Exception { int entityID = wrapper.get(Type.INT, 0); EntityTracker tracker = wrapper.user().get(EntityTracker.class); - tracker.getClientEntityTypes().put(entityID, EntityUtil.EntityType.PLAYER); + tracker.getClientEntityTypes().put(entityID, Entity1_10Types.EntityType.PLAYER); tracker.setEntityID(entityID); } }); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java index d3d905255..e868c427a 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java @@ -1,6 +1,7 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8.packets; import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.entities.Entity1_10Types; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_9; @@ -17,7 +18,6 @@ import us.myles.ViaVersion.protocols.protocol1_9to1_8.ItemRewriter; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; import us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata.MetadataRewriter; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.EntityTracker; -import us.myles.ViaVersion.util.EntityUtil; import java.util.ArrayList; import java.util.List; @@ -54,7 +54,7 @@ public class SpawnPackets { int entityID = wrapper.get(Type.VAR_INT, 0); int typeID = wrapper.get(Type.BYTE, 0); EntityTracker tracker = wrapper.user().get(EntityTracker.class); - tracker.getClientEntityTypes().put(entityID, EntityUtil.getTypeFromID(typeID, true)); + tracker.getClientEntityTypes().put(entityID, Entity1_10Types.getTypeFromId(typeID, true)); tracker.sendMetadataBuffer(entityID); } }); @@ -95,7 +95,7 @@ public class SpawnPackets { final int data = wrapper.get(Type.INT, 0); // Data int typeID = wrapper.get(Type.BYTE, 0); - if (EntityUtil.getTypeFromID(typeID, true) == EntityUtil.EntityType.SPLASH_POTION) { + if (Entity1_10Types.getTypeFromId(typeID, true) == Entity1_10Types.EntityType.SPLASH_POTION) { // Convert this to meta data, woo! PacketWrapper metaPacket = wrapper.create(0x39, new ValueCreator() { @Override @@ -129,7 +129,7 @@ public class SpawnPackets { public void handle(PacketWrapper wrapper) throws Exception { int entityID = wrapper.get(Type.VAR_INT, 0); EntityTracker tracker = wrapper.user().get(EntityTracker.class); - tracker.getClientEntityTypes().put(entityID, EntityUtil.EntityType.EXPERIENCE_ORB); + tracker.getClientEntityTypes().put(entityID, Entity1_10Types.EntityType.EXPERIENCE_ORB); tracker.sendMetadataBuffer(entityID); } }); @@ -155,7 +155,7 @@ public class SpawnPackets { // Currently only lightning uses this int entityID = wrapper.get(Type.VAR_INT, 0); EntityTracker tracker = wrapper.user().get(EntityTracker.class); - tracker.getClientEntityTypes().put(entityID, EntityUtil.EntityType.LIGHTNING); + tracker.getClientEntityTypes().put(entityID, Entity1_10Types.EntityType.LIGHTNING); tracker.sendMetadataBuffer(entityID); } }); @@ -189,7 +189,7 @@ public class SpawnPackets { int entityID = wrapper.get(Type.VAR_INT, 0); int typeID = wrapper.get(Type.UNSIGNED_BYTE, 0); EntityTracker tracker = wrapper.user().get(EntityTracker.class); - tracker.getClientEntityTypes().put(entityID, EntityUtil.getTypeFromID(typeID, false)); + tracker.getClientEntityTypes().put(entityID, Entity1_10Types.getTypeFromId(typeID, false)); tracker.sendMetadataBuffer(entityID); } }); @@ -246,7 +246,7 @@ public class SpawnPackets { public void handle(PacketWrapper wrapper) throws Exception { int entityID = wrapper.get(Type.VAR_INT, 0); EntityTracker tracker = wrapper.user().get(EntityTracker.class); - tracker.getClientEntityTypes().put(entityID, EntityUtil.EntityType.PAINTING); + tracker.getClientEntityTypes().put(entityID, Entity1_10Types.EntityType.PAINTING); tracker.sendMetadataBuffer(entityID); } }); @@ -280,7 +280,7 @@ public class SpawnPackets { public void handle(PacketWrapper wrapper) throws Exception { int entityID = wrapper.get(Type.VAR_INT, 0); EntityTracker tracker = wrapper.user().get(EntityTracker.class); - tracker.getClientEntityTypes().put(entityID, EntityUtil.EntityType.PLAYER); + tracker.getClientEntityTypes().put(entityID, Entity1_10Types.EntityType.PLAYER); tracker.sendMetadataBuffer(entityID); } }); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java index 294d7eee2..b1521fc18 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java @@ -13,6 +13,7 @@ import us.myles.ViaVersion.api.boss.BossColor; import us.myles.ViaVersion.api.boss.BossStyle; import us.myles.ViaVersion.api.data.StoredObject; import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.entities.Entity1_10Types; import us.myles.ViaVersion.api.minecraft.Position; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; @@ -23,7 +24,6 @@ import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; import us.myles.ViaVersion.protocols.protocol1_9to1_8.chat.GameMode; import us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata.MetadataRewriter; -import us.myles.ViaVersion.util.EntityUtil; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -32,7 +32,7 @@ import java.util.concurrent.TimeUnit; @Getter public class EntityTracker extends StoredObject { private final Map uuidMap = new ConcurrentHashMap<>(); - private final Map clientEntityTypes = new ConcurrentHashMap<>(); + private final Map clientEntityTypes = new ConcurrentHashMap<>(); private final Map> metadataBuffer = new ConcurrentHashMap<>(); private final Map vehicleMap = new ConcurrentHashMap<>(); private final Map bossBarMap = new ConcurrentHashMap<>(); @@ -116,37 +116,37 @@ public class EntityTracker extends StoredObject { return; } - EntityUtil.EntityType type = clientEntityTypes.get(entityID); + Entity1_10Types.EntityType type = clientEntityTypes.get(entityID); for (Metadata metadata : new ArrayList<>(metadataList)) { // Fix: wither (crash fix) - if (type == EntityUtil.EntityType.WITHER) { + if (type == Entity1_10Types.EntityType.WITHER) { if (metadata.getId() == 10) { metadataList.remove(metadata); //metadataList.add(new Metadata(10, NewType.Byte.getTypeID(), Type.BYTE, 0)); } } // Fix: enderdragon (crash fix) - if (type == EntityUtil.EntityType.ENDER_DRAGON) { + if (type == Entity1_10Types.EntityType.ENDER_DRAGON) { if (metadata.getId() == 11) { metadataList.remove(metadata); // metadataList.add(new Metadata(11, NewType.Byte.getTypeID(), Type.VAR_INT, 0)); } } - if (type == EntityUtil.EntityType.SKELETON) { + if (type == Entity1_10Types.EntityType.SKELETON) { if ((getMetaByIndex(metadataList, 12)) == null) { metadataList.add(new Metadata(12, MetaType1_9.Boolean, true)); } } //ECHOPET Patch - if (type == EntityUtil.EntityType.HORSE) { + if (type == Entity1_10Types.EntityType.HORSE) { // Wrong metadata value from EchoPet, patch since it's discontinued. (https://github.com/DSH105/EchoPet/blob/06947a8b08ce40be9a518c2982af494b3b99d140/modules/API/src/main/java/com/dsh105/echopet/compat/api/entity/HorseArmour.java#L22) if (metadata.getId() == 16 && (int) metadata.getValue() == Integer.MIN_VALUE) metadata.setValue(0); } - if (type == EntityUtil.EntityType.PLAYER) { + if (type == Entity1_10Types.EntityType.PLAYER) { if (metadata.getId() == 0) { // Byte byte data = (byte) metadata.getValue(); @@ -162,7 +162,7 @@ public class EntityTracker extends StoredObject { } } } - if (type == EntityUtil.EntityType.ARMOR_STAND && Via.getConfig().isHologramPatch()) { + if (type == Entity1_10Types.EntityType.ARMOR_STAND && Via.getConfig().isHologramPatch()) { if (metadata.getId() == 0 && getMetaByIndex(metadataList, 10) != null) { Metadata meta = getMetaByIndex(metadataList, 10); //Only happens if the armorstand is small byte data = (byte) metadata.getValue(); @@ -190,11 +190,11 @@ public class EntityTracker extends StoredObject { UUID uuid = getUser().get(ProtocolInfo.class).getUuid(); // Boss bar if (Via.getConfig().isBossbarPatch()) { - if (type == EntityUtil.EntityType.ENDER_DRAGON || type == EntityUtil.EntityType.WITHER) { + if (type == Entity1_10Types.EntityType.ENDER_DRAGON || type == Entity1_10Types.EntityType.WITHER) { if (metadata.getId() == 2) { BossBar bar = bossBarMap.get(entityID); String title = (String) metadata.getValue(); - title = title.isEmpty() ? (type == EntityUtil.EntityType.ENDER_DRAGON ? "Ender Dragon" : "Wither") : title; + title = title.isEmpty() ? (type == Entity1_10Types.EntityType.ENDER_DRAGON ? "Ender Dragon" : "Wither") : title; if (bar == null) { bar = Via.getAPI().createBossBar(title, BossColor.PINK, BossStyle.SOLID); bossBarMap.put(entityID, bar); @@ -206,10 +206,10 @@ public class EntityTracker extends StoredObject { } else if (metadata.getId() == 6 && !Via.getConfig().isBossbarAntiflicker()) { // If anti flicker is enabled, don't update health BossBar bar = bossBarMap.get(entityID); // Make health range between 0 and 1 - float maxHealth = type == EntityUtil.EntityType.ENDER_DRAGON ? 200.0f : 300.0f; + float maxHealth = type == Entity1_10Types.EntityType.ENDER_DRAGON ? 200.0f : 300.0f; float health = Math.max(0.0f, Math.min(((float) metadata.getValue()) / maxHealth, 1.0f)); if (bar == null) { - String title = type == EntityUtil.EntityType.ENDER_DRAGON ? "Ender Dragon" : "Wither"; + String title = type == Entity1_10Types.EntityType.ENDER_DRAGON ? "Ender Dragon" : "Wither"; bar = Via.getAPI().createBossBar(title, health, BossColor.PINK, BossStyle.SOLID); bossBarMap.put(entityID, bar); bar.addPlayer(uuid); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java index 5c42e7714..4d382f9eb 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java @@ -1,39 +1,52 @@ package us.myles.ViaVersion.protocols.protocolsnapshotto1_10; import com.google.common.base.Optional; +import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.entities.Entity1_11Types.EntityType; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_9; +import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.protocols.protocolsnapshotto1_10.storage.EntityTracker; import java.util.ArrayList; import java.util.List; public class MetadataRewriter { - public static int rewriteEntityType(int currentType, List metadata) { + public static EntityType rewriteEntityType(int numType, List metadata) { + Optional optType = EntityType.findById(numType); + if (!optType.isPresent()) { + Via.getManager().getPlatform().getLogger().severe("Error: could not find Entity type " + numType + " with metadata: " + metadata); + return null; + } + + EntityType type = optType.get(); + try { - if (currentType == 68) { + if (type.is(EntityType.GUARDIAN)) { // ElderGuardian - 4 Optional options = getById(metadata, 12); if (options.isPresent()) { if ((((byte) options.get().getValue()) & 0x04) == 0x04) { - return 4; + return EntityType.ELDER_GUARDIAN; } } } - if (currentType == 51) { + if (type.is(EntityType.SKELETON)) { // WitherSkeleton - 5 // Stray - 6 Optional options = getById(metadata, 12); if (options.isPresent()) { if (((int) options.get().getValue()) == 1) { - return 5; + return EntityType.WITHER_SKELETON; } if (((int) options.get().getValue()) == 2) { - return 6; + return EntityType.STRAY; } } } - if (currentType == 54) { + if (type.is(EntityType.ZOMBIE)) { // ZombieVillager - 27 // Husk - 23 Optional options = getById(metadata, 13); @@ -41,14 +54,14 @@ public class MetadataRewriter { int value = (int) options.get().getValue(); if (value > 0 && value < 6) { metadata.add(new Metadata(16, MetaType1_9.VarInt, value - 1)); // Add profession type to new metadata - return 27; + return EntityType.ZOMBIE_VILLAGER; } if (value == 6) { - return 23; + return EntityType.HUSK; } } } - if (currentType == 100) { + if (type.is(EntityType.HORSE)) { // SkeletonHorse - 28 // ZombieHorse - 29 // Donkey - 31 @@ -56,23 +69,22 @@ public class MetadataRewriter { Optional options = getById(metadata, 14); if (options.isPresent()) { if (((int) options.get().getValue()) == 0) { - return currentType; + return EntityType.HORSE; } if (((int) options.get().getValue()) == 1) { - return 31; + return EntityType.DONKEY; } if (((int) options.get().getValue()) == 2) { - return 32; + return EntityType.MULE; } if (((int) options.get().getValue()) == 3) { - return 29; + return EntityType.ZOMBIE_HORSE; } if (((int) options.get().getValue()) == 4) { - return 28; + return EntityType.SKELETON_HORSE; } } } - return currentType; } catch (Exception e) { if (!Via.getConfig().isSuppressMetadataErrors() || Via.getManager().isDebug()) { System.out.println("An error occurred with entity type rewriter"); @@ -80,13 +92,14 @@ public class MetadataRewriter { e.printStackTrace(); } } - return currentType; + + return type; } - public static void handleMetadata(int type, List metadatas) { + public static void handleMetadata(int entityId, EntityType type, List metadatas, UserConnection connection) { for (Metadata metadata : new ArrayList<>(metadatas)) { try { - if (type == 4 || type == 68) { // Guardians + if (type.is(EntityType.ELDER_GUARDIAN) || type.is(EntityType.GUARDIAN)) { // Guardians int oldid = metadata.getId(); if (oldid == 12) { metadata.setMetaType(MetaType1_9.Boolean); @@ -94,7 +107,7 @@ public class MetadataRewriter { metadata.setValue(val); } } - if (type == 51 || type == 5 || type == 6) { // Skeletons + if (type.isOrHasParent(EntityType.ABSTRACT_SKELETON)) { // Skeletons int oldid = metadata.getId(); if (oldid == 12) { metadatas.remove(metadata); @@ -103,8 +116,8 @@ public class MetadataRewriter { metadata.setId(12); } } - if (type == 54 || type == 27) { // Zombie | Zombie Villager - if (type == 54 && metadata.getId() == 14) { + if (type.isOrHasParent(EntityType.ZOMBIE)) { // Zombie | Zombie Villager | Husk + if (type.is(EntityType.ZOMBIE, EntityType.HUSK) && metadata.getId() == 14) { metadatas.remove(metadata); } else { if (metadata.getId() == 15) { @@ -116,7 +129,7 @@ public class MetadataRewriter { } } } - if (type == 100 || type == 31 || type == 32 || type == 29 || type == 28) { // Horses + if (type.isOrHasParent(EntityType.ABSTRACT_HORSE)) { // Horses // Remap metadata id int oldid = metadata.getId(); if (oldid == 14) { // Type @@ -130,7 +143,7 @@ public class MetadataRewriter { } // Process per type - if (type == 100) { + if (type.is(EntityType.HORSE)) { // Normal Horse } else { // Remove 15, 16 @@ -138,7 +151,7 @@ public class MetadataRewriter { metadatas.remove(metadata); } } - if (type == 31 || type == 32) { + if (type.is(EntityType.DONKEY, EntityType.MULE)) { // Chested Horse if (metadata.getId() == 13) { if ((((byte) metadata.getValue()) & 0x08) == 0x08) { @@ -148,6 +161,36 @@ public class MetadataRewriter { } } } + if (type.is(EntityType.ARMOR_STAND) && Via.getConfig().isHologramPatch()) { + Optional flags = getById(metadatas, 11); + Optional customName = getById(metadatas, 2); + Optional customNameVisible = getById(metadatas, 3); + if (metadata.getId() == 0 && flags.isPresent() && customName.isPresent() && customNameVisible.isPresent()) { + Metadata meta = flags.get(); + byte data = (byte) metadata.getValue(); + // Check invisible | Check small | Check if custom name is empty | Check if custom name visible is true + if ((data & 0x20) == 0x20 && ((byte) meta.getValue() & 0x01) == 0x01 + && ((String) customName.get().getValue()).length() != 0 && (boolean) customNameVisible.get().getValue()) { + EntityTracker tracker = connection.get(EntityTracker.class); + if (!tracker.isHologram(entityId)) { + tracker.addHologram(entityId); + try { + // Send movement + PacketWrapper wrapper = new PacketWrapper(0x25, null, connection); + wrapper.write(Type.VAR_INT, entityId); + wrapper.write(Type.SHORT, (short) 0); + wrapper.write(Type.SHORT, (short) (128D * (-Via.getConfig().getHologramYOffset() * 32D))); + wrapper.write(Type.SHORT, (short) 0); + wrapper.write(Type.BOOLEAN, true); + + wrapper.send(ProtocolSnapshotTo1_10.class); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + } } } catch (Exception e) { metadatas.remove(metadata); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/ProtocolSnapshotTo1_10.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/ProtocolSnapshotTo1_10.java index d12fe33d0..ba3cc2815 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/ProtocolSnapshotTo1_10.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/ProtocolSnapshotTo1_10.java @@ -1,7 +1,10 @@ package us.myles.ViaVersion.protocols.protocolsnapshotto1_10; +import com.google.common.base.Optional; import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.entities.Entity1_11Types; import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.api.remapper.PacketHandler; import us.myles.ViaVersion.api.remapper.PacketRemapper; @@ -25,6 +28,31 @@ public class ProtocolSnapshotTo1_10 extends Protocol { protected void registerPackets() { InventoryPackets.register(this); + // Spawn Object + registerOutgoing(State.PLAY, 0x00, 0x00, new PacketRemapper() { + @Override + public void registerMap() { + map(Type.VAR_INT); // 0 - Entity id + map(Type.UUID); // 1 - UUID + map(Type.BYTE); // 2 - Type + + // Track Entity + handler(new PacketHandler() { + @Override + public void handle(PacketWrapper wrapper) throws Exception { + + int entityId = wrapper.get(Type.VAR_INT, 0); + byte type = wrapper.get(Type.BYTE, 0); + + Entity1_11Types.EntityType entType = Entity1_11Types.getTypeFromId(type, true); + + // Register Type ID + wrapper.user().get(EntityTracker.class).addEntity(entityId, entType); + } + }); + } + }); + // Spawn mob packet registerOutgoing(State.PLAY, 0x03, 0x03, new PacketRemapper() { @Override @@ -46,13 +74,17 @@ public class ProtocolSnapshotTo1_10 extends Protocol { handler(new PacketHandler() { @Override public void handle(PacketWrapper wrapper) throws Exception { + int entityId = wrapper.get(Type.VAR_INT, 0); // Change Type :) int type = wrapper.get(Type.VAR_INT, 1); - type = MetadataRewriter.rewriteEntityType(type, wrapper.get(Types1_9.METADATA_LIST, 0)); - wrapper.set(Type.VAR_INT, 1, type); + + Entity1_11Types.EntityType entType = MetadataRewriter.rewriteEntityType(type, wrapper.get(Types1_9.METADATA_LIST, 0)); + if (entType != null) + wrapper.set(Type.VAR_INT, 1, entType.getId()); + // Register Type ID - wrapper.user().get(EntityTracker.class).getClientEntityTypes().put(wrapper.get(Type.VAR_INT, 0), type); - MetadataRewriter.handleMetadata(type, wrapper.get(Types1_9.METADATA_LIST, 0)); + wrapper.user().get(EntityTracker.class).addEntity(entityId, entType); + MetadataRewriter.handleMetadata(entityId, entType, wrapper.get(Types1_9.METADATA_LIST, 0), wrapper.user()); } }); } @@ -84,11 +116,41 @@ public class ProtocolSnapshotTo1_10 extends Protocol { @Override public void handle(PacketWrapper wrapper) throws Exception { int entityId = wrapper.get(Type.VAR_INT, 0); - if (!wrapper.user().get(EntityTracker.class).getClientEntityTypes().containsKey(entityId)) { + + Optional type = wrapper.user().get(EntityTracker.class).get(entityId); + if (!type.isPresent()) return; + + MetadataRewriter.handleMetadata(entityId, type.get(), wrapper.get(Types1_9.METADATA_LIST, 0), wrapper.user()); + } + }); + } + }); + + // Entity teleport + registerOutgoing(State.PLAY, 0x49, 0x49, new PacketRemapper() { + @Override + public void registerMap() { + map(Type.VAR_INT); // 0 - Entity id + map(Type.DOUBLE); // 1 - x + map(Type.DOUBLE); // 2 - y + map(Type.DOUBLE); // 3 - z + map(Type.BYTE); // 4 - yaw + map(Type.BYTE); // 5 - pitch + map(Type.BOOLEAN); // 6 - onGround + + handler(new PacketHandler() { + @Override + public void handle(PacketWrapper wrapper) throws Exception { + int entityID = wrapper.get(Type.VAR_INT, 0); + if (Via.getConfig().isHologramPatch()) { + EntityTracker tracker = wrapper.user().get(EntityTracker.class); + if (tracker.isHologram(entityID)) { + Double newValue = wrapper.get(Type.DOUBLE, 1); + newValue -= (Via.getConfig().getHologramYOffset()); + wrapper.set(Type.DOUBLE, 1, newValue); + } } - int type = wrapper.user().get(EntityTracker.class).getClientEntityTypes().get(entityId); - MetadataRewriter.handleMetadata(type, wrapper.get(Types1_9.METADATA_LIST, 0)); } }); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/storage/EntityTracker.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/storage/EntityTracker.java index b871b7736..c63186a22 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/storage/EntityTracker.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/storage/EntityTracker.java @@ -1,21 +1,52 @@ package us.myles.ViaVersion.protocols.protocolsnapshotto1_10.storage; -import lombok.Getter; +import com.google.common.base.Optional; +import com.google.common.collect.Sets; import us.myles.ViaVersion.api.data.StoredObject; import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.entities.Entity1_11Types; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -@Getter public class EntityTracker extends StoredObject { - private final Map clientEntityTypes = new ConcurrentHashMap<>(); + private final Map clientEntityTypes = new ConcurrentHashMap<>(); + private final Set holograms = Sets.newConcurrentHashSet(); public EntityTracker(UserConnection user) { super(user); } - public void removeEntity(Integer entityID) { - clientEntityTypes.remove(entityID); + public void removeEntity(int entityId) { + removeEntity(entityId); + if (isHologram(entityId)) + removeHologram(entityId); + } + + public void addEntity(int entityId, Entity1_11Types.EntityType type) { + clientEntityTypes.put(entityId, type); + } + + public boolean has(int entityId) { + return clientEntityTypes.containsKey(entityId); + } + + public Optional get(int id) { + if (!has(id)) + return Optional.absent(); + return Optional.of(clientEntityTypes.get(id)); + } + + public void addHologram(int entId) { + holograms.add(entId); + } + + public boolean isHologram(int entId) { + return holograms.contains(entId); + } + + public void removeHologram(int entId) { + holograms.remove(entId); } } diff --git a/common/src/main/resources/config.yml b/common/src/main/resources/config.yml index ffb3bdf32..f3dcb8737 100644 --- a/common/src/main/resources/config.yml +++ b/common/src/main/resources/config.yml @@ -48,6 +48,16 @@ tracking-max-warnings: 4 tracking-max-kick-msg: "You are sending too many packets, :(" # #----------------------------------------------------------# +# MULTIPLE VERSIONS OPTIONS # +#----------------------------------------------------------# +# +# Should we enable our hologram patch? +# If they're in the wrong place enable this +hologram-patch: false +# This is the offset, should work as default when enabled. +hologram-y: -0.96 +# +#----------------------------------------------------------# # 1.9 & 1.10 CLIENTS ON 1.8 SERVERS OPTIONS # #----------------------------------------------------------# # @@ -60,11 +70,6 @@ auto-team: true suppress-metadata-errors: false # When enabled 1.9 & 1.10 will be able to block by using shields shield-blocking: true -# Should we enable our hologram patch? -# If they're in the wrong place enable this -hologram-patch: false -# This is the offset, should work as default when enabled. -hologram-y: -0.96 # Enable player tick simulation, this fixes eating, drinking, nether portals. simulate-pt: true # Should we use nms player to simulate packets, (may fix anti-cheat issues) @@ -76,7 +81,7 @@ bossbar-anti-flicker: false # This will show the new effect indicator in the top-right corner for 1.9 & 1.10 players. use-new-effect-indicator: true # Show the new death messages for 1.9 & 1.10 on the death screen -use-new-deathmessages: false +use-new-deathmessages: true # Should we cache our items, this will prevent server from being lagged out, however the cost is a constant task caching items item-cache: true # Patch the Anti xray to work on 1.9 & 1.10 (If your server is 1.8) This can cost more performance, so disable it if you don't use it. diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeConfigAPI.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeConfigAPI.java index abab23463..6bd2562fb 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeConfigAPI.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeConfigAPI.java @@ -35,7 +35,7 @@ public class SpongeConfigAPI extends Config implements ViaVersionConfig { @Override public boolean isShowNewDeathMessages() { - return getBoolean("use-new-deathmessages", false); + return getBoolean("use-new-deathmessages", true); } @Override From 305f6b7ce23c03d2d3226b8e226fdcc1e758236e Mon Sep 17 00:00:00 2001 From: Myles Date: Fri, 30 Sep 2016 20:48:02 +0100 Subject: [PATCH 55/76] Implement Hand Item Cache for Sponge --- .../myles/ViaVersion/util/PipelineUtil.java | 1 - .../protocol1_9to1_8/HandItemCache.java | 78 +++++++++++++++++++ .../sponge/platform/SpongeViaLoader.java | 61 ++++++--------- 3 files changed, 100 insertions(+), 40 deletions(-) create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/HandItemCache.java diff --git a/common/src/main/java/us/myles/ViaVersion/util/PipelineUtil.java b/common/src/main/java/us/myles/ViaVersion/util/PipelineUtil.java index fca66ada5..05b92e9d5 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/PipelineUtil.java +++ b/common/src/main/java/us/myles/ViaVersion/util/PipelineUtil.java @@ -95,7 +95,6 @@ public class PipelineUtil { boolean mark = false; for (String s : pipeline.names()) { if (mark) { - System.out.println("Context before: " + s); return pipeline.context(pipeline.get(s)); } if (s.equalsIgnoreCase(name)) diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/HandItemCache.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/HandItemCache.java new file mode 100644 index 000000000..2a60aadcc --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/HandItemCache.java @@ -0,0 +1,78 @@ +package us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8; + +import org.spongepowered.api.Sponge; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.item.inventory.ItemStack; +import us.myles.ViaVersion.api.minecraft.item.Item; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +public class HandItemCache implements Runnable { + public static boolean CACHE = false; + private static ConcurrentHashMap handCache = new ConcurrentHashMap<>(); + private static Field GET_DAMAGE; + private static Method GET_ID; + + public static Item getHandItem(UUID player) { + if (!handCache.containsKey(player)) + return null; + return handCache.get(player); + } + + @Override + public void run() { + List players = new ArrayList<>(handCache.keySet()); + + for (Player p : Sponge.getServer().getOnlinePlayers()) { + handCache.put(p.getUniqueId(), convert(p.getItemInHand().orElse(null))); + players.remove(p.getUniqueId()); + } + // Remove offline players + for (UUID uuid : players) { + handCache.remove(uuid); + } + } + + public static Item convert(ItemStack itemInHand) { + if (itemInHand == null) return new Item((short) 0, (byte) 0, (short) 0, null); + if (GET_DAMAGE == null) { + try { + GET_DAMAGE = itemInHand.getClass().getDeclaredField("field_77991_e"); + GET_DAMAGE.setAccessible(true); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + } + if (GET_ID == null) { + try { + GET_ID = Class.forName("net.minecraft.item.Item").getDeclaredMethod("func_150891_b", Class.forName("net.minecraft.item.Item")); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + int id = 0; + try { + id = (int) GET_ID.invoke(null, itemInHand.getItem()); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + int damage = 0; + try { + damage = (int) GET_DAMAGE.get(itemInHand); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return new Item((short) id, (byte) itemInHand.getQuantity(), (short) damage, null); + } +} + diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaLoader.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaLoader.java index ae6e123cd..98f1d39d5 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaLoader.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaLoader.java @@ -4,15 +4,16 @@ import lombok.AllArgsConstructor; import org.spongepowered.api.Sponge; import us.myles.ViaVersion.SpongePlugin; import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.platform.ViaPlatformLoader; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.HandItemProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; import us.myles.ViaVersion.sponge.listeners.ClientLeaveListener; import us.myles.ViaVersion.sponge.listeners.UpdateListener; -import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.ArmorListener; -import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.BlockListener; -import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.CommandBlockListener; -import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.DeathListener; +import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.*; import us.myles.ViaVersion.sponge.providers.SpongeViaBulkChunkTranslator; import us.myles.ViaVersion.sponge.providers.SpongeViaMovementTransmitter; @@ -24,49 +25,31 @@ public class SpongeViaLoader implements ViaPlatformLoader { public void load() { // Update Listener Sponge.getEventManager().registerListeners(plugin, new UpdateListener()); -// /* Base Protocol */ Sponge.getEventManager().registerListeners(plugin, new ClientLeaveListener()); -// /* 1.9 client to 1.8 server */ -// + /* 1.9 client to 1.8 server */ new ArmorListener(plugin).register(); new CommandBlockListener(plugin).register(); new DeathListener(plugin).register(); new BlockListener(plugin).register(); -// if (plugin.getConf().isItemCache()) { -// new HandItemCache().runTaskTimerAsynchronously(plugin, 2L, 2L); // Updates player's items :) -// HandItemCache.CACHE = true; -// } -// -// /* Providers */ + if (plugin.getConf().isItemCache()) { + Via.getPlatform().runRepeatingSync(new HandItemCache(), 2L); // Updates player's items :) + HandItemCache.CACHE = true; + } + + /* Providers */ Via.getManager().getProviders().use(BulkChunkTranslatorProvider.class, new SpongeViaBulkChunkTranslator()); Via.getManager().getProviders().use(MovementTransmitterProvider.class, new SpongeViaMovementTransmitter()); -// Via.getManager().getProviders().use(HandItemProvider.class, new HandItemProvider() { -// @Override -// public Item getHandItem(final UserConnection info) { -// if (HandItemCache.CACHE) { -// return HandItemCache.getHandItem(info.get(ProtocolInfo.class).getUuid()); -// } else { -// try { -// return Bukkit.getScheduler().callSyncMethod(Bukkit.getPluginManager().getPlugin("ViaVersion"), new Callable() { -// @Override -// public Item call() throws Exception { -// UUID playerUUID = info.get(ProtocolInfo.class).getUuid(); -// if (Bukkit.getPlayer(playerUUID) != null) { -// return HandItemCache.convert(Bukkit.getPlayer(playerUUID).getItemInHand()); -// } -// return null; -// } -// }).get(10, TimeUnit.SECONDS); -// } catch (Exception e) { -// System.out.println("Error fetching hand item: " + e.getClass().getName()); -// if (Via.getManager().isDebug()) -// e.printStackTrace(); -// return null; -// } -// } -// } -// }); + Via.getManager().getProviders().use(HandItemProvider.class, new HandItemProvider() { + @Override + public Item getHandItem(final UserConnection info) { + if (HandItemCache.CACHE) { + return HandItemCache.getHandItem(info.get(ProtocolInfo.class).getUuid()); + } else { + return super.getHandItem(info); // TODO: On API Docs write about this + } + } + }); } } From 30950a7d74366772de458bc725956991018ae2a4 Mon Sep 17 00:00:00 2001 From: Myles Date: Fri, 30 Sep 2016 20:51:01 +0100 Subject: [PATCH 56/76] Don't include guava in the jar & go for lower version for bukkit compatibility --- pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6f0b6387c..c631f22ad 100644 --- a/pom.xml +++ b/pom.xml @@ -111,7 +111,8 @@ com.google.guava guava - 19.0 + 17.0 + provided From f1d53bb7acadc204b245a65e48c536abcdff0bf5 Mon Sep 17 00:00:00 2001 From: Matsv Date: Fri, 30 Sep 2016 23:02:34 +0200 Subject: [PATCH 57/76] Start working on Bungee protocol id detection. --- .../us/myles/ViaVersion/BungeePlugin.java | 39 ++++++++++++++++- .../bungee/platform/BungeeViaInjector.java | 4 +- .../bungee/platform/BungeeViaLoader.java | 10 +++++ .../service/ProtocolDetectorService.java | 43 +++++++++++++++++++ 4 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java diff --git a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java index 425a158db..2cc9d2576 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java +++ b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java @@ -1,10 +1,12 @@ package us.myles.ViaVersion; import com.google.gson.JsonObject; +import net.md_5.bungee.UserConnection; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.event.PlayerDisconnectEvent; +import net.md_5.bungee.api.event.ServerConnectEvent; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.event.EventHandler; @@ -19,6 +21,7 @@ import us.myles.ViaVersion.bungee.commands.BungeeCommand; import us.myles.ViaVersion.bungee.commands.BungeeCommandHandler; import us.myles.ViaVersion.bungee.commands.BungeeCommandSender; import us.myles.ViaVersion.bungee.platform.*; +import us.myles.ViaVersion.bungee.service.ProtocolDetectorService; import us.myles.ViaVersion.dump.PluginInfo; import us.myles.ViaVersion.util.GsonUtil; @@ -44,7 +47,7 @@ public class BungeePlugin extends Plugin implements ViaPlatform, Listener { Via.init(ViaManager.builder() .platform(this) .injector(new BungeeViaInjector()) - .loader(new BungeeViaLoader()) + .loader(new BungeeViaLoader(this)) .commandHandler(commandHandler) .build()); @@ -159,4 +162,38 @@ public class BungeePlugin extends Plugin implements ViaPlatform, Listener { Via.getManager().removePortedClient(e.getPlayer().getUniqueId()); } + // Set the handshake version every time someone connects to any server TODO reflection + @EventHandler + public void onServerConnect(ServerConnectEvent e) throws NoSuchFieldException, IllegalAccessException { + int protocolId = ProtocolDetectorService.getProtocolId(e.getTarget().getName()); + UserConnection connection = (UserConnection) e.getPlayer(); + connection.getPendingConnection().getHandshake().setProtocolVersion(protocolId); + } + + /* + TODO: Change when connected + System.out.println("Switching servers.."); + if (!ProtocolDetectorService.hasProtocolId(e.getServer().getInfo().getName())) { + getLogger().severe("Could not find the protocol id for server " + e.getServer()); + return; + } + + int protocolId = ProtocolDetectorService.getProtocolId(e.getServer().getInfo().getName()); + UserConnection connection = (UserConnection) e.getPlayer(); + + ChannelWrapper wrapper = ReflectionUtil.get(connection, "ch", ChannelWrapper.class); + wrapper.setVersion(protocolId); + + us.myles.ViaVersion.api.data.UserConnection viaConnection = Via.getManager().getConnection(e.getPlayer().getUniqueId()); + ProtocolInfo info = viaConnection.get(ProtocolInfo.class); + // Choose the pipe + List> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), protocolId); + ProtocolPipeline pipeline = viaConnection.get(ProtocolInfo.class).getPipeline(); + if (protocols != null) { + pipeline.pipes().clear(); + for (Pair prot : protocols) { + pipeline.add(prot.getValue()); + } + }*/ + } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java index b3a0efe48..d8efb2627 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java @@ -5,9 +5,11 @@ import io.netty.channel.ChannelInitializer; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaInjector; import us.myles.ViaVersion.bungee.handlers.BungeeChannelInitializer; +import us.myles.ViaVersion.util.ReflectionUtil; import java.lang.reflect.Field; import java.lang.reflect.Modifier; +import java.util.List; public class BungeeViaInjector implements ViaInjector { @Override @@ -42,7 +44,7 @@ public class BungeeViaInjector implements ViaInjector { @Override public int getServerProtocolVersion() throws Exception { - return 47; // TODO Config Option + return (int) ReflectionUtil.getStatic(Class.forName("net.md_5.bungee.protocol.ProtocolConstants"), "SUPPORTED_VERSION_IDS", List.class).get(0); } @Override diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java index 9e44f86af..ef552bfa9 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java @@ -1,13 +1,23 @@ package us.myles.ViaVersion.bungee.platform; +import lombok.AllArgsConstructor; +import us.myles.ViaVersion.BungeePlugin; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaPlatformLoader; import us.myles.ViaVersion.bungee.providers.BungeeMovementTransmitter; +import us.myles.ViaVersion.bungee.service.ProtocolDetectorService; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; +import java.util.concurrent.TimeUnit; + +@AllArgsConstructor public class BungeeViaLoader implements ViaPlatformLoader { + private BungeePlugin plugin; + @Override public void load() { Via.getManager().getProviders().use(MovementTransmitterProvider.class, new BungeeMovementTransmitter()); + + plugin.getProxy().getScheduler().schedule(plugin, new ProtocolDetectorService(plugin), 0, 1, TimeUnit.MINUTES); } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java new file mode 100644 index 000000000..d8a27dcf9 --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java @@ -0,0 +1,43 @@ +package us.myles.ViaVersion.bungee.service; + +import net.md_5.bungee.api.Callback; +import net.md_5.bungee.api.ServerPing; +import net.md_5.bungee.api.config.ServerInfo; +import us.myles.ViaVersion.BungeePlugin; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ProtocolDetectorService implements Runnable { + private static final Map protocolIds = new ConcurrentHashMap<>(); + private BungeePlugin plugin; + + public ProtocolDetectorService(BungeePlugin plugin) { + this.plugin = plugin; + } + + public static Integer getProtocolId(String serverName) { + if (!hasProtocolId(serverName)) + return -1; + return protocolIds.get(serverName); + } + + public static boolean hasProtocolId(String serverName) { + return protocolIds.containsKey(serverName); + } + + @Override + public void run() { + System.out.println("Checking protocol ids"); // TODO remove message after confirming that it works + + for (final Map.Entry lists : plugin.getProxy().getServers().entrySet()) { + lists.getValue().ping(new Callback() { + @Override + public void done(ServerPing serverPing, Throwable throwable) { + if (throwable == null) + protocolIds.put(lists.getKey(), serverPing.getVersion().getProtocol()); + } + }); + } + } +} From 152993f7495f6a21cf628a7f08c65237e6329513 Mon Sep 17 00:00:00 2001 From: Matsv Date: Sat, 1 Oct 2016 00:53:50 +0200 Subject: [PATCH 58/76] Get bungee protocol version detection working. Still some odd issues. --- .../us/myles/ViaVersion/BungeePlugin.java | 32 +++-------- .../bungee/handlers/BungeeEncodeHandler.java | 54 +++++++++++++++++++ .../bungee/storage/BungeeStorage.java | 20 +++++++ .../api/protocol/ProtocolPipeline.java | 5 ++ 4 files changed, 85 insertions(+), 26 deletions(-) create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/storage/BungeeStorage.java diff --git a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java index 2cc9d2576..0872f8932 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java +++ b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java @@ -22,6 +22,7 @@ import us.myles.ViaVersion.bungee.commands.BungeeCommandHandler; import us.myles.ViaVersion.bungee.commands.BungeeCommandSender; import us.myles.ViaVersion.bungee.platform.*; import us.myles.ViaVersion.bungee.service.ProtocolDetectorService; +import us.myles.ViaVersion.bungee.storage.BungeeStorage; import us.myles.ViaVersion.dump.PluginInfo; import us.myles.ViaVersion.util.GsonUtil; @@ -165,35 +166,14 @@ public class BungeePlugin extends Plugin implements ViaPlatform, Listener { // Set the handshake version every time someone connects to any server TODO reflection @EventHandler public void onServerConnect(ServerConnectEvent e) throws NoSuchFieldException, IllegalAccessException { + us.myles.ViaVersion.api.data.UserConnection user = Via.getManager().getConnection(e.getPlayer().getUniqueId()); + if (!user.has(BungeeStorage.class)) { + user.put(new BungeeStorage(user, e.getPlayer())); + } + int protocolId = ProtocolDetectorService.getProtocolId(e.getTarget().getName()); UserConnection connection = (UserConnection) e.getPlayer(); connection.getPendingConnection().getHandshake().setProtocolVersion(protocolId); } - /* - TODO: Change when connected - System.out.println("Switching servers.."); - if (!ProtocolDetectorService.hasProtocolId(e.getServer().getInfo().getName())) { - getLogger().severe("Could not find the protocol id for server " + e.getServer()); - return; - } - - int protocolId = ProtocolDetectorService.getProtocolId(e.getServer().getInfo().getName()); - UserConnection connection = (UserConnection) e.getPlayer(); - - ChannelWrapper wrapper = ReflectionUtil.get(connection, "ch", ChannelWrapper.class); - wrapper.setVersion(protocolId); - - us.myles.ViaVersion.api.data.UserConnection viaConnection = Via.getManager().getConnection(e.getPlayer().getUniqueId()); - ProtocolInfo info = viaConnection.get(ProtocolInfo.class); - // Choose the pipe - List> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), protocolId); - ProtocolPipeline pipeline = viaConnection.get(ProtocolInfo.class).getPipeline(); - if (protocols != null) { - pipeline.pipes().clear(); - for (Pair prot : protocols) { - pipeline.add(prot.getValue()); - } - }*/ - } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java index 4b8dc0563..08bea9bda 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java @@ -4,14 +4,24 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToMessageEncoder; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.netty.ChannelWrapper; import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.Pair; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.protocol.Protocol; +import us.myles.ViaVersion.api.protocol.ProtocolPipeline; +import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.bungee.service.ProtocolDetectorService; +import us.myles.ViaVersion.bungee.storage.BungeeStorage; import us.myles.ViaVersion.bungee.util.BungeePipelineUtil; import us.myles.ViaVersion.exception.CancelException; import us.myles.ViaVersion.packets.Direction; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.util.PipelineUtil; +import us.myles.ViaVersion.util.ReflectionUtil; import java.util.List; @@ -47,6 +57,7 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder { } // Increment sent info.incrementSent(); + if (info.isActive()) { // Handle ID int id = Type.VAR_INT.read(bytebuf); @@ -71,6 +82,8 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder { bytebuf = BungeePipelineUtil.compress(ctx, bytebuf); } out.add(bytebuf.retain()); + + checkServerChange(); } @Override @@ -79,4 +92,45 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder { super.exceptionCaught(ctx, cause); } + // TODO reflection + public void checkServerChange() throws NoSuchFieldException, IllegalAccessException { + if (info.has(BungeeStorage.class)) { + BungeeStorage storage = info.get(BungeeStorage.class); + ProxiedPlayer player = storage.getPlayer(); + + if (player.getServer() != null) { + if (player.getServer() != null && !player.getServer().getInfo().getName().equals(storage.getCurrentServer())) { + String serverName = player.getServer().getInfo().getName(); + + storage.setCurrentServer(serverName); + + // TODO HANDLE + if (!ProtocolDetectorService.hasProtocolId(serverName)) { + Via.getPlatform().getLogger().severe("Could not find the protocol id for server " + serverName); + return; + } + + int protocolId = ProtocolDetectorService.getProtocolId(serverName); + net.md_5.bungee.UserConnection connection = (net.md_5.bungee.UserConnection) player; + + ChannelWrapper wrapper = ReflectionUtil.get(connection, "ch", ChannelWrapper.class); + wrapper.setVersion(protocolId); + + us.myles.ViaVersion.api.data.UserConnection viaConnection = Via.getManager().getConnection(player.getUniqueId()); + ProtocolInfo info = viaConnection.get(ProtocolInfo.class); + // Refresh the pipes + List> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), protocolId); + ProtocolPipeline pipeline = viaConnection.get(ProtocolInfo.class).getPipeline(); + if (protocols != null) { + pipeline.cleanPipes(); + for (Pair prot : protocols) { + pipeline.add(prot.getValue()); + } + } + connection.init(); + } + } + } + } + } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/storage/BungeeStorage.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/storage/BungeeStorage.java new file mode 100644 index 000000000..683b8230d --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/storage/BungeeStorage.java @@ -0,0 +1,20 @@ +package us.myles.ViaVersion.bungee.storage; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import us.myles.ViaVersion.api.data.StoredObject; +import us.myles.ViaVersion.api.data.UserConnection; + +@Data +@EqualsAndHashCode(callSuper = true) +public class BungeeStorage extends StoredObject { + private ProxiedPlayer player; + private String currentServer; + + public BungeeStorage(UserConnection user, ProxiedPlayer player) { + super(user); + this.player = player; + this.currentServer = ""; + } +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolPipeline.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolPipeline.java index 1525cfee8..f8226a775 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolPipeline.java +++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolPipeline.java @@ -162,4 +162,9 @@ public class ProtocolPipeline extends Protocol { public List pipes() { return protocolList; } + + public void cleanPipes() { + pipes().clear(); + registerPackets(); + } } From 65a6e25f1be901a88eb49a057b0b9b69f95e7457 Mon Sep 17 00:00:00 2001 From: Matsv Date: Sat, 1 Oct 2016 00:59:42 +0200 Subject: [PATCH 59/76] Remove debug message --- .../ViaVersion/bungee/service/ProtocolDetectorService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java index d8a27dcf9..ddfba7505 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java @@ -28,8 +28,6 @@ public class ProtocolDetectorService implements Runnable { @Override public void run() { - System.out.println("Checking protocol ids"); // TODO remove message after confirming that it works - for (final Map.Entry lists : plugin.getProxy().getServers().entrySet()) { lists.getValue().ping(new Callback() { @Override From ec848d7201394f52a6dd34eb4c4c09cb7fc41bce Mon Sep 17 00:00:00 2001 From: Myles Date: Sat, 1 Oct 2016 00:10:54 +0100 Subject: [PATCH 60/76] Reflection for Bungee stuffs --- .../us/myles/ViaVersion/BungeePlugin.java | 22 ++++++++++++++----- .../bungee/handlers/BungeeEncodeHandler.java | 11 ++++------ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java index 0872f8932..1a95df2a2 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java +++ b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java @@ -1,7 +1,6 @@ package us.myles.ViaVersion; import com.google.gson.JsonObject; -import net.md_5.bungee.UserConnection; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; @@ -15,6 +14,7 @@ import us.myles.ViaVersion.api.ViaAPI; import us.myles.ViaVersion.api.ViaVersionConfig; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; +import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.platform.TaskId; import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.bungee.commands.BungeeCommand; @@ -25,7 +25,10 @@ import us.myles.ViaVersion.bungee.service.ProtocolDetectorService; import us.myles.ViaVersion.bungee.storage.BungeeStorage; import us.myles.ViaVersion.dump.PluginInfo; import us.myles.ViaVersion.util.GsonUtil; +import us.myles.ViaVersion.util.ReflectionUtil; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -153,7 +156,6 @@ public class BungeePlugin extends Plugin implements ViaPlatform, Listener { plugins.add(new PluginInfo(true, p.getDescription().getName(), p.getDescription().getVersion(), p.getDescription().getMain(), Arrays.asList(p.getDescription().getAuthor()))); platformSpecific.add("plugins", GsonUtil.getGson().toJsonTree(plugins)); - // TODO more? ProtocolLib things etc? return platformSpecific; } @@ -163,17 +165,25 @@ public class BungeePlugin extends Plugin implements ViaPlatform, Listener { Via.getManager().removePortedClient(e.getPlayer().getUniqueId()); } - // Set the handshake version every time someone connects to any server TODO reflection + // Set the handshake version every time someone connects to any server @EventHandler public void onServerConnect(ServerConnectEvent e) throws NoSuchFieldException, IllegalAccessException { - us.myles.ViaVersion.api.data.UserConnection user = Via.getManager().getConnection(e.getPlayer().getUniqueId()); + UserConnection user = Via.getManager().getConnection(e.getPlayer().getUniqueId()); if (!user.has(BungeeStorage.class)) { user.put(new BungeeStorage(user, e.getPlayer())); } int protocolId = ProtocolDetectorService.getProtocolId(e.getTarget().getName()); - UserConnection connection = (UserConnection) e.getPlayer(); - connection.getPendingConnection().getHandshake().setProtocolVersion(protocolId); + try { + Object pendingConnection = ReflectionUtil.invoke(e.getPlayer(), "getPendingConnection"); + Object handshake = ReflectionUtil.invoke(pendingConnection, "getHandshake"); + Method setProtocol = handshake.getClass().getDeclaredMethod("setProtocolVersion", int.class); + setProtocol.invoke(handshake, protocolId); + } catch (NoSuchMethodException e1) { + e1.printStackTrace(); + } catch (InvocationTargetException e1) { + e1.printStackTrace(); + } } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java index 08bea9bda..157e196a2 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java @@ -5,7 +5,6 @@ import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToMessageEncoder; import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.netty.ChannelWrapper; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Via; @@ -92,8 +91,7 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder { super.exceptionCaught(ctx, cause); } - // TODO reflection - public void checkServerChange() throws NoSuchFieldException, IllegalAccessException { + public void checkServerChange() throws Exception { if (info.has(BungeeStorage.class)) { BungeeStorage storage = info.get(BungeeStorage.class); ProxiedPlayer player = storage.getPlayer(); @@ -111,10 +109,9 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder { } int protocolId = ProtocolDetectorService.getProtocolId(serverName); - net.md_5.bungee.UserConnection connection = (net.md_5.bungee.UserConnection) player; - ChannelWrapper wrapper = ReflectionUtil.get(connection, "ch", ChannelWrapper.class); - wrapper.setVersion(protocolId); + Object wrapper = ReflectionUtil.get(player, "ch", Object.class); + wrapper.getClass().getDeclaredMethod("setVersion", int.class).invoke(wrapper, protocolId); us.myles.ViaVersion.api.data.UserConnection viaConnection = Via.getManager().getConnection(player.getUniqueId()); ProtocolInfo info = viaConnection.get(ProtocolInfo.class); @@ -127,7 +124,7 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder { pipeline.add(prot.getValue()); } } - connection.init(); + ReflectionUtil.invoke(player, "init"); } } } From f53c8c67e22930ef3c2380e6c1d7f12c7bf10d02 Mon Sep 17 00:00:00 2001 From: Matsv Date: Sat, 1 Oct 2016 13:31:14 +0200 Subject: [PATCH 61/76] Fix Bukkit config NPE, only change the protocol id if ViaVersion can support it and support unsupported Bungee protocol ids (Not working correctly yet) --- .../us/myles/ViaVersion/ViaVersionPlugin.java | 4 +- .../us/myles/ViaVersion/BungeePlugin.java | 26 ++++++---- .../bungee/handlers/BungeeEncodeHandler.java | 25 ++++++++-- .../bungee/platform/BungeeViaLoader.java | 3 ++ .../providers/BungeeVersionProvider.java | 50 +++++++++++++++++++ .../ViaVersion/api/data/UserConnection.java | 8 +++ .../protocols/base/BaseProtocol.java | 15 ++++-- .../protocols/base/VersionProvider.java | 12 +++++ 8 files changed, 124 insertions(+), 19 deletions(-) create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/providers/BungeeVersionProvider.java create mode 100644 common/src/main/java/us/myles/ViaVersion/protocols/base/VersionProvider.java diff --git a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 70603a278..a85fba03a 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -41,8 +41,6 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { private List asyncQueuedTasks = new ArrayList<>(); public ViaVersionPlugin() { - // Config magic - conf = new BukkitConfigAPI(); // Command handler commandHandler = new BukkitCommandHandler(); // Init platform @@ -52,6 +50,8 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { .injector(new BukkitViaInjector()) .loader(new BukkitViaLoader(this)) .build()); + // Config magic + conf = new BukkitConfigAPI(); // For compatibility ViaVersion.setInstance(this); diff --git a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java index 1a95df2a2..2dd9f6470 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java +++ b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java @@ -9,6 +9,7 @@ import net.md_5.bungee.api.event.ServerConnectEvent; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.event.EventHandler; +import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaAPI; import us.myles.ViaVersion.api.ViaVersionConfig; @@ -17,6 +18,8 @@ import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.platform.TaskId; import us.myles.ViaVersion.api.platform.ViaPlatform; +import us.myles.ViaVersion.api.protocol.Protocol; +import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.bungee.commands.BungeeCommand; import us.myles.ViaVersion.bungee.commands.BungeeCommandHandler; import us.myles.ViaVersion.bungee.commands.BungeeCommandSender; @@ -24,6 +27,7 @@ import us.myles.ViaVersion.bungee.platform.*; import us.myles.ViaVersion.bungee.service.ProtocolDetectorService; import us.myles.ViaVersion.bungee.storage.BungeeStorage; import us.myles.ViaVersion.dump.PluginInfo; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.util.GsonUtil; import us.myles.ViaVersion.util.ReflectionUtil; @@ -174,15 +178,19 @@ public class BungeePlugin extends Plugin implements ViaPlatform, Listener { } int protocolId = ProtocolDetectorService.getProtocolId(e.getTarget().getName()); - try { - Object pendingConnection = ReflectionUtil.invoke(e.getPlayer(), "getPendingConnection"); - Object handshake = ReflectionUtil.invoke(pendingConnection, "getHandshake"); - Method setProtocol = handshake.getClass().getDeclaredMethod("setProtocolVersion", int.class); - setProtocol.invoke(handshake, protocolId); - } catch (NoSuchMethodException e1) { - e1.printStackTrace(); - } catch (InvocationTargetException e1) { - e1.printStackTrace(); + List> protocols = ProtocolRegistry.getProtocolPath(user.get(ProtocolInfo.class).getProtocolVersion(), protocolId); + + // Check if ViaVersion can support that version + if (protocols != null) { + try { + Object pendingConnection = ReflectionUtil.invoke(e.getPlayer(), "getPendingConnection"); + Object handshake = ReflectionUtil.invoke(pendingConnection, "getHandshake"); + Method setProtocol = handshake.getClass().getDeclaredMethod("setProtocolVersion", int.class); + setProtocol.invoke(handshake, protocolId); + System.out.println("Changed server protocol id " + protocolId + " clientProtocol:" + user.get(ProtocolInfo.class).getProtocolVersion() + " path:" + protocols); + } catch (NoSuchMethodException | InvocationTargetException e1) { + e1.printStackTrace(); + } } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java index 157e196a2..a91f52c17 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java @@ -98,6 +98,8 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder { if (player.getServer() != null) { if (player.getServer() != null && !player.getServer().getInfo().getName().equals(storage.getCurrentServer())) { + + System.out.println("Server change " + player.getServer().getInfo().getName()); String serverName = player.getServer().getInfo().getName(); storage.setCurrentServer(serverName); @@ -110,21 +112,34 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder { int protocolId = ProtocolDetectorService.getProtocolId(serverName); - Object wrapper = ReflectionUtil.get(player, "ch", Object.class); - wrapper.getClass().getDeclaredMethod("setVersion", int.class).invoke(wrapper, protocolId); - - us.myles.ViaVersion.api.data.UserConnection viaConnection = Via.getManager().getConnection(player.getUniqueId()); + UserConnection viaConnection = Via.getManager().getConnection(player.getUniqueId()); ProtocolInfo info = viaConnection.get(ProtocolInfo.class); // Refresh the pipes List> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), protocolId); + System.out.println(info.getProtocolVersion() + ">" + protocolId + " " + protocols); ProtocolPipeline pipeline = viaConnection.get(ProtocolInfo.class).getPipeline(); if (protocols != null) { + viaConnection.clearStoredObjects(); pipeline.cleanPipes(); + for (Pair prot : protocols) { pipeline.add(prot.getValue()); } + viaConnection.put(info); + viaConnection.setActive(true); + + // Init all protocols TODO check if this can get moved up to the previous for loop, and doesn't require the pipeline to already exist. + for (Pair protocol : protocols) { + protocol.getValue().init(viaConnection); + } + + + Object wrapper = ReflectionUtil.get(player, "ch", Object.class); + wrapper.getClass().getDeclaredMethod("setVersion", int.class).invoke(wrapper, protocolId); + ReflectionUtil.invoke(player, "init"); + } else { + viaConnection.setActive(false); } - ReflectionUtil.invoke(player, "init"); } } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java index ef552bfa9..fe2a16b32 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java @@ -5,7 +5,9 @@ import us.myles.ViaVersion.BungeePlugin; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaPlatformLoader; import us.myles.ViaVersion.bungee.providers.BungeeMovementTransmitter; +import us.myles.ViaVersion.bungee.providers.BungeeVersionProvider; import us.myles.ViaVersion.bungee.service.ProtocolDetectorService; +import us.myles.ViaVersion.protocols.base.VersionProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; import java.util.concurrent.TimeUnit; @@ -17,6 +19,7 @@ public class BungeeViaLoader implements ViaPlatformLoader { @Override public void load() { Via.getManager().getProviders().use(MovementTransmitterProvider.class, new BungeeMovementTransmitter()); + Via.getManager().getProviders().use(VersionProvider.class, new BungeeVersionProvider()); plugin.getProxy().getScheduler().schedule(plugin, new ProtocolDetectorService(plugin), 0, 1, TimeUnit.MINUTES); } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/providers/BungeeVersionProvider.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/providers/BungeeVersionProvider.java new file mode 100644 index 000000000..699692e31 --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/providers/BungeeVersionProvider.java @@ -0,0 +1,50 @@ +package us.myles.ViaVersion.bungee.providers; + +import com.google.common.collect.Lists; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; +import us.myles.ViaVersion.protocols.base.VersionProvider; +import us.myles.ViaVersion.util.ReflectionUtil; + +import java.util.List; + +public class BungeeVersionProvider extends VersionProvider { + private static Class ref; + + public BungeeVersionProvider() { + try { + ref = Class.forName("net.md_5.bungee.protocol.ProtocolConstants"); + } catch (Exception e) { + System.out.println("Could not detect the ProtocolConstants class"); + e.printStackTrace(); + } + } + + @Override + public int getServerProtocol(UserConnection user) throws Exception { + if (ref == null) + return super.getServerProtocol(user); + // TODO Have one constant list forever until restart? (Might limit plugins if they change this) + List list = ReflectionUtil.getStatic(ref, "SUPPORTED_VERSION_IDS", List.class); + + ProtocolInfo info = user.get(ProtocolInfo.class); + + // Bungee supports it + if (list.contains(info.getProtocolVersion())) + return info.getProtocolVersion(); + + // Older than bungee supports, get the lowest version + if (info.getProtocolVersion() < list.get(0)) { + return list.get(0); + } + + // Loop through all protocols to get the closest protocol id that bungee supports + for (Integer protocol : Lists.reverse(list)) { + if (info.getProtocolVersion() > protocol) + return protocol; + } + + System.out.println("Panic, no protocol id found for " + info.getProtocolVersion()); + return info.getProtocolVersion(); + } +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java b/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java index 9a393af8a..f6cb5d4f8 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java +++ b/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java @@ -66,6 +66,14 @@ public class UserConnection { storedObjects.put(object.getClass(), object); } + /** + * Clear all the stored objects + * Used for bungee when switching servers. + */ + public void clearStoredObjects() { + storedObjects.clear(); + } + /** * Send a raw packet to the player * diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java b/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java index c95b51fba..f949d6944 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java @@ -11,6 +11,7 @@ import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.platform.providers.ViaProviders; import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.api.protocol.ProtocolPipeline; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; @@ -53,7 +54,9 @@ public class BaseProtocol extends Protocol { if (ProtocolRegistry.SERVER_PROTOCOL == -1) // Set the Server protocol if the detection on startup failed ProtocolRegistry.SERVER_PROTOCOL = protocolVersion; - List> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), ProtocolRegistry.SERVER_PROTOCOL); + int protocol = Via.getManager().getProviders().get(VersionProvider.class).getServerProtocol(wrapper.user()); + List> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), protocol); + if (protocols != null) { if (protocolVersion != 9999) { //Fix ServerListPlus @@ -137,13 +140,14 @@ public class BaseProtocol extends Protocol { ProtocolInfo info = wrapper.user().get(ProtocolInfo.class); info.setProtocolVersion(protVer); // Choose the pipe - List> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), ProtocolRegistry.SERVER_PROTOCOL); + int protocol = Via.getManager().getProviders().get(VersionProvider.class).getServerProtocol(wrapper.user()); + List> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), protocol); ProtocolPipeline pipeline = wrapper.user().get(ProtocolInfo.class).getPipeline(); if (protocols != null) { for (Pair prot : protocols) { pipeline.add(prot.getValue()); } - wrapper.set(Type.VAR_INT, 0, ProtocolRegistry.SERVER_PROTOCOL); + wrapper.set(Type.VAR_INT, 0, protocol); } // Change state @@ -196,6 +200,11 @@ public class BaseProtocol extends Protocol { // Nothing gets added, ProtocolPipeline handles ProtocolInfo } + @Override + protected void register(ViaProviders providers) { + providers.register(VersionProvider.class, new VersionProvider()); + } + @Override public void transform(Direction direction, State state, PacketWrapper packetWrapper) throws Exception { super.transform(direction, state, packetWrapper); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/base/VersionProvider.java b/common/src/main/java/us/myles/ViaVersion/protocols/base/VersionProvider.java new file mode 100644 index 000000000..ec30cf4b1 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/protocols/base/VersionProvider.java @@ -0,0 +1,12 @@ +package us.myles.ViaVersion.protocols.base; + +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.platform.providers.Provider; +import us.myles.ViaVersion.api.protocol.ProtocolRegistry; + +public class VersionProvider implements Provider { + + public int getServerProtocol(UserConnection connection) throws Exception { + return ProtocolRegistry.SERVER_PROTOCOL; + } +} From 8445a6d9dbc4dd719f2abe979a76d0c30184c7b5 Mon Sep 17 00:00:00 2001 From: Matsv Date: Sat, 1 Oct 2016 14:27:39 +0200 Subject: [PATCH 62/76] Fix wrong handling if the client and child server have the same protocol id --- .../us/myles/ViaVersion/BungeePlugin.java | 19 +++++---- .../bungee/handlers/BungeeEncodeHandler.java | 39 +++++++++++-------- .../service/ProtocolDetectorService.java | 21 ++++++---- 3 files changed, 45 insertions(+), 34 deletions(-) diff --git a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java index 2dd9f6470..f6cd0e614 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java +++ b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java @@ -174,6 +174,7 @@ public class BungeePlugin extends Plugin implements ViaPlatform, Listener { public void onServerConnect(ServerConnectEvent e) throws NoSuchFieldException, IllegalAccessException { UserConnection user = Via.getManager().getConnection(e.getPlayer().getUniqueId()); if (!user.has(BungeeStorage.class)) { + System.out.println("new storage"); user.put(new BungeeStorage(user, e.getPlayer())); } @@ -181,16 +182,14 @@ public class BungeePlugin extends Plugin implements ViaPlatform, Listener { List> protocols = ProtocolRegistry.getProtocolPath(user.get(ProtocolInfo.class).getProtocolVersion(), protocolId); // Check if ViaVersion can support that version - if (protocols != null) { - try { - Object pendingConnection = ReflectionUtil.invoke(e.getPlayer(), "getPendingConnection"); - Object handshake = ReflectionUtil.invoke(pendingConnection, "getHandshake"); - Method setProtocol = handshake.getClass().getDeclaredMethod("setProtocolVersion", int.class); - setProtocol.invoke(handshake, protocolId); - System.out.println("Changed server protocol id " + protocolId + " clientProtocol:" + user.get(ProtocolInfo.class).getProtocolVersion() + " path:" + protocols); - } catch (NoSuchMethodException | InvocationTargetException e1) { - e1.printStackTrace(); - } + try { + Object pendingConnection = ReflectionUtil.invoke(e.getPlayer(), "getPendingConnection"); + Object handshake = ReflectionUtil.invoke(pendingConnection, "getHandshake"); + Method setProtocol = handshake.getClass().getDeclaredMethod("setProtocolVersion", int.class); + setProtocol.invoke(handshake, protocols == null ? user.get(ProtocolInfo.class).getProtocolVersion() : protocolId); + System.out.println("Changed server protocol id " + protocolId + " clientProtocol:" + user.get(ProtocolInfo.class).getProtocolVersion() + " path:" + protocols); + } catch (NoSuchMethodException | InvocationTargetException e1) { + e1.printStackTrace(); } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java index a91f52c17..a4bbd4df7 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java @@ -99,7 +99,7 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder { if (player.getServer() != null) { if (player.getServer() != null && !player.getServer().getInfo().getName().equals(storage.getCurrentServer())) { - System.out.println("Server change " + player.getServer().getInfo().getName()); + System.out.println("Server change " + player.getServer().getInfo().getName() + " curr" + storage.getCurrentServer()); String serverName = player.getServer().getInfo().getName(); storage.setCurrentServer(serverName); @@ -118,31 +118,36 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder { List> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), protocolId); System.out.println(info.getProtocolVersion() + ">" + protocolId + " " + protocols); ProtocolPipeline pipeline = viaConnection.get(ProtocolInfo.class).getPipeline(); - if (protocols != null) { - viaConnection.clearStoredObjects(); - pipeline.cleanPipes(); + viaConnection.clearStoredObjects(); + pipeline.cleanPipes(); + + if (protocols != null) for (Pair prot : protocols) { pipeline.add(prot.getValue()); } - viaConnection.put(info); - viaConnection.setActive(true); - - // Init all protocols TODO check if this can get moved up to the previous for loop, and doesn't require the pipeline to already exist. - for (Pair protocol : protocols) { - protocol.getValue().init(viaConnection); - } - Object wrapper = ReflectionUtil.get(player, "ch", Object.class); - wrapper.getClass().getDeclaredMethod("setVersion", int.class).invoke(wrapper, protocolId); - ReflectionUtil.invoke(player, "init"); - } else { - viaConnection.setActive(false); + viaConnection.put(info); + viaConnection.put(storage); + + viaConnection.setActive(protocols != null); + + // Init all protocols TODO check if this can get moved up to the previous for loop, and doesn't require the pipeline to already exist. + for (Protocol protocol : pipeline.pipes()) { + protocol.init(viaConnection); } + + Object wrapper = ReflectionUtil.get(player, "ch", Object.class); + wrapper.getClass().getDeclaredMethod("setVersion", int.class).invoke(wrapper, protocolId); +// ReflectionUtil.invoke(player, "init"); + + Object entityMap = Class.forName("net.md_5.bungee.entitymap.EntityMap").getDeclaredMethod("getEntityMap", int.class).invoke(null, protocolId); + ReflectionUtil.set(player, "entityRewrite", entityMap); + + System.out.println("VERSION:" + ((net.md_5.bungee.UserConnection) player).getPendingConnection().getVersion()); } } } } - } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java index ddfba7505..d8113b12f 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java @@ -29,13 +29,20 @@ public class ProtocolDetectorService implements Runnable { @Override public void run() { for (final Map.Entry lists : plugin.getProxy().getServers().entrySet()) { - lists.getValue().ping(new Callback() { - @Override - public void done(ServerPing serverPing, Throwable throwable) { - if (throwable == null) - protocolIds.put(lists.getKey(), serverPing.getVersion().getProtocol()); - } - }); + updateProtocolInfo(lists.getKey(), lists.getValue()); } } + + private void updateProtocolInfo(final String key, ServerInfo value) { + value.ping(new Callback() { + @Override + public void done(ServerPing serverPing, Throwable throwable) { + if (throwable == null) + protocolIds.put(key, serverPing.getVersion().getProtocol()); + else + throwable.printStackTrace(); + } + }); + } + } From ba3aa4566ef09f1477836687d469fbeeaf184e25 Mon Sep 17 00:00:00 2001 From: Matsv Date: Sat, 1 Oct 2016 14:56:08 +0200 Subject: [PATCH 63/76] Remove some debug messages that prevent Jenkins from building. --- bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java | 1 - .../myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java | 4 ---- 2 files changed, 5 deletions(-) diff --git a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java index f6cd0e614..f94352e14 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java +++ b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java @@ -174,7 +174,6 @@ public class BungeePlugin extends Plugin implements ViaPlatform, Listener { public void onServerConnect(ServerConnectEvent e) throws NoSuchFieldException, IllegalAccessException { UserConnection user = Via.getManager().getConnection(e.getPlayer().getUniqueId()); if (!user.has(BungeeStorage.class)) { - System.out.println("new storage"); user.put(new BungeeStorage(user, e.getPlayer())); } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java index a4bbd4df7..c577ed0f7 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java @@ -98,8 +98,6 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder { if (player.getServer() != null) { if (player.getServer() != null && !player.getServer().getInfo().getName().equals(storage.getCurrentServer())) { - - System.out.println("Server change " + player.getServer().getInfo().getName() + " curr" + storage.getCurrentServer()); String serverName = player.getServer().getInfo().getName(); storage.setCurrentServer(serverName); @@ -144,8 +142,6 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder { Object entityMap = Class.forName("net.md_5.bungee.entitymap.EntityMap").getDeclaredMethod("getEntityMap", int.class).invoke(null, protocolId); ReflectionUtil.set(player, "entityRewrite", entityMap); - - System.out.println("VERSION:" + ((net.md_5.bungee.UserConnection) player).getPendingConnection().getVersion()); } } } From 59620f7f9333ff12ca919fa94ff7a8e763ca04e8 Mon Sep 17 00:00:00 2001 From: Matsv Date: Sat, 1 Oct 2016 15:38:53 +0200 Subject: [PATCH 64/76] Add a command to force search versions @ Bungee --- .../bungee/commands/BungeeCommandHandler.java | 10 +++++++- .../commands/subs/SearchServersSubCmd.java | 25 +++++++++++++++++++ .../service/ProtocolDetectorService.java | 6 +++-- .../protocol1_9to1_8/ViaIdleThread.java | 2 +- 4 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/commands/subs/SearchServersSubCmd.java diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommandHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommandHandler.java index 4e1cbefd5..4d23174b1 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommandHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommandHandler.java @@ -1,7 +1,15 @@ package us.myles.ViaVersion.bungee.commands; +import us.myles.ViaVersion.bungee.commands.subs.SearchServersSubCmd; import us.myles.ViaVersion.commands.ViaCommandHandler; public class BungeeCommandHandler extends ViaCommandHandler { - + public BungeeCommandHandler() { + try { + registerSubCommand(new SearchServersSubCmd()); + } catch (Exception e) { + System.out.println("Failed to register Bungee subcommands"); + e.printStackTrace(); + } + } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/subs/SearchServersSubCmd.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/subs/SearchServersSubCmd.java new file mode 100644 index 000000000..98aa8531f --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/subs/SearchServersSubCmd.java @@ -0,0 +1,25 @@ +package us.myles.ViaVersion.bungee.commands.subs; + +import us.myles.ViaVersion.api.command.ViaCommandSender; +import us.myles.ViaVersion.api.command.ViaSubCommand; +import us.myles.ViaVersion.bungee.service.ProtocolDetectorService; + +// TODO better name +public class SearchServersSubCmd extends ViaSubCommand { + @Override + public String name() { + return "searchservers"; + } + + @Override + public String description() { + return "Force ViaVersion to search for servers to update the version list (Also happens every minute)"; + } + + @Override + public boolean execute(ViaCommandSender sender, String[] args) { + ProtocolDetectorService.getInstance().run(); + sendMessage(sender, "&6Started searching for subservers"); + return true; + } +} diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java index d8113b12f..0f9e2d189 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java @@ -1,5 +1,6 @@ package us.myles.ViaVersion.bungee.service; +import lombok.Getter; import net.md_5.bungee.api.Callback; import net.md_5.bungee.api.ServerPing; import net.md_5.bungee.api.config.ServerInfo; @@ -11,9 +12,12 @@ import java.util.concurrent.ConcurrentHashMap; public class ProtocolDetectorService implements Runnable { private static final Map protocolIds = new ConcurrentHashMap<>(); private BungeePlugin plugin; + @Getter + private static ProtocolDetectorService instance; public ProtocolDetectorService(BungeePlugin plugin) { this.plugin = plugin; + instance = this; } public static Integer getProtocolId(String serverName) { @@ -39,8 +43,6 @@ public class ProtocolDetectorService implements Runnable { public void done(ServerPing serverPing, Throwable throwable) { if (throwable == null) protocolIds.put(key, serverPing.getVersion().getProtocol()); - else - throwable.printStackTrace(); } }); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ViaIdleThread.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ViaIdleThread.java index cfc9c6de5..675df3a22 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ViaIdleThread.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ViaIdleThread.java @@ -10,7 +10,7 @@ public class ViaIdleThread implements Runnable { @Override public void run() { for (UserConnection info : Via.getManager().getPortedPlayers().values()) { - if (info.get(ProtocolInfo.class).getPipeline().contains(Protocol1_9TO1_8.class)) { + if (info.has(ProtocolInfo.class) && info.get(ProtocolInfo.class).getPipeline().contains(Protocol1_9TO1_8.class)) { long nextIdleUpdate = info.get(MovementTracker.class).getNextIdlePacket(); if (nextIdleUpdate <= System.currentTimeMillis()) { if (info.getChannel().isOpen()) { From 3de961f641b89219c461a4d32777f2f55c61d5cb Mon Sep 17 00:00:00 2001 From: Matsv Date: Sat, 1 Oct 2016 20:26:04 +0200 Subject: [PATCH 65/76] Remove infinite loop --- .../protocols/protocolsnapshotto1_10/storage/EntityTracker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/storage/EntityTracker.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/storage/EntityTracker.java index c63186a22..f01bc9c68 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/storage/EntityTracker.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/storage/EntityTracker.java @@ -19,7 +19,7 @@ public class EntityTracker extends StoredObject { } public void removeEntity(int entityId) { - removeEntity(entityId); + clientEntityTypes.remove(entityId); if (isHologram(entityId)) removeHologram(entityId); } From 7d3548956eb121f501f0af3d7997ccc526f505a5 Mon Sep 17 00:00:00 2001 From: Matsv Date: Sat, 1 Oct 2016 20:56:14 +0200 Subject: [PATCH 66/76] Fix 16w39c --- .../api/entities/Entity1_11Types.java | 12 ++--- .../MetadataRewriter.java | 51 ++++++++++--------- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_11Types.java b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_11Types.java index a04c8fe25..d091f9ba0 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_11Types.java +++ b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_11Types.java @@ -160,10 +160,6 @@ public class Entity1_11Types { return Optional.absent(); } - public boolean is(EntityType type) { - return this == type; - } - public boolean is(EntityType... types) { for (EntityType type : types) if (is(type)) @@ -171,14 +167,18 @@ public class Entity1_11Types { return false; } + public boolean is(EntityType type) { + return this == type; + } + public boolean isOrHasParent(EntityType type) { EntityType parent = this; do { - if (parent == type) + if (parent.equals(type)) return true; - parent = type.getParent(); + parent = parent.getParent(); } while (parent != null); return false; diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java index 4d382f9eb..e4aa98f6f 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_10/MetadataRewriter.java @@ -161,32 +161,32 @@ public class MetadataRewriter { } } } - if (type.is(EntityType.ARMOR_STAND) && Via.getConfig().isHologramPatch()) { - Optional flags = getById(metadatas, 11); - Optional customName = getById(metadatas, 2); - Optional customNameVisible = getById(metadatas, 3); - if (metadata.getId() == 0 && flags.isPresent() && customName.isPresent() && customNameVisible.isPresent()) { - Metadata meta = flags.get(); - byte data = (byte) metadata.getValue(); - // Check invisible | Check small | Check if custom name is empty | Check if custom name visible is true - if ((data & 0x20) == 0x20 && ((byte) meta.getValue() & 0x01) == 0x01 - && ((String) customName.get().getValue()).length() != 0 && (boolean) customNameVisible.get().getValue()) { - EntityTracker tracker = connection.get(EntityTracker.class); - if (!tracker.isHologram(entityId)) { - tracker.addHologram(entityId); - try { - // Send movement - PacketWrapper wrapper = new PacketWrapper(0x25, null, connection); - wrapper.write(Type.VAR_INT, entityId); - wrapper.write(Type.SHORT, (short) 0); - wrapper.write(Type.SHORT, (short) (128D * (-Via.getConfig().getHologramYOffset() * 32D))); - wrapper.write(Type.SHORT, (short) 0); - wrapper.write(Type.BOOLEAN, true); + } + if (type.is(EntityType.ARMOR_STAND) && Via.getConfig().isHologramPatch()) { + Optional flags = getById(metadatas, 11); + Optional customName = getById(metadatas, 2); + Optional customNameVisible = getById(metadatas, 3); + if (metadata.getId() == 0 && flags.isPresent() && customName.isPresent() && customNameVisible.isPresent()) { + Metadata meta = flags.get(); + byte data = (byte) metadata.getValue(); + // Check invisible | Check small | Check if custom name is empty | Check if custom name visible is true + if ((data & 0x20) == 0x20 && ((byte) meta.getValue() & 0x01) == 0x01 + && ((String) customName.get().getValue()).length() != 0 && (boolean) customNameVisible.get().getValue()) { + EntityTracker tracker = connection.get(EntityTracker.class); + if (!tracker.isHologram(entityId)) { + tracker.addHologram(entityId); + try { + // Send movement + PacketWrapper wrapper = new PacketWrapper(0x25, null, connection); + wrapper.write(Type.VAR_INT, entityId); + wrapper.write(Type.SHORT, (short) 0); + wrapper.write(Type.SHORT, (short) (128D * (-Via.getConfig().getHologramYOffset() * 32D))); + wrapper.write(Type.SHORT, (short) 0); + wrapper.write(Type.BOOLEAN, true); - wrapper.send(ProtocolSnapshotTo1_10.class); - } catch (Exception e) { - e.printStackTrace(); - } + wrapper.send(ProtocolSnapshotTo1_10.class); + } catch (Exception e) { + e.printStackTrace(); } } } @@ -201,6 +201,7 @@ public class MetadataRewriter { } } } + } public static Optional getById(List metadatas, int id) { From eb8065ad20eb48f573ade0fae12d3ea4e597887b Mon Sep 17 00:00:00 2001 From: Myles Date: Sat, 1 Oct 2016 21:30:39 +0100 Subject: [PATCH 67/76] Tab complete for bungee --- .../us/myles/ViaVersion/bungee/commands/BungeeCommand.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommand.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommand.java index b5114b9b4..bdb4cbd51 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommand.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommand.java @@ -2,8 +2,9 @@ package us.myles.ViaVersion.bungee.commands; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.plugin.Command; +import net.md_5.bungee.api.plugin.TabExecutor; -public class BungeeCommand extends Command { +public class BungeeCommand extends Command implements TabExecutor{ private final BungeeCommandHandler handler; public BungeeCommand(BungeeCommandHandler handler) { @@ -16,4 +17,8 @@ public class BungeeCommand extends Command { handler.onCommand(new BungeeCommandSender(commandSender), strings); } + @Override + public Iterable onTabComplete(CommandSender commandSender, String[] strings) { + return handler.onTabComplete(new BungeeCommandSender(commandSender), strings); + } } From d3b214965b8e37b6106fcbabfae2c0c4b1d62888 Mon Sep 17 00:00:00 2001 From: Matsv Date: Sun, 2 Oct 2016 11:27:45 +0200 Subject: [PATCH 68/76] Add server info to the dump (#505) --- bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java | 2 +- .../ViaVersion/bungee/service/ProtocolDetectorService.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java index f94352e14..d70bf3b49 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java +++ b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java @@ -160,7 +160,7 @@ public class BungeePlugin extends Plugin implements ViaPlatform, Listener { plugins.add(new PluginInfo(true, p.getDescription().getName(), p.getDescription().getVersion(), p.getDescription().getMain(), Arrays.asList(p.getDescription().getAuthor()))); platformSpecific.add("plugins", GsonUtil.getGson().toJsonTree(plugins)); - + platformSpecific.add("servers", GsonUtil.getGson().toJsonTree(ProtocolDetectorService.getProtocolIds())); return platformSpecific; } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java index 0f9e2d189..f0bc5fe55 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java @@ -6,6 +6,7 @@ import net.md_5.bungee.api.ServerPing; import net.md_5.bungee.api.config.ServerInfo; import us.myles.ViaVersion.BungeePlugin; +import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -47,4 +48,8 @@ public class ProtocolDetectorService implements Runnable { }); } + public static Map getProtocolIds() { + return new HashMap<>(protocolIds); + } + } From 3354a46283b61d3410eb52c3636482ed80edcb53 Mon Sep 17 00:00:00 2001 From: Matsv Date: Sun, 2 Oct 2016 11:41:18 +0200 Subject: [PATCH 69/76] Remove some more debug messages --- bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java | 1 - .../us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java | 1 - 2 files changed, 2 deletions(-) diff --git a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java index d70bf3b49..48e8faa27 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java +++ b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java @@ -186,7 +186,6 @@ public class BungeePlugin extends Plugin implements ViaPlatform, Listener { Object handshake = ReflectionUtil.invoke(pendingConnection, "getHandshake"); Method setProtocol = handshake.getClass().getDeclaredMethod("setProtocolVersion", int.class); setProtocol.invoke(handshake, protocols == null ? user.get(ProtocolInfo.class).getProtocolVersion() : protocolId); - System.out.println("Changed server protocol id " + protocolId + " clientProtocol:" + user.get(ProtocolInfo.class).getProtocolVersion() + " path:" + protocols); } catch (NoSuchMethodException | InvocationTargetException e1) { e1.printStackTrace(); } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java index c577ed0f7..2618e8b26 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java @@ -114,7 +114,6 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder { ProtocolInfo info = viaConnection.get(ProtocolInfo.class); // Refresh the pipes List> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), protocolId); - System.out.println(info.getProtocolVersion() + ">" + protocolId + " " + protocols); ProtocolPipeline pipeline = viaConnection.get(ProtocolInfo.class).getPipeline(); viaConnection.clearStoredObjects(); From 3fe25f68b1b3549080dd3597ddfd4bf73ac50d96 Mon Sep 17 00:00:00 2001 From: Matsv Date: Sun, 2 Oct 2016 12:03:56 +0200 Subject: [PATCH 70/76] Fix another infinite loop, @MylesIsCool and I are great at creating them ;) --- common/src/main/java/us/myles/ViaVersion/util/Config.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/us/myles/ViaVersion/util/Config.java b/common/src/main/java/us/myles/ViaVersion/util/Config.java index 91dc44884..0ba117dec 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/Config.java +++ b/common/src/main/java/us/myles/ViaVersion/util/Config.java @@ -88,7 +88,7 @@ public abstract class Config implements ConfigurationProvider { @Override public void set(String path, Object value) { - set(path, value); + config.put(path, value); } @Override From 21c957b8d5312da5cfbfd5b1c4c4c746d1a06599 Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 2 Oct 2016 19:40:38 +0100 Subject: [PATCH 71/76] Config for protocol versions Also make config concurrent --- .../bukkit/platform/BukkitConfigAPI.java | 8 ++- .../us/myles/ViaVersion/BungeePlugin.java | 6 +- .../bungee/handlers/BungeeEncodeHandler.java | 8 --- .../bungee/platform/BungeeConfigAPI.java | 66 ++++++++++++++++++- .../bungee/platform/BungeeViaLoader.java | 9 ++- .../providers/BungeeVersionProvider.java | 19 +++++- .../service/ProtocolDetectorService.java | 51 ++++++++++---- .../api/protocol/ProtocolVersion.java | 21 +++++- .../java/us/myles/ViaVersion/util/Config.java | 23 ++++++- common/src/main/resources/config.yml | 27 +++++++- .../us/myles/ViaVersion/SpongePlugin.java | 3 +- .../sponge/platform/SpongeConfigAPI.java | 8 ++- 12 files changed, 209 insertions(+), 40 deletions(-) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitConfigAPI.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitConfigAPI.java index c7141606f..54820614e 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitConfigAPI.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitConfigAPI.java @@ -8,9 +8,10 @@ import us.myles.ViaVersion.util.Config; import java.io.File; import java.util.Arrays; import java.util.List; +import java.util.Map; public class BukkitConfigAPI extends Config implements ViaVersionConfig { - private static List UNSUPPORTED = Arrays.asList(); + private static List UNSUPPORTED = Arrays.asList("bungee-ping-interval", "bungee-ping-save", "bungee-servers"); public BukkitConfigAPI() { super(new File(((ViaVersionPlugin) Via.getPlatform()).getDataFolder(), "config.yml")); @@ -166,6 +167,11 @@ public class BukkitConfigAPI extends Config implements ViaVersionConfig { return getString("reload-disconnect-msg", "Server reload, please rejoin!"); } + @Override + protected void handleConfig(Map config) { + // Nothing currently + } + @Override public List getUnsupportedOptions() { return UNSUPPORTED; diff --git a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java index 48e8faa27..96144322d 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java +++ b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java @@ -58,8 +58,6 @@ public class BungeePlugin extends Plugin implements ViaPlatform, Listener { .loader(new BungeeViaLoader(this)) .commandHandler(commandHandler) .build()); - - getProxy().getPluginManager().registerListener(this, this); } @Override @@ -137,7 +135,7 @@ public class BungeePlugin extends Plugin implements ViaPlatform, Listener { } @Override - public ViaVersionConfig getConf() { + public BungeeConfigAPI getConf() { return config; } @@ -160,7 +158,7 @@ public class BungeePlugin extends Plugin implements ViaPlatform, Listener { plugins.add(new PluginInfo(true, p.getDescription().getName(), p.getDescription().getVersion(), p.getDescription().getMain(), Arrays.asList(p.getDescription().getAuthor()))); platformSpecific.add("plugins", GsonUtil.getGson().toJsonTree(plugins)); - platformSpecific.add("servers", GsonUtil.getGson().toJsonTree(ProtocolDetectorService.getProtocolIds())); + platformSpecific.add("servers", GsonUtil.getGson().toJsonTree(ProtocolDetectorService.getDetectedIds())); return platformSpecific; } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java index 2618e8b26..8bc30020d 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java @@ -102,12 +102,6 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder { storage.setCurrentServer(serverName); - // TODO HANDLE - if (!ProtocolDetectorService.hasProtocolId(serverName)) { - Via.getPlatform().getLogger().severe("Could not find the protocol id for server " + serverName); - return; - } - int protocolId = ProtocolDetectorService.getProtocolId(serverName); UserConnection viaConnection = Via.getManager().getConnection(player.getUniqueId()); @@ -124,7 +118,6 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder { pipeline.add(prot.getValue()); } - viaConnection.put(info); viaConnection.put(storage); @@ -137,7 +130,6 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder { Object wrapper = ReflectionUtil.get(player, "ch", Object.class); wrapper.getClass().getDeclaredMethod("setVersion", int.class).invoke(wrapper, protocolId); -// ReflectionUtil.invoke(player, "init"); Object entityMap = Class.forName("net.md_5.bungee.entitymap.EntityMap").getDeclaredMethod("getEntityMap", int.class).invoke(null, protocolId); ReflectionUtil.set(player, "entityRewrite", entityMap); diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java index 6b94997ac..fba410c80 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java @@ -1,11 +1,12 @@ package us.myles.ViaVersion.bungee.platform; import us.myles.ViaVersion.api.ViaVersionConfig; +import us.myles.ViaVersion.api.protocol.ProtocolVersion; +import us.myles.ViaVersion.bungee.providers.BungeeVersionProvider; import us.myles.ViaVersion.util.Config; import java.io.File; -import java.util.Arrays; -import java.util.List; +import java.util.*; public class BungeeConfigAPI extends Config implements ViaVersionConfig { private static List UNSUPPORTED = Arrays.asList("nms-player-ticking", "item-cache", "anti-xray-patch"); @@ -14,6 +15,38 @@ public class BungeeConfigAPI extends Config implements ViaVersionConfig { super(new File(configFile, "config.yml")); } + @Override + protected void handleConfig(Map config) { + // Parse servers + Map servers; + if (!(config.get("bungee-servers") instanceof Map)) { + servers = new HashMap<>(); + } else { + servers = (Map) config.get("bungee-servers"); + } + // Convert any bad Protocol Ids + for (Map.Entry entry : new HashSet<>(servers.entrySet())) { + if (!(entry.getValue() instanceof Integer)) { + if (entry.getValue() instanceof String) { + ProtocolVersion found = ProtocolVersion.getClosest((String) entry.getValue()); + if (found != null) { + servers.put(entry.getKey(), found.getId()); + } else { + servers.remove(entry.getKey()); // Remove! + } + } else { + servers.remove(entry.getKey()); // Remove! + } + } + } + // Ensure default exists + if (!servers.containsKey("default")) { + servers.put("default", BungeeVersionProvider.getLowestSupportedVersion()); + } + // Put back + config.put("bungee-servers", servers); + } + @Override public List getUnsupportedOptions() { return UNSUPPORTED; @@ -167,4 +200,33 @@ public class BungeeConfigAPI extends Config implements ViaVersionConfig { public String getReloadDisconnectMsg() { return getString("reload-disconnect-msg", "Server reload, please rejoin!"); } + + /** + * What is the interval for checking servers via ping + * -1 for disabled + * + * @return Ping interval in seconds + */ + public int getBungeePingInterval() { + return getInt("bungee-ping-interval", 60); + } + + /** + * Should the bungee ping be saved to the config on change. + * + * @return True if it should save + */ + public boolean isBungeePingSave() { + return getBoolean("bungee-ping-save", true); + } + + /** + * Get the listed server protocols in the config. + * default will be listed as default. + * + * @return Map of String, Integer + */ + public Map getBungeeServerProtocols() { + return get("bungee-servers", Map.class, new HashMap<>()); + } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java index fe2a16b32..3348535e3 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java @@ -1,6 +1,7 @@ package us.myles.ViaVersion.bungee.platform; import lombok.AllArgsConstructor; +import net.md_5.bungee.api.ProxyServer; import us.myles.ViaVersion.BungeePlugin; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaPlatformLoader; @@ -18,9 +19,13 @@ public class BungeeViaLoader implements ViaPlatformLoader { @Override public void load() { + // Listeners + ProxyServer.getInstance().getPluginManager().registerListener(plugin, plugin); + // Providers Via.getManager().getProviders().use(MovementTransmitterProvider.class, new BungeeMovementTransmitter()); Via.getManager().getProviders().use(VersionProvider.class, new BungeeVersionProvider()); - - plugin.getProxy().getScheduler().schedule(plugin, new ProtocolDetectorService(plugin), 0, 1, TimeUnit.MINUTES); + if (plugin.getConf().getBungeePingInterval() > 0) { + plugin.getProxy().getScheduler().schedule(plugin, new ProtocolDetectorService(plugin), 0, plugin.getConf().getBungeePingInterval(), TimeUnit.SECONDS); + } } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/providers/BungeeVersionProvider.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/providers/BungeeVersionProvider.java index 699692e31..3dc9be3a1 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/providers/BungeeVersionProvider.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/providers/BungeeVersionProvider.java @@ -1,6 +1,7 @@ package us.myles.ViaVersion.bungee.providers; import com.google.common.collect.Lists; +import net.md_5.bungee.api.ProxyServer; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.base.VersionProvider; @@ -11,7 +12,7 @@ import java.util.List; public class BungeeVersionProvider extends VersionProvider { private static Class ref; - public BungeeVersionProvider() { + static { try { ref = Class.forName("net.md_5.bungee.protocol.ProtocolConstants"); } catch (Exception e) { @@ -35,7 +36,7 @@ public class BungeeVersionProvider extends VersionProvider { // Older than bungee supports, get the lowest version if (info.getProtocolVersion() < list.get(0)) { - return list.get(0); + return getLowestSupportedVersion(); } // Loop through all protocols to get the closest protocol id that bungee supports @@ -47,4 +48,18 @@ public class BungeeVersionProvider extends VersionProvider { System.out.println("Panic, no protocol id found for " + info.getProtocolVersion()); return info.getProtocolVersion(); } + + public static int getLowestSupportedVersion() { + List list; + try { + list = ReflectionUtil.getStatic(ref, "SUPPORTED_VERSION_IDS", List.class); + return list.get(0); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + // Fallback + return ProxyServer.getInstance().getProtocolVersion(); + } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java index f0bc5fe55..f883e82aa 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java @@ -2,16 +2,22 @@ package us.myles.ViaVersion.bungee.service; import lombok.Getter; import net.md_5.bungee.api.Callback; +import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.ServerPing; import net.md_5.bungee.api.config.ServerInfo; import us.myles.ViaVersion.BungeePlugin; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.bungee.platform.BungeeConfigAPI; +import us.myles.ViaVersion.bungee.providers.BungeeVersionProvider; +import us.myles.ViaVersion.util.ReflectionUtil; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class ProtocolDetectorService implements Runnable { - private static final Map protocolIds = new ConcurrentHashMap<>(); + private static final Map detectedProtocolIds = new ConcurrentHashMap<>(); private BungeePlugin plugin; @Getter private static ProtocolDetectorService instance; @@ -22,13 +28,21 @@ public class ProtocolDetectorService implements Runnable { } public static Integer getProtocolId(String serverName) { - if (!hasProtocolId(serverName)) - return -1; - return protocolIds.get(serverName); - } - - public static boolean hasProtocolId(String serverName) { - return protocolIds.containsKey(serverName); + // Step 1. Check Config + Map servers = ((BungeeConfigAPI) Via.getConfig()).getBungeeServerProtocols(); + if (servers.containsKey(serverName)) { + return servers.get(serverName); + } + // Step 2. Check Detected + if (detectedProtocolIds.containsKey(serverName)) { + return detectedProtocolIds.get(serverName); + } + // Step 3. Use Default + if (servers.containsKey("default")) { + return servers.get("default"); + } + // Step 4: Use bungee lowest supported... *cries* + return BungeeVersionProvider.getLowestSupportedVersion(); } @Override @@ -42,14 +56,27 @@ public class ProtocolDetectorService implements Runnable { value.ping(new Callback() { @Override public void done(ServerPing serverPing, Throwable throwable) { - if (throwable == null) - protocolIds.put(key, serverPing.getVersion().getProtocol()); + if (throwable == null) { + detectedProtocolIds.put(key, serverPing.getVersion().getProtocol()); + if (((BungeeConfigAPI) Via.getConfig()).isBungeePingSave()) { + Map servers = ((BungeeConfigAPI) Via.getConfig()).getBungeeServerProtocols(); + if (servers.containsKey(key)) { + if (servers.get(key) == serverPing.getVersion().getProtocol()) { + return; + } + } + // Save Server + servers.put(key, serverPing.getVersion().getProtocol()); + // Save + Via.getPlatform().getConfigurationProvider().saveConfig(); + } + } } }); } - public static Map getProtocolIds() { - return new HashMap<>(protocolIds); + public static Map getDetectedIds() { + return new HashMap<>(detectedProtocolIds); } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolVersion.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolVersion.java index 98ec33ab3..735b5814f 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolVersion.java +++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolVersion.java @@ -51,7 +51,8 @@ public class ProtocolVersion { register(v1_9_2 = new ProtocolVersion(109, "1.9.2")); register(v1_9_3 = new ProtocolVersion(110, "1.9.3/4")); register(v1_10 = new ProtocolVersion(210, "1.10")); - register(vSNAPSHOT = new ProtocolVersion(309, "1.11-SNAPSHOT")); + // Snapshot uses colon as dashes are used other places... + register(vSNAPSHOT = new ProtocolVersion(309, "1.11:SNAPSHOT")); register(unknown = new ProtocolVersion(-1, "UNKNOWN")); } @@ -80,6 +81,24 @@ public class ProtocolVersion { return Collections.unmodifiableList(new ArrayList<>(versions.values())); } + public static ProtocolVersion getClosest(String protocol) { + for (ProtocolVersion version : versions.values()) { + if (version.getName().equals(protocol)) + return version; + if (version.getName().equals(protocol + ".x")) + return version; + String[] parts = version.getName().split("-"); + for (String part : parts) { + if (part.equalsIgnoreCase(protocol)) { + return version; + } + if (part.equals(protocol + ".x")) + return version; + } + } + return null; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/common/src/main/java/us/myles/ViaVersion/util/Config.java b/common/src/main/java/us/myles/ViaVersion/util/Config.java index 0ba117dec..edb22a677 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/Config.java +++ b/common/src/main/java/us/myles/ViaVersion/util/Config.java @@ -1,5 +1,6 @@ package us.myles.ViaVersion.util; +import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; @@ -9,17 +10,21 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public abstract class Config implements ConfigurationProvider { private static ThreadLocal yaml = new ThreadLocal() { @Override protected Yaml initialValue() { - return new Yaml(); + DumperOptions options = new DumperOptions(); +// options.setPrettyFlow(true); + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + return new Yaml(options); } }; private CommentStore commentStore = new CommentStore('.', 2); private final File configFile; - private Map config; + private ConcurrentHashMap config; public Config(File configFile) { this.configFile = configFile; @@ -70,12 +75,16 @@ public abstract class Config implements ConfigurationProvider { } catch (IOException e) { e.printStackTrace(); } + // Call Handler + handleConfig(defaults); // Save saveConfig(location, defaults); return defaults; } + protected abstract void handleConfig(Map config); + public void saveConfig(File location, Map config) { try { commentStore.writeComments(yaml.get().dump(config), location); @@ -100,7 +109,7 @@ public abstract class Config implements ConfigurationProvider { @Override public void reloadConfig() { this.configFile.getParentFile().mkdirs(); - this.config = loadConfig(this.configFile); + this.config = new ConcurrentHashMap<>(loadConfig(this.configFile)); } @Override @@ -108,6 +117,14 @@ public abstract class Config implements ConfigurationProvider { return this.config; } + public T get(String key, Class clazz, T def) { + if (this.config.containsKey(key)) { + return (T) this.config.get(key); + } else { + return def; + } + } + public boolean getBoolean(String key, boolean def) { if (this.config.containsKey(key)) { return (boolean) this.config.get(key); diff --git a/common/src/main/resources/config.yml b/common/src/main/resources/config.yml index f3dcb8737..ff47962aa 100644 --- a/common/src/main/resources/config.yml +++ b/common/src/main/resources/config.yml @@ -3,9 +3,10 @@ # If you need help: # viaversion.com - Discussion tab # IRC - https://elmer.spi.gt/iris/?nick=&channels=viaversion #viaversion on irc.spi.gt +# Docs - https://docs.viaversion.com/display/VIAVERSION/Configuration # #----------------------------------------------------------# -# GLOBAL OPTIONS # +# GLOBAL OPTIONS # #----------------------------------------------------------# # # Should ViaVersion check for updates? @@ -23,7 +24,29 @@ block-disconnect-msg: "You are using an unsupported Minecraft version!" reload-disconnect-msg: "Server reload, please rejoin!" # #----------------------------------------------------------# -# GLOBAL PACKET LIMITER # +# BUNGEE OPTIONS # +#----------------------------------------------------------# +# +# BungeeCord allows you to have different server versions inside. +# Instead of you entering all the versions of these servers, we can ping them. +# +# What interval would you like us to ping at? (in seconds) +# Use -1 to disable. +bungee-ping-interval: 60 +# If the above is enabled, should we save the info to the config (in the section below) +bungee-ping-save: true +# To get a servers protocol, ViaVersion will do the following: +# Look for the server in the following section, then look for the last ping if bungee-ping is enabled +# otherwise use default. +# +# The format for the following is: +# servername: protocolversion +# You can find protocol ids on http://wiki.vg/Protocol_version_numbers +# It will fallback to the default option if none found. +bungee-servers: {} +# +#----------------------------------------------------------# +# GLOBAL PACKET LIMITER # #----------------------------------------------------------# # # diff --git a/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java b/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java index fd0b9b18a..78df27c07 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java +++ b/sponge/src/main/java/us/myles/ViaVersion/SpongePlugin.java @@ -13,7 +13,6 @@ import org.spongepowered.api.scheduler.SpongeExecutorService; import org.spongepowered.api.text.serializer.TextSerializers; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaAPI; -import us.myles.ViaVersion.api.ViaVersionConfig; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import us.myles.ViaVersion.api.platform.TaskId; @@ -162,7 +161,7 @@ public class SpongePlugin implements ViaPlatform { } @Override - public ViaVersionConfig getConf() { + public SpongeConfigAPI getConf() { return conf; } diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeConfigAPI.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeConfigAPI.java index 6bd2562fb..b7e4df980 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeConfigAPI.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeConfigAPI.java @@ -6,14 +6,20 @@ import us.myles.ViaVersion.util.Config; import java.io.File; import java.util.Arrays; import java.util.List; +import java.util.Map; public class SpongeConfigAPI extends Config implements ViaVersionConfig { - private static List UNSUPPORTED = Arrays.asList("anti-xray-patch"); + private static List UNSUPPORTED = Arrays.asList("anti-xray-patch", "bungee-ping-interval", "bungee-ping-save", "bungee-servers"); public SpongeConfigAPI(File configFile) { super(new File(configFile, "config.yml")); } + @Override + protected void handleConfig(Map config) { + // Nothing Currently + } + @Override public List getUnsupportedOptions() { return UNSUPPORTED; From d0e7f05d50e304723654da00176be0381c8ec76a Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 2 Oct 2016 19:41:02 +0100 Subject: [PATCH 72/76] Remove commented line --- common/src/main/java/us/myles/ViaVersion/util/Config.java | 1 - 1 file changed, 1 deletion(-) diff --git a/common/src/main/java/us/myles/ViaVersion/util/Config.java b/common/src/main/java/us/myles/ViaVersion/util/Config.java index edb22a677..b07985ab7 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/Config.java +++ b/common/src/main/java/us/myles/ViaVersion/util/Config.java @@ -17,7 +17,6 @@ public abstract class Config implements ConfigurationProvider { @Override protected Yaml initialValue() { DumperOptions options = new DumperOptions(); -// options.setPrettyFlow(true); options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); return new Yaml(options); } From 4b3f75788192c32bfa0138dc0885ecfa11985787 Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 2 Oct 2016 19:45:55 +0100 Subject: [PATCH 73/76] Rename scan servers to probe --- .../bungee/commands/BungeeCommandHandler.java | 4 ++-- .../{SearchServersSubCmd.java => ProbeSubCmd.java} | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) rename bungee/src/main/java/us/myles/ViaVersion/bungee/commands/subs/{SearchServersSubCmd.java => ProbeSubCmd.java} (51%) diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommandHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommandHandler.java index 4d23174b1..44c7c5eb0 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommandHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/BungeeCommandHandler.java @@ -1,12 +1,12 @@ package us.myles.ViaVersion.bungee.commands; -import us.myles.ViaVersion.bungee.commands.subs.SearchServersSubCmd; +import us.myles.ViaVersion.bungee.commands.subs.ProbeSubCmd; import us.myles.ViaVersion.commands.ViaCommandHandler; public class BungeeCommandHandler extends ViaCommandHandler { public BungeeCommandHandler() { try { - registerSubCommand(new SearchServersSubCmd()); + registerSubCommand(new ProbeSubCmd()); } catch (Exception e) { System.out.println("Failed to register Bungee subcommands"); e.printStackTrace(); diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/subs/SearchServersSubCmd.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/subs/ProbeSubCmd.java similarity index 51% rename from bungee/src/main/java/us/myles/ViaVersion/bungee/commands/subs/SearchServersSubCmd.java rename to bungee/src/main/java/us/myles/ViaVersion/bungee/commands/subs/ProbeSubCmd.java index 98aa8531f..fda215417 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/subs/SearchServersSubCmd.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/commands/subs/ProbeSubCmd.java @@ -1,25 +1,28 @@ package us.myles.ViaVersion.bungee.commands.subs; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; +import us.myles.ViaVersion.bungee.platform.BungeeConfigAPI; import us.myles.ViaVersion.bungee.service.ProtocolDetectorService; -// TODO better name -public class SearchServersSubCmd extends ViaSubCommand { +public class ProbeSubCmd extends ViaSubCommand { @Override public String name() { - return "searchservers"; + return "probe"; } @Override public String description() { - return "Force ViaVersion to search for servers to update the version list (Also happens every minute)"; + return "Forces ViaVersion to scan server protocol versions " + + (((BungeeConfigAPI) Via.getConfig()).getBungeePingInterval() == -1 ? + "" : "(Also happens at an interval)"); } @Override public boolean execute(ViaCommandSender sender, String[] args) { ProtocolDetectorService.getInstance().run(); - sendMessage(sender, "&6Started searching for subservers"); + sendMessage(sender, "&6Started searching for protocol versions"); return true; } } From 7d23b12f85765f9711fa053e84d7383711347e07 Mon Sep 17 00:00:00 2001 From: Matsv Date: Sun, 2 Oct 2016 21:35:54 +0200 Subject: [PATCH 74/76] Implement the UpdateListener for Bungee --- .../java/us/myles/ViaVersion/BungeePlugin.java | 7 +++---- .../bungee/listeners/UpdateListener.java | 18 ++++++++++++++++++ .../bungee/platform/BungeeViaLoader.java | 3 +++ 3 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/listeners/UpdateListener.java diff --git a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java index 96144322d..544f4936a 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java +++ b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java @@ -12,7 +12,6 @@ import net.md_5.bungee.event.EventHandler; import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaAPI; -import us.myles.ViaVersion.api.ViaVersionConfig; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import us.myles.ViaVersion.api.data.UserConnection; @@ -83,7 +82,7 @@ public class BungeePlugin extends Plugin implements ViaPlatform, Listener { @Override public TaskId runSync(Runnable runnable) { - return new BungeeTaskId(getProxy().getScheduler().runAsync(this, runnable).getId()); + return runAsync(runnable); } @Override @@ -112,13 +111,13 @@ public class BungeePlugin extends Plugin implements ViaPlatform, Listener { @Override public void sendMessage(UUID uuid, String message) { - getProxy().getPlayer(uuid).sendMessage(new TextComponent(message)); + getProxy().getPlayer(uuid).sendMessage(TextComponent.fromLegacyText(message)); } @Override public boolean kickPlayer(UUID uuid, String message) { if (getProxy().getPlayer(uuid) != null) { - getProxy().getPlayer(uuid).disconnect(new TextComponent(message)); + getProxy().getPlayer(uuid).disconnect(TextComponent.fromLegacyText(message)); return true; } return false; diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/listeners/UpdateListener.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/listeners/UpdateListener.java new file mode 100644 index 000000000..b27ba57e8 --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/listeners/UpdateListener.java @@ -0,0 +1,18 @@ +package us.myles.ViaVersion.bungee.listeners; + +import net.md_5.bungee.api.event.PostLoginEvent; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.update.UpdateUtil; + +public class UpdateListener implements Listener { + + @EventHandler + public void onJoin(PostLoginEvent e) { + if (e.getPlayer().hasPermission("viaversion.update") + && Via.getConfig().isCheckForUpdates()) { + UpdateUtil.sendUpdateMessage(e.getPlayer().getUniqueId()); + } + } +} diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java index 3348535e3..9ba4e250e 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java @@ -5,6 +5,7 @@ import net.md_5.bungee.api.ProxyServer; import us.myles.ViaVersion.BungeePlugin; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaPlatformLoader; +import us.myles.ViaVersion.bungee.listeners.UpdateListener; import us.myles.ViaVersion.bungee.providers.BungeeMovementTransmitter; import us.myles.ViaVersion.bungee.providers.BungeeVersionProvider; import us.myles.ViaVersion.bungee.service.ProtocolDetectorService; @@ -21,6 +22,8 @@ public class BungeeViaLoader implements ViaPlatformLoader { public void load() { // Listeners ProxyServer.getInstance().getPluginManager().registerListener(plugin, plugin); + ProxyServer.getInstance().getPluginManager().registerListener(plugin, new UpdateListener()); + // Providers Via.getManager().getProviders().use(MovementTransmitterProvider.class, new BungeeMovementTransmitter()); Via.getManager().getProviders().use(VersionProvider.class, new BungeeVersionProvider()); From 64cde13ea726e57f5f9b0ca54b77d18d34fcec38 Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 2 Oct 2016 20:50:34 +0100 Subject: [PATCH 75/76] Ensure order is kept with maps & yaml (as well as concurrency with maps) --- .../myles/ViaVersion/util/CommentStore.java | 8 +++- .../java/us/myles/ViaVersion/util/Config.java | 11 ++++-- .../ViaVersion/util/YamlConstructor.java | 38 +++++++++++++++++++ 3 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 common/src/main/java/us/myles/ViaVersion/util/YamlConstructor.java diff --git a/common/src/main/java/us/myles/ViaVersion/util/CommentStore.java b/common/src/main/java/us/myles/ViaVersion/util/CommentStore.java index 12bd9b031..33acbe4c8 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/CommentStore.java +++ b/common/src/main/java/us/myles/ViaVersion/util/CommentStore.java @@ -63,8 +63,12 @@ public class CommentStore { public void storeComments(InputStream inputStream) throws IOException { InputStreamReader reader = new InputStreamReader(inputStream); - String contents = CharStreams.toString(reader); - + String contents; + try { + contents = CharStreams.toString(reader); + } finally { + reader.close(); + } StringBuilder memoryData = new StringBuilder(); // Parse headers final String pathSeparator = Character.toString(this.pathSeperator); diff --git a/common/src/main/java/us/myles/ViaVersion/util/Config.java b/common/src/main/java/us/myles/ViaVersion/util/Config.java index b07985ab7..7d6e1edca 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/Config.java +++ b/common/src/main/java/us/myles/ViaVersion/util/Config.java @@ -2,6 +2,7 @@ package us.myles.ViaVersion.util; import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.representer.Representer; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import java.io.*; @@ -10,7 +11,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentSkipListMap; public abstract class Config implements ConfigurationProvider { private static ThreadLocal yaml = new ThreadLocal() { @@ -18,12 +19,14 @@ public abstract class Config implements ConfigurationProvider { protected Yaml initialValue() { DumperOptions options = new DumperOptions(); options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); - return new Yaml(options); + options.setPrettyFlow(false); + options.setIndent(2); + return new Yaml(new YamlConstructor(), new Representer(), options); } }; private CommentStore commentStore = new CommentStore('.', 2); private final File configFile; - private ConcurrentHashMap config; + private ConcurrentSkipListMap config; public Config(File configFile) { this.configFile = configFile; @@ -108,7 +111,7 @@ public abstract class Config implements ConfigurationProvider { @Override public void reloadConfig() { this.configFile.getParentFile().mkdirs(); - this.config = new ConcurrentHashMap<>(loadConfig(this.configFile)); + this.config = new ConcurrentSkipListMap<>(loadConfig(this.configFile)); } @Override diff --git a/common/src/main/java/us/myles/ViaVersion/util/YamlConstructor.java b/common/src/main/java/us/myles/ViaVersion/util/YamlConstructor.java new file mode 100644 index 000000000..4bc53061a --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/util/YamlConstructor.java @@ -0,0 +1,38 @@ +package us.myles.ViaVersion.util; + +import org.yaml.snakeyaml.constructor.Constructor; +import org.yaml.snakeyaml.constructor.SafeConstructor; +import org.yaml.snakeyaml.nodes.Node; +import org.yaml.snakeyaml.nodes.NodeId; +import org.yaml.snakeyaml.nodes.Tag; + +import java.util.concurrent.ConcurrentSkipListMap; + +public class YamlConstructor extends SafeConstructor { + public YamlConstructor() { + super(); + yamlClassConstructors.put(NodeId.mapping, new YamlConstructor.ConstructYamlMap()); + yamlConstructors.put(Tag.OMAP, new YamlConstructor.ConstructYamlOmap()); + } + + class Map extends Constructor.ConstructYamlMap { + @Override + public Object construct(Node node) { + Object o = super.construct(node); + if (o instanceof Map && !(o instanceof ConcurrentSkipListMap)) { + return new ConcurrentSkipListMap<>((java.util.Map) o); + } + return o; + } + } + + class ConstructYamlOmap extends Constructor.ConstructYamlOmap { + public Object construct(Node node) { + Object o = super.construct(node); + if (o instanceof Map && !(o instanceof ConcurrentSkipListMap)) { + return new ConcurrentSkipListMap<>((java.util.Map) o); + } + return o; + } + } +} From 2a1f0f812b54f64556b89d6d70f167fdfae73eb0 Mon Sep 17 00:00:00 2001 From: Myles Date: Tue, 4 Oct 2016 00:26:27 +0100 Subject: [PATCH 76/76] Move Sponge to API 5, add legacy support module --- pom.xml | 1 + sponge-legacy/pom.xml | 73 +++++++++ .../protocol1_9to1_8/ItemGrabber.java | 8 + .../sponge4/Sponge4ArmorListener.java | 141 ++++++++++++++++++ .../sponge4/Sponge4ItemGrabber.java | 12 ++ sponge/pom.xml | 12 +- .../sponge/commands/SpongeCommandHandler.java | 12 +- .../protocol1_9to1_8/HandItemCache.java | 14 +- .../Sponge5ArmorListener.java} | 15 +- .../sponge5/Sponge5ItemGrabber.java | 13 ++ .../sponge/platform/SpongeViaLoader.java | 14 +- 11 files changed, 300 insertions(+), 15 deletions(-) create mode 100644 sponge-legacy/pom.xml create mode 100644 sponge-legacy/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/ItemGrabber.java create mode 100644 sponge-legacy/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/sponge4/Sponge4ArmorListener.java create mode 100644 sponge-legacy/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/sponge4/Sponge4ItemGrabber.java rename sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/{ArmorListener.java => sponge5/Sponge5ArmorListener.java} (88%) create mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/sponge5/Sponge5ItemGrabber.java diff --git a/pom.xml b/pom.xml index c631f22ad..60a19b8c5 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,7 @@ bungee sponge jar + sponge-legacy diff --git a/sponge-legacy/pom.xml b/sponge-legacy/pom.xml new file mode 100644 index 000000000..e0063d252 --- /dev/null +++ b/sponge-legacy/pom.xml @@ -0,0 +1,73 @@ + + + + viaversion-parent + us.myles + 1.0.0-ALPHA-modules + + 4.0.0 + + viaversion-sponge-legacy + jar + + + 1.8 + 1.8 + + + + + sponge + http://repo.spongepowered.org/maven + + + + + + + . + true + src/main/resources/ + + * + + + + + + org.codehaus.mojo + templating-maven-plugin + 1.0.0 + + + filter-src + + filter-sources + + + + + + + + + + + us.myles + viaversion-common + ${project.parent.version} + provided + + + + + org.spongepowered + spongeapi + 4.0.0-SNAPSHOT + provided + + + + \ No newline at end of file diff --git a/sponge-legacy/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/ItemGrabber.java b/sponge-legacy/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/ItemGrabber.java new file mode 100644 index 000000000..8f1069caa --- /dev/null +++ b/sponge-legacy/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/ItemGrabber.java @@ -0,0 +1,8 @@ +package us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8; + +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.item.inventory.ItemStack; + +public interface ItemGrabber { + public ItemStack getItem(Player player); +} diff --git a/sponge-legacy/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/sponge4/Sponge4ArmorListener.java b/sponge-legacy/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/sponge4/Sponge4ArmorListener.java new file mode 100644 index 000000000..5b542bdb4 --- /dev/null +++ b/sponge-legacy/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/sponge4/Sponge4ArmorListener.java @@ -0,0 +1,141 @@ +package us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.sponge4; + +import org.spongepowered.api.Sponge; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.action.InteractEvent; +import org.spongepowered.api.event.entity.DisplaceEntityEvent; +import org.spongepowered.api.event.entity.living.humanoid.player.RespawnPlayerEvent; +import org.spongepowered.api.event.filter.cause.Root; +import org.spongepowered.api.event.item.inventory.ClickInventoryEvent; +import org.spongepowered.api.event.network.ClientConnectionEvent; +import org.spongepowered.api.item.inventory.ItemStack; +import org.spongepowered.api.item.inventory.transaction.SlotTransaction; +import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.ViaListener; +import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.ArmorType; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; + +import java.lang.reflect.Field; +import java.util.Optional; +import java.util.UUID; + +public class Sponge4ArmorListener extends ViaListener{ + private static Field entityIdField; + + private static final UUID ARMOR_ATTRIBUTE = UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150"); + + public Sponge4ArmorListener() { + super(Protocol1_9TO1_8.class); + } + + // + public void sendArmorUpdate(Player player) { + // Ensure that the player is on our pipe + if (!isOnPipe(player.getUniqueId())) return; + + + int armor = 0; + armor += calculate(player.getHelmet()); + armor += calculate(player.getChestplate()); + armor += calculate(player.getLeggings()); + armor += calculate(player.getBoots()); + + PacketWrapper wrapper = new PacketWrapper(0x4B, null, getUserConnection(player.getUniqueId())); + try { + wrapper.write(Type.VAR_INT, getEntityId(player)); // Player ID + wrapper.write(Type.INT, 1); // only 1 property + wrapper.write(Type.STRING, "generic.armor"); + wrapper.write(Type.DOUBLE, 0D); //default 0 armor + wrapper.write(Type.VAR_INT, 1); // 1 modifier + wrapper.write(Type.UUID, ARMOR_ATTRIBUTE); // armor modifier uuid + wrapper.write(Type.DOUBLE, (double) armor); // the modifier value + wrapper.write(Type.BYTE, (byte) 0);// the modifier operation, 0 is add number + + wrapper.send(Protocol1_9TO1_8.class); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private int calculate(Optional itemStack) { + if (itemStack.isPresent()) + return ArmorType.findByType(itemStack.get().getItem().getType().getId()).getArmorPoints(); + + return 0; + } + + @Listener + public void onInventoryClick(ClickInventoryEvent e, @Root Player player) { + for (SlotTransaction transaction : e.getTransactions()) { + if (ArmorType.isArmor(transaction.getFinal().getType().getId()) || + ArmorType.isArmor(e.getCursorTransaction().getFinal().getType().getId())) { + sendDelayedArmorUpdate(player); + break; + } + } + } + + @Listener + public void onInteract(InteractEvent event, @Root Player player) { + if (player.getItemInHand().isPresent()) { + if (ArmorType.isArmor(player.getItemInHand().get().getItem().getId())) + sendDelayedArmorUpdate(player); + } + } + + @Listener + public void onJoin(ClientConnectionEvent.Join e) { + sendArmorUpdate(e.getTargetEntity()); + } + + @Listener + public void onRespawn(RespawnPlayerEvent e) { + sendDelayedArmorUpdate(e.getTargetEntity()); + } + + @Listener + public void onWorldChange(DisplaceEntityEvent.Teleport e) { + if (!(e.getTargetEntity() instanceof Player)) return; + if (!e.getFromTransform().getExtent().getUniqueId().equals(e.getToTransform().getExtent().getUniqueId())) { + sendArmorUpdate((Player) e.getTargetEntity()); + } + } + + public void sendDelayedArmorUpdate(final Player player) { + if (!isOnPipe(player.getUniqueId())) return; // Don't start a task if the player is not on the pipe + Via.getPlatform().runSync(new Runnable() { + @Override + public void run() { + sendArmorUpdate(player); + } + }); + } + + @Override + public void register() { + if (isRegistered()) return; + + Sponge.getEventManager().registerListeners(Via.getPlatform(), this); + setRegistered(true); + } + + protected int getEntityId(Player p) { + try { + if (entityIdField == null) { + entityIdField = p.getClass().getSuperclass().getSuperclass().getSuperclass().getDeclaredField("field_145783_c"); + entityIdField.setAccessible(true); + } + + return entityIdField.getInt(p); + } catch (Exception e) { + Via.getPlatform().getLogger().severe("Could not get the entity id, please report this on our Github"); + e.printStackTrace(); + } + + Via.getPlatform().getLogger().severe("Could not get the entity id, please report this on our Github"); + return -1; + } +} diff --git a/sponge-legacy/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/sponge4/Sponge4ItemGrabber.java b/sponge-legacy/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/sponge4/Sponge4ItemGrabber.java new file mode 100644 index 000000000..17da6eb35 --- /dev/null +++ b/sponge-legacy/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/sponge4/Sponge4ItemGrabber.java @@ -0,0 +1,12 @@ +package us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.sponge4; + +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.item.inventory.ItemStack; +import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.ItemGrabber; + +public class Sponge4ItemGrabber implements ItemGrabber { + @Override + public ItemStack getItem(Player player) { + return player.getItemInHand().orElse(null); + } +} diff --git a/sponge/pom.xml b/sponge/pom.xml index fb41d0443..f4a3ec61d 100644 --- a/sponge/pom.xml +++ b/sponge/pom.xml @@ -60,13 +60,21 @@ provided - + org.spongepowered spongeapi - LATEST + 5.0.0-SNAPSHOT provided + + + + us.myles + viaversion-sponge-legacy + ${project.parent.version} + compile + \ No newline at end of file diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/commands/SpongeCommandHandler.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/commands/SpongeCommandHandler.java index a28bcef55..109c56601 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/commands/SpongeCommandHandler.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/commands/SpongeCommandHandler.java @@ -5,8 +5,11 @@ import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandResult; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.text.Text; +import org.spongepowered.api.world.Location; +import org.spongepowered.api.world.World; import us.myles.ViaVersion.commands.ViaCommandHandler; +import javax.annotation.Nullable; import java.util.List; import java.util.Optional; @@ -19,7 +22,10 @@ public class SpongeCommandHandler extends ViaCommandHandler implements CommandCa return CommandResult.success(); } - @Override + public List getSuggestions(CommandSource commandSource, String s, @Nullable Location location) throws CommandException { + return getSuggestions(commandSource, s); + } + public List getSuggestions(CommandSource source, String arguments) throws CommandException { String[] args = arguments.length() > 0 ? arguments.split(" ") : new String[0]; return onTabComplete(new SpongeCommandSender(source), args); @@ -31,12 +37,12 @@ public class SpongeCommandHandler extends ViaCommandHandler implements CommandCa } @Override - public Optional getShortDescription(CommandSource source) { + public Optional getShortDescription(CommandSource source) { return Optional.of(Text.of("Shows ViaVersion Version and more.")); } @Override - public Optional getHelp(CommandSource source) { + public Optional getHelp(CommandSource source) { return Optional.empty(); } diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/HandItemCache.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/HandItemCache.java index 2a60aadcc..e2d61fcaa 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/HandItemCache.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/HandItemCache.java @@ -4,6 +4,8 @@ import org.spongepowered.api.Sponge; import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.item.inventory.ItemStack; import us.myles.ViaVersion.api.minecraft.item.Item; +import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.sponge4.Sponge4ItemGrabber; +import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.sponge5.Sponge5ItemGrabber; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; @@ -18,6 +20,16 @@ public class HandItemCache implements Runnable { private static ConcurrentHashMap handCache = new ConcurrentHashMap<>(); private static Field GET_DAMAGE; private static Method GET_ID; + private static ItemGrabber grabber; + + static { + try { + Class.forName("org.spongepowered.api.event.entity.DisplaceEntityEvent"); + grabber = new Sponge4ItemGrabber(); + } catch (ClassNotFoundException e) { + grabber = new Sponge5ItemGrabber(); + } + } public static Item getHandItem(UUID player) { if (!handCache.containsKey(player)) @@ -30,7 +42,7 @@ public class HandItemCache implements Runnable { List players = new ArrayList<>(handCache.keySet()); for (Player p : Sponge.getServer().getOnlinePlayers()) { - handCache.put(p.getUniqueId(), convert(p.getItemInHand().orElse(null))); + handCache.put(p.getUniqueId(), convert(grabber.getItem(p))); players.remove(p.getUniqueId()); } // Remove offline players diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/ArmorListener.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/sponge5/Sponge5ArmorListener.java similarity index 88% rename from sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/ArmorListener.java rename to sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/sponge5/Sponge5ArmorListener.java index 2b6460f99..6052e86b5 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/ArmorListener.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/sponge5/Sponge5ArmorListener.java @@ -1,9 +1,10 @@ -package us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8; +package us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.sponge5; +import org.spongepowered.api.data.type.HandTypes; import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.action.InteractEvent; -import org.spongepowered.api.event.entity.DisplaceEntityEvent; +import org.spongepowered.api.event.entity.MoveEntityEvent; import org.spongepowered.api.event.entity.living.humanoid.player.RespawnPlayerEvent; import org.spongepowered.api.event.filter.cause.Root; import org.spongepowered.api.event.item.inventory.ClickInventoryEvent; @@ -21,10 +22,10 @@ import us.myles.ViaVersion.sponge.listeners.ViaSpongeListener; import java.util.Optional; import java.util.UUID; -public class ArmorListener extends ViaSpongeListener { +public class Sponge5ArmorListener extends ViaSpongeListener { private static final UUID ARMOR_ATTRIBUTE = UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150"); - public ArmorListener(SpongePlugin plugin) { + public Sponge5ArmorListener(SpongePlugin plugin) { super(plugin, Protocol1_9TO1_8.class); } @@ -77,8 +78,8 @@ public class ArmorListener extends ViaSpongeListener { @Listener public void onInteract(InteractEvent event, @Root Player player) { - if (player.getItemInHand().isPresent()) { - if (ArmorType.isArmor(player.getItemInHand().get().getItem().getId())) + if (player.getItemInHand(HandTypes.MAIN_HAND).isPresent()) { + if (ArmorType.isArmor(player.getItemInHand(HandTypes.MAIN_HAND).get().getItem().getId())) sendDelayedArmorUpdate(player); } } @@ -94,7 +95,7 @@ public class ArmorListener extends ViaSpongeListener { } @Listener - public void onWorldChange(DisplaceEntityEvent.Teleport e) { + public void onWorldChange(MoveEntityEvent.Teleport e) { if (!(e.getTargetEntity() instanceof Player)) return; if (!e.getFromTransform().getExtent().getUniqueId().equals(e.getToTransform().getExtent().getUniqueId())) { sendArmorUpdate((Player) e.getTargetEntity()); diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/sponge5/Sponge5ItemGrabber.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/sponge5/Sponge5ItemGrabber.java new file mode 100644 index 000000000..f9128ec86 --- /dev/null +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/protocol1_9to1_8/sponge5/Sponge5ItemGrabber.java @@ -0,0 +1,13 @@ +package us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.sponge5; + +import org.spongepowered.api.data.type.HandTypes; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.item.inventory.ItemStack; +import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.ItemGrabber; + +public class Sponge5ItemGrabber implements ItemGrabber { + @Override + public ItemStack getItem(Player player) { + return player.getItemInHand(HandTypes.MAIN_HAND).orElse(null); + } +} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaLoader.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaLoader.java index 98f1d39d5..ebe1c398f 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaLoader.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaLoader.java @@ -13,7 +13,12 @@ import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.HandItemProvider import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; import us.myles.ViaVersion.sponge.listeners.ClientLeaveListener; import us.myles.ViaVersion.sponge.listeners.UpdateListener; -import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.*; +import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.BlockListener; +import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.CommandBlockListener; +import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.DeathListener; +import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.HandItemCache; +import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.sponge4.Sponge4ArmorListener; +import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.sponge5.Sponge5ArmorListener; import us.myles.ViaVersion.sponge.providers.SpongeViaBulkChunkTranslator; import us.myles.ViaVersion.sponge.providers.SpongeViaMovementTransmitter; @@ -28,7 +33,12 @@ public class SpongeViaLoader implements ViaPlatformLoader { /* Base Protocol */ Sponge.getEventManager().registerListeners(plugin, new ClientLeaveListener()); /* 1.9 client to 1.8 server */ - new ArmorListener(plugin).register(); + try { + Class.forName("org.spongepowered.api.event.entity.DisplaceEntityEvent"); + new Sponge4ArmorListener().register(); + } catch (ClassNotFoundException e) { + new Sponge5ArmorListener(plugin).register(); + } new CommandBlockListener(plugin).register(); new DeathListener(plugin).register(); new BlockListener(plugin).register();