From 71c61e33fda32dc6030aab0bce57d1023e0c0da2 Mon Sep 17 00:00:00 2001 From: lax1dude Date: Sat, 17 May 2025 14:05:33 -0700 Subject: [PATCH] Delete the legacy backend --- README.md | 53 +- README_EAGLERXBUKKITAPI.md | 87 - README_EAGLERXBUNGEE.md | 209 -- README_EAGLERXVELOCITY.md | 206 -- gateway/EaglercraftXBukkitAPI/.gitignore | 10 - .../EaglercraftXBukkitAPI-Latest.jar | Bin 118008 -> 0 bytes gateway/EaglercraftXBukkitAPI/build.gradle | 41 - .../gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - gateway/EaglercraftXBukkitAPI/gradlew | 234 -- gateway/EaglercraftXBukkitAPI/gradlew.bat | 89 - gateway/EaglercraftXBukkitAPI/settings.gradle | 2 - .../EaglerXBukkitAPIListener.java | 71 - .../EaglerXBukkitAPIPlugin.java | 120 - .../api/ClientBrandUUIDs.java | 38 - .../api/EaglerRPCException.java | 36 - .../api/EaglerRPCInitException.java | 46 - .../api/EnumSubscribeEvents.java | 40 - .../api/IEaglerRPCCloseHandler.java | 23 - .../api/IEaglerRPCEventHandler.java | 25 - .../api/IEaglerRPCFuture.java | 48 - .../api/IEaglerXBukkitAPI.java | 244 -- .../api/ImageDataLoader.java | 97 - .../api/event/EventToggledVoice.java | 40 - .../api/event/EventWebViewMessage.java | 60 - .../api/event/EventWebViewOpenClose.java | 36 - .../api/event/IEaglerRPCEvent.java | 25 - .../response/EaglerRPCResponseException.java | 38 - .../response/EaglerRPCTimeoutException.java | 30 - .../api/response/IEaglerRPCResponse.java | 27 - .../api/response/ResponseBytes.java | 43 - .../api/response/ResponseCookie.java | 45 - .../api/response/ResponseString.java | 43 - .../api/response/ResponseUUID.java | 45 - .../api/response/ResponseVoiceStatus.java | 47 - .../api/response/ResponseWebViewStatus.java | 49 - .../impl/EaglerRPCFutureImpl.java | 56 - .../impl/EaglerXBukkitImpl.java | 789 ----- .../impl/HelloPacketFactory.java | 42 - .../bukkit_rpc_helper/impl/PlayerDataObj.java | 200 -- .../impl/ReusableByteArrayInputStream.java | 81 - .../impl/ReusableByteArrayOutputStream.java | 82 - .../impl/SameThreadExecutor.java | 41 - .../src/main/resources/plugin.yml | 6 - gateway/EaglercraftXBungee/.gitignore | 11 - .../EaglerXBungee-Latest.jar | Bin 599216 -> 0 bytes gateway/EaglercraftXBungee/build.gradle | 43 - gateway/EaglercraftXBungee/deps/readme.txt | 3 - .../gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - gateway/EaglercraftXBungee/gradlew | 234 -- gateway/EaglercraftXBungee/gradlew.bat | 89 - gateway/EaglercraftXBungee/readme.txt | 9 - gateway/EaglercraftXBungee/settings.gradle | 2 - .../gateway_bungeecord/EaglerXBungee.java | 387 -- .../api/EaglerXBungeeAPIHelper.java | 1145 ------ .../api/EnumVoiceState.java | 23 - .../api/EnumWebViewState.java | 24 - .../api/NotificationBadgeBuilder.java | 363 -- .../event/EaglercraftClientBrandEvent.java | 93 - .../EaglercraftHandleAuthCookieEvent.java | 207 -- .../EaglercraftHandleAuthPasswordEvent.java | 214 -- .../event/EaglercraftIsAuthRequiredEvent.java | 168 - .../api/event/EaglercraftMOTDEvent.java | 49 - .../event/EaglercraftRegisterCapeEvent.java | 74 - .../event/EaglercraftRegisterSkinEvent.java | 104 - .../EaglercraftRevokeSessionQueryEvent.java | 92 - .../EaglercraftVoiceStatusChangeEvent.java | 65 - .../event/EaglercraftWebSocketOpenEvent.java | 71 - .../event/EaglercraftWebViewChannelEvent.java | 57 - .../event/EaglercraftWebViewMessageEvent.java | 119 - .../api/query/EaglerQueryHandler.java | 32 - .../api/query/EaglerQuerySimpleHandler.java | 62 - .../api/query/MOTDConnection.java | 58 - .../auth/AuthLoadingCache.java | 139 - .../auth/DefaultAuthSystem.java | 682 ---- .../auth/GeneralDigest.java | 129 - .../gateway_bungeecord/auth/HashUtils.java | 33 - .../gateway_bungeecord/auth/SHA1Digest.java | 247 -- .../gateway_bungeecord/auth/SHA256Digest.java | 254 -- .../command/CommandClientBrand.java | 94 - .../command/CommandConfirmCode.java | 51 - .../command/CommandDomain.java | 58 - .../command/CommandEaglerPurge.java | 83 - .../command/CommandEaglerRegister.java | 76 - .../command/CommandRatelimit.java | 89 - .../config/EaglerAuthConfig.java | 166 - .../config/EaglerBungeeConfig.java | 566 --- .../config/EaglerListenerConfig.java | 360 -- .../config/EaglerPauseMenuConfig.java | 252 -- .../config/EaglerRateLimiter.java | 197 -- .../config/EaglerUpdateConfig.java | 85 - .../config/MOTDCacheConfiguration.java | 36 - .../config/RateLimitStatus.java | 21 - .../config/ServerIconLoader.java | 82 - .../config/ServerInfoTemplateParser.java | 251 -- .../config/TestOutputStream.java | 32 - .../VanillaDefaultSkinProfileLoader.java | 158 - .../handlers/EaglerPacketEventListener.java | 209 -- .../handlers/EaglerPluginEventListener.java | 37 - .../repackage/lang3/StrBuilder.java | 3141 ----------------- .../repackage/lang3/StrMatcher.java | 439 --- .../repackage/lang3/StrTokenizer.java | 1126 ------ .../server/EaglerChannelWrapper.java | 52 - .../server/EaglerConnectionInstance.java | 46 - .../server/EaglerInitialHandler.java | 628 ---- .../server/EaglerMinecraftByteBufEncoder.java | 33 - .../server/EaglerMinecraftDecoder.java | 135 - .../server/EaglerMinecraftEncoder.java | 79 - .../server/EaglerMinecraftWrappedEncoder.java | 33 - .../server/EaglerPipeline.java | 324 -- .../server/EaglerProtocolAccessProxy.java | 65 - .../server/EaglerUpdateSvc.java | 304 -- .../server/HandshakePacketTypes.java | 50 - .../server/HttpHandshakeHandler.java | 239 -- .../server/HttpServerQueryHandler.java | 254 -- .../server/HttpWebSocketHandler.java | 1448 -------- .../BackendRPCSessionHandler.java | 320 -- .../EnumSubscribedEvent.java | 23 - .../ServerV1RPCProtocolHandler.java | 436 --- .../GameProtocolMessageController.java | 299 -- .../protocol/ServerV3MessageHandler.java | 89 - .../protocol/ServerV4MessageHandler.java | 183 - .../server/query/MOTDQueryHandler.java | 230 -- .../server/query/QueryManager.java | 103 - .../query/RevokeSessionQueryHandler.java | 75 - .../server/query/VersionQueryHandler.java | 52 - .../server/web/HttpContentType.java | 50 - .../server/web/HttpMemoryCache.java | 87 - .../server/web/HttpWebServer.java | 278 -- .../shit/CompatWarning.java | 65 - .../gateway_bungeecord/shit/MainClass.java | 42 - .../skins/AsyncSkinProvider.java | 456 --- .../skins/BinaryHttpClient.java | 262 -- .../gateway_bungeecord/skins/CapePackets.java | 65 - .../skins/CapeServiceOffline.java | 103 - .../skins/ICacheProvider.java | 91 - .../skins/ISkinService.java | 52 - .../skins/JDBCCacheProvider.java | 409 --- .../skins/SimpleRateLimiter.java | 50 - .../gateway_bungeecord/skins/SkinPackets.java | 130 - .../skins/SkinRescaler.java | 77 - .../gateway_bungeecord/skins/SkinService.java | 1450 -------- .../skins/SkinServiceOffline.java | 109 - .../sqlite/EaglerDrivers.java | 122 - .../gateway_bungeecord/voice/ExpiringSet.java | 87 - .../voice/VoiceServerImpl.java | 350 -- .../voice/VoiceService.java | 147 - .../config/default_authservice.yml | 17 - .../config/default_http_mime_types.json | 180 - .../config/default_ice_servers.yml | 20 - .../config/default_listeners.yml | 73 - .../config/default_message_api_example.html | 68 - .../config/default_message_api_v1.js | 63 - .../config/default_pause_menu.yml | 43 - .../default_pause_menu_server_info.html | 30 - .../config/default_pause_menu_test_image.png | Bin 1258 -> 0 bytes .../config/default_settings.yml | 28 - .../config/default_updates.yml | 9 - .../src/main/resources/plugin.yml | 5 - gateway/EaglercraftXVelocity/.gitignore | 11 - .../EaglerXVelocity-Latest.jar | Bin 611493 -> 0 bytes gateway/EaglercraftXVelocity/build.gradle | 43 - gateway/EaglercraftXVelocity/deps/readme.txt | 3 - .../gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - gateway/EaglercraftXVelocity/gradlew | 234 -- gateway/EaglercraftXVelocity/gradlew.bat | 89 - gateway/EaglercraftXVelocity/readme.txt | 11 - gateway/EaglercraftXVelocity/settings.gradle | 2 - .../gateway_velocity/EaglerXVelocity.java | 456 --- .../EaglerXVelocityVersion.java | 31 - .../api/EaglerXVelocityAPIHelper.java | 1068 ------ .../gateway_velocity/api/EnumVoiceState.java | 23 - .../api/EnumWebViewState.java | 24 - .../api/JSONLegacySerializer.java | 42 - .../api/NotificationBadgeBuilder.java | 361 -- .../event/EaglercraftClientBrandEvent.java | 88 - .../EaglercraftHandleAuthCookieEvent.java | 206 -- .../EaglercraftHandleAuthPasswordEvent.java | 213 -- .../event/EaglercraftIsAuthRequiredEvent.java | 167 - .../api/event/EaglercraftMOTDEvent.java | 48 - .../event/EaglercraftRegisterCapeEvent.java | 73 - .../event/EaglercraftRegisterSkinEvent.java | 103 - .../EaglercraftRevokeSessionQueryEvent.java | 91 - .../EaglercraftVoiceStatusChangeEvent.java | 65 - .../event/EaglercraftWebSocketOpenEvent.java | 67 - .../event/EaglercraftWebViewChannelEvent.java | 57 - .../event/EaglercraftWebViewMessageEvent.java | 120 - .../api/query/EaglerQueryHandler.java | 32 - .../api/query/EaglerQuerySimpleHandler.java | 62 - .../api/query/MOTDConnection.java | 58 - .../auth/AuthLoadingCache.java | 139 - .../auth/DefaultAuthSystem.java | 680 ---- .../gateway_velocity/auth/GeneralDigest.java | 129 - .../gateway_velocity/auth/HashUtils.java | 33 - .../gateway_velocity/auth/SHA1Digest.java | 247 -- .../gateway_velocity/auth/SHA256Digest.java | 254 -- .../command/CommandClientBrand.java | 83 - .../command/CommandConfirmCode.java | 51 - .../command/CommandDomain.java | 60 - .../command/CommandEaglerPurge.java | 71 - .../command/CommandEaglerRegister.java | 68 - .../command/CommandRatelimit.java | 85 - .../command/EaglerCommand.java | 57 - .../config/EaglerAuthConfig.java | 166 - .../config/EaglerListenerConfig.java | 335 -- .../config/EaglerPauseMenuConfig.java | 252 -- .../config/EaglerRateLimiter.java | 197 -- .../config/EaglerUpdateConfig.java | 85 - .../config/EaglerVelocityConfig.java | 566 --- .../config/MOTDCacheConfiguration.java | 36 - .../config/RateLimitStatus.java | 21 - .../config/ServerIconLoader.java | 82 - .../config/ServerInfoTemplateParser.java | 259 -- .../config/TestOutputStream.java | 32 - .../VanillaDefaultSkinProfileLoader.java | 157 - .../config/bungee/ChatColor.java | 52 - .../config/bungee/Configuration.java | 376 -- .../config/bungee/ConfigurationProvider.java | 86 - .../config/bungee/JsonConfiguration.java | 128 - .../config/bungee/YamlConfiguration.java | 146 - .../handlers/EaglerPacketEventListener.java | 229 -- .../repackage/lang3/StrBuilder.java | 3136 ---------------- .../repackage/lang3/StrMatcher.java | 437 --- .../repackage/lang3/StrTokenizer.java | 1124 ------ .../server/EaglerConnectionInstance.java | 48 - .../server/EaglerMinecraftDecoder.java | 50 - .../server/EaglerMinecraftEncoder.java | 31 - .../server/EaglerPipeline.java | 268 -- .../server/EaglerPlayerData.java | 466 --- .../server/EaglerUpdateSvc.java | 301 -- .../server/HandshakePacketTypes.java | 50 - .../server/HttpHandshakeHandler.java | 234 -- .../server/HttpServerQueryHandler.java | 254 -- .../server/HttpWebSocketHandler.java | 1643 --------- .../BackendRPCSessionHandler.java | 330 -- .../EnumSubscribedEvent.java | 23 - .../ServerV1RPCProtocolHandler.java | 440 --- .../GameProtocolMessageController.java | 310 -- .../protocol/ServerV3MessageHandler.java | 88 - .../protocol/ServerV4MessageHandler.java | 181 - .../server/query/MOTDQueryHandler.java | 229 -- .../server/query/QueryManager.java | 102 - .../query/RevokeSessionQueryHandler.java | 75 - .../server/query/VersionQueryHandler.java | 52 - .../server/web/HttpContentType.java | 50 - .../server/web/HttpMemoryCache.java | 87 - .../server/web/HttpWebServer.java | 279 -- .../gateway_velocity/shit/CompatWarning.java | 51 - .../gateway_velocity/shit/MainClass.java | 42 - .../skins/AsyncSkinProvider.java | 453 --- .../plugin/gateway_velocity/skins/Base64.java | 857 ----- .../gateway_velocity/skins/BaseNCodec.java | 694 ---- .../skins/BinaryHttpClient.java | 260 -- .../gateway_velocity/skins/CapePackets.java | 65 - .../skins/CapeServiceOffline.java | 101 - .../skins/ICacheProvider.java | 91 - .../gateway_velocity/skins/ISkinService.java | 51 - .../skins/JDBCCacheProvider.java | 408 --- .../skins/SimpleRateLimiter.java | 50 - .../gateway_velocity/skins/SkinPackets.java | 130 - .../gateway_velocity/skins/SkinRescaler.java | 77 - .../gateway_velocity/skins/SkinService.java | 1436 -------- .../skins/SkinServiceOffline.java | 104 - .../sqlite/EaglerDrivers.java | 134 - .../gateway_velocity/voice/ExpiringSet.java | 87 - .../voice/VoiceServerImpl.java | 345 -- .../gateway_velocity/voice/VoiceService.java | 148 - .../config/default_authservice.yml | 17 - .../config/default_http_mime_types.json | 180 - .../config/default_ice_servers.yml | 20 - .../config/default_listeners.yml | 70 - .../config/default_message_api_example.html | 68 - .../config/default_message_api_v1.js | 63 - .../config/default_pause_menu.yml | 43 - .../default_pause_menu_server_info.html | 30 - .../config/default_pause_menu_test_image.png | Bin 1258 -> 0 bytes .../config/default_settings.yml | 28 - .../config/default_updates.yml | 9 - .../src/main/resources/velocity-plugin.json | 1 - ...Java-WebSocket-1.5.1-with-dependencies.jar | Bin 240423 -> 0 bytes .../PlaceholderServer-Latest.jar | Bin 252235 -> 0 bytes .../placeholder_server/DummyConnection.java | 112 - .../placeholder_server/PlaceholderServer.java | 121 - .../PlaceholderServerConfig.java | 180 - .../placeholder_server/ServerIconLoader.java | 79 - .../src/main/resources/config_default.json | 13 - .../main/resources/server-icon_default.png | Bin 402 -> 0 bytes .../EaglerBackendRPCProtocol.java | 151 - .../pkt/EaglerBackendRPCHandler.java | 144 - .../pkt/EaglerBackendRPCPacket.java | 73 - .../pkt/WrongRPCPacketException.java | 25 - .../pkt/client/CPacketRPCDisabled.java | 49 - .../pkt/client/CPacketRPCEnabled.java | 63 - .../pkt/client/CPacketRPCNotifBadgeHide.java | 59 - .../pkt/client/CPacketRPCNotifBadgeShow.java | 168 - .../client/CPacketRPCNotifIconRegister.java | 86 - .../client/CPacketRPCNotifIconRelease.java | 87 - .../pkt/client/CPacketRPCRedirectPlayer.java | 65 - .../client/CPacketRPCRequestPlayerInfo.java | 75 - .../client/CPacketRPCResetPlayerMulti.java | 69 - .../pkt/client/CPacketRPCSendRawMessage.java | 73 - .../client/CPacketRPCSendWebViewMessage.java | 87 - .../client/CPacketRPCSetPauseMenuCustom.java | 218 -- .../pkt/client/CPacketRPCSetPlayerCape.java | 66 - .../pkt/client/CPacketRPCSetPlayerCookie.java | 84 - .../pkt/client/CPacketRPCSetPlayerFNAWEn.java | 61 - .../pkt/client/CPacketRPCSetPlayerSkin.java | 66 - .../pkt/client/CPacketRPCSubscribeEvents.java | 61 - .../pkt/server/SPacketRPCEnabledFailure.java | 63 - .../pkt/server/SPacketRPCEnabledSuccess.java | 61 - .../server/SPacketRPCEventToggledVoice.java | 65 - .../server/SPacketRPCEventWebViewMessage.java | 87 - .../SPacketRPCEventWebViewOpenClose.java | 72 - .../server/SPacketRPCResponseTypeBytes.java | 66 - .../server/SPacketRPCResponseTypeCookie.java | 84 - .../server/SPacketRPCResponseTypeError.java | 61 - .../server/SPacketRPCResponseTypeNull.java | 57 - .../server/SPacketRPCResponseTypeString.java | 69 - .../server/SPacketRPCResponseTypeUUID.java | 63 - .../SPacketRPCResponseTypeVoiceStatus.java | 65 - .../SPacketRPCResponseTypeWebViewStatus.java | 82 - .../util/PacketImageData.java | 79 - .../util/SkinPacketHelper.java | 215 -- .../util/NotificationBadgeBuilder.java | 373 -- gateway_version | 1 - gateway_version_velocity | 1 - 328 files changed, 1 insertion(+), 56280 deletions(-) delete mode 100644 README_EAGLERXBUKKITAPI.md delete mode 100644 README_EAGLERXBUNGEE.md delete mode 100644 README_EAGLERXVELOCITY.md delete mode 100644 gateway/EaglercraftXBukkitAPI/.gitignore delete mode 100644 gateway/EaglercraftXBukkitAPI/EaglercraftXBukkitAPI-Latest.jar delete mode 100644 gateway/EaglercraftXBukkitAPI/build.gradle delete mode 100644 gateway/EaglercraftXBukkitAPI/gradle/wrapper/gradle-wrapper.jar delete mode 100644 gateway/EaglercraftXBukkitAPI/gradle/wrapper/gradle-wrapper.properties delete mode 100644 gateway/EaglercraftXBukkitAPI/gradlew delete mode 100644 gateway/EaglercraftXBukkitAPI/gradlew.bat delete mode 100644 gateway/EaglercraftXBukkitAPI/settings.gradle delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/EaglerXBukkitAPIListener.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/EaglerXBukkitAPIPlugin.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/ClientBrandUUIDs.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/EaglerRPCException.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/EaglerRPCInitException.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/EnumSubscribeEvents.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/IEaglerRPCCloseHandler.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/IEaglerRPCEventHandler.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/IEaglerRPCFuture.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/IEaglerXBukkitAPI.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/ImageDataLoader.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/event/EventToggledVoice.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/event/EventWebViewMessage.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/event/EventWebViewOpenClose.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/event/IEaglerRPCEvent.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/EaglerRPCResponseException.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/EaglerRPCTimeoutException.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/IEaglerRPCResponse.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseBytes.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseCookie.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseString.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseUUID.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseVoiceStatus.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseWebViewStatus.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/EaglerRPCFutureImpl.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/EaglerXBukkitImpl.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/HelloPacketFactory.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/PlayerDataObj.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/ReusableByteArrayInputStream.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/ReusableByteArrayOutputStream.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/SameThreadExecutor.java delete mode 100644 gateway/EaglercraftXBukkitAPI/src/main/resources/plugin.yml delete mode 100644 gateway/EaglercraftXBungee/.gitignore delete mode 100644 gateway/EaglercraftXBungee/EaglerXBungee-Latest.jar delete mode 100644 gateway/EaglercraftXBungee/build.gradle delete mode 100644 gateway/EaglercraftXBungee/deps/readme.txt delete mode 100644 gateway/EaglercraftXBungee/gradle/wrapper/gradle-wrapper.jar delete mode 100644 gateway/EaglercraftXBungee/gradle/wrapper/gradle-wrapper.properties delete mode 100644 gateway/EaglercraftXBungee/gradlew delete mode 100644 gateway/EaglercraftXBungee/gradlew.bat delete mode 100644 gateway/EaglercraftXBungee/readme.txt delete mode 100644 gateway/EaglercraftXBungee/settings.gradle delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/EaglerXBungee.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/EaglerXBungeeAPIHelper.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/EnumVoiceState.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/EnumWebViewState.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/NotificationBadgeBuilder.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/event/EaglercraftClientBrandEvent.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/event/EaglercraftHandleAuthCookieEvent.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/event/EaglercraftHandleAuthPasswordEvent.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/event/EaglercraftIsAuthRequiredEvent.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/event/EaglercraftMOTDEvent.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/event/EaglercraftRegisterCapeEvent.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/event/EaglercraftRegisterSkinEvent.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/event/EaglercraftRevokeSessionQueryEvent.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/event/EaglercraftVoiceStatusChangeEvent.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/event/EaglercraftWebSocketOpenEvent.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/event/EaglercraftWebViewChannelEvent.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/event/EaglercraftWebViewMessageEvent.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/query/EaglerQueryHandler.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/query/EaglerQuerySimpleHandler.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/query/MOTDConnection.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/auth/AuthLoadingCache.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/auth/DefaultAuthSystem.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/auth/GeneralDigest.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/auth/HashUtils.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/auth/SHA1Digest.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/auth/SHA256Digest.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/command/CommandClientBrand.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/command/CommandConfirmCode.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/command/CommandDomain.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/command/CommandEaglerPurge.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/command/CommandEaglerRegister.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/command/CommandRatelimit.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/EaglerAuthConfig.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/EaglerBungeeConfig.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/EaglerListenerConfig.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/EaglerPauseMenuConfig.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/EaglerRateLimiter.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/EaglerUpdateConfig.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/MOTDCacheConfiguration.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/RateLimitStatus.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/ServerIconLoader.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/ServerInfoTemplateParser.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/TestOutputStream.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/VanillaDefaultSkinProfileLoader.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/handlers/EaglerPacketEventListener.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/handlers/EaglerPluginEventListener.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/repackage/lang3/StrBuilder.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/repackage/lang3/StrMatcher.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/repackage/lang3/StrTokenizer.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/EaglerChannelWrapper.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/EaglerConnectionInstance.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/EaglerInitialHandler.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/EaglerMinecraftByteBufEncoder.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/EaglerMinecraftDecoder.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/EaglerMinecraftEncoder.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/EaglerMinecraftWrappedEncoder.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/EaglerPipeline.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/EaglerProtocolAccessProxy.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/EaglerUpdateSvc.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/HandshakePacketTypes.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/HttpHandshakeHandler.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/HttpServerQueryHandler.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/HttpWebSocketHandler.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/backend_rpc_protocol/BackendRPCSessionHandler.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/backend_rpc_protocol/EnumSubscribedEvent.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/backend_rpc_protocol/ServerV1RPCProtocolHandler.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/protocol/GameProtocolMessageController.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/protocol/ServerV3MessageHandler.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/protocol/ServerV4MessageHandler.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/query/MOTDQueryHandler.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/query/QueryManager.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/query/RevokeSessionQueryHandler.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/query/VersionQueryHandler.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/web/HttpContentType.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/web/HttpMemoryCache.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/server/web/HttpWebServer.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/shit/CompatWarning.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/shit/MainClass.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/skins/AsyncSkinProvider.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/skins/BinaryHttpClient.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/skins/CapePackets.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/skins/CapeServiceOffline.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/skins/ICacheProvider.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/skins/ISkinService.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/skins/JDBCCacheProvider.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/skins/SimpleRateLimiter.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/skins/SkinPackets.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/skins/SkinRescaler.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/skins/SkinService.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/skins/SkinServiceOffline.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/sqlite/EaglerDrivers.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/voice/ExpiringSet.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/voice/VoiceServerImpl.java delete mode 100644 gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/voice/VoiceService.java delete mode 100644 gateway/EaglercraftXBungee/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/default_authservice.yml delete mode 100644 gateway/EaglercraftXBungee/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/default_http_mime_types.json delete mode 100644 gateway/EaglercraftXBungee/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/default_ice_servers.yml delete mode 100644 gateway/EaglercraftXBungee/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/default_listeners.yml delete mode 100644 gateway/EaglercraftXBungee/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/default_message_api_example.html delete mode 100644 gateway/EaglercraftXBungee/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/default_message_api_v1.js delete mode 100644 gateway/EaglercraftXBungee/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/default_pause_menu.yml delete mode 100644 gateway/EaglercraftXBungee/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/default_pause_menu_server_info.html delete mode 100644 gateway/EaglercraftXBungee/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/default_pause_menu_test_image.png delete mode 100644 gateway/EaglercraftXBungee/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/default_settings.yml delete mode 100644 gateway/EaglercraftXBungee/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config/default_updates.yml delete mode 100644 gateway/EaglercraftXBungee/src/main/resources/plugin.yml delete mode 100644 gateway/EaglercraftXVelocity/.gitignore delete mode 100644 gateway/EaglercraftXVelocity/EaglerXVelocity-Latest.jar delete mode 100644 gateway/EaglercraftXVelocity/build.gradle delete mode 100644 gateway/EaglercraftXVelocity/deps/readme.txt delete mode 100644 gateway/EaglercraftXVelocity/gradle/wrapper/gradle-wrapper.jar delete mode 100644 gateway/EaglercraftXVelocity/gradle/wrapper/gradle-wrapper.properties delete mode 100644 gateway/EaglercraftXVelocity/gradlew delete mode 100644 gateway/EaglercraftXVelocity/gradlew.bat delete mode 100644 gateway/EaglercraftXVelocity/readme.txt delete mode 100644 gateway/EaglercraftXVelocity/settings.gradle delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/EaglerXVelocity.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/EaglerXVelocityVersion.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/EaglerXVelocityAPIHelper.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/EnumVoiceState.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/EnumWebViewState.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/JSONLegacySerializer.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/NotificationBadgeBuilder.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/event/EaglercraftClientBrandEvent.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/event/EaglercraftHandleAuthCookieEvent.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/event/EaglercraftHandleAuthPasswordEvent.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/event/EaglercraftIsAuthRequiredEvent.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/event/EaglercraftMOTDEvent.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/event/EaglercraftRegisterCapeEvent.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/event/EaglercraftRegisterSkinEvent.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/event/EaglercraftRevokeSessionQueryEvent.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/event/EaglercraftVoiceStatusChangeEvent.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/event/EaglercraftWebSocketOpenEvent.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/event/EaglercraftWebViewChannelEvent.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/event/EaglercraftWebViewMessageEvent.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/query/EaglerQueryHandler.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/query/EaglerQuerySimpleHandler.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/query/MOTDConnection.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/auth/AuthLoadingCache.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/auth/DefaultAuthSystem.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/auth/GeneralDigest.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/auth/HashUtils.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/auth/SHA1Digest.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/auth/SHA256Digest.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/command/CommandClientBrand.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/command/CommandConfirmCode.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/command/CommandDomain.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/command/CommandEaglerPurge.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/command/CommandEaglerRegister.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/command/CommandRatelimit.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/command/EaglerCommand.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/EaglerAuthConfig.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/EaglerListenerConfig.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/EaglerPauseMenuConfig.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/EaglerRateLimiter.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/EaglerUpdateConfig.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/EaglerVelocityConfig.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/MOTDCacheConfiguration.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/RateLimitStatus.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/ServerIconLoader.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/ServerInfoTemplateParser.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/TestOutputStream.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/VanillaDefaultSkinProfileLoader.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/bungee/ChatColor.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/bungee/Configuration.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/bungee/ConfigurationProvider.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/bungee/JsonConfiguration.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/bungee/YamlConfiguration.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/handlers/EaglerPacketEventListener.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/repackage/lang3/StrBuilder.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/repackage/lang3/StrMatcher.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/repackage/lang3/StrTokenizer.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/EaglerConnectionInstance.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/EaglerMinecraftDecoder.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/EaglerMinecraftEncoder.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/EaglerPipeline.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/EaglerPlayerData.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/EaglerUpdateSvc.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/HandshakePacketTypes.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/HttpHandshakeHandler.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/HttpServerQueryHandler.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/HttpWebSocketHandler.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/backend_rpc_protocol/BackendRPCSessionHandler.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/backend_rpc_protocol/EnumSubscribedEvent.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/backend_rpc_protocol/ServerV1RPCProtocolHandler.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/protocol/GameProtocolMessageController.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/protocol/ServerV3MessageHandler.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/protocol/ServerV4MessageHandler.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/query/MOTDQueryHandler.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/query/QueryManager.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/query/RevokeSessionQueryHandler.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/query/VersionQueryHandler.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/web/HttpContentType.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/web/HttpMemoryCache.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/server/web/HttpWebServer.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/shit/CompatWarning.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/shit/MainClass.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/skins/AsyncSkinProvider.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/skins/Base64.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/skins/BaseNCodec.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/skins/BinaryHttpClient.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/skins/CapePackets.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/skins/CapeServiceOffline.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/skins/ICacheProvider.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/skins/ISkinService.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/skins/JDBCCacheProvider.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/skins/SimpleRateLimiter.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/skins/SkinPackets.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/skins/SkinRescaler.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/skins/SkinService.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/skins/SkinServiceOffline.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/sqlite/EaglerDrivers.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/voice/ExpiringSet.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/voice/VoiceServerImpl.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/voice/VoiceService.java delete mode 100644 gateway/EaglercraftXVelocity/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/default_authservice.yml delete mode 100644 gateway/EaglercraftXVelocity/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/default_http_mime_types.json delete mode 100644 gateway/EaglercraftXVelocity/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/default_ice_servers.yml delete mode 100644 gateway/EaglercraftXVelocity/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/default_listeners.yml delete mode 100644 gateway/EaglercraftXVelocity/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/default_message_api_example.html delete mode 100644 gateway/EaglercraftXVelocity/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/default_message_api_v1.js delete mode 100644 gateway/EaglercraftXVelocity/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/default_pause_menu.yml delete mode 100644 gateway/EaglercraftXVelocity/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/default_pause_menu_server_info.html delete mode 100644 gateway/EaglercraftXVelocity/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/default_pause_menu_test_image.png delete mode 100644 gateway/EaglercraftXVelocity/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/default_settings.yml delete mode 100644 gateway/EaglercraftXVelocity/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config/default_updates.yml delete mode 100644 gateway/EaglercraftXVelocity/src/main/resources/velocity-plugin.json delete mode 100644 gateway/PlaceholderServer/Java-WebSocket-1.5.1-with-dependencies.jar delete mode 100644 gateway/PlaceholderServer/PlaceholderServer-Latest.jar delete mode 100644 gateway/PlaceholderServer/src/main/java/net/lax1dude/eaglercraft/v1_8/placeholder_server/DummyConnection.java delete mode 100644 gateway/PlaceholderServer/src/main/java/net/lax1dude/eaglercraft/v1_8/placeholder_server/PlaceholderServer.java delete mode 100644 gateway/PlaceholderServer/src/main/java/net/lax1dude/eaglercraft/v1_8/placeholder_server/PlaceholderServerConfig.java delete mode 100644 gateway/PlaceholderServer/src/main/java/net/lax1dude/eaglercraft/v1_8/placeholder_server/ServerIconLoader.java delete mode 100644 gateway/PlaceholderServer/src/main/resources/config_default.json delete mode 100644 gateway/PlaceholderServer/src/main/resources/server-icon_default.png delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/EaglerBackendRPCProtocol.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/EaglerBackendRPCHandler.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/EaglerBackendRPCPacket.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/WrongRPCPacketException.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/client/CPacketRPCDisabled.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/client/CPacketRPCEnabled.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/client/CPacketRPCNotifBadgeHide.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/client/CPacketRPCNotifBadgeShow.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/client/CPacketRPCNotifIconRegister.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/client/CPacketRPCNotifIconRelease.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/client/CPacketRPCRedirectPlayer.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/client/CPacketRPCRequestPlayerInfo.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/client/CPacketRPCResetPlayerMulti.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/client/CPacketRPCSendRawMessage.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/client/CPacketRPCSendWebViewMessage.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/client/CPacketRPCSetPauseMenuCustom.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/client/CPacketRPCSetPlayerCape.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/client/CPacketRPCSetPlayerCookie.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/client/CPacketRPCSetPlayerFNAWEn.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/client/CPacketRPCSetPlayerSkin.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/client/CPacketRPCSubscribeEvents.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/server/SPacketRPCEnabledFailure.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/server/SPacketRPCEnabledSuccess.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/server/SPacketRPCEventToggledVoice.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/server/SPacketRPCEventWebViewMessage.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/server/SPacketRPCEventWebViewOpenClose.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/server/SPacketRPCResponseTypeBytes.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/server/SPacketRPCResponseTypeCookie.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/server/SPacketRPCResponseTypeError.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/server/SPacketRPCResponseTypeNull.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/server/SPacketRPCResponseTypeString.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/server/SPacketRPCResponseTypeUUID.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/server/SPacketRPCResponseTypeVoiceStatus.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/pkt/server/SPacketRPCResponseTypeWebViewStatus.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/util/PacketImageData.java delete mode 100644 gateway/backend-rpc-protocol/src/backend-rpc-protocol/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/util/SkinPacketHelper.java delete mode 100644 gateway/backend-rpc-protocol/src/notif-builder-bungee/java/net/lax1dude/eaglercraft/v1_8/plugin/backend_rpc_protocol/util/NotificationBadgeBuilder.java delete mode 100644 gateway_version delete mode 100644 gateway_version_velocity diff --git a/README.md b/README.md index 2b93a579..f63e92f5 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,6 @@ - **Source code to provide the LWJGL keyboard, mouse, and OpenGL APIs in a browser** - **Patch files to mod the Minecraft 1.8 source code to make it browser compatible** - **Browser-modified portions of Minecraft 1.8's open-source dependencies** - - **Plugins for Minecraft servers to allow the eagler client to connect to them** ### This repository does NOT contain: @@ -85,57 +84,7 @@ If you are creating a resource pack and want to disable the blur filter on the m ## Making a Server -To make a server for EaglercraftX 1.8 the recommended software to use is EaglercraftXBungee ("EaglerXBungee") which is included in this repository in the `gateway/EaglercraftXBungee` folder. This is a plugin designed to be used with BungeeCord to allow Eaglercraft players to join your BungeeCord server. It is assumed that the reader already knows what BungeeCord is and has a working server set up that is joinable via java edition. If you don't know what BungeeCord is, please research the topic yourself first before continuing. Waterfall and FlameCord have also been tested, but EaglerXBungee was natively compiled against BungeeCord. - -There is an experimental velocity plugin available in `gateway/EaglercraftXVelocity` but it is still in development and not recommended for public servers, so be sure to check for updates regularly if you use it. Configuration files are basically identical to EaglercraftXBungee so its safe to just directy copy in your old EaglercraftXBungee config files to the `plugins/eaglerxvelocity` folder and they should work with a minimal number of edits if you are migrating your network from BungeeCord to Velocity. - -**Warning:** Both EaglerXBungee and EaglerXVelocity perform a lot of reflection that will inevitably break after a while when BungeeCord or Velocity is updated upstream. Both plugins will display the precise build number of BungeeCord and Velocity that has been tested by the developers and known to be compatible with EaglerXBungee and EaglerXVelocity when the proxy first starts up. If you are experiencing issues, try checking the BungeeCord or Velocity website for old versions and find the closest version number to whatever the current compatible version number is that is printed by EaglerXBungee/EaglerXVelocity, it will probably fix whatever missing functions the error messages are complaining about. - -### Detailed READMEs - -- [**EaglerXBungee README**](README_EAGLERXBUNGEE.md) -- [**EaglerXVelocity README**](README_EAGLERXVELOCITY.md) -- [**EaglerXBukkitAPI README**](README_EAGLERXBUKKITAPI.md) - -### Installation - -Obtain the latest version of the EaglerXBungee JAR file (it can be downloaded in the client from the "Multiplayer" screen) and place it in the "plugins" folder of your BungeeCord server. It's recommended to only join native Minecraft 1.8 servers through an EaglerXBungee server but plugins like ProtocolSupport have allowed some people to join newer servers too. - -Configuration files and other plugin data will be written in `plugins/EaglercraftXBungee` - -### Online Mode Instructions - -1. Enable `online_mode` in BungeeCord's `config.yml` file and make sure it works -2. Join the BungeeCord server using Minecraft Java Edition while logged into your Microsoft account -3. Run the `/eagler` command, it will give you a temporary login code -4. Disconnect from the server, close java edition, launch EaglercraftX 1.8 -5. Set your profile username to the username of your Microsoft account -6. Go to the "Multiplayer" menu, press "Direct Connect", press "Connect to Server", then enter "ws://localhost:8081/" -7. If you are using a VPS, replace "localhost" with the IP address of the VPS when you connect -8. Press "Join Server", a login screen will be displayed, enter the temporary login code into the password field -9. EaglerXBungee will log you into the server as the Microsoft account you generated the login code with - -Players using EaglercraftX will be able to see the vanilla skins of players on the server using vanilla Minecraft, but players on the server using vanilla Minecraft won't be able to see the skins of players using Eaglercraft. Instead they will see the skin of the Minecraft account that was used when the Eaglercraft player originally ran the `/eagler` command. - -To disable this vanilla player skin feature and stop the plugin from downloading the textures of any player heads spawned with commands, edit the EaglercraftXBungee `settings.yml` file in the `plugins/EaglercraftXBungee` folder and change `download_vanilla_skins_to_clients` to `false`. Ratelimits configured in `settings.yml` define the maximum number of times per minute a single player is allowed to trigger profile/skin lookups and also define the maximum number of times per minute the entire server is allowed to actually perform profile/skin lookups. - -By default, EaglercraftXBungee will use a local SQLite database in the server's working directory to store player skins and authentication codes. SQLite will be downloaded automatically if it is not already present. If you would like to use MySQL or something else instead, EaglercraftXBungee is JDBC-based and supports any database type that you can find a driver for. You can set the path of the database, path of the driver JAR, and the name of the driver class (example: `org.sqlite.JDBC`) for storing player skins in `settings.yml` and for storing login codes and profiles in `authservice.yml`. - -### Offline Mode Instructions - -By setting `online_mode` to `false` in the BungeeCord `config.yml` the authentication system will be disabled and players will no longer be required to first generate a code to log in. This should only be used for testing or if you can't get the authentication system to work. EaglercraftXBungee's skin system is supposed to be able to display SkinsRestorer skins if you plan to have vanilla players on the server but it's not guaranteed. - -### Built-in HTTP server - -When configuring the EaglercraftXBungee `listeners.yml` file, every listener includes an `http_server` section that can be used to configure the listener to also behave like a regular HTTP server when the websocket address is entered into a browser. If this is disabled people will get the normal "404 Websocket Upgrade Failure" instead when they accidentally type your server address into their browser. `root` defines the path to the folder containing index.html and the other files you want to host, relative to the `plugins/EaglercraftXBungee` folder. This can be useful for hosting the client if the offline download doesn't work for some reason but might slow your BungeeCord server down if lots of people are loading it all the time. - -### Enabling Voice Chat - -Voice chat is disabled by default in EaglercraftXBungee because it is not recommended for use on public servers. To enable it, add or change `allow_voice: true` to your EaglercraftXBungee `listeners.yml` file. The main difference between Eaglercraft 1.5.2 and EaglercraftX 1.8's voice chat feature is that the "Global" channel now only includes other players on the same server as you instead of every single player connected to the same bungeecord proxy. If you would like to disable voice chat on certain servers, add the names of the servers to the `disable_voice_chat_on_servers` list in the EaglercraftXBungee `settings.yml` file. You may have to add this property to the YML file manually if you've upgraded your server from an older version of EaglercraftXBungee. - -### Disabling FNAW Skins - -Players are known to complain about the high-poly Five Nights At Winstons character skins making PVP harder because of the belief that they change a player's hitbox. If you would like to disable those skins in your PVP worlds you can either set `disable_fnaw_skins_everywhere: true` in your EaglercraftXBungee `settings.yml` file to disable them for all players on your whole BungeeCord proxy, or you can disable them on specific servers by adding the names of the servers to the `disable_fnaw_skins_on_servers` list also in `settings.yml` like with disabling voice chat. +To make a server for EaglercraftX 1.8 the recommended software to use is EaglercraftXServer ("EaglerXServer"), which you can get from lax1dude here: [https://lax1dude.net/eaglerxserver/](https://lax1dude.net/eaglerxserver/) ## Launch Options diff --git a/README_EAGLERXBUKKITAPI.md b/README_EAGLERXBUKKITAPI.md deleted file mode 100644 index e6f137bd..00000000 --- a/README_EAGLERXBUKKITAPI.md +++ /dev/null @@ -1,87 +0,0 @@ -# EaglercraftXBukkitAPI - -### [`gateway/EaglercraftXBukkitAPI/EaglercraftXBukkitAPI-Latest.jar`](gateway/EaglercraftXBukkitAPI/EaglercraftXBukkitAPI-Latest.jar) - -### "EaglerXBukkitAPI" is a Bukkit plugin and protocol to allow Bukkit plugins to easily communicate with an EaglerXBungee or EaglerXVelocity instance, its purpose is to provide a standardized interface for creating complex Bukkit plugins that tightly integrate with EaglercraftX features, that would otherwise require developers to also create a BungeeCord/Velocity plugin to act as a "middle man" for sending certain packets or listening for certain events. - -## Compiling EaglerXBukkitAPI - -Minimum JDK version is 8, since what we are doing here is actually fully within the limitations of the official Bukkit API, we have actually set up Gradle correctly for once. No dependencies have to be downloaded manually, just run `gradlew jar` and you are done. - -## Configuration Files - -EaglerXBukkitAPI has no configuration files, however you must to edit `settings.yml` on EaglerXBungee/EaglerXVelocity to add or change `enable_backend_rpc_api` to `true` first in order to enable it. - -## Initializing Connections - -EaglerXBukkitAPI uses Google Commons (Guava) futures in order to implement a system that is similar to JavaScript promises to asynchronously complete tasks without blocking any threads. You should never block and wait for a task to complete synchronously, use the `addCallback` function with an anonymous inner class instead. Here is an example of how to correctly initialize an EaglerXBukkitAPI connection: - -```java -// import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.IEaglerXBukkitAPI; -@EventHander -public void onPlayerJoinEvent(PlayerJoinEvent evt) { - IEaglerXBukkitAPI.createAPI(evt.getPlayer()) - .addCallback(new FutureCallback() { - @Override - public void onSuccess(IEaglerXBukkitAPI result) { - // Do stuff with result - } - @Override - public void onFailure(Throwable t) { - // Something went wrong - } - }); -} -``` - -You can call `createAPI` as many times as you want, subsequent calls will return the existing `IEaglerXBukkitAPI` handle instead of creating a new one. - -## Making a Request - -Here is a very simple example of using EaglerXBukkitAPI to determine the name of the website (origin) a player is using, assuming you've already used `createAPI` to initialize a new connection: - -```java -// ... -public void onSuccess(IEaglerXBukkitAPI apiObj) { - apiObj.requestPlayerOrigin().addCallback(new FutureCallback() { - @Override - public void onSuccess(ResponseString result) { - System.out.println("Player's origin is: " + result.string); - } - @Override - public void onFailure(Throwable t) { - // Something went wrong - } - }); -} -``` - -## Event Listeners - -Here is an example of how to use EaglerXBukkitAPI to remotely listen for server info webview events on an EaglerXBungee/EaglerXVelocity instance from a Bukkit plugin: - -```java -// ... -public void onSuccess(IEaglerXBukkitAPI apiObj) { - apiObj.addEventListener(EnumSubscribeEvents.EVENT_WEBVIEW_OPEN_CLOSE, - new IEaglerRPCEventListener() { - public void handleEvent(IEaglerXBukkitAPI api, EnumSubscribeEvents eventType, - EventWebViewOpenClose eventData) { - // Handle open/close events - } - }); - apiObj.addEventListener(EnumSubscribeEvents.EVENT_WEBVIEW_MESSAGE, - new IEaglerRPCEventListener() { - public void handleEvent(IEaglerXBukkitAPI api, EnumSubscribeEvents eventType, - EventWebViewMessage eventData) { - // Handle messages - } - }); - apiObj.subscribeEvents( - EnumSubscribeEvents.EVENT_WEBVIEW_OPEN_CLOSE, - EnumSubscribeEvents.EVENT_WEBVIEW_MESSAGE - ); -} -``` - -The rest of EaglerXBukkitAPI should be self explanatory, its just another EaglerXBungeeAPIHelper/EaglerXVelocityAPIHelper. diff --git a/README_EAGLERXBUNGEE.md b/README_EAGLERXBUNGEE.md deleted file mode 100644 index 466b855f..00000000 --- a/README_EAGLERXBUNGEE.md +++ /dev/null @@ -1,209 +0,0 @@ -# EaglercraftXBungee - -### [`gateway/EaglercraftXBungee/EaglerXBungee-Latest.jar`](gateway/EaglercraftXBungee/EaglerXBungee-Latest.jar) - -### "EaglerXBungee" is a plugin that allows the EaglercraftX 1.8 client to join BungeeCord servers, with an optional authentication system if online-mode is enabled. This is not a setup guide, this document is intended to be used as reference for EaglerXBungee's configuration files and provide some surface-level information meant for plugin developers. - -**Warning:** Both EaglerXBungee and EaglerXVelocity perform a lot of reflection that will inevitably break after a while when BungeeCord or Velocity is updated upstream. Both plugins will display the precise build number of BungeeCord and Velocity that has been tested by the developers and known to be compatible with EaglerXBungee and EaglerXVelocity when the proxy first starts up. If you are experiencing issues, try checking the BungeeCord or Velocity website for old versions and find the closest version number to whatever the current compatible version number is that is printed by EaglerXBungee/EaglerXVelocity, it will probably fix whatever missing functions the error messages are complaining about. - -## Compiling EaglerXBungee - -Minimum JDK version is 8, as of 1.3.0 we are finally using Gradle to compile EaglerXBungee instead of compiling it all manually, however you still need to manually download the latest version of BungeeCord and name it "BungeeCord.jar" and place it in the `deps` folder first before you continue. We just don't care enough to actually use Gradle correctly to download all the dependencies automatically when they are all subject to change at any time as BungeeCord recieves updates upstream. Use the "jar" task to automatically compile the EaglerXBungee JAR file. - -## Configuration Files - -### NOTE: Currently, the plugin does NOT automatically update config files, if you can't find an option in one of the configuration files documented here, you most likely need to add it to the file yourself! - -**The default contents of the config files for EaglerXBungee are stored in [`gateway/EaglercraftXBungee/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config`](gateway/EaglercraftXBungee/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/config)** - -### `settings.yml` - -The settings.yml file is primarily used for configuring the built-in skin and cape service and certain connection options. - -- **`server_name:`** String, default value is `'EaglercraftXBungee Server'`, sets the name of this EaglercraftX server that is sent with query responses and used for the default "404 websocket upgrade failure" page. -- **`server_uuid:`** String, default value is randomized, sets the UUID of this EaglercraftX server to send with query responses, has no official uses outside of server lists. -- **`websocket_connection_timeout:`** Number, default value is `15000` milliseconds, sets how long a WebSocket connection can last without a ping before being disconnected. -- **`websocket_handshake_timeout:`** Number, default value is `5000` milliseconds, sets how long a connection can sit in the handshake phase before being disconnected. -- **`builtin_http_server_timeout:`** Number, default value is `10000` milliseconds, sets how long an HTTP request to the built-in HTTP server can remain open before being forcefully disconnected. -- **`http_websocket_compression_level:`** Number, default value is `6`, sets the ZLIB compression level (0-9) to use for compressing websocket frames, set to 0 to disable if HTTP compression is already handled through a reverse proxy. You almost definitely need some level of compression for the game to be playable on WiFi networks. -- **`download_vanilla_skins_to_clients:`** Boolean, default value is `true`, sets if the server should download the textures of custom skulls and skins of vanilla online-mode players from Mojang's servers to cache locally and send to all EaglercraftX clients on the server that attempt to render them. -- **`valid_skin_download_urls:`** List of strings, default includes only `'textures.minecraft.net'`, sets the allowed domains to download custom skulls and skins from that are requested by EaglercraftX clients, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`uuid_lookup_ratelimit_player:`** Integer, default value is `50`, limit of how many Mojang API UUID-to-profile lookups a single player is allowed to trigger per minute, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`uuid_lookup_ratelimit_global:`** Integer, default value is `175`, limit of how many Mojang API UUID-to-profile lookups the entire server is allowed to perform per minute, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`skin_download_ratelimit_player:`** Integer, default value is `1000`, limit of how many texture downloads a single player is allowed to trigger per minute, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`skin_download_ratelimit_global:`** Integer, default value is `30000`, limit of how many texture downloads the entire server is allowed to perform per minute, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`skin_cache_db_uri:`** String, default value is `'jdbc:sqlite:eaglercraft_skins_cache.db'`, can be used to change the location of the SQLite database used as a cache for skins and profiles, or to make the server use an entirely different SQL database like MySQL to store the data instead, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`skin_cache_keep_objects_days:`** Integer, default value is `45`, sets the max age for textures (skin files) stored in the skin cache database, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`skin_cache_keep_profiles_days:`** Integer, default value is `7`, sets the max age for player profiles stored in the skin cache database, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`skin_cache_max_objects:`** Integer, default value is `32768`, sets the max number of textures (skin files) stored in the skin cache database before the oldest textures begin to be deleted, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`skin_cache_max_profiles:`** Integer, default value is `32768`, sets the max number of player profiles stored in the skin cache database before the oldest profiles begin to be deleted, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`skin_cache_antagonists_ratelimit:`** Integer, default value is `15`, sets the lockout limit for failing skin lookup requests, intended to reduce the effectiveness of some of the more simplistic types denial of service attacks that skids may attempt to perform on the skin download system, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`sql_driver_class:`** String, default value is `'internal'`, which is currently evaluated to `'org.sqlite.JDBC'`, can be used to set the name of the JDBC driver class to use for connecting to the `skin_cache_db_uri` database -- **`sql_driver_path:`** String, default value is `'internal'`, can be used to set the name of the external JAR file where the JDBC driver class to use for connecting to the `skin_cache_db_uri` database can be found, the default `'internal'` value downloads the sqlite-jdbc JAR from maven and loads it automatically, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`eagler_players_vanilla_skin:`** String, default value is `''` but was originally `'lax1dude'`, can be used to set the skin to apply to EaglercraftX players when a player on Minecraft Java Edition sees them in game. The value is the username of a premium Minecraft account to use the skin from. You cannot use a local PNG file due to the profile signature requirements in vanilla Minecraft clients. -- **`enable_is_eagler_player_property:`** Boolean, default value is `true`, can be used to control if the `isEaglerPlayer` GameProfile property should be added to EaglercraftX players, this property is used to ensure that EaglercraftX players always only display their custom skins when viewed by another EaglercraftX players on the server instead of showing the skin attached to their Java Edition username, but this property also cause plugins like ViaVersion to crash. -- **`disable_voice_chat_on_servers:`** List of strings, default value is nothing (`[]`), contains a list of names of registered servers on your BungeeCord proxy that voice chat should show up as "disabled" on. Note that to disable voice globally you should modify `listeners.yml` instead. -- **`disable_fnaw_skins_everywhere:`** Boolean, default value is `false`, can be used to globally disable FNAW skins if your players bitch about them a lot and are too lazy to just disable the FNAW skins locally on their clients. -- **`disable_fnaw_skins_on_servers:`** List of strings, default value is nothing (`[]`), contains a list of names of registered servers on your BungeeCord proxy that the FNAW skins should be disabled on. Good for explicitly disabling them for PVP but allowing them everywhere else. -- **`enable_backend_rpc_api:`** Boolean, default value is `false`, if support for servers running the EaglerXBukkitAPI plugin should be enabled or not. -- **`use_modernized_channel_names:`** Boolean, default value is `false`, if "modernized" plugin channel names compatible with Minecraft 1.13+ should be used for EaglerXBukkitAPI plugin message packets - -### `listeners.yml` - -Defines one or more "listeners" (open ports) for EaglercraftX players to use to join the server. Each listener supports the following configuration options, a lot of which you will already be familiar with if you've ever set up a BungeeCord for a Java Edition server before: - -- **`address:`** String, default value is `0.0.0.0:8081`, sets the primary IPv4/port for EaglerXBungee to listen on. -- **`address_v6:`** String, default value is `'null'`, sets the primary IPv6/port for EaglerXBungee to listen on. -- **`max_players:`** Integer, default value is `60`, sets the maximum number of players that can join the server through this listener, set to `-1` to disable the limit. -- **`tab_list:`** String, default value is `GLOBAL_PING`, sets the option with the same name on the underlying BungeeCord listener, currently not used by EaglercraftX in any way. -- **`default_server:`** String, default value is `lobby`, sets the name of the default server for players to be sent to when they first connect to this listener. -- **`force_default_server:`** Boolean, default value is `false`, sets if players should always be connected to `default_server` when they connect to this listener. -- **`forward_ip:`** Boolean, default value is `false`, sets if connections to this listener will use an HTTP header to forward the player's real IP address from a reverse proxy (or CloudFlare) to the BungeeCord server. This is required for EaglerXBungee's rate limiting and a lot of plugins to work correctly if they are used behind a reverse HTTP proxy or CloudFlare. -- **`forward_ip_header:`** String, default value is `X-Real-IP`, sets the name of the request header that contains the player's real IP address if the `forward_ip` option is enabled. This option is commonly set to `X-Forwarded-For` or `CF-Connecting-IP` for a lot of server setups. -- **`redirect_legacy_clients_to:`** String, default value is `'null'`, sets the WebSocket address to redirect legacy Eaglercraft 1.5.2 clients to if they mistakenly try to join the server through this listener. -- **`server_icon:`** String, default value is `server-icon.png`, sets the name of the 64x64 PNG file to display as this listener's server icon, relative to the working directory of the BungeeCord proxy server. -- **`server_motd:`** List of up to 2 strings, default value is `'&6An EaglercraftX server'`, sets the contents of the listener's MOTD, which is the text displayed along with the `server_icon` when players add this server's listener address to their client's Multiplayer menu server list. -- **`allow_motd:`** Boolean, default value is `true`, if this listener should respond to MOTD queries or not. -- **`allow_query:`** Boolean, default value is `true`, if this listener should respond to all other types of queries or not. -- **`min_minecraft_protocol:`** Integer, default value is `47`, sets the minimum Minecraft [protocol version](https://wiki.vg/Protocol_version_numbers) that EaglercraftX-based clients are allowed to connect with (`47` = 1.8) -- **`max_minecraft_protocol:`** Integer, default value is `340`, sets the maximum Minecraft protocol version that EaglercraftX-based clients are allowed to connect with (`340` = 1.12.2) -- **`allow_protocol_v3:`** Boolean, default value is `true`, if this listener should allow clients using the v1/v2/v3 protocols to join (pre-u37 clients). -- **`allow_protocol_v4:`** Boolean, default value is `true`, if this listener should allow clients using the v4 protocol to join (post-u37 clients). -- **`protocol_v4_defrag_send_delay:`** Integer, default value is `10`, the number of milliseconds to wait before flushing all pending EaglercraftX plugin message packets, saves bandwidth by combining multiple messages into a single plugin message packet. Setting this to `0` has the same effect on clientbound packets as setting `eaglerNoDelay` to `true` does on a post-u37 client for all serverbound packets. -- **`use_haproxy_protocol:`** Boolean, default value is `false`, can be used to enable support for the HAProxy proxy protocol. Make sure to also add the `check`, `check-send-proxy`, and `send-proxy-v2` parameters to your `server` directives in the HAProxy config file. -- **`allow_cookie_revoke_query:`** Boolean, default value is `true`, If this listener should accept queries from post-u37 clients to revoke session tokens, you need to create your own BungeeCord plugin to go with EaglerXBungee that handles the `EaglercraftRevokeSessionQueryEvent` event it fires in order for this feature to work correctly. -- **`request_motd_cache:`** Section that defines caching hints for server lists that cache the MOTD via the `MOTD.cache` query. As far as we know, not even the official Eaglercraft Server List on eaglercraft.com currently pays attention to these hints or attempts to cache MOTDs, so they can be ignored for now. - - **`cache_ttl:`** Integer, default value is `7200`, sets how many seconds for the server list to store the MOTD in cache. - - **`online_server_list_animation:`** Boolean, default is `false`, if the MOTD should be cached in an "animated format" that is yet to be standardized. - - **`online_server_list_results:`** Boolean, default is `true`, if the MOTD should be cached when shown in search results. - - **`online_server_list_trending:`** Boolean, default is `true`, if the MOTD should be cached if the server makes it to the top of the homepage. - - **`online_server_list_portfolios:`** Boolean, default is `false`, if the MOTD should be cached when viewing more details about the specific server. -- **`http_server:`** Section that defines settings for the integrated HTTP server, used to make the listener behave as a normal HTTP server when a non-WebSocket request is recieved (like when the listener address is entered into a browser's address bar). These options can be used to replace the "404 WebSocket Upgrade Failure" message with a custom HTML file instead. - - **`enabled:`** Boolean, default value is `false`, if this is set to true then the default "404 WebSocket Upgrade Failure" page will be disabled and replaced with the integrated file-based HTTP server, perfect for hosting a copy of the EaglercraftX client. - - **`root:`** String, default value is `web`, sets the folder that contains the HTTP server's document root, this is relative to the `plugins/EaglercraftXBungee` folder where the config files are stored. - - **`page_404_not_found:`** String, default value is `'default'`, can be used to replace the HTTP server's 404 page. - - **`page_index_name:`** List of strings, default values are `'index.html'` and `'index.htm'`, can be used to specify the name of index.html. -- **`allow_voice:`** Boolean, default is `false`, sets if voice should show up as "disabled" for players using this listener. Voice is not recommended for public servers since little to no consideration was given to actually validating the contents of signaling packets sent between clients. -- **`ratelimit:`** Section containing rate limiting configurations for several different connection types. - - **`ip:`** Global ratelimit imposed on all connection types. - - **`login:`** Sets ratelimit on login (server join) attempts. - - **`motd:`** Sets ratelimit on MOTD query types. - - **`query:`** Sets ratelimit on all other query types. - - **`enable:`** If the rate limit (ip/login/motd/query) should be enabled. - - **`period:`** Sets the period in the number of seconds. - - **`limit:`** Sets the number of requests a single IP address can send in `period` seconds before being limited. - - **`limit_lockout:`** Sets the number of requests a single IP address can send in `period` seconds before being locked out. - - **`lockout_duration:`** Sets the total number of seconds a "lock out" should last on this limiter. - -### `authservice.yml` - -The authservice.yml file is used for configuring the built-in online mode authentication service included with the plugin or to integrate with a 3rd party authentication system provided by another plugin. - -- **`enable_authentication_system:`** Boolean, default is `true`, if the events for the authentication protocol should be enabled. -- **`use_onboard_eaglerx_system:`** Boolean, default is `true`, if the built-in online mode authentication system should be enabled. -- **`auth_db_uri:`** String, default value is `'jdbc:sqlite:eaglercraft_auths.db'`, can be used to change the location of the SQLite database used for the built-in online mode authentication system, or to make the server use an entirely different SQL database like MySQL to store the data instead. -- **`sql_driver_class:`** String, default value is `'internal'`, see the description of the `settings.yml` option with the same name. -- **`sql_driver_path:`** String, default value is `'internal'`, see the description of the `settings.yml` option with the same name. -- **`password_prompt_screen_text:`** String, default value is `'Enter your password to join:'`, text displayed on the EaglercraftX client's password screen when joining the server with the built-in online mode authentication system. -- **`wrong_password_screen_text:`** String, default value is `'Password Incorrect!'`, text displayed if the wrong password is entered on the EaglercraftX client's password screen when joining the server with the built-in online mode authentication system. -- **`not_registered_screen_text:`** String, default value is `'You are not registered on this server!'`, text displayed when joining the server with the built-in online mode authentication system when using an account that has not been registered. -- **`eagler_command_name:`** String, default value is `'eagler'`, the name of the command to use for registering and/or logging in when joining the server with the built-in online mode authentication system. -- **`use_register_command_text:`** String, default value is `'&aUse /eagler to set an Eaglercraft password on this account'`, localization for when players use the `/eagler` command on the server. -- **`use_change_command_text:`** String, default value is `'&bUse /eagler to change your Eaglercraft password'`, localization for when players use the `/eagler` command on the server. -- **`command_success_text:`** String, default value is `'&bYour eagler password was changed successfully.'`, localization for when players use the `/eagler` command on the server. -- **`last_eagler_login_message:`** String, default value is `'Your last Eaglercraft login was on $date from $ip'`, localization for when players join the server with the built-in online mode authentication system. -- **`too_many_registrations_message:`** String, default value is `'&cThe maximum number of registrations has been reached for your IP address'`, localization for when players use the `/eagler` command on the server. -- **`need_vanilla_to_register_message:`** String, default value is `'&cYou need to log in with a vanilla account to use this command'`, localization for when players use the `/eagler` command on the server. -- **`override_eagler_to_vanilla_skins:`** Boolean, default value is `false`, if players who join the server after registering with an online mode account should show the same skin as the online-mode account they registered with. -- **`max_registration_per_ip:`** Integer, default value is `-1`, if greater than 0 it specifies the max number of accounts that can be created per IP address on the server with the built-in online mode authentication system. - -### `ice_servers.yml` - -The ice_servers.yml file is used for configuring the set of STUN/TURN servers that clients on this server should use for voice chat. Beware the default "openrelayproject" TURN servers are no longer active as of 2024, most likely as a result of being the default ond only TURN servers shipped with every copy of Eaglercraft to ever use WebRTC in some way. - -- **`voice_servers_no_passwd:`** List of strings, defines a set of STUN/TURN server URIs to use that don't require a username and password. -- **`voice_servers_passwd:`** Section of sections, defines a set of STUN/TURN server URIs to use that do require a username and password, along with the username and password to use with each one. - -### `updates.yml` - -The updates.yml file is used for configuring the decentralized and totally legal update system used by EaglercraftX clients. - -- **`block_all_client_updates:`** Boolean, default value is `false`, can be used to completely disable the update system. -- **`discard_login_packet_certs:`** Boolean, default value is `false`, can be used to prevent the server from relaying random crowdsourced update certificates that were recieved from players who joined the server using signed clients. -- **`cert_packet_data_rate_limit:`** Integer, default value is `524288`, can be used to set the global rate limit for how many bytes per second of certificates the server should send to all players. -- **`enable_eagcert_folder:`** Boolean, default value is `true`, can be used to enable or disable the "eagcert" folder used for distributing specific certificates as locally provided .cert files -- **`download_latest_certs:`** Boolean, default value is `true`, can be used to automaticlly download the latest certificates to the "eagcert" folder -- **`download_certs_from:`** List of strings, defines the URLs to download the certificates from if `download_latest_certs` is enabled -- **`check_for_update_every:`** Integer, default value is `28800` seconds, defines how often to check the URL list for updated certificates - -### `pause_menu/pause_menu.yml` - -For EaglercraftX u37 and up, can be used for changing the appearance of the pause menu and a few other screens with custom icons and strings, also used for enabling the "Server Info" webview and configuring its contents. - -- **`enable_custom_pause_menu:`** Boolean, default value is `false`, if pause menu customization should be enabled on supported clients or not -- **`server_info_button:`** Section, defines properties of the "Server Info" button, which is always hidden unless pause menu customization is enabled - - **`enable_button:`** Boolean, default value is `true`, if the button should be shown or not - - **`button_text:`** String, default value is `'Server Info'`, the text to display on the button, useful if you want to use this feature for something other than a "Server Info" button - - **`button_mode_open_new_tab:`** Boolean, default value is `false`, can be used to make the "Server Info" button act as a hyperlink that opens a URL in a new tab instead of displaying content in an embedded webview iframe in the client. - - **`server_info_embed_url:`** String, default value is `''`, sets the URL for the "Server Info" button to use if it should open a URL in a new tab or the webview instead of directly downloading the markup to display from the EaglerXBungee server itself over the WebSocket. - - **`button_mode_embed_file:`** Boolean, default value is `true`, determines if the "Server Info" button should download the webview markup directly from the EaglerXBungee server over WebSocket instead of loading an external URL. Cannot be used with `button_mode_open_new_tab`! - - **`server_info_embed_file:`** String, default value is `'server_info.html'`, sets the name of the local file/template containing the markup to display in the "Server Info" webview if it is not in URL mode. - - **`server_info_embed_screen_title:`** String, default value is `'Server Info'`, sets the title string of the screen that displays the webview. - - **`server_info_embed_send_chunk_rate:`** Integer, default value is `1`, defines how many chunks of server info data to send per 250ms when downloading the server info markup to a client. - - **`server_info_embed_send_chunk_size:`** Integer, default value is `24576`, defines the size of each chunk of server info data when it is being downloaded to a client. - - **`enable_template_macros:`** Boolean, default value is `true`, if the server info markup should be processed for any eagler template macros (defined like `` {% arg1 `arg2` ... %} ``) - - **`server_info_embed_template_globals:`** Section, defines a list of additional global variables to use with the template processor - - **`allow_embed_template_eval_macro:`** Boolean, default value is `false`, if the template processor should allow the "eval" macro to be used in the server info markup file (not to be confused with the JavaScript function, although there is never a good reason to use JavaScript's eval function in your code either) - - **`enable_webview_javascript:`** Boolean, default value is `false`, if the server info webview should allow JavaScript to be executed or not. This will display an "allow JavaScript" screen to your players the first time they attempt to view it. - - **`enable_webview_message_api:`** Boolean, default value is `false`, if the server info webview has JavaScript enabled and should be permitted to open a message channel back to your EaglerXBungee server to exchange arbitrary message packets. This can be used, for example, to implement a dynamic menu on your server using JavaScript and HTML that players can access through the server info webview that integrates directly with your gamemodes. - - **`enable_webview_strict_csp:`** Boolean, default value is `true`, if the `csp` attribute on the webview iframe should be set or not for added security, beware this is not supported on all browsers and will be silently disabled when the client detects it as unsupported. -- **`discord_button:`** Section, can be used to turn the "Invite" (formerly "Open to LAN") button on the pause menu into a "Discord" button that players can click to join your discord server - - **`enable_button:`** Boolean, default value is `true`, sets if the discord button should be enabled or not - - **`button_text:`** String, default value is `'Discord'`, sets the text that should be displayed on the button - - **`button_url:`** String, default value is `'https://invite url here'`, defines the URL to open when the button is pressed -- **`custom_images:`** Section, can be used to add icons to certain buttons, change the backgrounds of some screens, and add watermarks of your server to the inventory and pause menu and such if you're into that. For the best GPU compatibility, use only textures with powers of 2 as dimensions (such as 32x32 pixels), the width and height do not need to match, they just both need to be a power of 2. There is also a limit on the maximum size, icons can be no larger than 255x255 pixels (Effective max power-of-2 is 128x128). Color values will be downsampled to 16bpp and use a magic value to represent transparent pixels when the pause menu customization packet is sent to a client. - - **`icon_title_L:`** String, default value is `''`, sets the icon to show on the left side of the pause menu screen's title - - **`icon_title_R:`** String, default value is `''`, sets the icon to show on the right side of the pause menu screen's title - - **`icon_backToGame_L:`** String, default value is `''`, sets the icon to show on the left side of the "Back to Game" button - - **`icon_backToGame_R:`** String, default value is `''`, sets the icon to show on the right side of the "Back to Game" button - - **`icon_achievements_L:`** String, default value is `''`, sets the icon to show on the left side of the "Achievements" button - - **`icon_achievements_R:`** String, default value is `''`, sets the icon to show on the right side of the "Achievements" button - - **`icon_statistics_L:`** String, default value is `''`, sets the icon to show on the left side of the "Statistics" button - - **`icon_statistics_R:`** String, default value is `''`, sets the icon to show on the right side of the "Statistics" button - - **`icon_serverInfo_L:`** String, default value is `''`, sets the icon to show on the left side of the server info button - - **`icon_serverInfo_R:`** String, default value is `''`, sets the icon to show on the right side of the server info button - - **`icon_options_L:`** String, default value is `''`, sets the icon to show on the left side of the "Options" button - - **`icon_options_R:`** String, default value is `''`, sets the icon to show on the right side of the "Options" button - - **`icon_discord_L:`** String, default value is `''`, sets the icon to show on the left side of the discord button - - **`icon_discord_R:`** String, default value is `''`, sets the icon to show on the right side of the discord button - - **`icon_disconnect_L:`** String, default value is `''`, sets the icon to show on the left side of the "Disconnect" button - - **`icon_disconnect_R:`** String, default value is `''`, sets the icon to show on the right side of the "Disconnect" button - - **`icon_background_pause:`** String, default value is `'test_image.png'`, sets the icon to show as a repeating pattern in the background of the pause menu and related screens. It is especially important for GPU compatibility for this one to be a power-of-2 sized texture. - - **`icon_background_all:`** String, default value is `'test_image.png'`, sets the icon to show as a repeating pattern in the background of all other screens in the game. It is especially important for GPU compatibility for this one to be a power-of-2 sized texture. - - **`icon_watermark_pause:`** String, default value is `''`, sets a watermark to show in the bottom-left corner of the pause menu - - **`icon_watermark_all:`** String, default value is `''`, sets a watermark to show in the bottom-left corner of all other screens in the game - -## Event Types - -The events added by EaglerXBungee are located in the [`net.lax1dude.eaglercraft.v1_8.plugin.gateway_bungeecord.api.event`](gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/event) package and can be listened for the same way as you would for a regular BungeeCord event. When an EaglercraftX 1.8 player joins your server, all the regular BungeeCord login events are fired by EaglerXBungee to maintain compatibility with other existing BungeeCord plugins, however EaglerXBungee also adds several of its own event types to allow additional Eaglercraft specific features to be accessible through the main BungeeCord event bus as well. - -- **`EaglercraftWebSocketOpenEvent`** Event that is fired when a new WebSocket connection is first opened to the server (regardless if its a query or actual player login attempt) useful for quickly filtering out new connections based on a specific origin or user agent header. -- **`EaglercraftClientBrandEvent`** Event that is fired when an EaglercraftX player joins, it contains the Eaglercraft client's "brand" and "version" strings along with the origin and user agent headers that can be used to detect 90% of the currently existing skid clients thanks to lax1dude making the base client self-snitch these commonly modified strings. -- **`EaglercraftIsAuthRequiredEvent`** Event that is fired when an EaglercraftX player attempts to join the server while the authentication system is enabled and `use_onboard_eaglerx_system` is `false`, used for implementing custom authentication systems. -- **`EaglercraftHandleAuthPasswordEvent`** Event that is fired when an EaglercraftX player enters a password into the "Authentication Required" screen while the authentication system is enabled and `use_onboard_eaglerx_system` is `false`, used for implementing custom authentication systems. -- **`EaglercraftHandleAuthCookieEvent`** Event that is fired when an EaglercraftX player joins the server with cookies set and while authentication system is enabled and `use_onboard_eaglerx_system` is `false`, you must set cookie auth as allowed while handling "EaglercraftIsAuthRequiredEvent" first for this event to actually be fired, used for implementing custom authentication systems that use cookies to store a session token for auto login. -- **`EaglercraftRevokeSessionQueryEvent`** Event that is fired when a player uses the "Revoke Session Token" feature in a u37 client to invalidate a cookie that was set on their client with the "revoke query supported" bit. Make sure to enable session revoke queries in listeners.yml! -- **`EaglercraftRegisterSkinEvent`** Event that is fired when an EaglercraftX player's skin is recieved, can be used to analyze or modify or replace the skin with a different texture or preset ID if needed. Note that players using pre-u37 clients may not see the modified/replaced skin. -- **`EaglercraftRegisterCapeEvent`** Event that is fired when an EaglercraftX player's cape is recieved, can be used to analyze or modify or replace the cape with a different texture or preset ID if needed. Use preset ID 0 to disable their cape entirely. Note that players using pre-u37 clients may not see the modified/replaced cape. -- **`EaglercraftMOTDEvent`** Event that is fired when a MOTD query request is recieved, used for implement a custom server MOTD handler, or implementing an animated MOTD like the EaglerMOTD plugin. -- **`EaglercraftVoiceStatusChangeEvent`** Event that is fired when `allow_voice` is enabled and a player transitions between voice states (SERVER_DISABLE, DISABLED, ENABLED) cannot be cancelled so it is mostly just useful for logging or displaying some "Rules" in chat. -- **`EaglercraftWebViewChannelEvent`** Event that is fired when the server info webview is open and JavaScript is enabled and the webview opens/closes a new message channel to EaglerXBungee. -- **`EaglercraftWebViewMessageEvent`** Event that is fired when the server info webview is open and JavaScript is enabled and the webview has already opened a channel to EaglerXBungee and a new message is recieved on that open channel. - -## Registering Queries - -If you would like to add your own custom `Accept:` query handlers to the proxy (along with MOTD, version, and session revoke) you can register them at startup using the register functions provided by the [`EaglerQueryHandler`](gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/query/EaglerQueryHandler.java) class. - -## EaglerXBungeeAPIHelper - -To help make plugin development easier, a class called [`EaglerXBungeeAPIHelper`](gateway/EaglercraftXBungee/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_bungeecord/api/EaglerXBungeeAPIHelper.java) is included that defines dozens of helper functions for easily and safely interacting with EaglercraftX clients. This is to enable developers to program plugins for EaglerXBungee servers with minimal knowledge of the actual underlying protocol used by the client for skins and capes and voice and other exclusive features. Its recommended to convert all your existing code to use the `EaglerXBungeeAPIHelper` instead of whatever packet hacks you were doing before it was added when you migrate your network to EaglerXBungee 1.3.0+. All your existing packet hacks will be broken anyway unless you configure the server to force all u37+ clients to use protocol V3 instead. diff --git a/README_EAGLERXVELOCITY.md b/README_EAGLERXVELOCITY.md deleted file mode 100644 index cb72ba53..00000000 --- a/README_EAGLERXVELOCITY.md +++ /dev/null @@ -1,206 +0,0 @@ -# EaglercraftXVelocity - -### [`gateway/EaglercraftXVelocity/EaglerXVelocity-Latest.jar`](gateway/EaglercraftXVelocity/EaglerXVelocity-Latest.jar) - -### "EaglerXVelocity" is a plugin that allows the EaglercraftX 1.8 client to join Velocity servers, with an optional authentication system if online-mode is enabled. This is not a setup guide, this document is intended to be used as reference for EaglerXVelocity's configuration files and provide some surface-level information meant for plugin developers. - -**Warning:** Both EaglerXBungee and EaglerXVelocity perform a lot of reflection that will inevitably break after a while when BungeeCord or Velocity is updated upstream. Both plugins will display the precise build number of BungeeCord and Velocity that has been tested by the developers and known to be compatible with EaglerXBungee and EaglerXVelocity when the proxy first starts up. If you are experiencing issues, try checking the BungeeCord or Velocity website for old versions and find the closest version number to whatever the current compatible version number is that is printed by EaglerXBungee/EaglerXVelocity, it will probably fix whatever missing functions the error messages are complaining about. - -## Compiling EaglerXVelocity - -Minimum JDK version is 17, as of 1.1.0 we are finally using Gradle to compile EaglerXVelocity instead of compiling it all manually, however you still need to manually download the latest version of Velocity and name it "Velocity.jar" and place it in the `deps` folder first before you continue. We just don't care enough to actually use Gradle correctly to download all the dependencies automatically when they are all subject to change at any time as Velocity recieves updates upstream. Use the "jar" task to automatically compile the EaglerXVelocity JAR file. - -## Configuration Files - -### NOTE: Currently, the plugin does NOT automatically update config files, if you can't find an option in one of the configuration files documented here, you most likely need to add it to the file yourself! - -**The default contents of the config files for EaglerXVelocity are stored in [`gateway/EaglercraftXVelocity/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config`](gateway/EaglercraftXVelocity/src/main/resources/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/config)** - -### `settings.yml` - -The settings.yml file is primarily used for configuring the built-in skin and cape service and certain connection options. - -- **`server_name:`** String, default value is `'EaglercraftXVelocity Server'`, sets the name of this EaglercraftX server that is sent with query responses and used for the default "404 websocket upgrade failure" page. -- **`server_uuid:`** String, default value is randomized, sets the UUID of this EaglercraftX server to send with query responses, has no official uses outside of server lists. -- **`websocket_connection_timeout:`** Number, default value is `15000` milliseconds, sets how long a WebSocket connection can last without a ping before being disconnected. -- **`websocket_handshake_timeout:`** Number, default value is `5000` milliseconds, sets how long a connection can sit in the handshake phase before being disconnected. -- **`builtin_http_server_timeout:`** Number, default value is `10000` milliseconds, sets how long an HTTP request to the built-in HTTP server can remain open before being forcefully disconnected. -- **`http_websocket_compression_level:`** Number, default value is `6`, sets the ZLIB compression level (0-9) to use for compressing websocket frames, set to 0 to disable if HTTP compression is already handled through a reverse proxy. You almost definitely need some level of compression for the game to be playable on WiFi networks. -- **`download_vanilla_skins_to_clients:`** Boolean, default value is `true`, sets if the server should download the textures of custom skulls and skins of vanilla online-mode players from Mojang's servers to cache locally and send to all EaglercraftX clients on the server that attempt to render them. -- **`valid_skin_download_urls:`** List of strings, default includes only `'textures.minecraft.net'`, sets the allowed domains to download custom skulls and skins from that are requested by EaglercraftX clients, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`uuid_lookup_ratelimit_player:`** Integer, default value is `50`, limit of how many Mojang API UUID-to-profile lookups a single player is allowed to trigger per minute, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`uuid_lookup_ratelimit_global:`** Integer, default value is `175`, limit of how many Mojang API UUID-to-profile lookups the entire server is allowed to perform per minute, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`skin_download_ratelimit_player:`** Integer, default value is `1000`, limit of how many texture downloads a single player is allowed to trigger per minute, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`skin_download_ratelimit_global:`** Integer, default value is `30000`, limit of how many texture downloads the entire server is allowed to perform per minute, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`skin_cache_db_uri:`** String, default value is `'jdbc:sqlite:eaglercraft_skins_cache.db'`, can be used to change the location of the SQLite database used as a cache for skins and profiles, or to make the server use an entirely different SQL database like MySQL to store the data instead, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`skin_cache_keep_objects_days:`** Integer, default value is `45`, sets the max age for textures (skin files) stored in the skin cache database, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`skin_cache_keep_profiles_days:`** Integer, default value is `7`, sets the max age for player profiles stored in the skin cache database, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`skin_cache_max_objects:`** Integer, default value is `32768`, sets the max number of textures (skin files) stored in the skin cache database before the oldest textures begin to be deleted, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`skin_cache_max_profiles:`** Integer, default value is `32768`, sets the max number of player profiles stored in the skin cache database before the oldest profiles begin to be deleted, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`skin_cache_antagonists_ratelimit:`** Integer, default value is `15`, sets the lockout limit for failing skin lookup requests, intended to reduce the effectiveness of some of the more simplistic types denial of service attacks that skids may attempt to perform on the skin download system, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`sql_driver_class:`** String, default value is `'internal'`, which is currently evaluated to `'org.sqlite.JDBC'`, can be used to set the name of the JDBC driver class to use for connecting to the `skin_cache_db_uri` database -- **`sql_driver_path:`** String, default value is `'internal'`, can be used to set the name of the external JAR file where the JDBC driver class to use for connecting to the `skin_cache_db_uri` database can be found, the default `'internal'` value downloads the sqlite-jdbc JAR from maven and loads it automatically, only relevant if `download_vanilla_skins_to_clients` is enabled. -- **`eagler_players_vanilla_skin:`** String, default value is `''` but was originally `'lax1dude'`, can be used to set the skin to apply to EaglercraftX players when a player on Minecraft Java Edition sees them in game. The value is the username of a premium Minecraft account to use the skin from. You cannot use a local PNG file due to the profile signature requirements in vanilla Minecraft clients. -- **`enable_is_eagler_player_property:`** Boolean, default value is `true`, can be used to control if the `isEaglerPlayer` GameProfile property should be added to EaglercraftX players, this property is used to ensure that EaglercraftX players always only display their custom skins when viewed by another EaglercraftX players on the server instead of showing the skin attached to their Java Edition username, but this property also cause plugins like ViaVersion to crash. -- **`disable_voice_chat_on_servers:`** List of strings, default value is nothing (`[]`), contains a list of names of registered servers on your Velocity proxy that voice chat should show up as "disabled" on. Note that to disable voice globally you should modify `listeners.yml` instead. -- **`disable_fnaw_skins_everywhere:`** Boolean, default value is `false`, can be used to globally disable FNAW skins if your players bitch about them a lot and are too lazy to just disable the FNAW skins locally on their clients. -- **`disable_fnaw_skins_on_servers:`** List of strings, default value is nothing (`[]`), contains a list of names of registered servers on your Velocity proxy that the FNAW skins should be disabled on. Good for explicitly disabling them for PVP but allowing them everywhere else. -- **`enable_backend_rpc_api:`** Boolean, default value is `false`, if support for servers running the EaglerXBukkitAPI plugin should be enabled or not. -- **`use_modernized_channel_names:`** Boolean, default value is `false`, if "modernized" plugin channel names compatible with Minecraft 1.13+ should be used for EaglerXBukkitAPI plugin message packets - -### `listeners.yml` - -Defines one or more "listeners" (open ports) for EaglercraftX players to use to join the server. Each listener supports the following configuration options, a lot of which you will already be familiar with if you've ever set up a Velocity for a Java Edition server before: - -- **`address:`** String, default value is `0.0.0.0:8081`, sets the primary IPv4/port for EaglerXVelocity to listen on. -- **`address_v6:`** String, default value is `'null'`, sets the primary IPv6/port for EaglerXVelocity to listen on. -- **`max_players:`** Integer, default value is `60`, sets the maximum number of players that can join the server through this listener, set to `-1` to disable the limit. -- **`forward_ip:`** Boolean, default value is `false`, sets if connections to this listener will use an HTTP header to forward the player's real IP address from a reverse proxy (or CloudFlare) to the Velocity server. This is required for EaglerXVelocity's rate limiting and a lot of plugins to work correctly if they are used behind a reverse HTTP proxy or CloudFlare. -- **`forward_ip_header:`** String, default value is `X-Real-IP`, sets the name of the request header that contains the player's real IP address if the `forward_ip` option is enabled. This option is commonly set to `X-Forwarded-For` or `CF-Connecting-IP` for a lot of server setups. -- **`redirect_legacy_clients_to:`** String, default value is `'null'`, sets the WebSocket address to redirect legacy Eaglercraft 1.5.2 clients to if they mistakenly try to join the server through this listener. -- **`server_icon:`** String, default value is `server-icon.png`, sets the name of the 64x64 PNG file to display as this listener's server icon, relative to the working directory of the Velocity proxy server. -- **`server_motd:`** List of up to 2 strings, default value is `'&6An EaglercraftX server'`, sets the contents of the listener's MOTD, which is the text displayed along with the `server_icon` when players add this server's listener address to their client's Multiplayer menu server list. -- **`allow_motd:`** Boolean, default value is `true`, if this listener should respond to MOTD queries or not. -- **`allow_query:`** Boolean, default value is `true`, if this listener should respond to all other types of queries or not. -- **`min_minecraft_protocol:`** Integer, default value is `47`, sets the minimum Minecraft [protocol version](https://wiki.vg/Protocol_version_numbers) that EaglercraftX-based clients are allowed to connect with (`47` = 1.8) -- **`max_minecraft_protocol:`** Integer, default value is `340`, sets the maximum Minecraft protocol version that EaglercraftX-based clients are allowed to connect with (`340` = 1.12.2) -- **`allow_protocol_v3:`** Boolean, default value is `true`, if this listener should allow clients using the v1/v2/v3 protocols to join (pre-u37 clients). -- **`allow_protocol_v4:`** Boolean, default value is `true`, if this listener should allow clients using the v4 protocol to join (post-u37 clients). -- **`protocol_v4_defrag_send_delay:`** Integer, default value is `10`, the number of milliseconds to wait before flushing all pending EaglercraftX plugin message packets, saves bandwidth by combining multiple messages into a single plugin message packet. Setting this to `0` has the same effect on clientbound packets as setting `eaglerNoDelay` to `true` does on a post-u37 client for all serverbound packets. -- **`use_haproxy_protocol:`** Boolean, default value is `false`, can be used to enable support for the HAProxy proxy protocol. Make sure to also add the `check`, `check-send-proxy`, and `send-proxy-v2` parameters to your `server` directives in the HAProxy config file. -- **`allow_cookie_revoke_query:`** Boolean, default value is `true`, If this listener should accept queries from post-u37 clients to revoke session tokens, you need to create your own Velocity plugin to go with EaglerXVelocity that handles the `EaglercraftRevokeSessionQueryEvent` event it fires in order for this feature to work correctly. -- **`request_motd_cache:`** Section that defines caching hints for server lists that cache the MOTD via the `MOTD.cache` query. As far as we know, not even the official Eaglercraft Server List on eaglercraft.com currently pays attention to these hints or attempts to cache MOTDs, so they can be ignored for now. - - **`cache_ttl:`** Integer, default value is `7200`, sets how many seconds for the server list to store the MOTD in cache. - - **`online_server_list_animation:`** Boolean, default is `false`, if the MOTD should be cached in an "animated format" that is yet to be standardized. - - **`online_server_list_results:`** Boolean, default is `true`, if the MOTD should be cached when shown in search results. - - **`online_server_list_trending:`** Boolean, default is `true`, if the MOTD should be cached if the server makes it to the top of the homepage. - - **`online_server_list_portfolios:`** Boolean, default is `false`, if the MOTD should be cached when viewing more details about the specific server. -- **`http_server:`** Section that defines settings for the integrated HTTP server, used to make the listener behave as a normal HTTP server when a non-WebSocket request is recieved (like when the listener address is entered into a browser's address bar). These options can be used to replace the "404 WebSocket Upgrade Failure" message with a custom HTML file instead. - - **`enabled:`** Boolean, default value is `false`, if this is set to true then the default "404 WebSocket Upgrade Failure" page will be disabled and replaced with the integrated file-based HTTP server, perfect for hosting a copy of the EaglercraftX client. - - **`root:`** String, default value is `web`, sets the folder that contains the HTTP server's document root, this is relative to the `plugins/EaglercraftXVelocity` folder where the config files are stored. - - **`page_404_not_found:`** String, default value is `'default'`, can be used to replace the HTTP server's 404 page. - - **`page_index_name:`** List of strings, default values are `'index.html'` and `'index.htm'`, can be used to specify the name of index.html. -- **`allow_voice:`** Boolean, default is `false`, sets if voice should show up as "disabled" for players using this listener. Voice is not recommended for public servers since little to no consideration was given to actually validating the contents of signaling packets sent between clients. -- **`ratelimit:`** Section containing rate limiting configurations for several different connection types. - - **`ip:`** Global ratelimit imposed on all connection types. - - **`login:`** Sets ratelimit on login (server join) attempts. - - **`motd:`** Sets ratelimit on MOTD query types. - - **`query:`** Sets ratelimit on all other query types. - - **`enable:`** If the rate limit (ip/login/motd/query) should be enabled. - - **`period:`** Sets the period in the number of seconds. - - **`limit:`** Sets the number of requests a single IP address can send in `period` seconds before being limited. - - **`limit_lockout:`** Sets the number of requests a single IP address can send in `period` seconds before being locked out. - - **`lockout_duration:`** Sets the total number of seconds a "lock out" should last on this limiter. - -### `authservice.yml` - -The authservice.yml file is used for configuring the built-in online mode authentication service included with the plugin or to integrate with a 3rd party authentication system provided by another plugin. - -- **`enable_authentication_system:`** Boolean, default is `true`, if the events for the authentication protocol should be enabled. -- **`use_onboard_eaglerx_system:`** Boolean, default is `true`, if the built-in online mode authentication system should be enabled. -- **`auth_db_uri:`** String, default value is `'jdbc:sqlite:eaglercraft_auths.db'`, can be used to change the location of the SQLite database used for the built-in online mode authentication system, or to make the server use an entirely different SQL database like MySQL to store the data instead. -- **`sql_driver_class:`** String, default value is `'internal'`, see the description of the `settings.yml` option with the same name. -- **`sql_driver_path:`** String, default value is `'internal'`, see the description of the `settings.yml` option with the same name. -- **`password_prompt_screen_text:`** String, default value is `'Enter your password to join:'`, text displayed on the EaglercraftX client's password screen when joining the server with the built-in online mode authentication system. -- **`wrong_password_screen_text:`** String, default value is `'Password Incorrect!'`, text displayed if the wrong password is entered on the EaglercraftX client's password screen when joining the server with the built-in online mode authentication system. -- **`not_registered_screen_text:`** String, default value is `'You are not registered on this server!'`, text displayed when joining the server with the built-in online mode authentication system when using an account that has not been registered. -- **`eagler_command_name:`** String, default value is `'eagler'`, the name of the command to use for registering and/or logging in when joining the server with the built-in online mode authentication system. -- **`use_register_command_text:`** String, default value is `'&aUse /eagler to set an Eaglercraft password on this account'`, localization for when players use the `/eagler` command on the server. -- **`use_change_command_text:`** String, default value is `'&bUse /eagler to change your Eaglercraft password'`, localization for when players use the `/eagler` command on the server. -- **`command_success_text:`** String, default value is `'&bYour eagler password was changed successfully.'`, localization for when players use the `/eagler` command on the server. -- **`last_eagler_login_message:`** String, default value is `'Your last Eaglercraft login was on $date from $ip'`, localization for when players join the server with the built-in online mode authentication system. -- **`too_many_registrations_message:`** String, default value is `'&cThe maximum number of registrations has been reached for your IP address'`, localization for when players use the `/eagler` command on the server. -- **`need_vanilla_to_register_message:`** String, default value is `'&cYou need to log in with a vanilla account to use this command'`, localization for when players use the `/eagler` command on the server. -- **`override_eagler_to_vanilla_skins:`** Boolean, default value is `false`, if players who join the server after registering with an online mode account should show the same skin as the online-mode account they registered with. -- **`max_registration_per_ip:`** Integer, default value is `-1`, if greater than 0 it specifies the max number of accounts that can be created per IP address on the server with the built-in online mode authentication system. - -### `ice_servers.yml` - -The ice_servers.yml file is used for configuring the set of STUN/TURN servers that clients on this server should use for voice chat. Beware the default "openrelayproject" TURN servers are no longer active as of 2024, most likely as a result of being the default ond only TURN servers shipped with every copy of Eaglercraft to ever use WebRTC in some way. - -- **`voice_servers_no_passwd:`** List of strings, defines a set of STUN/TURN server URIs to use that don't require a username and password. -- **`voice_servers_passwd:`** Section of sections, defines a set of STUN/TURN server URIs to use that do require a username and password, along with the username and password to use with each one. - -### `updates.yml` - -The updates.yml file is used for configuring the decentralized and totally legal update system used by EaglercraftX clients. - -- **`block_all_client_updates:`** Boolean, default value is `false`, can be used to completely disable the update system. -- **`discard_login_packet_certs:`** Boolean, default value is `false`, can be used to prevent the server from relaying random crowdsourced update certificates that were recieved from players who joined the server using signed clients. -- **`cert_packet_data_rate_limit:`** Integer, default value is `524288`, can be used to set the global rate limit for how many bytes per second of certificates the server should send to all players. -- **`enable_eagcert_folder:`** Boolean, default value is `true`, can be used to enable or disable the "eagcert" folder used for distributing specific certificates as locally provided .cert files -- **`download_latest_certs:`** Boolean, default value is `true`, can be used to automaticlly download the latest certificates to the "eagcert" folder -- **`download_certs_from:`** List of strings, defines the URLs to download the certificates from if `download_latest_certs` is enabled -- **`check_for_update_every:`** Integer, default value is `28800` seconds, defines how often to check the URL list for updated certificates - -### `pause_menu/pause_menu.yml` - -For EaglercraftX u37 and up, can be used for changing the appearance of the pause menu and a few other screens with custom icons and strings, also used for enabling the "Server Info" webview and configuring its contents. - -- **`enable_custom_pause_menu:`** Boolean, default value is `false`, if pause menu customization should be enabled on supported clients or not -- **`server_info_button:`** Section, defines properties of the "Server Info" button, which is always hidden unless pause menu customization is enabled - - **`enable_button:`** Boolean, default value is `true`, if the button should be shown or not - - **`button_text:`** String, default value is `'Server Info'`, the text to display on the button, useful if you want to use this feature for something other than a "Server Info" button - - **`button_mode_open_new_tab:`** Boolean, default value is `false`, can be used to make the "Server Info" button act as a hyperlink that opens a URL in a new tab instead of displaying content in an embedded webview iframe in the client. - - **`server_info_embed_url:`** String, default value is `''`, sets the URL for the "Server Info" button to use if it should open a URL in a new tab or the webview instead of directly downloading the markup to display from the EaglerXVelocity server itself over the WebSocket. - - **`button_mode_embed_file:`** Boolean, default value is `true`, determines if the "Server Info" button should download the webview markup directly from the EaglerXVelocity server over WebSocket instead of loading an external URL. Cannot be used with `button_mode_open_new_tab`! - - **`server_info_embed_file:`** String, default value is `'server_info.html'`, sets the name of the local file/template containing the markup to display in the "Server Info" webview if it is not in URL mode. - - **`server_info_embed_screen_title:`** String, default value is `'Server Info'`, sets the title string of the screen that displays the webview. - - **`server_info_embed_send_chunk_rate:`** Integer, default value is `1`, defines how many chunks of server info data to send per 250ms when downloading the server info markup to a client. - - **`server_info_embed_send_chunk_size:`** Integer, default value is `24576`, defines the size of each chunk of server info data when it is being downloaded to a client. - - **`enable_template_macros:`** Boolean, default value is `true`, if the server info markup should be processed for any eagler template macros (defined like `` {% arg1 `arg2` ... %} ``) - - **`server_info_embed_template_globals:`** Section, defines a list of additional global variables to use with the template processor - - **`allow_embed_template_eval_macro:`** Boolean, default value is `false`, if the template processor should allow the "eval" macro to be used in the server info markup file (not to be confused with the JavaScript function, although there is never a good reason to use JavaScript's eval function in your code either) - - **`enable_webview_javascript:`** Boolean, default value is `false`, if the server info webview should allow JavaScript to be executed or not. This will display an "allow JavaScript" screen to your players the first time they attempt to view it. - - **`enable_webview_message_api:`** Boolean, default value is `false`, if the server info webview has JavaScript enabled and should be permitted to open a message channel back to your EaglerXVelocity server to exchange arbitrary message packets. This can be used, for example, to implement a dynamic menu on your server using JavaScript and HTML that players can access through the server info webview that integrates directly with your gamemodes. - - **`enable_webview_strict_csp:`** Boolean, default value is `true`, if the `csp` attribute on the webview iframe should be set or not for added security, beware this is not supported on all browsers and will be silently disabled when the client detects it as unsupported. -- **`discord_button:`** Section, can be used to turn the "Invite" (formerly "Open to LAN") button on the pause menu into a "Discord" button that players can click to join your discord server - - **`enable_button:`** Boolean, default value is `true`, sets if the discord button should be enabled or not - - **`button_text:`** String, default value is `'Discord'`, sets the text that should be displayed on the button - - **`button_url:`** String, default value is `'https://invite url here'`, defines the URL to open when the button is pressed -- **`custom_images:`** Section, can be used to add icons to certain buttons, change the backgrounds of some screens, and add watermarks of your server to the inventory and pause menu and such if you're into that. For the best GPU compatibility, use only textures with powers of 2 as dimensions (such as 32x32 pixels), the width and height do not need to match, they just both need to be a power of 2. There is also a limit on the maximum size, icons can be no larger than 255x255 pixels (Effective max power-of-2 is 128x128). Color values will be downsampled to 16bpp and use a magic value to represent transparent pixels when the pause menu customization packet is sent to a client. - - **`icon_title_L:`** String, default value is `''`, sets the icon to show on the left side of the pause menu screen's title - - **`icon_title_R:`** String, default value is `''`, sets the icon to show on the right side of the pause menu screen's title - - **`icon_backToGame_L:`** String, default value is `''`, sets the icon to show on the left side of the "Back to Game" button - - **`icon_backToGame_R:`** String, default value is `''`, sets the icon to show on the right side of the "Back to Game" button - - **`icon_achievements_L:`** String, default value is `''`, sets the icon to show on the left side of the "Achievements" button - - **`icon_achievements_R:`** String, default value is `''`, sets the icon to show on the right side of the "Achievements" button - - **`icon_statistics_L:`** String, default value is `''`, sets the icon to show on the left side of the "Statistics" button - - **`icon_statistics_R:`** String, default value is `''`, sets the icon to show on the right side of the "Statistics" button - - **`icon_serverInfo_L:`** String, default value is `''`, sets the icon to show on the left side of the server info button - - **`icon_serverInfo_R:`** String, default value is `''`, sets the icon to show on the right side of the server info button - - **`icon_options_L:`** String, default value is `''`, sets the icon to show on the left side of the "Options" button - - **`icon_options_R:`** String, default value is `''`, sets the icon to show on the right side of the "Options" button - - **`icon_discord_L:`** String, default value is `''`, sets the icon to show on the left side of the discord button - - **`icon_discord_R:`** String, default value is `''`, sets the icon to show on the right side of the discord button - - **`icon_disconnect_L:`** String, default value is `''`, sets the icon to show on the left side of the "Disconnect" button - - **`icon_disconnect_R:`** String, default value is `''`, sets the icon to show on the right side of the "Disconnect" button - - **`icon_background_pause:`** String, default value is `'test_image.png'`, sets the icon to show as a repeating pattern in the background of the pause menu and related screens. It is especially important for GPU compatibility for this one to be a power-of-2 sized texture. - - **`icon_background_all:`** String, default value is `'test_image.png'`, sets the icon to show as a repeating pattern in the background of all other screens in the game. It is especially important for GPU compatibility for this one to be a power-of-2 sized texture. - - **`icon_watermark_pause:`** String, default value is `''`, sets a watermark to show in the bottom-left corner of the pause menu - - **`icon_watermark_all:`** String, default value is `''`, sets a watermark to show in the bottom-left corner of all other screens in the game - -## Event Types - -The events added by EaglerXVelocity are located in the [`net.lax1dude.eaglercraft.v1_8.plugin.gateway_velocity.api.event`](gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/event) package and can be listened for the same way as you would for a regular Velocity event. When an EaglercraftX 1.8 player joins your server, all the regular Velocity login events are fired by EaglerXVelocity to maintain compatibility with other existing Velocity plugins, however EaglerXVelocity also adds several of its own event types to allow additional Eaglercraft specific features to be accessible through the main Velocity event bus as well. - -- **`EaglercraftWebSocketOpenEvent`** Event that is fired when a new WebSocket connection is first opened to the server (regardless if its a query or actual player login attempt) useful for quickly filtering out new connections based on a specific origin or user agent header. -- **`EaglercraftClientBrandEvent`** Event that is fired when an EaglercraftX player joins, it contains the Eaglercraft client's "brand" and "version" strings along with the origin and user agent headers that can be used to detect 90% of the currently existing skid clients thanks to lax1dude making the base client self-snitch these commonly modified strings. -- **`EaglercraftIsAuthRequiredEvent`** Event that is fired when an EaglercraftX player attempts to join the server while the authentication system is enabled and `use_onboard_eaglerx_system` is `false`, used for implementing custom authentication systems. -- **`EaglercraftHandleAuthPasswordEvent`** Event that is fired when an EaglercraftX player enters a password into the "Authentication Required" screen while the authentication system is enabled and `use_onboard_eaglerx_system` is `false`, used for implementing custom authentication systems. -- **`EaglercraftHandleAuthCookieEvent`** Event that is fired when an EaglercraftX player joins the server with cookies set and while authentication system is enabled and `use_onboard_eaglerx_system` is `false`, you must set cookie auth as allowed while handling "EaglercraftIsAuthRequiredEvent" first for this event to actually be fired, used for implementing custom authentication systems that use cookies to store a session token for auto login. -- **`EaglercraftRevokeSessionQueryEvent`** Event that is fired when a player uses the "Revoke Session Token" feature in a u37 client to invalidate a cookie that was set on their client with the "revoke query supported" bit. Make sure to enable session revoke queries in listeners.yml! -- **`EaglercraftRegisterSkinEvent`** Event that is fired when an EaglercraftX player's skin is recieved, can be used to analyze or modify or replace the skin with a different texture or preset ID if needed. Note that players using pre-u37 clients may not see the modified/replaced skin. -- **`EaglercraftRegisterCapeEvent`** Event that is fired when an EaglercraftX player's cape is recieved, can be used to analyze or modify or replace the cape with a different texture or preset ID if needed. Use preset ID 0 to disable their cape entirely. Note that players using pre-u37 clients may not see the modified/replaced cape. -- **`EaglercraftMOTDEvent`** Event that is fired when a MOTD query request is recieved, used for implement a custom server MOTD handler, or implementing an animated MOTD like the EaglerMOTD plugin. -- **`EaglercraftVoiceStatusChangeEvent`** Event that is fired when `allow_voice` is enabled and a player transitions between voice states (SERVER_DISABLE, DISABLED, ENABLED) cannot be cancelled so it is mostly just useful for logging or displaying some "Rules" in chat. -- **`EaglercraftWebViewChannelEvent`** Event that is fired when the server info webview is open and JavaScript is enabled and the webview opens/closes a new message channel to EaglerXVelocity. -- **`EaglercraftWebViewMessageEvent`** Event that is fired when the server info webview is open and JavaScript is enabled and the webview has already opened a channel to EaglerXVelocity and a new message is recieved on that open channel. - -## Registering Queries - -If you would like to add your own custom `Accept:` query handlers to the proxy (along with MOTD, version, and session revoke) you can register them at startup using the register functions provided by the [`EaglerQueryHandler`](gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/query/EaglerQueryHandler.java) class. - -## EaglerXVelocityAPIHelper - -To help make plugin development easier, a class called [`EaglerXVelocityAPIHelper`](gateway/EaglercraftXVelocity/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/gateway_velocity/api/EaglerXVelocityAPIHelper.java) is included that defines dozens of helper functions for easily and safely interacting with EaglercraftX clients. This is to enable developers to program plugins for EaglerXVelocity servers with minimal knowledge of the actual underlying protocol used by the client for skins and capes and voice and other exclusive features. Its recommended to convert all your existing code to use the `EaglerXVelocityAPIHelper` instead of whatever packet hacks you were doing before it was added when you migrate your network to EaglerXVelocity 1.1.0+. All your existing packet hacks will be broken anyway unless you configure the server to force all u37+ clients to use protocol V3 instead. diff --git a/gateway/EaglercraftXBukkitAPI/.gitignore b/gateway/EaglercraftXBukkitAPI/.gitignore deleted file mode 100644 index e30d0dbd..00000000 --- a/gateway/EaglercraftXBukkitAPI/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -lib/* -.idea/* -*.iml -out/* -/.gradle/ -/.settings/ -.classpath -.project -/build/ -/bin/ diff --git a/gateway/EaglercraftXBukkitAPI/EaglercraftXBukkitAPI-Latest.jar b/gateway/EaglercraftXBukkitAPI/EaglercraftXBukkitAPI-Latest.jar deleted file mode 100644 index 640488b1251f17c38205507fa575efa6815dc583..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118008 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 '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/gateway/EaglercraftXBukkitAPI/gradlew.bat b/gateway/EaglercraftXBukkitAPI/gradlew.bat deleted file mode 100644 index 107acd32..00000000 --- a/gateway/EaglercraftXBukkitAPI/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/gateway/EaglercraftXBukkitAPI/settings.gradle b/gateway/EaglercraftXBukkitAPI/settings.gradle deleted file mode 100644 index 6c86aaf1..00000000 --- a/gateway/EaglercraftXBukkitAPI/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -rootProject.name = 'EaglercraftXBukkitAPI' - diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/EaglerXBukkitAPIListener.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/EaglerXBukkitAPIListener.java deleted file mode 100644 index 7edc6513..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/EaglerXBukkitAPIListener.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper; - -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.plugin.messaging.PluginMessageListener; - -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.EaglerBackendRPCProtocol; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.impl.PlayerDataObj; - -public class EaglerXBukkitAPIListener implements Listener, PluginMessageListener { - - @EventHandler - public void onLoginEvent(PlayerLoginEvent evt) { - PlayerDataObj.setupPlayer(evt.getPlayer()); - } - - @Override - public void onPluginMessageReceived(String channel, Player player, byte[] data) { - PlayerDataObj dataObj; - switch(channel) { - case EaglerBackendRPCProtocol.CHANNEL_NAME: - case EaglerBackendRPCProtocol.CHANNEL_NAME_MODERN: - dataObj = PlayerDataObj.getForPlayer(player); - if(dataObj != null) { - dataObj.firePluginMsgRecievedInternal(data); - } - break; - case EaglerBackendRPCProtocol.CHANNEL_NAME_READY: - dataObj = PlayerDataObj.getForPlayer(player); - if(dataObj != null) { - dataObj.firePluginReadyMsgRecieved(false); - } - break; - case EaglerBackendRPCProtocol.CHANNEL_NAME_READY_MODERN: - dataObj = PlayerDataObj.getForPlayer(player); - if(dataObj != null) { - dataObj.firePluginReadyMsgRecieved(true); - } - default: - break; - } - } - - @EventHandler - public void onQuitEvent(PlayerQuitEvent evt) { - PlayerDataObj dataObj = PlayerDataObj.getForPlayer(evt.getPlayer()); - if(dataObj != null) { - dataObj.firePlayerQuitEventInternal(); - } - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/EaglerXBukkitAPIPlugin.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/EaglerXBukkitAPIPlugin.java deleted file mode 100644 index 4f7319ce..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/EaglerXBukkitAPIPlugin.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper; - -import java.util.Collection; -import java.util.Timer; -import java.util.TimerTask; -import java.util.logging.Logger; - -import org.bukkit.Server; -import org.bukkit.entity.Player; -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.plugin.messaging.Messenger; - -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.EaglerBackendRPCProtocol; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.impl.PlayerDataObj; - -public class EaglerXBukkitAPIPlugin extends JavaPlugin { - - private static EaglerXBukkitAPIPlugin instance = null; - - private Timer timeoutHandler; - - public EaglerXBukkitAPIPlugin() { - instance = this; - } - - @Override - public void onLoad() { - - } - - @Override - public void onEnable() { - EaglerXBukkitAPIListener ls = new EaglerXBukkitAPIListener(); - Server svr = getServer(); - svr.getPluginManager().registerEvents(ls, this); - Messenger msgr = svr.getMessenger(); - boolean registerLegacy = !isPost_v1_13(); - if(registerLegacy) { - try { - msgr.registerOutgoingPluginChannel(this, EaglerBackendRPCProtocol.CHANNEL_NAME); - }catch(Throwable t) { - registerLegacy = false; - } - } - if(!registerLegacy) { - getLogger().warning("Note: Only the modernized plugin channel names can be used for this server!"); - getLogger().warning("Make sure to set \"use_modernized_channel_names: true\" in bungee/velocity plugin settings.yml"); - } - msgr.registerOutgoingPluginChannel(this, EaglerBackendRPCProtocol.CHANNEL_NAME_MODERN); - if(registerLegacy) { - msgr.registerIncomingPluginChannel(this, EaglerBackendRPCProtocol.CHANNEL_NAME, ls); - } - msgr.registerIncomingPluginChannel(this, EaglerBackendRPCProtocol.CHANNEL_NAME_MODERN, ls); - if(registerLegacy) { - msgr.registerIncomingPluginChannel(this, EaglerBackendRPCProtocol.CHANNEL_NAME_READY, ls); - } - msgr.registerIncomingPluginChannel(this, EaglerBackendRPCProtocol.CHANNEL_NAME_READY_MODERN, ls); - if(timeoutHandler == null) { - timeoutHandler = new Timer("EaglerXBukkitAPI: Timeout cleanup thread"); - timeoutHandler.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { - Collection pp = EaglerXBukkitAPIPlugin.this.getServer().getOnlinePlayers(); - if(!pp.isEmpty()) { - long now = System.nanoTime() / 1000000l; - for(Player p : pp) { - PlayerDataObj.getForPlayer(p).fireCheckRequestTimeoutsInternal(now); - } - } - } - }, 0l, 5000l); - } - } - - @Override - public void onDisable() { - getServer().getMessenger().unregisterOutgoingPluginChannel(this); - getServer().getMessenger().unregisterIncomingPluginChannel(this); - if(timeoutHandler != null) { - timeoutHandler.cancel(); - timeoutHandler = null; - } - } - - public static EaglerXBukkitAPIPlugin getEagler() { - return instance; - } - - public static Logger logger() { - return instance.getLogger(); - } - - private boolean isPost_v1_13() { - String[] ver = getServer().getVersion().split("[\\.\\-]"); - if(ver.length >= 2) { - try { - return Integer.parseInt(ver[0]) >= 1 || Integer.parseInt(ver[1]) >= 13; - }catch(NumberFormatException ex) { - } - } - return false; - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/ClientBrandUUIDs.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/ClientBrandUUIDs.java deleted file mode 100644 index e8660dc2..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/ClientBrandUUIDs.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api; - -import java.nio.charset.StandardCharsets; -import java.util.UUID; - -public class ClientBrandUUIDs { - - public static final UUID BRAND_NULL_UUID = new UUID(0l, 0l); - public static final UUID BRAND_VANILLA_UUID = new UUID(0x1DCE015CD384374El, 0x85030A4DE95E5736l); - - public static final UUID BRAND_EAGLERCRAFTX_V4_UUID = makeClientBrandUUID("EaglercraftX"); - public static final UUID BRAND_EAGLERCRAFTX_LEGACY_UUID = makeClientBrandUUIDLegacy("EaglercraftX"); - - public static UUID makeClientBrandUUID(String name) { - return UUID.nameUUIDFromBytes(("EaglercraftXClient:" + name).getBytes(StandardCharsets.UTF_8)); - } - - public static UUID makeClientBrandUUIDLegacy(String name) { - return UUID.nameUUIDFromBytes(("EaglercraftXClientOld:" + name).getBytes(StandardCharsets.UTF_8)); - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/EaglerRPCException.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/EaglerRPCException.java deleted file mode 100644 index 4cd44cd5..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/EaglerRPCException.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api; - -public class EaglerRPCException extends RuntimeException { - - public EaglerRPCException() { - } - - public EaglerRPCException(String message, Throwable cause) { - super(message, cause); - } - - public EaglerRPCException(String message) { - super(message); - } - - public EaglerRPCException(Throwable cause) { - super(cause); - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/EaglerRPCInitException.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/EaglerRPCInitException.java deleted file mode 100644 index df2ad05b..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/EaglerRPCInitException.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api; - -public class EaglerRPCInitException extends EaglerRPCException { - - private int code; - - public EaglerRPCInitException(int code) { - this.code = code; - } - - public EaglerRPCInitException(int code, String message, Throwable cause) { - super(message, cause); - this.code = code; - } - - public EaglerRPCInitException(int code, String message) { - super(message); - this.code = code; - } - - public EaglerRPCInitException(int code, Throwable cause) { - super(cause); - this.code = code; - } - - public int getFailureCodeEagler() { - return code; - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/EnumSubscribeEvents.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/EnumSubscribeEvents.java deleted file mode 100644 index fa11f21a..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/EnumSubscribeEvents.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api; - -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.pkt.client.CPacketRPCSubscribeEvents; - -public enum EnumSubscribeEvents { - - /** @see net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.event.EventWebViewOpenClose */ - EVENT_WEBVIEW_OPEN_CLOSE(CPacketRPCSubscribeEvents.SUBSCRIBE_EVENT_WEBVIEW_OPEN_CLOSE), - - /** @see net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.event.EventWebViewMessage */ - EVENT_WEBVIEW_MESSAGE(CPacketRPCSubscribeEvents.SUBSCRIBE_EVENT_WEBVIEW_MESSAGE), - - /** @see net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.event.EventToggledVoice */ - EVENT_TOGGLE_VOICE(CPacketRPCSubscribeEvents.SUBSCRIBE_EVENT_TOGGLE_VOICE); - - protected static final EnumSubscribeEvents[] _VALUES = values(); - - public final int bit; - - private EnumSubscribeEvents(int bit) { - this.bit = bit; - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/IEaglerRPCCloseHandler.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/IEaglerRPCCloseHandler.java deleted file mode 100644 index 18af0ec8..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/IEaglerRPCCloseHandler.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api; - -public interface IEaglerRPCCloseHandler { - - void handleEvent(IEaglerXBukkitAPI api); - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/IEaglerRPCEventHandler.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/IEaglerRPCEventHandler.java deleted file mode 100644 index 4376c900..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/IEaglerRPCEventHandler.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api; - -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.event.IEaglerRPCEvent; - -public interface IEaglerRPCEventHandler { - - void handleEvent(IEaglerXBukkitAPI api, EnumSubscribeEvents event, T data); - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/IEaglerRPCFuture.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/IEaglerRPCFuture.java deleted file mode 100644 index d3519d5f..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/IEaglerRPCFuture.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api; - -import java.util.concurrent.Executor; - -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; - -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.impl.SameThreadExecutor; - -public interface IEaglerRPCFuture extends ListenableFuture { - - /** - * Warning: Futures.addCallback is recommended! - */ - default void addListener(Runnable runnable) { - addListener(runnable, SameThreadExecutor.SAME_THREAD_EXECUTOR); - } - - default void addCallback(FutureCallback runnable, Executor executor) { - Futures.addCallback(this, runnable, executor); - } - - default void addCallback(FutureCallback runnable) { - Futures.addCallback(this, runnable, SameThreadExecutor.SAME_THREAD_EXECUTOR); - } - - void setExpiresMSFromNow(int millis); - - boolean hasExpired(); - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/IEaglerXBukkitAPI.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/IEaglerXBukkitAPI.java deleted file mode 100644 index e23b337c..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/IEaglerXBukkitAPI.java +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.TimeUnit; - -import org.bukkit.entity.Player; - -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.EaglerBackendRPCProtocol; -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.pkt.EaglerBackendRPCPacket; -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.pkt.client.CPacketRPCNotifBadgeShow; -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.pkt.client.CPacketRPCSetPauseMenuCustom; -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.util.NotificationBadgeBuilder; -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.util.PacketImageData; -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.util.SkinPacketHelper; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.event.IEaglerRPCEvent; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.response.ResponseBytes; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.response.ResponseCookie; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.response.ResponseString; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.response.ResponseUUID; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.response.ResponseVoiceStatus; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.response.ResponseWebViewStatus; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.impl.EaglerXBukkitImpl; - -public interface IEaglerXBukkitAPI { - - public static IEaglerRPCFuture getAPI(Player player) { - IEaglerRPCFuture futureRet = EaglerXBukkitImpl.getAPI(player); - futureRet.setExpiresMSFromNow(EaglerXBukkitImpl.DEFAULT_TIMEOUT); - return futureRet; - } - - public static IEaglerRPCFuture getAPI(Player player, int timeoutMS) { - IEaglerRPCFuture futureRet = EaglerXBukkitImpl.getAPI(player); - futureRet.setExpiresMSFromNow(timeoutMS); - return futureRet; - } - - EaglerBackendRPCProtocol getRPCProtocolVersion(); - - int getEaglerProtocolVersion(); - - boolean isOpen(); - - void closeAPI(); - - Player getPlayer(); - - void sendRPCPacket(EaglerBackendRPCPacket packet); - - default void subscribeEvents(EnumSubscribeEvents...events) { - int bits = 0; - for(int i = 0; i < events.length; ++i) { - bits |= events[i].bit; - } - subscribeEvents(bits); - } - - void subscribeEvents(int events); - - default void unsubscribeEvents(EnumSubscribeEvents...events) { - int bits = 0; - for(int i = 0; i < events.length; ++i) { - bits |= events[i].bit; - } - unsubscribeEvents(bits); - } - - void unsubscribeEvents(int events); - - void unsubscribeAllEvents(); - - int getSubscribedEventsBits(); - - default Set getSubscribedEvents() { - Set ret = new HashSet<>(4); - int bits = getSubscribedEventsBits(); - EnumSubscribeEvents[] enums = EnumSubscribeEvents._VALUES; - for(int i = 0; i < enums.length; ++i) { - if((bits & enums[i].bit) != 0) { - ret.add(enums[i]); - } - } - return ret; - } - - void addEventListener(EnumSubscribeEvents eventType, IEaglerRPCEventHandler handler); - - void removeEventListener(EnumSubscribeEvents eventType, IEaglerRPCEventHandler handler); - - void removeEventListeners(EnumSubscribeEvents eventType); - - void addCloseListener(IEaglerRPCCloseHandler handler); - - void removeCloseListener(IEaglerRPCCloseHandler handler); - - void removeCloseListeners(); - - boolean redirectPlayerSupported(); - - void redirectPlayerToWebSocket(String webSocketURI); - - void setBaseRequestTimeout(int seconds); - - IEaglerRPCFuture requestPlayerProfileUUID(); - - IEaglerRPCFuture requestPlayerRealIP(); - - IEaglerRPCFuture requestPlayerOrigin(); - - IEaglerRPCFuture requestPlayerUserAgent(); - - IEaglerRPCFuture requestPlayerSkinData(); - - IEaglerRPCFuture requestPlayerCapeData(); - - IEaglerRPCFuture requestPlayerCookieData(); - - IEaglerRPCFuture requestPlayerClientBrandStr(); - - IEaglerRPCFuture requestPlayerClientVersionStr(); - - IEaglerRPCFuture requestPlayerClientBrandAndVersionStr(); - - IEaglerRPCFuture requestPlayerClientBrandUUID(); - - IEaglerRPCFuture requestPlayerVoiceStatus(); - - IEaglerRPCFuture requestPlayerWebViewStatus(); - - void sendRawCustomPayloadPacket(String channel, byte[] data); - - default void sendRawEaglerPacketV4(byte[] data) { - sendRawCustomPayloadPacket("EAG|1.8", data); - } - - boolean pauseMenuCustomizationSupported(); - - void setPauseMenuCustomizationState(CPacketRPCSetPauseMenuCustom packet); - - void sendWebViewMessageString(String channelName, String data); - - void sendWebViewMessageBytes(String channelName, byte[] data); - - void forcePlayerSkin(byte[] skinData, boolean notifyOthers); - - default void forcePlayerSkinPreset(int presetID, boolean notifyOthers) { - forcePlayerSkin(SkinPacketHelper.writePresetSkinPacket(presetID), notifyOthers); - } - - default void forcePlayerSkinCustom(int modelId, byte[] texture64x64, boolean notifyOthers) { - forcePlayerSkin(SkinPacketHelper.writeCustomSkinPacket(modelId, texture64x64), notifyOthers); - } - - void forcePlayerCape(byte[] capeData, boolean notifyOthers); - - default void forcePlayerCapePreset(int presetID, boolean notifyOthers) { - forcePlayerCape(SkinPacketHelper.writePresetCapePacket(presetID), notifyOthers); - } - - default void forcePlayerCapeCustom(byte[] texture32x32, boolean notifyOthers) { - forcePlayerCape(SkinPacketHelper.writeCustomCapePacket(texture32x32), notifyOthers); - } - - void setCookieData(byte[] cookieData, int expiresAfterSec, boolean revokeQuerySupported, boolean saveToDisk); - - default void setCookieData(byte[] cookieData, int expiresAfter, TimeUnit expiresTimeUnit, boolean revokeQuerySupported, boolean saveToDisk) { - setCookieData(cookieData, (int)expiresTimeUnit.toSeconds(expiresAfter), revokeQuerySupported, saveToDisk); - } - - default void setCookieData(byte[] cookieData, int expiresAfterSec, boolean revokeQuerySupported) { - setCookieData(cookieData, expiresAfterSec, revokeQuerySupported, true); - } - - default void setCookieData(byte[] cookieData, int expiresAfter, TimeUnit expiresTimeUnit, boolean revokeQuerySupported) { - setCookieData(cookieData, (int)expiresTimeUnit.toSeconds(expiresAfter), revokeQuerySupported, true); - } - - default void setCookieData(byte[] cookieData, int expiresAfterSec) { - setCookieData(cookieData, expiresAfterSec, false, true); - } - - default void setCookieData(byte[] cookieData, int expiresAfter, TimeUnit expiresTimeUnit) { - setCookieData(cookieData, (int)expiresTimeUnit.toSeconds(expiresAfter), false, true); - } - - default void clearCookieData() { - setCookieData(null, 0, false, false); - } - - void setFNAWSkinsEnabled(boolean enabled, boolean force); - - void setFNAWSkinsEnabled(boolean enabled); - - void resetForcedMulti(boolean resetSkin, boolean resetCape, boolean resetFNAWForce, boolean notifyOtherPlayers); - - void resetForcedSkin(boolean notifyOtherPlayers); - - void resetForcedCape(boolean notifyOtherPlayers); - - void resetForcedFNAW(); - - boolean notifSupported(); - - void notifIconRegister(Map iconsToRegister); - - void notifIconRegister(UUID iconUUID, PacketImageData imageData); - - void notifIconRelease(Collection iconsToRelease); - - void notifIconRelease(UUID iconUUID); - - void notifBadgeShow(CPacketRPCNotifBadgeShow packet); - - default void notifBadgeShow(NotificationBadgeBuilder packet) { - notifBadgeShow(packet.buildPacket()); - } - - void notifBadgeHide(UUID badgeUUID); - - void setMeta(String key, T value); - - T getMeta(String key); - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/ImageDataLoader.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/ImageDataLoader.java deleted file mode 100644 index da293656..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/ImageDataLoader.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api; - -import java.awt.Color; -import java.awt.Graphics2D; -import java.awt.RenderingHints; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; - -import javax.imageio.ImageIO; - -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.util.PacketImageData; -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.util.SkinPacketHelper; - -public class ImageDataLoader { - - public static PacketImageData loadPacketImageData(File img) throws IOException { - return loadPacketImageData(ImageIO.read(img), 255, 255); - } - - public static PacketImageData loadPacketImageData(File img, int maxWidth, int maxHeight) throws IOException { - return loadPacketImageData(ImageIO.read(img), maxWidth, maxHeight); - } - - public static PacketImageData loadPacketImageData(BufferedImage img) { - return loadPacketImageData(img, 255, 255); - } - - public static PacketImageData loadPacketImageData(BufferedImage img, int maxWidth, int maxHeight) { - int w = img.getWidth(); - int h = img.getHeight(); - if(w > maxWidth || h > maxHeight) { - float aspectRatio = (float)w / (float)h; - int nw, nh; - if(aspectRatio >= 1.0f) { - nw = (int)(maxWidth / aspectRatio); - nh = maxHeight; - }else { - nw = maxWidth; - nh = (int)(maxHeight * aspectRatio); - } - BufferedImage resized = new BufferedImage(nw, nh, BufferedImage.TYPE_INT_ARGB); - Graphics2D g = (Graphics2D) resized.getGraphics(); - g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); - g.setBackground(new Color(0, true)); - g.clearRect(0, 0, nw, nh); - g.drawImage(img, 0, 0, nw, nh, 0, 0, w, h, null); - g.dispose(); - img = resized; - } - int[] pixels = new int[w * h]; - img.getRGB(0, 0, w, h, pixels, 0, w); - return new PacketImageData(w, h, pixels); - } - - public static byte[] loadCustomSkin(File texture64x64) throws IOException { - return SkinPacketHelper.loadCustomSkin(texture64x64); - } - - public static byte[] loadCustomSkin(InputStream texture64x64) throws IOException { - return SkinPacketHelper.loadCustomSkin(texture64x64); - } - - public static byte[] loadCustomSkin(BufferedImage texture64x64) { - return SkinPacketHelper.loadCustomSkin(texture64x64); - } - - public static byte[] loadCustomCape(File textureNx64) throws IOException { - return SkinPacketHelper.loadCustomCape(textureNx64); - } - - public static byte[] loadCustomCape(InputStream textureNx64) throws IOException { - return SkinPacketHelper.loadCustomCape(textureNx64); - } - - public static byte[] loadCustomCape(BufferedImage textureNx64) { - return SkinPacketHelper.loadCustomCape(textureNx64); - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/event/EventToggledVoice.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/event/EventToggledVoice.java deleted file mode 100644 index 9644515c..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/event/EventToggledVoice.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.event; - -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.EnumSubscribeEvents; - -public class EventToggledVoice implements IEaglerRPCEvent { - - public static enum VoiceState { - SERVER_DISABLE, DISABLED, ENABLED; - } - - public final VoiceState oldVoiceState; - public final VoiceState newVoiceState; - - public EventToggledVoice(VoiceState oldVoiceState, VoiceState newVoiceState) { - this.oldVoiceState = oldVoiceState; - this.newVoiceState = newVoiceState; - } - - @Override - public EnumSubscribeEvents getType() { - return EnumSubscribeEvents.EVENT_TOGGLE_VOICE; - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/event/EventWebViewMessage.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/event/EventWebViewMessage.java deleted file mode 100644 index 35bd5017..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/event/EventWebViewMessage.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.event; - -import java.nio.charset.StandardCharsets; - -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.EnumSubscribeEvents; - -public class EventWebViewMessage implements IEaglerRPCEvent { - - public static enum MessageType { - STRING, BINARY; - } - - public final String channelName; - public final MessageType messageType; - protected final byte[] messageContent; - protected String asString = null; - - public EventWebViewMessage(String channelName, MessageType messageType, byte[] messageContent) { - this.channelName = channelName; - this.messageType = messageType; - this.messageContent = messageContent; - } - - public String getContentStr() { - if(messageType == MessageType.STRING) { - if(asString == null) { - asString = new String(messageContent, StandardCharsets.UTF_8); - } - return asString; - }else { - return null; - } - } - - public byte[] getContentBytes() { - return messageType == MessageType.BINARY ? messageContent : null; - } - - @Override - public EnumSubscribeEvents getType() { - return EnumSubscribeEvents.EVENT_WEBVIEW_MESSAGE; - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/event/EventWebViewOpenClose.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/event/EventWebViewOpenClose.java deleted file mode 100644 index 1fb8bf7b..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/event/EventWebViewOpenClose.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.event; - -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.EnumSubscribeEvents; - -public class EventWebViewOpenClose implements IEaglerRPCEvent { - - public final String channelName; - public final boolean opened; - - public EventWebViewOpenClose(String channelName, boolean opened) { - this.channelName = channelName; - this.opened = opened; - } - - @Override - public EnumSubscribeEvents getType() { - return EnumSubscribeEvents.EVENT_WEBVIEW_OPEN_CLOSE; - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/event/IEaglerRPCEvent.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/event/IEaglerRPCEvent.java deleted file mode 100644 index 34cdd95d..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/event/IEaglerRPCEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.event; - -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.EnumSubscribeEvents; - -public interface IEaglerRPCEvent { - - EnumSubscribeEvents getType(); - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/EaglerRPCResponseException.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/EaglerRPCResponseException.java deleted file mode 100644 index a6774aa4..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/EaglerRPCResponseException.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.response; - -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.EaglerRPCException; - -public class EaglerRPCResponseException extends EaglerRPCException { - - public EaglerRPCResponseException() { - } - - public EaglerRPCResponseException(String message, Throwable cause) { - super(message, cause); - } - - public EaglerRPCResponseException(String message) { - super(message); - } - - public EaglerRPCResponseException(Throwable cause) { - super(cause); - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/EaglerRPCTimeoutException.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/EaglerRPCTimeoutException.java deleted file mode 100644 index 661d3353..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/EaglerRPCTimeoutException.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.response; - -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.EaglerRPCException; - -public class EaglerRPCTimeoutException extends EaglerRPCException { - - public EaglerRPCTimeoutException() { - } - - public EaglerRPCTimeoutException(String message) { - super(message); - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/IEaglerRPCResponse.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/IEaglerRPCResponse.java deleted file mode 100644 index a61fe8bb..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/IEaglerRPCResponse.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.response; - -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.IEaglerXBukkitAPI; - -public interface IEaglerRPCResponse { - - IEaglerXBukkitAPI getSource(); - - int getRequestID(); - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseBytes.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseBytes.java deleted file mode 100644 index 2ed51b61..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseBytes.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.response; - -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.IEaglerXBukkitAPI; - -public class ResponseBytes implements IEaglerRPCResponse { - - protected final IEaglerXBukkitAPI source; - protected final int requestID; - public final byte[] bytes; - - public ResponseBytes(IEaglerXBukkitAPI source, int requestID, byte[] bytes) { - this.source = source; - this.requestID = requestID; - this.bytes = bytes; - } - - @Override - public IEaglerXBukkitAPI getSource() { - return source; - } - - @Override - public int getRequestID() { - return requestID; - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseCookie.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseCookie.java deleted file mode 100644 index c0fd9bd5..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseCookie.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.response; - -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.IEaglerXBukkitAPI; - -public class ResponseCookie implements IEaglerRPCResponse { - - protected final IEaglerXBukkitAPI source; - protected final int requestID; - public final boolean cookieEnabled; - public final byte[] cookieBytes; - - public ResponseCookie(IEaglerXBukkitAPI source, int requestID, boolean cookieEnabled, byte[] cookieBytes) { - this.source = source; - this.requestID = requestID; - this.cookieEnabled = cookieEnabled; - this.cookieBytes = cookieBytes; - } - - @Override - public IEaglerXBukkitAPI getSource() { - return source; - } - - @Override - public int getRequestID() { - return requestID; - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseString.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseString.java deleted file mode 100644 index 316ea31e..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseString.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.response; - -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.IEaglerXBukkitAPI; - -public class ResponseString implements IEaglerRPCResponse { - - protected final IEaglerXBukkitAPI source; - protected final int requestID; - public final String string; - - public ResponseString(IEaglerXBukkitAPI source, int requestID, String string) { - this.source = source; - this.requestID = requestID; - this.string = string; - } - - @Override - public IEaglerXBukkitAPI getSource() { - return source; - } - - @Override - public int getRequestID() { - return requestID; - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseUUID.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseUUID.java deleted file mode 100644 index 699cf326..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseUUID.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.response; - -import java.util.UUID; - -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.IEaglerXBukkitAPI; - -public class ResponseUUID implements IEaglerRPCResponse { - - protected final IEaglerXBukkitAPI source; - protected final int requestID; - public final UUID uuid; - - public ResponseUUID(IEaglerXBukkitAPI source, int requestID, UUID uuid) { - this.source = source; - this.requestID = requestID; - this.uuid = uuid; - } - - @Override - public IEaglerXBukkitAPI getSource() { - return source; - } - - @Override - public int getRequestID() { - return requestID; - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseVoiceStatus.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseVoiceStatus.java deleted file mode 100644 index a98f852c..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseVoiceStatus.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.response; - -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.IEaglerXBukkitAPI; - -public class ResponseVoiceStatus implements IEaglerRPCResponse { - - public static enum VoiceState { - SERVER_DISABLE, DISABLED, ENABLED; - } - - protected final IEaglerXBukkitAPI source; - protected final int requestID; - public final VoiceState voiceState; - - public ResponseVoiceStatus(IEaglerXBukkitAPI source, int requestID, VoiceState voiceState) { - this.source = source; - this.requestID = requestID; - this.voiceState = voiceState; - } - - @Override - public IEaglerXBukkitAPI getSource() { - return source; - } - - @Override - public int getRequestID() { - return requestID; - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseWebViewStatus.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseWebViewStatus.java deleted file mode 100644 index c99550fc..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/api/response/ResponseWebViewStatus.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.response; - -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.IEaglerXBukkitAPI; - -public class ResponseWebViewStatus implements IEaglerRPCResponse { - - public static enum WebViewState { - NOT_SUPPORTED, SERVER_DISABLE, CHANNEL_CLOSED, CHANNEL_OPEN; - } - - protected final IEaglerXBukkitAPI source; - protected final int requestID; - public final WebViewState webviewState; - public final String channelName; - - public ResponseWebViewStatus(IEaglerXBukkitAPI source, int requestID, WebViewState webviewState, String channelName) { - this.source = source; - this.requestID = requestID; - this.webviewState = webviewState; - this.channelName = channelName; - } - - @Override - public IEaglerXBukkitAPI getSource() { - return source; - } - - @Override - public int getRequestID() { - return requestID; - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/EaglerRPCFutureImpl.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/EaglerRPCFutureImpl.java deleted file mode 100644 index 601d3a77..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/EaglerRPCFutureImpl.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.impl; - -import com.google.common.util.concurrent.AbstractFuture; - -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.IEaglerRPCFuture; - -public class EaglerRPCFutureImpl extends AbstractFuture implements IEaglerRPCFuture { - - private volatile long timeStart = -1l; - private volatile int timeoutAfter = -1; - - @Override - public void setExpiresMSFromNow(int millis) { - if(millis > 0) { - timeStart = System.nanoTime() / 1000000l; - timeoutAfter = millis; - }else { - timeStart = -1l; - timeoutAfter = -1; - } - } - - @Override - public boolean hasExpired() { - return (timeStart > 0l && timeoutAfter > 0) ? ((System.nanoTime() / 1000000l) - timeStart) > timeoutAfter : false; - } - - public boolean hasExpiredBetter(long now) { - return (timeStart > 0l && timeoutAfter > 0) ? (now - timeStart) > timeoutAfter : false; - } - - public void fireCompleteInternal(V value) { - this.set(value); - } - - public void fireExceptionInternal(Throwable value) { - this.setException(value); - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/EaglerXBukkitImpl.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/EaglerXBukkitImpl.java deleted file mode 100644 index 78ecfe06..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/EaglerXBukkitImpl.java +++ /dev/null @@ -1,789 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.impl; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.locks.ReentrantLock; -import java.util.logging.Level; - -import org.bukkit.entity.Player; - -import com.google.common.collect.ListMultimap; -import com.google.common.collect.MultimapBuilder.ListMultimapBuilder; - -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.EaglerBackendRPCProtocol; -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.pkt.EaglerBackendRPCHandler; -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.pkt.EaglerBackendRPCPacket; -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.pkt.client.*; -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.pkt.server.*; -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.util.PacketImageData; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.EaglerXBukkitAPIPlugin; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.EaglerRPCException; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.EnumSubscribeEvents; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.IEaglerRPCCloseHandler; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.IEaglerRPCEventHandler; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.IEaglerRPCFuture; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.IEaglerXBukkitAPI; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.event.*; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.response.*; - -public class EaglerXBukkitImpl implements IEaglerXBukkitAPI { - - public static final int DEFAULT_TIMEOUT = 10000; - - public static EaglerRPCFutureImpl getAPI(Player player) { - if(player == null) { - throw new NullPointerException("Player cannot be null!"); - } - PlayerDataObj data = PlayerDataObj.getForPlayer(player); - if(data == null) { - throw new IllegalStateException("Player object is not ready yet for EaglerXBukkitAPI.createAPI()! (Try hooking PlayerJoinEvent instead of PlayerLoginEvent you hooker)"); - } - boolean sendHello; - synchronized(data) { - if(data.openFuture != null) { - return data.openFuture; - } - if(data.currentAPI != null) { - EaglerRPCFutureImpl completeImmedately = new EaglerRPCFutureImpl(); - completeImmedately.fireCompleteInternal(data.currentAPI); - return completeImmedately; - } - data.openFuture = new EaglerRPCFutureImpl(); - sendHello = data.hasRecievedReady; - } - if(sendHello) { - sendHelloPacket(data.pluginChName, player); - } - return data.openFuture; - } - - protected static void sendHelloPacket(String channel, Player player) { - player.sendPluginMessage(EaglerXBukkitAPIPlugin.getEagler(), channel, HelloPacketFactory.BASE_HELLO_PACKET); - } - - protected static EaglerXBukkitImpl createFromHandshakeInternal(PlayerDataObj playerDataObj, SPacketRPCEnabledSuccess pkt) { - return new EaglerXBukkitImpl(playerDataObj, EaglerBackendRPCProtocol.getByID(pkt.selectedRPCProtocol), pkt.playerClientProtocol); - } - - protected final PlayerDataObj playerDataObj; - protected final Player playerObj; - protected final EaglerBackendRPCProtocol protocol; - protected final int gameProtocol; - protected boolean open; - protected final Map metadata = new ConcurrentHashMap<>(4); - protected final EaglerXBukkitAPIHandler packetHandler; - protected int subscribedEvents = 0; - protected final ListMultimap> eventHandlers = ListMultimapBuilder - .hashKeys().arrayListValues().build(); - protected final List closeHandlers = new ArrayList<>(4); - protected final Map> waitingRequests = new ConcurrentHashMap<>(); - protected int baseTimeout = DEFAULT_TIMEOUT; - protected final AtomicInteger requestIDGenerator = new AtomicInteger(); - private final ReentrantLock inputStreamLock = new ReentrantLock(); - private final ReentrantLock outputStreamLock = new ReentrantLock(); - private final ReusableByteArrayInputStream reusableInputStream = new ReusableByteArrayInputStream(); - private final ReusableByteArrayOutputStream reusableOutputStream = new ReusableByteArrayOutputStream(); - private final DataInputStream dataInputStream = new DataInputStream(reusableInputStream); - private final DataOutputStream dataOutputStream = new DataOutputStream(reusableOutputStream); - - protected EaglerXBukkitImpl(PlayerDataObj playerDataObj, EaglerBackendRPCProtocol protocol, int gameProtocol) { - this.playerDataObj = playerDataObj; - this.playerObj = playerDataObj.player; - this.protocol = protocol; - this.gameProtocol = gameProtocol; - this.open = true; - this.packetHandler = new EaglerXBukkitAPIHandler(); - } - - @Override - public EaglerBackendRPCProtocol getRPCProtocolVersion() { - return protocol; - } - - @Override - public int getEaglerProtocolVersion() { - return gameProtocol; - } - - @Override - public boolean isOpen() { - return open; - } - - @Override - public void closeAPI() { - if(open) { - try { - sendRPCPacket(new CPacketRPCDisabled()); - }finally { - fireAPIClosedEventInternal(); - } - } - } - - protected void fireAPIClosedEventInternal() { - if(!open) return; - open = false; - synchronized(closeHandlers) { - for(int i = 0, l = closeHandlers.size(); i < l; ++i) { - IEaglerRPCCloseHandler hd = closeHandlers.get(i); - try { - hd.handleEvent(this); - }catch(Throwable t) { - EaglerXBukkitAPIPlugin.logger().log(Level.SEVERE, - "[" + playerObj.getName() + "] caught exception while firing close handler " + hd, t); - } - } - } - } - - protected void fireAPIPacketRecievedInternal(EaglerBackendRPCPacket ret) { - ret.handlePacket(packetHandler); - } - - protected void fireEventHandlers(T eventObj) { - EnumSubscribeEvents type = eventObj.getType(); - List> lst; - synchronized(eventHandlers) { - lst = eventHandlers.get(type); - } - for(int i = 0, l = lst.size(); i < l; ++i) { - IEaglerRPCEventHandler handler = (IEaglerRPCEventHandler) lst.get(i); - try { - handler.handleEvent(this, type, eventObj); - }catch(Throwable t) { - EaglerXBukkitAPIPlugin.logger().log(Level.SEVERE, - "[" + playerObj.getName() + "] caught exception while processing event type " - + type + " using handler " + handler, t); - } - } - } - - protected class EaglerXBukkitAPIHandler implements EaglerBackendRPCHandler { - - public void handleServer(SPacketRPCResponseTypeNull packet) { - EaglerRPCFutureImpl future = waitingRequests.remove(packet.requestID); - if(future != null) { - future.fireCompleteInternal(null); - } - } - - public void handleServer(SPacketRPCResponseTypeBytes packet) { - EaglerRPCFutureImpl future = (EaglerRPCFutureImpl)waitingRequests.remove(packet.requestID); - if(future != null) { - future.fireCompleteInternal(new ResponseBytes(EaglerXBukkitImpl.this, packet.requestID, packet.response)); - } - } - - public void handleServer(SPacketRPCResponseTypeString packet) { - EaglerRPCFutureImpl future = (EaglerRPCFutureImpl)waitingRequests.remove(packet.requestID); - if(future != null) { - future.fireCompleteInternal(new ResponseString(EaglerXBukkitImpl.this, packet.requestID, packet.response)); - } - } - - public void handleServer(SPacketRPCResponseTypeUUID packet) { - EaglerRPCFutureImpl future = (EaglerRPCFutureImpl)waitingRequests.remove(packet.requestID); - if(future != null) { - future.fireCompleteInternal(new ResponseUUID(EaglerXBukkitImpl.this, packet.requestID, packet.uuid)); - } - } - - public void handleServer(SPacketRPCResponseTypeCookie packet) { - EaglerRPCFutureImpl future = (EaglerRPCFutureImpl)waitingRequests.remove(packet.requestID); - if(future != null) { - future.fireCompleteInternal(new ResponseCookie(EaglerXBukkitImpl.this, packet.requestID, packet.cookiesEnabled, packet.cookieData)); - } - } - - public void handleServer(SPacketRPCResponseTypeVoiceStatus packet) { - EaglerRPCFutureImpl future = (EaglerRPCFutureImpl)waitingRequests.remove(packet.requestID); - if(future != null) { - future.fireCompleteInternal(new ResponseVoiceStatus(EaglerXBukkitImpl.this, packet.requestID, translateVoiceState2(packet.voiceState))); - } - } - - public void handleServer(SPacketRPCResponseTypeWebViewStatus packet) { - EaglerRPCFutureImpl future = (EaglerRPCFutureImpl)waitingRequests.remove(packet.requestID); - if(future != null) { - future.fireCompleteInternal(new ResponseWebViewStatus(EaglerXBukkitImpl.this, packet.requestID, translateWebViewState(packet.webviewState), packet.channelName)); - } - } - - public void handleServer(SPacketRPCResponseTypeError packet) { - EaglerRPCFutureImpl future = (EaglerRPCFutureImpl)waitingRequests.remove(packet.requestID); - if(future != null) { - future.fireExceptionInternal(new EaglerRPCResponseException(packet.errorMessage)); - } - } - - public void handleServer(SPacketRPCEventWebViewOpenClose packet) { - if((subscribedEvents & EnumSubscribeEvents.EVENT_WEBVIEW_OPEN_CLOSE.bit) != 0) { - fireEventHandlers(new EventWebViewOpenClose(packet.channelName, packet.channelOpen)); - } - } - - public void handleServer(SPacketRPCEventWebViewMessage packet) { - if((subscribedEvents & EnumSubscribeEvents.EVENT_WEBVIEW_MESSAGE.bit) != 0) { - EventWebViewMessage.MessageType mt; - switch(packet.messageType) { - case SPacketRPCEventWebViewMessage.MESSAGE_TYPE_STRING: - mt = EventWebViewMessage.MessageType.STRING; - break; - case SPacketRPCEventWebViewMessage.MESSAGE_TYPE_BINARY: - mt = EventWebViewMessage.MessageType.BINARY; - break; - default: - return; - } - fireEventHandlers(new EventWebViewMessage(packet.channelName, mt, packet.messageContent)); - } - } - - public void handleServer(SPacketRPCEventToggledVoice packet) { - if((subscribedEvents & EnumSubscribeEvents.EVENT_TOGGLE_VOICE.bit) != 0) { - EventToggledVoice.VoiceState vsOld = translateVoiceState(packet.oldVoiceState); - EventToggledVoice.VoiceState vsNew = translateVoiceState(packet.newVoiceState); - if(vsOld == null || vsNew == null) { - return; - } - fireEventHandlers(new EventToggledVoice(vsOld, vsNew)); - } - } - - } - - private static EventToggledVoice.VoiceState translateVoiceState(int vs) { - switch(vs) { - case SPacketRPCResponseTypeVoiceStatus.VOICE_STATE_SERVER_DISABLE: - return EventToggledVoice.VoiceState.SERVER_DISABLE; - case SPacketRPCResponseTypeVoiceStatus.VOICE_STATE_DISABLED: - return EventToggledVoice.VoiceState.DISABLED; - case SPacketRPCResponseTypeVoiceStatus.VOICE_STATE_ENABLED: - return EventToggledVoice.VoiceState.ENABLED; - default: - return null; - } - } - - private static ResponseVoiceStatus.VoiceState translateVoiceState2(int vs) { - switch(vs) { - case SPacketRPCEventToggledVoice.VOICE_STATE_SERVER_DISABLE: - default: - return ResponseVoiceStatus.VoiceState.SERVER_DISABLE; - case SPacketRPCEventToggledVoice.VOICE_STATE_DISABLED: - return ResponseVoiceStatus.VoiceState.DISABLED; - case SPacketRPCEventToggledVoice.VOICE_STATE_ENABLED: - return ResponseVoiceStatus.VoiceState.ENABLED; - } - } - - private static ResponseWebViewStatus.WebViewState translateWebViewState(int vs) { - switch(vs) { - case SPacketRPCResponseTypeWebViewStatus.WEBVIEW_STATE_NOT_SUPPORTED: - default: - return ResponseWebViewStatus.WebViewState.NOT_SUPPORTED; - case SPacketRPCResponseTypeWebViewStatus.WEBVIEW_STATE_SERVER_DISABLE: - return ResponseWebViewStatus.WebViewState.SERVER_DISABLE; - case SPacketRPCResponseTypeWebViewStatus.WEBVIEW_STATE_CHANNEL_CLOSED: - return ResponseWebViewStatus.WebViewState.CHANNEL_CLOSED; - case SPacketRPCResponseTypeWebViewStatus.WEBVIEW_STATE_CHANNEL_OPEN: - return ResponseWebViewStatus.WebViewState.CHANNEL_OPEN; - } - } - - @Override - public Player getPlayer() { - return playerObj; - } - - @Override - public void sendRPCPacket(EaglerBackendRPCPacket packet) { - if(!open) { - EaglerXBukkitAPIPlugin.logger().warning("[" + playerObj.getName() + "] Sent " + packet.getClass().getSimpleName() + " on a dead connection!"); - return; - } - if(packet == null) { - throw new NullPointerException("Packet cannot be null!"); - } - byte[] ret; - int len = packet.length() + 1; - if(outputStreamLock.tryLock()) { - try { - reusableOutputStream.feedBuffer(new byte[len > 0 ? len : 64]); - try { - protocol.writePacket(dataOutputStream, EaglerBackendRPCProtocol.CLIENT_TO_SERVER, packet); - }catch(IOException ex) { - throw new EaglerRPCException("Failed to serialize packet: " + packet.getClass().getSimpleName(), ex); - } - ret = reusableOutputStream.returnBuffer(); - }finally { - outputStreamLock.unlock(); - } - }else { - ReusableByteArrayOutputStream bao = new ReusableByteArrayOutputStream(); - bao.feedBuffer(new byte[len > 0 ? len : 64]); - try { - protocol.writePacket(new DataOutputStream(bao), EaglerBackendRPCProtocol.CLIENT_TO_SERVER, packet); - }catch(IOException ex) { - throw new EaglerRPCException("Failed to serialize packet: " + packet.getClass().getSimpleName(), ex); - } - ret = bao.returnBuffer(); - } - if(len > 0 && len != ret.length) { - EaglerXBukkitAPIPlugin.logger() - .warning("[" + playerObj.getName() + "] Packet type " + packet.getClass().getSimpleName() - + " was the wrong length after serialization: " + ret.length + " != " + len); - } - playerObj.sendPluginMessage(EaglerXBukkitAPIPlugin.getEagler(), playerDataObj.pluginChName, ret); - } - - protected EaglerBackendRPCPacket decodePacket(byte[] data) throws IOException { - EaglerBackendRPCPacket ret; - if(inputStreamLock.tryLock()) { - try { - reusableInputStream.feedBuffer(data); - ret = protocol.readPacket(dataInputStream, EaglerBackendRPCProtocol.SERVER_TO_CLIENT); - }finally { - inputStreamLock.unlock(); - } - }else { - ReusableByteArrayInputStream bai = new ReusableByteArrayInputStream(); - bai.feedBuffer(data); - ret = protocol.readPacket(new DataInputStream(bai), EaglerBackendRPCProtocol.SERVER_TO_CLIENT); - } - return ret; - } - - @Override - public void subscribeEvents(int events) { - int newEvents = subscribedEvents | events; - if(newEvents != subscribedEvents) { - sendRPCPacket(new CPacketRPCSubscribeEvents(newEvents)); - subscribedEvents = events; - } - } - - @Override - public void unsubscribeEvents(int events) { - int newEvents = subscribedEvents & ~events; - if(newEvents != subscribedEvents) { - sendRPCPacket(new CPacketRPCSubscribeEvents(newEvents)); - subscribedEvents = events; - } - } - - @Override - public void unsubscribeAllEvents() { - if(subscribedEvents != 0) { - sendRPCPacket(new CPacketRPCSubscribeEvents(0)); - subscribedEvents = 0; - } - } - - @Override - public int getSubscribedEventsBits() { - return subscribedEvents; - } - - @Override - public void addEventListener(EnumSubscribeEvents eventType, - IEaglerRPCEventHandler handler) { - synchronized(eventHandlers) { - eventHandlers.put(eventType, handler); - } - } - - @Override - public void removeEventListener(EnumSubscribeEvents eventType, - IEaglerRPCEventHandler handler) { - synchronized(eventHandlers) { - eventHandlers.remove(eventType, handler); - } - } - - @Override - public void removeEventListeners(EnumSubscribeEvents eventType) { - synchronized(eventHandlers) { - eventHandlers.removeAll(eventType); - } - } - - @Override - public void addCloseListener(IEaglerRPCCloseHandler handler) { - synchronized(closeHandlers) { - closeHandlers.add(handler); - } - } - - @Override - public void removeCloseListener(IEaglerRPCCloseHandler handler) { - synchronized(closeHandlers) { - closeHandlers.remove(handler); - } - } - - @Override - public void removeCloseListeners() { - synchronized(closeHandlers) { - closeHandlers.clear(); - } - } - - @Override - public boolean redirectPlayerSupported() { - return gameProtocol >= 4; - } - - @Override - public void redirectPlayerToWebSocket(String webSocketURI) { - if(gameProtocol >= 4) { - if(webSocketURI == null) { - throw new NullPointerException("URI cannot be null!"); - } - sendRPCPacket(new CPacketRPCRedirectPlayer(webSocketURI)); - }else { - EaglerXBukkitAPIPlugin.logger() - .warning("[" + playerObj.getName() + "] some plugin tried to redirect player to \"" + webSocketURI - + "\" but that player's client does not support websocket redirects!"); - } - } - - @Override - public void setBaseRequestTimeout(int seconds) { - baseTimeout = seconds * 1000; - } - - protected IEaglerRPCFuture requestSendHelper(int type) { - EaglerRPCFutureImpl ret = new EaglerRPCFutureImpl(); - ret.setExpiresMSFromNow(baseTimeout); - int rqid = requestIDGenerator.incrementAndGet(); - sendRPCPacket(new CPacketRPCRequestPlayerInfo(rqid, type)); - waitingRequests.put(rqid, ret); - return ret; - } - - @Override - public IEaglerRPCFuture requestPlayerProfileUUID() { - return requestSendHelper(CPacketRPCRequestPlayerInfo.REQUEST_PLAYER_REAL_UUID); - } - - @Override - public IEaglerRPCFuture requestPlayerRealIP() { - return requestSendHelper(CPacketRPCRequestPlayerInfo.REQUEST_PLAYER_REAL_IP); - } - - @Override - public IEaglerRPCFuture requestPlayerOrigin() { - return requestSendHelper(CPacketRPCRequestPlayerInfo.REQUEST_PLAYER_ORIGIN); - } - - @Override - public IEaglerRPCFuture requestPlayerUserAgent() { - return requestSendHelper(CPacketRPCRequestPlayerInfo.REQUEST_PLAYER_USER_AGENT); - } - - @Override - public IEaglerRPCFuture requestPlayerSkinData() { - return requestSendHelper(CPacketRPCRequestPlayerInfo.REQUEST_PLAYER_SKIN_DATA); - } - - @Override - public IEaglerRPCFuture requestPlayerCapeData() { - return requestSendHelper(CPacketRPCRequestPlayerInfo.REQUEST_PLAYER_CAPE_DATA); - } - - @Override - public IEaglerRPCFuture requestPlayerCookieData() { - return requestSendHelper(CPacketRPCRequestPlayerInfo.REQUEST_PLAYER_COOKIE); - } - - @Override - public IEaglerRPCFuture requestPlayerClientBrandStr() { - return requestSendHelper(CPacketRPCRequestPlayerInfo.REQUEST_PLAYER_CLIENT_BRAND_STR); - } - - @Override - public IEaglerRPCFuture requestPlayerClientVersionStr() { - return requestSendHelper(CPacketRPCRequestPlayerInfo.REQUEST_PLAYER_CLIENT_VERSION_STR); - } - - @Override - public IEaglerRPCFuture requestPlayerClientBrandAndVersionStr() { - return requestSendHelper(CPacketRPCRequestPlayerInfo.REQUEST_PLAYER_CLIENT_BRAND_VERSION_STR); - } - - @Override - public IEaglerRPCFuture requestPlayerClientBrandUUID() { - return requestSendHelper(CPacketRPCRequestPlayerInfo.REQUEST_PLAYER_CLIENT_BRAND_UUID); - } - - @Override - public IEaglerRPCFuture requestPlayerVoiceStatus() { - return requestSendHelper(CPacketRPCRequestPlayerInfo.REQUEST_PLAYER_CLIENT_VOICE_STATUS); - } - - @Override - public IEaglerRPCFuture requestPlayerWebViewStatus() { - return requestSendHelper(CPacketRPCRequestPlayerInfo.REQUEST_PLAYER_CLIENT_WEBVIEW_STATUS); - } - - protected void cleanupTimedOutRequests(long now) { - if(!waitingRequests.isEmpty()) { - List> expired = null; - Iterator> itr = waitingRequests.values().iterator(); - while(itr.hasNext()) { - EaglerRPCFutureImpl itm = itr.next(); - if(itm.hasExpiredBetter(now)) { - if(expired == null) { - expired = new ArrayList<>(4); - } - expired.add(itm); - try { - itr.remove(); - }catch(Throwable t) { - } - } - } - if(expired != null) { - for(int i = 0, l = expired.size(); i < l; ++i) { - try { - EaglerRPCFutureImpl itm = expired.get(i); - EaglerXBukkitAPIPlugin.logger().warning("[" + playerObj.getName() + "] An RPC request timed out before it could be completed!"); - itm.fireExceptionInternal(new EaglerRPCTimeoutException("The request was not completed in time!")); - }catch(Throwable t) { - EaglerXBukkitAPIPlugin.logger().log(Level.SEVERE, "[" + playerObj.getName() + "] An unhandled exception was thrown while firing request timeout signal!", t); - } - } - } - } - } - - @Override - public void sendRawCustomPayloadPacket(String channel, byte[] data) { - sendRPCPacket(new CPacketRPCSendRawMessage(channel, data)); - } - - @Override - public boolean pauseMenuCustomizationSupported() { - return gameProtocol >= 4; - } - - @Override - public void setPauseMenuCustomizationState(CPacketRPCSetPauseMenuCustom packet) { - if(gameProtocol >= 4) { - sendRPCPacket(packet); - }else { - EaglerXBukkitAPIPlugin.logger().warning("[" + playerObj.getName() - + "] some plugin tried to configure pause menu customization, but the player's client does not support that feature!"); - } - } - - @Override - public void sendWebViewMessageString(String channelName, String data) { - if(gameProtocol >= 4) { - if(channelName == null) { - throw new NullPointerException("Channel cannot be null!"); - } - if(data == null) { - throw new NullPointerException("Data cannot be null!"); - } - sendRPCPacket(new CPacketRPCSendWebViewMessage(channelName, - CPacketRPCSendWebViewMessage.MESSAGE_TYPE_STRING, data.getBytes(StandardCharsets.UTF_8))); - }else { - EaglerXBukkitAPIPlugin.logger().warning("[" + playerObj.getName() - + "] some plugin tried to send a webview channel message, but the player's client does not support that feature!"); - } - } - - @Override - public void sendWebViewMessageBytes(String channelName, byte[] data) { - if(gameProtocol >= 4) { - if(channelName == null) { - throw new NullPointerException("Channel cannot be null!"); - } - if(data == null) { - throw new NullPointerException("Data cannot be null!"); - } - sendRPCPacket(new CPacketRPCSendWebViewMessage(channelName, CPacketRPCSendWebViewMessage.MESSAGE_TYPE_BINARY, data)); - }else { - EaglerXBukkitAPIPlugin.logger().warning("[" + playerObj.getName() - + "] some plugin tried to send a webview channel message, but the player's client does not support that feature!"); - } - } - - @Override - public void forcePlayerSkin(byte[] skinData, boolean notifyOthers) { - if(skinData == null) { - throw new NullPointerException("Skin data cannot be null!"); - } - if(skinData.length > 32720) { - throw new IllegalArgumentException("Skin data cannot be more than 32720 bytes!"); - } - sendRPCPacket(new CPacketRPCSetPlayerSkin(notifyOthers, skinData)); - } - - @Override - public void forcePlayerCape(byte[] capeData, boolean notifyOthers) { - if(capeData == null) { - throw new NullPointerException("Cape data cannot be null!"); - } - if(capeData.length > 32720) { - throw new IllegalArgumentException("Cape data cannot be more than 32720 bytes!"); - } - sendRPCPacket(new CPacketRPCSetPlayerCape(notifyOthers, capeData)); - } - - @Override - public void setCookieData(byte[] cookieData, int expiresAfterSec, boolean revokeQuerySupported, - boolean saveToDisk) { - if(gameProtocol >= 4) { - sendRPCPacket(new CPacketRPCSetPlayerCookie(revokeQuerySupported, saveToDisk, expiresAfterSec, cookieData)); - }else { - EaglerXBukkitAPIPlugin.logger().warning("[" + playerObj.getName() - + "] some plugin tried to set a cookie, but the player's client does not support that feature!"); - } - } - - @Override - public void setFNAWSkinsEnabled(boolean enabled, boolean force) { - sendRPCPacket(new CPacketRPCSetPlayerFNAWEn(enabled, force)); - } - - @Override - public void setFNAWSkinsEnabled(boolean enabled) { - sendRPCPacket(new CPacketRPCSetPlayerFNAWEn(enabled, false)); - } - - @Override - public void resetForcedMulti(boolean resetSkin, boolean resetCape, boolean resetFNAWForce, boolean notifyOtherPlayers) { - sendRPCPacket(new CPacketRPCResetPlayerMulti(resetSkin, resetCape, resetFNAWForce, notifyOtherPlayers)); - } - - @Override - public void resetForcedSkin(boolean notifyOtherPlayers) { - sendRPCPacket(new CPacketRPCResetPlayerMulti(true, false, false, notifyOtherPlayers)); - } - - @Override - public void resetForcedCape(boolean notifyOtherPlayers) { - sendRPCPacket(new CPacketRPCResetPlayerMulti(false, true, false, notifyOtherPlayers)); - } - - @Override - public void resetForcedFNAW() { - sendRPCPacket(new CPacketRPCResetPlayerMulti(false, false, true, false)); - } - - @Override - public boolean notifSupported() { - return gameProtocol >= 4; - } - - @Override - public void notifIconRegister(Map iconsToRegister) { - if(gameProtocol >= 4) { - sendRPCPacket(new CPacketRPCNotifIconRegister(iconsToRegister)); - }else { - EaglerXBukkitAPIPlugin.logger().warning("[" + playerObj.getName() - + "] some plugin tried to register notification icons, but the player's client does not support that feature!"); - } - } - - @Override - public void notifIconRegister(UUID iconUUID, PacketImageData imageData) { - if(gameProtocol >= 4) { - Map toReg = new HashMap<>(1); - toReg.put(iconUUID, imageData); - sendRPCPacket(new CPacketRPCNotifIconRegister(toReg)); - }else { - EaglerXBukkitAPIPlugin.logger().warning("[" + playerObj.getName() - + "] some plugin tried to register notification icons, but the player's client does not support that feature!"); - } - } - - @Override - public void notifIconRelease(Collection iconsToRelease) { - if(gameProtocol >= 4) { - sendRPCPacket(new CPacketRPCNotifIconRelease(iconsToRelease)); - }else { - EaglerXBukkitAPIPlugin.logger().warning("[" + playerObj.getName() - + "] some plugin tried to release notification icons, but the player's client does not support that feature!"); - } - } - - @Override - public void notifIconRelease(UUID iconUUID) { - if(gameProtocol >= 4) { - sendRPCPacket(new CPacketRPCNotifIconRelease(Arrays.asList(iconUUID))); - }else { - EaglerXBukkitAPIPlugin.logger().warning("[" + playerObj.getName() - + "] some plugin tried to release notification icons, but the player's client does not support that feature!"); - } - } - - @Override - public void notifBadgeShow(CPacketRPCNotifBadgeShow packet) { - if(gameProtocol >= 4) { - sendRPCPacket(packet); - }else { - EaglerXBukkitAPIPlugin.logger().warning("[" + playerObj.getName() - + "] some plugin tried to show notification badge, but the player's client does not support that feature!"); - } - } - - @Override - public void notifBadgeHide(UUID badgeUUID) { - if(gameProtocol >= 4) { - sendRPCPacket(new CPacketRPCNotifBadgeHide(badgeUUID)); - }else { - EaglerXBukkitAPIPlugin.logger().warning("[" + playerObj.getName() - + "] some plugin tried to hide notification badge, but the player's client does not support that feature!"); - } - } - - @Override - public void setMeta(String key, T value) { - if(key == null) { - throw new NullPointerException("Key cannot be null!"); - } - metadata.put(key, value); - } - - @Override - public T getMeta(String key) { - if(key == null) { - throw new NullPointerException("Key cannot be null!"); - } - return (T)metadata.get(key); - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/HelloPacketFactory.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/HelloPacketFactory.java deleted file mode 100644 index 613fd34c..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/HelloPacketFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.impl; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.io.IOException; - -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.EaglerBackendRPCProtocol; -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.pkt.client.CPacketRPCEnabled; - -public class HelloPacketFactory { - - public static final byte[] BASE_HELLO_PACKET; - - static { - try { - ByteArrayOutputStream bao = new ByteArrayOutputStream(); - DataOutputStream dao = new DataOutputStream(bao); - CPacketRPCEnabled pkt = new CPacketRPCEnabled(new int[] { EaglerBackendRPCProtocol.V1.vers }); - EaglerBackendRPCProtocol.INIT.writePacket(dao, EaglerBackendRPCProtocol.CLIENT_TO_SERVER, pkt); - BASE_HELLO_PACKET = bao.toByteArray(); - }catch(IOException ex) { - throw new RuntimeException(ex); - } - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/PlayerDataObj.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/PlayerDataObj.java deleted file mode 100644 index a678384f..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/PlayerDataObj.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.impl; - -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.IOException; -import java.util.List; -import java.util.logging.Level; - -import org.bukkit.entity.Player; -import org.bukkit.metadata.LazyMetadataValue; -import org.bukkit.metadata.MetadataValue; - -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.EaglerBackendRPCProtocol; -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.pkt.EaglerBackendRPCPacket; -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.pkt.server.SPacketRPCEnabledFailure; -import net.lax1dude.eaglercraft.v1_8.plugin.backend_rpc_protocol.pkt.server.SPacketRPCEnabledSuccess; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.EaglerXBukkitAPIPlugin; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.EaglerRPCException; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.EaglerRPCInitException; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.IEaglerXBukkitAPI; -import net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.api.response.EaglerRPCTimeoutException; - -public class PlayerDataObj { - - public static final String METADATA_BASE = "EXRPC_PDataObj"; - - public final Player player; - - public String pluginChName = null; - - public volatile boolean hasRecievedReady = false; - public volatile boolean isSupported = true; - public volatile EaglerXBukkitImpl currentAPI = null; - - public volatile EaglerRPCFutureImpl openFuture = null; - - public static PlayerDataObj getForPlayer(Player player) { - List vigg = player.getMetadata(METADATA_BASE); - return !vigg.isEmpty() ? (PlayerDataObj)vigg.get(0).value() : null; - } - - public static void setupPlayer(Player player) { - player.setMetadata(METADATA_BASE, new LazyMetadataValue(EaglerXBukkitAPIPlugin.getEagler(), () -> new PlayerDataObj(player))); - } - - protected PlayerDataObj(Player player) { - this.player = player; - } - - public void firePluginReadyMsgRecieved(boolean modern) { - synchronized(this) { - if(!hasRecievedReady) { - hasRecievedReady = true; - pluginChName = modern ? EaglerBackendRPCProtocol.CHANNEL_NAME_MODERN : EaglerBackendRPCProtocol.CHANNEL_NAME; - if(openFuture != null) { - EaglerXBukkitImpl.sendHelloPacket(pluginChName, player); - } - } - } - } - - public void firePluginMsgRecievedInternal(byte[] data) { - EaglerXBukkitImpl apiObj = null; - synchronized(this) { - if(openFuture != null) { - try { - handleOpenResult(openFuture, data); - }finally { - openFuture = null; - } - }else if(currentAPI != null) { - apiObj = currentAPI; - } - } - if(apiObj != null) { - handleAPIMessage(apiObj, data); - } - } - - public void firePlayerQuitEventInternal() { - synchronized(this) { - if(openFuture != null) { - try { - openFuture.fireExceptionInternal(new EaglerRPCException("Player quit before the connection could be established!")); - }finally { - openFuture = null; - } - }else if(currentAPI != null) { - currentAPI.fireAPIClosedEventInternal(); - } - } - } - - private void handleOpenResult(EaglerRPCFutureImpl apiFuture, byte[] data) { - EaglerBackendRPCPacket ret; - try { - ByteArrayInputStream bis = new ByteArrayInputStream(data); - ret = EaglerBackendRPCProtocol.INIT.readPacket(new DataInputStream(bis), EaglerBackendRPCProtocol.SERVER_TO_CLIENT); - if(bis.available() > 0) { - throw new IOException("There were " + bis.available() + " bytes available after reading packet \"" + ret.getClass().getSimpleName() + "\"!"); - } - }catch(IOException ex) { - EaglerXBukkitAPIPlugin.logger().log(Level.SEVERE, "[" + player.getName() + "] Could not parse incoming RPC packet from bungee/velocity server! (protocol: INIT)", ex); - apiFuture.fireExceptionInternal(ex); - return; - } - if(ret instanceof SPacketRPCEnabledSuccess) { - SPacketRPCEnabledSuccess pkt = (SPacketRPCEnabledSuccess)ret; - if(pkt.selectedRPCProtocol != EaglerBackendRPCProtocol.V1.vers) { - try { - // send raw CPacketRPCDisabled - player.sendPluginMessage(EaglerXBukkitAPIPlugin.getEagler(), pluginChName, new byte[] { 0x03 }); - }finally { - apiFuture.fireExceptionInternal(new EaglerRPCException("Server tried to select an unsupported protocol: " + pkt.selectedRPCProtocol)); - } - }else { - currentAPI = EaglerXBukkitImpl.createFromHandshakeInternal(this, pkt); - apiFuture.fireCompleteInternal(currentAPI); - } - }else if(ret instanceof SPacketRPCEnabledFailure) { - SPacketRPCEnabledFailure pkt = (SPacketRPCEnabledFailure)ret; - String msg = "Server responded with failure code: "; - switch(pkt.failureCode) { - case SPacketRPCEnabledFailure.FAILURE_CODE_NOT_ENABLED: - msg += "FAILURE_CODE_NOT_ENABLED"; - break; - case SPacketRPCEnabledFailure.FAILURE_CODE_NOT_EAGLER_PLAYER: - msg += "FAILURE_CODE_NOT_EAGLER_PLAYER"; - break; - case SPacketRPCEnabledFailure.FAILURE_CODE_OUTDATED_SERVER: - msg += "FAILURE_CODE_OUTDATED_SERVER"; - break; - case SPacketRPCEnabledFailure.FAILURE_CODE_OUTDATED_CLIENT: - msg += "FAILURE_CODE_OUTDATED_CLIENT"; - break; - case SPacketRPCEnabledFailure.FAILURE_CODE_INTERNAL_ERROR: - msg += "FAILURE_CODE_INTERNAL_ERROR"; - break; - default: - msg += pkt.failureCode; - break; - } - apiFuture.fireExceptionInternal(new EaglerRPCInitException(pkt.failureCode, msg)); - }else { - EaglerXBukkitAPIPlugin.logger().severe("[" + player.getName() + "] Unknown response type from bungee/velocity to API open request: " + ret.getClass().getSimpleName()); - } - } - - private void handleAPIMessage(EaglerXBukkitImpl apiObj, byte[] data) { - EaglerBackendRPCPacket ret; - try { - ret = apiObj.decodePacket(data); - }catch(IOException ex) { - EaglerXBukkitAPIPlugin.logger().log(Level.SEVERE, "[" + player.getName() + "] Could not parse incoming RPC packet from bungee/velocity server! (protocol: " + apiObj.getRPCProtocolVersion() + ")", ex); - return; - } - apiObj.fireAPIPacketRecievedInternal(ret); - } - - public void fireCheckRequestTimeoutsInternal(long now) { - EaglerXBukkitImpl apiObj; - synchronized(this) { - if(openFuture != null) { - if(openFuture.hasExpiredBetter(now)) { - try { - EaglerXBukkitAPIPlugin.logger().warning("[" + player.getName() + "] An RPC open request timed out before it could be completed!"); - openFuture.fireExceptionInternal(new EaglerRPCTimeoutException("The request was not completed in time!")); - }catch(Throwable t) { - EaglerXBukkitAPIPlugin.logger().log(Level.SEVERE, "[" + player.getName() + "] An unhandled exception was thrown while firing request timeout signal!", t); - }finally { - openFuture = null; - } - } - return; - }else { - apiObj = currentAPI; - } - } - if(apiObj != null) { - apiObj.cleanupTimedOutRequests(now); - } - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/ReusableByteArrayInputStream.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/ReusableByteArrayInputStream.java deleted file mode 100644 index 2506bbac..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/ReusableByteArrayInputStream.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.impl; - -import java.io.IOException; -import java.io.InputStream; - -public class ReusableByteArrayInputStream extends InputStream { - - private volatile byte[] currentBuffer = null; - private int idx = 0; - private int markIDX = 0; - - public void feedBuffer(byte[] b) { - currentBuffer = b; - idx = 0; - markIDX = 0; - } - - @Override - public int read() throws IOException { - if(currentBuffer.length <= idx) throw new IOException("ReusableByteArrayInputStream buffer underflow, no bytes remaining"); - return (int)currentBuffer[idx++] & 0xFF; - } - - @Override - public int read(byte b[], int off, int len) throws IOException { - if(idx + len > currentBuffer.length) { - throw new IOException( - "ReusableByteArrayInputStream buffer underflow, tried to read " + len + " when there are only " - + (currentBuffer.length - idx) + " bytes remaining", - new ArrayIndexOutOfBoundsException(idx + len - 1)); - } - if(off + len > b.length) { - throw new ArrayIndexOutOfBoundsException(off + len - 1); - } - System.arraycopy(currentBuffer, idx, b, off, len); - idx += len; - return len; - } - - public void mark() { - markIDX = idx; - } - - public void reset() { - idx = markIDX; - } - - public int getReaderIndex() { - return idx; - } - - public int available() { - return Math.max(currentBuffer.length - idx, 0); - } - - public void setReaderIndex(int i) { - idx = i; - markIDX = idx; - } - - public boolean markSupported() { - return true; - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/ReusableByteArrayOutputStream.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/ReusableByteArrayOutputStream.java deleted file mode 100644 index 61453561..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/ReusableByteArrayOutputStream.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.impl; - -import java.io.IOException; -import java.io.OutputStream; -import java.util.Arrays; - -public class ReusableByteArrayOutputStream extends OutputStream { - - private volatile byte[] currentBuffer = null; - private int idx = 0; - private int originalSize = 0; - - public void feedBuffer(byte[] buf) { - currentBuffer = buf; - idx = 0; - originalSize = buf == null ? 0 : buf.length; - } - - public boolean hasGrown() { - return currentBuffer.length != originalSize; - } - - public byte[] returnBuffer() { - return currentBuffer.length == idx ? currentBuffer : Arrays.copyOf(currentBuffer, idx); - } - - private void growBuffer(int i) { - int ii = currentBuffer.length; - int iii = i - ii; - if(iii > 0) { - int j = ii + (ii >> 1); - while(j < i) { - j += (j >> 1); - } - byte[] n = new byte[j]; - System.arraycopy(currentBuffer, 0, n, 0, ii); - currentBuffer = n; - } - } - - public int getWriterIndex() { - return idx; - } - - public void setWriterIndex(int i) { - idx = i; - } - - @Override - public void write(int b) throws IOException { - if(idx >= currentBuffer.length) { - growBuffer(idx + 1); - } - currentBuffer[idx++] = (byte) b; - } - - @Override - public void write(byte b[], int off, int len) throws IOException { - if(idx + len > currentBuffer.length) { - growBuffer(idx + len); - } - System.arraycopy(b, off, currentBuffer, idx, len); - idx += len; - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/SameThreadExecutor.java b/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/SameThreadExecutor.java deleted file mode 100644 index 96415894..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/java/net/lax1dude/eaglercraft/v1_8/plugin/bukkit_rpc_helper/impl/SameThreadExecutor.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2024 lax1dude. All Rights Reserved. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -package net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.impl; - -import java.util.concurrent.Executor; - -import com.google.common.util.concurrent.MoreExecutors; - -public class SameThreadExecutor { - - public static final Executor SAME_THREAD_EXECUTOR; - - static { - Executor fuck; - try { - fuck = (Executor) MoreExecutors.class.getDeclaredMethod("newDirectExecutorService").invoke(null); - }catch(Throwable t) { - try { - fuck = (Executor) MoreExecutors.class.getDeclaredMethod("sameThreadExecutor").invoke(null); - }catch(Throwable t2) { - throw new RuntimeException("Google fucked up!", t2); - } - } - SAME_THREAD_EXECUTOR = fuck; - } - -} \ No newline at end of file diff --git a/gateway/EaglercraftXBukkitAPI/src/main/resources/plugin.yml b/gateway/EaglercraftXBukkitAPI/src/main/resources/plugin.yml deleted file mode 100644 index 8faf6097..00000000 --- a/gateway/EaglercraftXBukkitAPI/src/main/resources/plugin.yml +++ /dev/null @@ -1,6 +0,0 @@ -name: EaglercraftXBukkitAPI -version: 1.0.1 -main: net.lax1dude.eaglercraft.v1_8.plugin.bukkit_rpc_helper.EaglerXBukkitAPIPlugin -description: Official EaglercraftX API for Bukkit servers -author: lax1dude -api-version: 1.8 \ No newline at end of file diff --git a/gateway/EaglercraftXBungee/.gitignore b/gateway/EaglercraftXBungee/.gitignore deleted file mode 100644 index 341c9c00..00000000 --- a/gateway/EaglercraftXBungee/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -lib/* -.idea/* -*.iml -out/* -deps/BungeeCord.jar -/.gradle/ -/.settings/ -.classpath -.project -/build/ -/bin/ diff --git a/gateway/EaglercraftXBungee/EaglerXBungee-Latest.jar b/gateway/EaglercraftXBungee/EaglerXBungee-Latest.jar deleted file mode 100644 index ee6f88798cfb31d4fd911774e218baf3fa104600..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 599216 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