From 48b267cecd87ceb80a773e59fa623206fdc16265 Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Mon, 25 Sep 2023 06:03:09 -0700 Subject: [PATCH] Initial commit --- .gitignore | 75 ++ README.md | 31 + build.gradle | 148 +++ data/Banners.json | 27 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59821 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 234 +++++ gradlew.bat | 89 ++ keystore.p12 | Bin 0 -> 2421 bytes lib/kcp.jar | Bin 0 -> 588435 bytes settings.gradle | 10 + src/main/java/emu/lunarcore/Config.java | 79 ++ .../java/emu/lunarcore/GameConstants.java | 22 + src/main/java/emu/lunarcore/LunarRail.java | 160 +++ .../java/emu/lunarcore/commands/Command.java | 13 + .../lunarcore/commands/PlayerCommands.java | 177 ++++ .../lunarcore/commands/ServerCommands.java | 119 +++ .../java/emu/lunarcore/data/GameData.java | 103 ++ .../java/emu/lunarcore/data/GameDepot.java | 37 + .../java/emu/lunarcore/data/GameResource.java | 15 + .../lunarcore/data/ResourceDeserializers.java | 37 + .../emu/lunarcore/data/ResourceLoader.java | 211 ++++ .../java/emu/lunarcore/data/ResourceType.java | 32 + .../emu/lunarcore/data/common/ItemParam.java | 46 + .../emu/lunarcore/data/config/AnchorInfo.java | 5 + .../emu/lunarcore/data/config/FloorInfo.java | 59 ++ .../emu/lunarcore/data/config/GroupInfo.java | 24 + .../lunarcore/data/config/MonsterInfo.java | 9 + .../emu/lunarcore/data/config/ObjectInfo.java | 21 + .../emu/lunarcore/data/config/PropInfo.java | 17 + .../emu/lunarcore/data/excel/AvatarExcel.java | 64 ++ .../data/excel/AvatarExpItemExcel.java | 27 + .../data/excel/AvatarPromotionExcel.java | 56 + .../lunarcore/data/excel/AvatarRankExcel.java | 30 + .../data/excel/AvatarSkillTreeExcel.java | 62 ++ .../lunarcore/data/excel/EquipmentExcel.java | 41 + .../data/excel/EquipmentExpItemExcel.java | 29 + .../data/excel/EquipmentExpTypeExcel.java | 27 + .../data/excel/EquipmentPromotionExcel.java | 52 + .../lunarcore/data/excel/ExpTypeExcel.java | 24 + .../emu/lunarcore/data/excel/ItemExcel.java | 90 ++ .../data/excel/MapEntranceExcel.java | 20 + .../lunarcore/data/excel/MonsterExcel.java | 18 + .../lunarcore/data/excel/NpcMonsterExcel.java | 22 + .../data/excel/PlayerLevelExcel.java | 18 + .../emu/lunarcore/data/excel/RelicExcel.java | 37 + .../data/excel/RelicExpItemExcel.java | 29 + .../data/excel/RelicExpTypeExcel.java | 24 + .../data/excel/RelicMainAffixExcel.java | 31 + .../data/excel/RelicSubAffixExcel.java | 31 + .../emu/lunarcore/data/excel/StageExcel.java | 23 + .../lunarcore/database/DatabaseCounter.java | 23 + .../lunarcore/database/DatabaseManager.java | 182 ++++ .../emu/lunarcore/game/account/Account.java | 60 ++ .../lunarcore/game/avatar/AvatarBaseType.java | 21 + .../game/avatar/AvatarPropertyType.java | 74 ++ .../lunarcore/game/avatar/AvatarStorage.java | 94 ++ .../emu/lunarcore/game/avatar/DamageType.java | 6 + .../emu/lunarcore/game/avatar/GameAvatar.java | 276 +++++ .../emu/lunarcore/game/battle/Battle.java | 15 + .../lunarcore/game/battle/BattleService.java | 72 ++ .../emu/lunarcore/game/gacha/GachaBanner.java | 46 + .../lunarcore/game/gacha/GachaService.java | 283 ++++++ .../emu/lunarcore/game/gacha/GachaType.java | 21 + .../game/gacha/PlayerGachaBannerInfo.java | 46 + .../lunarcore/game/gacha/PlayerGachaInfo.java | 38 + .../game/inventory/EquipInventoryTab.java | 45 + .../lunarcore/game/inventory/GameItem.java | 266 +++++ .../lunarcore/game/inventory/Inventory.java | 348 +++++++ .../game/inventory/InventoryTab.java | 13 + .../game/inventory/ItemMainType.java | 22 + .../lunarcore/game/inventory/ItemRarity.java | 19 + .../game/inventory/ItemSubAffix.java | 39 + .../lunarcore/game/inventory/ItemSubType.java | 35 + .../game/inventory/MaterialInventoryTab.java | 46 + .../lunarcore/game/inventory/RelicType.java | 20 + .../game/player/BasePlayerManager.java | 13 + .../lunarcore/game/player/LineupManager.java | 266 +++++ .../emu/lunarcore/game/player/Player.java | 310 ++++++ .../lunarcore/game/player/PlayerLineup.java | 85 ++ .../lunarcore/game/scene/EntityMonster.java | 50 + .../emu/lunarcore/game/scene/EntityProp.java | 48 + .../emu/lunarcore/game/scene/GameEntity.java | 15 + .../emu/lunarcore/game/scene/PropState.java | 48 + .../java/emu/lunarcore/game/scene/Scene.java | 224 ++++ .../lunarcore/game/service/ChatService.java | 46 + .../game/service/InventoryService.java | 496 +++++++++ .../server/game/BaseGameService.java | 13 + .../emu/lunarcore/server/game/GameServer.java | 98 ++ .../server/game/GameServerKcpListener.java | 52 + .../server/game/GameServerPacketHandler.java | 97 ++ .../lunarcore/server/game/GameSession.java | 170 ++++ .../emu/lunarcore/server/game/RegionInfo.java | 38 + .../emu/lunarcore/server/http/HttpServer.java | 153 +++ .../handlers/ComboTokenGranterHandler.java | 63 ++ .../http/handlers/FingerprintHandler.java | 34 + .../http/handlers/HttpJsonResponse.java | 22 + .../http/handlers/QueryDispatchHandler.java | 38 + .../http/handlers/QueryGatewayHandler.java | 53 + .../http/handlers/TokenLoginHandler.java | 52 + .../http/handlers/UsernameLoginHandler.java | 52 + .../http/objects/ComboTokenReqJson.java | 15 + .../http/objects/ComboTokenResJson.java | 22 + .../http/objects/FingerprintReqJson.java | 5 + .../http/objects/FingerprintResJson.java | 19 + .../http/objects/LoginAccountReqJson.java | 7 + .../server/http/objects/LoginResJson.java | 44 + .../http/objects/LoginTokenReqJson.java | 6 + .../lunarcore/server/packet/BasePacket.java | 91 ++ .../emu/lunarcore/server/packet/CmdId.java | 961 ++++++++++++++++++ .../lunarcore/server/packet/CmdIdUtils.java | 53 + .../emu/lunarcore/server/packet/Opcodes.java | 13 + .../server/packet/PacketHandler.java | 9 + .../lunarcore/server/packet/SessionState.java | 9 + .../lunarcore/server/packet/recv/Handler.java | 16 + .../packet/recv/HandlerAvatarExpUpCsReq.java | 29 + .../recv/HandlerChangeLineupLeaderCsReq.java | 21 + .../packet/recv/HandlerDoGachaCsReq.java | 19 + .../packet/recv/HandlerDressAvatarCsReq.java | 21 + .../recv/HandlerDressRelicAvatarCsReq.java | 24 + .../packet/recv/HandlerEnterSceneCsReq.java | 20 + .../recv/HandlerEntityBindPropCsReq.java | 17 + .../recv/HandlerExpUpEquipmentCsReq.java | 29 + .../packet/recv/HandlerExpUpRelicCsReq.java | 29 + .../recv/HandlerGetAllLineupDataCsReq.java | 17 + .../recv/HandlerGetAssistHistoryCsReq.java | 16 + .../recv/HandlerGetAvatarDataCsReq.java | 17 + .../packet/recv/HandlerGetBagCsReq.java | 17 + .../packet/recv/HandlerGetBasicInfoCsReq.java | 17 + .../recv/HandlerGetChatEmojiListCsReq.java | 16 + .../recv/HandlerGetCurLineupDataCsReq.java | 17 + .../recv/HandlerGetCurSceneInfoCsReq.java | 17 + .../HandlerGetFriendApplyListInfoCsReq.java | 16 + .../recv/HandlerGetFriendListInfoCsReq.java | 17 + .../packet/recv/HandlerGetGachaInfoCsReq.java | 17 + .../HandlerGetHeroBasicTypeInfoCsReq.java | 17 + .../packet/recv/HandlerGetMailCsReq.java | 16 + .../recv/HandlerGetMissionStatusCsReq.java | 20 + .../recv/HandlerGetPlayerDetailInfoCsReq.java | 20 + .../recv/HandlerGetSceneMapInfoCsReq.java | 20 + .../packet/recv/HandlerGetShopListCsReq.java | 20 + .../packet/recv/HandlerJoinLineupCsReq.java | 21 + .../recv/HandlerLockEquipmentCsReq.java | 21 + .../packet/recv/HandlerLockRelicCsReq.java | 21 + .../recv/HandlerPVEBattleResultCsReq.java | 26 + .../recv/HandlerPlayerGetTokenCsReq.java | 53 + .../recv/HandlerPlayerHeartBeatCsReq.java | 22 + .../packet/recv/HandlerPlayerLoginCsReq.java | 22 + .../recv/HandlerPlayerLoginFinishCsReq.java | 17 + .../packet/recv/HandlerPlayerLogoutCsReq.java | 16 + .../recv/HandlerPromoteAvatarCsReq.java | 19 + .../recv/HandlerPromoteEquipmentCsReq.java | 19 + .../packet/recv/HandlerQuitLineupCsReq.java | 21 + .../packet/recv/HandlerRankUpAvatarCsReq.java | 19 + .../recv/HandlerRankUpEquipmentCsReq.java | 29 + .../recv/HandlerReplaceLineupCsReq.java | 30 + .../recv/HandlerSceneCastSkillCsReq.java | 24 + .../recv/HandlerSceneEntityMoveCsReq.java | 27 + .../packet/recv/HandlerSellItemCsReq.java | 29 + .../packet/recv/HandlerSendMsgCsReq.java | 29 + .../recv/HandlerSetGameplayBirthdayCsReq.java | 25 + .../recv/HandlerSetLineupNameCsReq.java | 21 + .../packet/recv/HandlerSetNicknameCsReq.java | 23 + .../packet/recv/HandlerSwapLineupCsReq.java | 21 + .../recv/HandlerSwitchLineupIndexCsReq.java | 21 + .../HandlerSyncClientResVersionCsReq.java | 20 + .../recv/HandlerTakeOffEquipmentCsReq.java | 22 + .../packet/recv/HandlerTakeOffRelicCsReq.java | 24 + .../recv/HandlerUnlockSkilltreeCsReq.java | 19 + .../lunarcore/server/packet/send/Packet.java | 13 + .../packet/send/PacketAvatarExpUpScRsp.java | 31 + .../send/PacketChangeLineupLeaderScRsp.java | 17 + .../packet/send/PacketDoGachaScRsp.java | 32 + .../PacketEnterSceneByServerScNotify.java | 19 + .../send/PacketExpUpEquipmentScRsp.java | 31 + .../packet/send/PacketExpUpRelicScRsp.java | 31 + .../send/PacketGetAllLineupDataScRsp.java | 26 + .../packet/send/PacketGetAvatarDataScRsp.java | 23 + .../server/packet/send/PacketGetBagScRsp.java | 35 + .../packet/send/PacketGetBasicInfoScRsp.java | 22 + .../send/PacketGetCurLineupDataScRsp.java | 18 + .../send/PacketGetCurSceneInfoScRsp.java | 18 + .../send/PacketGetFriendListInfoScRsp.java | 32 + .../packet/send/PacketGetGachaInfoScRsp.java | 14 + .../send/PacketGetHeroBasicTypeInfoScRsp.java | 25 + .../send/PacketGetMissionStatusScRsp.java | 31 + .../send/PacketGetPlayerDetailInfoScRsp.java | 18 + .../send/PacketGetSceneMapInfoScRsp.java | 57 ++ .../packet/send/PacketGetShopListScRsp.java | 17 + .../send/PacketPVEBattleResultScRsp.java | 27 + .../send/PacketPlayerGetTokenScRsp.java | 20 + .../send/PacketPlayerHeartBeatScRsp.java | 18 + .../packet/send/PacketPlayerLoginScRsp.java | 22 + .../packet/send/PacketPlayerSyncScNotify.java | 101 ++ .../packet/send/PacketRevcMsgScNotify.java | 25 + .../send/PacketSceneCastSkillScRsp.java | 68 ++ .../send/PacketSceneEntityUpdateScNotify.java | 18 + .../send/PacketSceneGroupRefreshScNotify.java | 51 + .../packet/send/PacketSellItemScRsp.java | 28 + .../send/PacketSetGameplayBirthdayScRsp.java | 26 + .../packet/send/PacketSetLineupNameScRsp.java | 22 + .../send/PacketSwitchLineupIndexScRsp.java | 18 + .../send/PacketSyncClientResVersionScRsp.java | 17 + .../packet/send/PacketSyncLineupNotify.java | 18 + .../send/PacketUnlockSkilltreeScRsp.java | 27 + src/main/java/emu/lunarcore/util/Crypto.java | 25 + .../java/emu/lunarcore/util/FileUtils.java | 39 + .../java/emu/lunarcore/util/Handbook.java | 104 ++ .../java/emu/lunarcore/util/JsonUtils.java | 108 ++ .../java/emu/lunarcore/util/Position.java | 108 ++ .../java/emu/lunarcore/util/Snowflake32.java | 25 + src/main/java/emu/lunarcore/util/Utils.java | 148 +++ .../java/emu/lunarcore/util/WeightedList.java | 35 + src/main/resources/logback.xml | 14 + 214 files changed, 11265 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 build.gradle create mode 100644 data/Banners.json create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 keystore.p12 create mode 100644 lib/kcp.jar create mode 100644 settings.gradle create mode 100644 src/main/java/emu/lunarcore/Config.java create mode 100644 src/main/java/emu/lunarcore/GameConstants.java create mode 100644 src/main/java/emu/lunarcore/LunarRail.java create mode 100644 src/main/java/emu/lunarcore/commands/Command.java create mode 100644 src/main/java/emu/lunarcore/commands/PlayerCommands.java create mode 100644 src/main/java/emu/lunarcore/commands/ServerCommands.java create mode 100644 src/main/java/emu/lunarcore/data/GameData.java create mode 100644 src/main/java/emu/lunarcore/data/GameDepot.java create mode 100644 src/main/java/emu/lunarcore/data/GameResource.java create mode 100644 src/main/java/emu/lunarcore/data/ResourceDeserializers.java create mode 100644 src/main/java/emu/lunarcore/data/ResourceLoader.java create mode 100644 src/main/java/emu/lunarcore/data/ResourceType.java create mode 100644 src/main/java/emu/lunarcore/data/common/ItemParam.java create mode 100644 src/main/java/emu/lunarcore/data/config/AnchorInfo.java create mode 100644 src/main/java/emu/lunarcore/data/config/FloorInfo.java create mode 100644 src/main/java/emu/lunarcore/data/config/GroupInfo.java create mode 100644 src/main/java/emu/lunarcore/data/config/MonsterInfo.java create mode 100644 src/main/java/emu/lunarcore/data/config/ObjectInfo.java create mode 100644 src/main/java/emu/lunarcore/data/config/PropInfo.java create mode 100644 src/main/java/emu/lunarcore/data/excel/AvatarExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/AvatarExpItemExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/AvatarPromotionExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/AvatarRankExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/AvatarSkillTreeExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/EquipmentExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/EquipmentExpItemExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/EquipmentExpTypeExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/EquipmentPromotionExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/ExpTypeExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/ItemExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/MapEntranceExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/MonsterExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/NpcMonsterExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/PlayerLevelExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/RelicExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/RelicExpItemExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/RelicExpTypeExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/RelicMainAffixExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/RelicSubAffixExcel.java create mode 100644 src/main/java/emu/lunarcore/data/excel/StageExcel.java create mode 100644 src/main/java/emu/lunarcore/database/DatabaseCounter.java create mode 100644 src/main/java/emu/lunarcore/database/DatabaseManager.java create mode 100644 src/main/java/emu/lunarcore/game/account/Account.java create mode 100644 src/main/java/emu/lunarcore/game/avatar/AvatarBaseType.java create mode 100644 src/main/java/emu/lunarcore/game/avatar/AvatarPropertyType.java create mode 100644 src/main/java/emu/lunarcore/game/avatar/AvatarStorage.java create mode 100644 src/main/java/emu/lunarcore/game/avatar/DamageType.java create mode 100644 src/main/java/emu/lunarcore/game/avatar/GameAvatar.java create mode 100644 src/main/java/emu/lunarcore/game/battle/Battle.java create mode 100644 src/main/java/emu/lunarcore/game/battle/BattleService.java create mode 100644 src/main/java/emu/lunarcore/game/gacha/GachaBanner.java create mode 100644 src/main/java/emu/lunarcore/game/gacha/GachaService.java create mode 100644 src/main/java/emu/lunarcore/game/gacha/GachaType.java create mode 100644 src/main/java/emu/lunarcore/game/gacha/PlayerGachaBannerInfo.java create mode 100644 src/main/java/emu/lunarcore/game/gacha/PlayerGachaInfo.java create mode 100644 src/main/java/emu/lunarcore/game/inventory/EquipInventoryTab.java create mode 100644 src/main/java/emu/lunarcore/game/inventory/GameItem.java create mode 100644 src/main/java/emu/lunarcore/game/inventory/Inventory.java create mode 100644 src/main/java/emu/lunarcore/game/inventory/InventoryTab.java create mode 100644 src/main/java/emu/lunarcore/game/inventory/ItemMainType.java create mode 100644 src/main/java/emu/lunarcore/game/inventory/ItemRarity.java create mode 100644 src/main/java/emu/lunarcore/game/inventory/ItemSubAffix.java create mode 100644 src/main/java/emu/lunarcore/game/inventory/ItemSubType.java create mode 100644 src/main/java/emu/lunarcore/game/inventory/MaterialInventoryTab.java create mode 100644 src/main/java/emu/lunarcore/game/inventory/RelicType.java create mode 100644 src/main/java/emu/lunarcore/game/player/BasePlayerManager.java create mode 100644 src/main/java/emu/lunarcore/game/player/LineupManager.java create mode 100644 src/main/java/emu/lunarcore/game/player/Player.java create mode 100644 src/main/java/emu/lunarcore/game/player/PlayerLineup.java create mode 100644 src/main/java/emu/lunarcore/game/scene/EntityMonster.java create mode 100644 src/main/java/emu/lunarcore/game/scene/EntityProp.java create mode 100644 src/main/java/emu/lunarcore/game/scene/GameEntity.java create mode 100644 src/main/java/emu/lunarcore/game/scene/PropState.java create mode 100644 src/main/java/emu/lunarcore/game/scene/Scene.java create mode 100644 src/main/java/emu/lunarcore/game/service/ChatService.java create mode 100644 src/main/java/emu/lunarcore/game/service/InventoryService.java create mode 100644 src/main/java/emu/lunarcore/server/game/BaseGameService.java create mode 100644 src/main/java/emu/lunarcore/server/game/GameServer.java create mode 100644 src/main/java/emu/lunarcore/server/game/GameServerKcpListener.java create mode 100644 src/main/java/emu/lunarcore/server/game/GameServerPacketHandler.java create mode 100644 src/main/java/emu/lunarcore/server/game/GameSession.java create mode 100644 src/main/java/emu/lunarcore/server/game/RegionInfo.java create mode 100644 src/main/java/emu/lunarcore/server/http/HttpServer.java create mode 100644 src/main/java/emu/lunarcore/server/http/handlers/ComboTokenGranterHandler.java create mode 100644 src/main/java/emu/lunarcore/server/http/handlers/FingerprintHandler.java create mode 100644 src/main/java/emu/lunarcore/server/http/handlers/HttpJsonResponse.java create mode 100644 src/main/java/emu/lunarcore/server/http/handlers/QueryDispatchHandler.java create mode 100644 src/main/java/emu/lunarcore/server/http/handlers/QueryGatewayHandler.java create mode 100644 src/main/java/emu/lunarcore/server/http/handlers/TokenLoginHandler.java create mode 100644 src/main/java/emu/lunarcore/server/http/handlers/UsernameLoginHandler.java create mode 100644 src/main/java/emu/lunarcore/server/http/objects/ComboTokenReqJson.java create mode 100644 src/main/java/emu/lunarcore/server/http/objects/ComboTokenResJson.java create mode 100644 src/main/java/emu/lunarcore/server/http/objects/FingerprintReqJson.java create mode 100644 src/main/java/emu/lunarcore/server/http/objects/FingerprintResJson.java create mode 100644 src/main/java/emu/lunarcore/server/http/objects/LoginAccountReqJson.java create mode 100644 src/main/java/emu/lunarcore/server/http/objects/LoginResJson.java create mode 100644 src/main/java/emu/lunarcore/server/http/objects/LoginTokenReqJson.java create mode 100644 src/main/java/emu/lunarcore/server/packet/BasePacket.java create mode 100644 src/main/java/emu/lunarcore/server/packet/CmdId.java create mode 100644 src/main/java/emu/lunarcore/server/packet/CmdIdUtils.java create mode 100644 src/main/java/emu/lunarcore/server/packet/Opcodes.java create mode 100644 src/main/java/emu/lunarcore/server/packet/PacketHandler.java create mode 100644 src/main/java/emu/lunarcore/server/packet/SessionState.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/Handler.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerAvatarExpUpCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerChangeLineupLeaderCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerDoGachaCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerDressAvatarCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerDressRelicAvatarCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerEnterSceneCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerEntityBindPropCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerExpUpEquipmentCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerExpUpRelicCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerGetAllLineupDataCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerGetAssistHistoryCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerGetAvatarDataCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerGetBagCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerGetBasicInfoCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerGetChatEmojiListCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerGetCurLineupDataCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerGetCurSceneInfoCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerGetFriendApplyListInfoCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerGetFriendListInfoCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerGetGachaInfoCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerGetHeroBasicTypeInfoCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerGetMailCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerGetMissionStatusCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerGetPlayerDetailInfoCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerGetSceneMapInfoCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerGetShopListCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerJoinLineupCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerLockEquipmentCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerLockRelicCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerPVEBattleResultCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerGetTokenCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerHeartBeatCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerLoginCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerLoginFinishCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerLogoutCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerPromoteAvatarCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerPromoteEquipmentCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerQuitLineupCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerRankUpAvatarCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerRankUpEquipmentCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerReplaceLineupCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerSceneCastSkillCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerSceneEntityMoveCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerSellItemCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerSendMsgCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerSetGameplayBirthdayCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerSetLineupNameCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerSetNicknameCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerSwapLineupCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerSwitchLineupIndexCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerSyncClientResVersionCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerTakeOffEquipmentCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerTakeOffRelicCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerUnlockSkilltreeCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/Packet.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketAvatarExpUpScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketChangeLineupLeaderScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketDoGachaScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketEnterSceneByServerScNotify.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketExpUpEquipmentScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketExpUpRelicScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketGetAllLineupDataScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketGetAvatarDataScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketGetBagScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketGetBasicInfoScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketGetCurLineupDataScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketGetCurSceneInfoScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketGetFriendListInfoScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketGetGachaInfoScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketGetHeroBasicTypeInfoScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketGetMissionStatusScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketGetPlayerDetailInfoScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketGetSceneMapInfoScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketGetShopListScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketPVEBattleResultScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketPlayerGetTokenScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketPlayerHeartBeatScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketPlayerLoginScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketPlayerSyncScNotify.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketRevcMsgScNotify.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketSceneCastSkillScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketSceneEntityUpdateScNotify.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketSceneGroupRefreshScNotify.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketSellItemScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketSetGameplayBirthdayScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketSetLineupNameScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketSwitchLineupIndexScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketSyncClientResVersionScRsp.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketSyncLineupNotify.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketUnlockSkilltreeScRsp.java create mode 100644 src/main/java/emu/lunarcore/util/Crypto.java create mode 100644 src/main/java/emu/lunarcore/util/FileUtils.java create mode 100644 src/main/java/emu/lunarcore/util/Handbook.java create mode 100644 src/main/java/emu/lunarcore/util/JsonUtils.java create mode 100644 src/main/java/emu/lunarcore/util/Position.java create mode 100644 src/main/java/emu/lunarcore/util/Snowflake32.java create mode 100644 src/main/java/emu/lunarcore/util/Utils.java create mode 100644 src/main/java/emu/lunarcore/util/WeightedList.java create mode 100644 src/main/resources/logback.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fe94dd4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,75 @@ +# Compiled class file +*.class + +#idea +*.idea +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.war +*.nar +*.ear +*.zip +*.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +# Ignore Gradle project-specific cache directory +.gradle + +# Ignore Gradle build output directory +build/ +out/ + +# Ignore Gradle properties +gradle.properties + +# Eclipse +.project +.classpath +.settings +.metadata +.properties +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +.loadpath +.recommenders + +# VSCode +.vscode + +# lombok +/.apt_generated/ + +# macOS +.DS_Store +.directory + +# Lunar Rail generated/resource/log folders +src/generated +/resources +/logs + +# Lunar Rail compiled +/*.jar +/*.sh + +# Lunar Rail extra +Star Rail Handbook.txt +config.json +*.mv +*.exe +Test.java \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..50e7505 --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ +# Lunar Rail +A WIP server emulator for version 1.3.0 of a certain turn based anime game. + +# Running the server and client + +### Prerequisites +* Java 17 JDK + +### Recommended +* Mongodb (4.0+) + +### Starting up the server +1. Compile the server with `./gradlew jar` +2. Create a folder named `resources` in your server directory, you will need to downlaod `TextMap` and `ExcelBin` folders which you can get from a repo like [https://github.com/Dimbreath/StarRailData](https://github.com/Dimbreath/StarRailData) into your resources folder. +3. Run the server with `java -jar LunarRail.jar`. Lunar Rail comes with a built in internal mongo server for its database, so no Mongodb installation is required. However, it is highly recomended to install Mongodb anyways. + +### Connecting with the client +1. Login with the client to an official server at least once to download game data. +2. If you are using the provided keystore, you will need to install and have [Fiddler](https://www.telerik.com/fiddler) running. Make sure fiddler is set to decrypt https traffic. +3. Set your hosts file to redirect at least `hkrpg-sdk-os-static.hoyoverse.com` and `globaldp-prod-os01.starrails.com` to your http (dispatch) server ip. + +### Server console commands + +`/account create [username] {playerid}` - Creates an account with the specified username and the in-game uid for that account. The playerid parameter is optional and will be auto generated if not set. + +### In-Game commands +There is a dummy user named "Server" in every player's friends list that you can message to use commands. Commands also work in other chat rooms, such as private/team chats. + +`!spawn [monster id] [stage id]` + +`!give [item id] [amount]` \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..8a2597a --- /dev/null +++ b/build.gradle @@ -0,0 +1,148 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * This generated file contains a sample Java project to get you started. + * For more details take a look at the Java Quickstart chapter in the Gradle + * User Manual available at https://docs.gradle.org/5.6.3/userguide/tutorial_java_projects.html + */ + +plugins { + // Apply the application plugin to add support for building a CLI application + id 'application' + + // Apply the java plugin to add support for Java + id 'java' + + // Protoc plugin + id 'com.google.protobuf' version '0.8.19' + + id 'eclipse' +} + +compileJava.options.encoding = "UTF-8" +compileTestJava.options.encoding = "UTF-8" + +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 + +repositories { + mavenCentral() + jcenter() +} + +protobuf { + protoc { + artifact = 'com.google.protobuf:protoc:3.24.3' + } + plugins { + quickbuf { + artifact = 'us.hebi.quickbuf:protoc-gen-quickbuf:1.3.1' + } + } + generateProtoTasks { + all().each { task -> + task.builtins { + remove java + } + task.plugins { + quickbuf { + option 'store_unknown_fields=true' + + outputSubDir = '' + } + } + } + } + generatedFilesBaseDir = "$projectDir/src/generated/" +} + +dependencies { + implementation fileTree(dir: 'lib', include: ['*.jar']) + + implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.9' + implementation group: 'ch.qos.logback', name: 'logback-core', version: '1.4.11' + implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.4.11' + + implementation group: 'it.unimi.dsi', name: 'fastutil-core', version: '8.5.12' + implementation group: 'org.reflections', name: 'reflections', version: '0.10.2' + + implementation group: 'com.google.code.gson', name: 'gson', version: '2.10.1' + implementation group: 'us.hebi.quickbuf', name: 'quickbuf-runtime', version: '1.3.1' + + implementation group: 'io.javalin', name: 'javalin', version: '5.6.2' + + implementation group: 'io.netty', name: 'netty-common', version: '4.1.97.Final' + implementation group: 'io.netty', name: 'netty-handler', version: '4.1.97.Final' + implementation group: 'io.netty', name: 'netty-transport-native-epoll', version: '4.1.97.Final' + implementation group: 'io.netty', name: 'netty-transport-native-kqueue', version: '4.1.97.Final' + + implementation group: 'dev.morphia.morphia', name: 'morphia-core', version: '2.3.8' + implementation group: 'de.bwaldvogel', name: 'mongo-java-server', version: '1.44.0' + implementation group: 'de.bwaldvogel', name: 'mongo-java-server-h2-backend', version: '1.44.0' + + protobuf files('proto/') + + compileOnly 'org.projectlombok:lombok:1.18.30' + annotationProcessor 'org.projectlombok:lombok:1.18.30' +} + +configurations.all { + exclude group: 'org.slf4j', module: 'slf4j' +} + +clean { + delete protobuf.generatedFilesBaseDir +} + +application { + // Define the main class for the application + mainClassName = 'emu.lunarcore.LunarRail' +} + +jar { + exclude '*.proto' + + manifest { + attributes 'Main-Class': 'emu.lunarcore.LunarRail' + } + + jar { + archiveBaseName = 'LunarRail' + archiveVersion = '' + } + + from { + configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } + } + + duplicatesStrategy = DuplicatesStrategy.INCLUDE + + from('src/main/java') { + include '*.xml' + } + + getDestinationDirectory().set(file(".")) +} + +sourceSets { + main { + proto { + srcDir 'src/generated' + } + java { + srcDir 'src/main/java' + } + } +} + +eclipse { + classpath { + file.whenMerged { cp -> + cp.entries.add( new org.gradle.plugins.ide.eclipse.model.SourceFolder('src/generated/main/', null) ) + } + } +} + +processResources { + dependsOn "generateProto" +} \ No newline at end of file diff --git a/data/Banners.json b/data/Banners.json new file mode 100644 index 0000000..11d980b --- /dev/null +++ b/data/Banners.json @@ -0,0 +1,27 @@ +[ + { + "id": 1001, + "gachaType": "Normal", + "beginTime": 0, + "endTime": 0, + "rateUpItems5": [], + "rateUpItems4": [] + }, + { + "id": 2009, + "gachaType": "AvatarUp", + "beginTime": 0, + "endTime": 1924992000, + "rateUpItems5": [1213], + "rateUpItems4": [1207, 1001, 1009] + }, + { + "id": 3009, + "gachaType": "WeaponUp", + "beginTime": 0, + "endTime": 1924992000, + "eventChance": 75, + "rateUpItems5": [1208], + "rateUpItems4": [1106, 1109, 1110] + } +] \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..41d9927a4d4fb3f96a785543079b8df6723c946b GIT binary patch literal 59821 zcma&NV|1p`(k7gaZQHhOJ9%QKV?D8LCmq{1JGRYE(y=?XJw0>InKkE~^UnAEs2gk5 zUVGPCwX3dOb!}xiFmPB95NK!+5D<~S0s;d1zn&lrfAn7 zC?Nb-LFlib|DTEqB8oDS5&$(u1<5;wsY!V`2F7^=IR@I9so5q~=3i_(hqqG<9SbL8Q(LqDrz+aNtGYWGJ2;p*{a-^;C>BfGzkz_@fPsK8{pTT~_VzB$E`P@> z7+V1WF2+tSW=`ZRj3&0m&d#x_lfXq`bb-Y-SC-O{dkN2EVM7@!n|{s+2=xSEMtW7( zz~A!cBpDMpQu{FP=y;sO4Le}Z)I$wuFwpugEY3vEGfVAHGqZ-<{vaMv-5_^uO%a{n zE_Zw46^M|0*dZ`;t%^3C19hr=8FvVdDp1>SY>KvG!UfD`O_@weQH~;~W=fXK_!Yc> z`EY^PDJ&C&7LC;CgQJeXH2 zjfM}2(1i5Syj)Jj4EaRyiIl#@&lC5xD{8hS4Wko7>J)6AYPC-(ROpVE-;|Z&u(o=X z2j!*>XJ|>Lo+8T?PQm;SH_St1wxQPz)b)Z^C(KDEN$|-6{A>P7r4J1R-=R7|FX*@! zmA{Ja?XE;AvisJy6;cr9Q5ovphdXR{gE_7EF`ji;n|RokAJ30Zo5;|v!xtJr+}qbW zY!NI6_Wk#6pWFX~t$rAUWi?bAOv-oL6N#1>C~S|7_e4 zF}b9(&a*gHk+4@J26&xpiWYf2HN>P;4p|TD4f586umA2t@cO1=Fx+qd@1Ae#Le>{-?m!PnbuF->g3u)7(n^llJfVI%Q2rMvetfV5 z6g|sGf}pV)3_`$QiKQnqQ<&ghOWz4_{`rA1+7*M0X{y(+?$|{n zs;FEW>YzUWg{sO*+D2l6&qd+$JJP_1Tm;To<@ZE%5iug8vCN3yH{!6u5Hm=#3HJ6J zmS(4nG@PI^7l6AW+cWAo9sFmE`VRcM`sP7X$^vQY(NBqBYU8B|n-PrZdNv8?K?kUTT3|IE`-A8V*eEM2=u*kDhhKsmVPWGns z8QvBk=BPjvu!QLtlF0qW(k+4i+?H&L*qf262G#fks9}D5-L{yiaD10~a;-j!p!>5K zl@Lh+(9D{ePo_S4F&QXv|q_yT`GIPEWNHDD8KEcF*2DdZD;=J6u z|8ICSoT~5Wd!>g%2ovFh`!lTZhAwpIbtchDc{$N%<~e$E<7GWsD42UdJh1fD($89f2on`W`9XZJmr*7lRjAA8K0!(t8-u>2H*xn5cy1EG{J;w;Q-H8Yyx+WW(qoZZM7p(KQx^2-yI6Sw?k<=lVOVwYn zY*eDm%~=|`c{tUupZ^oNwIr!o9T;H3Fr|>NE#By8SvHb&#;cyBmY1LwdXqZwi;qn8 zK+&z{{95(SOPXAl%EdJ3jC5yV^|^}nOT@M0)|$iOcq8G{#*OH7=DlfOb; z#tRO#tcrc*yQB5!{l5AF3(U4>e}nEvkoE_XCX=a3&A6Atwnr&`r&f2d%lDr8f?hBB zr1dKNypE$CFbT9I?n){q<1zHmY>C=5>9_phi79pLJG)f=#dKdQ7We8emMjwR*qIMF zE_P-T*$hX#FUa%bjv4Vm=;oxxv`B*`weqUn}K=^TXjJG=UxdFMSj-QV6fu~;- z|IsUq`#|73M%Yn;VHJUbt<0UHRzbaF{X@76=8*-IRx~bYgSf*H(t?KH=?D@wk*E{| z2@U%jKlmf~C^YxD=|&H?(g~R9-jzEb^y|N5d`p#2-@?BUcHys({pUz4Zto7XwKq2X zSB~|KQGgv_Mh@M!*{nl~2~VV_te&E7K39|WYH zCxfd|v_4!h$Ps2@atm+gj14Ru)DhivY&(e_`eA)!O1>nkGq|F-#-6oo5|XKEfF4hR z%{U%ar7Z8~B!foCd_VRHr;Z1c0Et~y8>ZyVVo9>LLi(qb^bxVkbq-Jq9IF7!FT`(- zTMrf6I*|SIznJLRtlP)_7tQ>J`Um>@pP=TSfaPB(bto$G1C zx#z0$=zNpP-~R);kM4O)9Mqn@5Myv5MmmXOJln312kq#_94)bpSd%fcEo7cD#&|<` zrcal$(1Xv(nDEquG#`{&9Ci~W)-zd_HbH-@2F6+|a4v}P!w!Q*h$#Zu+EcZeY>u&?hn#DCfC zVuye5@Ygr+T)0O2R1*Hvlt>%rez)P2wS}N-i{~IQItGZkp&aeY^;>^m7JT|O^{`78 z$KaK0quwcajja;LU%N|{`2o&QH@u%jtH+j!haGj;*ZCR*`UgOXWE>qpXqHc?g&vA& zt-?_g8k%ZS|D;()0Lf!>7KzTSo-8hUh%OA~i76HKRLudaNiwo*E9HxmzN4y>YpZNO zUE%Q|H_R_UmX=*f=2g=xyP)l-DP}kB@PX|(Ye$NOGN{h+fI6HVw`~Cd0cKqO;s6aiYLy7sl~%gs`~XaL z^KrZ9QeRA{O*#iNmB7_P!=*^pZiJ5O@iE&X2UmUCPz!)`2G3)5;H?d~3#P|)O(OQ_ zua+ZzwWGkWflk4j^Lb=x56M75_p9M*Q50#(+!aT01y80x#rs9##!;b-BH?2Fu&vx} za%4!~GAEDsB54X9wCF~juV@aU}fp_(a<`Ig0Pip8IjpRe#BR?-niYcz@jI+QY zBU9!8dAfq@%p;FX)X=E7?B=qJJNXlJ&7FBsz;4&|*z{^kEE!XbA)(G_O6I9GVzMAF z8)+Un(6od`W7O!!M=0Z)AJuNyN8q>jNaOdC-zAZ31$Iq%{c_SYZe+(~_R`a@ zOFiE*&*o5XG;~UjsuW*ja-0}}rJdd@^VnQD!z2O~+k-OSF%?hqcFPa4e{mV1UOY#J zTf!PM=KMNAzbf(+|AL%K~$ahX0Ol zbAxKu3;v#P{Qia{_WzHl`!@!8c#62XSegM{tW1nu?Ee{sQq(t{0TSq67YfG;KrZ$n z*$S-+R2G?aa*6kRiTvVxqgUhJ{ASSgtepG3hb<3hlM|r>Hr~v_DQ>|Nc%&)r0A9go z&F3Ao!PWKVq~aWOzLQIy&R*xo>}{UTr}?`)KS&2$3NR@a+>+hqK*6r6Uu-H};ZG^| zfq_Vl%YE1*uGwtJ>H*Y(Q9E6kOfLJRlrDNv`N;jnag&f<4#UErM0ECf$8DASxMFF& zK=mZgu)xBz6lXJ~WZR7OYw;4&?v3Kk-QTs;v1r%XhgzSWVf|`Sre2XGdJb}l1!a~z zP92YjnfI7OnF@4~g*LF>G9IZ5c+tifpcm6#m)+BmnZ1kz+pM8iUhwag`_gqr(bnpy zl-noA2L@2+?*7`ZO{P7&UL~ahldjl`r3=HIdo~Hq#d+&Q;)LHZ4&5zuDNug@9-uk; z<2&m#0Um`s=B}_}9s&70Tv_~Va@WJ$n~s`7tVxi^s&_nPI0`QX=JnItlOu*Tn;T@> zXsVNAHd&K?*u~a@u8MWX17VaWuE0=6B93P2IQ{S$-WmT+Yp!9eA>@n~=s>?uDQ4*X zC(SxlKap@0R^z1p9C(VKM>nX8-|84nvIQJ-;9ei0qs{}X>?f%&E#%-)Bpv_p;s4R+ z;PMpG5*rvN&l;i{^~&wKnEhT!S!LQ>udPzta#Hc9)S8EUHK=%x+z@iq!O{)*XM}aI zBJE)vokFFXTeG<2Pq}5Na+kKnu?Ch|YoxdPb&Z{07nq!yzj0=xjzZj@3XvwLF0}Pa zn;x^HW504NNfLY~w!}5>`z=e{nzGB>t4ntE>R}r7*hJF3OoEx}&6LvZz4``m{AZxC zz6V+^73YbuY>6i9ulu)2`ozP(XBY5n$!kiAE_Vf4}Ih)tlOjgF3HW|DF+q-jI_0p%6Voc^e;g28* z;Sr4X{n(X7eEnACWRGNsHqQ_OfWhAHwnSQ87@PvPcpa!xr9`9+{QRn;bh^jgO8q@v zLekO@-cdc&eOKsvXs-eMCH8Y{*~3Iy!+CANy+(WXYS&6XB$&1+tB?!qcL@@) zS7XQ|5=o1fr8yM7r1AyAD~c@Mo`^i~hjx{N17%pDX?j@2bdBEbxY}YZxz!h#)q^1x zpc_RnoC3`V?L|G2R1QbR6pI{Am?yW?4Gy`G-xBYfebXvZ=(nTD7u?OEw>;vQICdPJBmi~;xhVV zisVvnE!bxI5|@IIlDRolo_^tc1{m)XTbIX^<{TQfsUA1Wv(KjJED^nj`r!JjEA%MaEGqPB z9YVt~ol3%e`PaqjZt&-)Fl^NeGmZ)nbL;92cOeLM2H*r-zA@d->H5T_8_;Jut0Q_G zBM2((-VHy2&eNkztIpHk&1H3M3@&wvvU9+$RO%fSEa_d5-qZ!<`-5?L9lQ1@AEpo* z3}Zz~R6&^i9KfRM8WGc6fTFD%PGdruE}`X$tP_*A)_7(uI5{k|LYc-WY*%GJ6JMmw zNBT%^E#IhekpA(i zcB$!EB}#>{^=G%rQ~2;gbObT9PQ{~aVx_W6?(j@)S$&Ja1s}aLT%A*mP}NiG5G93- z_DaRGP77PzLv0s32{UFm##C2LsU!w{vHdKTM1X)}W%OyZ&{3d^2Zu-zw?fT=+zi*q z^fu6CXQ!i?=ljsqSUzw>g#PMk>(^#ejrYp(C)7+@Z1=Mw$Rw!l8c9}+$Uz;9NUO(kCd#A1DX4Lbis0k; z?~pO(;@I6Ajp}PL;&`3+;OVkr3A^dQ(j?`by@A!qQam@_5(w6fG>PvhO`#P(y~2ue zW1BH_GqUY&>PggMhhi@8kAY;XWmj>y1M@c`0v+l~l0&~Kd8ZSg5#46wTLPo*Aom-5 z>qRXyWl}Yda=e@hJ%`x=?I42(B0lRiR~w>n6p8SHN~B6Y>W(MOxLpv>aB)E<1oEcw z%X;#DJpeDaD;CJRLX%u!t23F|cv0ZaE183LXxMq*uWn)cD_ zp!@i5zsmcxb!5uhp^@>U;K>$B|8U@3$65CmhuLlZ2(lF#hHq-<<+7ZN9m3-hFAPgA zKi;jMBa*59ficc#TRbH_l`2r>z(Bm_XEY}rAwyp~c8L>{A<0@Q)j*uXns^q5z~>KI z)43=nMhcU1ZaF;CaBo>hl6;@(2#9yXZ7_BwS4u>gN%SBS<;j{{+p}tbD8y_DFu1#0 zx)h&?`_`=ti_6L>VDH3>PPAc@?wg=Omdoip5j-2{$T;E9m)o2noyFW$5dXb{9CZ?c z);zf3U526r3Fl+{82!z)aHkZV6GM@%OKJB5mS~JcDjieFaVn}}M5rtPnHQVw0Stn- zEHs_gqfT8(0b-5ZCk1%1{QQaY3%b>wU z7lyE?lYGuPmB6jnMI6s$1uxN{Tf_n7H~nKu+h7=%60WK-C&kEIq_d4`wU(*~rJsW< zo^D$-(b0~uNVgC+$J3MUK)(>6*k?92mLgpod{Pd?{os+yHr&t+9ZgM*9;dCQBzE!V zk6e6)9U6Bq$^_`E1xd}d;5O8^6?@bK>QB&7l{vAy^P6FOEO^l7wK4K=lLA45gQ3$X z=$N{GR1{cxO)j;ZxKI*1kZIT9p>%FhoFbRK;M(m&bL?SaN zzkZS9xMf={o@gpG%wE857u@9dq>UKvbaM1SNtMA9EFOp7$BjJQVkIm$wU?-yOOs{i z1^(E(WwZZG{_#aIzfpGc@g5-AtK^?Q&vY#CtVpfLbW?g0{BEX4Vlk(`AO1{-D@31J zce}#=$?Gq+FZG-SD^z)-;wQg9`qEO}Dvo+S9*PUB*JcU)@S;UVIpN7rOqXmEIerWo zP_lk!@RQvyds&zF$Rt>N#_=!?5{XI`Dbo0<@>fIVgcU*9Y+ z)}K(Y&fdgve3ruT{WCNs$XtParmvV;rjr&R(V&_#?ob1LzO0RW3?8_kSw)bjom#0; zeNllfz(HlOJw012B}rgCUF5o|Xp#HLC~of%lg+!pr(g^n;wCX@Yk~SQOss!j9f(KL zDiI1h#k{po=Irl)8N*KU*6*n)A8&i9Wf#7;HUR^5*6+Bzh;I*1cICa|`&`e{pgrdc zs}ita0AXb$c6{tu&hxmT0faMG0GFc)unG8tssRJd%&?^62!_h_kn^HU_kBgp$bSew zqu)M3jTn;)tipv9Wt4Ll#1bmO2n?^)t^ZPxjveoOuK89$oy4(8Ujw{nd*Rs*<+xFi z{k*9v%sl?wS{aBSMMWdazhs0#gX9Has=pi?DhG&_0|cIyRG7c`OBiVG6W#JjYf7-n zIQU*Jc+SYnI8oG^Q8So9SP_-w;Y00$p5+LZ{l+81>v7|qa#Cn->312n=YQd$PaVz8 zL*s?ZU*t-RxoR~4I7e^c!8TA4g>w@R5F4JnEWJpy>|m5la2b#F4d*uoz!m=i1;`L` zB(f>1fAd~;*wf%GEbE8`EA>IO9o6TdgbIC%+en!}(C5PGYqS0{pa?PD)5?ds=j9{w za9^@WBXMZ|D&(yfc~)tnrDd#*;u;0?8=lh4%b-lFPR3ItwVJp};HMdEw#SXg>f-zU zEiaj5H=jzRSy(sWVd%hnLZE{SUj~$xk&TfheSch#23)YTcjrB+IVe0jJqsdz__n{- zC~7L`DG}-Dgrinzf7Jr)e&^tdQ}8v7F+~eF*<`~Vph=MIB|YxNEtLo1jXt#9#UG5` zQ$OSk`u!US+Z!=>dGL>%i#uV<5*F?pivBH@@1idFrzVAzttp5~>Y?D0LV;8Yv`wAa{hewVjlhhBM z_mJhU9yWz9Jexg@G~dq6EW5^nDXe(sU^5{}qbd0*yW2Xq6G37f8{{X&Z>G~dUGDFu zgmsDDZZ5ZmtiBw58CERFPrEG>*)*`_B75!MDsOoK`T1aJ4GZ1avI?Z3OX|Hg?P(xy zSPgO$alKZuXd=pHP6UZy0G>#BFm(np+dekv0l6gd=36FijlT8^kI5; zw?Z*FPsibF2d9T$_L@uX9iw*>y_w9HSh8c=Rm}f>%W+8OS=Hj_wsH-^actull3c@!z@R4NQ4qpytnwMaY z)>!;FUeY?h2N9tD(othc7Q=(dF zZAX&Y1ac1~0n(z}!9{J2kPPnru1?qteJPvA2m!@3Zh%+f1VQt~@leK^$&ZudOpS!+ zw#L0usf!?Df1tB?9=zPZ@q2sG!A#9 zKZL`2cs%|Jf}wG=_rJkwh|5Idb;&}z)JQuMVCZSH9kkG%zvQO01wBN)c4Q`*xnto3 zi7TscilQ>t_SLij{@Fepen*a(`upw#RJAx|JYYXvP1v8f)dTHv9pc3ZUwx!0tOH?c z^Hn=gfjUyo!;+3vZhxNE?LJgP`qYJ`J)umMXT@b z{nU(a^xFfofcxfHN-!Jn*{Dp5NZ&i9#9r{)s^lUFCzs5LQL9~HgxvmU#W|iNs0<3O z%Y2FEgvts4t({%lfX1uJ$w{JwfpV|HsO{ZDl2|Q$-Q?UJd`@SLBsMKGjFFrJ(s?t^ z2Llf`deAe@YaGJf)k2e&ryg*m8R|pcjct@rOXa=64#V9!sp=6tC#~QvYh&M~zmJ;% zr*A}V)Ka^3JE!1pcF5G}b&jdrt;bM^+J;G^#R08x@{|ZWy|547&L|k6)HLG|sN<~o z?y`%kbfRN_vc}pwS!Zr}*q6DG7;be0qmxn)eOcD%s3Wk`=@GM>U3ojhAW&WRppi0e zudTj{ufwO~H7izZJmLJD3uPHtjAJvo6H=)&SJ_2%qRRECN#HEU_RGa(Pefk*HIvOH zW7{=Tt(Q(LZ6&WX_Z9vpen}jqge|wCCaLYpiw@f_%9+-!l{kYi&gT@Cj#D*&rz1%e z@*b1W13bN8^j7IpAi$>`_0c!aVzLe*01DY-AcvwE;kW}=Z{3RJLR|O~^iOS(dNEnL zJJ?Dv^ab++s2v!4Oa_WFDLc4fMspglkh;+vzg)4;LS{%CR*>VwyP4>1Tly+!fA-k? z6$bg!*>wKtg!qGO6GQ=cAmM_RC&hKg$~(m2LdP{{*M+*OVf07P$OHp*4SSj9H;)1p z^b1_4p4@C;8G7cBCB6XC{i@vTB3#55iRBZiml^jc4sYnepCKUD+~k}TiuA;HWC6V3 zV{L5uUAU9CdoU+qsFszEwp;@d^!6XnX~KI|!o|=r?qhs`(-Y{GfO4^d6?8BC0xonf zKtZc1C@dNu$~+p#m%JW*J7alfz^$x`U~)1{c7svkIgQ3~RK2LZ5;2TAx=H<4AjC8{ z;)}8OfkZy7pSzVsdX|wzLe=SLg$W1+`Isf=o&}npxWdVR(i8Rr{uzE516a@28VhVr zVgZ3L&X(Q}J0R2{V(}bbNwCDD5K)<5h9CLM*~!xmGTl{Mq$@;~+|U*O#nc^oHnFOy z9Kz%AS*=iTBY_bSZAAY6wXCI?EaE>8^}WF@|}O@I#i69ljjWQPBJVk zQ_rt#J56_wGXiyItvAShJpLEMtW_)V5JZAuK#BAp6bV3K;IkS zK0AL(3ia99!vUPL#j>?<>mA~Q!mC@F-9I$9Z!96ZCSJO8FDz1SP3gF~m`1c#y!efq8QN}eHd+BHwtm%M5586jlU8&e!CmOC z^N_{YV$1`II$~cTxt*dV{-yp61nUuX5z?N8GNBuZZR}Uy_Y3_~@Y3db#~-&0TX644OuG^D3w_`?Yci{gTaPWST8`LdE)HK5OYv>a=6B%R zw|}>ngvSTE1rh`#1Rey0?LXTq;bCIy>TKm^CTV4BCSqdpx1pzC3^ca*S3fUBbKMzF z6X%OSdtt50)yJw*V_HE`hnBA)1yVN3Ruq3l@lY;%Bu+Q&hYLf_Z@fCUVQY-h4M3)- zE_G|moU)Ne0TMjhg?tscN7#ME6!Rb+y#Kd&-`!9gZ06o3I-VX1d4b1O=bpRG-tDK0 zSEa9y46s7QI%LmhbU3P`RO?w#FDM(}k8T`&>OCU3xD=s5N7}w$GntXF;?jdVfg5w9OR8VPxp5{uw zD+_;Gb}@7Vo_d3UV7PS65%_pBUeEwX_Hwfe2e6Qmyq$%0i8Ewn%F7i%=CNEV)Qg`r|&+$ zP6^Vl(MmgvFq`Zb715wYD>a#si;o+b4j^VuhuN>+sNOq6Qc~Y;Y=T&!Q4>(&^>Z6* zwliz!_16EDLTT;v$@W(s7s0s zi*%p>q#t)`S4j=Ox_IcjcllyT38C4hr&mlr6qX-c;qVa~k$MG;UqdnzKX0wo0Xe-_)b zrHu1&21O$y5828UIHI@N;}J@-9cpxob}zqO#!U%Q*ybZ?BH#~^fOT_|8&xAs_rX24 z^nqn{UWqR?MlY~klh)#Rz-*%&e~9agOg*fIN`P&v!@gcO25Mec23}PhzImkdwVT|@ zFR9dYYmf&HiUF4xO9@t#u=uTBS@k*97Z!&hu@|xQnQDkLd!*N`!0JN7{EUoH%OD85 z@aQ2(w-N)1_M{;FV)C#(a4p!ofIA3XG(XZ2E#%j_(=`IWlJAHWkYM2&(+yY|^2TB0 z>wfC-+I}`)LFOJ%KeBb1?eNxGKeq?AI_eBE!M~$wYR~bB)J3=WvVlT8ZlF2EzIFZt zkaeyj#vmBTGkIL9mM3cEz@Yf>j=82+KgvJ-u_{bBOxE5zoRNQW3+Ahx+eMGem|8xo zL3ORKxY_R{k=f~M5oi-Z>5fgqjEtzC&xJEDQ@`<)*Gh3UsftBJno-y5Je^!D?Im{j za*I>RQ=IvU@5WKsIr?kC$DT+2bgR>8rOf3mtXeMVB~sm%X7W5`s=Tp>FR544tuQ>9qLt|aUSv^io&z93luW$_OYE^sf8DB?gx z4&k;dHMWph>Z{iuhhFJr+PCZ#SiZ9e5xM$A#0yPtVC>yk&_b9I676n|oAH?VeTe*1 z@tDK}QM-%J^3Ns6=_vh*I8hE?+=6n9nUU`}EX|;Mkr?6@NXy8&B0i6h?7%D=%M*Er zivG61Wk7e=v;<%t*G+HKBqz{;0Biv7F+WxGirONRxJij zon5~(a`UR%uUzfEma99QGbIxD(d}~oa|exU5Y27#4k@N|=hE%Y?Y3H%rcT zHmNO#ZJ7nPHRG#y-(-FSzaZ2S{`itkdYY^ZUvyw<7yMBkNG+>$Rfm{iN!gz7eASN9-B3g%LIEyRev|3)kSl;JL zX7MaUL_@~4ot3$woD0UA49)wUeu7#lj77M4ar8+myvO$B5LZS$!-ZXw3w;l#0anYz zDc_RQ0Ome}_i+o~H=CkzEa&r~M$1GC!-~WBiHiDq9Sdg{m|G?o7g`R%f(Zvby5q4; z=cvn`M>RFO%i_S@h3^#3wImmWI4}2x4skPNL9Am{c!WxR_spQX3+;fo!y(&~Palyjt~Xo0uy6d%sX&I`e>zv6CRSm)rc^w!;Y6iVBb3x@Y=`hl9jft zXm5vilB4IhImY5b->x{!MIdCermpyLbsalx8;hIUia%*+WEo4<2yZ6`OyG1Wp%1s$ zh<|KrHMv~XJ9dC8&EXJ`t3ETz>a|zLMx|MyJE54RU(@?K&p2d#x?eJC*WKO9^d17# zdTTKx-Os3k%^=58Sz|J28aCJ}X2-?YV3T7ee?*FoDLOC214J4|^*EX`?cy%+7Kb3(@0@!Q?p zk>>6dWjF~y(eyRPqjXqDOT`4^Qv-%G#Zb2G?&LS-EmO|ixxt79JZlMgd^~j)7XYQ; z62rGGXA=gLfgy{M-%1gR87hbhxq-fL)GSfEAm{yLQP!~m-{4i_jG*JsvUdqAkoc#q6Yd&>=;4udAh#?xa2L z7mFvCjz(hN7eV&cyFb%(U*30H@bQ8-b7mkm!=wh2|;+_4vo=tyHPQ0hL=NR`jbsSiBWtG ztMPPBgHj(JTK#0VcP36Z`?P|AN~ybm=jNbU=^3dK=|rLE+40>w+MWQW%4gJ`>K!^- zx4kM*XZLd(E4WsolMCRsdvTGC=37FofIyCZCj{v3{wqy4OXX-dZl@g`Dv>p2`l|H^ zS_@(8)7gA62{Qfft>vx71stILMuyV4uKb7BbCstG@|e*KWl{P1$=1xg(7E8MRRCWQ1g)>|QPAZot~|FYz_J0T+r zTWTB3AatKyUsTXR7{Uu) z$1J5SSqoJWt(@@L5a)#Q6bj$KvuC->J-q1!nYS6K5&e7vNdtj- zj9;qwbODLgIcObqNRGs1l{8>&7W?BbDd!87=@YD75B2ep?IY|gE~t)$`?XJ45MG@2 zz|H}f?qtEb_p^Xs$4{?nA=Qko3Lc~WrAS`M%9N60FKqL7XI+v_5H-UDiCbRm`fEmv z$pMVH*#@wQqml~MZe+)e4Ts3Gl^!Z0W3y$;|9hI?9(iw29b7en0>Kt2pjFXk@!@-g zTb4}Kw!@u|V!wzk0|qM*zj$*-*}e*ZXs#Y<6E_!BR}3^YtjI_byo{F+w9H9?f%mnBh(uE~!Um7)tgp2Ye;XYdVD95qt1I-fc@X zXHM)BfJ?^g(s3K|{N8B^hamrWAW|zis$`6|iA>M-`0f+vq(FLWgC&KnBDsM)_ez1# zPCTfN8{s^K`_bum2i5SWOn)B7JB0tzH5blC?|x;N{|@ch(8Uy-O{B2)OsfB$q0@FR z27m3YkcVi$KL;;4I*S;Z#6VfZcZFn!D2Npv5pio)sz-`_H*#}ROd7*y4i(y(YlH<4 zh4MmqBe^QV_$)VvzWgMXFy`M(vzyR2u!xx&%&{^*AcVLrGa8J9ycbynjKR~G6zC0e zlEU>zt7yQtMhz>XMnz>ewXS#{Bulz$6HETn?qD5v3td>`qGD;Y8&RmkvN=24=^6Q@DYY zxMt}uh2cSToMkkIWo1_Lp^FOn$+47JXJ*#q=JaeiIBUHEw#IiXz8cStEsw{UYCA5v_%cF@#m^Y!=+qttuH4u}r6gMvO4EAvjBURtLf& z6k!C|OU@hv_!*qear3KJ?VzVXDKqvKRtugefa7^^MSWl0fXXZR$Xb!b6`eY4A1#pk zAVoZvb_4dZ{f~M8fk3o?{xno^znH1t;;E6K#9?erW~7cs%EV|h^K>@&3Im}c7nm%Y zbLozFrwM&tSNp|46)OhP%MJ(5PydzR>8)X%i3!^L%3HCoCF#Y0#9vPI5l&MK*_ z6G8Y>$`~c)VvQle_4L_AewDGh@!bKkJeEs_NTz(yilnM!t}7jz>fmJb89jQo6~)%% z@GNIJ@AShd&K%UdQ5vR#yT<-goR+D@Tg;PuvcZ*2AzSWN&wW$Xc+~vW)pww~O|6hL zBxX?hOyA~S;3rAEfI&jmMT4f!-eVm%n^KF_QT=>!A<5tgXgi~VNBXqsFI(iI$Tu3x0L{<_-%|HMG4Cn?Xs zq~fvBhu;SDOCD7K5(l&i7Py-;Czx5byV*3y%#-Of9rtz?M_owXc2}$OIY~)EZ&2?r zLQ(onz~I7U!w?B%LtfDz)*X=CscqH!UE=mO?d&oYvtj|(u)^yomS;Cd>Men|#2yuD zg&tf(*iSHyo;^A03p&_j*QXay9d}qZ0CgU@rnFNDIT5xLhC5_tlugv()+w%`7;ICf z>;<#L4m@{1}Og76*e zHWFm~;n@B1GqO8s%=qu)+^MR|jp(ULUOi~v;wE8SB6^mK@adSb=o+A_>Itjn13AF& zDZe+wUF9G!JFv|dpj1#d+}BO~s*QTe3381TxA%Q>P*J#z%( z5*8N^QWxgF73^cTKkkvgvIzf*cLEyyKw)Wf{#$n{uS#(rAA~>TS#!asqQ2m_izXe3 z7$Oh=rR;sdmVx3G)s}eImsb<@r2~5?vcw*Q4LU~FFh!y4r*>~S7slAE6)W3Up2OHr z2R)+O<0kKo<3+5vB}v!lB*`%}gFldc+79iahqEx#&Im@NCQU$@PyCZbcTt?K{;o@4 z312O9GB)?X&wAB}*-NEU zn@6`)G`FhT8O^=Cz3y+XtbwO{5+{4-&?z!esFts-C zypwgI^4#tZ74KC+_IW|E@kMI=1pSJkvg$9G3Va(!reMnJ$kcMiZ=30dTJ%(Ws>eUf z;|l--TFDqL!PZbLc_O(XP0QornpP;!)hdT#Ts7tZ9fcQeH&rhP_1L|Z_ha#JOroe^qcsLi`+AoBWHPM7}gD z+mHuPXd14M?nkp|nu9G8hPk;3=JXE-a204Fg!BK|$MX`k-qPeD$2OOqvF;C(l8wm13?>i(pz7kRyYm zM$IEzf`$}B%ezr!$(UO#uWExn%nTCTIZzq&8@i8sP#6r8 z*QMUzZV(LEWZb)wbmf|Li;UpiP;PlTQ(X4zreD`|`RG!7_wc6J^MFD!A=#K*ze>Jg z?9v?p(M=fg_VB0+c?!M$L>5FIfD(KD5ku*djwCp+5GVIs9^=}kM2RFsxx0_5DE%BF zykxwjWvs=rbi4xKIt!z$&v(`msFrl4n>a%NO_4`iSyb!UiAE&mDa+apc zPe)#!ToRW~rqi2e1bdO1RLN5*uUM@{S`KLJhhY-@TvC&5D(c?a(2$mW-&N%h5IfEM zdFI6`6KJiJQIHvFiG-34^BtO3%*$(-Ht_JU*(KddiUYoM{coadlG&LVvke&*p>Cac z^BPy2Zteiq1@ulw0e)e*ot7@A$RJui0$l^{lsCt%R;$){>zuRv9#w@;m=#d%%TJmm zC#%eFOoy$V)|3*d<OC1iP+4R7D z8FE$E8l2Y?(o-i6wG=BKBh0-I?i3WF%hqdD7VCd;vpk|LFP!Et8$@voH>l>U8BY`Q zC*G;&y6|!p=7`G$*+hxCv!@^#+QD3m>^azyZoLS^;o_|plQaj-wx^ zRV&$HcY~p)2|Zqp0SYU?W3zV87s6JP-@D~$t0 zvd;-YL~JWc*8mtHz_s(cXus#XYJc5zdC=&!4MeZ;N3TQ>^I|Pd=HPjVP*j^45rs(n zzB{U4-44=oQ4rNN6@>qYVMH4|GmMIz#z@3UW-1_y#eNa+Q%(41oJ5i(DzvMO^%|?L z^r_+MZtw0DZ0=BT-@?hUtA)Ijk~Kh-N8?~X5%KnRH7cb!?Yrd8gtiEo!v{sGrQk{X zvV>h{8-DqTyuAxIE(hb}jMVtga$;FIrrKm>ye5t%M;p!jcH1(Bbux>4D#MVhgZGd> z=c=nVb%^9T?iDgM&9G(mV5xShc-lBLi*6RShenDqB%`-2;I*;IHg6>#ovKQ$M}dDb z<$USN%LMqa5_5DR7g7@(oAoQ%!~<1KSQr$rmS{UFQJs5&qBhgTEM_Y7|0Wv?fbP`z z)`8~=v;B)+>Jh`V*|$dTxKe`HTBkho^-!!K#@i{9FLn-XqX&fQcGsEAXp)BV7(`Lk zC{4&+Pe-0&<)C0kAa(MTnb|L;ZB5i|b#L1o;J)+?SV8T*U9$Vxhy}dm3%!A}SK9l_6(#5(e*>8|;4gNKk7o_%m_ zEaS=Z(ewk}hBJ>v`jtR=$pm_Wq3d&DU+6`BACU4%qdhH1o^m8hT2&j<4Z8!v=rMCk z-I*?48{2H*&+r<{2?wp$kh@L@=rj8c`EaS~J>W?)trc?zP&4bsNagS4yafuDoXpi5`!{BVqJ1$ZC3`pf$`LIZ(`0&Ik+!_Xa=NJW`R2 zd#Ntgwz`JVwC4A61$FZ&kP)-{T|rGO59`h#1enAa`cWxRR8bKVvvN6jBzAYePrc&5 z+*zr3en|LYB2>qJp479rEALk5d*X-dfKn6|kuNm;2-U2+P3_rma!nWjZQ-y*q3JS? zBE}zE-!1ZBR~G%v!$l#dZ*$UV4$7q}xct}=on+Ba8{b>Y9h*f-GW0D0o#vJ0%ALg( ztG2+AjWlG#d;myA(i&dh8Gp?y9HD@`CTaDAy?c&0unZ%*LbLIg4;m{Kc?)ws3^>M+ zt5>R)%KIJV*MRUg{0$#nW=Lj{#8?dD$yhjBOrAeR#4$H_Dc(eyA4dNjZEz1Xk+Bqt zB&pPl+?R{w8GPv%VI`x`IFOj320F1=cV4aq0(*()Tx!VVxCjua;)t}gTr=b?zY+U! zkb}xjXZ?hMJN{Hjw?w&?gz8Ow`htX z@}WG*_4<%ff8(!S6bf3)p+8h2!Rory>@aob$gY#fYJ=LiW0`+~l7GI%EX_=8 z{(;0&lJ%9)M9{;wty=XvHbIx|-$g4HFij`J$-z~`mW)*IK^MWVN+*>uTNqaDmi!M8 zurj6DGd)g1g(f`A-K^v)3KSOEoZXImXT06apJum-dO_%oR)z6Bam-QC&CNWh7kLOE zcxLdVjYLNO2V?IXWa-ys30Jbxw(Xm?U1{4kDs9`gZQHh8X{*w9=H&Zz&-6RL?uq#R zxN+k~JaL|gdsdvY_u6}}MHC?a@ElFeipA1Lud#M~)pp2SnG#K{a@tSpvXM;A8gz9> zRVDV5T1%%!LsNRDOw~LIuiAiKcj<%7WpgjP7G6mMU1#pFo6a-1>0I5ZdhxnkMX&#L z=Vm}?SDlb_LArobqpnU!WLQE*yVGWgs^4RRy4rrJwoUUWoA~ZJUx$mK>J6}7{CyC4 zv=8W)kKl7TmAnM%m;anEDPv5tzT{A{ON9#FPYF6c=QIc*OrPp96tiY&^Qs+#A1H>Y z<{XtWt2eDwuqM zQ_BI#UIP;2-olOL4LsZ`vTPv-eILtuB7oWosoSefWdM}BcP>iH^HmimR`G`|+9waCO z&M375o@;_My(qYvPNz;N8FBZaoaw3$b#x`yTBJLc8iIP z--la{bzK>YPP|@Mke!{Km{vT8Z4|#An*f=EmL34?!GJfHaDS#41j~8c5KGKmj!GTh&QIH+DjEI*BdbSS2~6VTt}t zhAwNQNT6%c{G`If3?|~Fp7iwee(LaUS)X9@I29cIb61} z$@YBq4hSplr&liE@ye!y&7+7n$fb+8nS~co#^n@oCjCwuKD61x$5|0ShDxhQES5MP z(gH|FO-s6#$++AxnkQR!3YMgKcF)!&aqr^a3^{gAVT`(tY9@tqgY7@ z>>ul3LYy`R({OY7*^Mf}UgJl(N7yyo$ag;RIpYHa_^HKx?DD`%Vf1D0s^ zjk#OCM5oSzuEz(7X`5u~C-Y~n4B}_3*`5B&8tEdND@&h;H{R`o%IFpIJ4~Kw!kUjehGT8W!CD7?d8sg_$KKp%@*dW)#fI1#R<}kvzBVpaog_2&W%c_jJfP` z6)wE+$3+Hdn^4G}(ymPyasc1<*a7s2yL%=3LgtZLXGuA^jdM^{`KDb%%}lr|ONDsl zy~~jEuK|XJ2y<`R{^F)Gx7DJVMvpT>gF<4O%$cbsJqK1;v@GKXm*9l3*~8^_xj*Gs z=Z#2VQ6`H@^~#5Pv##@CddHfm;lbxiQnqy7AYEH(35pTg^;u&J2xs-F#jGLuDw2%z z`a>=0sVMM+oKx4%OnC9zWdbpq*#5^yM;og*EQKpv`^n~-mO_vj=EgFxYnga(7jO?G z`^C87B4-jfB_RgN2FP|IrjOi;W9AM1qS}9W@&1a9Us>PKFQ9~YE!I~wTbl!m3$Th? z)~GjFxmhyyGxN}t*G#1^KGVXm#o(K0xJyverPe}mS=QgJ$#D}emQDw+dHyPu^&Uv> z4O=3gK*HLFZPBY|!VGq60Of6QrAdj`nj1h!$?&a;Hgaj{oo{l0P3TzpJK_q_eW8Ng zP6QF}1{V;xlolCs?pGegPoCSxx@bshb#3ng4Fkp4!7B0=&+1%187izf@}tvsjZ6{m z4;K>sR5rm97HJrJ`w}Y`-MZN$Wv2N%X4KW(N$v2@R1RkRJH2q1Ozs0H`@ zd5)X-{!{<+4Nyd=hQ8Wm3CCd}ujm*a?L79ztfT7@&(?B|!pU5&%9Rl!`i;suAg0+A zxb&UYpo-z}u6CLIndtH~C|yz&!OV_I*L;H#C7ie_5uB1fNRyH*<^d=ww=gxvE%P$p zRHKI{^{nQlB9nLhp9yj-so1is{4^`{Xd>Jl&;dX;J)#- z=fmE5GiV?-&3kcjM1+XG7&tSq;q9Oi4NUuRrIpoyp*Fn&nVNFdUuGQ_g)g>VzXGdneB7`;!aTUE$t* z5iH+8XPxrYl)vFo~+vmcU-2) zq!6R(T0SsoDnB>Mmvr^k*{34_BAK+I=DAGu){p)(ndZqOFT%%^_y;X(w3q-L``N<6 zw9=M zoQ8Lyp>L_j$T20UUUCzYn2-xdN}{e@$8-3vLDN?GbfJ>7*qky{n!wC#1NcYQr~d51 zy;H!am=EI#*S&TCuP{FA3CO)b0AAiN*tLnDbvKwxtMw-l;G2T@EGH)YU?-B`+Y=!$ zypvDn@5V1Tr~y~U0s$ee2+CL3xm_BmxD3w}d_Pd@S%ft#v~_j;6sC6cy%E|dJy@wj z`+(YSh2CrXMxI;yVy*=O@DE2~i5$>nuzZ$wYHs$y`TAtB-ck4fQ!B8a;M=CxY^Nf{ z+UQhn0jopOzvbl(uZZ1R-(IFaprC$9hYK~b=57@ zAJ8*pH%|Tjotzu5(oxZyCQ{5MAw+6L4)NI!9H&XM$Eui-DIoDa@GpNI=I4}m>Hr^r zZjT?xDOea}7cq+TP#wK1p3}sbMK{BV%(h`?R#zNGIP+7u@dV5#zyMau+w}VC1uQ@p zrFUjrJAx6+9%pMhv(IOT52}Dq{B9njh_R`>&j&5Sbub&r*hf4es)_^FTYdDX$8NRk zMi=%I`)hN@N9>X&Gu2RmjKVsUbU>TRUM`gwd?CrL*0zxu-g#uNNnnicYw=kZ{7Vz3 zULaFQ)H=7%Lm5|Z#k?<{ux{o4T{v-e zTLj?F(_qp{FXUzOfJxEyKO15Nr!LQYHF&^jMMBs z`P-}WCyUYIv>K`~)oP$Z85zZr4gw>%aug1V1A)1H(r!8l&5J?ia1x_}Wh)FXTxZUE zs=kI}Ix2cK%Bi_Hc4?mF^m`sr6m8M(n?E+k7Tm^Gn}Kf= zfnqoyVU^*yLypz?s+-XV5(*oOBwn-uhwco5b(@B(hD|vtT8y7#W{>RomA_KchB&Cd zcFNAD9mmqR<341sq+j+2Ra}N5-3wx5IZqg6Wmi6CNO#pLvYPGNER}Q8+PjvIJ42|n zc5r@T*p)R^U=d{cT2AszQcC6SkWiE|hdK)m{7ul^mU+ED1R8G#)#X}A9JSP_ubF5p z8Xxcl;jlGjPwow^p+-f_-a~S;$lztguPE6SceeUCfmRo=Qg zKHTY*O_ z;pXl@z&7hniVYVbGgp+Nj#XP^Aln2T!D*{(Td8h{8Dc?C)KFfjPybiC`Va?Rf)X>y z;5?B{bAhPtbmOMUsAy2Y0RNDQ3K`v`gq)#ns_C&ec-)6cq)d^{5938T`Sr@|7nLl; zcyewuiSUh7Z}q8iIJ@$)L3)m)(D|MbJm_h&tj^;iNk%7K-YR}+J|S?KR|29K?z-$c z<+C4uA43yfSWBv*%z=-0lI{ev`C6JxJ};A5N;lmoR(g{4cjCEn33 z-ef#x^uc%cM-f^_+*dzE?U;5EtEe;&8EOK^K}xITa?GH`tz2F9N$O5;)`Uof4~l+t z#n_M(KkcVP*yMYlk_~5h89o zlf#^qjYG8Wovx+f%x7M7_>@r7xaXa2uXb?_*=QOEe_>ErS(v5-i)mrT3&^`Oqr4c9 zDjP_6T&NQMD`{l#K&sHTm@;}ed_sQ88X3y`ON<=$<8Qq{dOPA&WAc2>EQ+U8%>yWR zK%(whl8tB;{C)yRw|@Gn4%RhT=bbpgMZ6erACc>l5^p)9tR`(2W-D*?Ph6;2=Fr|G- zdF^R&aCqyxqWy#P7#G8>+aUG`pP*ow93N=A?pA=aW0^^+?~#zRWcf_zlKL8q8-80n zqGUm=S8+%4_LA7qrV4Eq{FHm9#9X15%ld`@UKyR7uc1X*>Ebr0+2yCye6b?i=r{MPoqnTnYnq z^?HWgl+G&@OcVx4$(y;{m^TkB5Tnhx2O%yPI=r*4H2f_6Gfyasq&PN^W{#)_Gu7e= zVHBQ8R5W6j;N6P3O(jsRU;hkmLG(Xs_8=F&xh@`*|l{~0OjUVlgm z7opltSHg7Mb%mYamGs*v1-#iW^QMT**f+Nq*AzIvFT~Ur3KTD26OhIw1WQsL(6nGg znHUo-4e15cXBIiyqN};5ydNYJ6zznECVVR44%(P0oW!yQ!YH)FPY?^k{IrtrLo7Zo`?sg%%oMP9E^+H@JLXicr zi?eoI?LODRPcMLl90MH32rf8btf69)ZE~&4d%(&D{C45egC6bF-XQ;6QKkbmqW>_H z{86XDZvjiN2wr&ZPfi;^SM6W+IP0);50m>qBhzx+docpBkkiY@2bSvtPVj~E`CfEu zhQG5G>~J@dni5M5Jmv7GD&@%UR`k3ru-W$$onI259jM&nZ)*d3QFF?Mu?{`+nVzkx z=R*_VH=;yeU?9TzQ3dP)q;P)4sAo&k;{*Eky1+Z!10J<(cJC3zY9>bP=znA=<-0RR zMnt#<9^X7BQ0wKVBV{}oaV=?JA=>R0$az^XE%4WZcA^Em>`m_obQyKbmf-GA;!S-z zK5+y5{xbkdA?2NgZ0MQYF-cfOwV0?3Tzh8tcBE{u%Uy?Ky4^tn^>X}p>4&S(L7amF zpWEio8VBNeZ=l!%RY>oVGOtZh7<>v3?`NcHlYDPUBRzgg z0OXEivCkw<>F(>1x@Zk=IbSOn+frQ^+jI*&qdtf4bbydk-jgVmLAd?5ImK+Sigh?X zgaGUlbf^b-MH2@QbqCawa$H1Vb+uhu{zUG9268pa{5>O&Vq8__Xk5LXDaR1z$g;s~;+Ae82wq#l;wo08tX(9uUX6NJWq1vZLh3QbP$# zL`udY|Qp*4ER`_;$%)2 zmcJLj|FD`(;ts0bD{}Ghq6UAVpEm#>j`S$wHi0-D_|)bEZ}#6) zIiqH7Co;TB`<6KrZi1SF9=lO+>-_3=Hm%Rr7|Zu-EzWLSF{9d(H1v*|UZDWiiqX3} zmx~oQ6%9~$=KjPV_ejzz7aPSvTo+3@-a(OCCoF_u#2dHY&I?`nk zQ@t8#epxAv@t=RUM09u?qnPr6=Y5Pj;^4=7GJ`2)Oq~H)2V)M1sC^S;w?hOB|0zXT zQdf8$)jslO>Q}(4RQ$DPUF#QUJm-k9ysZFEGi9xN*_KqCs9Ng(&<;XONBDe1Joku? z*W!lx(i&gvfXZ4U(AE@)c0FI2UqrFLOO$&Yic|`L;Vyy-kcm49hJ^Mj^H9uY8Fdm2 z?=U1U_5GE_JT;Tx$2#I3rAAs(q@oebIK=19a$N?HNQ4jw0ljtyGJ#D}z3^^Y=hf^Bb--297h6LQxi0-`TB|QY2QPg92TAq$cEQdWE ze)ltSTVMYe0K4wte6;^tE+^>|a>Hit_3QDlFo!3Jd`GQYTwlR#{<^MzG zK!vW&))~RTKq4u29bc<+VOcg7fdorq-kwHaaCQe6tLB{|gW1_W_KtgOD0^$^|`V4C# z*D_S9Dt_DIxpjk3my5cBFdiYaq||#0&0&%_LEN}BOxkb3v*d$4L|S|z z!cZZmfe~_Y`46v=zul=aixZTQCOzb(jx>8&a%S%!(;x{M2!*$od2!Pwfs>RZ-a%GOZdO88rS)ZW~{$656GgW)$Q=@!x;&Nn~!K)lr4gF*%qVO=hlodHA@2)keS2 zC}7O=_64#g&=zY?(zhzFO3)f5=+`dpuyM!Q)zS&otpYB@hhn$lm*iK2DRt+#1n|L%zjM}nB*$uAY^2JIw zV_P)*HCVq%F))^)iaZD#R9n^{sAxBZ?Yvi1SVc*`;8|F2X%bz^+s=yS&AXjysDny)YaU5RMotF-tt~FndTK ziRve_5b!``^ZRLG_ks}y_ye0PKyKQSsQCJuK5()b2ThnKPFU?An4;dK>)T^4J+XjD zEUsW~H?Q&l%K4<1f5^?|?lyCQe(O3?!~OU{_Wxs#|Ff8?a_WPQUKvP7?>1()Cy6oLeA zjEF^d#$6Wb${opCc^%%DjOjll%N2=GeS6D-w=Ap$Ux2+0v#s#Z&s6K*)_h{KFfgKjzO17@p1nKcC4NIgt+3t}&}F z@cV; zZ1r#~?R@ZdSwbFNV(fFl2lWI(Zf#nxa<6f!nBZD>*K)nI&Fun@ngq@Ge!N$O< zySt*mY&0moUXNPe~Fg=%gIu)tJ;asscQ!-AujR@VJBRoNZNk;z4hs4T>Ud!y=1NwGs-k zlTNeBOe}=)Epw=}+dfX;kZ32h$t&7q%Xqdt-&tlYEWc>>c3(hVylsG{Ybh_M8>Cz0ZT_6B|3!_(RwEJus9{;u-mq zW|!`{BCtnao4;kCT8cr@yeV~#rf76=%QQs(J{>Mj?>aISwp3{^BjBO zLV>XSRK+o=oVDBnbv?Y@iK)MiFSl{5HLN@k%SQZ}yhPiu_2jrnI?Kk?HtCv>wN$OM zSe#}2@He9bDZ27hX_fZey=64#SNU#1~=icK`D>a;V-&Km>V6ZdVNj7d2 z-NmAoOQm_aIZ2lXpJhlUeJ95eZt~4_S zIfrDs)S$4UjyxKSaTi#9KGs2P zfSD>(y~r+bU4*#|r`q+be_dopJzKK5JNJ#rR978ikHyJKD>SD@^Bk$~D0*U38Y*IpYcH>aaMdZq|YzQ-Ixd(_KZK!+VL@MWGl zG!k=<%Y-KeqK%``uhx}0#X^@wS+mX@6Ul@90#nmYaKh}?uw>U;GS4fn3|X%AcV@iY z8v+ePk)HxSQ7ZYDtlYj#zJ?5uJ8CeCg3efmc#|a%2=u>+vrGGRg$S@^mk~0f;mIu! zWMA13H1<@hSOVE*o0S5D8y=}RiL#jQpUq42D}vW$z*)VB*FB%C?wl%(3>ANaY)bO@ zW$VFutemwy5Q*&*9HJ603;mJJkB$qp6yxNOY0o_4*y?2`qbN{m&*l{)YMG_QHXXa2 z+hTmlA;=mYwg{Bfusl zyF&}ib2J;#q5tN^e)D62fWW*Lv;Rnb3GO-JVtYG0CgR4jGujFo$Waw zSNLhc{>P~>{KVZE1Vl1!z)|HFuN@J7{`xIp_)6>*5Z27BHg6QIgqLqDJTmKDM+ON* zK0Fh=EG`q13l z+m--9UH0{ZGQ%j=OLO8G2WM*tgfY}bV~>3Grcrpehjj z6Xe<$gNJyD8td3EhkHjpKk}7?k55Tu7?#;5`Qcm~ki;BeOlNr+#PK{kjV>qfE?1No zMA07}b>}Dv!uaS8Hym0TgzxBxh$*RX+Fab6Gm02!mr6u}f$_G4C|^GSXJMniy^b`G z74OC=83m0G7L_dS99qv3a0BU({t$zHQsB-RI_jn1^uK9ka_%aQuE2+~J2o!7`735Z zb?+sTe}Gd??VEkz|KAPMfj(1b{om89p5GIJ^#Aics_6DD%WnNGWAW`I<7jT|Af|8g zZA0^)`p8i#oBvX2|I&`HC8Pn&0>jRuMF4i0s=}2NYLmgkZb=0w9tvpnGiU-gTUQhJ zR6o4W6ZWONuBZAiN77#7;TR1^RKE(>>OL>YU`Yy_;5oj<*}ac99DI(qGCtn6`949f ziMpY4k>$aVfffm{dNH=-=rMg|u?&GIToq-u;@1-W&B2(UOhC-O2N5_px&cF-C^tWp zXvChm9@GXEcxd;+Q6}u;TKy}$JF$B`Ty?|Y3tP$N@Rtoy(*05Wj-Ks32|2y2ZM>bM zi8v8E1os!yorR!FSeP)QxtjIKh=F1ElfR8U7StE#Ika;h{q?b?Q+>%78z^>gTU5+> zxQ$a^rECmETF@Jl8fg>MApu>btHGJ*Q99(tMqsZcG+dZ6Yikx7@V09jWCiQH&nnAv zY)4iR$Ro223F+c3Q%KPyP9^iyzZsP%R%-i^MKxmXQHnW6#6n7%VD{gG$E;7*g86G< zu$h=RN_L2(YHO3@`B<^L(q@^W_0#U%mLC9Q^XEo3LTp*~(I%?P_klu-c~WJxY1zTI z^PqntLIEmdtK~E-v8yc&%U+jVxW5VuA{VMA4Ru1sk#*Srj0Pk#tZuXxkS=5H9?8eb z)t38?JNdP@#xb*yn=<*_pK9^lx%;&yH6XkD6-JXgdddZty8@Mfr9UpGE!I<37ZHUe z_Rd+LKsNH^O)+NW8Ni-V%`@J_QGKA9ZCAMSnsN>Ych9VW zCE7R_1FVy}r@MlkbxZ*TRIGXu`ema##OkqCM9{wkWQJg^%3H${!vUT&vv2250jAWN zw=h)C!b2s`QbWhBMSIYmWqZ_~ReRW;)U#@C&ThctSd_V!=HA=kdGO-Hl57an|M1XC?~3f0{7pyjWY}0mChU z2Fj2(B*r(UpCKm-#(2(ZJD#Y|Or*Vc5VyLpJ8gO1;fCm@EM~{DqpJS5FaZ5%|ALw) zyumBl!i@T57I4ITCFmdbxhaOYud}i!0YkdiNRaQ%5$T5>*HRBhyB~<%-5nj*b8=i= z(8g(LA50%0Zi_eQe}Xypk|bt5e6X{aI^jU2*c?!p*$bGk=?t z+17R){lx~Z{!B34Zip~|A;8l@%*Gc}kT|kC0*Ny$&fI3@%M! zqk_zvN}7bM`x@jqFOtaxI?*^Im5ix@=`QEv;__i;Tek-&7kGm6yP17QANVL>*d0B=4>i^;HKb$k8?DYFMr38IX4azK zBbwjF%$>PqXhJh=*7{zH5=+gi$!nc%SqFZlwRm zmpctOjZh3bwt!Oc>qVJhWQf>`HTwMH2ibK^eE*j!&Z`-bs8=A`Yvnb^?p;5+U=Fb8 z@h>j_3hhazd$y^Z-bt%3%E3vica%nYnLxW+4+?w{%|M_=w^04U{a6^22>M_?{@mXP zS|Qjcn4&F%WN7Z?u&I3fU(UQVw4msFehxR*80dSb=a&UG4zDQp&?r2UGPy@G?0FbY zVUQ?uU9-c;f9z06$O5FO1TOn|P{pLcDGP?rfdt`&uw|(Pm@$n+A?)8 zP$nG(VG&aRU*(_5z#{+yVnntu`6tEq>%9~n^*ao}`F6ph_@6_8|AfAXtFfWee_14` zKKURYV}4}=UJmxv7{RSz5QlwZtzbYQs0;t3?kx*7S%nf-aY&lJ@h?-BAn%~0&&@j) zQd_6TUOLXErJ`A3vE?DJIbLE;s~s%eVt(%fMzUq^UfZV9c?YuhO&6pwKt>j(=2CkgTNEq7&c zfeGN+%5DS@b9HO>zsoRXv@}(EiA|t5LPi}*R3?(-=iASADny<{D0WiQG>*-BSROk4vI6%$R>q64J&v-T+(D<_(b!LD z9GL;DV;;N3!pZYg23mcg81tx>7)=e%f|i{6Mx0GczVpc}{}Mg(W_^=Wh0Rp+xXgX` z@hw|5=Je&nz^Xa>>vclstYt;8c2PY)87Ap;z&S&`yRN>yQVV#K{4&diVR7Rm;S{6m z6<+;jwbm`==`JuC6--u6W7A@o4&ZpJV%5+H)}toy0afF*!)AaG5=pz_i9}@OG%?$O z2cec6#@=%xE3K8;^ps<2{t4SnqH+#607gAHP-G4^+PBiC1s>MXf&bQ|Pa;WBIiErV z?3VFpR9JFl9(W$7p3#xe(Bd?Z93Uu~jHJFo7U3K_x4Ej-=N#=a@f;kPV$>;hiN9i9 z<6elJl?bLI$o=|d6jlihA4~bG;Fm2eEnlGxZL`#H%Cdes>uJfMJ4>@1SGGeQ81DwxGxy7L5 zm05Ik*WpSgZvHh@Wpv|2i|Y#FG?Y$hbRM5ZF0Z7FB3cY0+ei#km9mDSPI}^!<<`vr zuv$SPg2vU{wa)6&QMY)h1hbbxvR2cc_6WcWR`SH& z&KuUQcgu}!iW2Wqvp~|&&LSec9>t(UR_|f$;f-fC&tSO-^-eE0B~Frttnf+XN(#T) z^PsuFV#(pE#6ztaI8(;ywN%CtZh?w&;_)w_s@{JiA-SMjf&pQk+Bw<}f@Q8-xCQMwfaf zMgHsAPU=>>Kw~uDFS(IVRN{$ak(SV(hrO!UqhJ?l{lNnA1>U24!=>|q_p404Xd>M# z7?lh^C&-IfeIr`Dri9If+bc%oU0?|Rh8)%BND5;_9@9tuM)h5Kcw6}$Ca7H_n)nOf0pd`boCXItb`o11 zb`)@}l6I_h>n+;`g+b^RkYs7;voBz&Gv6FLmyvY|2pS)z#P;t8k;lS>49a$XeVDc4 z(tx2Pe3N%Gd(!wM`E7WRBZy)~vh_vRGt&esDa0NCua)rH#_39*H0!gIXpd>~{rGx+ zJKAeXAZ-z5n=mMVqlM5Km;b;B&KSJlScD8n?2t}kS4Wf9@MjIZSJ2R?&=zQn zs_`=+5J$47&mP4s{Y{TU=~O_LzSrXvEP6W?^pz<#Y*6Fxg@$yUGp31d(h+4x>xpb< zH+R639oDST6F*0iH<9NHC^Ep*8D4-%p2^n-kD6YEI<6GYta6-I;V^ZH3n5}syTD=P z3b6z=jBsdP=FlXcUe@I|%=tY4J_2j!EVNEzph_42iO3yfir|Dh>nFl&Lu9!;`!zJB zCis9?_(%DI?$CA(00pkzw^Up`O;>AnPc(uE$C^a9868t$m?5Q)CR%!crI$YZpiYK6m= z!jv}82He`QKF;10{9@roL2Q7CF)OeY{~dBp>J~X#c-Z~{YLAxNmn~kWQW|2u!Yq00 zl5LKbzl39sVCTpm9eDW_T>Z{x@s6#RH|P zA~_lYas7B@SqI`N=>x50Vj@S)QxouKC(f6Aj zz}7e5e*5n?j@GO;mCYEo^Jp_*BmLt3!N)(T>f#L$XHQWzZEVlJo(>qH@7;c%fy zS-jm^Adju9Sm8rOKTxfTU^!&bg2R!7C_-t+#mKb_K?0R72%26ASF;JWA_prJ8_SVW zOSC7C&CpSrgfXRp8r)QK34g<~!1|poTS7F;)NseFsbwO$YfzEeG3oo!qe#iSxQ2S# z1=Fxc9J;2)pCab-9o-m8%BLjf(*mk#JJX3k9}S7Oq)dV0jG)SOMbw7V^Z<5Q0Cy$< z^U0QUVd4(96W03OA1j|x%{sd&BRqIERDb6W{u1p1{J(a;fd6lnWzjeS`d?L3-0#o7 z{Qv&L7!Tm`9|}u=|IbwS_jgH(_V@o`S*R(-XC$O)DVwF~B&5c~m!zl14ydT6sK+Ly zn+}2hQ4RTC^8YvrQ~vk$f9u=pTN{5H_yTOcza9SVE&nt_{`ZC8zkmFji=UyD`G4~f zUfSTR=Kju>6u+y&|Bylb*W&^P|8fvEbQH3+w*DrKq|9xMzq2OiZyM=;(?>~4+O|jn zC_Et05oc>e%}w4ye2Fm%RIR??VvofwZS-}BL@X=_4jdHp}FlMhW_IW?Zh`4$z*Wr!IzQHa3^?1|);~VaWmsIcmc6 zJs{k0YW}OpkfdoTtr4?9F6IX6$!>hhA+^y_y@vvA_Gr7u8T+i-< zDX(~W5W{8mfbbM-en&U%{mINU#Q8GA`byo)iLF7rMVU#wXXY`a3ji3m{4;x53216i z`zA8ap?>_}`tQj7-%$K78uR}R$|@C2)qgop$}o=g(jOv0ishl!E(R73N=i0~%S)6+ z1xFP7|H0yt3Z_Re*_#C2m3_X{=zi1C&3CM7e?9-Y5lCtAlA%RFG9PDD=Quw1dfYnZ zdUL)#+m`hKx@PT`r;mIx_RQ6Txbti+&;xQorP;$H=R2r)gPMO9>l+!p*Mt04VH$$M zSLwJ81IFjQ5N!S#;MyBD^IS`2n04kuYbZ2~4%3%tp0jn^**BZQ05ELp zY%yntZ=52s6U5Y93Aao)v~M3y?6h7mZcVGp63pK*d&!TRjW99rUU;@s#3kYB76Bs$|LRwkH>L!0Xe zE=dz1o}phhnOVYZFsajQsRA^}IYZnk9Wehvo>gHPA=TPI?2A`plIm8=F1%QiHx*Zn zi)*Y@)$aXW0v1J|#+R2=$ysooHZ&NoA|Wa}htd`=Eud!(HD7JlT8ug|yeBZmpry(W z)pS>^1$N#nuo3PnK*>Thmaxz4pLcY?PP2r3AlhJ7jw(TI8V#c}>Ym;$iPaw+83L+* z!_QWpYs{UWYcl0u z(&(bT0Q*S_uUX9$jC;Vk%oUXw=A-1I+!c18ij1CiUlP@pfP9}CHAVm{!P6AEJ(7Dn z?}u#}g`Q?`*|*_0Rrnu8{l4PP?yCI28qC~&zlwgLH2AkfQt1?B#3AOQjW&10%@@)Q zDG?`6$8?Nz(-sChL8mRs#3z^uOA>~G=ZIG*mgUibWmgd{a|Tn4nkRK9O^37E(()Q% zPR0#M4e2Q-)>}RSt1^UOCGuv?dn|IT3#oW_$S(YR+jxAzxCD_L25p_dt|^>g+6Kgj zJhC8n)@wY;Y7JI6?wjU$MQU|_Gw*FIC)x~^Eq1k41BjLmr}U>6#_wxP0-2Ka?uK14u5M-lAFSX$K1K{WH!M1&q}((MWWUp#Uhl#n_yT5dFs4X`>vmM& z*1!p0lACUVqp&sZG1GWATvZEENs^0_7Ymwem~PlFN3hTHVBv(sDuP;+8iH07a)s(# z%a7+p1QM)YkS7>kbo${k2N1&*%jFP*7UABJ2d||c!eSXWM*<4(_uD7;1XFDod@cT$ zP>IC%^fbC${^QrUXy$f)yBwY^g@}}kngZKa1US!lAa+D=G4wklukaY8AEW%GL zh40pnuv*6D>9`_e14@wWD^o#JvxYVG-~P)+<)0fW zP()DuJN?O*3+Ab!CP-tGr8S4;JN-Ye^9D%(%8d{vb_pK#S1z)nZzE^ezD&%L6nYbZ z*62>?u)xQe(Akd=e?vZbyb5)MMNS?RheZDHU?HK<9;PBHdC~r{MvF__%T)-9ifM#cR#2~BjVJYbA>xbPyl9yNX zX)iFVvv-lfm`d?tbfh^j*A|nw)RszyD<#e>llO8X zou=q3$1|M@Ob;F|o4H0554`&y9T&QTa3{yn=w0BLN~l;XhoslF-$4KGNUdRe?-lcV zS4_WmftU*XpP}*wFM^oKT!D%_$HMT#V*j;9weoOq0mjbl1271$F)`Q(C z76*PAw3_TE{vntIkd=|(zw)j^!@j ^tV@s0U~V+mu)vv`xgL$Z9NQLnuRdZ;95D|1)!0Aybwv}XCE#xz1k?ZC zxAU)v@!$Sm*?)t2mWrkevNFbILU9&znoek=d7jn*k+~ptQ)6z`h6e4B&g?Q;IK+aH z)X(BH`n2DOS1#{AJD-a?uL)@Vl+`B=6X3gF(BCm>Q(9+?IMX%?CqgpsvK+b_de%Q> zj-GtHKf!t@p2;Gu*~#}kF@Q2HMevg~?0{^cPxCRh!gdg7MXsS}BLtG_a0IY0G1DVm z2F&O-$Dzzc#M~iN`!j38gAn`6*~h~AP=s_gy2-#LMFoNZ0<3q+=q)a|4}ur7F#><%j1lnr=F42Mbti zi-LYs85K{%NP8wE1*r4Mm+ZuZ8qjovmB;f##!E*M{*A(4^~vg!bblYi1M@7tq^L8- zH7tf_70iWXqcSQgENGdEjvLiSLicUi3l0H*sx=K!!HLxDg^K|s1G}6Tam|KBV>%YeU)Q>zxQe;ddnDTWJZ~^g-kNeycQ?u242mZs`i8cP)9qW`cwqk)Jf?Re0=SD=2z;Gafh(^X-=WJ$i7Z9$Pao56bTwb+?p>L3bi9 zP|qi@;H^1iT+qnNHBp~X>dd=Us6v#FPDTQLb9KTk%z{&OWmkx3uY(c6JYyK3w|z#Q zMY%FPv%ZNg#w^NaW6lZBU+}Znwc|KF(+X0RO~Q6*O{T-P*fi@5cPGLnzWMSyoOPe3 z(J;R#q}3?z5Ve%crTPZQFLTW81cNY-finw!LH9wr$(C)p_@v?(y#b-R^Pv!}_#7t+A?pHEUMY zoQZIwSETTKeS!W{H$lyB1^!jn4gTD{_mgG?#l1Hx2h^HrpCXo95f3utP-b&%w80F} zXFs@Jp$lbIL64@gc?k*gJ;OForPaapOH7zNMB60FdNP<*9<@hEXJk9Rt=XhHR-5_$Ck-R?+1py&J3Y9^sBBZuj?GwSzua;C@9)@JZpaI zE?x6{H8@j9P06%K_m%9#nnp0Li;QAt{jf-7X%Pd2jHoI4As-9!UR=h6Rjc z!3{UPWiSeLG&>1V5RlM@;5HhQW_&-wL2?%k@dvRS<+@B6Yaj*NG>qE5L*w~1ATP$D zmWu6(OE=*EHqy{($~U4zjxAwpPn42_%bdH9dMphiUU|) z*+V@lHaf%*GcXP079>vy5na3h^>X=n;xc;VFx)`AJEk zYZFlS#Nc-GIHc}j06;cOU@ zAD7Egkw<2a8TOcfO9jCp4U4oI*`|jpbqMWo(={gG3BjuM3QTGDG`%y|xithFck}0J zG}N#LyhCr$IYP`#;}tdm-7^9=72+CBfBsOZ0lI=LC_a%U@(t3J_I1t(UdiJ^@NubM zvvA0mGvTC%{fj53M^|Ywv$KbW;n8B-x{9}Z!K6v-tw&Xe_D2{7tX?eVk$sA*0826( zuGz!K7$O#;K;1w<38Tjegl)PmRso`fc&>fAT5s z7hzQe-_`lx`}2=c)jz6;yn(~F6#M@z_7@Z(@GWbIAo6A2&;aFf&>CVHpqoPh5#~=G zav`rZ3mSL2qwNL+Pg>aQv;%V&41e|YU$!fQ9Ksle!XZERpjAowHtX zi#0lnw{(zmk&}t`iFEMmx-y7FWaE*vA{Hh&>ieZg{5u0-3@a8BY)Z47E`j-H$dadu zIP|PXw1gjO@%aSz*O{GqZs_{ke|&S6hV{-dPkl*V|3U4LpqhG0eVdqfeNX28hrafI zE13WOsRE|o?24#`gQJs@v*EwL{@3>Ffa;knvI4@VEG2I>t-L(KRS0ShZ9N!bwXa}e zI0}@2#PwFA&Y9o}>6(ZaSaz>kw{U=@;d{|dYJ~lyjh~@bBL>n}#@KjvXUOhrZ`DbnAtf5bz3LD@0RpmAyC-4cgu<7rZo&C3~A_jA*0)v|Ctcdu} zt@c7nQ6hSDC@76c4hI&*v|5A0Mj4eQ4kVb0$5j^*$@psB zdouR@B?l6E%a-9%i(*YWUAhxTQ(b@z&Z#jmIb9`8bZ3Um3UW!@w4%t0#nxsc;*YrG z@x$D9Yj3EiA(-@|IIzi@!E$N)j?gedGJpW!7wr*7zKZwIFa>j|cy<(1`VV_GzWN=1 zc%OO)o*RRobvTZE<9n1s$#V+~5u8ZwmDaysD^&^cxynksn!_ypmx)Mg^8$jXu5lMo zK3K_8GJh#+7HA1rO2AM8cK(#sXd2e?%3h2D9GD7!hxOEKJZK&T`ZS0e*c9c36Y-6yz2D0>Kvqy(EuiQtUQH^~M*HY!$e z20PGLb2Xq{3Ceg^sn+99K6w)TkprP)YyNU(+^PGU8}4&Vdw*u;(`Bw!Um76gL_aMT z>*82nmA8Tp;~hwi0d3S{vCwD};P(%AVaBr=yJ zqB?DktZ#)_VFh_X69lAHQw(ZNE~ZRo2fZOIP;N6fD)J*3u^YGdgwO(HnI4pb$H#9) zizJ<>qI*a6{+z=j+SibowDLKYI*Je2Y>~=*fL@i*f&8**s~4l&B&}$~nwhtbOTr=G zFx>{y6)dpJPqv={_@*!q0=jgw3^j`qi@!wiWiT_$1`SPUgaG&9z9u9=m5C8`GpMaM zyMRSv2llS4F}L?233!)f?mvcYIZ~U z7mPng^=p)@Z*Fp9owSYA`Fe4OjLiJ`rdM`-U(&z1B1`S`ufK_#T@_BvenxDQU`deH$X5eMVO=;I4EJjh6?kkG2oc6AYF6|(t)L0$ukG}Zn=c+R`Oq;nC)W^ z{ek!A?!nCsfd_5>d&ozG%OJmhmnCOtARwOq&p!FzWl7M))YjqK8|;6sOAc$w2%k|E z`^~kpT!j+Y1lvE0B)mc$Ez_4Rq~df#vC-FmW;n#7E)>@kMA6K30!MdiC19qYFnxQ* z?BKegU_6T37%s`~Gi2^ewVbciy-m5%1P3$88r^`xN-+VdhhyUj4Kzg2 zlKZ|FLUHiJCZL8&<=e=F2A!j@3D@_VN%z?J;uw9MquL`V*f^kYTrpoWZ6iFq00uO+ zD~Zwrs!e4cqGedAtYxZ76Bq3Ur>-h(m1~@{x@^*YExmS*vw9!Suxjlaxyk9P#xaZK z)|opA2v#h=O*T42z>Mub2O3Okd3GL86KZM2zlfbS z{Vps`OO&3efvt->OOSpMx~i7J@GsRtoOfQ%vo&jZ6^?7VhBMbPUo-V^Znt%-4k{I# z8&X)=KY{3lXlQg4^FH^{jw0%t#2%skLNMJ}hvvyd>?_AO#MtdvH;M^Y?OUWU6BdMX zJ(h;PM9mlo@i)lWX&#E@d4h zj4Z0Czj{+ipPeW$Qtz_A52HA<4$F9Qe4CiNQSNE2Q-d1OPObk4?7-&`={{yod5Iy3kB=PK3%0oYSr`Gca120>CHbC#SqE*ivL2R(YmI1A|nAT?JmK*2qj_3p#?0h)$#ixdmP?UejCg9%AS2 z8I(=_QP(a(s)re5bu-kcNQc-&2{QZ%KE*`NBx|v%K2?bK@Ihz_e<5Y(o(gQ-h+s&+ zjpV>uj~?rfJ!UW5Mop~ro^|FP3Z`@B6A=@f{Wn78cm`)3&VJ!QE+P9&$;3SDNH>hI z_88;?|LHr%1kTX0t*xzG-6BU=LRpJFZucRBQ<^zy?O5iH$t>o}C}Fc+kM1EZu$hm% zTTFKrJkXmCylFgrA;QAA(fX5Sia5TNo z?=Ujz7$Q?P%kM$RKqRQisOexvV&L+bolR%`u`k;~!o(HqgzV9I6w9|g*5SVZN6+kT9H$-3@%h%k7BBnB zPn+wmPYNG)V2Jv`&$LoI*6d0EO^&Nh`E* z&1V^!!Szd`8_uf%OK?fuj~! z%p9QLJ?V*T^)72<6p1ONqpmD?Wm((40>W?rhjCDOz?#Ei^sXRt|GM3ULLnoa8cABQ zA)gCqJ%Q5J%D&nJqypG-OX1`JLT+d`R^|0KtfGQU+jw79la&$GHTjKF>*8BI z0}l6TC@XB6`>7<&{6WX2kX4k+0SaI`$I8{{mMHB}tVo*(&H2SmZLmW* z+P8N>(r}tR?f!O)?)df>HIu>$U~e~tflVmwk*+B1;TuqJ+q_^`jwGwCbCgSevBqj$ z<`Fj*izeO)_~fq%wZ0Jfvi6<3v{Afz;l5C^C7!i^(W>%5!R=Ic7nm(0gJ~9NOvHyA zqWH2-6w^YmOy(DY{VrN6ErvZREuUMko@lVbdLDq*{A+_%F>!@6Z)X9kR1VI1+Ler+ zLUPtth=u~23=CqZoAbQ`uGE_91kR(8Ie$mq1p`q|ilkJ`Y-ob_=Nl(RF=o7k{47*I)F%_XMBz9uwRH8q1o$TkV@8Pwl zzi`^7i;K6Ak7o58a_D-V0AWp;H8pSjbEs$4BxoJkkC6UF@QNL)0$NU;Wv0*5 z0Ld;6tm7eR%u=`hnUb)gjHbE2cP?qpo3f4w%5qM0J*W_Kl6&z4YKX?iD@=McR!gTyhpGGYj!ljQm@2GL^J70`q~4CzPv@sz`s80FgiuxjAZ zLq61rHv1O>>w1qOEbVBwGu4%LGS!!muKHJ#JjfT>g`aSn>83Af<9gM3XBdY)Yql|{ zUds}u*;5wuus)D>HmexkC?;R&*Z`yB4;k;4T*(823M&52{pOd1yXvPJ3PPK{Zs>6w zztXy*HSH0scZHn7qIsZ8y-zftJ*uIW;%&-Ka0ExdpijI&xInDg-Bv-Q#Islcbz+R! zq|xz?3}G5W@*7jSd`Hv9q^5N*yN=4?Lh=LXS^5KJC=j|AJ5Y(f_fC-c4YQNtvAvn|(uP9@5Co{dL z?7|=jqTzD8>(6Wr&(XYUEzT~-VVErf@|KeFpKjh=v51iDYN_`Kg&XLOIG;ZI8*U$@ zKig{dy?1H}UbW%3jp@7EVSD>6c%#abQ^YfcO(`)*HuvNc|j( zyUbYozBR15$nNU$0ZAE%ivo4viW?@EprUZr6oX=4Sc!-WvrpJdF`3SwopKPyX~F>L zJ>N>v=_plttTSUq6bYu({&rkq)d94m5n~Sk_MO*gY*tlkPFd2m=Pi>MK)ObVV@Sgs zmXMNMvvcAuz+<$GLR2!j4w&;{)HEkxl{$B^*)lUKIn&p5_huD6+%WDoH4`p}9mkw$ zXCPw6Y7tc%rn$o_vy>%UNBC`0@+Ih-#T05AT)ooKt?94^ROI5;6m2pIM@@tdT=&WP z{u09xEVdD}{(3v}8AYUyT82;LV%P%TaJa%f)c36?=90z>Dzk5mF2}Gs0jYCmufihid8(VFcZWs8#59;JCn{!tHu5kSBbm zL`F{COgE01gg-qcP2Lt~M9}mALg@i?TZp&i9ZM^G<3`WSDh}+Ceb3Q!QecJ|N;Xrs z{wH{D8wQ2+mEfBX#M8)-32+~q4MRVr1UaSPtw}`iwx@x=1Xv-?UT{t}w}W(J&WKAC zrZ%hssvf*T!rs}}#atryn?LB=>0U%PLwA9IQZt$$UYrSw`7++}WR7tfE~*Qg)vRrM zT;(1>Zzka?wIIz8vfrG86oc^rjM@P7^i8D~b(S23AoKYj9HBC(6kq9g`1gN@|9^xO z{~h zbxGMHqGZ@eJ17bgES?HQnwp|G#7I>@p~o2zxWkgZUYSUeB*KT{1Q z*J3xZdWt`eBsA}7(bAHNcMPZf_BZC(WUR5B8wUQa=UV^e21>|yp+uop;$+#JwXD!> zunhJVCIKgaol0AM_AwJNl}_k&q|uD?aTE@{Q*&hxZ=k_>jcwp}KwG6mb5J*pV@K+- zj*`r0WuEU_8O=m&1!|rj9FG7ad<2px63;Gl z9lJrXx$~mPnuiqIH&n$jSt*ReG}1_?r4x&iV#3e_z+B4QbhHwdjiGu^J3vcazPi`| zaty}NFSWe=TDry*a*4XB)F;KDI$5i9!!(5p@5ra4*iW;FlGFV0P;OZXF!HCQ!oLm1 zsK+rY-FnJ?+yTBd0}{*Y6su|hul)wJ>RNQ{eau*;wWM{vWM`d0dTC-}Vwx6@cd#P? zx$Qyk^2*+_ZnMC}q0)+hE-q)PKoox#;pc%DNJ&D5+if6X4j~p$A7-s&AjDkSEV)aM z(<3UOw*&f)+^5F0Mpzw3zB1ZHl*B?C~Cx) zuNg*>5RM9F5{EpU@a2E7hAE`m<89wbQ2Lz&?Egu-^sglNXG5Q;{9n(%&*kEb0vApd zRHrY@22=pkFN81%x)~acZeu`yvK zovAVJNykgxqkEr^hZksHkpxm>2I8FTu2%+XLs@?ym0n;;A~X>i32{g6NOB@o4lk8{ zB}7Z2MNAJi>9u=y%s4QUXaNdt@SlAZr54!S6^ETWoik6gw=k-itu_}Yl_M9!l+Rbv z(S&WD`{_|SE@@(|Wp7bq1Zq}mc4JAG?mr2WN~6}~u`7M_F@J9`sr0frzxfuqSF~mA z$m$(TWAuCIE99yLSwi%R)8geQhs;6VBlRhJb(4Cx zu)QIF%_W9+21xI45U>JknBRaZ9nYkgAcK6~E|Zxo!B&z9zQhjsi^fgwZI%K@rYbMq znWBXg1uCZ+ljGJrsW7@x3h2 z;kn!J!bwCeOrBx;oPkZ}FeP%wExyf4=XMp)N8*lct~SyfK~4^-75EZFpHYO5AnuRM z!>u?>Vj3+j=uiHc<=cD~JWRphDSwxFaINB42-{@ZJTWe85>-RcQ&U%?wK)vjz z5u5fJYkck##j(bP7W0*RdW#BmAIK`D3=(U~?b`cJ&U2jHj}?w6 z_4BM)#EoJ6)2?pcR4AqBd)qAUn@RtNQq})FIQoBK4ie+GB(Vih2D|Ds>RJo2zE~C- z7mI)7p)5(-O6JRh6a@VZ5~piVC+Xv=O-)=0eTMSJsRE^c1@bPQWlr}E31VqO-%739 zdcmE{`1m;5LH8w|7euK>>>U#Iod8l1yivC>;YWsg=z#07E%cU9x1yw#3l6AcIm%79 zGi^zH6rM#CZMow(S(8dcOq#5$kbHnQV6s?MRsU3et!!YK5H?OV9vf2qy-UHCn>}2d zTwI(A_fzmmCtE@10yAGgU7R&|Fl$unZJ_^0BgCEDE6(B*SzfkapE9#0N6adc>}dtH zJ#nt^F~@JMJg4=Pv}OdUHyPt-<<9Z&c0@H@^4U?KwZM&6q0XjXc$>K3c&3iXLD9_%(?)?2kmZ=Ykb;)M`Tw=%_d=e@9eheGG zk0<`4so}r={C{zr|6+_1mA_=a56(XyJq||g6Es1E6%fPg#l{r+vk9;)r6VB7D84nu zE0Z1EIxH{Y@}hT+|#$0xn+CdMy6Uhh80eK~nfMEIpM z`|G1v!USmx81nY8XkhEOSWto}pc#{Ut#`Pqb}9j$FpzkQ7`0<-@5D_!mrLah98Mpr zz(R7;ZcaR-$aKqUaO!j z=7QT;Bu0cvYBi+LDfE_WZ`e@YaE_8CCxoRc?Y_!Xjnz~Gl|aYjN2&NtT5v4#q3od2 zkCQZHe#bn(5P#J**Fj4Py%SaaAKJsmV6}F_6Z7V&n6QAu8UQ#9{gkq+tB=VF_Q6~^ zf(hXvhJ#tC(eYm6g|I>;55Lq-;yY*COpTp4?J}hGQ42MIVI9CgEC{3hYw#CZfFKVG zgD(steIg8veyqX%pYMoulq zMUmbj8I`t>mC`!kZ@A>@PYXy*@NprM@e}W2Q+s?XIRM-U1FHVLM~c60(yz1<46-*j zW*FjTnBh$EzI|B|MRU11^McTPIGVJrzozlv$1nah_|t4~u}Ht^S1@V8r@IXAkN;lH z_s|WHlN90k4X}*#neR5bX%}?;G`X!1#U~@X6bbhgDYKJK17~oFF0&-UB#()c$&V<0 z7o~Pfye$P@$)Lj%T;axz+G1L_YQ*#(qO zQND$QTz(~8EF1c3<%;>dAiD$>8j@7WS$G_+ktE|Z?Cx<}HJb=!aChR&4z ziD&FwsiZ)wxS4k6KTLn>d~!DJ^78yb>?Trmx;GLHrbCBy|Bip<@sWdAfP0I~;(Ybr zoc-@j?wA!$ zIP0m3;LZy+>dl#&Ymws@7|{i1+OFLYf@+8+)w}n?mHUBCqg2=-Hb_sBb?=q))N7Ej zDIL9%@xQFOA!(EQmchHiDN%Omrr;WvlPIN5gW;u#ByV)x2aiOd2smy&;vA2+V!u|D zc~K(OVI8} z0t|e0OQ7h23e01O;%SJ}Q#yeDh`|jZR7j-mL(T4E;{w^}2hzmf_6PF|`gWVj{I?^2T3MBK>{?nMXed4kgNox2DP!jvP9v`;pa6AV)OD zDt*Vd-x7s{-;E?E5}3p-V;Y#dB-@c5vTWfS7<=>E+tN$ME`Z7K$px@!%{5{uV`cH80|IzU! zDs9=$%75P^QKCRQ`mW7$q9U?mU@vrFMvx)NNDrI(uk>xwO;^($EUvqVev#{W&GdtR z0ew;Iwa}(-5D28zABlC{WnN{heSY5Eq5Fc=TN^9X#R}0z53!xP85#@;2E=&oNYHyo z46~#Sf!1M1X!rh}ioe`>G2SkPH{5nCoP`GT@}rH;-LP1Q7U_ypw4+lwsqiBql80aA zJE<(88yw$`xzNiSnU(hsyJqHGac<}{Av)x9lQ=&py9djsh0uc}6QkmKN3{P!TEy;P zzLDVQj4>+0r<9B0owxBt5Uz`!M_VSS|{(?`_e+qD9b=vZHoo6>?u;!IP zM7sqoyP>kWY|=v06gkhaGRUrO8n@zE?Yh8$om@8%=1}*!2wdIWsbrCg@;6HfF?TEN z+B_xtSvT6H3in#8e~jvD7eE|LTQhO_>3b823&O_l$R$CFvP@3~)L7;_A}JpgN@ax{ z2d9Ra)~Yh%75wsmHK8e87yAn-ZMiLo6#=<&PgdFsJw1bby-j&3%&4=9dQFltFR(VB z@=6XmyNN4yr^^o$ON8d{PQ=!OX17^CrdM~7D-;ZrC!||<+FEOxI_WI3 zCA<35va%4v>gcEX-@h8esj=a4szW7x z{0g$hwoWRQG$yK{@3mqd-jYiVofJE!Wok1*nV7Gm&Ssq#hFuvj1sRyHg(6PFA5U*Q z8Rx>-blOs=lb`qa{zFy&n4xY;sd$fE+<3EI##W$P9M{B3c3Si9gw^jlPU-JqD~Cye z;wr=XkV7BSv#6}DrsXWFJ3eUNrc%7{=^sP>rp)BWKA9<}^R9g!0q7yWlh;gr_TEOD|#BmGq<@IV;ue zg+D2}cjpp+dPf&Q(36sFU&K8}hA85U61faW&{lB`9HUl-WWCG|<1XANN3JVAkRYvr5U z4q6;!G*MTdSUt*Mi=z_y3B1A9j-@aK{lNvxK%p23>M&=KTCgR!Ee8c?DAO2_R?Bkaqr6^BSP!8dHXxj%N1l+V$_%vzHjq zvu7p@%Nl6;>y*S}M!B=pz=aqUV#`;h%M0rUHfcog>kv3UZAEB*g7Er@t6CF8kHDmK zTjO@rejA^ULqn!`LwrEwOVmHx^;g|5PHm#B6~YD=gjJ!043F+&#_;D*mz%Q60=L9O zve|$gU&~As5^uz@2-BfQ!bW)Khn}G+Wyjw-19qI#oB(RSNydn0t~;tAmK!P-d{b-@ z@E5|cdgOS#!>%#Rj6ynkMvaW@37E>@hJP^82zk8VXx|3mR^JCcWdA|t{0nPmYFOxN z55#^-rlqobcr==<)bi?E?SPymF*a5oDDeSdO0gx?#KMoOd&G(2O@*W)HgX6y_aa6i zMCl^~`{@UR`nMQE`>n_{_aY5nA}vqU8mt8H`oa=g0SyiLd~BxAj2~l$zRSDHxvDs; zI4>+M$W`HbJ|g&P+$!U7-PHX4RAcR0szJ*(e-417=bO2q{492SWrqDK+L3#ChUHtz z*@MP)e^%@>_&#Yk^1|tv@j4%3T)diEXATx4K*hcO`sY$jk#jN5WD<=C3nvuVs zRh||qDHnc~;Kf59zr0;c7VkVSUPD%NnnJC_l3F^#f_rDu8l}l8qcAz0FFa)EAt32I zUy_JLIhU_J^l~FRH&6-iv zSpG2PRqzDdMWft>Zc(c)#tb%wgmWN%>IOPmZi-noqS!^Ft zb81pRcQi`X#UhWK70hy4tGW1mz|+vI8c*h@fFGJtW3r>qV>1Z0r|L>7I3un^gcep$ zAAWfZHRvB|E*kktY$qQP_$YG60C z@X~tTQjB3%@`uz!qxtxF+LE!+=nrS^07hn`EgAp!h|r03h7B!$#OZW#ACD+M;-5J!W+{h z|6I;5cNnE(Y863%1(oH}_FTW})8zYb$7czPg~Szk1+_NTm6SJ0MS_|oSz%e(S~P-& zSFp;!k?uFayytV$8HPwuyELSXOs^27XvK-DOx-Dl!P|28DK6iX>p#Yb%3`A&CG0X2 zS43FjN%IB}q(!hC$fG}yl1y9W&W&I@KTg6@K^kpH8=yFuP+vI^+59|3%Zqnb5lTDAykf9S#X`3N(X^SpdMyWQGOQRjhiwlj!0W-yD<3aEj^ z&X%=?`6lCy~?`&WSWt?U~EKFcCG_RJ(Qp7j=$I%H8t)Z@6Vj zA#>1f@EYiS8MRHZphpMA_5`znM=pzUpBPO)pXGYpQ6gkine{ z6u_o!P@Q+NKJ}k!_X7u|qfpAyIJb$_#3@wJ<1SE2Edkfk9C!0t%}8Yio09^F`YGzp zaJHGk*-ffsn85@)%4@`;Fv^8q(-Wk7r=Q8pT&hD`5(f?M{gfzGbbwh8(}G#|#fDuk z7v1W)5H9wkorE0ZZjL0Q1=NRGY>zwgfm81DdoaVwNH;or{{e zSyybt)m<=zXoA^RALYG-2touH|L*BLvmm9cdMmn+KGopyR@4*=&0 z&4g|FLoreZOhRmh=)R0bg~T2(8V_q7~42-zvb)+y959OAv!V$u(O z3)%Es0M@CRFmG{5sovIq4%8Ahjk#*5w{+)+MWQoJI_r$HxL5km1#6(e@{lK3Udc~n z0@g`g$s?VrnQJ$!oPnb?IHh-1qA`Rz$)Ai<6w$-MJW-gKNvOhL+XMbE7&mFt`x1KY z>k4(!KbbpZ`>`K@1J<(#vVbjx@Z@(6Q}MF#Mnbr-f55)vXj=^j+#)=s+ThMaV~E`B z8V=|W_fZWDwiso8tNMTNse)RNBGi=gVwgg%bOg8>mbRN%7^Um-7oj4=6`$|(K7!+t^90a{$1 z8Z>}<#!bm%ZEFQ{X(yBZMc>lCz0f1I2w9SquGh<9<=AO&g6BZte6hn>Qmvv;Rt)*c zJfTr2=~EnGD8P$v3R|&1RCl&7)b+`=QGapiPbLg_pxm`+HZurtFZ;wZ=`Vk*do~$wBxoW&=j0OTbQ=Q%S8XJ%~qoa3Ea|au5 zo}_(P;=!y z-AjFrERh%8la!z6Fn@lR?^E~H12D? z8#ht=1F;7@o4$Q8GDj;sSC%Jfn01xgL&%F2wG1|5ikb^qHv&9hT8w83+yv&BQXOQy zMVJSBL(Ky~p)gU3#%|blG?I zR9rP^zUbs7rOA0X52Ao=GRt@C&zlyjNLv-}9?*x{y(`509qhCV*B47f2hLrGl^<@S zuRGR!KwHei?!CM10pBKpDIoBNyRuO*>3FU?HjipIE#B~y3FSfOsMfj~F9PNr*H?0o zHyYB^G(YyNh{SxcE(Y-`x5jFMKb~HO*m+R%rq|ic4fzJ#USpTm;X7K+E%xsT_3VHK ze?*uc4-FsILUH;kL>_okY(w`VU*8+l>o>JmiU#?2^`>arnsl#)*R&nf_%>A+qwl%o z{l(u)M?DK1^mf260_oteV3#E_>6Y4!_hhVDM8AI6MM2V*^_M^sQ0dmHu11fy^kOqX zqzps-c5efIKWG`=Es(9&S@K@)ZjA{lj3ea7_MBPk(|hBFRjHVMN!sNUkrB;(cTP)T97M$ z0Dtc&UXSec<+q?y>5=)}S~{Z@ua;1xt@=T5I7{`Z=z_X*no8s>mY;>BvEXK%b`a6(DTS6t&b!vf_z#HM{Uoy z_5fiB(zpkF{})ruka$iX*~pq1ZxD?q68dIoIZSVls9kFGsTwvr4{T_LidcWtt$u{k zJlW7moRaH6+A5hW&;;2O#$oKyEN8kx z`LmG)Wfq4ykh+q{I3|RfVpkR&QH_x;t41UwxzRFXt^E2B$domKT@|nNW`EHwyj>&< zJatrLQ=_3X%vd%nHh^z@vIk(<5%IRAa&Hjzw`TSyVMLV^L$N5Kk_i3ey6byDt)F^U zuM+Ub4*8+XZpnnPUSBgu^ijLtQD>}K;eDpe1bNOh=fvIfk`&B61+S8ND<(KC%>y&? z>opCnY*r5M+!UrWKxv0_QvTlJc>X#AaI^xoaRXL}t5Ej_Z$y*|w*$6D+A?Lw-CO-$ zitm^{2Ct82-<0IW)0KMNvJHgBrdsIR0v~=H?n6^}l{D``Me90`^o|q!olsF?UX3YS zq^6Vu>Ijm>>PaZI8G@<^NGw{Cx&%|PwYrfwR!gX_%AR=L3BFsf8LxI|K^J}deh0Zd zV?$3r--FEX`#INxsOG6_=!v)DI>0q|BxT)z-G6kzA01M?rba+G_mwNMQD1mbVbNTW zmBi*{s_v_Ft9m2Avg!^78(QFu&n6mbRJ2bAv!b;%yo{g*9l2)>tsZJOOp}U~8VUH`}$8p_}t*XIOehezolNa-a2x0BS})Y9}& z*TPgua{Ewn-=wVrmJUeU39EKx+%w%=ixQWKDLpwaNJs65#6o7Ln7~~X+p_o2BR1g~ zVCfxLzxA{HlWAI6^H;`juI=&r1jQrUv_q0Z1Ja-tjdktrrP>GOC*#p?*xfQU5MqjM zsBe!9lh(u8)w$e@Z|>aUHI5o;MGw*|Myiz3-f0;pHg~Q#%*Kx8MxH%AluVXjG2C$) zWL-K63@Q`#y9_k_+}eR(x4~dp7oV-ek0H>Igy8p#i4GN{>#v=pFYUQT(g&b$OeTy- zX_#FDgNF8XyfGY6R!>inYn8IR2RDa&O!(6NIHrC0H+Qpam1bNa=(`SRKjixBTtm&e z`j9porEci!zdlg1RI0Jw#b(_Tb@RQK1Zxr_%7SUeH6=TrXt3J@js`4iDD0=I zoHhK~I7^W8^Rcp~Yaf>2wVe|Hh1bXa_A{oZ9eG$he;_xYvTbTD#moBy zY57-f2Ef1TP^lBi&p5_s7WGG9|0T}dlfxOxXvScJO1Cnq`c`~{Dp;{;l<-KkCDE+p zmexJkd}zCgE{eF=)K``-qC~IT6GcRog_)!X?fK^F8UDz$(zFUrwuR$qro5>qqn>+Z z%<5>;_*3pZ8QM|yv9CAtrAx;($>4l^_$_-L*&?(77!-=zvnCVW&kUcZMb6;2!83si z518Y%R*A3JZ8Is|kUCMu`!vxDgaWjs7^0j(iTaS4HhQ)ldR=r)_7vYFUr%THE}cPF z{0H45FJ5MQW^+W>P+eEX2kLp3zzFe*-pFVAdDZRybv?H|>`9f$AKVjFWJ=wegO7hO zOIYCtd?Vj{EYLT*^gl35|HbMX|NAEUf2ra9dy1=O;figB>La=~eA^#>O6n4?EMugV zbbt{Dbfef5l^(;}5kZ@!XaWwF8z0vUr6r|+QN*|WpF z^*osUHzOnE$lHuWYO$G7>}Y)bY0^9UY4eDV`E{s+{}Z$O$2*lMEYl zTA`ki(<0(Yrm~}15V-E^e2W6`*`%ydED-3G@$UFm6$ZtLx z+av`BhsHcAWqdxPWfu2*%{}|Sptax4_=NpDMeWy$* zZM6__s`enB$~0aT1BU^2k`J9F%+n+lL_|8JklWOCVYt*0%o*j4w1CsB_H^tVpYT_LLyKuyk=CV6~1M<7~^FylL*+AIFf3h>J=x$ygY-BG}4LJ z8XxYPY!v7dO3PVwEoY=`)6krokmR^|Mg5ztX_^#QR}ibr^X-|_St#rtv3gukh0(#A=};NPlNz57ZDFJ9hf#NP50zS)+Fo=StX)i@ zWS?W}i6LjB>kAB~lupAPyIjFb)izFgRq*iS*(Jt509jNr3r72{Gj`5DGoj;J&k5G@Rm!dJ($ox>SbxR)fc zz|Phug;~A7!p@?|mMva@rWuf2fSDK_ZxN3vVmlYz>rrf?LpiNs)^z!y{As@`55JC~ zS*GD3#N-ptY!2<613UelAJ;M4EEI$dm)`8#n$|o{ce^dlyoUY3bsy2hgnj-;ovubb zg2h1rZA6Ot}K_cpYBpIuF&CyK~5R0Wv;kG|3A^8K3nk{rw$Be8u@aos#qvKQKJyVU$cX6biw&Ep#+q7upFX z%qo&`WZ){<%zh@BTl{MO@v9#;t+cb7so0Uz49Fmo1e4>y!vUyIHadguZS0T7-x#_drMXz*16*c zymR0u^`ZQpXN}2ofegbpSedL%F9aypdQcrzjzPlBW0j zMlPzC&ePZ@Cq!?d%9oQNEg0`rHALm8l#lUdXMVEqDvb(AID~H(?H9z!e9G98fG@IzhajKr)3{L_Clu1(Bwg`RM!-(MOuZi zbeDsj9I3(~EITsE=3Z)a|l_rn8W92U0DB70gF7YYfO0j!)h?QobY1lSR>0 z_TVw@$eP~3k8r9;%g%RlZzCJ2%f}DvY`rsZ$;ak&^~-`i%B%+O!pnADeVyV!dHj|} zzOj#q4eRx9Q8c2Z7vy9L&fGLj+3_?fp}+8o`Xpwyi(81H|7P8#65%FIS*lOi={o&v z4NV$xu7az4Nb50dRGZv<tdZCx4Ek<_o3!mAT} zL5l*|K3Qr-)W8paaG z&R6{ped_4e2cy}ejD0!dt{*PaC*^L@eB%(1Fmc%Y#4)~!jF#lCGfj#E??4LG-T;!M z>Uha}f;W>ib_ZL-I7-v9KZQls^G!-JmL^w;=^}?!RXK;m4$#MwI2AH-l7M2-0 zVMK8k^+4+>2S0k^N_40EDa#`7c;2!&3-o6MHsnBfRnq@>E@)=hDulVq-g5SQWDWbt zj6H5?QS2gRZ^Zvbs~cW|8jagJV|;^zqC0e=D1oUsQPJ3MCb+eRGw(XgIY9y8v_tXq z9$(xWntWpx_Uronmvho{JfyYdV{L1N$^s^|-Nj`Ll`lUsiWTjm&8fadUGMXreJGw$ zQ**m+Tj|(XG}DyUKY~2?&9&n6SJ@9VKa9Hcayv{ar^pNr0WHy zP$bQv&8O!vd;GoT!pLwod-42qB^`m!b7nP@YTX}^+1hzA$}LSLh}Ln|?`%8xGMazw z8WT!LoYJ-Aq3=2p6ZSP~uMgSSWv3f`&-I06tU}WhZsA^6nr&r17hjQIZE>^pk=yZ% z06}dfR$85MjWJPq)T?OO(RxoaF+E#4{Z7)i9}Xsb;Nf+dzig61HO;@JX1Lf9)R5j9)Oi6vPL{H z&UQ9ln=$Q8jnh6-t;`hKM6pHftdd?$=1Aq16jty4-TF~`Gx=C&R242uxP{Y@Q~%O3 z*(16@x+vJsbW@^3tzY=-5MHi#(kB};CU%Ep`mVY1j$MAPpYJBB3x$ue`%t}wZ-@CG z(lBv36{2HMjxT)2$n%(UtHo{iW9>4HX4>)%k8QNnzIQYXrm-^M%#Qk%9odbUrZDz1YPdY`2Z4w~p!5tb^m(mUfk}kZ9+EsmenQ)5iwiaulcy zCJ#2o4Dz?@%)aAKfVXYMF;3t@aqNh2tBBlBkCdj`F31b=h93y(46zQ-YK@+zX5qM9 z&=KkN&3@Ptp*>UD$^q-WpG|9O)HBXz{D>p!`a36aPKkgz7uxEo0J>-o+4HHVD9!Hn z${LD0d{tuGsW*wvZoHc8mJroAs(3!FK@~<}Pz1+vY|Gw}Lwfxp{4DhgiQ_SSlV)E| zZWZxYZLu2EB1=g_y@(ieCQC_1?WNA0J0*}eMZfxCCs>oL;?kHdfMcKB+A)Qull$v( z2x6(38utR^-(?DG>d1GyU()8>ih3ud0@r&I$`ZSS<*1n6(76=OmP>r_JuNCdS|-8U zxGKXL1)Lc2kWY@`_kVBt^%7t9FyLVYX(g%a6>j=yURS1!V<9ieT$$5R+yT!I>}jI5 z?fem|T=Jq;BfZmsvqz_Ud*m5;&xE66*o*S22vf-L+MosmUPPA}~wy`kntf8rIeP-m;;{`xe}9E~G7J!PYoVH_$q~NzQab?F8vWUja5BJ!T5%5IpyqI#Dkps0B;gQ*z?c#N>spFw|wRE$gY?y4wQbJ zku2sVLh({KQz6e0yo+X!rV#8n8<;bHWd{ZLL_(*9Oi)&*`LBdGWz>h zx+p`Wi00u#V$f=CcMmEmgFjw+KnbK3`mbaKfoCsB{;Q^oJgj*LWnd_(dk9Kcssbj` z?*g8l`%{*LuY!Ls*|Tm`1Gv-tRparW8q4AK(5pfJFY5>@qO( zcY>pt*na>LlB^&O@YBDnWLE$x7>pMdSmb-?qMh79eB+Wa{)$%}^kX@Z3g>fytppz! zl%>pMD(Yw+5=!UgYHLD69JiJ;YhiGeEyZM$Au{ff;i zCBbNQfO{d!b7z^F732XX&qhEsJA1UZtJjJEIPyDq+F`LeAUU_4`%2aTX#3NG3%W8u zC!7OvlB?QJ4s2#Ok^_8SKcu&pBd}L?vLRT8Kow#xARt`5&Cg=ygYuz>>c z4)+Vv$;<$l=is&E{k&4Lf-Lzq#BHuWc;wDfm4Fbd5Sr!40s{UpKT$kzmUi{V0t1yp zPOf%H8ynE$x@dQ_!+ISaI}#%72UcYm7~|D*(Fp8xiFAj$CmQ4oH3C+Q8W=Y_9Sp|B z+k<%5=y{eW=YvTivV(*KvC?qxo)xqcEU9(Te=?ITts~;xA0Jph-vpd4@Zw#?r2!`? zB3#XtIY^wxrpjJv&(7Xjvm>$TIg2ZC&+^j(gT0R|&4cb)=92-2Hti1`& z=+M;*O%_j3>9zW|3h{0Tfh5i)Fa;clGNJpPRcUmgErzC{B+zACiPHbff3SmsCZ&X; zp=tgI=zW-t(5sXFL8;ITHw0?5FL3+*z5F-KcLN130l=jAU6%F=DClRPrzO|zY+HD`zlZ-)JT}X?2g!o zxg4Ld-mx6&*-N0-MQ(z+zJo8c`B39gf{-h2vqH<=^T&o1Dgd>4BnVht+JwLcrjJl1 zsP!8`>3-rSls07q2i1hScM&x0lQyBbk(U=#3hI7Bkh*kj6H*&^p+J?OMiT_3*vw5R zEl&p|QQHZq6f~TlAeDGy(^BC0vUK?V&#ezC0*#R-h}_8Cw8-*${mVfHssathC8%VA zUE^Qd!;Rvym%|f@?-!sEj|73Vg8!$$zj_QBZAOraF5HCFKl=(Ac|_p%-P;6z<2WSf zz(9jF2x7ZR{w+p)ETCW06PVt0YnZ>gW9^sr&~`%a_7j-Ful~*4=o|&TM@k@Px2z>^ t{*Ed16F~3V5p+(suF-++X8+nHtT~NSfJ>UC3v)>lEpV}<+rIR_{{yMcG_L>v literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..fae0804 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..1b6c787 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + 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/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@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/keystore.p12 b/keystore.p12 new file mode 100644 index 0000000000000000000000000000000000000000..063766340e29769af62422e588ef1cf1912c5789 GIT binary patch literal 2421 zcmV-*35xbGf(dZ~0Ru3C2{#4_Duzgg_YDCD0ic2jC%0*fA9%Y=H~9sHn5XC*4$d)~U%|H;t3;!;vlyw1ba!VYYV8U+Tf z$93fjyuD%~5wXtlDfGTp6Tefla!Ymcke7CSJ7B~@Fd1Xj_nmG- zt*p*VF#qQ$JwrL|=50Bz%_nM1TewS-@ltK$x6cTrO}OLg+I+_{qq1wsc2mfOXHW%c z@vdqbDVEyzhaa5Cn#ism(m6UAmS28_-|u5pvx;}=tFs#Qve9kS>nTgC0aDKodoT%n zsFXYiL702d(SLm_x~L>mJS;y4_l692rmwJ9r((;prZ?=zzP0*!)qh{PBV>%*Q*rKa ziZeozn(!1o7>`Hkcsn@7zO5pF`#Gdx*47fUgw{DzN2K8D-{y{!exDj;dJUZ1PMwu$ z$d${hiO#|CV|elOe4FD!-yprGU4XXk=T0rSSnq#&nnG&1M zg9O%C7A)&YCkR3i&Hb(pENPo-Fy!?SSo(c=Rmo8I2oDyooLk*n?J-DhPj(S#(*(nZ zGa$Ktc-`|l)Vn&V&Mq_lg(T}&PO)Fea_oyjq@RjHIlpDPT47B9n6}k~jvBtU8BTvI zk?azT+1C4AOAD%QH1I0I`WRUYyawSlNx*qFoFd^1_>&LNQUNuY$4* z@1jgHJ-Su?;DY&;bFIpSS@QXtK?%?k7;X65xY;?wZ4NL}ynSPzMawgO1+pd$$ zljIftZYL>$zYHSLU-%e9;J%mdcXmw_I7839WWJR5EDLigZ@<|=bCE3}%Wm(ZB2*hI z#;yyqqTgA)WDXKLbeAv{40jH1uL^26dWC8}6R+T;f`t~lHYiHK{+FdE?+ipC5WfnL zou8V8>J3pFyL9SJrk<|}5daWEB>=asw`0Zy)2pF#HkGjw0MmGkHHCU=G` zz0J_5-!cMxs3BFw1Z-P(mnrHJFic!StS)Q~iN=ZHXvxZGr#Fe)D<|tksL{GFG*TTf zjVl?Creq7djZP-!r?8HE;P8`g#7F&w8FRLDS)~kz*x6z8N&MiyfiyUC_GQ1v1brI& zgNKaIV_N`!g;eO;M{@Ly_;pZBhR~h=0K=#~Evwdnfw6OB^7x4Y5mrlS>_@!)NGfmR zXf4kVo;(UTWY!~@m2WwrOdEAl9{F!4U-Cf_ww7DWal_yKc6fjtDSH!VCdHTi2Ou|K z5h;1V5OGKTN>=>TEw~cKZ*e7>XE&^{wKiaUwwY*DMWLHxGtodENg>|Jx3l0nEt}XgaV0k76H+NgZjzU3)^D(~`9?_3tMBF)j!_*+ zkVE_i*RWC2;PQruz*6$UE%R;K2;~hHoYA3SP1%+sPiST;SkzWS8Kxnc)#m5(gC8*^ zFe3&DDuzgg_YDCF6)_eB6gAzjE#Yq7HHF|Zzw`(M^};i4*f23LAutIB1uG5%0vZJX n1Qh9eKog+1;iCx@w!9o@F7V;;pkxFH32{n7?7qmb0s;sCqDO+R literal 0 HcmV?d00001 diff --git a/lib/kcp.jar b/lib/kcp.jar new file mode 100644 index 0000000000000000000000000000000000000000..9808b0a233eb213ef6d160d5539438c3e8a8fdaa GIT binary patch literal 588435 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

GPMwD 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 z%0A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 z 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 literal 0 HcmV?d00001 diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..f692034 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user manual at https://docs.gradle.org/5.6.3/userguide/multi_project_builds.html + */ + +rootProject.name = 'Lunar Rail' diff --git a/src/main/java/emu/lunarcore/Config.java b/src/main/java/emu/lunarcore/Config.java new file mode 100644 index 0000000..0c5704d --- /dev/null +++ b/src/main/java/emu/lunarcore/Config.java @@ -0,0 +1,79 @@ +package emu.lunarcore; + +import lombok.Getter; + +@Getter +public class Config { + + public DatabaseInfo accountDatabase = new DatabaseInfo(); + public DatabaseInfo gameDatabase = new DatabaseInfo(); + public InternalMongoInfo internalMongoServer = new InternalMongoInfo(); + public boolean useSameDatabase = true; + + public KeystoreInfo keystore = new KeystoreInfo(); + + public ServerConfig httpServer = new ServerConfig("127.0.0.1", 443); + public GameServerConfig gameServer = new GameServerConfig("127.0.0.1", 23301); + + public DownloadData downloadData = new DownloadData(); + + public String resourceDir = "./resources"; + public String dataDir = "./data"; + + @Getter + public static class DatabaseInfo { + public String uri = "mongodb://localhost:27017"; + public String collection = "lunarrail"; + public boolean useInternal = true; + } + + @Getter + public static class InternalMongoInfo { + public String address = "localhost"; + public int port = 27017; + public String filePath = "database.mv"; + } + + @Getter + public static class KeystoreInfo { + public String path = "./keystore.p12"; + public String password = "lunar"; + } + + @Getter + public static class ServerConfig { + public String bindAddress = "0.0.0.0"; + public String publicAddress = "127.0.0.1"; + public int port; + public boolean useSSL = true; + + public ServerConfig(String address, int port) { + this.publicAddress = address; + this.port = port; + } + + public String getDisplayAddress() { + return (useSSL ? "https" : "http") + "://" + publicAddress + ":" + port; + } + } + + @Getter + public static class GameServerConfig extends ServerConfig { + public String id = "lunar_rail_test"; + public String name = "Test"; + public String description = "Test Server"; + + public GameServerConfig(String address, int port) { + super(address, port); + } + } + + @Getter + public static class DownloadData { + public String assetBundleUrl = null; + public String exResourceUrl = null; + public String luaUrl = null; + public String ifixUrl = null; + } + +} diff --git a/src/main/java/emu/lunarcore/GameConstants.java b/src/main/java/emu/lunarcore/GameConstants.java new file mode 100644 index 0000000..e7e1b38 --- /dev/null +++ b/src/main/java/emu/lunarcore/GameConstants.java @@ -0,0 +1,22 @@ +package emu.lunarcore; + +import java.time.Instant; +import java.time.ZoneOffset; + +public class GameConstants { + public static String VERSION = "1.3.0"; + public static String MDK_VERSION = "5377911"; + + public static final ZoneOffset CURRENT_OFFSET = ZoneOffset.systemDefault().getRules().getOffset(Instant.now()); + + // Game + public static final String DEFAULT_NAME = "Trailblazer"; + public static final int MAX_TRAILBLAZER_LEVEL = 70; + public static final int MAX_STAMINA = 240; + public static final int MAX_AVATARS_IN_TEAM = 4; + public static final int DEFAULT_TEAMS = 6; + + // Custom + public static final int SERVER_CONSOLE_UID = 99; + public static final int EQUIPMENT_SLOT_ID = 100; +} diff --git a/src/main/java/emu/lunarcore/LunarRail.java b/src/main/java/emu/lunarcore/LunarRail.java new file mode 100644 index 0000000..8b13095 --- /dev/null +++ b/src/main/java/emu/lunarcore/LunarRail.java @@ -0,0 +1,160 @@ +package emu.lunarcore; + +import java.io.*; + +import org.slf4j.LoggerFactory; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import ch.qos.logback.classic.Logger; +import emu.lunarcore.commands.ServerCommands; +import emu.lunarcore.data.ResourceLoader; +import emu.lunarcore.database.DatabaseManager; +import emu.lunarcore.server.game.GameServer; +import emu.lunarcore.server.http.HttpServer; +import emu.lunarcore.util.Handbook; +import emu.lunarcore.util.JsonUtils; +import lombok.Getter; + +public class LunarRail { + private static Logger log = (Logger) LoggerFactory.getLogger(LunarRail.class); + private static File configFile = new File("./config.json"); + private static Config config; + + @Getter private static DatabaseManager accountDatabase; + @Getter private static DatabaseManager gameDatabase; + + @Getter private static HttpServer httpServer; + @Getter private static GameServer gameServer; + + private static ServerType serverType = ServerType.BOTH; + + // Load config first before doing anything + static { + LunarRail.loadConfig(); + } + + public static void main(String[] args) { + // Start Server + LunarRail.getLogger().info("Starting Lunar Rail..."); + + // Parse arguments + for (String arg : args) { + switch (arg) { + case "-dispatch": + serverType = ServerType.DISPATCH; + break; + case "-game": + serverType = ServerType.GAME; + break; + case "-database": + // Database only + DatabaseManager databaseManager = new DatabaseManager(); + databaseManager.startInternalMongoServer(LunarRail.getConfig().getInternalMongoServer()); + LunarRail.getLogger().info("Running local mongo server at " + databaseManager.getServer().getConnectionString()); + // Console + LunarRail.startConsole(); + return; + } + } + + // Load resources + ResourceLoader.loadAll(); + + // Build handbook TODO + Handbook.generate(); + + // Start Database(s) + LunarRail.initDatabases(); + + // Start Servers TODO + httpServer = new HttpServer(serverType); + httpServer.start(); + + if (serverType.runGame()) { + gameServer = new GameServer(getConfig().getGameServer()); + gameServer.start(); + } + + // Start console + LunarRail.startConsole(); + } + + public static Config getConfig() { + return config; + } + + public static Logger getLogger() { + return log; + } + + // Database + + private static void initDatabases() { + accountDatabase = new DatabaseManager(LunarRail.getConfig().getAccountDatabase()); + + if (LunarRail.getConfig().useSameDatabase) { + gameDatabase = accountDatabase; + } else { + gameDatabase = new DatabaseManager(LunarRail.getConfig().getGameDatabase()); + } + } + + // Config + + public static void loadConfig() { + try (FileReader file = new FileReader(configFile)) { + config = JsonUtils.loadToClass(file, Config.class); + } catch (Exception e) { + LunarRail.config = new Config(); + } + saveConfig(); + } + + public static void saveConfig() { + try (FileWriter file = new FileWriter(configFile)) { + Gson gson = new GsonBuilder().setPrettyPrinting().serializeNulls().create(); + file.write(gson.toJson(config)); + } catch (Exception e) { + getLogger().error("Config save error"); + } + } + + // Server console + + private static void startConsole() { + String input; + try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) { + while ((input = br.readLine()) != null) { + ServerCommands.handle(input); + } + } catch (Exception e) { + LunarRail.getLogger().error("Console error:", e); + } + } + + // Server enums + + public enum ServerType { + BOTH (true, true), + DISPATCH (true, false), + GAME (false, true); + + private final boolean runDispatch; + private final boolean runGame; + + private ServerType(boolean runDispatch, boolean runGame) { + this.runDispatch = runDispatch; + this.runGame = runGame; + } + + public boolean runDispatch() { + return runDispatch; + } + + public boolean runGame() { + return runGame; + } + } +} diff --git a/src/main/java/emu/lunarcore/commands/Command.java b/src/main/java/emu/lunarcore/commands/Command.java new file mode 100644 index 0000000..73302b5 --- /dev/null +++ b/src/main/java/emu/lunarcore/commands/Command.java @@ -0,0 +1,13 @@ +package emu.lunarcore.commands; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface Command { + public String[] aliases() default ""; + + public int gmLevel() default 1; + + public String desc() default ""; +} diff --git a/src/main/java/emu/lunarcore/commands/PlayerCommands.java b/src/main/java/emu/lunarcore/commands/PlayerCommands.java new file mode 100644 index 0000000..4da136d --- /dev/null +++ b/src/main/java/emu/lunarcore/commands/PlayerCommands.java @@ -0,0 +1,177 @@ +package emu.lunarcore.commands; + +import java.lang.reflect.Modifier; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; + +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.excel.ItemExcel; +import emu.lunarcore.data.excel.NpcMonsterExcel; +import emu.lunarcore.data.excel.StageExcel; +import emu.lunarcore.game.inventory.GameItem; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.game.scene.EntityMonster; +import emu.lunarcore.util.Position; + +@SuppressWarnings("unused") +public class PlayerCommands { + private static HashMap list = new HashMap<>(); + + static { + try { + // Look for classes + for (Class cls : PlayerCommands.class.getDeclaredClasses()) { + // Get non abstract classes + if (!Modifier.isAbstract(cls.getModifiers())) { + Command commandAnnotation = cls.getAnnotation(Command.class); + PlayerCommand command = (PlayerCommand) cls.getConstructor().newInstance(); + + if (commandAnnotation != null) { + command.setLevel(commandAnnotation.gmLevel()); + for (String alias : commandAnnotation.aliases()) { + if (alias.length() == 0) { + continue; + } + + String commandName = "!" + alias; + list.put(commandName, command); + commandName = "/" + alias; + list.put(commandName, command); + } + } + + String commandName = "!" + cls.getSimpleName().toLowerCase(); + list.put(commandName, command); + commandName = "/" + cls.getSimpleName().toLowerCase(); + list.put(commandName, command); + } + + } + } catch (Exception e) { + + } + } + + public static void handle(Player player, String msg) { + String[] split = msg.split(" "); + + // End if invalid + if (split.length == 0) { + return; + } + + // + String first = split[0].toLowerCase(); + PlayerCommand c = PlayerCommands.list.get(first); + + if (c != null) { + // Execute + int len = Math.min(first.length() + 1, msg.length()); + c.execute(player, msg.substring(len)); + } else { + player.dropMessage("Error: Invalid command!"); + } + } + + public static abstract class PlayerCommand { + // GM level required to use this command + private int level; + protected int getLevel() { return this.level; } + protected void setLevel(int minLevel) { this.level = minLevel; } + + // Main + public abstract void execute(Player player, String raw); + } + + // ================ Commands ================ + + @Command(aliases = {"g", "item"}, desc = "/give [item id] [count] - Gives {count} amount of {item id}") + public static class Give extends PlayerCommand { + @Override + public void execute(Player player, String raw) { + String[] split = raw.split(" "); + int itemId = 0, count = 1; + + try { + itemId = Integer.parseInt(split[0]); + } catch (Exception e) { + itemId = 0; + } + + try { + count = Math.max(Math.min(Integer.parseInt(split[1]), Integer.MAX_VALUE), 1); + } catch (Exception e) { + count = 1; + } + + // Give + ItemExcel itemData = GameData.getItemExcelMap().get(itemId); + GameItem item; + + if (itemData == null) { + player.dropMessage("Error: Item data not found"); + return; + } + + if (itemData.isEquippable()) { + List items = new LinkedList<>(); + for (int i = 0; i < count; i++) { + item = new GameItem(itemData); + //items.add(item); + player.getInventory().addItem(item); + } + // TODO add item hint packet + } else { + item = new GameItem(itemData, count); + player.getInventory().addItem(item); + // TODO add item hint packet + } + + player.dropMessage("Giving you " + count + " of " + itemId); + } + } + + /* Temporarily disabled as spawned monsters need + @Command(desc = "/spawn [monster id] [count] - Creates {count} amount of {item id}") + public static class Spawn extends PlayerCommand { + @Override + public void execute(Player player, String raw) { + String[] split = raw.split(" "); + int monsterId = 0, stageId = 2; + + try { + monsterId = Integer.parseInt(split[0]); + } catch (Exception e) { + monsterId = 0; + } + + try { + stageId = Integer.parseInt(split[1]); + } catch (Exception e) { + stageId = 2; + } + + // TODO + NpcMonsterExcel excel = GameData.getNpcMonsterExcelMap().get(monsterId); + if (excel == null) { + player.dropMessage("Npc monster id not found!"); + return; + } + + StageExcel stage = GameData.getStageExcelMap().get(stageId); + if (stage == null) { + player.dropMessage("Stage id not found!"); + return; + } + + Position pos = player.getPos().clone(); + pos.setX(pos.getX() + 50); + + // Add to scene + EntityMonster monster = new EntityMonster(excel, stage, pos); + player.getScene().addMonster(monster); + } + } + */ +} diff --git a/src/main/java/emu/lunarcore/commands/ServerCommands.java b/src/main/java/emu/lunarcore/commands/ServerCommands.java new file mode 100644 index 0000000..2c68578 --- /dev/null +++ b/src/main/java/emu/lunarcore/commands/ServerCommands.java @@ -0,0 +1,119 @@ +package emu.lunarcore.commands; + +import java.lang.reflect.Modifier; +import java.util.HashMap; + +import emu.lunarcore.LunarRail; +import emu.lunarcore.util.Utils; + +@SuppressWarnings("unused") +public class ServerCommands { + private static HashMap list = new HashMap<>(); + + static { + try { + // Look for classes + for (Class cls : ServerCommands.class.getDeclaredClasses()) { + // Get non abstract classes + if (!Modifier.isAbstract(cls.getModifiers())) { + String commandName = cls.getSimpleName().toLowerCase(); + list.put(commandName, (ServerCommand) cls.newInstance()); + } + } + } catch (Exception e) { + + } + } + + public static void handle(String msg) { + String[] split = msg.split(" "); + + // End if invalid + if (split.length == 0) { + return; + } + + // + String first = split[0].toLowerCase(); + ServerCommand c = ServerCommands.list.get(first); + + if (c != null) { + // Execute + int len = Math.min(first.length() + 1, msg.length()); + c.execute(msg.substring(len)); + } else { + LunarRail.getLogger().info("Invalid command!"); + } + } + + public static abstract class ServerCommand { + public abstract void execute(String raw); + } + + // ================ Commands ================ + + private static class Account extends ServerCommand { + @Override + public void execute(String raw) { + String[] split = raw.split(" "); + + if (split.length < 2) { + LunarRail.getLogger().error("Invalid amount of args"); + return; + } + + emu.lunarcore.game.account.Account account = null; + + String command = split[0].toLowerCase(); + String username = split[1]; + + switch (command) { + case "create": + if (split.length < 2) { // Should be 3 if passwords were enabled + LunarRail.getLogger().error("Invalid amount of args"); + return; + } + + // Get password + //String password = split[2]; + + // Reserved player uid + int reservedUid = Utils.parseSafeInt(split[2]); + + // Get acocunt from database + account = LunarRail.getAccountDatabase().getObjectByField(emu.lunarcore.game.account.Account.class, "username", username); + + if (account == null) { + // Create account + //String hash = BCrypt.withDefaults().hashToString(12, password.toCharArray()); + + account = new emu.lunarcore.game.account.Account(username); + account.setReservedPlayerUid(reservedUid); + account.save(); + + LunarRail.getLogger().info("Account created"); + } else { + LunarRail.getLogger().error("Account already exists"); + } + + break; + case "delete": + account = LunarRail.getAccountDatabase().getObjectByField(emu.lunarcore.game.account.Account.class, "name", username); + + if (account == null) { + LunarRail.getLogger().info("Account doesnt exist"); + return; + } + + boolean success = LunarRail.getAccountDatabase().delete(account); + + if (success) { + LunarRail.getLogger().info("Account deleted"); + } + + break; + } + } + } + +} diff --git a/src/main/java/emu/lunarcore/data/GameData.java b/src/main/java/emu/lunarcore/data/GameData.java new file mode 100644 index 0000000..b0192a8 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/GameData.java @@ -0,0 +1,103 @@ +package emu.lunarcore.data; + +import java.lang.reflect.Field; + +import emu.lunarcore.data.config.FloorInfo; +import emu.lunarcore.data.excel.*; +import emu.lunarcore.util.Utils; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import lombok.Getter; + +@SuppressWarnings("unused") +public class GameData { + // Excels + @Getter private static Int2ObjectMap avatarExcelMap = new Int2ObjectOpenHashMap<>(); + @Getter private static Int2ObjectMap itemExcelMap = new Int2ObjectOpenHashMap<>(); + @Getter private static Int2ObjectMap equipExcelMap = new Int2ObjectOpenHashMap<>(); + @Getter private static Int2ObjectMap relicExcelMap = new Int2ObjectOpenHashMap<>(); + @Getter private static Int2ObjectMap monsterExcelMap = new Int2ObjectOpenHashMap<>(); + @Getter private static Int2ObjectMap npcMonsterExcelMap = new Int2ObjectOpenHashMap<>(); + @Getter private static Int2ObjectMap stageExcelMap = new Int2ObjectOpenHashMap<>(); + @Getter private static Int2ObjectMap mapEntranceExcelMap = new Int2ObjectOpenHashMap<>(); + + private static Int2ObjectMap avatarPromotionExcelMap = new Int2ObjectOpenHashMap<>(); + private static Int2ObjectMap avatarSkillTreeExcelMap = new Int2ObjectOpenHashMap<>(); + private static Int2ObjectMap avatarRankExcelMap = new Int2ObjectOpenHashMap<>(); + private static Int2ObjectMap equipmentPromotionExcelMap = new Int2ObjectOpenHashMap<>(); + + private static Int2ObjectMap playerLevelExcelMap = new Int2ObjectOpenHashMap<>(); + private static Int2ObjectMap expTypeExcelMap = new Int2ObjectOpenHashMap<>(); + private static Int2ObjectMap equipmentExpTypeExcelMap = new Int2ObjectOpenHashMap<>(); + private static Int2ObjectMap relicExpTypeExcelMap = new Int2ObjectOpenHashMap<>(); + + @Getter + private static Int2ObjectMap relicMainAffixExcelMap = new Int2ObjectOpenHashMap<>(); + private static Int2ObjectMap relicSubAffixExcelMap = new Int2ObjectOpenHashMap<>(); + + // Configs (Bin) + @Getter private static Object2ObjectMap floorInfos = new Object2ObjectOpenHashMap<>(); + + public static Int2ObjectMap getMapForExcel(Class resourceDefinition) { + Int2ObjectMap map = null; + + try { + Field field = GameData.class.getDeclaredField(Utils.lowerCaseFirstChar(resourceDefinition.getSimpleName()) + "Map"); + field.setAccessible(true); + + map = (Int2ObjectMap) field.get(null); + + field.setAccessible(false); + } catch (Exception e) { + + } + + return map; + } + + public static AvatarPromotionExcel getAvatarPromotionExcel(int id, int promotion) { + return avatarPromotionExcelMap.get((id << 8) + promotion); + } + + public static AvatarSkillTreeExcel getAvatarSkillTreeExcel(int skill, int level) { + return avatarSkillTreeExcelMap.get((skill << 4) + level); + } + + public static AvatarRankExcel getAvatarRankExcel(int rankId) { + return avatarRankExcelMap.get(rankId); + } + + public static EquipmentPromotionExcel getEquipmentPromotionExcel(int id, int promotion) { + return equipmentPromotionExcelMap.get((id << 8) + promotion); + } + + public static int getPlayerExpRequired(int level) { + var excel = playerLevelExcelMap.get(level); + return excel != null ? excel.getPlayerExp() : 0; + } + + public static int getAvatarExpRequired(int expGroup, int level) { + var excel = expTypeExcelMap.get((expGroup << 16) + level); + return excel != null ? excel.getExp() : 0; + } + + public static int getEquipmentExpRequired(int expGroup, int level) { + var excel = equipmentExpTypeExcelMap.get((expGroup << 16) + level); + return excel != null ? excel.getExp() : 0; + } + + public static int getRelicExpRequired(int expGroup, int level) { + var excel = relicExpTypeExcelMap.get((expGroup << 16) + level); + return excel != null ? excel.getExp() : 0; + } + + public static RelicSubAffixExcel getRelicSubAffixExcel(int groupId, int affixId) { + return relicSubAffixExcelMap.get((groupId << 8) + affixId); + } + + public static FloorInfo getFloorInfo(int planeId, int floorId) { + return floorInfos.get("P" + planeId + "_F" + floorId); + } +} diff --git a/src/main/java/emu/lunarcore/data/GameDepot.java b/src/main/java/emu/lunarcore/data/GameDepot.java new file mode 100644 index 0000000..44d3666 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/GameDepot.java @@ -0,0 +1,37 @@ +package emu.lunarcore.data; + +import java.util.ArrayList; +import java.util.List; + +import emu.lunarcore.data.excel.RelicMainAffixExcel; +import emu.lunarcore.data.excel.RelicSubAffixExcel; +import emu.lunarcore.util.Utils; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; + +// Game data that is parsed by the server goes here +public class GameDepot { + private static Int2ObjectMap> relicMainAffixDepot = new Int2ObjectOpenHashMap<>(); + private static Int2ObjectMap> relicSubAffixDepot = new Int2ObjectOpenHashMap<>(); + + public static void addRelicMainAffix(RelicMainAffixExcel affix) { + List list = relicMainAffixDepot.computeIfAbsent(affix.getGroupID(), k -> new ArrayList<>()); + list.add(affix); + } + + public static void addRelicSubAffix(RelicSubAffixExcel affix) { + List list = relicSubAffixDepot.computeIfAbsent(affix.getGroupID(), k -> new ArrayList<>()); + list.add(affix); + } + + public static RelicMainAffixExcel getRandomRelicMainAffix(int groupId) { + var list = relicMainAffixDepot.get(groupId); + if (list == null) return null; + + return list.get(Utils.randomRange(0, list.size() - 1)); + } + + public static List getRelicSubAffixList(int groupId) { + return relicSubAffixDepot.get(groupId); + } +} diff --git a/src/main/java/emu/lunarcore/data/GameResource.java b/src/main/java/emu/lunarcore/data/GameResource.java new file mode 100644 index 0000000..40fb2ab --- /dev/null +++ b/src/main/java/emu/lunarcore/data/GameResource.java @@ -0,0 +1,15 @@ +package emu.lunarcore.data; + +public abstract class GameResource implements Comparable { + + public abstract int getId(); + + public void onLoad() { + + } + + @Override + public int compareTo(GameResource o) { + return this.getId() - o.getId(); + } +} diff --git a/src/main/java/emu/lunarcore/data/ResourceDeserializers.java b/src/main/java/emu/lunarcore/data/ResourceDeserializers.java new file mode 100644 index 0000000..862db16 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/ResourceDeserializers.java @@ -0,0 +1,37 @@ +package emu.lunarcore.data; + +import java.lang.reflect.Type; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; + +public class ResourceDeserializers { + + protected static class LunarRailDoubleDeserializer implements JsonDeserializer { + @Override + public Double deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + if (json.isJsonPrimitive()) { + return json.getAsDouble(); + } else { + // FixPoint + var obj = json.getAsJsonObject(); + return obj.get("Value").getAsDouble(); + } + } + } + + protected static class LunarRailHashDeserializer implements JsonDeserializer { + @Override + public Long deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + if (json.isJsonPrimitive()) { + return json.getAsLong(); + } else { + // TextID + var obj = json.getAsJsonObject(); + return obj.get("Hash").getAsLong(); + } + } + } +} diff --git a/src/main/java/emu/lunarcore/data/ResourceLoader.java b/src/main/java/emu/lunarcore/data/ResourceLoader.java new file mode 100644 index 0000000..d22a570 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/ResourceLoader.java @@ -0,0 +1,211 @@ +package emu.lunarcore.data; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Stream; + +import org.reflections.Reflections; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + +import emu.lunarcore.LunarRail; +import emu.lunarcore.data.ResourceDeserializers.LunarRailDoubleDeserializer; +import emu.lunarcore.data.ResourceDeserializers.LunarRailHashDeserializer; +import emu.lunarcore.data.config.FloorInfo; +import emu.lunarcore.data.config.FloorInfo.FloorGroupSimpleInfo; +import emu.lunarcore.data.config.GroupInfo; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; + +public class ResourceLoader { + private static boolean loaded = false; + + // Special gson factory we create for loading resources + private static final Gson gson = new GsonBuilder() + .registerTypeAdapter(double.class, new LunarRailDoubleDeserializer()) + .registerTypeAdapter(long.class, new LunarRailHashDeserializer()) + .create(); + + // Load all resources + public static void loadAll() { + // Make sure we don't load more than once + if (loaded) return; + + // Start loading resources + loadResources(); + // Load floor infos after resources + loadFloorInfos(); + + // Done + loaded = true; + } + + private static List> getResourceDefClasses() { + Reflections reflections = new Reflections(ResourceLoader.class.getPackage().getName()); + Set classes = reflections.getSubTypesOf(GameResource.class); + + List> classList = new ArrayList<>(classes.size()); + classes.forEach(o -> { + Class c = (Class) o; + if (c.getAnnotation(ResourceType.class) != null) { + classList.add(c); + } + }); + + classList.sort((a, b) -> b.getAnnotation(ResourceType.class).loadPriority().value() - a.getAnnotation(ResourceType.class).loadPriority().value()); + + return classList; + } + + private static void loadResources() { + for (Class resourceDefinition : getResourceDefClasses()) { + ResourceType type = resourceDefinition.getAnnotation(ResourceType.class); + + if (type == null) { + continue; + } + + @SuppressWarnings("rawtypes") + Int2ObjectMap map = GameData.getMapForExcel(resourceDefinition); + + try { + loadFromResource(resourceDefinition, type, map); + } catch (Exception e) { + LunarRail.getLogger().error("Error loading resource file: " + Arrays.toString(type.name()), e); + } + } + } + + @SuppressWarnings("rawtypes") + private static void loadFromResource(Class c, ResourceType type, Int2ObjectMap map) throws Exception { + int count = 0; + + for (String name : type.name()) { + count += loadFromResource(c, type, name, map); + } + + LunarRail.getLogger().info("Loaded " + count + " " + c.getSimpleName() + "s."); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + private static int loadFromResource(Class c, ResourceType type, String fileName, Int2ObjectMap map) throws Exception { + String file = LunarRail.getConfig().getResourceDir() + "/ExcelOutput/" + fileName; + + // Load reader from file + try (InputStreamReader fileReader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8)) { + // Setup variables + Stream stream = null; + + // Determine format of json + JsonElement json = JsonParser.parseReader(fileReader); + + if (json.isJsonArray()) { + // Parse list + List excels = gson.fromJson(json, TypeToken.getParameterized(List.class, c).getType()); + stream = excels.stream(); + } else if (json.isJsonObject()) { + // Check if object is map or a nested map + boolean isMap = true; + + var it = json.getAsJsonObject().asMap().entrySet().iterator(); + if (it.hasNext()) { + var it2 = it.next().getValue().getAsJsonObject().asMap().entrySet().iterator(); + String key = it2.next().getKey(); + try { + Integer.parseInt(key); + isMap = false; + } catch (Exception ex) { + + } + } + + // Parse json + if (isMap) { + // Map + Map excels = gson.fromJson(json, TypeToken.getParameterized(Map.class, Integer.class, c).getType()); + stream = excels.values().stream(); + } else { + // Nested Map + Map> excels = gson.fromJson(json, TypeToken.getParameterized(Map.class, Integer.class, TypeToken.getParameterized(Map.class, Integer.class, c).getType()).getType()); + stream = excels.values().stream().flatMap(m -> m.values().stream()); + } + } else { + throw new Exception("Invalid excel file: " + fileName); + } + + // Sanity check + if (stream == null) return 0; + + // Mutable integer + AtomicInteger count = new AtomicInteger(); + + stream.forEach(o -> { + GameResource res = (GameResource) o; + res.onLoad(); + + count.getAndIncrement(); + + if (map != null) { + map.put(res.getId(), res); + } + }); + + return count.get(); + } + } + + // Might be better to cache + private static void loadFloorInfos() { + // Load floor infos + File floorDir = new File(LunarRail.getConfig().getResourceDir() + "/Config/LevelOutput/Floor/"); + + if (!floorDir.exists()) { + LunarRail.getLogger().warn("Floor infos are missing, please check your resources."); + return; + } + + // Dump + for (File file : floorDir.listFiles()) { + try (FileReader reader = new FileReader(file)) { + FloorInfo floor = gson.fromJson(reader, FloorInfo.class); + String name = file.getName().substring(0, file.getName().indexOf('.')); + GameData.getFloorInfos().put(name, floor); + } catch (Exception e) { + e.printStackTrace(); + } + } + + // Load group infos + for (FloorInfo floor : GameData.getFloorInfos().values()) { + for (FloorGroupSimpleInfo simpleGroup : floor.getSimpleGroupList()) { + File file = new File(LunarRail.getConfig().getResourceDir() + "/" + simpleGroup.getGroupPath()); + + if (!file.exists()) { + continue; + } + + // TODO optimize + try (FileReader reader = new FileReader(file)) { + GroupInfo group = gson.fromJson(reader, GroupInfo.class); + group.setId(simpleGroup.getID()); + floor.getGroups().put(simpleGroup.getID(), group); + } catch (Exception e) { + e.printStackTrace(); + } + } + + // Post load callback to cache floor info + floor.onLoad(); + } + + // Done + LunarRail.getLogger().info("Loaded " + GameData.getFloorInfos().size() + " FloorInfos."); + } +} diff --git a/src/main/java/emu/lunarcore/data/ResourceType.java b/src/main/java/emu/lunarcore/data/ResourceType.java new file mode 100644 index 0000000..92c8426 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/ResourceType.java @@ -0,0 +1,32 @@ +package emu.lunarcore.data; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface ResourceType { + + /** Names of the file that this Resource loads from */ + String[] name(); + + /** Load priority - dictates which order to load this resource, with "highest" being loaded first */ + LoadPriority loadPriority() default LoadPriority.NORMAL; + + public enum LoadPriority { + HIGHEST (4), + HIGH (3), + NORMAL (2), + LOW (1), + LOWEST (0); + + private final int value; + + LoadPriority(int value) { + this.value = value; + } + + public int value() { + return value; + } + } +} diff --git a/src/main/java/emu/lunarcore/data/common/ItemParam.java b/src/main/java/emu/lunarcore/data/common/ItemParam.java new file mode 100644 index 0000000..069840f --- /dev/null +++ b/src/main/java/emu/lunarcore/data/common/ItemParam.java @@ -0,0 +1,46 @@ +package emu.lunarcore.data.common; + +import com.google.gson.annotations.SerializedName; + +import emu.lunarcore.proto.ItemCostOuterClass.ItemCost; +import lombok.Getter; + +@Getter +public class ItemParam { + @SerializedName(value = "id", alternate = {"ItemId", "ItemID"}) + private int id; + + @SerializedName(value = "count", alternate = {"ItemCount", "ItemNum"}) + private int count; + + private ItemParamType type = ItemParamType.PILE; + + public ItemParam() { + // Gson + } + + public ItemParam(ItemParamType type, int id, int count) { + this.type = type; + this.id = id; + this.count = count; + } + + public ItemParam(ItemCost itemCost) { + if (itemCost.hasPileItem()) { + this.id = itemCost.getPileItem().getItemId(); + this.count = itemCost.getPileItem().getItemNum(); + } else if (itemCost.hasEquipmentUniqueId()) { + this.type = ItemParamType.UNIQUE; + this.id = itemCost.getEquipmentUniqueId(); + this.count = 1; + } else if (itemCost.hasRelicUniqueId()) { + this.type = ItemParamType.UNIQUE; + this.id = itemCost.getRelicUniqueId(); + this.count = 1; + } + } + + public static enum ItemParamType { + UNKNOWN, PILE, UNIQUE; + } +} diff --git a/src/main/java/emu/lunarcore/data/config/AnchorInfo.java b/src/main/java/emu/lunarcore/data/config/AnchorInfo.java new file mode 100644 index 0000000..6122549 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/config/AnchorInfo.java @@ -0,0 +1,5 @@ +package emu.lunarcore.data.config; + +public class AnchorInfo extends ObjectInfo { + +} diff --git a/src/main/java/emu/lunarcore/data/config/FloorInfo.java b/src/main/java/emu/lunarcore/data/config/FloorInfo.java new file mode 100644 index 0000000..a282acb --- /dev/null +++ b/src/main/java/emu/lunarcore/data/config/FloorInfo.java @@ -0,0 +1,59 @@ +package emu.lunarcore.data.config; + +import java.util.List; + +import com.google.gson.annotations.SerializedName; + +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; + +import lombok.Getter; + +@Getter +public class FloorInfo { + private int FloorID; + @SerializedName(value = "GroupList") + private List SimpleGroupList; + + // Cached data + private transient boolean loaded; + private transient Int2ObjectMap groups; + private transient Int2ObjectMap cachedTeleports; + + public FloorInfo() { + this.groups = new Int2ObjectOpenHashMap<>(); + this.cachedTeleports = new Int2ObjectOpenHashMap<>(); + } + + public AnchorInfo getAnchorInfo(int groupId, int anchorId) { + GroupInfo group = this.getGroups().get(groupId); + if (group == null) return null; + + return group.getAnchorList().stream().filter(a -> a.getID() == anchorId).findFirst().orElse(null); + } + + public void onLoad() { + if (this.loaded) return; + + // Cache anchors + for (GroupInfo group : groups.values()) { + if (group.getPropList() == null) { + continue; + } + + for (PropInfo prop : group.getPropList()) { + if (prop.getAnchorID() > 0) { + this.cachedTeleports.put(prop.getMappingInfoID(), prop); + } + } + } + + this.loaded = true; + } + + @Getter + public static class FloorGroupSimpleInfo { + private String GroupPath; + private int ID; + } +} diff --git a/src/main/java/emu/lunarcore/data/config/GroupInfo.java b/src/main/java/emu/lunarcore/data/config/GroupInfo.java new file mode 100644 index 0000000..59f56be --- /dev/null +++ b/src/main/java/emu/lunarcore/data/config/GroupInfo.java @@ -0,0 +1,24 @@ +package emu.lunarcore.data.config; + +import java.util.List; + +import lombok.Getter; + +@Getter +public class GroupInfo { + private transient int id; + private GroupLoadSide LoadSide; + private boolean LoadOnInitial; + + private List AnchorList; + private List MonsterList; + private List PropList; + + public void setId(int id) { + if (this.id == 0) this.id = id; + } + + public static enum GroupLoadSide { + Client, Server; + } +} diff --git a/src/main/java/emu/lunarcore/data/config/MonsterInfo.java b/src/main/java/emu/lunarcore/data/config/MonsterInfo.java new file mode 100644 index 0000000..db3bb7e --- /dev/null +++ b/src/main/java/emu/lunarcore/data/config/MonsterInfo.java @@ -0,0 +1,9 @@ +package emu.lunarcore.data.config; + +import lombok.Getter; + +@Getter +public class MonsterInfo extends ObjectInfo { + private int NPCMonsterID; + private int EventID; +} diff --git a/src/main/java/emu/lunarcore/data/config/ObjectInfo.java b/src/main/java/emu/lunarcore/data/config/ObjectInfo.java new file mode 100644 index 0000000..bf50c13 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/config/ObjectInfo.java @@ -0,0 +1,21 @@ +package emu.lunarcore.data.config; + +import emu.lunarcore.util.Position; +import lombok.Getter; + +@Getter +public class ObjectInfo { + public int ID; + public float PosX; + public float PosY; + public float PosZ; + public String Name; + public float RotY; + + /* + * Returns a new Position object + */ + public Position clonePos() { + return new Position((int) (this.PosX * 1000f), (int) (this.PosY * 1000f), (int) (this.PosZ * 1000f)); + } +} diff --git a/src/main/java/emu/lunarcore/data/config/PropInfo.java b/src/main/java/emu/lunarcore/data/config/PropInfo.java new file mode 100644 index 0000000..1c20614 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/config/PropInfo.java @@ -0,0 +1,17 @@ +package emu.lunarcore.data.config; + +import emu.lunarcore.game.scene.PropState; +import lombok.Getter; + +@Getter +public class PropInfo extends ObjectInfo { + public float RotX; + public float RotZ; + private int MappingInfoID; + private int AnchorGroupID; + private int AnchorID; + private int PropID; + private int EventID; + private PropState State; + private boolean IsDelete; +} diff --git a/src/main/java/emu/lunarcore/data/excel/AvatarExcel.java b/src/main/java/emu/lunarcore/data/excel/AvatarExcel.java new file mode 100644 index 0000000..7d45cd9 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/AvatarExcel.java @@ -0,0 +1,64 @@ +package emu.lunarcore.data.excel; + +import java.util.ArrayList; +import java.util.List; + +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import emu.lunarcore.game.avatar.AvatarBaseType; +import emu.lunarcore.game.avatar.DamageType; +import lombok.AccessLevel; +import lombok.Getter; + +@Getter +@ResourceType(name = {"AvatarConfig.json"}) +public class AvatarExcel extends GameResource { + private int AvatarID; + private long AvatarName; + private DamageType DamageType; + private AvatarBaseType AvatarBaseType; + private double SPNeed; + + private int ExpGroup; + private int MaxPromotion; + private int MaxRank; + + private int[] RankIDList; + private int[] SkillList; + + @Getter(AccessLevel.NONE) + private transient AvatarPromotionExcel[] promotionData; + private transient List defaultSkillTrees; + private transient int maxSp; + + public AvatarExcel() { + this.defaultSkillTrees = new ArrayList<>(); + } + + @Override + public int getId() { + return AvatarID; + } + + public AvatarPromotionExcel getPromotionData(int i) { + return this.promotionData[i]; + } + + public int getRankId(int rank) { + return RankIDList[Math.min(rank, RankIDList.length - 1)]; + } + + @Override + public void onLoad() { + // Load promotion data + this.promotionData = new AvatarPromotionExcel[MaxPromotion + 1]; + + for (int i = 0; i <= MaxPromotion; i++) { + this.promotionData[i] = GameData.getAvatarPromotionExcel(getId(), i); + } + + // Cache max sp + this.maxSp = (int) this.SPNeed * 100; + } +} diff --git a/src/main/java/emu/lunarcore/data/excel/AvatarExpItemExcel.java b/src/main/java/emu/lunarcore/data/excel/AvatarExpItemExcel.java new file mode 100644 index 0000000..0a5653e --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/AvatarExpItemExcel.java @@ -0,0 +1,27 @@ +package emu.lunarcore.data.excel; + +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import emu.lunarcore.data.ResourceType.LoadPriority; +import lombok.Getter; + +@Getter +@ResourceType(name = {"AvatarExpItemConfig.json"}, loadPriority = LoadPriority.LOW) +public class AvatarExpItemExcel extends GameResource { + private int ItemID; + private int Exp; + + @Override + public int getId() { + return ItemID; + } + + @Override + public void onLoad() { + ItemExcel excel = GameData.getItemExcelMap().get(ItemID); + if (excel == null) return; + + excel.setAvatarExp(Exp); + } +} diff --git a/src/main/java/emu/lunarcore/data/excel/AvatarPromotionExcel.java b/src/main/java/emu/lunarcore/data/excel/AvatarPromotionExcel.java new file mode 100644 index 0000000..b0b6268 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/AvatarPromotionExcel.java @@ -0,0 +1,56 @@ +package emu.lunarcore.data.excel; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import emu.lunarcore.data.ResourceType.LoadPriority; +import emu.lunarcore.data.common.ItemParam; +import lombok.Getter; + +@Getter +@ResourceType(name = {"AvatarPromotionConfig.json"}, loadPriority = LoadPriority.HIGHEST) +public class AvatarPromotionExcel extends GameResource { + private int AvatarID; + private int Promotion; + + private int MaxLevel; + private int PlayerLevelRequire; + private int WorldLevelRequire; + private List PromotionCostList; + private transient int PromotionCostCoin; + + private double AttackBase; + private double AttackAdd; + private double DefenceBase; + private double DefenceAdd; + private double HPBase; + private double HPAdd; + private double SpeedBase; + private double CriticalChance; + private double CriticalDamage; + private double BaseAggro; + + @Override + public int getId() { + return (AvatarID << 8) + Promotion; + } + + @Override + public void onLoad() { + if (this.PromotionCostList == null) { + this.PromotionCostList = new ArrayList<>(); + } else { + Iterator it = this.PromotionCostList.iterator(); + while (it.hasNext()) { + ItemParam param = it.next(); + if (param.getId() == 2) { + this.PromotionCostCoin = param.getCount(); + it.remove(); + } + } + } + } +} diff --git a/src/main/java/emu/lunarcore/data/excel/AvatarRankExcel.java b/src/main/java/emu/lunarcore/data/excel/AvatarRankExcel.java new file mode 100644 index 0000000..bba4254 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/AvatarRankExcel.java @@ -0,0 +1,30 @@ +package emu.lunarcore.data.excel; + +import java.util.List; + +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import emu.lunarcore.data.ResourceType.LoadPriority; +import emu.lunarcore.data.common.ItemParam; +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; +import lombok.Getter; + +@Getter +@ResourceType(name = {"AvatarRankConfig.json"}, loadPriority = LoadPriority.HIGHEST) +public class AvatarRankExcel extends GameResource { + private int RankID; + private int Rank; + + private Int2IntOpenHashMap SkillAddLevelList; + private List UnlockCost; + + @Override + public int getId() { + return RankID; + } + + @Override + public void onLoad() { + + } +} diff --git a/src/main/java/emu/lunarcore/data/excel/AvatarSkillTreeExcel.java b/src/main/java/emu/lunarcore/data/excel/AvatarSkillTreeExcel.java new file mode 100644 index 0000000..e26567a --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/AvatarSkillTreeExcel.java @@ -0,0 +1,62 @@ +package emu.lunarcore.data.excel; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import emu.lunarcore.data.ResourceType.LoadPriority; +import emu.lunarcore.data.common.ItemParam; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import lombok.Getter; + +@Getter +@ResourceType(name = {"AvatarSkillTreeConfig.json"}, loadPriority = LoadPriority.LOW) +public class AvatarSkillTreeExcel extends GameResource { + private int PointID; + private int Level; + private int MaxLevel; + private boolean DefaultUnlock; + + private int AvatarID; + private int AvatarPromotionLimit; + private int AvatarLevelLimit; + + private List MaterialList; + private IntArrayList PrePoint; + private IntArrayList LevelUpSkillID; + + private transient int MaterialCostCoin; + + @Override + public int getId() { + return (PointID << 4) + Level; + } + + @Override + public void onLoad() { + // Parse material list + if (this.MaterialList == null) { + this.MaterialList = new ArrayList<>(); + } else { + Iterator it = this.MaterialList.iterator(); + while (it.hasNext()) { + ItemParam param = it.next(); + if (param.getId() == 2) { + this.MaterialCostCoin = param.getCount(); + it.remove(); + } + } + } + + // Load to excel + AvatarExcel excel = GameData.getAvatarExcelMap().get(AvatarID); + if (excel == null) return; + + if (this.isDefaultUnlock()) { + excel.getDefaultSkillTrees().add(this); + } + } +} diff --git a/src/main/java/emu/lunarcore/data/excel/EquipmentExcel.java b/src/main/java/emu/lunarcore/data/excel/EquipmentExcel.java new file mode 100644 index 0000000..b59a99d --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/EquipmentExcel.java @@ -0,0 +1,41 @@ +package emu.lunarcore.data.excel; + +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import emu.lunarcore.data.ResourceType.LoadPriority; +import emu.lunarcore.game.inventory.GameItem; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import lombok.Getter; + +@Getter +@ResourceType(name = {"EquipmentConfig.json"}, loadPriority = LoadPriority.LOW) +public class EquipmentExcel extends GameResource { + private int EquipmentID; + + private int MaxPromotion; + private int MaxRank; + private int ExpType; + private int ExpProvide; + private int CoinCost; + + private IntOpenHashSet RankUpCostList; + + @Override + public int getId() { + return EquipmentID; + } + + public boolean isRankUpItem(GameItem item) { + return item.getItemId() == this.EquipmentID || RankUpCostList.contains(item.getItemId()); + } + + @Override + public void onLoad() { + ItemExcel excel = GameData.getItemExcelMap().get(this.getId()); + if (excel != null) { + excel.setEquipmentExcel(this); + } + } + +} diff --git a/src/main/java/emu/lunarcore/data/excel/EquipmentExpItemExcel.java b/src/main/java/emu/lunarcore/data/excel/EquipmentExpItemExcel.java new file mode 100644 index 0000000..1066f94 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/EquipmentExpItemExcel.java @@ -0,0 +1,29 @@ +package emu.lunarcore.data.excel; + +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import emu.lunarcore.data.ResourceType.LoadPriority; +import lombok.Getter; + +@Getter +@ResourceType(name = {"EquipmentExpItemConfig.json"}, loadPriority = LoadPriority.LOW) +public class EquipmentExpItemExcel extends GameResource { + private int ItemID; + private int ExpProvide; + private int CoinCost; + + @Override + public int getId() { + return ItemID; + } + + @Override + public void onLoad() { + ItemExcel excel = GameData.getItemExcelMap().get(ItemID); + if (excel == null) return; + + excel.setEquipmentExp(ExpProvide); + excel.setExpCost(CoinCost); + } +} diff --git a/src/main/java/emu/lunarcore/data/excel/EquipmentExpTypeExcel.java b/src/main/java/emu/lunarcore/data/excel/EquipmentExpTypeExcel.java new file mode 100644 index 0000000..8a3af7b --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/EquipmentExpTypeExcel.java @@ -0,0 +1,27 @@ +package emu.lunarcore.data.excel; + +import com.google.gson.annotations.SerializedName; + +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import emu.lunarcore.data.ResourceType.LoadPriority; +import lombok.Getter; + +@Getter +@ResourceType(name = {"EquipmentExpType.json"}, loadPriority = LoadPriority.NORMAL) +public class EquipmentExpTypeExcel extends GameResource { + @SerializedName(value = "id", alternate = {"ExpType"}) + private int TypeID; + private int Level; + private int Exp; + + @Override + public int getId() { + return (TypeID << 16) + Level; + } + + @Override + public void onLoad() { + + } +} diff --git a/src/main/java/emu/lunarcore/data/excel/EquipmentPromotionExcel.java b/src/main/java/emu/lunarcore/data/excel/EquipmentPromotionExcel.java new file mode 100644 index 0000000..a47f008 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/EquipmentPromotionExcel.java @@ -0,0 +1,52 @@ +package emu.lunarcore.data.excel; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import emu.lunarcore.data.ResourceType.LoadPriority; +import emu.lunarcore.data.common.ItemParam; +import lombok.Getter; + +@Getter +@ResourceType(name = {"EquipmentPromotionConfig.json"}, loadPriority = LoadPriority.HIGHEST) +public class EquipmentPromotionExcel extends GameResource { + private int EquipmentID; + private int Promotion; + + private int MaxLevel; + private int PlayerLevelRequire; + private int WorldLevelRequire; + private List PromotionCostList; + private transient int PromotionCostCoin; + + private double AttackBase; + private double AttackAdd; + private double DefenceBase; + private double DefenceAdd; + private double HPBase; + private double HPAdd; + + @Override + public int getId() { + return (EquipmentID << 8) + Promotion; + } + + @Override + public void onLoad() { + if (this.PromotionCostList == null) { + this.PromotionCostList = new ArrayList<>(); + } else { + Iterator it = this.PromotionCostList.iterator(); + while (it.hasNext()) { + ItemParam param = it.next(); + if (param.getId() == 2) { + this.PromotionCostCoin = param.getCount(); + it.remove(); + } + } + } + } +} diff --git a/src/main/java/emu/lunarcore/data/excel/ExpTypeExcel.java b/src/main/java/emu/lunarcore/data/excel/ExpTypeExcel.java new file mode 100644 index 0000000..e15591e --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/ExpTypeExcel.java @@ -0,0 +1,24 @@ +package emu.lunarcore.data.excel; + +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import emu.lunarcore.data.ResourceType.LoadPriority; +import lombok.Getter; + +@Getter +@ResourceType(name = {"ExpType.json"}, loadPriority = LoadPriority.NORMAL) +public class ExpTypeExcel extends GameResource { + private int TypeID; + private int Level; + private int Exp; + + @Override + public int getId() { + return (TypeID << 16) + Level; + } + + @Override + public void onLoad() { + + } +} diff --git a/src/main/java/emu/lunarcore/data/excel/ItemExcel.java b/src/main/java/emu/lunarcore/data/excel/ItemExcel.java new file mode 100644 index 0000000..c2efa7a --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/ItemExcel.java @@ -0,0 +1,90 @@ +package emu.lunarcore.data.excel; + +import java.util.List; + +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import emu.lunarcore.data.common.ItemParam; +import emu.lunarcore.game.inventory.ItemMainType; +import emu.lunarcore.game.inventory.ItemRarity; +import emu.lunarcore.game.inventory.ItemSubType; +import lombok.Getter; +import lombok.Setter; + +@Getter +@ResourceType(name = {"ItemConfig.json", "ItemConfigAvatar.json", "ItemConfigAvatarPlayerIcon.json", "ItemConfigAvatarRank.json", + "ItemConfigBook.json", "ItemConfigDisk.json", "ItemConfigEquipment.json", "ItemConfigRelic.json", "ItemPlayerCard.json"}) +public class ItemExcel extends GameResource { + // General item data + private int ID; + private long ItemName; + private ItemMainType ItemMainType; + private ItemSubType ItemSubType; + private ItemRarity Rarity; + private int PileLimit; + + private List ReturnItemIDList; + + // Transient cache + @Setter private transient EquipmentExcel equipmentExcel; + @Setter private transient RelicExcel relicExcel; + + @Setter private transient int avatarExp; + @Setter private transient int relicExp; + @Setter private transient int equipmentExp; + @Setter private transient int expCost; + + @Override + public int getId() { + return ID; + } + + public boolean isEquipment() { + return ItemMainType == emu.lunarcore.game.inventory.ItemMainType.Equipment && this.getEquipmentExcel() != null; + } + + public boolean isRelic() { + return ItemMainType == emu.lunarcore.game.inventory.ItemMainType.Relic && this.getRelicExcel() != null; + } + + public boolean isEquippable() { + return ItemMainType == emu.lunarcore.game.inventory.ItemMainType.Relic || ItemMainType == emu.lunarcore.game.inventory.ItemMainType.Equipment; + } + + public int getRelicExp() { + if (this.relicExcel != null) { + return this.relicExcel.getExpProvide(); + } + return this.relicExp; + } + + public int getRelicExpCost() { + if (this.relicExcel != null) { + return this.relicExcel.getCoinCost(); + } + return this.expCost; + } + + public int getEquipmentExp() { + if (this.equipmentExcel != null) { + return this.equipmentExcel.getExpProvide(); + } + return this.equipmentExp; + } + + public int getEquipmentExpCost() { + if (this.equipmentExcel != null) { + return this.equipmentExcel.getCoinCost(); + } + return this.expCost; + } + + public int getEquipSlot() { + if (this.getRelicExcel() != null) { + return this.getRelicExcel().getType().getVal(); + } else if (this.getEquipmentExcel() != null) { + return 100; + } + return 0; + } +} diff --git a/src/main/java/emu/lunarcore/data/excel/MapEntranceExcel.java b/src/main/java/emu/lunarcore/data/excel/MapEntranceExcel.java new file mode 100644 index 0000000..aa50fc4 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/MapEntranceExcel.java @@ -0,0 +1,20 @@ +package emu.lunarcore.data.excel; + +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import lombok.Getter; + +@Getter +@ResourceType(name = {"MapEntrance.json"}) +public class MapEntranceExcel extends GameResource { + private int ID; + private int PlaneID; + private int FloorID; + private int StartGroupID; + private int StartAnchorID; + + @Override + public int getId() { + return ID; + } +} diff --git a/src/main/java/emu/lunarcore/data/excel/MonsterExcel.java b/src/main/java/emu/lunarcore/data/excel/MonsterExcel.java new file mode 100644 index 0000000..af25751 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/MonsterExcel.java @@ -0,0 +1,18 @@ +package emu.lunarcore.data.excel; + +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import lombok.Getter; + +@Getter +@ResourceType(name = {"MonsterConfig.json"}) +public class MonsterExcel extends GameResource { + private int MonsterID; + private int MonsterTemplateID; + private long MonsterName; + + @Override + public int getId() { + return MonsterID; + } +} diff --git a/src/main/java/emu/lunarcore/data/excel/NpcMonsterExcel.java b/src/main/java/emu/lunarcore/data/excel/NpcMonsterExcel.java new file mode 100644 index 0000000..ec5805c --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/NpcMonsterExcel.java @@ -0,0 +1,22 @@ +package emu.lunarcore.data.excel; + +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import lombok.Getter; + +@Getter +@ResourceType(name = {"NPCMonsterData.json"}) +public class NpcMonsterExcel extends GameResource { + private int ID; + private long NPCName; + + @Override + public int getId() { + return ID; + } + + @Override + public void onLoad() { + + } +} diff --git a/src/main/java/emu/lunarcore/data/excel/PlayerLevelExcel.java b/src/main/java/emu/lunarcore/data/excel/PlayerLevelExcel.java new file mode 100644 index 0000000..056523c --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/PlayerLevelExcel.java @@ -0,0 +1,18 @@ +package emu.lunarcore.data.excel; + +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import emu.lunarcore.data.ResourceType.LoadPriority; +import lombok.Getter; + +@Getter +@ResourceType(name = {"PlayerLevelConfig.json"}, loadPriority = LoadPriority.NORMAL) +public class PlayerLevelExcel extends GameResource { + private int Level; + private int PlayerExp; + + @Override + public int getId() { + return Level; + } +} diff --git a/src/main/java/emu/lunarcore/data/excel/RelicExcel.java b/src/main/java/emu/lunarcore/data/excel/RelicExcel.java new file mode 100644 index 0000000..cbf17ba --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/RelicExcel.java @@ -0,0 +1,37 @@ +package emu.lunarcore.data.excel; + +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import emu.lunarcore.data.ResourceType.LoadPriority; +import emu.lunarcore.game.inventory.RelicType; +import lombok.Getter; + +@Getter +@ResourceType(name = {"RelicConfig.json"}, loadPriority = LoadPriority.LOW) +public class RelicExcel extends GameResource { + private int ID; + private int SetID; + private RelicType Type; + + private int MainAffixGroup; + private int SubAffixGroup; + private int MaxLevel; + private int ExpType; + + private int ExpProvide; + private int CoinCost; + + @Override + public int getId() { + return ID; + } + + @Override + public void onLoad() { + ItemExcel excel = GameData.getItemExcelMap().get(this.getId()); + if (excel != null) { + excel.setRelicExcel(this); + } + } +} diff --git a/src/main/java/emu/lunarcore/data/excel/RelicExpItemExcel.java b/src/main/java/emu/lunarcore/data/excel/RelicExpItemExcel.java new file mode 100644 index 0000000..ba3d297 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/RelicExpItemExcel.java @@ -0,0 +1,29 @@ +package emu.lunarcore.data.excel; + +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import emu.lunarcore.data.ResourceType.LoadPriority; +import lombok.Getter; + +@Getter +@ResourceType(name = {"RelicExpItem.json"}, loadPriority = LoadPriority.LOW) +public class RelicExpItemExcel extends GameResource { + private int ItemID; + private int ExpProvide; + private int CoinCost; + + @Override + public int getId() { + return ItemID; + } + + @Override + public void onLoad() { + ItemExcel excel = GameData.getItemExcelMap().get(ItemID); + if (excel == null) return; + + excel.setRelicExp(ExpProvide); + excel.setExpCost(CoinCost); + } +} diff --git a/src/main/java/emu/lunarcore/data/excel/RelicExpTypeExcel.java b/src/main/java/emu/lunarcore/data/excel/RelicExpTypeExcel.java new file mode 100644 index 0000000..03b6322 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/RelicExpTypeExcel.java @@ -0,0 +1,24 @@ +package emu.lunarcore.data.excel; + +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import emu.lunarcore.data.ResourceType.LoadPriority; +import lombok.Getter; + +@Getter +@ResourceType(name = {"RelicExpType.json"}, loadPriority = LoadPriority.NORMAL) +public class RelicExpTypeExcel extends GameResource { + private int TypeID; + private int Level; + private int Exp; + + @Override + public int getId() { + return (TypeID << 16) + Level; + } + + @Override + public void onLoad() { + + } +} diff --git a/src/main/java/emu/lunarcore/data/excel/RelicMainAffixExcel.java b/src/main/java/emu/lunarcore/data/excel/RelicMainAffixExcel.java new file mode 100644 index 0000000..58c5617 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/RelicMainAffixExcel.java @@ -0,0 +1,31 @@ +package emu.lunarcore.data.excel; + +import emu.lunarcore.data.GameDepot; +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import emu.lunarcore.data.ResourceType.LoadPriority; +import emu.lunarcore.game.avatar.AvatarPropertyType; +import lombok.Getter; + +@Getter +@ResourceType(name = {"RelicMainAffixConfig.json"}, loadPriority = LoadPriority.NORMAL) +public class RelicMainAffixExcel extends GameResource { + private int GroupID; + private int AffixID; + private AvatarPropertyType Property; + + private double BaseValue; + private double LevelAdd; + + private boolean IsAvailable; + + @Override + public int getId() { + return (GroupID << 16) + AffixID; + } + + @Override + public void onLoad() { + GameDepot.addRelicMainAffix(this); + } +} diff --git a/src/main/java/emu/lunarcore/data/excel/RelicSubAffixExcel.java b/src/main/java/emu/lunarcore/data/excel/RelicSubAffixExcel.java new file mode 100644 index 0000000..367e469 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/RelicSubAffixExcel.java @@ -0,0 +1,31 @@ +package emu.lunarcore.data.excel; + +import emu.lunarcore.data.GameDepot; +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import emu.lunarcore.data.ResourceType.LoadPriority; +import emu.lunarcore.game.avatar.AvatarPropertyType; +import lombok.Getter; + +@Getter +@ResourceType(name = {"RelicSubAffixConfig.json"}, loadPriority = LoadPriority.NORMAL) +public class RelicSubAffixExcel extends GameResource { + private int GroupID; + private int AffixID; + private AvatarPropertyType Property; + + private double BaseValue; + private double StepValue; + + private int StepNum; + + @Override + public int getId() { + return (GroupID << 16) + AffixID; + } + + @Override + public void onLoad() { + GameDepot.addRelicSubAffix(this); + } +} diff --git a/src/main/java/emu/lunarcore/data/excel/StageExcel.java b/src/main/java/emu/lunarcore/data/excel/StageExcel.java new file mode 100644 index 0000000..d29acd2 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/StageExcel.java @@ -0,0 +1,23 @@ +package emu.lunarcore.data.excel; + +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import lombok.Getter; + +@Getter +@ResourceType(name = {"StageConfig.json"}) +public class StageExcel extends GameResource { + private int StageID; + private long StageName; + private int Level; + + @Override + public int getId() { + return StageID; + } + + @Override + public void onLoad() { + + } +} diff --git a/src/main/java/emu/lunarcore/database/DatabaseCounter.java b/src/main/java/emu/lunarcore/database/DatabaseCounter.java new file mode 100644 index 0000000..6a962f9 --- /dev/null +++ b/src/main/java/emu/lunarcore/database/DatabaseCounter.java @@ -0,0 +1,23 @@ +package emu.lunarcore.database; + +import dev.morphia.annotations.Entity; +import dev.morphia.annotations.Id; + +@Entity(value = "counters", useDiscriminator = false) +public class DatabaseCounter { + @Id + private String id; + private int count; + + public DatabaseCounter() {} + + public DatabaseCounter(String id) { + this.id = id; + this.count = 10000; + } + + public int getNextId() { + int id = ++count; + return id; + } +} diff --git a/src/main/java/emu/lunarcore/database/DatabaseManager.java b/src/main/java/emu/lunarcore/database/DatabaseManager.java new file mode 100644 index 0000000..ceeaad3 --- /dev/null +++ b/src/main/java/emu/lunarcore/database/DatabaseManager.java @@ -0,0 +1,182 @@ +package emu.lunarcore.database; + +import java.util.stream.Stream; + +import org.reflections.Reflections; + +import com.mongodb.MongoCommandException; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.MongoIterable; +import com.mongodb.client.result.DeleteResult; + +import de.bwaldvogel.mongo.MongoBackend; +import de.bwaldvogel.mongo.MongoServer; +import de.bwaldvogel.mongo.backend.h2.H2Backend; +import de.bwaldvogel.mongo.backend.memory.MemoryBackend; +import dev.morphia.Datastore; +import dev.morphia.DeleteOptions; +import dev.morphia.Morphia; +import dev.morphia.annotations.Entity; +import dev.morphia.mapping.Mapper; +import dev.morphia.mapping.MapperOptions; +import dev.morphia.query.filters.Filters; +import emu.lunarcore.Config.DatabaseInfo; +import emu.lunarcore.Config.InternalMongoInfo; +import emu.lunarcore.LunarRail; + +public final class DatabaseManager { + private MongoServer server; + private Datastore datastore; + private DeleteOptions DELETE_MANY = new DeleteOptions().multi(true); + + public DatabaseManager() { + + } + + public DatabaseManager(DatabaseInfo info) { + // Variables + String connectionString = info.getUri(); + + // Local mongo server + if (info.isUseInternal()) { + connectionString = startInternalMongoServer(LunarRail.getConfig().getInternalMongoServer()); + LunarRail.getLogger().info("Using local mongo server at " + server.getConnectionString()); + } + + // Initialize + MongoClient gameMongoClient = MongoClients.create(connectionString); + + // Set mapper options. + MapperOptions mapperOptions = MapperOptions.builder() + .storeEmpties(true) + .storeNulls(false) + .build(); + + // Create data store. + datastore = Morphia.createDatastore(gameMongoClient, info.getCollection(), mapperOptions); + + // Map classes + Class[] entities = new Reflections(LunarRail.class.getPackageName()) + .getTypesAnnotatedWith(Entity.class) + .stream() + .filter(cls -> { + Entity e = cls.getAnnotation(Entity.class); + return e != null && !e.value().equals(Mapper.IGNORED_FIELDNAME); + }) + .toArray(Class[]::new); + + datastore.getMapper().map(entities); + + // Ensure indexes + ensureIndexes(); + } + + public MongoServer getServer() { + return server; + } + + public MongoDatabase getDatabase() { + return getDatastore().getDatabase(); + } + + public Datastore getDatastore() { + return datastore; + } + + private void ensureIndexes() { + try { + datastore.ensureIndexes(); + } catch (MongoCommandException exception) { + LunarRail.getLogger().warn("Mongo index error: ", exception); + // Duplicate index error + if (exception.getCode() == 85) { + // Drop all indexes and re add them + MongoIterable collections = datastore.getDatabase().listCollectionNames(); + for (String name : collections) { + datastore.getDatabase().getCollection(name).dropIndexes(); + } + // Add back indexes + datastore.ensureIndexes(); + } + } + } + + // + + public String startInternalMongoServer(InternalMongoInfo internalMongo) { + // Get backend + MongoBackend backend = null; + + if (internalMongo.filePath != null && internalMongo.filePath.length() > 0) { + backend = new H2Backend(internalMongo.filePath); + } else { + backend = new MemoryBackend(); + } + + // Create the local mongo server and replace the connection string + server = new MongoServer(backend); + + // Bind to address of it exists + if (internalMongo.getAddress() != null && internalMongo.getPort() != 0) { + server.bind(internalMongo.getAddress(), internalMongo.getPort()); + } else { + server.bind(); // Binds to random port + } + + return server.getConnectionString(); + } + + // Database Functions + + public boolean checkIfObjectExists(Class cls, long uid) { + return getDatastore().find(cls).filter(Filters.eq("_id", uid)).count() > 0; + } + + public T getObjectByUid(Class cls, long uid) { + return getDatastore().find(cls).filter(Filters.eq("_id", uid)).first(); + } + + public T getObjectByField(Class cls, String filter, String value) { + return getDatastore().find(cls).filter(Filters.eq(filter, value)).first(); + } + + public T getObjectByField(Class cls, String filter, int value) { + return getDatastore().find(cls).filter(Filters.eq(filter, value)).first(); + } + + public Stream getObjects(Class cls, String filter, long uid) { + return getDatastore().find(cls).filter(Filters.eq(filter, uid)).stream(); + } + + public Stream getObjects(Class cls) { + return getDatastore().find(cls).stream(); + } + + public void save(T obj) { + getDatastore().save(obj); + } + + public boolean delete(T obj) { + DeleteResult result = getDatastore().delete(obj); + return result.getDeletedCount() > 0; + } + + public boolean delete(Class cls, String filter, long uid) { + DeleteResult result = getDatastore().find(cls).filter(Filters.eq(filter, uid)).delete(DELETE_MANY); + return result.getDeletedCount() > 0; + } + + public synchronized int getNextObjectId(Class c) { + DatabaseCounter counter = getDatastore().find(DatabaseCounter.class).filter(Filters.eq("_id", c.getSimpleName())).first(); + if (counter == null) { + counter = new DatabaseCounter(c.getSimpleName()); + } + try { + return counter.getNextId(); + } finally { + getDatastore().save(counter); + } + } +} diff --git a/src/main/java/emu/lunarcore/game/account/Account.java b/src/main/java/emu/lunarcore/game/account/Account.java new file mode 100644 index 0000000..b81f77f --- /dev/null +++ b/src/main/java/emu/lunarcore/game/account/Account.java @@ -0,0 +1,60 @@ +package emu.lunarcore.game.account; + +import dev.morphia.annotations.*; +import emu.lunarcore.LunarRail; +import emu.lunarcore.util.Crypto; +import emu.lunarcore.util.Snowflake32; +import emu.lunarcore.util.Utils; +import lombok.Getter; + +@Getter +@Entity(value = "accounts", useDiscriminator = false) +public class Account { + @Id private String uid; + + @Indexed(options = @IndexOptions(unique = true)) + @Collation(locale = "simple", caseLevel = true) + private String username; + private String password; // Unused for now + + private int reservedPlayerUid; + + private String comboToken; // Combo token + private String dispatchToken; // Session token for dispatch server + + @Deprecated + public Account() { + + } + + public Account(String username) { + this.uid = Long.toString(Snowflake32.newUid()); + this.username = username; + } + + public String getEmail() { + return username; + } + + public void setReservedPlayerUid(int uid) { + this.reservedPlayerUid = uid; + } + + // TODO make unique + public String generateComboToken() { + this.comboToken = Utils.bytesToHex(Crypto.createSessionKey(32)); + this.save(); + return this.comboToken; + } + + // TODO make unique + public String generateDispatchToken() { + this.dispatchToken = Utils.bytesToHex(Crypto.createSessionKey(32)); + this.save(); + return this.dispatchToken; + } + + public void save() { + LunarRail.getAccountDatabase().save(this); + } +} diff --git a/src/main/java/emu/lunarcore/game/avatar/AvatarBaseType.java b/src/main/java/emu/lunarcore/game/avatar/AvatarBaseType.java new file mode 100644 index 0000000..47e3ccc --- /dev/null +++ b/src/main/java/emu/lunarcore/game/avatar/AvatarBaseType.java @@ -0,0 +1,21 @@ +package emu.lunarcore.game.avatar; + +import lombok.Getter; + +@Getter +public enum AvatarBaseType { + Unknown (0), + Warrior (1), + Rogue (2), + Mage (3), + Shaman (4), + Warlock (5), + Knight (6), + Priest (7); + + private final int val; + + private AvatarBaseType(int value) { + this.val = value; + } +} diff --git a/src/main/java/emu/lunarcore/game/avatar/AvatarPropertyType.java b/src/main/java/emu/lunarcore/game/avatar/AvatarPropertyType.java new file mode 100644 index 0000000..0840474 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/avatar/AvatarPropertyType.java @@ -0,0 +1,74 @@ +package emu.lunarcore.game.avatar; + +import lombok.Getter; + +public enum AvatarPropertyType { + Unknown (0), + MaxHP (1), + Attack (2), + Defence (3), + Speed (4), + CriticalChance (5), + CriticalDamage (6), + HealRatio (7), + StanceBreakAddedRatio (8), + SPRatio (9), + StatusProbability (10), + StatusResistance (11), + PhysicalAddedRatio (12), + PhysicalResistance (13), + FireAddedRatio (14), + FireResistance (15), + IceAddedRatio (16), + IceResistance (17), + ThunderAddedRatio (18), + ThunderResistance (19), + WindAddedRatio (20), + WindResistance (21), + QuantumAddedRatio (22), + QuantumResistance (23), + ImaginaryAddedRatio (24), + ImaginaryResistance (25), + BaseHP (26), + HPDelta (27), + BaseAttack (28), + AttackDelta (29), + BaseDefence (30), + DefenceDelta (31), + HPAddedRatio (32), + AttackAddedRatio (33), + DefenceAddedRatio (34), + BaseSpeed (35), + HealTakenRatio (36), + PhysicalResistanceDelta (37), + FireResistanceDelta (38), + IceResistanceDelta (39), + ThunderResistanceDelta (40), + WindResistanceDelta (41), + QuantumResistanceDelta (42), + ImaginaryResistanceDelta (43), + AllDamageReduce (44), + RelicValueExtraAdditionRatio (45), + EquipValueExtraAdditionRatio (46), + EquipExtraRank (47), + AvatarExtraRank (48), + AllDamageTypeAddedRatio (49), + SpeedAddedRatio (50), + SpeedDelta (51), + CriticalChanceBase (52), + CriticalDamageBase (53), + SPRatioBase (54), + HealRatioBase (55), + StatusProbabilityBase (56), + StatusResistanceBase (57), + BreakDamageAddedRatio (58), + BreakDamageAddedRatioBase (59), + MaxSP (60); + + @Getter + private int val; + + private AvatarPropertyType(int value) { + this.val = value; + } +} diff --git a/src/main/java/emu/lunarcore/game/avatar/AvatarStorage.java b/src/main/java/emu/lunarcore/game/avatar/AvatarStorage.java new file mode 100644 index 0000000..e336fb4 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/avatar/AvatarStorage.java @@ -0,0 +1,94 @@ +package emu.lunarcore.game.avatar; + +import java.util.Iterator; +import java.util.stream.Stream; + +import emu.lunarcore.LunarRail; +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.excel.AvatarExcel; +import emu.lunarcore.game.player.BasePlayerManager; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.server.packet.send.PacketPlayerSyncScNotify; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; + +public class AvatarStorage extends BasePlayerManager implements Iterable { + private final Int2ObjectMap avatars; + + public AvatarStorage(Player player) { + super(player); + this.avatars = new Int2ObjectOpenHashMap<>(); + } + + public Int2ObjectMap getAvatars() { + return avatars; + } + + public int getAvatarCount() { + return this.avatars.size(); + } + + public GameAvatar getAvatarById(int id) { + return getAvatars().get(id); + } + + public boolean hasAvatar(int id) { + return getAvatars().containsKey(id); + } + + public boolean addAvatar(GameAvatar avatar) { + // Sanity + if (avatar.getExcel() == null || this.hasAvatar(avatar.getAvatarId())) { + return false; + } + + // Set owner first + avatar.setOwner(getPlayer()); + + // Put into maps + this.avatars.put(avatar.getAvatarId(), avatar); + + // Save to database + avatar.save(); + + // Send packet + getPlayer().sendPacket(new PacketPlayerSyncScNotify(avatar)); + + return true; + } + + public void recalcAvatarStats() { + //this.getAvatars().values().stream().forEach(GameAvatar::recalcStats); + } + + @Override + public Iterator iterator() { + return getAvatars().values().iterator(); + } + + // Database + + public void loadFromDatabase() { + Stream stream = LunarRail.getGameDatabase().getObjects(GameAvatar.class, "ownerUid", this.getPlayer().getUid()); + + stream.forEach(avatar -> { + // Should never happen + if (avatar.getId() == null) { + return; + } + + // Load avatar excel data + AvatarExcel excel = GameData.getAvatarExcelMap().get(avatar.getAvatarId()); + if (excel == null) { + return; + } + + // Set ownerships + avatar.setExcel(excel); + avatar.setOwner(getPlayer()); + + // Add to avatar storage + this.avatars.put(avatar.getAvatarId(), avatar); + }); + } +} diff --git a/src/main/java/emu/lunarcore/game/avatar/DamageType.java b/src/main/java/emu/lunarcore/game/avatar/DamageType.java new file mode 100644 index 0000000..13a30f8 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/avatar/DamageType.java @@ -0,0 +1,6 @@ +package emu.lunarcore.game.avatar; + +// These are in excels but i prefer them as enums +public enum DamageType { + Physical, Ice, Fire, Thunder, Wind, Quantum, Imaginary; +} diff --git a/src/main/java/emu/lunarcore/game/avatar/GameAvatar.java b/src/main/java/emu/lunarcore/game/avatar/GameAvatar.java new file mode 100644 index 0000000..ae63731 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/avatar/GameAvatar.java @@ -0,0 +1,276 @@ +package emu.lunarcore.game.avatar; + +import java.util.HashMap; +import java.util.Map; + +import org.bson.types.ObjectId; + +import dev.morphia.annotations.Entity; +import dev.morphia.annotations.Id; +import dev.morphia.annotations.Indexed; +import emu.lunarcore.GameConstants; +import emu.lunarcore.LunarRail; +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.excel.AvatarExcel; +import emu.lunarcore.game.inventory.GameItem; +import emu.lunarcore.game.inventory.ItemMainType; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.game.scene.GameEntity; +import emu.lunarcore.proto.AvatarOuterClass.Avatar; +import emu.lunarcore.proto.AvatarSkillTreeOuterClass.AvatarSkillTree; +import emu.lunarcore.proto.AvatarTypeOuterClass.AvatarType; +import emu.lunarcore.proto.BattleAvatarOuterClass.BattleAvatar; +import emu.lunarcore.proto.BattleEquipmentOuterClass.BattleEquipment; +import emu.lunarcore.proto.BattleRelicOuterClass.BattleRelic; +import emu.lunarcore.proto.EquipRelicOuterClass.EquipRelic; +import emu.lunarcore.proto.LineupAvatarOuterClass.LineupAvatar; +import emu.lunarcore.proto.MotionInfoOuterClass.MotionInfo; +import emu.lunarcore.proto.SceneActorInfoOuterClass.SceneActorInfo; +import emu.lunarcore.proto.SceneEntityInfoOuterClass.SceneEntityInfo; +import emu.lunarcore.proto.SpBarInfoOuterClass.SpBarInfo; +import emu.lunarcore.proto.VectorOuterClass.Vector; +import emu.lunarcore.server.packet.send.PacketPlayerSyncScNotify; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Entity(value = "avatars", useDiscriminator = false) +public class GameAvatar implements GameEntity { + @Id private ObjectId id; + @Indexed @Getter private int ownerUid; // Uid of player that this avatar belongs to + + private transient Player owner; + private transient AvatarExcel excel; + + private int avatarId; // Id of avatar + @Setter private int level; + @Setter private int exp; + @Setter private int promotion; + @Setter private int rank; // Eidolons + + private int currentHp; + private int currentSp; + + private Map skills; + + private transient int entityId; + private transient Int2ObjectMap equips; + + @Deprecated // Morphia only + public GameAvatar() { + this.equips = new Int2ObjectOpenHashMap<>(); + this.currentHp = 10000; + this.currentSp = 0; + } + + // On creation + public GameAvatar(int avatarId) { + this(GameData.getAvatarExcelMap().get(avatarId)); + } + + public GameAvatar(AvatarExcel excel) { + this(); + this.excel = excel; + this.avatarId = excel.getId(); + this.level = 1; + + // Set default skills + this.skills = new HashMap<>(); + for (var skillTree : excel.getDefaultSkillTrees()) { + this.skills.put(skillTree.getPointID(), skillTree.getLevel()); + } + + // Set stats + this.currentHp = 10000; + } + + public void setOwner(Player player) { + this.owner = player; + this.ownerUid = player.getUid(); + } + + public void setExcel(AvatarExcel excel) { + this.excel = excel; + } + + @Override + public void setEntityId(int entityId) { + this.entityId = entityId; + } + + public int getMaxSp() { + return this.getExcel().getMaxSp(); + } + + public void setCurrentHp(int amount) { + this.currentHp = Math.max(Math.min(amount, 10000), 0); + } + + public void setCurrentSp(int amount) { + this.currentSp = Math.max(Math.min(amount, getMaxSp()), 0); + } + + // Equips + + public GameItem getEquipBySlot(int slot) { + return this.getEquips().get(slot); + } + + public GameItem getEquipment() { + return this.getEquips().get(GameConstants.EQUIPMENT_SLOT_ID); + } + + public boolean equipItem(GameItem item) { + // Sanity check + int slot = item.getEquipSlot(); + if (slot == 0) return false; + + // Check if other avatars have this item equipped + GameAvatar otherAvatar = getOwner().getAvatarById(item.getEquipAvatar()); + if (otherAvatar != null) { + // Unequip this item from the other avatar + if (otherAvatar.unequipItem(slot) != null) { + getOwner().sendPacket(new PacketPlayerSyncScNotify(otherAvatar)); + } + // Swap with other avatar + if (getEquips().containsKey(slot)) { + GameItem toSwap = this.getEquipBySlot(slot); + otherAvatar.equipItem(toSwap); + } + } else if (getEquips().containsKey(slot)) { + // Unequip item in current slot if it exists + GameItem unequipped = unequipItem(slot); + if (unequipped != null) { + getOwner().sendPacket(new PacketPlayerSyncScNotify(unequipped)); + } + } + + // Set equip + getEquips().put(slot, item); + + // Save equip if equipped avatar was changed + if (item.setEquipAvatar(this.getAvatarId())) { + item.save(); + } + + // Send packet + getOwner().sendPacket(new PacketPlayerSyncScNotify(this, item)); + + return true; + } + + public GameItem unequipItem(int slot) { + GameItem item = getEquips().remove(slot); + + if (item != null) { + item.setEquipAvatar(0); + item.save(); + return item; + } + + return null; + } + + // Proto + + public Avatar toProto() { + var proto = Avatar.newInstance() + .setBaseAvatarId(this.getAvatarId()) + .setLevel(this.getLevel()) + .setExp(this.getExp()) + .setPromotion(this.getPromotion()) + .setRank(this.getRank()); + + for (var equip : this.getEquips().values()) { + if (equip.getItemMainType() == ItemMainType.Relic) { + proto.addEquipRelicList(EquipRelic.newInstance().setSlot(equip.getEquipSlot()).setRelicUniqueId(equip.getInternalUid())); + } else if (equip.getItemMainType() == ItemMainType.Equipment) { + proto.setEquipmentUniqueId(equip.getInternalUid()); + } + } + + for (var skill : getSkills().entrySet()) { + proto.addSkilltreeList(AvatarSkillTree.newInstance().setPointId(skill.getKey()).setLevel(skill.getValue())); + } + + return proto; + } + + public LineupAvatar toLineupAvatarProto(int slot) { + var proto = LineupAvatar.newInstance() + .setAvatarType(AvatarType.AVATAR_FORMAL_TYPE) + .setId(this.getAvatarId()) + .setSpBar(SpBarInfo.newInstance().setCurSp(this.getCurrentSp()).setMaxSp(this.getMaxSp())) + .setHp(this.getCurrentHp()) + .setSlot(slot); + + return proto; + } + + @Override + public SceneEntityInfo toSceneEntityProto() { + var proto = SceneEntityInfo.newInstance() + .setEntityId(this.getEntityId()) + .setMotion(MotionInfo.newInstance().setPos(getOwner().getPos().toProto()).setRot(Vector.newInstance().setY(0))) + .setActor(SceneActorInfo.newInstance().setBaseAvatarId(this.getAvatarId()).setAvatarType(AvatarType.AVATAR_FORMAL_TYPE)); + + return proto; + } + + public BattleAvatar toBattleProto(int index) { + var proto = BattleAvatar.newInstance() + .setAvatarType(AvatarType.AVATAR_FORMAL_TYPE) + .setId(this.getAvatarId()) + .setLevel(this.getLevel()) + .setPromotion(this.getPromotion()) + .setRank(this.getRank()) + .setIndex(index) + .setHp(this.getCurrentHp()) + .setSpBar(SpBarInfo.newInstance().setCurSp(this.getCurrentSp()).setMaxSp(this.getMaxSp())) + .setWorldLevel(this.getOwner().getWorldLevel()); + + // Skill tree + for (var skill : getSkills().entrySet()) { + proto.addSkilltreeList(AvatarSkillTree.newInstance().setPointId(skill.getKey()).setLevel(skill.getValue())); + } + + // Build equips + for (var equip : this.getEquips().values()) { + if (equip.getItemMainType() == ItemMainType.Relic) { + // Build battle relic proto + var relic = BattleRelic.newInstance() + .setId(equip.getItemId()) + .setLevel(equip.getLevel()) + .setUniqueId(equip.getInternalUid()) + .setMainAffixId(equip.getMainAffix()); + + if (equip.getSubAffixes() != null) { + for (var subAffix : equip.getSubAffixes()) { + relic.addSubAffixList(subAffix.toProto()); + } + } + + proto.addRelicList(relic); + } else if (equip.getItemMainType() == ItemMainType.Equipment) { + // Build battle equipment proto + var equipment = BattleEquipment.newInstance() + .setId(equip.getItemId()) + .setLevel(equip.getLevel()) + .setPromotion(equip.getPromotion()) + .setRank(equip.getRank()); + + proto.addEquipmentList(equipment); + } + } + + return proto; + } + + // Database + + public void save() { + LunarRail.getGameDatabase().save(this); + } +} diff --git a/src/main/java/emu/lunarcore/game/battle/Battle.java b/src/main/java/emu/lunarcore/game/battle/Battle.java new file mode 100644 index 0000000..9a53dfb --- /dev/null +++ b/src/main/java/emu/lunarcore/game/battle/Battle.java @@ -0,0 +1,15 @@ +package emu.lunarcore.game.battle; + +import emu.lunarcore.game.player.Player; + +public class Battle { + private final Player player; + + public Battle(Player player) { + this.player = player; + } + + public Player getPlayer() { + return player; + } +} diff --git a/src/main/java/emu/lunarcore/game/battle/BattleService.java b/src/main/java/emu/lunarcore/game/battle/BattleService.java new file mode 100644 index 0000000..80f01bf --- /dev/null +++ b/src/main/java/emu/lunarcore/game/battle/BattleService.java @@ -0,0 +1,72 @@ +package emu.lunarcore.game.battle; + +import java.util.Collection; +import java.util.List; + +import emu.lunarcore.game.avatar.GameAvatar; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.game.scene.EntityMonster; +import emu.lunarcore.game.scene.GameEntity; +import emu.lunarcore.proto.AvatarBattleInfoOuterClass.AvatarBattleInfo; +import emu.lunarcore.proto.AvatarPropertyOuterClass.AvatarProperty; +import emu.lunarcore.proto.BattleEndStatusOuterClass.BattleEndStatus; +import emu.lunarcore.server.game.BaseGameService; +import emu.lunarcore.server.game.GameServer; +import emu.lunarcore.server.packet.send.PacketSceneCastSkillScRsp; +import emu.lunarcore.server.packet.send.PacketSyncLineupNotify; +import us.hebi.quickbuf.RepeatedInt; +import us.hebi.quickbuf.RepeatedMessage; + +public class BattleService extends BaseGameService { + + public BattleService(GameServer server) { + super(server); + } + + public void onBattleStart(Player player, int attackerId, RepeatedInt attackedList) { + // Setup variables + int entityId = attackedList.get(0); + GameEntity entity = null; + + // Check if attacker is the player or not + if (player.getScene().getAvatarEntityIds().contains(attackerId)) { + entity = player.getScene().getEntities().get(entityId); + } else if (player.getScene().getAvatarEntityIds().contains(entityId)) { + entity = player.getScene().getEntities().get(attackerId); + } + + if (entity != null) { + if (entity instanceof EntityMonster) { + player.sendPacket(new PacketSceneCastSkillScRsp(player, (EntityMonster) entity)); + return; + } + } + + player.sendPacket(new PacketSceneCastSkillScRsp(1)); + } + + public void onBattleResult(Player player, BattleEndStatus result, RepeatedMessage battleAvatars) { + // Lose + if (result == BattleEndStatus.BATTLE_END_LOSE) { + + } + + // Set health/energy + for (var battleAvatar : battleAvatars) { + GameAvatar avatar = player.getAvatarById(battleAvatar.getId()); + if (avatar == null) continue; + + AvatarProperty prop = battleAvatar.getAvatarStatus(); + int currentHp = (int) Math.round((prop.getLeftHp() / prop.getMaxHp()) * 100); + int currentSp = (int) prop.getLeftSp() * 100; + + //avatar.setCurrentHp(currentHp); + avatar.setCurrentSp(currentSp); + avatar.save(); + } + + // Sync with player + player.sendPacket(new PacketSyncLineupNotify(player.getLineupManager().getCurrentLineup())); + } + +} diff --git a/src/main/java/emu/lunarcore/game/gacha/GachaBanner.java b/src/main/java/emu/lunarcore/game/gacha/GachaBanner.java new file mode 100644 index 0000000..078dd52 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/gacha/GachaBanner.java @@ -0,0 +1,46 @@ +package emu.lunarcore.game.gacha; + +import emu.lunarcore.proto.GachaCeilingOuterClass.GachaCeiling; +import emu.lunarcore.proto.GachaInfoOuterClass.GachaInfo; +import lombok.Getter; + +@Getter +public class GachaBanner { + private int id; // Id should match one of the ids in GachaBasicInfo.json + private GachaType gachaType; + private int beginTime; + private int endTime; + private int[] rateUpItems5; + private int[] rateUpItems4; + private int eventChance = 50; + + public GachaInfo toProto() { + var info = GachaInfo.newInstance() + .setGachaId(this.getId()) + .setDetailUrl("") + .setHistoryUrl(""); + + if (this.gachaType == GachaType.Normal) { + // Gacha ceiling + info.setGachaCeiling(GachaCeiling.newInstance()); + } else { + info.setBeginTime(this.getBeginTime()); + info.setEndTime(this.getEndTime()); + } + + if (this.getRateUpItems4().length > 0) { + for (int id : getRateUpItems4()) { + info.addUpInfo(id); + } + } + + if (this.getRateUpItems5().length > 0) { + for (int id : getRateUpItems5()) { + info.addUpInfo(id); + info.addFeatured(id); + } + } + + return info; + } +} diff --git a/src/main/java/emu/lunarcore/game/gacha/GachaService.java b/src/main/java/emu/lunarcore/game/gacha/GachaService.java new file mode 100644 index 0000000..a7c6259 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/gacha/GachaService.java @@ -0,0 +1,283 @@ +package emu.lunarcore.game.gacha; + +import java.io.FileReader; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +import emu.lunarcore.LunarRail; +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.excel.ItemExcel; +import emu.lunarcore.game.avatar.GameAvatar; +import emu.lunarcore.game.inventory.GameItem; +import emu.lunarcore.game.inventory.ItemMainType; +import emu.lunarcore.game.inventory.ItemRarity; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.proto.GachaItemOuterClass.GachaItem; +import emu.lunarcore.proto.GetGachaInfoScRspOuterClass.GetGachaInfoScRsp; +import emu.lunarcore.proto.ItemListOuterClass.ItemList; +import emu.lunarcore.server.game.BaseGameService; +import emu.lunarcore.server.game.GameServer; +import emu.lunarcore.server.packet.send.PacketDoGachaScRsp; +import emu.lunarcore.util.JsonUtils; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; + +public class GachaService extends BaseGameService { + private final Int2ObjectMap gachaBanners; + private GetGachaInfoScRsp cachedProto; + + private int[] yellowAvatars = new int[] {1003, 1004, 1101, 1107, 1104, 1209, 1211}; + private int[] yellowWeapons = new int[] {23000, 23002, 23003, 23004, 23005, 23012, 23013}; + private int[] purpleAvatars = new int[] {1001, 1002, 1008, 1009, 1013, 1103, 1105, 1106, 1108, 1109, 1111, 1201, 1202, 1206, 1207}; + private int[] purpleWeapons = new int[] {21000, 21001, 21002, 21003, 21004, 21005, 21006, 21007, 21008, 21009, 21010, 21011, 21012, 21013, 21014, 21015, 21016, 21017, 21018, 21019, 21020}; + private int[] blueWeapons = new int[] {20000, 20001, 20002, 20003, 20004, 20005, 20006, 20007, 20008, 20009, 20010, 20011, 20012, 20013, 20014, 20015, 20016, 20017, 20018, 20019, 20020}; + + private static int starglitterId = 251; + private static int stardustId = 252; + + public GachaService(GameServer server) { + super(server); + this.gachaBanners = new Int2ObjectOpenHashMap<>(); + this.load(); + } + + public Int2ObjectMap getGachaBanners() { + return gachaBanners; + } + + public int randomRange(int min, int max) { + return ThreadLocalRandom.current().nextInt(max - min + 1) + min; + } + + public int getRandom(int[] array) { + return array[randomRange(0, array.length - 1)]; + } + + public synchronized void load() { + try (FileReader fileReader = new FileReader(LunarRail.getConfig().getDataDir() + "/Banners.json")) { + List banners = JsonUtils.loadToList(fileReader, GachaBanner.class); + for (GachaBanner banner : banners) { + getGachaBanners().put(banner.getId(), banner); + } + } catch (Exception e) { + // TODO Auto-generated catch block + LunarRail.getLogger().warn("No gacha banners loaded!"); + } + } + + public synchronized void doPulls(Player player, int gachaId, int times) { + // Sanity check + if (times != 10 && times != 1) { + return; + } + if (player.getInventory().getInventoryTab(ItemMainType.Equipment).getSize() + times > player.getInventory().getInventoryTab(ItemMainType.Equipment).getMaxCapacity()) { + player.sendPacket(new PacketDoGachaScRsp()); + return; + } + + // Get banner + GachaBanner banner = this.getGachaBanners().get(gachaId); + if (banner == null) { + player.sendPacket(new PacketDoGachaScRsp()); + return; + } + + // Spend currency + if (banner.getGachaType().getCostItem() > 0) { + GameItem costItem = player.getInventory().getInventoryTab(ItemMainType.Material).getItemById(banner.getGachaType().getCostItem()); + if (costItem == null || costItem.getCount() < times) { + return; + } + + player.getInventory().removeItem(costItem, times); + } + + // Roll + PlayerGachaBannerInfo gachaInfo = player.getGachaInfo().getBannerInfo(banner.getGachaType()); + IntList wonItems = new IntArrayList(times); + + for (int i = 0; i < times; i++) { + int random = this.randomRange(1, 10000); + int itemId = 0; + + int bonusYellowChance = gachaInfo.getPity5() >= 74 ? 100 * (gachaInfo.getPity5() - 73): 0; + int yellowChance = 60 + (int) Math.floor(100f * (gachaInfo.getPity5() / 73f)) + bonusYellowChance; + int purpleChance = 10000 - (510 + (int) Math.floor(790f * (gachaInfo.getPity4() / 8f))); + + if (random <= yellowChance || gachaInfo.getPity5() >= 89) { + if (banner.getRateUpItems5().length > 0) { + int eventChance = this.randomRange(1, 100); + + if (eventChance <= banner.getEventChance() || gachaInfo.getFailedFeaturedItemPulls() >= 1) { + itemId = getRandom(banner.getRateUpItems5()); + gachaInfo.setFailedFeaturedItemPulls(0); + } else { + // Lost the 50/50... rip + gachaInfo.addFailedFeaturedItemPulls(1); + } + } + + if (itemId == 0) { + int typeChance = this.randomRange(banner.getGachaType().getMinItemType(), banner.getGachaType().getMaxItemType()); + if (typeChance == 1) { + itemId = getRandom(this.yellowAvatars); + } else { + itemId = getRandom(this.yellowWeapons); + } + } + + // Pity + gachaInfo.addPity4(1); + gachaInfo.setPity5(0); + } else if (random >= purpleChance || gachaInfo.getPity4() >= 9) { + if (banner.getRateUpItems4().length > 0) { + int eventChance = this.randomRange(1, 100); + + if (eventChance >= 50) { + itemId = getRandom(banner.getRateUpItems4()); + } + } + + if (itemId == 0) { + int typeChance = this.randomRange(banner.getGachaType().getMinItemType(), banner.getGachaType().getMaxItemType()); + if (typeChance == 1) { + itemId = getRandom(this.purpleAvatars); + } else { + itemId = getRandom(this.purpleWeapons); + } + } + + // Pity + gachaInfo.addPity5(1); + gachaInfo.setPity4(0); + } else { + itemId = getRandom(this.blueWeapons); + + // Pity + gachaInfo.addPity4(1); + gachaInfo.addPity5(1); + } + + // Add winning item + wonItems.add(itemId); + } + + // Add to character + List list = new ArrayList<>(); + int stardust = 0, starglitter = 0; + + for (int itemId : wonItems) { + ItemExcel itemData = GameData.getItemExcelMap().get(itemId); + if (itemData == null) { + continue; + } + + // Create gacha item + GachaItem gachaItem = GachaItem.newInstance(); + int addStardust = 0, addStarglitter = 0; + + // Dupe check + if (itemData.getItemMainType() == ItemMainType.AvatarCard) { + int avatarId = itemData.getId(); + GameAvatar avatar = player.getAvatars().getAvatarById(avatarId); + if (avatar != null) { + int constLevel = avatar.getRank(); + int constItemId = avatarId + 10000; // Hacky. TODO optimize by using AvatarRankExcel + GameItem constItem = player.getInventory().getInventoryTab(ItemMainType.Material).getItemById(constItemId); + if (constItem != null) { + constLevel += constItem.getCount(); + } + + if (constLevel < 6) { + // Not max const + addStarglitter = 2; + // Add 1 const + //gachaItem.addTransferItems(GachaTransferItem.newBuilder().setItem(ItemParam.newBuilder().setItemId(constItemId).setCount(1)).setIsTransferItemNew(constItem == null)); + //gachaItem.addTokenItemList(ItemParam.newBuilder().setItemId(constItemId).setCount(1)); + player.getInventory().addItem(constItemId, 1); + } else { + // Is max const + addStarglitter = 5; + } + + if (itemData.getRarity() == ItemRarity.SuperRare) { + addStarglitter *= 5; + } + } else { + // New + gachaItem.setIsNew(true); + } + } else { + // Is weapon + switch (itemData.getRarity()) { + case SuperRare: + addStarglitter = 10; + break; + case VeryRare: + addStarglitter = 2; + break; + case Rare: + addStardust = 15; + break; + default: + break; + } + } + + // Create item + GameItem item = new GameItem(itemData); + gachaItem.setGachaItem(item.toProto()); + gachaItem.setUnk1(ItemList.newInstance()); + gachaItem.setUnk2(ItemList.newInstance()); + player.getInventory().addItem(item); + + stardust += addStardust; + starglitter += addStarglitter; + + /* + if (addStardust > 0) { + gachaItem.addTokenItemList(ItemParam.newBuilder().setItemId(stardustId).setCount(addStardust)); + } if (addStarglitter > 0) { + ItemParam starglitterParam = ItemParam.newBuilder().setItemId(starglitterId).setCount(addStarglitter).build(); + if (isTransferItem) { + gachaItem.addTransferItems(GachaTransferItem.newBuilder().setItem(starglitterParam)); + } + gachaItem.addTokenItemList(starglitterParam); + } + */ + + list.add(gachaItem.newInstance()); + } + + // Add stardust/starglitter + if (stardust > 0) { + player.getInventory().addItem(stardustId, stardust); + } if (starglitter > 0) { + player.getInventory().addItem(starglitterId, starglitter); + } + + // Packets + player.sendPacket(new PacketDoGachaScRsp(banner, times, list)); + } + + private synchronized GetGachaInfoScRsp createProto() { + var proto = GetGachaInfoScRsp.newInstance(); + + for (GachaBanner banner : getGachaBanners().values()) { + proto.addGachaInfoList(banner.toProto()); + } + + return proto; + } + + public GetGachaInfoScRsp toProto() { + if (this.cachedProto == null) { + this.cachedProto = createProto(); + } + + return this.cachedProto; + } +} diff --git a/src/main/java/emu/lunarcore/game/gacha/GachaType.java b/src/main/java/emu/lunarcore/game/gacha/GachaType.java new file mode 100644 index 0000000..16c45d6 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/gacha/GachaType.java @@ -0,0 +1,21 @@ +package emu.lunarcore.game.gacha; + +import lombok.Getter; + +@Getter +public enum GachaType { + Newbie (101, 1, 2), + Normal (101, 1, 2), + AvatarUp (102, 1, 1), + WeaponUp (102, 2, 2); + + private int costItem; + private int minItemType; + private int maxItemType; + + private GachaType(int costItem, int min, int max) { + this.costItem = costItem; + this.minItemType = min; + this.maxItemType = max; + } +} diff --git a/src/main/java/emu/lunarcore/game/gacha/PlayerGachaBannerInfo.java b/src/main/java/emu/lunarcore/game/gacha/PlayerGachaBannerInfo.java new file mode 100644 index 0000000..bc63bcb --- /dev/null +++ b/src/main/java/emu/lunarcore/game/gacha/PlayerGachaBannerInfo.java @@ -0,0 +1,46 @@ +package emu.lunarcore.game.gacha; + +import dev.morphia.annotations.Entity; + +@Entity(useDiscriminator = false) +public class PlayerGachaBannerInfo { + private int pity5 = 0; + private int pity4 = 0; + private int failedFeaturedItemPulls = 0; + + public int getPity5() { + return pity5; + } + + public void setPity5(int pity5) { + this.pity5 = pity5; + } + + public void addPity5(int amount) { + this.pity5 += amount; + } + + public int getPity4() { + return pity4; + } + + public void setPity4(int pity4) { + this.pity4 = pity4; + } + + public void addPity4(int amount) { + this.pity4 += amount; + } + + public int getFailedFeaturedItemPulls() { + return failedFeaturedItemPulls; + } + + public void setFailedFeaturedItemPulls(int failedEventCharacterPulls) { + this.failedFeaturedItemPulls = failedEventCharacterPulls; + } + + public void addFailedFeaturedItemPulls(int amount) { + failedFeaturedItemPulls += amount; + } +} diff --git a/src/main/java/emu/lunarcore/game/gacha/PlayerGachaInfo.java b/src/main/java/emu/lunarcore/game/gacha/PlayerGachaInfo.java new file mode 100644 index 0000000..35daddd --- /dev/null +++ b/src/main/java/emu/lunarcore/game/gacha/PlayerGachaInfo.java @@ -0,0 +1,38 @@ +package emu.lunarcore.game.gacha; + +import dev.morphia.annotations.Entity; + +@Entity(useDiscriminator = false) +public class PlayerGachaInfo { + private PlayerGachaBannerInfo standardBanner; + private PlayerGachaBannerInfo eventCharacterBanner; + private PlayerGachaBannerInfo eventWeaponBanner; + + public PlayerGachaInfo() { + this.standardBanner = new PlayerGachaBannerInfo(); + this.eventCharacterBanner = new PlayerGachaBannerInfo(); + this.eventWeaponBanner = new PlayerGachaBannerInfo(); + } + + public PlayerGachaBannerInfo getStandardBanner() { + return standardBanner; + } + + public PlayerGachaBannerInfo getEventCharacterBanner() { + return eventCharacterBanner; + } + + public PlayerGachaBannerInfo getEventWeaponBanner() { + return eventWeaponBanner; + } + + public PlayerGachaBannerInfo getBannerInfo(GachaType type) { + if (type == GachaType.AvatarUp) { + return this.eventCharacterBanner; + } else if (type == GachaType.WeaponUp) { + return this.eventWeaponBanner; + } + + return this.standardBanner; + } +} diff --git a/src/main/java/emu/lunarcore/game/inventory/EquipInventoryTab.java b/src/main/java/emu/lunarcore/game/inventory/EquipInventoryTab.java new file mode 100644 index 0000000..08f8671 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/inventory/EquipInventoryTab.java @@ -0,0 +1,45 @@ +package emu.lunarcore.game.inventory; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +public class EquipInventoryTab extends InventoryTab { + private final Set items; + private final int maxCapacity; + + public EquipInventoryTab(int maxCapacity) { + this.items = new HashSet<>(); + this.maxCapacity = maxCapacity; + } + + @Override + public GameItem getItemById(int id) { + return null; + } + + @Override + public void onAddItem(GameItem item) { + this.items.add(item); + } + + @Override + public void onRemoveItem(GameItem item) { + this.items.remove(item); + } + + @Override + public int getSize() { + return this.items.size(); + } + + @Override + public int getMaxCapacity() { + return this.maxCapacity; + } + + @Override + public Iterator iterator() { + return items.iterator(); + } +} diff --git a/src/main/java/emu/lunarcore/game/inventory/GameItem.java b/src/main/java/emu/lunarcore/game/inventory/GameItem.java new file mode 100644 index 0000000..9a1037b --- /dev/null +++ b/src/main/java/emu/lunarcore/game/inventory/GameItem.java @@ -0,0 +1,266 @@ +package emu.lunarcore.game.inventory; + +import java.util.ArrayList; +import java.util.List; + +import org.bson.types.ObjectId; + +import dev.morphia.annotations.Entity; +import dev.morphia.annotations.Id; +import dev.morphia.annotations.Indexed; +import emu.lunarcore.LunarRail; +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.GameDepot; +import emu.lunarcore.data.excel.ItemExcel; +import emu.lunarcore.data.excel.RelicMainAffixExcel; +import emu.lunarcore.data.excel.RelicSubAffixExcel; +import emu.lunarcore.game.avatar.AvatarPropertyType; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.proto.EquipmentOuterClass.Equipment; +import emu.lunarcore.proto.ItemOuterClass.Item; +import emu.lunarcore.proto.MaterialOuterClass.Material; +import emu.lunarcore.proto.PileItemOuterClass.PileItem; +import emu.lunarcore.proto.RelicOuterClass.Relic; +import emu.lunarcore.util.Utils; +import emu.lunarcore.util.WeightedList; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import it.unimi.dsi.fastutil.ints.IntSet; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Entity(value = "items", useDiscriminator = false) +public class GameItem { + @Id private ObjectId id; + @Indexed private int ownerUid; // Uid of player that this avatar belongs to + + private transient int internalUid; // Internal unique id of item + private transient ItemExcel excel; + + private int itemId; + private int count; + + @Setter private int level; + @Setter private int exp; + @Setter private int totalExp; + @Setter private int promotion; + @Setter private int rank; // Superimpose + @Setter private boolean locked; + + private int mainAffix; + private List subAffixes; + + private int equipAvatar; + + @Deprecated + public GameItem() { + // Morphia only + } + + public GameItem(int itemId) { + this(GameData.getItemExcelMap().get(itemId)); + } + + public GameItem(int itemId, int count) { + this(GameData.getItemExcelMap().get(itemId), count); + } + + public GameItem(ItemExcel data) { + this(data, 1); + } + + public GameItem(ItemExcel excel, int count) { + this.itemId = excel.getId(); + this.excel = excel; + + switch (excel.getItemMainType()) { + case Virtual: + this.count = count; + break; + case Equipment: + this.count = 1; + this.level = 1; + this.rank = 1; + break; + case Relic: + this.count = 1; + // Init affixes + if (getExcel().getRelicExcel() != null) { + // Main affix + var affix = GameDepot.getRandomRelicMainAffix(getExcel().getRelicExcel().getMainAffixGroup()); + if (affix != null) { + this.mainAffix = affix.getAffixID(); + } + // Sub affixes + int baseSubAffixes = Math.min(Math.max(getExcel().getRarity().getVal() - 2, 0), 3); + this.addSubAffixes(Utils.randomRange(baseSubAffixes, baseSubAffixes + 1)); + } + break; + default: + this.count = Math.min(count, excel.getPileLimit()); + } + } + + public void setOwner(Player player) { + this.ownerUid = player.getUid(); + this.internalUid = player.getInventory().getNextItemInternalUid(); + } + + public void setExcel(ItemExcel excel) { + this.excel = excel; + } + + public ItemMainType getItemMainType() { + return excel.getItemMainType(); + } + + public int getEquipSlot() { + return excel.getEquipSlot(); + } + + public boolean isEquipped() { + return this.getEquipAvatar() > 0; + } + + public boolean isDestroyable() { + return !this.isLocked() && !this.isEquipped(); + } + + public void setCount(int count) { + this.count = count; + } + + public boolean setEquipAvatar(int newEquipAvatar) { + if (this.equipAvatar != newEquipAvatar) { + this.equipAvatar = newEquipAvatar; + return true; + } + return false; + } + + // Sub affixes + + public void addSubAffixes(int quantity) { + for (int i = 0; i < quantity; i++) { + this.addSubAffix(); + } + } + + public void addSubAffix() { + if (this.subAffixes == null) { + this.subAffixes = new ArrayList<>(); + } + + if (this.subAffixes.size() < 4) { + this.addNewSubAffix(); + } else { + this.upgradeRandomSubAffix(); + } + } + + private void addNewSubAffix() { + // Get list of affixes to add + List affixList = GameDepot.getRelicSubAffixList(getExcel().getRelicExcel().getSubAffixGroup()); + if (affixList == null) return; + + // Blacklist main affix and any sub affixes + AvatarPropertyType mainAffixProperty = AvatarPropertyType.Unknown; + RelicMainAffixExcel mainAffix = GameData.getRelicMainAffixExcelMap().get(this.mainAffix); + if (mainAffix != null) { + mainAffixProperty = mainAffix.getProperty(); + } + + IntSet blacklist = new IntOpenHashSet(); + for (ItemSubAffix subAffix : this.getSubAffixes()) { + blacklist.add(subAffix.getId()); + } + + // Build random list + WeightedList randomList = new WeightedList<>(); + for (RelicSubAffixExcel affix : affixList) { + if (affix.getProperty() != mainAffixProperty && !blacklist.contains(affix.getAffixID())) { + randomList.add(10, affix); + } + } + + // Sanity check + if (randomList.size() == 0) { + return; + } + + // Add random stat + RelicSubAffixExcel subAffix = randomList.next(); + this.subAffixes.add(new ItemSubAffix(subAffix)); + } + + private void upgradeRandomSubAffix() { + ItemSubAffix subAffix = Utils.randomElement(this.subAffixes); + subAffix.incrementCount(); + } + + // Database + + public void save() { + if (this.count > 0 && this.ownerUid > 0) { + LunarRail.getGameDatabase().save(this); + } else if (this.getId() != null) { + LunarRail.getGameDatabase().delete(this); + } + + } + + // Proto + + public Material toMaterialProto() { + var proto = Material.newInstance() + .setTid(this.getItemId()) + .setNum(this.getCount()); + + return proto; + } + + public Relic toRelicProto() { + var proto = Relic.newInstance() + .setTid(this.getItemId()) + .setUniqueId(this.getInternalUid()) + .setLevel(this.getLevel()) + .setExp(this.getExp()) + .setIsProtected(this.isLocked()) + .setBaseAvatarId(this.getEquipAvatar()) + .setMainAffixId(this.mainAffix); + + if (this.subAffixes != null) { + for (var subAffix : this.subAffixes) { + proto.addSubAffixList(subAffix.toProto()); + } + } + + return proto; + } + + public Equipment toEquipmentProto() { + var proto = Equipment.newInstance() + .setTid(this.getItemId()) + .setUniqueId(this.getInternalUid()) + .setLevel(this.getLevel()) + .setExp(this.getExp()) + .setIsProtected(this.isLocked()) + .setPromotion(this.getPromotion()) + .setRank(this.getRank()) + .setBaseAvatarId(this.getEquipAvatar()); + + return proto; + } + + public PileItem toPileProto() { + return PileItem.newInstance() + .setItemId(this.getItemId()) + .setItemNum(this.getCount()); + } + + public Item toProto() { + return Item.newInstance() + .setItemId(this.getItemId()) + .setNum(this.getCount()); + } +} diff --git a/src/main/java/emu/lunarcore/game/inventory/Inventory.java b/src/main/java/emu/lunarcore/game/inventory/Inventory.java new file mode 100644 index 0000000..67a5099 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/inventory/Inventory.java @@ -0,0 +1,348 @@ +package emu.lunarcore.game.inventory; + +import java.util.Collection; +import java.util.stream.Stream; + +import emu.lunarcore.LunarRail; +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.common.ItemParam; +import emu.lunarcore.data.common.ItemParam.ItemParamType; +import emu.lunarcore.data.excel.AvatarExcel; +import emu.lunarcore.data.excel.ItemExcel; +import emu.lunarcore.game.avatar.AvatarStorage; +import emu.lunarcore.game.avatar.GameAvatar; +import emu.lunarcore.game.player.BasePlayerManager; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.server.packet.send.PacketPlayerSyncScNotify; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; + +public class Inventory extends BasePlayerManager { + private final Long2ObjectMap store; + private final Int2ObjectMap inventoryTypes; + private int nextInternalUid; + + public Inventory(Player player) { + super(player); + + this.store = new Long2ObjectOpenHashMap<>(); + this.inventoryTypes = new Int2ObjectOpenHashMap<>(); + + this.createInventoryTab(ItemMainType.Equipment, new EquipInventoryTab(1500)); + this.createInventoryTab(ItemMainType.Relic, new EquipInventoryTab(1500)); + this.createInventoryTab(ItemMainType.Material, new MaterialInventoryTab(2000)); + } + + public AvatarStorage getAvatarStorage() { + return this.getPlayer().getAvatars(); + } + + public Long2ObjectMap getItems() { + return store; + } + + public Int2ObjectMap getInventoryTypes() { + return inventoryTypes; + } + + public InventoryTab getInventoryTab(ItemMainType type) { + return getInventoryTypes().get(type.getVal()); + } + + public void createInventoryTab(ItemMainType type, InventoryTab tab) { + this.getInventoryTypes().put(type.getVal(), tab); + } + + public int getNextItemInternalUid() { + return ++nextInternalUid; + } + + /* Returns an item using its internal uid + * */ + public GameItem getItemByUid(int uid) { + return this.getItems().get(uid); + } + + public GameItem getMaterialByItemId(int id) { + return this.getInventoryTab(ItemMainType.Material).getItemById(id); + } + + public GameItem getItemByParam(ItemParam param) { + if (param.getType() == ItemParamType.PILE) { + return this.getMaterialByItemId(param.getId()); + } else if (param.getType() == ItemParamType.UNIQUE) { + return this.getItemByUid(param.getId()); + } + + return null; + } + + public boolean addItem(int itemId) { + return addItem(itemId, 1); + } + + public boolean addItem(int itemId, int count) { + ItemExcel excel = GameData.getItemExcelMap().get(itemId); + + if (excel == null) { + return false; + } + + GameItem item = new GameItem(excel, count); + + return addItem(item); + } + + public boolean addItem(GameItem item) { + GameItem result = putItem(item); + + if (result != null) { + // TODO Send packet (update) + getPlayer().sendPacket(new PacketPlayerSyncScNotify(item)); + return true; + } + + return false; + } + + private synchronized GameItem putItem(GameItem item) { + // Dont add items that dont have a valid item definition. + if (item.getExcel() == null) { + return null; + } + + // Add item to inventory store + ItemMainType type = item.getExcel().getItemMainType(); + InventoryTab tab = getInventoryTab(type); + + // Add + switch (type) { + case Equipment: + case Relic: + if (tab.getSize() >= tab.getMaxCapacity()) { + return null; + } + // Duplicates cause problems + item.setCount(Math.max(item.getCount(), 1)); + // Adds to inventory + this.putItem(item, tab); + // Set ownership and save to database + item.save(); + return item; + case Virtual: + // Handle + this.addVirtualItem(item.getItemId(), item.getCount()); + return item; + case AvatarCard: + // Add avatar + AvatarExcel avatarExcel = GameData.getAvatarExcelMap().get(item.getItemId()); + if (avatarExcel != null && !getPlayer().getAvatars().hasAvatar(avatarExcel.getId())) { + getPlayer().addAvatar(new GameAvatar(avatarExcel)); + } + return null; + case Material: + switch (item.getExcel().getItemSubType()) { + default: + if (tab == null) { + return null; + } + GameItem existingItem = tab.getItemById(item.getItemId()); + if (existingItem == null) { + // Item type didnt exist before, we will add it to main inventory map if there is enough space + if (tab.getSize() >= tab.getMaxCapacity()) { + return null; + } + this.putItem(item, tab); + // Set ownership and save to db + item.save(); + return item; + } else { + // Add count + existingItem.setCount(Math.min(existingItem.getCount() + item.getCount(), item.getExcel().getPileLimit())); + existingItem.save(); + return existingItem; + } + } + default: + return null; + } + } + + private synchronized void putItem(GameItem item, InventoryTab tab) { + // Set owner and internal uid first + item.setOwner(this.getPlayer()); + + // Add if tab exists + if (tab != null) { + // Put in item store + getItems().put(item.getInternalUid(), item); + // Add to tab + tab.onAddItem(item); + } + } + + private void addVirtualItem(int itemId, int count) { + switch (itemId) { + case 1: // Stellar Jade + getPlayer().addHCoin(count); + break; + case 2: // Credit + getPlayer().addSCoin(count); + break; + case 3: // Oneiric Shard + getPlayer().addMCoin(count); + break; + case 11: // Trailblaze Power + getPlayer().addStamina(count); + break; + case 22: // Trailblaze EXP + getPlayer().addExp(count); + break; + } + } + + public synchronized void removeItems(Collection items) { + for (ItemParam param : items) { + GameItem item = this.getItemByParam(param); + + if (item != null) { + this.removeItem(item, param.getCount()); + } + } + } + + public synchronized boolean removePileItem(int uid, int count) { + GameItem item = this.getMaterialByItemId(uid); + + if (item == null) { + return false; + } + + return removeItem(item, count); + } + + public synchronized boolean removeUniqueItem(int uid, int count) { + GameItem item = this.getItemByUid(uid); + + if (item == null) { + return false; + } + + return removeItem(item, count); + } + + public synchronized boolean removeItem(GameItem item, int count) { + // Sanity check + if (count <= 0 || item == null || item.getOwnerUid() != getPlayer().getUid()) { + return false; + } + + if (item.getExcel() == null || item.getExcel().isEquippable()) { + item.setCount(0); + } else { + item.setCount(item.getCount() - count); + } + + if (item.getCount() <= 0) { + // Remove from inventory tab too + InventoryTab tab = null; + if (item.getExcel() != null) { + tab = getInventoryTab(item.getExcel().getItemMainType()); + } + // Remove from inventory if less than 0 + deleteItem(item, tab); + // TODO Send packet (delete) + getPlayer().sendPacket(new PacketPlayerSyncScNotify(item)); + } else { + // TODO Send packet (update) + getPlayer().sendPacket(new PacketPlayerSyncScNotify(item)); + } + + // Update in db + item.save(); + + // Returns true on success + return true; + } + + private void deleteItem(GameItem item, InventoryTab tab) { + getItems().remove(item.getInternalUid()); + if (tab != null) { + tab.onRemoveItem(item); + } + } + + // Equips + + public boolean equipItem(int avatarId, int equipId) { + GameAvatar avatar = getPlayer().getAvatarById(avatarId); + GameItem item = this.getItemByUid(equipId); + + if (avatar != null && item != null) { + return avatar.equipItem(item); + } + + return false; + } + + public boolean unequipItem(int avatarId, int slot) { + GameAvatar avatar = getPlayer().getAvatars().getAvatarById(avatarId); + + if (avatar != null) { + GameItem unequipped = avatar.unequipItem(slot); + if (unequipped != null) { + getPlayer().sendPacket(new PacketPlayerSyncScNotify(avatar, unequipped)); + return true; + } + } + + return false; + } + + // Database + + public void loadFromDatabase() { + Stream stream = LunarRail.getGameDatabase().getObjects(GameItem.class, "ownerUid", this.getPlayer().getUid()); + + stream.forEach(item -> { + // Should never happen + if (item.getId() == null) { + return; + } + + // Load item excel data + ItemExcel excel = GameData.getItemExcelMap().get(item.getItemId()); + if (excel == null) { + // Delete item if it has no excel data + item.setCount(0); + item.save(); + return; + } + + // Set ownerships + item.setExcel(excel); + + // Put in inventory + InventoryTab tab = getInventoryTab(item.getExcel().getItemMainType()); + putItem(item, tab); + + // Equip to a character if possible + if (item.isEquipped()) { + GameAvatar avatar = getPlayer().getAvatarById(item.getEquipAvatar()); + boolean hasEquipped = false; + + if (avatar != null) { + hasEquipped = avatar.equipItem(item); + } + + if (!hasEquipped) { + // Unset equipped flag on item since we couldnt find an avatar to equip it to + item.setEquipAvatar(0); + item.save(); + } + } + }); + } +} diff --git a/src/main/java/emu/lunarcore/game/inventory/InventoryTab.java b/src/main/java/emu/lunarcore/game/inventory/InventoryTab.java new file mode 100644 index 0000000..8e3fc25 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/inventory/InventoryTab.java @@ -0,0 +1,13 @@ +package emu.lunarcore.game.inventory; + +public abstract class InventoryTab implements Iterable { + public abstract GameItem getItemById(int id); + + public abstract void onAddItem(GameItem item); + + public abstract void onRemoveItem(GameItem item); + + public abstract int getSize(); + + public abstract int getMaxCapacity(); +} diff --git a/src/main/java/emu/lunarcore/game/inventory/ItemMainType.java b/src/main/java/emu/lunarcore/game/inventory/ItemMainType.java new file mode 100644 index 0000000..4ece63c --- /dev/null +++ b/src/main/java/emu/lunarcore/game/inventory/ItemMainType.java @@ -0,0 +1,22 @@ +package emu.lunarcore.game.inventory; + +import lombok.Getter; + +@Getter +public enum ItemMainType { + Unknown (0), + Virtual (1), + AvatarCard (2), + Equipment (3), + Relic (4), + Usable (5), + Material (6), + Mission (7), + Display (8); + + private int val; + + private ItemMainType(int value) { + this.val = value; + } +} diff --git a/src/main/java/emu/lunarcore/game/inventory/ItemRarity.java b/src/main/java/emu/lunarcore/game/inventory/ItemRarity.java new file mode 100644 index 0000000..0b94169 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/inventory/ItemRarity.java @@ -0,0 +1,19 @@ +package emu.lunarcore.game.inventory; + +import lombok.Getter; + +@Getter +public enum ItemRarity { + Unknown (0), + Normal (1), + NotNormal (2), + Rare (3), + VeryRare (4), + SuperRare (5); + + private int val; + + private ItemRarity(int value) { + this.val = value; + } +} diff --git a/src/main/java/emu/lunarcore/game/inventory/ItemSubAffix.java b/src/main/java/emu/lunarcore/game/inventory/ItemSubAffix.java new file mode 100644 index 0000000..85e8f38 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/inventory/ItemSubAffix.java @@ -0,0 +1,39 @@ +package emu.lunarcore.game.inventory; + +import dev.morphia.annotations.Entity; +import emu.lunarcore.data.excel.RelicSubAffixExcel; +import emu.lunarcore.proto.RelicAffixOuterClass.RelicAffix; +import emu.lunarcore.util.Utils; +import lombok.Getter; + +@Getter +@Entity(useDiscriminator = false) +public class ItemSubAffix { + private int id; // Affix id + private int count; + private int step; + + @Deprecated + public ItemSubAffix() { + // Morphia only! + } + + public ItemSubAffix(RelicSubAffixExcel subAffix) { + this.id = subAffix.getAffixID(); + this.count = 1; + this.step = Utils.randomRange(0, subAffix.getStepNum()); + } + + public void incrementCount() { + this.count += 1; + } + + public RelicAffix toProto() { + var proto = RelicAffix.newInstance() + .setAffixId(this.id) + .setCnt(this.count) + .setStep(this.step); + + return proto; + } +} diff --git a/src/main/java/emu/lunarcore/game/inventory/ItemSubType.java b/src/main/java/emu/lunarcore/game/inventory/ItemSubType.java new file mode 100644 index 0000000..b0c5e21 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/inventory/ItemSubType.java @@ -0,0 +1,35 @@ +package emu.lunarcore.game.inventory; + +import lombok.Getter; + +@Getter +public enum ItemSubType { + Unknown (0), + Virtual (101), + GameplayCounter (102), + AvatarCard (201), + Equipment (301), + Relic (401), + Gift (501), + Food (502), + ForceOpitonalGift (503), + Book (504), + HeadIcon (505), + MusicAlbum (506), + Formula (507), + ChatBubble (508), + PhoneTheme (510), + Material (601), + Eidolon (602), + MuseumExhibit (603), + MuseumStuff (604), + Mission (701), + RelicSetShowOnly (801), + RelicRarityShowOnly (802); + + private int val; + + private ItemSubType(int value) { + this.val = value; + } +} diff --git a/src/main/java/emu/lunarcore/game/inventory/MaterialInventoryTab.java b/src/main/java/emu/lunarcore/game/inventory/MaterialInventoryTab.java new file mode 100644 index 0000000..d2a07fc --- /dev/null +++ b/src/main/java/emu/lunarcore/game/inventory/MaterialInventoryTab.java @@ -0,0 +1,46 @@ +package emu.lunarcore.game.inventory; + +import java.util.Iterator; + +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; + +public class MaterialInventoryTab extends InventoryTab { + private final Int2ObjectMap items; + private final int maxCapacity; + + public MaterialInventoryTab(int maxCapacity) { + this.items = new Int2ObjectOpenHashMap<>(); + this.maxCapacity = maxCapacity; + } + + @Override + public GameItem getItemById(int id) { + return this.items.get(id); + } + + @Override + public void onAddItem(GameItem item) { + this.items.put(item.getItemId(), item); + } + + @Override + public void onRemoveItem(GameItem item) { + this.items.remove(item.getItemId()); + } + + @Override + public int getSize() { + return this.items.size(); + } + + @Override + public int getMaxCapacity() { + return this.maxCapacity; + } + + @Override + public Iterator iterator() { + return items.values().iterator(); + } +} diff --git a/src/main/java/emu/lunarcore/game/inventory/RelicType.java b/src/main/java/emu/lunarcore/game/inventory/RelicType.java new file mode 100644 index 0000000..7bc2c76 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/inventory/RelicType.java @@ -0,0 +1,20 @@ +package emu.lunarcore.game.inventory; + +import lombok.Getter; + +@Getter +public enum RelicType { + Unknow (0), + HEAD (1), + HAND (2), + BODY (3), + FOOT (4), + NECK (5), + OBJECT (6); + + private int val; + + private RelicType(int value) { + this.val = value; + } +} diff --git a/src/main/java/emu/lunarcore/game/player/BasePlayerManager.java b/src/main/java/emu/lunarcore/game/player/BasePlayerManager.java new file mode 100644 index 0000000..ed2b893 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/player/BasePlayerManager.java @@ -0,0 +1,13 @@ +package emu.lunarcore.game.player; + +public abstract class BasePlayerManager { + private transient Player player; + + public BasePlayerManager(Player player) { + this.player = player; + } + + public Player getPlayer() { + return player; + } +} diff --git a/src/main/java/emu/lunarcore/game/player/LineupManager.java b/src/main/java/emu/lunarcore/game/player/LineupManager.java new file mode 100644 index 0000000..6cc4885 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/player/LineupManager.java @@ -0,0 +1,266 @@ +package emu.lunarcore.game.player; + +import java.util.List; + +import dev.morphia.annotations.Entity; +import emu.lunarcore.GameConstants; +import emu.lunarcore.game.avatar.GameAvatar; +import emu.lunarcore.server.packet.send.PacketSyncLineupNotify; +import lombok.Getter; + +@Entity(useDiscriminator = false) @Getter +public class LineupManager { + private transient Player player; + + private PlayerLineup[] lineups; + private int currentIndex; + private int currentLeader; + + @Deprecated + public LineupManager() { + // Morphia only! + } + + public LineupManager(Player player) { + this(); + + this.validate(player); + } + + public PlayerLineup getLineup(int index) { + // Sanity + if (index < 0 || index >= this.getLineups().length) { + return null; + } + + return this.lineups[index]; + } + + public PlayerLineup getCurrentLineup() { + return getLineup(this.currentIndex); + } + + // Lineup functions + + public boolean changeLeader(int slot) { + if (slot >= 0 && slot < this.getCurrentLineup().size()) { + this.currentLeader = slot; + return true; + } + + return false; + } + + public boolean joinLineup(int index, int slot, int avatarId) { + // Get lineup + PlayerLineup lineup = this.getLineup(index); + if (lineup == null) return false; + + boolean isCurrentLineup = lineup == getCurrentLineup(); + + // Get avatar + GameAvatar avatar = getPlayer().getAvatarById(avatarId); + if (avatar == null) return false; + + // Join lineup + if (slot >= 0 && slot < lineup.size()) { + // Replace avatar + lineup.getAvatars().set(slot, avatarId); + } else if (lineup.size() < GameConstants.MAX_AVATARS_IN_TEAM) { + // Add avatar + lineup.getAvatars().add(avatarId); + } else { + // No changes were made + return false; + } + + // Save + this.getPlayer().save(); + + // Sync lineup with scene + if (isCurrentLineup) { + player.getScene().syncLineup(); + } + + // Sync lineup data + player.sendPacket(new PacketSyncLineupNotify(lineup)); + + return true; + } + + public boolean quitLineup(int index, int avatarId) { + // Get lineup + PlayerLineup lineup = this.getLineup(index); + if (lineup == null) return false; + + boolean isCurrentLineup = lineup == getCurrentLineup(); + + // Sanity check to make sure were not removing the last member of our lineup + if (isCurrentLineup && lineup.size() <= 1) { + return false; + } + + // + int i = lineup.getAvatars().indexOf(avatarId); + if (i != -1) { + lineup.getAvatars().remove(i); + } else { + return false; + } + + // Validate leader index + if (this.getCurrentLeader() >= lineup.size()) { + this.currentLeader = 0; + } + + // Save + this.getPlayer().save(); + + // Sync lineup with scene + if (isCurrentLineup) { + player.getScene().syncLineup(); + } + + // Sync lineup data + player.sendPacket(new PacketSyncLineupNotify(lineup)); + + return true; + } + + public boolean switchLineup(int index) { + // Sanity + if (index == this.getCurrentIndex()) { + return false; + } + + // Get lineup + PlayerLineup lineup = this.getLineup(index); + + // Make sure lineup exists and has size + if (lineup == null || lineup.size() == 0) { + return false; + } + + // Set index + this.currentIndex = index; + this.currentLeader = 0; + + // Save + this.getPlayer().save(); + + // Sync lineup data + player.getScene().syncLineup(); + player.sendPacket(new PacketSyncLineupNotify(lineup)); + + return true; + } + + public boolean replaceLineup(int index, List lineupList) { + // Sanity - Make sure player cant remove all avatars from the current lineup + if (index == this.currentIndex && lineupList.size() == 0) { + return false; + } + + // Get lineup + PlayerLineup lineup = this.getLineup(index); + if (lineup == null) return false; + + // Clear + lineup.getAvatars().clear(); + + // Add + for (int avatarId : lineupList) { + GameAvatar avatar = getPlayer().getAvatarById(avatarId); + if (avatar != null) { + lineup.getAvatars().add(avatarId); + } + } + + // Validate leader index + if (this.getCurrentLeader() >= lineup.size()) { + this.currentLeader = 0; + } + + // Save + this.getPlayer().save(); + + // Sync lineup with scene + if (lineup == getCurrentLineup()) { + player.getScene().syncLineup(); + } + + // Sync lineup data + player.sendPacket(new PacketSyncLineupNotify(lineup)); + + return true; + } + + public boolean swapLineup(int index, int src, int dest) { + // Sanity + if (src == dest) return false; + + // Get lineup + PlayerLineup lineup = this.getLineup(index); + // Validate slots + if ((lineup == null) || (src < 0 && src >= lineup.size())) { + return false; + } + if (dest < 0 && dest >= lineup.size()) { + return false; + } + + // Swap + int srcId = lineup.getAvatars().get(src); + int destId = lineup.getAvatars().get(dest); + + lineup.getAvatars().set(src, destId); + lineup.getAvatars().set(dest, srcId); + + // Save + this.getPlayer().save(); + + // Sync lineup data + player.sendPacket(new PacketSyncLineupNotify(lineup)); + + return true; + } + + public boolean changeLineupName(int index, String name) { + // Get lineup + PlayerLineup lineup = this.getLineup(index); + if (lineup == null) return false; + + // Change name + lineup.setName(name); + return true; + } + + // Max sure all lineups exist in the array + public void validate(Player player) { + // Set player + this.player = player; + + // Make sure lineups exist + if (this.getLineups() == null) { + this.lineups = new PlayerLineup[GameConstants.DEFAULT_TEAMS]; + } else if (this.getLineups().length != GameConstants.DEFAULT_TEAMS) { + // TODO move lineups from old array to this new one + this.lineups = new PlayerLineup[GameConstants.DEFAULT_TEAMS]; + } + + // Create new lineups for any missing ones + for (int i = 0; i < this.lineups.length; i++) { + if (this.lineups[i] == null) { + this.lineups[i] = new PlayerLineup(i); + } + this.lineups[i].setOwnerAndIndex(getPlayer(), i); + } + + // Set current index if out of bounds + if (this.currentIndex < 0) { + this.currentIndex = 0; + } else if (this.currentIndex >= this.lineups.length) { + this.currentIndex = this.lineups.length - 1; + } + } +} diff --git a/src/main/java/emu/lunarcore/game/player/Player.java b/src/main/java/emu/lunarcore/game/player/Player.java new file mode 100644 index 0000000..53e07ce --- /dev/null +++ b/src/main/java/emu/lunarcore/game/player/Player.java @@ -0,0 +1,310 @@ +package emu.lunarcore.game.player; + +import dev.morphia.annotations.Entity; +import dev.morphia.annotations.Id; +import dev.morphia.annotations.Indexed; + +import emu.lunarcore.GameConstants; +import emu.lunarcore.LunarRail; +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.config.AnchorInfo; +import emu.lunarcore.data.config.FloorInfo; +import emu.lunarcore.data.config.PropInfo; +import emu.lunarcore.data.excel.MapEntranceExcel; +import emu.lunarcore.game.account.Account; +import emu.lunarcore.game.avatar.AvatarStorage; +import emu.lunarcore.game.avatar.GameAvatar; +import emu.lunarcore.game.gacha.PlayerGachaInfo; +import emu.lunarcore.game.inventory.Inventory; +import emu.lunarcore.game.scene.Scene; +import emu.lunarcore.proto.PlayerBasicInfoOuterClass.PlayerBasicInfo; +import emu.lunarcore.server.game.GameServer; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.SessionState; +import emu.lunarcore.server.packet.send.PacketEnterSceneByServerScNotify; +import emu.lunarcore.server.packet.send.PacketPlayerSyncScNotify; +import emu.lunarcore.server.packet.send.PacketRevcMsgScNotify; +import emu.lunarcore.util.Position; + +import lombok.Getter; + +@Entity(value = "players", useDiscriminator = false) +@Getter +public class Player { + private transient GameSession session; + + @Id private int uid; + @Indexed private String accountUid; + private String name; + private String signature; + private int birthday; + + private int level; + private int exp; + private int worldLevel; + private int stamina; + private int scoin; // Credits + private int hcoin; // Jade + private int mcoin; // Crystals + + private transient Scene scene; + private Position pos; + private int planeId; + private int floorId; + private int entryId; + + // Player managers + private transient final AvatarStorage avatars; + private transient final Inventory inventory; + + // Database persistent data + private LineupManager lineupManager; + private PlayerGachaInfo gachaInfo; + + @Deprecated // Morphia only + public Player() { + this.avatars = new AvatarStorage(this); + this.inventory = new Inventory(this); + } + + // Called when player is created + public Player(GameSession session) { + this(); + this.session = session; + this.accountUid = getAccount().getUid(); + this.name = GameConstants.DEFAULT_NAME; + this.level = 1; + this.stamina = GameConstants.MAX_STAMINA; + + this.pos = new Position(-36589, -5400, 70019); + this.planeId = 10101; + this.floorId = 10101001; + this.entryId = 1010101; + + this.lineupManager = new LineupManager(this); + this.gachaInfo = new PlayerGachaInfo(); + + // Setup uid + this.initUid(); + + // Give us a starter character. + // TODO script tutorial + GameAvatar avatar = new GameAvatar(8001); + + this.getAvatars().addAvatar(avatar); + this.getLineupManager().getCurrentLineup().getAvatars().add(8001); + } + + public GameServer getServer() { + return session.getServer(); + } + + public Account getAccount() { + return session.getAccount(); + } + + public void setSession(GameSession session) { + if (this.session == null) { + this.session = session; + } + } + + public boolean setNickname(String nickname) { + if (nickname != this.name && nickname.length() <= 32) { + this.name = nickname; + this.sendPacket(new PacketPlayerSyncScNotify(this)); + this.save(); + return true; + } + + return false; + } + + public int setBirthday(int birthday) { + if (this.birthday == 0) { + int month = birthday / 100; + int day = birthday % 100; + + if (month >= 1 && month <= 12 && day >= 1 && day <= 31) { + this.birthday = birthday; + this.save(); + return this.birthday; + } + } + + return 0; + } + + public boolean hasLoggedIn() { + return this.getSession() != null && this.getSession().getState() != SessionState.WAITING_FOR_TOKEN; + } + + public boolean addAvatar(GameAvatar avatar) { + return getAvatars().addAvatar(avatar); + } + + public GameAvatar getAvatarById(int avatarId) { + return getAvatars().getAvatarById(avatarId); + } + + private void initUid() { + if (this.uid > 0) return; + + int nextUid = session.getAccount().getReservedPlayerUid(); + + if (nextUid == GameConstants.SERVER_CONSOLE_UID) { + nextUid = 0; + } + + while (nextUid == 0 || LunarRail.getGameDatabase().checkIfObjectExists(Player.class, nextUid)) { + nextUid = LunarRail.getGameDatabase().getNextObjectId(Player.class); + } + + this.uid = nextUid; + } + + public void addSCoin(int amount) { + this.scoin += amount; + this.sendPacket(new PacketPlayerSyncScNotify(this)); + } + + public void addHCoin(int amount) { + this.hcoin += amount; + this.sendPacket(new PacketPlayerSyncScNotify(this)); + } + + public void addMCoin(int amount) { + this.mcoin += amount; + this.sendPacket(new PacketPlayerSyncScNotify(this)); + } + + public void addStamina(int amount) { + this.stamina = Math.min(this.stamina + amount, GameConstants.MAX_STAMINA); + this.sendPacket(new PacketPlayerSyncScNotify(this)); + } + + public void addExp(int amount) { + // Required exp + int reqExp = GameData.getPlayerExpRequired(level + 1); + + // Add exp + this.exp += amount; + + while (this.exp >= reqExp && reqExp > 0) { + this.level += 1; + reqExp = GameData.getPlayerExpRequired(this.level + 1); + } + + // Save + this.save(); + + // Send packet + this.sendPacket(new PacketPlayerSyncScNotify(this)); + } + + public int getDisplayExp() { + return this.exp - GameData.getPlayerExpRequired(this.level); + } + + public void enterScene(int entryId, int teleportId) { + // Get map entrance excel + MapEntranceExcel entry = GameData.getMapEntranceExcelMap().get(entryId); + if (entry == null) return; + + // Get floor info + FloorInfo floor = GameData.getFloorInfo(entry.getPlaneID(), entry.getFloorID()); + if (floor == null) return; + + // Get teleport anchor + int startGroup = entry.getStartGroupID(); + int anchorId = entry.getStartAnchorID(); + if (teleportId != 0 || anchorId == 0) { + PropInfo teleport = floor.getCachedTeleports().get(teleportId); + if (teleport != null) { + startGroup = teleport.getAnchorGroupID(); + anchorId = teleport.getAnchorID(); + } + } + + AnchorInfo anchor = floor.getAnchorInfo(startGroup, anchorId); + if (anchor == null) return; + + // Set position + this.getPos().set( + (int) (anchor.getPosX() * 1000f), + (int) (anchor.getPosY() * 1000f), + (int) (anchor.getPosZ() * 1000f) + ); + this.planeId = entry.getPlaneID(); + this.floorId = entry.getFloorID(); + this.entryId = entry.getId(); + + // Save player + this.save(); + + // Move to scene + loadScene(entry.getPlaneID(), entry.getFloorID(), entry.getId()); + } + + private void loadScene(int planeId, int floorId, int entryId) { + // Sanity check + if (this.scene != null && this.scene.getPlaneId() == planeId) { + // Don't create a new scene if were already in the one we want to teleport to + } else { + this.scene = new Scene(this, planeId, floorId, entryId); + } + + // TODO send packet + if (this.getSession().getState() != SessionState.WAITING_FOR_TOKEN) { + this.sendPacket(new PacketEnterSceneByServerScNotify(this)); + } + } + + public void dropMessage(String message) { + this.sendPacket(new PacketRevcMsgScNotify(this, message)); + } + + public void sendPacket(BasePacket packet) { + if (this.hasLoggedIn()) { + this.getSession().send(packet); + } + } + + public void save() { + if (this.uid <= 0) { + LunarRail.getLogger().error("Tried to save a player object without a uid!"); + return; + } + + LunarRail.getGameDatabase().save(this); + } + + public void onLogin() { + // Load avatars and inventory first + this.getAvatars().loadFromDatabase(); + this.getInventory().loadFromDatabase(); + this.getAvatars().recalcAvatarStats(); // Recalc stats after items have loaded for the avatars + + // Load Etc + this.getLineupManager().validate(this); + + // Enter scene (should happen after everything else loads) + this.loadScene(planeId, floorId, entryId); + } + + public PlayerBasicInfo toProto() { + var proto = PlayerBasicInfo.newInstance() + .setNickname(this.getName()) + .setLevel(this.getLevel()) + .setExp(this.getDisplayExp()) + .setWorldLevel(this.getWorldLevel()) + .setScoin(this.getScoin()) + .setHcoin(this.getHcoin()) + .setMcoin(this.getMcoin()) + .setStamina(this.getStamina()); + + return proto; + } + +} diff --git a/src/main/java/emu/lunarcore/game/player/PlayerLineup.java b/src/main/java/emu/lunarcore/game/player/PlayerLineup.java new file mode 100644 index 0000000..94306ba --- /dev/null +++ b/src/main/java/emu/lunarcore/game/player/PlayerLineup.java @@ -0,0 +1,85 @@ +package emu.lunarcore.game.player; + +import java.util.ArrayList; +import java.util.List; + +import dev.morphia.annotations.Entity; +import emu.lunarcore.GameConstants; +import emu.lunarcore.game.avatar.GameAvatar; +import emu.lunarcore.proto.ExtraLineupTypeOuterClass.ExtraLineupType; +import emu.lunarcore.proto.LineupInfoOuterClass.LineupInfo; +import lombok.Getter; + +@Entity(useDiscriminator = false) @Getter +public class PlayerLineup { + private transient Player owner; + private transient int index; + + private String name; + private List avatars; + + @Deprecated // Morphia only! + public PlayerLineup() { + + } + + public PlayerLineup(int index) { + this.name = "Squad " + (index + 1); + this.avatars = new ArrayList<>(GameConstants.MAX_AVATARS_IN_TEAM); + } + + protected void setOwnerAndIndex(Player player, int index) { + this.owner = player; + this.index = index; + } + + public void setName(String name) { + this.name = name; + } + + public int size() { + return avatars.size(); + } + + public boolean contains(GameAvatar avatar) { + return getAvatars().contains(avatar.getAvatarId()); + } + + public boolean addAvatar(GameAvatar avatar) { + if (contains(avatar)) { + return false; + } + + getAvatars().add(avatar.getAvatarId()); + + return true; + } + + public boolean removeAvatar(int slot) { + if (size() <= 1) { + return false; + } + + getAvatars().remove(slot); + + return true; + } + + public LineupInfo toProto() { + var proto = LineupInfo.newInstance() + .setIndex(index) + .setName(this.getName()) + .setLeaderSlot(this.getOwner().getLineupManager().getCurrentLeader()) + .setTechniquePoints(5) + .setExtraLineupType(ExtraLineupType.LINEUP_NONE); + + for (int slot = 0; slot < this.getAvatars().size(); slot++) { + GameAvatar avatar = owner.getAvatars().getAvatarById(getAvatars().get(slot)); + if (avatar == null) continue; + + proto.addAvatarList(avatar.toLineupAvatarProto(slot)); + } + + return proto; + } +} diff --git a/src/main/java/emu/lunarcore/game/scene/EntityMonster.java b/src/main/java/emu/lunarcore/game/scene/EntityMonster.java new file mode 100644 index 0000000..866394f --- /dev/null +++ b/src/main/java/emu/lunarcore/game/scene/EntityMonster.java @@ -0,0 +1,50 @@ +package emu.lunarcore.game.scene; + +import emu.lunarcore.data.excel.NpcMonsterExcel; +import emu.lunarcore.data.excel.StageExcel; +import emu.lunarcore.proto.MotionInfoOuterClass.MotionInfo; +import emu.lunarcore.proto.SceneEntityInfoOuterClass.SceneEntityInfo; +import emu.lunarcore.proto.SceneNpcMonsterInfoOuterClass.SceneNpcMonsterInfo; +import emu.lunarcore.proto.VectorOuterClass.Vector; +import emu.lunarcore.util.Position; +import lombok.Getter; +import lombok.Setter; + +@Getter +public class EntityMonster implements GameEntity { + @Setter private int entityId; + @Setter private int worldLevel; + @Setter private int groupId; + @Setter private int instId; + @Setter private int eventId; + + private NpcMonsterExcel excel; + private StageExcel stage; + private Position pos; + private Position rot; + + public EntityMonster(NpcMonsterExcel excel, StageExcel stage, Position pos) { + this.excel = excel; + this.stage = stage; + this.pos = pos; + this.rot = new Position(); + } + + @Override + public SceneEntityInfo toSceneEntityProto() { + var monster = SceneNpcMonsterInfo.newInstance() + .setWorldLevel(this.getWorldLevel()) + .setMonsterId(excel.getId()) + .setEventId(this.getEventId()); + + var proto = SceneEntityInfo.newInstance() + .setEntityId(this.getEntityId()) + .setGroupId(this.getGroupId()) + .setInstId(this.getInstId()) + .setMotion(MotionInfo.newInstance().setPos(getPos().toProto()).setRot(getRot().toProto())) + .setNpcMonster(monster); + + return proto; + } + +} diff --git a/src/main/java/emu/lunarcore/game/scene/EntityProp.java b/src/main/java/emu/lunarcore/game/scene/EntityProp.java new file mode 100644 index 0000000..4fee023 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/scene/EntityProp.java @@ -0,0 +1,48 @@ +package emu.lunarcore.game.scene; + +import emu.lunarcore.data.excel.NpcMonsterExcel; +import emu.lunarcore.data.excel.StageExcel; +import emu.lunarcore.proto.MotionInfoOuterClass.MotionInfo; +import emu.lunarcore.proto.SceneEntityInfoOuterClass.SceneEntityInfo; +import emu.lunarcore.proto.SceneNpcMonsterInfoOuterClass.SceneNpcMonsterInfo; +import emu.lunarcore.proto.ScenePropInfoOuterClass.ScenePropInfo; +import emu.lunarcore.proto.VectorOuterClass.Vector; +import emu.lunarcore.util.Position; +import lombok.Getter; +import lombok.Setter; + +@Getter +public class EntityProp implements GameEntity { + @Setter private int entityId; + @Setter private int groupId; + @Setter private int instId; + @Setter private int propId; + @Setter private PropState state; + + private Position pos; + private Position rot; + + public EntityProp(int propId, Position pos) { + this.propId = propId; + this.pos = pos; + this.rot = new Position(); + this.state = PropState.Closed; + } + + @Override + public SceneEntityInfo toSceneEntityProto() { + var prop = ScenePropInfo.newInstance() + .setPropId(this.getPropId()) + .setPropState(this.getState().getVal()); + + var proto = SceneEntityInfo.newInstance() + .setEntityId(this.getEntityId()) + .setGroupId(this.getGroupId()) + .setInstId(this.getInstId()) + .setMotion(MotionInfo.newInstance().setPos(getPos().toProto()).setRot(getRot().toProto())) + .setProp(prop); + + return proto; + } + +} diff --git a/src/main/java/emu/lunarcore/game/scene/GameEntity.java b/src/main/java/emu/lunarcore/game/scene/GameEntity.java new file mode 100644 index 0000000..3770279 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/scene/GameEntity.java @@ -0,0 +1,15 @@ +package emu.lunarcore.game.scene; + +import emu.lunarcore.proto.SceneEntityInfoOuterClass.SceneEntityInfo; + +public interface GameEntity { + public int getEntityId(); + + public void setEntityId(int id); + + public default int getGroupId() { + return 0; + } + + public SceneEntityInfo toSceneEntityProto(); +} diff --git a/src/main/java/emu/lunarcore/game/scene/PropState.java b/src/main/java/emu/lunarcore/game/scene/PropState.java new file mode 100644 index 0000000..57b5917 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/scene/PropState.java @@ -0,0 +1,48 @@ +package emu.lunarcore.game.scene; + +import lombok.Getter; + +public enum PropState { + Closed (0), + Open (1), + Locked (2), + BridgeState1 (3), + BridgeState2 (4), + BridgeState3 (5), + BridgeState4 (6), + CheckPointDisable (7), + CheckPointEnable (8), + TriggerDisable (9), + TriggerEnable (10), + ChestLocked (11), + ChestClosed (12), + ChestUsed (13), + Elevator1 (14), + Elevator2 (15), + Elevator3 (16), + WaitActive (17), + EventClose (18), + EventOpen (19), + Hidden (20), + TeleportGate0 (21), + TeleportGate1 (22), + TeleportGate2 (23), + TeleportGate3 (24), + Destructed (25), + CustomState01 (101), + CustomState02 (102), + CustomState03 (103), + CustomState04 (104), + CustomState05 (105), + CustomState06 (106), + CustomState07 (107), + CustomState08 (108), + CustomState09 (109); + + @Getter + private final int val; + + private PropState(int val) { + this.val = val; + } +} diff --git a/src/main/java/emu/lunarcore/game/scene/Scene.java b/src/main/java/emu/lunarcore/game/scene/Scene.java new file mode 100644 index 0000000..144a63b --- /dev/null +++ b/src/main/java/emu/lunarcore/game/scene/Scene.java @@ -0,0 +1,224 @@ +package emu.lunarcore.game.scene; + +import java.util.ArrayList; +import java.util.List; + +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.config.FloorInfo; +import emu.lunarcore.data.config.GroupInfo; +import emu.lunarcore.data.config.GroupInfo.GroupLoadSide; +import emu.lunarcore.data.config.MonsterInfo; +import emu.lunarcore.data.config.PropInfo; +import emu.lunarcore.data.excel.NpcMonsterExcel; +import emu.lunarcore.data.excel.StageExcel; +import emu.lunarcore.game.avatar.GameAvatar; +import emu.lunarcore.game.player.PlayerLineup; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.proto.SceneEntityGroupInfoOuterClass.SceneEntityGroupInfo; +import emu.lunarcore.proto.SceneInfoOuterClass.SceneInfo; +import emu.lunarcore.server.packet.send.PacketSceneEntityUpdateScNotify; +import emu.lunarcore.server.packet.send.PacketSceneGroupRefreshScNotify; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import it.unimi.dsi.fastutil.ints.IntSet; +import lombok.Getter; + +@Getter +public class Scene { + private final Player player; + private final int planeId; + private final int floorId; + private final int entryId; + + private int lastEntityId = 0; + + // Avatar entites + private IntSet avatarEntityIds; + private Int2ObjectMap avatars; + + // Other entities TODO + private Int2ObjectMap entities; + + public Scene(Player player, int planeId, int floorId, int entryId) { + this.player = player; + this.planeId = planeId; + this.floorId = floorId; + this.entryId = entryId; + + // Setup avatars + this.avatarEntityIds = new IntOpenHashSet(); + this.avatars = new Int2ObjectOpenHashMap<>(); + this.entities = new Int2ObjectOpenHashMap<>(); + + PlayerLineup lineup = getPlayer().getLineupManager().getCurrentLineup(); + + for (int avatarId : lineup.getAvatars()) { + GameAvatar avatar = getPlayer().getAvatarById(avatarId); + if (avatar == null) continue; + + this.avatars.put(avatarId, avatar); + + // Add entity id + avatar.setEntityId(this.getNextEntityId()); + this.avatarEntityIds.add(avatar.getEntityId()); + } + + // Spawn monsters + FloorInfo floorInfo = GameData.getFloorInfo(this.planeId, this.floorId); + if (floorInfo == null) return; + + for (GroupInfo group : floorInfo.getGroups().values()) { + // Skip non-server groups + if (group.getLoadSide() != GroupLoadSide.Server) { + continue; + } + + // Add monsters + if (group.getMonsterList() != null || group.getMonsterList().size() > 0) { + for (MonsterInfo monsterInfo : group.getMonsterList()) { + // Get excels from game data + NpcMonsterExcel excel = GameData.getNpcMonsterExcelMap().get(monsterInfo.getNPCMonsterID()); + StageExcel stage = GameData.getStageExcelMap().get(1); + if (excel == null || stage == null) continue; + + // Create monster with excels + EntityMonster monster = new EntityMonster(excel, stage, monsterInfo.clonePos()); + monster.getRot().setY((int) (monsterInfo.getRotY() * 1000f)); + monster.setInstId(monsterInfo.getID()); + monster.setEventId(monsterInfo.getEventID()); + monster.setGroupId(group.getId()); + + // Add to monsters + this.addEntity(monster); + } + } + + // Add props + if (group.getPropList() != null || group.getPropList().size() > 0) { + for (PropInfo propInfo : group.getPropList()) { + // Dont add deleted props? + /* + if (propInfo.isIsDelete()) { + continue; + } + */ + + // Create prop from prop info + EntityProp prop = new EntityProp(propInfo.getPropID(), propInfo.clonePos()); + //prop.setState(propInfo.getState()); + prop.getRot().set( + (int) (propInfo.getRotX() * 1000f), + (int) (propInfo.getRotY() * 1000f), + (int) (propInfo.getRotZ() * 1000f) + ); + prop.setInstId(propInfo.getID()); + prop.setGroupId(group.getId()); + + // Add to monsters + this.addEntity(prop); + } + } + } + } + + private int getNextEntityId() { + return ++lastEntityId; + } + + public void syncLineup() { + // Get current lineup + PlayerLineup lineup = getPlayer().getLineupManager().getCurrentLineup(); + + // Setup new avatars list + var newAvatars = new Int2ObjectOpenHashMap(); + for (int avatarId : lineup.getAvatars()) { + GameAvatar avatar = getPlayer().getAvatarById(avatarId); + if (avatar == null) continue; + + newAvatars.put(avatarId, avatar); + } + + // Clear entity id cache + this.avatarEntityIds.clear(); + + // Add/Remove + List toAdd = new ArrayList<>(); + List toRemove = new ArrayList<>(); + + for (var avatar : newAvatars.values()) { + if (!this.avatars.containsKey(avatar.getAvatarId())) { + toAdd.add(avatar); + avatar.setEntityId(getNextEntityId()); + } + + // Add to entity id cache + this.avatarEntityIds.add(avatar.getEntityId()); + } + + for (var avatar : this.avatars.values()) { + if (!newAvatars.containsKey(avatar.getAvatarId())) { + toRemove.add(avatar); + avatar.setEntityId(0); + } + } + + // Sync packet + getPlayer().sendPacket(new PacketSceneGroupRefreshScNotify(toAdd, toRemove)); + } + + public synchronized void addEntity(GameEntity entity) { + // Dont add if monster id already exists + if (entity.getEntityId() != 0) return; + // Set entity id and add monster to entity map + entity.setEntityId(this.getNextEntityId()); + this.entities.put(entity.getEntityId(), entity); + } + + public synchronized void removeEntity(int entityId) { + GameEntity entity = this.entities.remove(entityId); + // TODO send packet + } + + public SceneInfo toProto() { + // Proto + var proto = SceneInfo.newInstance() + .setWorldId(301) + .setLCMMECNPOBA(2) + .setPlaneId(this.getPlaneId()) + .setFloorId(this.getFloorId()) + .setEntryId(this.getEntryId()); + + // Get current lineup + PlayerLineup lineup = getPlayer().getLineupManager().getCurrentLineup(); + int leaderAvatarId = lineup.getAvatars().get(getPlayer().getLineupManager().getCurrentLeader()); + + // Scene group + var playerGroup = SceneEntityGroupInfo.newInstance(); + + for (var avatar : avatars.values()) { + playerGroup.addEntityList(avatar.toSceneEntityProto()); + + if (leaderAvatarId == avatar.getAvatarId()) { + proto.setLeaderEntityId(avatar.getEntityId()); + } + } + + proto.addEntityGroupList(playerGroup); + + // Sort entities into groups + var groups = new Int2ObjectOpenHashMap(); + + for (var monster : entities.values()) { + var group = groups.computeIfAbsent(monster.getGroupId(), i -> SceneEntityGroupInfo.newInstance().setGroupId(i)); + group.addEntityList(monster.toSceneEntityProto()); + } + + for (var group : groups.values()) { + proto.addEntityGroupList(group); + } + + // Done + return proto; + } +} diff --git a/src/main/java/emu/lunarcore/game/service/ChatService.java b/src/main/java/emu/lunarcore/game/service/ChatService.java new file mode 100644 index 0000000..4521ac5 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/service/ChatService.java @@ -0,0 +1,46 @@ +package emu.lunarcore.game.service; + +import emu.lunarcore.commands.PlayerCommands; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.server.game.BaseGameService; +import emu.lunarcore.server.game.GameServer; + +public class ChatService extends BaseGameService { + + public ChatService(GameServer server) { + super(server); + } + + public void sendPrivChat(Player player, int targetUid, String message) { + // Sanity checks + if (message == null || message.length() == 0) { + return; + } + + // Check if command + if (message.charAt(0) == '!') { + PlayerCommands.handle(player, message); + return; + } + + // Get target + Player target = getServer().getPlayerByUid(targetUid); + + if (target == null) { + return; + } + + // Create chat packet TODO + } + + public void sendPrivChat(Player player, int targetUid, int emote) { + // Get target + Player target = getServer().getPlayerByUid(targetUid); + + if (target == null) { + return; + } + + // Create chat packet TODO + } +} diff --git a/src/main/java/emu/lunarcore/game/service/InventoryService.java b/src/main/java/emu/lunarcore/game/service/InventoryService.java new file mode 100644 index 0000000..dcce46c --- /dev/null +++ b/src/main/java/emu/lunarcore/game/service/InventoryService.java @@ -0,0 +1,496 @@ +package emu.lunarcore.game.service; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.common.ItemParam; +import emu.lunarcore.data.excel.AvatarPromotionExcel; +import emu.lunarcore.data.excel.AvatarRankExcel; +import emu.lunarcore.data.excel.AvatarSkillTreeExcel; +import emu.lunarcore.data.excel.EquipmentPromotionExcel; +import emu.lunarcore.game.avatar.GameAvatar; +import emu.lunarcore.game.inventory.GameItem; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.server.game.BaseGameService; +import emu.lunarcore.server.game.GameServer; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.send.*; +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; + +public class InventoryService extends BaseGameService { + + public InventoryService(GameServer server) { + super(server); + } + + // === Avatars === + + public void levelUpAvatar(Player player, int avatarId, Collection items) { + // Get avatar + GameAvatar avatar = player.getAvatarById(avatarId); + if (avatar == null) return; + + AvatarPromotionExcel promoteData = GameData.getAvatarPromotionExcel(avatarId, avatar.getPromotion()); + if (promoteData == null) return; + + // Exp gain + int expGain = 0; + + // Verify items + for (ItemParam param : items) { + GameItem item = player.getInventory().getItemByParam(param); + if (item == null || item.getExcel().getAvatarExp() == 0 || item.getCount() < param.getCount()) return; + + expGain += item.getExcel().getAvatarExp() * param.getCount(); + } + + // Verify credits + int cost = expGain / 10; + if (player.getScoin() < cost) { + player.sendPacket(new PacketAvatarExpUpScRsp()); + return; + } + + // Pay items + player.getInventory().removeItems(items); + player.addSCoin(-cost); + + // Level up + int maxLevel = promoteData.getMaxLevel(); + int level = avatar.getLevel(); + int exp = avatar.getExp(); + int reqExp = GameData.getAvatarExpRequired(avatar.getExcel().getExpGroup(), level); + + while (expGain > 0 && reqExp > 0 && level < maxLevel) { + // Do calculations + int toGain = Math.min(expGain, reqExp - exp); + exp += toGain; + expGain -= toGain; + // Level up + if (exp >= reqExp) { + // Exp + exp = 0; + level += 1; + // Set req exp + reqExp = GameData.getAvatarExpRequired(avatar.getExcel().getExpGroup(), level); + } + } + + // Done + avatar.setLevel(level); + avatar.setExp(exp); + + avatar.save(); + player.save(); + + // TODO add back leftover exp + List returnItems = new ArrayList<>(); + + // Send packets + player.sendPacket(new PacketPlayerSyncScNotify(avatar)); + player.sendPacket(new PacketAvatarExpUpScRsp(returnItems)); + } + + public void promoteAvatar(Player player, int avatarId) { + // Get avatar + GameAvatar avatar = player.getAvatarById(avatarId); + if (avatar == null || avatar.getPromotion() >= avatar.getExcel().getMaxPromotion()) return; + + AvatarPromotionExcel promotion = GameData.getAvatarPromotionExcel(avatarId, avatar.getPromotion()); + // Sanity check + if ((promotion == null) || avatar.getLevel() < promotion.getMaxLevel() || player.getLevel() < promotion.getPlayerLevelRequire() || player.getWorldLevel() < promotion.getWorldLevelRequire()) { + return; + } + + // Verify items + for (ItemParam param : promotion.getPromotionCostList()) { + GameItem item = player.getInventory().getItemByParam(param); + if (item == null || item.getCount() < param.getCount()) return; + } + + // Verify credits + if (player.getScoin() < promotion.getPromotionCostCoin()) { + player.sendPacket(new BasePacket(CmdId.PromoteAvatarScRsp)); + return; + } + + // Pay items + player.getInventory().removeItems(promotion.getPromotionCostList()); + player.addSCoin(-promotion.getPromotionCostCoin()); + + // Promote + avatar.setPromotion(avatar.getPromotion() + 1); + + avatar.save(); + player.save(); + + // Send packets + player.sendPacket(new PacketPlayerSyncScNotify(avatar)); + player.sendPacket(new BasePacket(CmdId.PromoteAvatarScRsp)); + } + + public void unlockSkillTreeAvatar(Player player, int pointId) { + // Hacky way to get avatar id + int avatarId = pointId / 1000; + + // Get avatar + Skill Tree data + GameAvatar avatar = player.getAvatarById(avatarId); + if (avatar == null) return; + + int nextLevel = avatar.getSkills().getOrDefault(pointId, 0) + 1; + + AvatarSkillTreeExcel skillTree = GameData.getAvatarSkillTreeExcel(pointId, nextLevel); + if (skillTree == null || skillTree.getAvatarID() != avatarId) return; + + // Verify items + for (ItemParam param : skillTree.getMaterialList()) { + GameItem item = player.getInventory().getItemByParam(param); + if (item == null || item.getCount() < param.getCount()) { + player.sendPacket(new PacketUnlockSkilltreeScRsp()); + return; + } + } + + // Verify credits + if (player.getScoin() < skillTree.getMaterialCostCoin()) { + player.sendPacket(new PacketUnlockSkilltreeScRsp()); + return; + } + + // Pay items + player.getInventory().removeItems(skillTree.getMaterialList()); + player.addSCoin(-skillTree.getMaterialCostCoin()); + + // Add skill + avatar.getSkills().put(pointId, nextLevel); + + avatar.save(); + player.save(); + + // Send packets + player.sendPacket(new PacketPlayerSyncScNotify(avatar)); + player.sendPacket(new PacketUnlockSkilltreeScRsp(avatarId, pointId, nextLevel)); + } + + public void rankUpAvatar(Player player, int avatarId) { + // Get avatar + GameAvatar avatar = player.getAvatarById(avatarId); + if (avatar == null || avatar.getRank() >= avatar.getExcel().getMaxRank()) return; + + AvatarRankExcel rankData = GameData.getAvatarRankExcel(avatar.getExcel().getRankId(avatar.getRank())); + if (rankData == null) return; + + // Verify items + for (ItemParam param : rankData.getUnlockCost()) { + GameItem item = player.getInventory().getItemByParam(param); + if (item == null || item.getCount() < param.getCount()) { + player.sendPacket(new BasePacket(CmdId.RankUpAvatarScRsp)); + return; + } + } + + // Pay items + player.getInventory().removeItems(rankData.getUnlockCost()); + + // Add rank + avatar.setRank(avatar.getRank() + 1); + avatar.save(); + + // Send packets + player.sendPacket(new PacketPlayerSyncScNotify(avatar)); + player.sendPacket(new BasePacket(CmdId.RankUpAvatarScRsp)); + } + + // === Equipment === + + public void levelUpEquipment(Player player, int equipId, Collection items) { + // Get equipment + GameItem equip = player.getInventory().getItemByUid(equipId); + + if (equip == null || !equip.getExcel().isEquipment()) { + player.sendPacket(new PacketExpUpEquipmentScRsp()); + return; + } + + EquipmentPromotionExcel promoteData = GameData.getEquipmentPromotionExcel(equip.getItemId(), equip.getPromotion()); + if (promoteData == null) return; + + // Exp gain + int cost = 0; + int expGain = 0; + + // Verify items + for (ItemParam param : items) { + GameItem item = player.getInventory().getItemByParam(param); + System.out.println(param.getId()); + if (item == null || item.isLocked() || item.getCount() < param.getCount()) { + player.sendPacket(new PacketExpUpEquipmentScRsp()); + return; + } + + if (item.getExcel().getEquipmentExp() > 0) { + expGain += item.getExcel().getEquipmentExp() * param.getCount(); + cost += item.getExcel().getEquipmentExpCost() * param.getCount(); + } + } + + // Verify credits + if (player.getScoin() < cost) { + player.sendPacket(new PacketExpUpEquipmentScRsp()); + return; + } + + // Pay items + player.getInventory().removeItems(items); + player.addSCoin(-cost); + + // Level up + int maxLevel = promoteData.getMaxLevel(); + int level = equip.getLevel(); + int exp = equip.getExp(); + int reqExp = GameData.getEquipmentExpRequired(equip.getExcel().getEquipmentExcel().getExpType(), level); + + while (expGain > 0 && reqExp > 0 && level < maxLevel) { + // Do calculations + int toGain = Math.min(expGain, reqExp - exp); + exp += toGain; + expGain -= toGain; + // Level up + if (exp >= reqExp) { + // Exp + exp = 0; + level += 1; + // Set req exp + reqExp = GameData.getEquipmentExpRequired(equip.getExcel().getEquipmentExcel().getExpType(), level); + } + } + + // Done + equip.setLevel(level); + equip.setExp(exp); + + equip.save(); + player.save(); + + // TODO add back leftover exp + List returnItems = new ArrayList<>(); + + // Send packets + player.sendPacket(new PacketPlayerSyncScNotify(equip)); + player.sendPacket(new PacketExpUpEquipmentScRsp(returnItems)); + } + + public void promoteEquipment(Player player, int equipId) { + // Get equipment + GameItem equip = player.getInventory().getItemByUid(equipId); + + if (equip == null || !equip.getExcel().isEquipment() || equip.getPromotion() >= equip.getExcel().getEquipmentExcel().getMaxPromotion()) { + player.sendPacket(new BasePacket(CmdId.PromoteEquipmentScRsp)); + return; + } + + EquipmentPromotionExcel promotion = GameData.getEquipmentPromotionExcel(equip.getItemId(), equip.getPromotion()); + // Sanity check + if ((promotion == null) || equip.getLevel() < promotion.getMaxLevel() || player.getLevel() < promotion.getPlayerLevelRequire() || player.getWorldLevel() < promotion.getWorldLevelRequire()) { + player.sendPacket(new BasePacket(CmdId.PromoteEquipmentScRsp)); + return; + } + + // Verify items + for (ItemParam param : promotion.getPromotionCostList()) { + GameItem item = player.getInventory().getItemByParam(param); + if (item == null || item.getCount() < param.getCount()) { + player.sendPacket(new BasePacket(CmdId.PromoteEquipmentScRsp)); + return; + } + } + + // Verify credits + if (player.getScoin() < promotion.getPromotionCostCoin()) { + player.sendPacket(new BasePacket(CmdId.PromoteEquipmentScRsp)); + return; + } + + // Pay items + player.getInventory().removeItems(promotion.getPromotionCostList()); + player.addSCoin(-promotion.getPromotionCostCoin()); + + // Promote + equip.setPromotion(equip.getPromotion() + 1); + + equip.save(); + player.save(); + + // Send packets + player.sendPacket(new PacketPlayerSyncScNotify(equip)); + player.sendPacket(new BasePacket(CmdId.PromoteEquipmentScRsp)); + } + + public void rankUpEquipment(Player player, int equipId, List items) { + // Get avatar + GameItem equip = player.getInventory().getItemByUid(equipId); + + if (equip == null || !equip.getExcel().isEquipment() || equip.getRank() >= equip.getExcel().getEquipmentExcel().getMaxRank()) { + player.sendPacket(new BasePacket(CmdId.RankUpEquipmentScRsp)); + return; + } + + // Verify items + for (ItemParam param : items) { + GameItem item = player.getInventory().getItemByParam(param); + if (item == null || !equip.getExcel().getEquipmentExcel().isRankUpItem(item) || item.getCount() < param.getCount()) { + player.sendPacket(new BasePacket(CmdId.RankUpEquipmentScRsp)); + return; + } + } + + // Pay items + player.getInventory().removeItems(items); + + // Add rank + equip.setRank(Math.min(equip.getRank() + items.size(), equip.getExcel().getEquipmentExcel().getMaxRank())); + equip.save(); + + // Send packets + player.sendPacket(new PacketPlayerSyncScNotify(equip)); + player.sendPacket(new BasePacket(CmdId.RankUpEquipmentScRsp)); + } + + // === Relic === + + public void levelUpRelic(Player player, int equipId, Collection items) { + // Get relic + GameItem equip = player.getInventory().getItemByUid(equipId); + + if (equip == null || !equip.getExcel().isRelic()) { + player.sendPacket(new PacketExpUpRelicScRsp()); + return; + } + + // Exp gain + int cost = 0; + int expGain = 0; + + // Verify items + for (ItemParam param : items) { + GameItem item = player.getInventory().getItemByParam(param); + if (item == null || item.isLocked() || item.getCount() < param.getCount()) { + player.sendPacket(new PacketExpUpRelicScRsp()); + return; + } + + if (item.getExcel().getRelicExp() > 0) { + expGain += item.getExcel().getRelicExp() * param.getCount(); + cost += item.getExcel().getRelicExpCost() * param.getCount(); + } + + if (item.getTotalExp() > 0) { + expGain += (int) Math.floor(item.getTotalExp() * 0.80D); + } + } + + // Verify credits + if (player.getScoin() < cost) { + player.sendPacket(new PacketExpUpRelicScRsp()); + return; + } + + // Pay items + player.getInventory().removeItems(items); + player.addSCoin(-cost); + + // Level up + int maxLevel = equip.getExcel().getRelicExcel().getMaxLevel(); + int level = equip.getLevel(); + int exp = equip.getExp(); + int upgrades = 0; + int reqExp = GameData.getRelicExpRequired(equip.getExcel().getRelicExcel().getExpType(), level); + + while (expGain > 0 && reqExp > 0 && level < maxLevel) { + // Do calculations + int toGain = Math.min(expGain, reqExp - exp); + exp += toGain; + expGain -= toGain; + // Level up + if (exp >= reqExp) { + // Exp + exp = 0; + level += 1; + // Check upgrades + if (level % 3 == 0) { + upgrades++; + } + // Set req exp + reqExp = GameData.getRelicExpRequired(equip.getExcel().getRelicExcel().getExpType(), level); + } + } + + // Add affixes + if (upgrades > 0) { + equip.addSubAffixes(upgrades); + } + + // Done + equip.setLevel(level); + equip.setExp(exp); + + equip.save(); + player.save(); + + // TODO add back leftover exp + List returnItems = new ArrayList<>(); + + // Send packets + player.sendPacket(new PacketPlayerSyncScNotify(equip)); + player.sendPacket(new PacketExpUpRelicScRsp(returnItems)); + } + + // === Etc === + + public void lockEquip(Player player, int equipId, boolean locked) { + GameItem equip = player.getInventory().getItemByUid(equipId); + + if (equip == null || !equip.getExcel().isEquippable()) { + return; + } + + equip.setLocked(locked); + equip.save(); + + // Send packet + player.sendPacket(new PacketPlayerSyncScNotify(equip)); + } + + public void sellItems(Player player, List items) { + // Verify items + var returnItems = new Int2IntOpenHashMap(); + + for (ItemParam param : items) { + GameItem item = player.getInventory().getItemByParam(param); + if (item == null || item.isLocked() || item.getCount() < param.getCount()) { + player.sendPacket(new PacketSellItemScRsp(null)); + return; + } + + // Add return items + for (ItemParam ret : item.getExcel().getReturnItemIDList()) { + // Add to return items + returnItems.put(ret.getId(), returnItems.getOrDefault(ret.getId(), 0) + ret.getCount()); + } + } + + // Delete items + player.getInventory().removeItems(items); + + // Add return items + for (var returnItem : returnItems.int2IntEntrySet()) { + player.getInventory().addItem(returnItem.getIntKey(), returnItem.getIntValue()); + } + + // Send packet + player.sendPacket(new PacketSellItemScRsp(returnItems)); + } +} diff --git a/src/main/java/emu/lunarcore/server/game/BaseGameService.java b/src/main/java/emu/lunarcore/server/game/BaseGameService.java new file mode 100644 index 0000000..7c83488 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/game/BaseGameService.java @@ -0,0 +1,13 @@ +package emu.lunarcore.server.game; + +public abstract class BaseGameService { + private final GameServer server; + + public BaseGameService(GameServer server) { + this.server = server; + } + + public GameServer getServer() { + return server; + } +} diff --git a/src/main/java/emu/lunarcore/server/game/GameServer.java b/src/main/java/emu/lunarcore/server/game/GameServer.java new file mode 100644 index 0000000..f5f9ea7 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/game/GameServer.java @@ -0,0 +1,98 @@ +package emu.lunarcore.server.game; + +import java.net.InetSocketAddress; + +import emu.lunarcore.Config.GameServerConfig; +import emu.lunarcore.LunarRail; +import emu.lunarcore.game.battle.BattleService; +import emu.lunarcore.game.gacha.GachaService; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.game.service.ChatService; +import emu.lunarcore.game.service.InventoryService; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import kcp.highway.ChannelConfig; +import kcp.highway.KcpServer; +import lombok.Getter; + +public class GameServer extends KcpServer { + private final GameServerConfig serverConfig; + private final RegionInfo info; + private final InetSocketAddress address; + + private final GameServerPacketHandler packetHandler; + private final Int2ObjectMap players; + + // Managers + @Getter private final BattleService battleService; + @Getter private final InventoryService inventoryService; + @Getter private final GachaService gachaService; + @Getter private final ChatService chatService; + + public GameServer(GameServerConfig serverConfig) { + // Game Server base + this.serverConfig = serverConfig; + this.info = new RegionInfo(this); + this.address = new InetSocketAddress(serverConfig.bindAddress, serverConfig.getPort()); + this.packetHandler = new GameServerPacketHandler(); + + this.players = Int2ObjectMaps.synchronize(new Int2ObjectOpenHashMap<>()); + + // Setup managers + this.battleService = new BattleService(this); + this.inventoryService = new InventoryService(this); + this.gachaService = new GachaService(this); + this.chatService = new ChatService(this); + + // Hook into shutdown event. + Runtime.getRuntime().addShutdownHook(new Thread(this::onShutdown)); + } + + public GameServerConfig getServerConfig() { + return this.serverConfig; + } + + public GameServerPacketHandler getPacketHandler() { + return this.packetHandler; + } + + public void registerPlayer(Player player) { + players.put(player.getUid(), player); + } + + public void deregisterPlayer(int uid) { + players.remove(uid); + } + + public Player getPlayerByUid(int uid) { + return players.get(uid); + } + + public void start() { + // Setup config and init server + ChannelConfig channelConfig = new ChannelConfig(); + channelConfig.nodelay(true, 50, 2, true); + channelConfig.setMtu(1400); + channelConfig.setSndwnd(256); + channelConfig.setRcvwnd(256); + channelConfig.setTimeoutMillis(30 * 1000);//30s + channelConfig.setUseConvChannel(true); + channelConfig.setAckNoDelay(true); + + this.init(new GameServerKcpListener(this), channelConfig, address); + + // Setup region info + this.info.setUp(true); + this.info.save(); + + // Done + LunarRail.getLogger().info("Game Server started on " + address.getPort()); + } + + private void onShutdown() { + // Set region info + this.info.setUp(false); + this.info.save(); + } +} diff --git a/src/main/java/emu/lunarcore/server/game/GameServerKcpListener.java b/src/main/java/emu/lunarcore/server/game/GameServerKcpListener.java new file mode 100644 index 0000000..8863d47 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/game/GameServerKcpListener.java @@ -0,0 +1,52 @@ +package emu.lunarcore.server.game; + +import io.netty.buffer.ByteBuf; +import it.unimi.dsi.fastutil.objects.Object2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectMaps; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import kcp.highway.KcpListener; +import kcp.highway.Ukcp; + +public class GameServerKcpListener implements KcpListener { + private final GameServer server; + private final Object2ObjectMap sessions; + + public GameServerKcpListener(GameServer server) { + this.server = server; + this.sessions = Object2ObjectMaps.synchronize(new Object2ObjectOpenHashMap<>()); + } + + public GameServer getServer() { + return this.server; + } + + @Override + public void onConnected(Ukcp ukcp) { + GameSession session = new GameSession(server, ukcp); + sessions.put(ukcp, session); + session.onConnect(); + } + + @Override + public void handleClose(Ukcp ukcp) { + GameSession session = sessions.remove(ukcp); + + if (session != null) { + session.onDisconnect(); + } + } + + @Override + public void handleReceive(ByteBuf packet, Ukcp ukcp) { + GameSession session = sessions.get(ukcp); + + if (session != null) { + session.onMessage(packet); + } + } + + @Override + public void handleException(Throwable err, Ukcp ukcp) { + // TODO + } +} diff --git a/src/main/java/emu/lunarcore/server/game/GameServerPacketHandler.java b/src/main/java/emu/lunarcore/server/game/GameServerPacketHandler.java new file mode 100644 index 0000000..7712bc8 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/game/GameServerPacketHandler.java @@ -0,0 +1,97 @@ +package emu.lunarcore.server.game; + +import java.util.Set; + +import org.reflections.Reflections; + +import emu.lunarcore.LunarRail; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.SessionState; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; + +@SuppressWarnings("unchecked") +public class GameServerPacketHandler { + private final Int2ObjectMap handlers; + + public GameServerPacketHandler() { + this.handlers = new Int2ObjectOpenHashMap<>(); + + this.registerHandlers(); + } + + public void registerPacketHandler(Class handlerClass) { + try { + Opcodes opcode = handlerClass.getAnnotation(Opcodes.class); + + if (opcode == null || opcode.disabled() || opcode.value() <= 0) { + return; + } + + PacketHandler packetHandler = handlerClass.getDeclaredConstructor().newInstance(); + + this.handlers.put(opcode.value(), packetHandler); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void registerHandlers() { + Reflections reflections = new Reflections(LunarRail.class.getPackageName()); + Set handlerClasses = reflections.getSubTypesOf(PacketHandler.class); + + for (Object obj : handlerClasses) { + this.registerPacketHandler((Class) obj); + } + + // Debug + LunarRail.getLogger().info("Game Server registered " + this.handlers.size() + " packet handlers"); + } + + public void handle(GameSession session, int opcode, byte[] header, byte[] data) { + PacketHandler handler = this.handlers.get(opcode); + + if (handler != null) { + try { + // Make sure session is ready for packets + SessionState state = session.getState(); + + if (opcode == CmdId.PlayerHeartBeatCsReq) { + // Always continue if packet is ping request + } else if (opcode == CmdId.PlayerGetTokenCsReq) { + if (state != SessionState.WAITING_FOR_TOKEN) { + return; + } + } else if (opcode == CmdId.PlayerLoginCsReq) { + if (state != SessionState.WAITING_FOR_LOGIN) { + return; + } + } + /* + else if (opcode == PacketOpcodes.SetPlayerBornDataReq) { + if (state != SessionState.PICKING_CHARACTER) { + return; + } + } + */ + else { + if (state != SessionState.ACTIVE) { + return; + } + } + + // Handle packet + handler.handle(session, header, data); + } catch (Exception ex) { + // TODO Remove this when no more needed + ex.printStackTrace(); + } + return; // Packet successfully handled + } + + // Log unhandled packets + //LunarRail.getLogger().info("Unhandled packet (" + opcode + "): " + CmdIdUtils.getOpcodeName(opcode)); + } +} diff --git a/src/main/java/emu/lunarcore/server/game/GameSession.java b/src/main/java/emu/lunarcore/server/game/GameSession.java new file mode 100644 index 0000000..e140464 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/game/GameSession.java @@ -0,0 +1,170 @@ +package emu.lunarcore.server.game; + +import java.net.InetSocketAddress; + +import emu.lunarcore.LunarRail; +import emu.lunarcore.game.account.Account; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdIdUtils; +import emu.lunarcore.server.packet.SessionState; +import emu.lunarcore.util.Utils; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import kcp.highway.Ukcp; +import lombok.Getter; + +public class GameSession { + @Getter private final GameServer server; + @Getter private InetSocketAddress address; + + @Getter private Account account; + @Getter private Player player; + + // Network + private Ukcp ukcp; + + // Flags + @Getter private SessionState state = SessionState.WAITING_FOR_TOKEN; + private boolean useSecretKey; + + private GameSession(GameServer server) { + this.server = server; + } + + public GameSession(GameServer server, Ukcp ukcp) { + this(server); + this.ukcp = ukcp; + this.address = this.ukcp.user().getRemoteAddress(); + } + + public int getUid() { + return this.player.getUid(); + } + + public boolean useSecretKey() { + return useSecretKey; + } + + public void setAccount(Account account) { + this.account = account; + } + + public void setPlayer(Player player) { + this.player = player; + this.player.setSession(this); + this.getServer().registerPlayer(player); + } + + public void setUseSecretKey(boolean key) { + this.useSecretKey = key; + } + + public void setState(SessionState state) { + this.state = state; + } + + public void onConnect() { + LunarRail.getLogger().info("Client connected from " + address.getHostString()); + } + + public void onDisconnect() { + LunarRail.getLogger().info("Client disconnected from " + address.getHostString()); + + this.state = SessionState.INACTIVE; + + if (player != null) { + // Save first + player.save(); + // Deregister + this.getServer().deregisterPlayer(player.getUid()); + } + } + + public void onMessage(ByteBuf packet) { + try { + // Decrypt and turn back into a packet + // Crypto.xor(packet.array(), useSecretKey() ? Crypto.ENCRYPT_KEY : Crypto.DISPATCH_KEY); + + // Decode + while (packet.readableBytes() > 0) { + // Length + if (packet.readableBytes() < 16) { + return; + } + + // Packet header sanity check + int constHeader = packet.readInt(); + if (constHeader != BasePacket.HEADER_CONST) { + return; // Bad packet + } + + // Data + int opcode = packet.readShort(); + int headerLength = packet.readShort(); + int dataLength = packet.readInt(); + byte[] header = new byte[headerLength]; + byte[] data = new byte[dataLength]; + + packet.readBytes(header); + packet.readBytes(data); + + // Packet tail sanity check + int constTail = packet.readInt(); + if (constTail != BasePacket.TAIL_CONST) { + return; // Bad packet + } + + // Log packet + logPacket("RECV", opcode, data); + + // Handle + getServer().getPacketHandler().handle(this, opcode, header, data); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + // packet.release(); + } + } + + public void send(BasePacket packet) { + // Test + if (packet.getOpcode() <= 0) { + LunarRail.getLogger().warn("Tried to send packet with missing cmd id!"); + return; + } + + // Send + this.send(packet.build()); + + // Log + logPacket("SEND", packet.getOpcode(), packet.getData()); + } + + /** + * Sends a empty packet with the specified cmd id. + * @param cmdId + */ + public void send(int cmdId) { + // TODO optimize to send bytes with cmdId instead of creating a new base packet object + this.send(new BasePacket(cmdId)); + } + + private void send(byte[] bytes) { + if (this.ukcp != null) { + ByteBuf buf = Unpooled.wrappedBuffer(bytes); + this.ukcp.write(buf); + buf.release(); + } + } + + public void logPacket(String sendOrRecv, int opcode, byte[] payload) { + LunarRail.getLogger().info(sendOrRecv + ": " + CmdIdUtils.getOpcodeName(opcode) + " (" + opcode + ")"); + System.out.println(Utils.bytesToHex(payload)); + } + + public void close() { + this.ukcp.close(); + } +} diff --git a/src/main/java/emu/lunarcore/server/game/RegionInfo.java b/src/main/java/emu/lunarcore/server/game/RegionInfo.java new file mode 100644 index 0000000..5e7c9a8 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/game/RegionInfo.java @@ -0,0 +1,38 @@ +package emu.lunarcore.server.game; + +import dev.morphia.annotations.Entity; +import dev.morphia.annotations.Id; +import emu.lunarcore.LunarRail; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Entity(value = "regions", useDiscriminator = false) +public class RegionInfo { + @Id private String id; + private String name; + private String desc; + + private String gateAddress; + private String gameAddress; + + @Setter private boolean up; + + @Deprecated + public RegionInfo() { + // Morphia only + } + + public RegionInfo(GameServer server) { + this.id = server.getServerConfig().getId(); + this.name = server.getServerConfig().getName(); + this.desc = server.getServerConfig().getDescription(); + this.gateAddress = LunarRail.getHttpServer().getServerConfig().getDisplayAddress(); + this.gameAddress = server.getServerConfig().getDisplayAddress(); + this.up = true; + } + + public void save() { + LunarRail.getAccountDatabase().save(this); + } +} diff --git a/src/main/java/emu/lunarcore/server/http/HttpServer.java b/src/main/java/emu/lunarcore/server/http/HttpServer.java new file mode 100644 index 0000000..ba28e40 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/http/HttpServer.java @@ -0,0 +1,153 @@ +package emu.lunarcore.server.http; + +import org.eclipse.jetty.server.HttpConfiguration; +import org.eclipse.jetty.server.HttpConnectionFactory; +import org.eclipse.jetty.server.SecureRequestCustomizer; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.util.ssl.SslContextFactory; + +import emu.lunarcore.Config.ServerConfig; +import emu.lunarcore.LunarRail; +import emu.lunarcore.LunarRail.ServerType; +import emu.lunarcore.server.http.handlers.*; +import io.javalin.Javalin; +import io.javalin.http.ContentType; +import io.javalin.http.Context; + +public class HttpServer { + private final Javalin app; + private final ServerType type; + private boolean started; + + public HttpServer(ServerType type) { + this.type = type; + this.app = Javalin.create(); + + this.addRoutes(); + } + + public Javalin getApp() { + return this.app; + } + + public ServerType getType() { + return type; + } + + public ServerConfig getServerConfig() { + return LunarRail.getConfig().getHttpServer(); + } + + private HttpConnectionFactory getHttpFactory() { + HttpConfiguration httpsConfig = new HttpConfiguration(); + SecureRequestCustomizer src = new SecureRequestCustomizer(); + src.setSniHostCheck(false); + httpsConfig.addCustomizer(src); + return new HttpConnectionFactory(httpsConfig); + } + + private SslContextFactory.Server getSSLContextFactory() { + SslContextFactory.Server sslContextFactory = new SslContextFactory.Server(); + sslContextFactory.setKeyStorePath(LunarRail.getConfig().getKeystore().getPath()); + sslContextFactory.setKeyStorePassword(LunarRail.getConfig().getKeystore().getPassword()); + sslContextFactory.setSniRequired(false); + sslContextFactory.setRenegotiationAllowed(false); + return sslContextFactory; + } + + public void start() { + if (this.started) return; + this.started = true; + + // Http server + if (getServerConfig().isUseSSL()) { + ServerConnector sslConnector = new ServerConnector(getApp().jettyServer().server(), getSSLContextFactory(), getHttpFactory()); + sslConnector.setHost(getServerConfig().getBindAddress()); + sslConnector.setPort(getServerConfig().getPort()); + getApp().jettyServer().server().addConnector(sslConnector); + + getApp().start(); + } else { + getApp().start(getServerConfig().getBindAddress(), getServerConfig().getPort()); + } + + // Done + LunarRail.getLogger().info("Http Server started on " + getServerConfig().getPort()); + } + + private void addRoutes() { + // Add routes based on what type of server this is + if (this.getType().runDispatch()) { + this.addDispatchRoutes(); + this.addLogServerRoutes(); + } + if (this.getType().runGame()) { + this.addGateServerRoutes(); + } + + // Fallback handler + getApp().error(404, this::notFoundHandler); + } + + private void addDispatchRoutes() { + // Get region info + getApp().get("/query_dispatch", new QueryDispatchHandler()); + + // Captcha -> api-account-os.hoyoverse.com + getApp().post("/account/risky/api/check", new HttpJsonResponse("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"id\":\"none\",\"action\":\"ACTION_NONE\",\"geetest\":null}}")); + + // === AUTHENTICATION === hkrpg-sdk-os-static.hoyoverse.com + + // Username & Password login (from client). Returns a session key to the client. + getApp().post("/hkrpg_global/mdk/shield/api/login", new UsernameLoginHandler()); + // Cached session key verify (from registry). Returns a session key to the client. + getApp().post("/hkrpg_global/mdk/shield/api/verify", new TokenLoginHandler()); + + // Exchange session key for login token (combo token) + getApp().post("/hkrpg_global/combo/granter/login/v2/login", new ComboTokenGranterHandler()); + + // Config + getApp().get("/hkrpg_global/combo/granter/api/getConfig", new HttpJsonResponse("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"protocol\":true,\"qr_enabled\":false,\"log_level\":\"INFO\",\"announce_url\":\"\",\"push_alias_type\":0,\"disable_ysdk_guard\":true,\"enable_announce_pic_popup\":false,\"app_name\":\"崩�??RPG\",\"qr_enabled_apps\":{\"bbs\":false,\"cloud\":false},\"qr_app_icons\":{\"app\":\"\",\"bbs\":\"\",\"cloud\":\"\"},\"qr_cloud_display_name\":\"\",\"enable_user_center\":true,\"functional_switch_configs\":{}}}")); + getApp().get("/hkrpg_global/mdk/shield/api/loadConfig", new HttpJsonResponse("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"id\":24,\"game_key\":\"hkrpg_global\",\"client\":\"PC\",\"identity\":\"I_IDENTITY\",\"guest\":false,\"ignore_versions\":\"\",\"scene\":\"S_NORMAL\",\"name\":\"崩�??RPG\",\"disable_regist\":false,\"enable_email_captcha\":false,\"thirdparty\":[\"fb\",\"tw\",\"gl\",\"ap\"],\"disable_mmt\":false,\"server_guest\":false,\"thirdparty_ignore\":{},\"enable_ps_bind_account\":false,\"thirdparty_login_configs\":{\"tw\":{\"token_type\":\"TK_GAME_TOKEN\",\"game_token_expires_in\":2592000},\"ap\":{\"token_type\":\"TK_GAME_TOKEN\",\"game_token_expires_in\":604800},\"fb\":{\"token_type\":\"TK_GAME_TOKEN\",\"game_token_expires_in\":2592000},\"gl\":{\"token_type\":\"TK_GAME_TOKEN\",\"game_token_expires_in\":604800}},\"initialize_firebase\":false,\"bbs_auth_login\":false,\"bbs_auth_login_ignore\":[],\"fetch_instance_id\":false,\"enable_flash_login\":false}}")); + + // === EXTRA === + + // hkrpg-sdk-os.hoyoverse.com + getApp().post("/hkrpg_global/combo/granter/api/compareProtocolVersion", new HttpJsonResponse("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"modified\":false,\"protocol\":null}}")); + getApp().get("/hkrpg_global/mdk/agreement/api/getAgreementInfos", new HttpJsonResponse("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"marketing_agreements\":[]}}")); + + // sdk-os-static.hoyoverse.com + getApp().get("/combo/box/api/config/sdk/combo", new HttpJsonResponse("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"vals\":{\"kibana_pc_config\":\"{ \\\"enable\\\": 0, \\\"level\\\": \\\"Info\\\",\\\"modules\\\": [\\\"download\\\"] }\\n\",\"network_report_config\":\"{ \\\"enable\\\": 0, \\\"status_codes\\\": [206], \\\"url_paths\\\": [\\\"dataUpload\\\", \\\"red_dot\\\"] }\\n\",\"list_price_tierv2_enable\":\"false\\n\",\"pay_payco_centered_host\":\"bill.payco.com\",\"telemetry_config\":\"{\\n \\\"dataupload_enable\\\": 0,\\n}\",\"enable_web_dpi\":\"true\"}}}")); + getApp().get("/combo/box/api/config/sw/precache", new HttpJsonResponse("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"vals\":{\"url\":\"\",\"enable\":\"false\"}}}")); + + // sg-public-data-api.hoyoverse.com + getApp().get("/device-fp/api/getFp", new FingerprintHandler()); + getApp().get("/device-fp/api/getExtList", new HttpJsonResponse("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"code\":200,\"msg\":\"ok\",\"ext_list\":[],\"pkg_list\":[],\"pkg_str\":\"/vK5WTh5SS3SAj8Zm0qPWg==\"}}")); + + // abtest-api-data-sg.hoyoverse.com + getApp().post("/data_abtest_api/config/experiment/list", new HttpJsonResponse("{\"retcode\":0,\"success\":true,\"message\":\"\",\"data\":[{\"code\":1000,\"type\":2,\"config_id\":\"14\",\"period_id\":\"6125_197\",\"version\":\"1\",\"configs\":{\"cardType\":\"direct\"}}]}")); + } + + private void addLogServerRoutes() { + // hkrpg-log-upload-os.hoyoverse.com + getApp().post("/sdk/dataUpload", new HttpJsonResponse("{\"code\":0}")); + + // log-upload-os.hoyoverse.com + getApp().post("/crashdump/dataUpload", new HttpJsonResponse("{\"code\":0}")); + getApp().post("/apm/dataUpload", new HttpJsonResponse("{\"code\":0}")); + + // minor-api-os.hoyoverse.com + getApp().post("/common/h5log/log/batch", new HttpJsonResponse("{\"retcode\":0,\"message\":\"success\",\"data\":null}")); + } + + private void addGateServerRoutes() { + // Gateway info + getApp().get("/query_gateway", new QueryGatewayHandler()); + } + + private void notFoundHandler(Context ctx) { + ctx.status(404); + ctx.contentType(ContentType.TEXT_PLAIN); + ctx.result("not found"); + } +} diff --git a/src/main/java/emu/lunarcore/server/http/handlers/ComboTokenGranterHandler.java b/src/main/java/emu/lunarcore/server/http/handlers/ComboTokenGranterHandler.java new file mode 100644 index 0000000..8b99204 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/http/handlers/ComboTokenGranterHandler.java @@ -0,0 +1,63 @@ +package emu.lunarcore.server.http.handlers; + +import org.jetbrains.annotations.NotNull; + +import emu.lunarcore.LunarRail; +import emu.lunarcore.game.account.Account; +import emu.lunarcore.server.http.objects.ComboTokenReqJson; +import emu.lunarcore.server.http.objects.ComboTokenReqJson.LoginTokenData; +import emu.lunarcore.server.http.objects.ComboTokenResJson; +import emu.lunarcore.server.http.objects.ComboTokenResJson.LoginData; +import emu.lunarcore.util.JsonUtils; +import io.javalin.http.ContentType; +import io.javalin.http.Context; +import io.javalin.http.Handler; + +public class ComboTokenGranterHandler implements Handler { + + public ComboTokenGranterHandler() { + // TODO Auto-generated constructor stub + } + + @Override + public void handle(@NotNull Context ctx) throws Exception { + // Setup response + ComboTokenResJson res = new ComboTokenResJson(); + + // Parse request + ComboTokenReqJson req = JsonUtils.decode(ctx.body(), ComboTokenReqJson.class); + + // Validate + if (req == null || req.data == null) { + res.retcode = -202; + res.message = "Error logging in"; + return; + } + + // Get login data + LoginTokenData data = JsonUtils.decode(req.data, LoginTokenData.class); + + // Validate 2 + if (data == null) { + res.retcode = -202; + res.message = "Invalid login data"; + return; + } + + // Login + Account account = LunarRail.getAccountDatabase().getObjectByField(Account.class, "_id", data.uid); + + if (account == null || !account.getDispatchToken().equals(data.token)) { + res.retcode = -201; + res.message = "Game account cache information error"; + } else { + res.message = "OK"; + res.data = new LoginData(account.getUid(), account.generateComboToken()); + } + + // Result + ctx.contentType(ContentType.APPLICATION_JSON); + ctx.result(JsonUtils.encode(res)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/http/handlers/FingerprintHandler.java b/src/main/java/emu/lunarcore/server/http/handlers/FingerprintHandler.java new file mode 100644 index 0000000..78fcbfb --- /dev/null +++ b/src/main/java/emu/lunarcore/server/http/handlers/FingerprintHandler.java @@ -0,0 +1,34 @@ +package emu.lunarcore.server.http.handlers; + +import org.jetbrains.annotations.NotNull; + +import emu.lunarcore.server.http.objects.FingerprintReqJson; +import emu.lunarcore.server.http.objects.FingerprintResJson; +import emu.lunarcore.server.http.objects.FingerprintResJson.FingerprintDataJson; +import emu.lunarcore.util.JsonUtils; +import io.javalin.http.ContentType; +import io.javalin.http.Context; +import io.javalin.http.Handler; + +public class FingerprintHandler implements Handler { + + @Override + public void handle(@NotNull Context ctx) throws Exception { + FingerprintResJson res = new FingerprintResJson(); + + FingerprintReqJson req = JsonUtils.decode(ctx.body(), FingerprintReqJson.class); + + if (req == null) { + res.retcode = -202; + res.message = "Error"; + } + + res.message = "OK"; + res.data = new FingerprintDataJson(req.device_fp); + + // Result + ctx.contentType(ContentType.APPLICATION_JSON); + ctx.result(JsonUtils.encode(res)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/http/handlers/HttpJsonResponse.java b/src/main/java/emu/lunarcore/server/http/handlers/HttpJsonResponse.java new file mode 100644 index 0000000..ba2bf97 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/http/handlers/HttpJsonResponse.java @@ -0,0 +1,22 @@ +package emu.lunarcore.server.http.handlers; + +import org.jetbrains.annotations.NotNull; + +import io.javalin.http.ContentType; +import io.javalin.http.Context; +import io.javalin.http.Handler; + +public class HttpJsonResponse implements Handler { + private final String json; + + public HttpJsonResponse(String jsonString) { + this.json = jsonString; + } + + @Override + public void handle(@NotNull Context ctx) throws Exception { + ctx.status(200); + ctx.contentType(ContentType.APPLICATION_JSON); + ctx.result(json); + } +} diff --git a/src/main/java/emu/lunarcore/server/http/handlers/QueryDispatchHandler.java b/src/main/java/emu/lunarcore/server/http/handlers/QueryDispatchHandler.java new file mode 100644 index 0000000..27b3772 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/http/handlers/QueryDispatchHandler.java @@ -0,0 +1,38 @@ +package emu.lunarcore.server.http.handlers; + +import org.jetbrains.annotations.NotNull; + +import emu.lunarcore.LunarRail; +import emu.lunarcore.proto.DispatchRegionDataOuterClass.DispatchRegionData; +import emu.lunarcore.proto.RegionEntryOuterClass.RegionEntry; +import emu.lunarcore.util.Utils; +import io.javalin.http.Context; +import io.javalin.http.Handler; + +public class QueryDispatchHandler implements Handler { + + public QueryDispatchHandler() { + + } + + @Override + public void handle(@NotNull Context ctx) throws Exception { + // Get regions TODO get regions from database + RegionEntry region = RegionEntry.newInstance() + .setName(LunarRail.getConfig().getGameServer().getId()) + .setDispatchUrl(LunarRail.getConfig().getHttpServer().getDisplayAddress() + "/query_gateway") + .setEnvType("2") + .setDisplayName(LunarRail.getConfig().getGameServer().getName()); + + // Build region list + DispatchRegionData regions = DispatchRegionData.newInstance(); + regions.addRegionList(region); + + // Log + LunarRail.getLogger().info("Client request: query_dispatch"); + + // Encode to base64 and send to client + ctx.result(Utils.base64Encode(regions.toByteArray())); + } + +} diff --git a/src/main/java/emu/lunarcore/server/http/handlers/QueryGatewayHandler.java b/src/main/java/emu/lunarcore/server/http/handlers/QueryGatewayHandler.java new file mode 100644 index 0000000..906e6d5 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/http/handlers/QueryGatewayHandler.java @@ -0,0 +1,53 @@ +package emu.lunarcore.server.http.handlers; + +import org.jetbrains.annotations.NotNull; + +import emu.lunarcore.GameConstants; +import emu.lunarcore.LunarRail; +import emu.lunarcore.proto.GateserverOuterClass.Gateserver; +import emu.lunarcore.util.Utils; +import io.javalin.http.Context; +import io.javalin.http.Handler; + +public class QueryGatewayHandler implements Handler { + + public QueryGatewayHandler() { + + } + + @Override + public void handle(@NotNull Context ctx) throws Exception { + // Build gateserver proto + Gateserver gateserver = Gateserver.newInstance() + .setRegionName(LunarRail.getConfig().getGameServer().getId()) + .setIp(LunarRail.getConfig().getGameServer().getPublicAddress()) + .setPort(LunarRail.getConfig().getGameServer().getPort()) + .setUnk1(true) + .setUnk2(true) + .setUnk3(true) + .setMdkResVersion(GameConstants.MDK_VERSION); + + // Set streaming data urls + var data = LunarRail.getConfig().getDownloadData(); + + if (data.assetBundleUrl != null) { + gateserver.setAssetBundleUrl(data.assetBundleUrl); + } + if (data.exResourceUrl != null) { + gateserver.setAssetBundleUrl(data.exResourceUrl); + } + if (data.luaUrl != null) { + gateserver.setAssetBundleUrl(data.luaUrl); + } + if (data.ifixUrl != null) { + gateserver.setAssetBundleUrl(data.ifixUrl); + } + + // Log + LunarRail.getLogger().info("Client request: query_gateway"); + + // Encode to base64 and send to client + ctx.result(Utils.base64Encode(gateserver.toByteArray())); + } + +} diff --git a/src/main/java/emu/lunarcore/server/http/handlers/TokenLoginHandler.java b/src/main/java/emu/lunarcore/server/http/handlers/TokenLoginHandler.java new file mode 100644 index 0000000..e429734 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/http/handlers/TokenLoginHandler.java @@ -0,0 +1,52 @@ +package emu.lunarcore.server.http.handlers; + +import org.jetbrains.annotations.NotNull; + +import emu.lunarcore.LunarRail; +import emu.lunarcore.game.account.Account; +import emu.lunarcore.server.http.objects.LoginResJson; +import emu.lunarcore.server.http.objects.LoginResJson.VerifyData; +import emu.lunarcore.server.http.objects.LoginTokenReqJson; +import emu.lunarcore.util.JsonUtils; +import io.javalin.http.ContentType; +import io.javalin.http.Context; +import io.javalin.http.Handler; + +public class TokenLoginHandler implements Handler { + + public TokenLoginHandler() { + + } + + @Override + public void handle(@NotNull Context ctx) throws Exception { + // Setup response + LoginResJson res = new LoginResJson(); + + // Parse request + LoginTokenReqJson req = JsonUtils.decode(ctx.body(), LoginTokenReqJson.class); + + // Validate + if (req == null) { + res.retcode = -202; + res.message = "Error logging in"; + return; + } + + // Login + Account account = LunarRail.getAccountDatabase().getObjectByField(Account.class, "_id", req.uid); + + if (account == null || !account.getDispatchToken().equals(req.token)) { + res.retcode = -201; + res.message = "Game account cache information error"; + } else { + res.message = "OK"; + res.data = new VerifyData(account.getUid(), account.getEmail(), req.token); + } + + // Result + ctx.contentType(ContentType.APPLICATION_JSON); + ctx.result(JsonUtils.encode(res)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/http/handlers/UsernameLoginHandler.java b/src/main/java/emu/lunarcore/server/http/handlers/UsernameLoginHandler.java new file mode 100644 index 0000000..48535b7 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/http/handlers/UsernameLoginHandler.java @@ -0,0 +1,52 @@ +package emu.lunarcore.server.http.handlers; + +import org.jetbrains.annotations.NotNull; + +import emu.lunarcore.LunarRail; +import emu.lunarcore.game.account.Account; +import emu.lunarcore.server.http.objects.LoginAccountReqJson; +import emu.lunarcore.server.http.objects.LoginResJson; +import emu.lunarcore.server.http.objects.LoginResJson.VerifyData; +import emu.lunarcore.util.JsonUtils; +import io.javalin.http.ContentType; +import io.javalin.http.Context; +import io.javalin.http.Handler; + +public class UsernameLoginHandler implements Handler { + + public UsernameLoginHandler() { + + } + + @Override + public void handle(@NotNull Context ctx) throws Exception { + // Setup response + LoginResJson res = new LoginResJson(); + + // Parse request + LoginAccountReqJson req = JsonUtils.decode(ctx.body(), LoginAccountReqJson.class); + + // Validate + if (req == null) { + res.retcode = -202; + res.message = "Error logging in"; + return; + } + + // Login + Account account = LunarRail.getAccountDatabase().getObjectByField(Account.class, "username", req.account); + + if (account == null) { + res.retcode = -201; + res.message = "Username not found."; + } else { + res.message = "OK"; + res.data = new VerifyData(account.getUid(), account.getEmail(), account.generateDispatchToken()); + } + + // Send result + ctx.contentType(ContentType.APPLICATION_JSON); + ctx.result(JsonUtils.encode(res)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/http/objects/ComboTokenReqJson.java b/src/main/java/emu/lunarcore/server/http/objects/ComboTokenReqJson.java new file mode 100644 index 0000000..9265a3b --- /dev/null +++ b/src/main/java/emu/lunarcore/server/http/objects/ComboTokenReqJson.java @@ -0,0 +1,15 @@ +package emu.lunarcore.server.http.objects; + +public class ComboTokenReqJson { + public int app_id; + public int channel_id; + public String data; + public String device; + public String sign; + + public static class LoginTokenData { + public String uid; + public String token; + public boolean guest; + } +} diff --git a/src/main/java/emu/lunarcore/server/http/objects/ComboTokenResJson.java b/src/main/java/emu/lunarcore/server/http/objects/ComboTokenResJson.java new file mode 100644 index 0000000..29694ee --- /dev/null +++ b/src/main/java/emu/lunarcore/server/http/objects/ComboTokenResJson.java @@ -0,0 +1,22 @@ +package emu.lunarcore.server.http.objects; + +public class ComboTokenResJson { + public String message; + public int retcode; + public LoginData data = null; + + public static class LoginData { + public int account_type = 1; + public boolean heartbeat; + public String combo_id; + public String combo_token; + public String open_id; + public String data = "{\"guest\":false}"; + public String fatigue_remind = null; // ? + + public LoginData(String openId, String comboToken) { + this.open_id = openId; + this.combo_token = comboToken; + } + } +} diff --git a/src/main/java/emu/lunarcore/server/http/objects/FingerprintReqJson.java b/src/main/java/emu/lunarcore/server/http/objects/FingerprintReqJson.java new file mode 100644 index 0000000..95d7338 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/http/objects/FingerprintReqJson.java @@ -0,0 +1,5 @@ +package emu.lunarcore.server.http.objects; + +public class FingerprintReqJson { + public String device_fp; +} diff --git a/src/main/java/emu/lunarcore/server/http/objects/FingerprintResJson.java b/src/main/java/emu/lunarcore/server/http/objects/FingerprintResJson.java new file mode 100644 index 0000000..5b99847 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/http/objects/FingerprintResJson.java @@ -0,0 +1,19 @@ +package emu.lunarcore.server.http.objects; + +public class FingerprintResJson { + public String message; + public int retcode; + public FingerprintDataJson data; + + public static class FingerprintDataJson { + public String device_fp; + public String message; + public int code; + + public FingerprintDataJson(String fp) { + this.code = 200; + this.message = "OK"; + this.device_fp = fp; + } + } +} diff --git a/src/main/java/emu/lunarcore/server/http/objects/LoginAccountReqJson.java b/src/main/java/emu/lunarcore/server/http/objects/LoginAccountReqJson.java new file mode 100644 index 0000000..ebdb860 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/http/objects/LoginAccountReqJson.java @@ -0,0 +1,7 @@ +package emu.lunarcore.server.http.objects; + +public class LoginAccountReqJson { + public String account; + public String password; + public boolean is_crypto; +} diff --git a/src/main/java/emu/lunarcore/server/http/objects/LoginResJson.java b/src/main/java/emu/lunarcore/server/http/objects/LoginResJson.java new file mode 100644 index 0000000..e0223ea --- /dev/null +++ b/src/main/java/emu/lunarcore/server/http/objects/LoginResJson.java @@ -0,0 +1,44 @@ +package emu.lunarcore.server.http.objects; + +public class LoginResJson { + public String message; + public int retcode; + public VerifyData data; + + public static class VerifyData { + public VerifyAccountData account = new VerifyAccountData(); + public boolean device_grant_required = false; + public String realname_operation = "NONE"; + public boolean realperson_required = false; + public boolean safe_mobile_required = false; + + public VerifyData(String accountUid, String email, String token) { + this.account.uid = accountUid; + this.account.email = email; + this.account.token = token; + } + } + + public static class VerifyAccountData { + public String uid; + public String name = ""; + public String email = ""; + public String mobile = ""; + public String is_email_verify = "0"; + public String realname = ""; + public String identity_card = ""; + public String token; + public String safe_mobile = ""; + public String facebook_name = ""; + public String twitter_name = ""; + public String game_center_name = ""; + public String google_name = ""; + public String apple_name = ""; + public String sony_name = ""; + public String tap_name = ""; + public String country = "US"; + public String reactivate_ticket = ""; + public String area_code = "**"; + public String device_grant_ticket = ""; + } +} diff --git a/src/main/java/emu/lunarcore/server/http/objects/LoginTokenReqJson.java b/src/main/java/emu/lunarcore/server/http/objects/LoginTokenReqJson.java new file mode 100644 index 0000000..48bf274 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/http/objects/LoginTokenReqJson.java @@ -0,0 +1,6 @@ +package emu.lunarcore.server.http.objects; + +public class LoginTokenReqJson { + public String uid; + public String token; +} diff --git a/src/main/java/emu/lunarcore/server/packet/BasePacket.java b/src/main/java/emu/lunarcore/server/packet/BasePacket.java new file mode 100644 index 0000000..4554937 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/BasePacket.java @@ -0,0 +1,91 @@ +package emu.lunarcore.server.packet; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import us.hebi.quickbuf.ProtoMessage; + +public class BasePacket { + public static final int HEADER_CONST = 0x9d74c714; + public static final int TAIL_CONST = 0xd7a152c8; + + private int opcode; + private byte[] data; + + // Encryption + private boolean useDispatchKey; + public boolean shouldEncrypt = true; + + public BasePacket(int opcode) { + this.opcode = opcode; + } + + public int getOpcode() { + return opcode; + } + + public void setOpcode(int opcode) { + this.opcode = opcode; + } + + public boolean useDispatchKey() { + return useDispatchKey; + } + + public void setUseDispatchKey(boolean useDispatchKey) { + this.useDispatchKey = useDispatchKey; + } + + public byte[] getData() { + return data; + } + + public void setData(byte[] data) { + this.data = data; + } + + public void setData(ProtoMessage proto) { + this.data = proto.toByteArray(); + } + + public byte[] build() { + if (getData() == null) { + this.data = new byte[0]; + } + + ByteArrayOutputStream baos = new ByteArrayOutputStream(4 + 2 + 4 + getData().length + 4); + + this.writeUint32(baos, HEADER_CONST); + this.writeUint16(baos, opcode); + this.writeUint16(baos, 0); // Empty header + this.writeUint32(baos, data.length); + this.writeBytes(baos, data); + this.writeUint32(baos, TAIL_CONST); + + byte[] packet = baos.toByteArray(); + + return packet; + } + + public void writeUint16(ByteArrayOutputStream baos, int i) { + // Unsigned short + baos.write((byte) ((i >>> 8) & 0xFF)); + baos.write((byte) (i & 0xFF)); + } + + public void writeUint32(ByteArrayOutputStream baos, int i) { + // Unsigned int (long) + baos.write((byte) ((i >>> 24) & 0xFF)); + baos.write((byte) ((i >>> 16) & 0xFF)); + baos.write((byte) ((i >>> 8) & 0xFF)); + baos.write((byte) (i & 0xFF)); + } + + public void writeBytes(ByteArrayOutputStream baos, byte[] bytes) { + try { + baos.write(bytes); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/CmdId.java b/src/main/java/emu/lunarcore/server/packet/CmdId.java new file mode 100644 index 0000000..c9645f4 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/CmdId.java @@ -0,0 +1,961 @@ +package emu.lunarcore.server.packet; + +public class CmdId { + // Empty + public static final int NONE = 0; + + // Opcodes + public static final int BuyBpLevelScRsp = 3014; + public static final int TakeBpRewardCsReq = 3029; + public static final int BuyBpLevelCsReq = 3047; + public static final int BattlePassInfoNotify = 3007; + public static final int TakeAllRewardCsReq = 3092; + public static final int TakeAllRewardScRsp = 3087; + public static final int TakeBpRewardScRsp = 3083; + public static final int ReplaceLineupCsReq = 716; + public static final int QuitLineupCsReq = 714; + public static final int GetCurLineupDataScRsp = 729; + public static final int JoinLineupCsReq = 783; + public static final int SwapLineupScRsp = 790; + public static final int GetAllLineupDataCsReq = 793; + public static final int GetStageLineupCsReq = 707; + public static final int QuitLineupScRsp = 792; + public static final int SwapLineupCsReq = 787; + public static final int SyncLineupNotify = 732; + public static final int SetLineupNameCsReq = 756; + public static final int GetAllLineupDataScRsp = 702; + public static final int SetLineupNameScRsp = 740; + public static final int GetLineupAvatarDataCsReq = 706; + public static final int GetStageLineupScRsp = 725; + public static final int VirtualLineupDestroyNotify = 796; + public static final int SwitchLineupIndexCsReq = 705; + public static final int ReplaceLineupScRsp = 718; + public static final int ChangeLineupLeaderCsReq = 736; + public static final int GetLineupAvatarDataScRsp = 708; + public static final int JoinLineupScRsp = 747; + public static final int SwitchLineupIndexScRsp = 780; + public static final int ChangeLineupLeaderScRsp = 742; + public static final int GetCurLineupDataCsReq = 774; + public static final int EnterTrialActivityStageScRsp = 2668; + public static final int GetLoginActivityCsReq = 2607; + public static final int TakeTrialActivityRewardScRsp = 2663; + public static final int TakeMonsterResearchActivityRewardScRsp = 2696; + public static final int TakeLoginActivityRewardScRsp = 2629; + public static final int RogueChallengeActivityBuffChooseScRsp = 2670; + public static final int CurTrialActivityScNotify = 2609; + public static final int RogueChallengeRefreshAssistListScRsp = 2662; + public static final int GetMonsterResearchActivityDataScRsp = 2656; + public static final int EnterActivityBattleStageCsReq = 2684; + public static final int GetActivityScheduleConfigScRsp = 2647; + public static final int RogueChallengeBattleResultScNotify = 2698; + public static final int EnterTrialActivityStageCsReq = 2617; + public static final int RogueChallengeActivityDataScRsp = 2618; + public static final int StartTrialActivityScRsp = 2694; + public static final int GetMonsterResearchActivityDataCsReq = 2680; + public static final int LeaveTrialActivityScRsp = 2697; + public static final int RogueChallengeActivityBuffChooseScNotify = 2634; + public static final int GetTrialActivityDataScRsp = 2615; + public static final int RogueChallengeRefreshAssistListCsReq = 2678; + public static final int GetLoginActivityScRsp = 2625; + public static final int SubmitMonsterResearchActivityMaterialCsReq = 2640; + public static final int RogueChallengeActivityBuffChooseCsReq = 2685; + public static final int EnterActivityBattleStageScRsp = 2612; + public static final int TakeLoginActivityRewardCsReq = 2674; + public static final int RogueChallengeActivityDataCsReq = 2616; + public static final int GetActivityScheduleConfigCsReq = 2683; + public static final int LeaveTrialActivityCsReq = 2667; + public static final int GetTrialActivityDataCsReq = 2650; + public static final int TrialActivityDataChangeScNotify = 2645; + public static final int TakeTrialActivityRewardCsReq = 2630; + public static final int TakeMonsterResearchActivityRewardCsReq = 2602; + public static final int StartTrialActivityCsReq = 2665; + public static final int SubmitMonsterResearchActivityMaterialScRsp = 2693; + public static final int GetQuestDataCsReq = 907; + public static final int TakeQuestRewardCsReq = 974; + public static final int QuestRecordScNotify = 987; + public static final int TakeQuestRewardScRsp = 929; + public static final int GetQuestDataScRsp = 925; + public static final int GetQuestRecordCsReq = 914; + public static final int GetQuestRecordScRsp = 992; + public static final int FinishQuestCsReq = 990; + public static final int FinishQuestScRsp = 932; + public static final int GetRndOptionCsReq = 3407; + public static final int GetRndOptionScRsp = 3425; + public static final int DailyFirstMeetPamCsReq = 3474; + public static final int DailyFirstMeetPamScRsp = 3429; + public static final int TrainVisitorBehaviorFinishCsReq = 3707; + public static final int TrainVisitorBehaviorFinishScRsp = 3725; + public static final int GetTrainVisitorBehaviorScRsp = 3729; + public static final int TrainRefreshTimeNotify = 3783; + public static final int GetTrainVisitorBehaviorCsReq = 3774; + public static final int BattleLogReportScRsp = 132; + public static final int PVEBattleResultScRsp = 125; + public static final int QuitBattleCsReq = 174; + public static final int QuitBattleScNotify = 187; + public static final int GetCurBattleInfoCsReq = 183; + public static final int BattleLogReportCsReq = 190; + public static final int SyncClientResVersionCsReq = 114; + public static final int QuitBattleScRsp = 129; + public static final int PVEBattleResultCsReq = 107; + public static final int GetCurBattleInfoScRsp = 147; + public static final int SyncClientResVersionScRsp = 192; + public static final int UnlockChatBubbleScNotify = 5183; + public static final int SelectChatBubbleCsReq = 5174; + public static final int UnlockPhoneThemeScNotify = 5192; + public static final int GetPhoneDataCsReq = 5107; + public static final int SelectPhoneThemeCsReq = 5147; + public static final int SelectChatBubbleScRsp = 5129; + public static final int SelectPhoneThemeScRsp = 5114; + public static final int GetPhoneDataScRsp = 5125; + public static final int PlayerReturnForceFinishScNotify = 4532; + public static final int PlayerReturnStartScNotify = 4507; + public static final int PlayerReturnSignCsReq = 4525; + public static final int PlayerReturnTakePointRewardCsReq = 4583; + public static final int PlayerReturnTakePointRewardScRsp = 4547; + public static final int PlayerReturnInfoQueryScRsp = 4590; + public static final int PlayerReturnPointChangeScNotify = 4529; + public static final int PlayerReturnInfoQueryCsReq = 4587; + public static final int PlayerReturnTakeRewardCsReq = 4514; + public static final int PlayerReturnTakeRewardScRsp = 4592; + public static final int PlayerReturnSignScRsp = 4574; + public static final int TakeBattleCollegeGroupRewardCsReq = 5747; + public static final int TakeBattleCollegeGroupRewardScRsp = 5714; + public static final int BattleCollegeDataChangeScNotify = 5774; + public static final int GetBattleCollegeDataCsReq = 5707; + public static final int StartBattleCollegeCsReq = 5729; + public static final int StartBattleCollegeScRsp = 5783; + public static final int GetBattleCollegeDataScRsp = 5725; + public static final int GetFirstTalkNpcCsReq = 2183; + public static final int GetFirstTalkNpcScRsp = 2147; + public static final int FinishFirstTalkNpcScRsp = 2192; + public static final int FinishFirstTalkNpcCsReq = 2114; + public static final int GetNpcTakenRewardScRsp = 2125; + public static final int GetFirstTalkByPerformanceNpcCsReq = 2132; + public static final int FinishFirstTalkByPerformanceNpcCsReq = 2108; + public static final int TakeTalkRewardScRsp = 2129; + public static final int GetNpcTakenRewardCsReq = 2107; + public static final int SelectInclinationTextCsReq = 2187; + public static final int GetFirstTalkByPerformanceNpcScRsp = 2106; + public static final int TakeTalkRewardCsReq = 2174; + public static final int FinishFirstTalkByPerformanceNpcScRsp = 2136; + public static final int SelectInclinationTextScRsp = 2190; + public static final int SetHeadIconScRsp = 2829; + public static final int GetPlayerBoardDataCsReq = 2807; + public static final int SetHeadIconCsReq = 2874; + public static final int UnlockHeadIconScNotify = 2887; + public static final int SetSignatureScRsp = 2832; + public static final int SetIsDisplayAvatarInfoScRsp = 2892; + public static final int SetSignatureCsReq = 2890; + public static final int SetAssistAvatarCsReq = 2806; + public static final int SetDisplayAvatarCsReq = 2883; + public static final int SetIsDisplayAvatarInfoCsReq = 2814; + public static final int SetDisplayAvatarScRsp = 2847; + public static final int GetPlayerBoardDataScRsp = 2825; + public static final int SetAssistAvatarScRsp = 2808; + public static final int StartAlleyEventCsReq = 4714; + public static final int GetAlleyInfoCsReq = 4707; + public static final int LogisticsGameScRsp = 4729; + public static final int AlleyGuaranteedFundsScRsp = 4727; + public static final int AlleyPlacingGameCsReq = 4708; + public static final int SaveLogisticsScRsp = 4735; + public static final int AlleyEventEffectNotify = 4790; + public static final int AlleyShipUnlockScNotify = 4785; + public static final int GetSaveLogisticsMapCsReq = 4719; + public static final int AlleyShipUsedCountScNotify = 4777; + public static final int AlleyPlacingGameScRsp = 4736; + public static final int LogisticsScoreRewardSyncInfoScNotify = 4712; + public static final int RefreshAlleyOrderScRsp = 4756; + public static final int GetAlleyInfoScRsp = 4725; + public static final int GetSaveLogisticsMapScRsp = 4799; + public static final int AlleyTakeEventRewardCsReq = 4776; + public static final int AlleyGuaranteedFundsCsReq = 4722; + public static final int RefreshAlleyOrderCsReq = 4780; + public static final int SaveLogisticsCsReq = 4770; + public static final int LogisticsDetonateStarSkiffCsReq = 4734; + public static final int PrestigeLevelUpCsReq = 4702; + public static final int LogisticsInfoScNotify = 4713; + public static final int AlleyTakeEventRewardScRsp = 4733; + public static final int LogisticsDetonateStarSkiffScRsp = 4784; + public static final int AlleyFundsScNotify = 4716; + public static final int AlleyShipmentEventEffectsScNotify = 4771; + public static final int StartAlleyEventScRsp = 4792; + public static final int AlleyShopLevelScNotify = 4718; + public static final int AlleyOrderChangedScNotify = 4740; + public static final int LogisticsGameCsReq = 4774; + public static final int TakePrestigeRewardCsReq = 4732; + public static final int PrestigeLevelUpScRsp = 4796; + public static final int TakePrestigeRewardScRsp = 4706; + public static final int AlleyEventChangeNotify = 4787; + public static final int GetDailyActiveInfoCsReq = 3374; + public static final int TakeAllApRewardCsReq = 3347; + public static final int TakeAllApRewardScRsp = 3314; + public static final int TakeApRewardCsReq = 3307; + public static final int DailyActiveInfoNotify = 3383; + public static final int GetDailyActiveInfoScRsp = 3329; + public static final int TakeApRewardScRsp = 3325; + public static final int GetFantasticStoryActivityDataScRsp = 4925; + public static final int EnterFantasticStoryActivityStageScRsp = 4983; + public static final int EnterFantasticStoryActivityStageCsReq = 4929; + public static final int FinishChapterScNotify = 4974; + public static final int FantasticStoryActivityBattleEndScNotify = 4947; + public static final int GetFantasticStoryActivityDataCsReq = 4907; + public static final int TrialBackGroundMusicScRsp = 3192; + public static final int UnlockBackGroundMusicScRsp = 3147; + public static final int UnlockBackGroundMusicCsReq = 3183; + public static final int PlayBackGroundMusicScRsp = 3129; + public static final int GetJukeboxDataScRsp = 3125; + public static final int TrialBackGroundMusicCsReq = 3114; + public static final int PlayBackGroundMusicCsReq = 3174; + public static final int GetJukeboxDataCsReq = 3107; + public static final int FinishSectionIdCsReq = 2714; + public static final int GetNpcStatusCsReq = 2774; + public static final int FinishSectionIdScRsp = 2792; + public static final int GetNpcMessageGroupScRsp = 2725; + public static final int GetNpcMessageGroupCsReq = 2707; + public static final int FinishPerformSectionIdCsReq = 2787; + public static final int FinishPerformSectionIdScRsp = 2790; + public static final int GetNpcStatusScRsp = 2729; + public static final int FinishItemIdCsReq = 2783; + public static final int FinishItemIdScRsp = 2747; + public static final int GetGachaInfoCsReq = 1907; + public static final int DoGachaCsReq = 1974; + public static final int GetGachaCeilingCsReq = 1983; + public static final int DoGachaScRsp = 1929; + public static final int ExchangeGachaCeilingCsReq = 1914; + public static final int GetGachaInfoScRsp = 1925; + public static final int ExchangeGachaCeilingScRsp = 1992; + public static final int GetGachaCeilingScRsp = 1947; + public static final int AcceptActivityExpeditionScRsp = 2532; + public static final int AcceptActivityExpeditionCsReq = 2590; + public static final int TakeExpeditionRewardScRsp = 2592; + public static final int AcceptExpeditionScRsp = 2529; + public static final int TakeExpeditionRewardCsReq = 2514; + public static final int GetExpeditionDataCsReq = 2507; + public static final int ExpeditionDataChangeScNotify = 2587; + public static final int CancelActivityExpeditionScRsp = 2508; + public static final int CancelActivityExpeditionCsReq = 2506; + public static final int GetExpeditionDataScRsp = 2525; + public static final int CancelExpeditionScRsp = 2547; + public static final int CancelExpeditionCsReq = 2583; + public static final int TakeActivityExpeditionRewardScRsp = 2542; + public static final int AcceptExpeditionCsReq = 2574; + public static final int TakeActivityExpeditionRewardCsReq = 2536; + public static final int SyncAcceptedPamMissionNotify = 4074; + public static final int AcceptedPamMissionExpireCsReq = 4007; + public static final int AcceptedPamMissionExpireScRsp = 4025; + public static final int FinishPlotScRsp = 1125; + public static final int FinishPlotCsReq = 1107; + public static final int SpringTransferCsReq = 1436; + public static final int LastSpringRefreshTimeNotify = 1493; + public static final int EnterSectionScRsp = 1413; + public static final int GetCurSceneInfoCsReq = 1414; + public static final int InteractPropCsReq = 1474; + public static final int ActivateFarmElementCsReq = 1464; + public static final int GetSceneMapInfoCsReq = 1439; + public static final int EnterSectionCsReq = 1435; + public static final int StartCocoonStageCsReq = 1433; + public static final int SpringTransferScRsp = 1442; + public static final int SetClientPausedCsReq = 1478; + public static final int GetCurSceneInfoScRsp = 1492; + public static final int ReturnLastTownScRsp = 1496; + public static final int GetSpringRecoverDataScRsp = 1472; + public static final int GetEnteredSceneCsReq = 1431; + public static final int SavePointsInfoNotify = 1476; + public static final int HealPoolInfoNotify = 1417; + public static final int GameplayCounterRecoverScRsp = 1444; + public static final int GameplayCounterCountDownCsReq = 1454; + public static final int SceneEntityDisappearScNotify = 1490; + public static final int SyncServerSceneChangeNotify = 1443; + public static final int GetSceneMapInfoScRsp = 1424; + public static final int SceneEnterStageCsReq = 1416; + public static final int SetCurInteractEntityCsReq = 1499; + public static final int SpringRefreshCsReq = 1456; + public static final int ActivateFarmElementScRsp = 1453; + public static final int SpringRecoverCsReq = 1415; + public static final int SceneCastSkillMpUpdateScNotify = 1405; + public static final int SetGroupCustomSaveDataScRsp = 1494; + public static final int SpringRefreshScRsp = 1440; + public static final int SetSpringRecoverConfigScRsp = 1450; + public static final int SceneEntityTeleportCsReq = 1482; + public static final int GetUnlockTeleportCsReq = 1455; + public static final int SceneUpdatePositionVersionNotify = 1406; + public static final int UpdateFloorSavedValueNotify = 1457; + public static final int ReturnLastTownCsReq = 1402; + public static final int SceneEntityDieScNotify = 1498; + public static final int GetSpringRecoverDataCsReq = 1500; + public static final int GameplayCounterUpdateScNotify = 1469; + public static final int InteractPropScRsp = 1429; + public static final int ScenePlaneEventScNotify = 1460; + public static final int EnterSceneCsReq = 1410; + public static final int SyncEntityBuffChangeListScNotify = 1408; + public static final int RefreshTriggerPropScNotify = 1423; + public static final int GameplayCounterCountDownScRsp = 1449; + public static final int RefreshTriggerPropCsReq = 1451; + public static final int EnterSceneByServerScNotify = 1421; + public static final int SpringRecoverSingleAvatarCsReq = 1468; + public static final int EntityBindPropScRsp = 1412; + public static final int StartCocoonStageScRsp = 1434; + public static final int SetClientPausedScRsp = 1462; + public static final int GroupStateChangeScRsp = 1452; + public static final int SetGroupCustomSaveDataCsReq = 1465; + public static final int SceneCastSkillCsReq = 1483; + public static final int SceneEntityMoveCsReq = 1407; + public static final int GroupStateChangeCsReq = 1420; + public static final int SceneCastSkillScRsp = 1447; + public static final int EntityBindPropCsReq = 1484; + public static final int EnterSceneScRsp = 1401; + public static final int SceneEntityMoveScRsp = 1425; + public static final int EnteredSceneChangeScNotify = 1404; + public static final int ReEnterLastElementStageCsReq = 1409; + public static final int SetCurInteractEntityScRsp = 1477; + public static final int UpdateMechanismBarScNotify = 1463; + public static final int SceneEntityUpdateScNotify = 1487; + public static final int SetSpringRecoverConfigCsReq = 1475; + public static final int GroupStateChangeScNotify = 1437; + public static final int RecoverAllLineupScRsp = 1427; + public static final int GetEnteredSceneScRsp = 1426; + public static final int GameplayCounterRecoverCsReq = 1486; + public static final int SceneEntityMoveScNotify = 1432; + public static final int SpringRecoverScRsp = 1445; + public static final int GetUnlockTeleportScRsp = 1446; + public static final int SpringRecoverSingleAvatarScRsp = 1430; + public static final int ReEnterLastElementStageScRsp = 1441; + public static final int RecoverAllLineupCsReq = 1422; + public static final int RefreshTriggerPropScRsp = 1491; + public static final int SceneEnterStageScRsp = 1418; + public static final int SceneEntityTeleportScRsp = 1481; + public static final int SceneGroupRefreshScNotify = 1438; + public static final int GetChallengeRaidInfoCsReq = 2247; + public static final int StartRaidCsReq = 2207; + public static final int ChallengeRaidNotify = 2290; + public static final int GetRaidInfoCsReq = 2232; + public static final int GetAllSaveRaidScRsp = 2256; + public static final int TakeChallengeRaidRewardScRsp = 2287; + public static final int RaidKickByServerScNotify = 2293; + public static final int GetSaveRaidScRsp = 2205; + public static final int SetClientRaidTargetCountScRsp = 2236; + public static final int SetClientRaidTargetCountCsReq = 2208; + public static final int GetSaveRaidCsReq = 2242; + public static final int GetRaidInfoScRsp = 2206; + public static final int RaidInfoNotify = 2283; + public static final int GetAllSaveRaidCsReq = 2280; + public static final int LeaveRaidCsReq = 2274; + public static final int TakeChallengeRaidRewardCsReq = 2292; + public static final int StartRaidScRsp = 2225; + public static final int LeaveRaidScRsp = 2229; + public static final int GetChallengeRaidInfoScRsp = 2214; + public static final int DelSaveRaidScNotify = 2240; + public static final int PrepareRogueAdventureRoomCsReq = 5625; + public static final int GetRogueShopBuffInfoScRsp = 5614; + public static final int BuyRogueShopMiracleCsReq = 5692; + public static final int GetRogueAdventureRoomInfoCsReq = 5636; + public static final int BuyRogueShopBuffCsReq = 5690; + public static final int GetRogueAdventureRoomInfoScRsp = 5642; + public static final int SyncRogueCommonBuffDisplayScNotify = 5605; + public static final int PrepareRogueAdventureRoomScRsp = 5674; + public static final int GetRogueShopMiracleInfoScRsp = 5683; + public static final int RogueNpcDisappearCsReq = 5606; + public static final int SyncRogueAdventureRoomInfoScNotify = 5607; + public static final int SyncRogueCommonMiracleDisplayScNotify = 5680; + public static final int BuyRogueShopMiracleScRsp = 5687; + public static final int BuyRogueShopBuffScRsp = 5632; + public static final int GetRogueShopBuffInfoCsReq = 5647; + public static final int GetRogueShopMiracleInfoCsReq = 5629; + public static final int RogueNpcDisappearScRsp = 5608; + public static final int SyncRogueCommonItemDisplayScNotify = 5656; + public static final int MuseumDispatchFinishedScNotify = 4318; + public static final int BuyNpcStuffScRsp = 4329; + public static final int MuseumTargetMissionFinishNotify = 4370; + public static final int MuseumRandomEventSelectCsReq = 4396; + public static final int MuseumRandomEventStartScNotify = 4340; + public static final int GetExhibitScNotify = 4390; + public static final int FinishCurTurnCsReq = 4332; + public static final int GetMuseumInfoCsReq = 4307; + public static final int MuseumTargetRewardNotify = 4335; + public static final int MuseumRandomEventSelectScRsp = 4316; + public static final int MuseumTakeCollectRewardScRsp = 4371; + public static final int MuseumTakeCollectRewardCsReq = 4313; + public static final int FinishCurTurnScRsp = 4306; + public static final int SetStuffToAreaScRsp = 4347; + public static final int UpgradeAreaScRsp = 4336; + public static final int BuyNpcStuffCsReq = 4374; + public static final int UpgradeAreaCsReq = 4308; + public static final int UpgradeAreaStatScRsp = 4305; + public static final int MuseumFundsChangedScNotify = 4356; + public static final int MuseumRandomEventQueryCsReq = 4393; + public static final int MuseumRandomEventQueryScRsp = 4302; + public static final int RemoveStuffFromAreaScRsp = 4392; + public static final int SetStuffToAreaCsReq = 4383; + public static final int GetMuseumInfoScRsp = 4325; + public static final int MuseumTargetStartNotify = 4385; + public static final int MuseumInfoChangedScNotify = 4380; + public static final int UpgradeAreaStatCsReq = 4342; + public static final int RemoveStuffFromAreaCsReq = 4314; + public static final int GetStuffScNotify = 4387; + public static final int GetShareDataCsReq = 4174; + public static final int CancelCacheNotifyScRsp = 4190; + public static final int ShareCsReq = 4107; + public static final int TriggerHealVoiceScRsp = 4192; + public static final int ShareScRsp = 4125; + public static final int CancelCacheNotifyCsReq = 4187; + public static final int TriggerHealVoiceCsReq = 4114; + public static final int TakePictureScRsp = 4147; + public static final int TakePictureCsReq = 4183; + public static final int GetShareDataScRsp = 4129; + public static final int TakeMailAttachmentCsReq = 814; + public static final int GetMailCsReq = 807; + public static final int NewMailScNotify = 887; + public static final int DelMailScRsp = 847; + public static final int GetMailScRsp = 825; + public static final int MarkReadMailScRsp = 829; + public static final int DelMailCsReq = 883; + public static final int MarkReadMailCsReq = 874; + public static final int TakeMailAttachmentScRsp = 892; + public static final int GetBasicInfoScRsp = 72; + public static final int ExchangeStaminaCsReq = 36; + public static final int SetGenderCsReq = 84; + public static final int ExchangeStaminaScRsp = 42; + public static final int SetPlayerInfoScRsp = 62; + public static final int PlayerLoginFinishScRsp = 10; + public static final int GetVideoVersionKeyScRsp = 21; + public static final int PlayerLoginScRsp = 25; + public static final int GateServerScNotify = 94; + public static final int GmTalkScRsp = 32; + public static final int ServerAnnounceNotify = 19; + public static final int GetHeroBasicTypeInfoScRsp = 27; + public static final int GetLevelRewardScRsp = 85; + public static final int SetHeroBasicTypeScRsp = 77; + public static final int GetSecretKeyInfoScRsp = 82; + public static final int SetPlayerInfoCsReq = 78; + public static final int FeatureSwitchClosedScNotify = 67; + public static final int PlayerHeartBeatScRsp = 65; + public static final int ReserveStaminaExchangeCsReq = 43; + public static final int GetVideoVersionKeyCsReq = 1; + public static final int GmTalkScNotify = 92; + public static final int SetGenderScRsp = 12; + public static final int AceAntiCheaterScRsp = 17; + public static final int RegionStopScNotify = 56; + public static final int QueryProductInfoScRsp = 79; + public static final int RetcodeNotify = 30; + public static final int SetLanguageCsReq = 13; + public static final int PlayerGetTokenCsReq = 83; + public static final int PlayerLoginFinishCsReq = 81; + public static final int SetGameplayBirthdayScRsp = 15; + public static final int GetLevelRewardTakenListScRsp = 16; + public static final int GetLevelRewardTakenListCsReq = 96; + public static final int UpdatePlayerSettingScRsp = 57; + public static final int UpdatePlayerSettingCsReq = 59; + public static final int SetNicknameScRsp = 2; + public static final int GetAuthkeyCsReq = 5; + public static final int ReserveStaminaExchangeScRsp = 55; + public static final int SetHeroBasicTypeCsReq = 99; + public static final int SetLanguageScRsp = 71; + public static final int AceAntiCheaterCsReq = 45; + public static final int UpdateFeatureSwitchScNotify = 53; + public static final int DailyRefreshNotify = 75; + public static final int PlayerGetTokenScRsp = 47; + public static final int PlayerLoginCsReq = 7; + public static final int MonthCardRewardNotify = 68; + public static final int SetGameplayBirthdayCsReq = 50; + public static final int SetRedPointStatusScNotify = 60; + public static final int GetAuthkeyScRsp = 80; + public static final int HeroBasicTypeChangedNotify = 98; + public static final int GetSecretKeyInfoCsReq = 41; + public static final int StaminaInfoScNotify = 46; + public static final int PlayerHeartBeatCsReq = 63; + public static final int GetBasicInfoCsReq = 100; + public static final int AntiAddictScNotify = 40; + public static final int GetLevelRewardCsReq = 18; + public static final int PlayerLogoutCsReq = 74; + public static final int ClientDownloadDataScNotify = 64; + public static final int PlayerKickOutScNotify = 87; + public static final int PlayerLogoutScRsp = 29; + public static final int GetHeroBasicTypeInfoCsReq = 22; + public static final int GmTalkCsReq = 90; + public static final int QueryProductInfoCsReq = 73; + public static final int SetNicknameCsReq = 93; + public static final int GetSingleRedDotParamGroupScRsp = 5947; + public static final int UpdateRedDotDataScRsp = 5929; + public static final int UpdateRedDotDataCsReq = 5974; + public static final int GetAllRedDotDataScRsp = 5925; + public static final int GetSingleRedDotParamGroupCsReq = 5983; + public static final int GetAllRedDotDataCsReq = 5907; + public static final int EnterAdventureScRsp = 1325; + public static final int EnterAdventureCsReq = 1307; + public static final int GetCurChallengeCsReq = 1790; + public static final int GetChallengeCsReq = 1707; + public static final int TakeChallengeRewardCsReq = 1742; + public static final int LeaveChallengeCsReq = 1783; + public static final int TakeChallengeRewardScRsp = 1705; + public static final int StartChallengeScRsp = 1729; + public static final int LeaveChallengeScRsp = 1747; + public static final int TakeChallengeTargetRewardCsReq = 1708; + public static final int GetCurChallengeScRsp = 1732; + public static final int GetChallengeScRsp = 1725; + public static final int FinishChallengeScRsp = 1787; + public static final int StartChallengeCsReq = 1774; + public static final int FinishChallengeCsReq = 1792; + public static final int ChallengeSettleNotify = 1714; + public static final int ChallengeLineupNotify = 1706; + public static final int TakeChallengeTargetRewardScRsp = 1736; + public static final int GetAvatarDataCsReq = 307; + public static final int DressRelicAvatarScRsp = 380; + public static final int TakeOffEquipmentCsReq = 332; + public static final int DressAvatarScRsp = 390; + public static final int DressRelicAvatarCsReq = 305; + public static final int GetAvatarDataScRsp = 325; + public static final int RankUpAvatarCsReq = 336; + public static final int UnlockSkilltreeScRsp = 347; + public static final int TakeOffRelicScRsp = 340; + public static final int DressAvatarCsReq = 387; + public static final int TakeOffRelicCsReq = 356; + public static final int AvatarExpUpScRsp = 329; + public static final int TakePromotionRewardCsReq = 393; + public static final int PromoteAvatarCsReq = 314; + public static final int TakePromotionRewardScRsp = 302; + public static final int AvatarExpUpCsReq = 374; + public static final int UnlockSkilltreeCsReq = 383; + public static final int PromoteAvatarScRsp = 392; + public static final int AddAvatarScNotify = 308; + public static final int RankUpAvatarScRsp = 342; + public static final int TakeOffEquipmentScRsp = 306; + public static final int GetChatFriendHistoryScRsp = 3992; + public static final int MarkChatEmojiCsReq = 3932; + public static final int GetChatFriendHistoryCsReq = 3914; + public static final int GetPrivateChatHistoryCsReq = 3983; + public static final int SendMsgScRsp = 3925; + public static final int GetChatEmojiListScRsp = 3990; + public static final int PrivateMsgOfflineUsersScNotify = 3929; + public static final int GetPrivateChatHistoryScRsp = 3947; + public static final int BatchMarkChatEmojiScRsp = 3936; + public static final int BatchMarkChatEmojiCsReq = 3908; + public static final int RevcMsgScNotify = 3974; + public static final int SendMsgCsReq = 3907; + public static final int GetChatEmojiListCsReq = 3987; + public static final int MarkChatEmojiScRsp = 3906; + public static final int UnlockTutorialScRsp = 1647; + public static final int UnlockTutorialGuideScRsp = 1692; + public static final int UnlockTutorialGuideCsReq = 1614; + public static final int FinishTutorialGuideCsReq = 1632; + public static final int FinishTutorialGuideScRsp = 1606; + public static final int GetTutorialCsReq = 1607; + public static final int GetTutorialScRsp = 1625; + public static final int GetTutorialGuideCsReq = 1674; + public static final int FinishTutorialScRsp = 1690; + public static final int FinishTutorialCsReq = 1687; + public static final int UnlockTutorialCsReq = 1683; + public static final int GetTutorialGuideScRsp = 1629; + public static final int TakeCityShopRewardScRsp = 1547; + public static final int CityShopInfoScNotify = 1514; + public static final int BuyGoodsCsReq = 1574; + public static final int BuyGoodsScRsp = 1529; + public static final int GetShopListScRsp = 1525; + public static final int GetShopListCsReq = 1507; + public static final int TakeCityShopRewardCsReq = 1583; + public static final int EnterFightActivityStageCsReq = 3629; + public static final int FightActivityDataChangeScNotify = 3674; + public static final int TakeFightActivityRewardCsReq = 3647; + public static final int GetFightActivityDataScRsp = 3625; + public static final int GetFightActivityDataCsReq = 3607; + public static final int TakeFightActivityRewardScRsp = 3614; + public static final int EnterFightActivityStageScRsp = 3683; + public static final int SharePunkLordMonsterScRsp = 3247; + public static final int TakePunkLordPointRewardScRsp = 3236; + public static final int PunkLordMonsterInfoScNotify = 3242; + public static final int PunkLordDataChangeNotify = 3299; + public static final int GetPunkLordBattleRecordScRsp = 3222; + public static final int SummonPunkLordMonsterCsReq = 3214; + public static final int GetKilledPunkLordMonsterDataScRsp = 3285; + public static final int PunkLordRaidTimeOutScNotify = 3240; + public static final int GetKilledPunkLordMonsterDataCsReq = 3218; + public static final int GetPunkLordMonsterDataScRsp = 3225; + public static final int SharePunkLordMonsterCsReq = 3283; + public static final int StartPunkLordRaidCsReq = 3274; + public static final int TakeKilledPunkLordMonsterScoreScRsp = 3219; + public static final int TakePunkLordPointRewardCsReq = 3208; + public static final int TakeKilledPunkLordMonsterScoreCsReq = 3271; + public static final int GetPunkLordDataScRsp = 3280; + public static final int PunkLordMonsterKilledNotify = 3213; + public static final int StartPunkLordRaidScRsp = 3229; + public static final int GetPunkLordBattleRecordCsReq = 3277; + public static final int SummonPunkLordMonsterScRsp = 3292; + public static final int GetPunkLordDataCsReq = 3205; + public static final int PunkLordBattleResultScNotify = 3216; + public static final int GetPunkLordMonsterDataCsReq = 3207; + public static final int AcceptMissionEventScRsp = 1240; + public static final int GetMissionDataScRsp = 1225; + public static final int StartFinishSubMissionScNotify = 1271; + public static final int InterruptMissionEventScRsp = 1216; + public static final int GetMissionEventDataScRsp = 1205; + public static final int FinishTalkMissionCsReq = 1274; + public static final int GetMissionEventDataCsReq = 1242; + public static final int FinishCosumeItemMissionScRsp = 1236; + public static final int GetMainMissionCustomValueCsReq = 1222; + public static final int AcceptMainMissionCsReq = 1299; + public static final int DailyTaskDataScNotify = 1292; + public static final int StartFinishMainMissionScNotify = 1219; + public static final int GetMissionStatusCsReq = 1293; + public static final int GetMissionDataCsReq = 1207; + public static final int MissionEventRewardScNotify = 1280; + public static final int GetMissionStatusScRsp = 1202; + public static final int TeleportToMissionResetPointCsReq = 1235; + public static final int AcceptMissionEventCsReq = 1256; + public static final int TeleportToMissionResetPointScRsp = 1213; + public static final int SetMissionEventProgressScRsp = 1285; + public static final int SubMissionRewardScNotify = 1270; + public static final int FinishTalkMissionScRsp = 1229; + public static final int GetMainMissionCustomValueScRsp = 1227; + public static final int MissionAcceptScNotify = 1276; + public static final int MissionRewardScNotify = 1283; + public static final int SetMissionEventProgressCsReq = 1218; + public static final int MissionGroupWarnScNotify = 1206; + public static final int SyncTaskScRsp = 1214; + public static final int AcceptMainMissionScRsp = 1277; + public static final int InterruptMissionEventCsReq = 1296; + public static final int FinishCosumeItemMissionCsReq = 1208; + public static final int SyncTaskCsReq = 1247; + public static final int PlayerSyncScNotify = 607; + public static final int ExpUpRelicCsReq = 542; + public static final int SellItemScRsp = 593; + public static final int ExpUpEquipmentCsReq = 532; + public static final int AutoUseTurnFoodNotify = 598; + public static final int GetRecyleTimeScRsp = 513; + public static final int ComposeItemScRsp = 536; + public static final int CancelTurnFoodCsReq = 578; + public static final int AddEquipmentScNotify = 570; + public static final int ExpUpEquipmentScRsp = 506; + public static final int GetMarkItemListScRsp = 527; + public static final int SetTurnFoodScRsp = 512; + public static final int ComposeItemCsReq = 508; + public static final int LockRelicCsReq = 580; + public static final int RechargeSuccNotify = 502; + public static final int ExpUpRelicScRsp = 505; + public static final int MarkItemScRsp = 533; + public static final int RankUpEquipmentCsReq = 587; + public static final int GetRecyleTimeCsReq = 535; + public static final int DestroyItemScRsp = 577; + public static final int GetBagScRsp = 525; + public static final int ComposeLimitNumUpdateNotify = 519; + public static final int LockEquipmentCsReq = 583; + public static final int PromoteEquipmentScRsp = 529; + public static final int ComposeSelectedRelicScRsp = 585; + public static final int SetTurnFoodCsReq = 584; + public static final int RankUpEquipmentScRsp = 590; + public static final int LockRelicScRsp = 556; + public static final int UseItemScRsp = 592; + public static final int ExchangeHcoinScRsp = 516; + public static final int PromoteEquipmentCsReq = 574; + public static final int DestroyItemCsReq = 599; + public static final int SellItemCsReq = 540; + public static final int ExchangeHcoinCsReq = 596; + public static final int GetBagCsReq = 507; + public static final int GetMarkItemListCsReq = 522; + public static final int ComposeLimitNumCompleteNotify = 571; + public static final int ComposeSelectedRelicCsReq = 518; + public static final int CancelMarkItemNotify = 534; + public static final int MarkItemCsReq = 576; + public static final int LockEquipmentScRsp = 547; + public static final int CancelTurnFoodScRsp = 562; + public static final int UseItemCsReq = 514; + public static final int TextJoinQueryCsReq = 3874; + public static final int TextJoinSaveScRsp = 3825; + public static final int TextJoinQueryScRsp = 3829; + public static final int TextJoinBatchSaveScRsp = 3847; + public static final int TextJoinBatchSaveCsReq = 3883; + public static final int TextJoinSaveCsReq = 3807; + public static final int UseTreasureDungeonItemScRsp = 4496; + public static final int FightTreasureDungeonMonsterCsReq = 4480; + public static final int InteractTreasureDungeonGridScRsp = 4493; + public static final int OpenTreasureDungeonGridCsReq = 4442; + public static final int QuitTreasureDungeonCsReq = 4416; + public static final int EnterTreasureDungeonScRsp = 4436; + public static final int UseTreasureDungeonItemCsReq = 4402; + public static final int OpenTreasureDungeonGridScRsp = 4405; + public static final int GetTreasureDungeonActivityDataScRsp = 4406; + public static final int QuitTreasureDungeonScRsp = 4418; + public static final int GetTreasureDungeonActivityDataCsReq = 4432; + public static final int EnterTreasureDungeonCsReq = 4408; + public static final int FightTreasureDungeonMonsterScRsp = 4456; + public static final int InteractTreasureDungeonGridCsReq = 4440; + public static final int TreasureDungeonDataScNotify = 4407; + public static final int TreasureDungeonFinishScNotify = 4425; + public static final int GetAssistListScRsp = 2919; + public static final int SetFriendRemarkNameScRsp = 2996; + public static final int GetPlatformPlayerInfoCsReq = 2962; + public static final int DeleteFriendCsReq = 2908; + public static final int SetAssistScRsp = 2977; + public static final int GetFriendLoginInfoScRsp = 2979; + public static final int GetFriendApplyListInfoCsReq = 2983; + public static final int SyncAddBlacklistScNotify = 2956; + public static final int DeleteFriendScRsp = 2936; + public static final int DeleteBlacklistScRsp = 2970; + public static final int AddBlacklistScRsp = 2980; + public static final int SearchPlayerScRsp = 2913; + public static final int GetFriendRecommendListInfoCsReq = 2940; + public static final int GetAssistHistoryCsReq = 2976; + public static final int ReportPlayerScRsp = 2918; + public static final int SyncApplyFriendScNotify = 2987; + public static final int TakeAssistRewardScRsp = 2912; + public static final int GetAssistListCsReq = 2971; + public static final int ReportPlayerCsReq = 2916; + public static final int CurAssistChangedNotify = 2978; + public static final int NewAssistHistoryNotify = 2934; + public static final int GetFriendListInfoScRsp = 2925; + public static final int GetAssistHistoryScRsp = 2933; + public static final int GetPlayerDetailInfoScRsp = 2929; + public static final int HandleFriendScRsp = 2932; + public static final int GetPlayerDetailInfoCsReq = 2974; + public static final int SearchPlayerCsReq = 2935; + public static final int GetFriendLoginInfoCsReq = 2973; + public static final int ApplyFriendScRsp = 2992; + public static final int AddBlacklistCsReq = 2905; + public static final int GetPlatformPlayerInfoScRsp = 2998; + public static final int SetForbidOtherApplyFriendCsReq = 2964; + public static final int SetAssistCsReq = 2999; + public static final int SyncHandleFriendScNotify = 2906; + public static final int GetFriendRecommendListInfoScRsp = 2993; + public static final int ApplyFriendCsReq = 2914; + public static final int SyncDeleteFriendScNotify = 2942; + public static final int SetForbidOtherApplyFriendScRsp = 2953; + public static final int GetCurAssistCsReq = 2922; + public static final int HandleFriendCsReq = 2990; + public static final int GetFriendListInfoCsReq = 2907; + public static final int SetFriendRemarkNameCsReq = 2902; + public static final int TakeAssistRewardCsReq = 2984; + public static final int GetCurAssistScRsp = 2927; + public static final int GetFriendApplyListInfoScRsp = 2947; + public static final int DeleteBlacklistCsReq = 2985; + public static final int GetBoxingClubInfoCsReq = 4207; + public static final int GetBoxingClubInfoScRsp = 4225; + public static final int GiveUpBoxingClubChallengeScRsp = 4292; + public static final int BoxingClubRewardScNotify = 4287; + public static final int MatchBoxingClubOpponentCsReq = 4274; + public static final int MatchBoxingClubOpponentScRsp = 4229; + public static final int BoxingClubChallengeUpdateScNotify = 4290; + public static final int GiveUpBoxingClubChallengeCsReq = 4214; + public static final int StartBoxingClubBattleCsReq = 4283; + public static final int StartBoxingClubBattleScRsp = 4247; + public static final int GetPlayerReturnMultiDropInfoCsReq = 4629; + public static final int GetMultipleDropInfoCsReq = 4607; + public static final int MultipleDropInfoScNotify = 4674; + public static final int GetMultipleDropInfoScRsp = 4625; + public static final int GetPlayerReturnMultiDropInfoScRsp = 4683; + public static final int MultipleDropInfoNotify = 4647; + public static final int GetReplayTokenCsReq = 3507; + public static final int GetPlayerReplayInfoScRsp = 3529; + public static final int GetPlayerReplayInfoCsReq = 3574; + public static final int GetReplayTokenScRsp = 3525; + public static final int RollRogueBuffScRsp = 1808; + public static final int FinishAeonDialogueGroupCsReq = 1826; + public static final int EnterRogueMapRoomScRsp = 1878; + public static final int SelectRogueMiracleCsReq = 1834; + public static final int SyncRogueBuffSwapInfoScNotify = 1813; + public static final int SelectRogueBuffCsReq = 1890; + public static final int StartRogueScRsp = 1829; + public static final int GetRogueInfoCsReq = 1807; + public static final int GetRogueBuffEnhanceInfoScRsp = 1818; + public static final int GetRogueScoreRewardInfoScRsp = 1849; + public static final int SelectRogueBonusCsReq = 1864; + public static final int EnterRogueCsReq = 1883; + public static final int RemoveRogueMiracleScNotify = 1841; + public static final int SyncRogueAreaUnlockScNotify = 1860; + public static final int FinishRogueDialogueGroupScRsp = 1817; + public static final int TakeRogueEventHandbookRewardCsReq = 1886; + public static final int GetRogueBuffEnhanceInfoCsReq = 1816; + public static final int SyncRoguePickAvatarInfoScNotify = 1803; + public static final int TakeRogueScoreRewardCsReq = 1802; + public static final int ReplaceRogueMiracleDisplayScNotify = 1852; + public static final int SyncRogueGetItemScNotify = 1839; + public static final int UpdateRogueMiracleScNotify = 1882; + public static final int SyncRogueEventHandbookScNotify = 1820; + public static final int FinishRogueDialogueGroupCsReq = 1845; + public static final int SelectRogueMiracleScRsp = 1884; + public static final int SyncRogueMiracleScNotify = 1888; + public static final int SyncRogueAeonScNotify = 1821; + public static final int SyncRogueFinishScNotify = 1842; + public static final int RollRogueBuffCsReq = 1806; + public static final int SyncRogueBonusSelectInfoScNotify = 1879; + public static final int EnterRogueScRsp = 1847; + public static final int PickRogueAvatarCsReq = 1805; + public static final int GetRogueScoreRewardInfoCsReq = 1854; + public static final int ExchangeRogueRewardKeyCsReq = 1863; + public static final int GetRogueInitialScoreScRsp = 1898; + public static final int LeaveRogueScRsp = 1892; + public static final int TakeRogueMiracleHandbookRewardCsReq = 1869; + public static final int EnhanceRogueBuffCsReq = 1885; + public static final int GetRogueInitialScoreCsReq = 1862; + public static final int SelectRogueDialogueEventCsReq = 1881; + public static final int SyncRogueMiracleHandbookScNotify = 1858; + public static final int GetRogueAeonInfoCsReq = 1837; + public static final int EnhanceRogueBuffScRsp = 1870; + public static final int AddRogueBuffScNotify = 1856; + public static final int SyncRogueStatusScNotify = 1848; + public static final int GetRogueInfoScRsp = 1825; + public static final int ReforgeRogueBuffScRsp = 1875; + public static final int AddRogueMiracleScNotify = 1809; + public static final int GetRogueAeonInfoScRsp = 1831; + public static final int SwapRogueBuffScRsp = 1819; + public static final int ExchangeRogueRewardKeyScRsp = 1865; + public static final int TradeRogueMiracleScRsp = 1897; + public static final int SyncRogueAeonLevelUpRewardScNotify = 1857; + public static final int GetRogueDialogueEventDataScRsp = 1815; + public static final int QuitRogueCsReq = 1877; + public static final int SyncRogueBuffSelectInfoScNotify = 1887; + public static final int SelectRogueDialogueEventScRsp = 1810; + public static final int TakeRogueAeonLevelRewardScRsp = 1843; + public static final int GetRogueDialogueEventDataCsReq = 1850; + public static final int ReviveRogueAvatarCsReq = 1840; + public static final int ReforgeRogueBuffCsReq = 1872; + public static final int ReviveRogueAvatarScRsp = 1893; + public static final int TakeRogueEventHandbookRewardScRsp = 1844; + public static final int GetRogueTalentInfoScRsp = 1891; + public static final int SyncRogueVirtualItemInfoScNotify = 1866; + public static final int SyncRogueMapRoomScNotify = 1873; + public static final int StartRogueCsReq = 1874; + public static final int SyncRogueMiracleTradeInfoScNotify = 1894; + public static final int OpenRogueChestCsReq = 1868; + public static final int FinishAeonDialogueGroupScRsp = 1804; + public static final int EnableRogueTalentCsReq = 1823; + public static final int SyncRogueMiracleInfoScNotify = 1855; + public static final int SyncRogueDialogueEventDataScNotify = 1801; + public static final int SyncRogueBuffReforgeInfoScNotify = 1900; + public static final int SelectRogueBonusScRsp = 1853; + public static final int EnableRogueTalentScRsp = 1895; + public static final int OpenRogueChestScRsp = 1830; + public static final int TradeRogueMiracleCsReq = 1867; + public static final int RemoveRogueBuffScNotify = 1835; + public static final int SelectRogueBuffScRsp = 1832; + public static final int TakeRogueMiracleHandbookRewardScRsp = 1838; + public static final int GetRogueTalentInfoCsReq = 1851; + public static final int SyncRogueSeasonFinishScNotify = 1833; + public static final int LeaveRogueCsReq = 1814; + public static final int GetRogueHandbookDataCsReq = 1846; + public static final int QuitRogueScRsp = 1822; + public static final int SyncRogueRewardInfoScNotify = 1861; + public static final int PickRogueAvatarScRsp = 1880; + public static final int GetRogueHandbookDataScRsp = 1859; + public static final int EnterRogueMapRoomCsReq = 1812; + public static final int SyncRogueMiracleSelectInfoScNotify = 1836; + public static final int TakeRogueAeonLevelRewardCsReq = 1824; + public static final int SwapRogueBuffCsReq = 1871; + public static final int TakeRogueScoreRewardScRsp = 1896; + public static final int SyncRogueReviveInfoScNotify = 1899; + public static final int ChessRogueConfirmRollCsReq = 5514; + public static final int ChessRogueSelectBpCsReq = 5454; + public static final int ChessRogueUpdateLevelBaseInfoScNotify = 5563; + public static final int ChessRogueCellUpdateNotify = 5582; + public static final int ChessRogueUpdateActionPointScNotify = 5553; + public static final int SyncChessRogueMainStoryFinishScNotify = 5535; + public static final int ReforgeChessRogueBuffScRsp = 5461; + public static final int ReforgeChessRogueBuffCsReq = 5523; + public static final int EnhanceChessRogueBuffScRsp = 5539; + public static final int ChessRogueQueryAeonDimensionsCsReq = 5434; + public static final int EnhanceChessRogueBuffCsReq = 5572; + public static final int ChessRogueQueryScRsp = 5524; + public static final int ChessRogueStartScRsp = 5599; + public static final int ChessRogueUpdateAeonModifierValueScNotify = 5499; + public static final int ReplaceChessRogueMiracleDisplayScNotify = 5585; + public static final int GetChessRogueStoryAeonTalkInfoScRsp = 5531; + public static final int AddChessRogueBuffScNotify = 5546; + public static final int TradeChessRogueMiracleCsReq = 5573; + public static final int RepairChessRogueMiracleScRsp = 5438; + public static final int ChessRogueSelectBpScRsp = 5417; + public static final int ChessRogueEnterScRsp = 5594; + public static final int ChessRogueQuitScRsp = 5449; + public static final int ChessRogueChangeyAeonDimensionNotify = 5480; + public static final int AddChessRogueMiracleScNotify = 5476; + public static final int SyncChessRogueBuffSelectInfoScNotify = 5418; + public static final int SelectChessRogueMiracleCsReq = 5404; + public static final int SyncChessRogueMiracleRepairInfoScNotify = 5544; + public static final int ChessRogueUpdateAllowedSelectCellScNotify = 5568; + public static final int ChessRogueQuitCsReq = 5580; + public static final int ChessRogueGoAheadScRsp = 5567; + public static final int ChessRogueReRollDiceCsReq = 5528; + public static final int DropChessRogueBuffScRsp = 5508; + public static final int SelectChessRogueBuffScRsp = 5547; + public static final int SyncChessRogueMiracleInfoScNotify = 5463; + public static final int FinishChessRogueSubStoryCsReq = 5405; + public static final int ChessRogueGiveUpRollScRsp = 5490; + public static final int ChessRogueLayerAccountInfoNotify = 5478; + public static final int ChessRogueEnterCsReq = 5525; + public static final int ChessRogueEnterCellScRsp = 5526; + public static final int SelectChessRogueMiracleScRsp = 5460; + public static final int ChessRogueUpdateDiceInfoScNotify = 5552; + public static final int ChessRogueReRollDiceScRsp = 5527; + public static final int RemoveChessRogueBuffScNotify = 5458; + public static final int ChessRogueStartCsReq = 5550; + public static final int ChessRoguePickAvatarCsReq = 5481; + public static final int ChessRogueUpdateReviveInfoScNotify = 5414; + public static final int SyncChessRogueMiracleTradeInfoScNotify = 5428; + public static final int SelectChessRogueSubStoryScRsp = 5409; + public static final int ChessRogueGiveUpCsReq = 5432; + public static final int ChessRogueRollDiceScRsp = 5447; + public static final int DropChessRogueBuffCsReq = 5541; + public static final int FinishChessRogueSubStoryScRsp = 5598; + public static final int SelectChessRogueBonusCsReq = 5538; + public static final int ChessRogueQueryBpScRsp = 5484; + public static final int ChessRogueUpdateBoardScNotify = 5453; + public static final int GetChessRogueStoryInfoCsReq = 5593; + public static final int SelectChessRogueSubStoryCsReq = 5543; + public static final int ChessRogueGiveUpScRsp = 5542; + public static final int SyncChessRogueBuffDropInfoScNotify = 5486; + public static final int ChessRogueUpdateUnlockLevelScNotify = 5574; + public static final int ChessRogueQuestFinishNotify = 5492; + public static final int TradeChessRogueMiracleScRsp = 5557; + public static final int ChessRogueReviveAvatarScRsp = 5401; + public static final int ChessRogueEnterNextLayerScRsp = 5427; + public static final int ChessRogueEnterNextLayerCsReq = 5596; + public static final int ChessRogueQueryCsReq = 5416; + public static final int ChessRogueMoveCellNotify = 5590; + public static final int ChessRogueUpdateMoneyInfoScNotify = 5556; + public static final int RollChessRogueBuffCsReq = 5587; + public static final int ChessRogueQueryBpCsReq = 5471; + public static final int ChessRogueSelectCellScRsp = 5530; + public static final int EnterChessRogueAeonRoomScRsp = 5500; + public static final int SyncChessRogueBuffReforgeInfoScNotify = 5560; + public static final int ChessRogueFinishCurRoomNotify = 5511; + public static final int ChessRogueRollDiceCsReq = 5591; + public static final int SyncChessRogueBonusSelectInfoScNotify = 5467; + public static final int ChessRogueCheatRollScRsp = 5600; + public static final int GetChessRogueStoryAeonTalkInfoCsReq = 5518; + public static final int ChessRogueGiveUpRollCsReq = 5408; + public static final int GetChessRogueBuffEnhanceInfoCsReq = 5512; + public static final int RemoveChessRogueMiracleScNotify = 5555; + public static final int ChessRogueLeaveScRsp = 5450; + public static final int ChessRogueCheatRollCsReq = 5569; + public static final int SelectChessRogueBonusScRsp = 5588; + public static final int RollChessRogueBuffScRsp = 5436; + public static final int ChessRogueLeaveCsReq = 5554; + public static final int ChessRogueReviveAvatarCsReq = 5558; + public static final int ChessRogueConfirmRollScRsp = 5495; + public static final int EnterChessRogueAeonRoomCsReq = 5422; + public static final int GetChessRogueBuffEnhanceInfoScRsp = 5425; + public static final int ChessRoguePickAvatarScRsp = 5482; + public static final int RepairChessRogueMiracleCsReq = 5420; + public static final int UpdateChessRogueMiracleScNotify = 5444; + public static final int GetChessRogueStoryInfoScRsp = 5597; + public static final int ChessRogueGoAheadCsReq = 5505; + public static final int SelectChessRogueBuffCsReq = 5464; + public static final int SyncChessRogueMiracleSelectInfoScNotify = 5472; + public static final int ChessRogueQueryAeonDimensionsScRsp = 5494; + public static final int ChessRogueEnterCellCsReq = 5426; + public static final int ChessRogueSelectCellCsReq = 5579; + public static final int RogueModifierDelNotify = 5387; + public static final int RogueModifierUpdateNotify = 5392; + public static final int RogueModifierSelectCellScRsp = 5383; + public static final int RogueModifierAddNotify = 5374; + public static final int RogueModifierSelectCellCsReq = 5329; + public static final int GetUpdatedArchiveDataCsReq = 2374; + public static final int GetUpdatedArchiveDataScRsp = 2329; + public static final int GetArchiveDataScRsp = 2325; + public static final int GetArchiveDataCsReq = 2307; + public static final int GetChapterScRsp = 447; + public static final int WaypointShowNewCsNotify = 414; + public static final int TakeChapterRewardCsReq = 492; + public static final int GetWaypointScRsp = 425; + public static final int TakeChapterRewardScRsp = 487; + public static final int SetCurWaypointCsReq = 474; + public static final int GetWaypointCsReq = 407; + public static final int SetCurWaypointScRsp = 429; + public static final int GetChapterCsReq = 483; +} \ No newline at end of file diff --git a/src/main/java/emu/lunarcore/server/packet/CmdIdUtils.java b/src/main/java/emu/lunarcore/server/packet/CmdIdUtils.java new file mode 100644 index 0000000..0d4d9ae --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/CmdIdUtils.java @@ -0,0 +1,53 @@ +package emu.lunarcore.server.packet; + +import java.io.FileWriter; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.Map; +import java.util.TreeMap; +import java.util.stream.Collectors; + +import emu.lunarcore.GameConstants; +import emu.lunarcore.LunarRail; +import emu.lunarcore.util.JsonUtils; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; + +public class CmdIdUtils { + private static Int2ObjectMap opcodeMap; + + static { + opcodeMap = new Int2ObjectOpenHashMap<>(); + + Field[] fields = CmdId.class.getFields(); + + for (Field f : fields) { + if (f.getType().equals(int.class)) { + try { + opcodeMap.put(f.getInt(null), f.getName()); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + public static String getOpcodeName(int opcode) { + if (opcode <= 0) return "UNKNOWN"; + return opcodeMap.getOrDefault(opcode, "UNKNOWN"); + } + + public static void dumpPacketIds() { + try (FileWriter writer = new FileWriter("./PacketIds_" + GameConstants.VERSION + ".json")) { + // Create sorted tree map + Map packetIds = opcodeMap.int2ObjectEntrySet().stream() + .filter(e -> e.getIntKey() > 0) + .collect(Collectors.toMap(Int2ObjectMap.Entry::getIntKey, Int2ObjectMap.Entry::getValue, (k, v) -> v, TreeMap::new)); + // Write to file + writer.write(JsonUtils.encode(packetIds)); + LunarRail.getLogger().info("Dumped packet ids."); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/Opcodes.java b/src/main/java/emu/lunarcore/server/packet/Opcodes.java new file mode 100644 index 0000000..7d38113 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/Opcodes.java @@ -0,0 +1,13 @@ +package emu.lunarcore.server.packet; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface Opcodes { + /** Opcode for the packet/handler */ + int value(); + + /** HANDLER ONLY - will disable this handler from being registered */ + boolean disabled() default false; +} diff --git a/src/main/java/emu/lunarcore/server/packet/PacketHandler.java b/src/main/java/emu/lunarcore/server/packet/PacketHandler.java new file mode 100644 index 0000000..5b871d4 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/PacketHandler.java @@ -0,0 +1,9 @@ +package emu.lunarcore.server.packet; + +import emu.lunarcore.server.game.GameSession; + +public abstract class PacketHandler { + protected static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; + + public abstract void handle(GameSession session, byte[] header, byte[] data) throws Exception; +} diff --git a/src/main/java/emu/lunarcore/server/packet/SessionState.java b/src/main/java/emu/lunarcore/server/packet/SessionState.java new file mode 100644 index 0000000..9d6e2c2 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/SessionState.java @@ -0,0 +1,9 @@ +package emu.lunarcore.server.packet; + +public enum SessionState { + INACTIVE, + WAITING_FOR_TOKEN, + WAITING_FOR_LOGIN, + PICKING_CHARACTER, + ACTIVE +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/Handler.java b/src/main/java/emu/lunarcore/server/packet/recv/Handler.java new file mode 100644 index 0000000..2853453 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/Handler.java @@ -0,0 +1,16 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.NONE) +public class Handler extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + // Template - Do not delete! + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerAvatarExpUpCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerAvatarExpUpCsReq.java new file mode 100644 index 0000000..76cad4f --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerAvatarExpUpCsReq.java @@ -0,0 +1,29 @@ +package emu.lunarcore.server.packet.recv; + +import java.util.ArrayList; +import java.util.List; + +import emu.lunarcore.data.common.ItemParam; +import emu.lunarcore.proto.AvatarExpUpCsReqOuterClass.AvatarExpUpCsReq; +import emu.lunarcore.proto.ItemCostOuterClass.ItemCost; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.AvatarExpUpCsReq) +public class HandlerAvatarExpUpCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = AvatarExpUpCsReq.parseFrom(data); + + List items = new ArrayList<>(req.getItemCostList().getItemList().length()); + for (ItemCost cost : req.getItemCostList().getItemList()) { + items.add(new ItemParam(cost)); + } + + session.getServer().getInventoryService().levelUpAvatar(session.getPlayer(), req.getBaseAvatarId(), items); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerChangeLineupLeaderCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerChangeLineupLeaderCsReq.java new file mode 100644 index 0000000..3438b0a --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerChangeLineupLeaderCsReq.java @@ -0,0 +1,21 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.ChangeLineupLeaderCsReqOuterClass.ChangeLineupLeaderCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketChangeLineupLeaderScRsp; + +@Opcodes(CmdId.ChangeLineupLeaderCsReq) +public class HandlerChangeLineupLeaderCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = ChangeLineupLeaderCsReq.parseFrom(data); + + session.getPlayer().getLineupManager().changeLeader(req.getSlot()); + session.send(new PacketChangeLineupLeaderScRsp(req.getSlot())); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerDoGachaCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerDoGachaCsReq.java new file mode 100644 index 0000000..016c0ab --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerDoGachaCsReq.java @@ -0,0 +1,19 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.DoGachaCsReqOuterClass.DoGachaCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.DoGachaCsReq) +public class HandlerDoGachaCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = DoGachaCsReq.parseFrom(data); + + session.getServer().getGachaService().doPulls(session.getPlayer(), req.getGachaId(), req.getGachaNum()); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerDressAvatarCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerDressAvatarCsReq.java new file mode 100644 index 0000000..413c35e --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerDressAvatarCsReq.java @@ -0,0 +1,21 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.DressAvatarCsReqOuterClass.DressAvatarCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.DressAvatarCsReq) +public class HandlerDressAvatarCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = DressAvatarCsReq.parseFrom(data); + + session.getPlayer().getInventory().equipItem(req.getBaseAvatarId(), req.getEquipmentUniqueId()); + session.send(new BasePacket(CmdId.DressAvatarScRsp)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerDressRelicAvatarCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerDressRelicAvatarCsReq.java new file mode 100644 index 0000000..2fdb116 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerDressRelicAvatarCsReq.java @@ -0,0 +1,24 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.DressRelicAvatarCsReqOuterClass.DressRelicAvatarCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.DressRelicAvatarCsReq) +public class HandlerDressRelicAvatarCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = DressRelicAvatarCsReq.parseFrom(data); + + for (var param : req.getParamList()) { + session.getPlayer().getInventory().equipItem(req.getBaseAvatarId(), param.getRelicUniqueId()); + } + + session.send(new BasePacket(CmdId.DressRelicAvatarScRsp)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerEnterSceneCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerEnterSceneCsReq.java new file mode 100644 index 0000000..c2a71af --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerEnterSceneCsReq.java @@ -0,0 +1,20 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.EnterSceneCsReqOuterClass.EnterSceneCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.EnterSceneCsReq) +public class HandlerEnterSceneCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = EnterSceneCsReq.parseFrom(data); + + session.getPlayer().enterScene(req.getEntryId(), req.getTeleportId()); + session.send(CmdId.EnterSceneScRsp); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerEntityBindPropCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerEntityBindPropCsReq.java new file mode 100644 index 0000000..3af1152 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerEntityBindPropCsReq.java @@ -0,0 +1,17 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.EntityBindPropCsReq) +public class HandlerEntityBindPropCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + session.send(new BasePacket(CmdId.EntityBindPropScRsp)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerExpUpEquipmentCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerExpUpEquipmentCsReq.java new file mode 100644 index 0000000..d040df3 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerExpUpEquipmentCsReq.java @@ -0,0 +1,29 @@ +package emu.lunarcore.server.packet.recv; + +import java.util.ArrayList; +import java.util.List; + +import emu.lunarcore.data.common.ItemParam; +import emu.lunarcore.proto.ExpUpEquipmentCsReqOuterClass.ExpUpEquipmentCsReq; +import emu.lunarcore.proto.ItemCostOuterClass.ItemCost; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.ExpUpEquipmentCsReq) +public class HandlerExpUpEquipmentCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = ExpUpEquipmentCsReq.parseFrom(data); + + List items = new ArrayList<>(req.getItemCostList().getItemList().length()); + for (ItemCost cost : req.getItemCostList().getItemList()) { + items.add(new ItemParam(cost)); + } + + session.getServer().getInventoryService().levelUpEquipment(session.getPlayer(), req.getEquipmentUniqueId(), items); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerExpUpRelicCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerExpUpRelicCsReq.java new file mode 100644 index 0000000..7516b38 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerExpUpRelicCsReq.java @@ -0,0 +1,29 @@ +package emu.lunarcore.server.packet.recv; + +import java.util.ArrayList; +import java.util.List; + +import emu.lunarcore.data.common.ItemParam; +import emu.lunarcore.proto.ExpUpRelicCsReqOuterClass.ExpUpRelicCsReq; +import emu.lunarcore.proto.ItemCostOuterClass.ItemCost; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.ExpUpRelicCsReq) +public class HandlerExpUpRelicCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = ExpUpRelicCsReq.parseFrom(data); + + List items = new ArrayList<>(req.getItemCostList().getItemList().length()); + for (ItemCost cost : req.getItemCostList().getItemList()) { + items.add(new ItemParam(cost)); + } + + session.getServer().getInventoryService().levelUpRelic(session.getPlayer(), req.getRelicUniqueId(), items); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetAllLineupDataCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetAllLineupDataCsReq.java new file mode 100644 index 0000000..5297425 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetAllLineupDataCsReq.java @@ -0,0 +1,17 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketGetAllLineupDataScRsp; + +@Opcodes(CmdId.GetAllLineupDataCsReq) +public class HandlerGetAllLineupDataCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + session.send(new PacketGetAllLineupDataScRsp(session)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetAssistHistoryCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetAssistHistoryCsReq.java new file mode 100644 index 0000000..98e88d9 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetAssistHistoryCsReq.java @@ -0,0 +1,16 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.GetAssistHistoryCsReq) +public class HandlerGetAssistHistoryCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + session.send(CmdId.GetAssistHistoryScRsp); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetAvatarDataCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetAvatarDataCsReq.java new file mode 100644 index 0000000..3eb4b56 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetAvatarDataCsReq.java @@ -0,0 +1,17 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketGetAvatarDataScRsp; + +@Opcodes(CmdId.GetAvatarDataCsReq) +public class HandlerGetAvatarDataCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + session.send(new PacketGetAvatarDataScRsp(session)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetBagCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetBagCsReq.java new file mode 100644 index 0000000..79d8a42 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetBagCsReq.java @@ -0,0 +1,17 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketGetBagScRsp; + +@Opcodes(CmdId.GetBagCsReq) +public class HandlerGetBagCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + session.send(new PacketGetBagScRsp(session)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetBasicInfoCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetBasicInfoCsReq.java new file mode 100644 index 0000000..5891dfc --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetBasicInfoCsReq.java @@ -0,0 +1,17 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketGetBasicInfoScRsp; + +@Opcodes(CmdId.GetBasicInfoCsReq) +public class HandlerGetBasicInfoCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + session.send(new PacketGetBasicInfoScRsp(session)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetChatEmojiListCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetChatEmojiListCsReq.java new file mode 100644 index 0000000..4220b20 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetChatEmojiListCsReq.java @@ -0,0 +1,16 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.GetChatEmojiListCsReq) +public class HandlerGetChatEmojiListCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + session.send(CmdId.GetChatEmojiListScRsp); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetCurLineupDataCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetCurLineupDataCsReq.java new file mode 100644 index 0000000..c1d7c8a --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetCurLineupDataCsReq.java @@ -0,0 +1,17 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketGetCurLineupDataScRsp; + +@Opcodes(CmdId.GetCurLineupDataCsReq) +public class HandlerGetCurLineupDataCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + session.send(new PacketGetCurLineupDataScRsp(session)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetCurSceneInfoCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetCurSceneInfoCsReq.java new file mode 100644 index 0000000..63d6875 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetCurSceneInfoCsReq.java @@ -0,0 +1,17 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketGetCurSceneInfoScRsp; + +@Opcodes(CmdId.GetCurSceneInfoCsReq) +public class HandlerGetCurSceneInfoCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + session.send(new PacketGetCurSceneInfoScRsp(session)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetFriendApplyListInfoCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetFriendApplyListInfoCsReq.java new file mode 100644 index 0000000..e640603 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetFriendApplyListInfoCsReq.java @@ -0,0 +1,16 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.GetFriendApplyListInfoCsReq) +public class HandlerGetFriendApplyListInfoCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + session.send(CmdId.GetFriendApplyListInfoScRsp); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetFriendListInfoCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetFriendListInfoCsReq.java new file mode 100644 index 0000000..6cb928c --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetFriendListInfoCsReq.java @@ -0,0 +1,17 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketGetFriendListInfoScRsp; + +@Opcodes(CmdId.GetFriendListInfoCsReq) +public class HandlerGetFriendListInfoCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + session.send(new PacketGetFriendListInfoScRsp()); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetGachaInfoCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetGachaInfoCsReq.java new file mode 100644 index 0000000..ba92c86 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetGachaInfoCsReq.java @@ -0,0 +1,17 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketGetGachaInfoScRsp; + +@Opcodes(CmdId.GetGachaInfoCsReq) +public class HandlerGetGachaInfoCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + session.send(new PacketGetGachaInfoScRsp(session)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetHeroBasicTypeInfoCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetHeroBasicTypeInfoCsReq.java new file mode 100644 index 0000000..cfb4acb --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetHeroBasicTypeInfoCsReq.java @@ -0,0 +1,17 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketGetHeroBasicTypeInfoScRsp; + +@Opcodes(CmdId.GetHeroBasicTypeInfoCsReq) +public class HandlerGetHeroBasicTypeInfoCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + session.send(new PacketGetHeroBasicTypeInfoScRsp()); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetMailCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetMailCsReq.java new file mode 100644 index 0000000..753c65f --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetMailCsReq.java @@ -0,0 +1,16 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.GetMailCsReq) +public class HandlerGetMailCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + session.send(CmdId.GetMailScRsp); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetMissionStatusCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetMissionStatusCsReq.java new file mode 100644 index 0000000..6d2bcfc --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetMissionStatusCsReq.java @@ -0,0 +1,20 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.GetMissionStatusCsReqOuterClass.GetMissionStatusCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketGetMissionStatusScRsp; + +@Opcodes(CmdId.GetMissionStatusCsReq) +public class HandlerGetMissionStatusCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = GetMissionStatusCsReq.parseFrom(data); + + session.send(new PacketGetMissionStatusScRsp(req)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetPlayerDetailInfoCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetPlayerDetailInfoCsReq.java new file mode 100644 index 0000000..8ba94b1 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetPlayerDetailInfoCsReq.java @@ -0,0 +1,20 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.GetPlayerDetailInfoCsReqOuterClass.GetPlayerDetailInfoCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketGetPlayerDetailInfoScRsp; + +@Opcodes(CmdId.GetPlayerDetailInfoCsReq) +public class HandlerGetPlayerDetailInfoCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = GetPlayerDetailInfoCsReq.parseFrom(data); + + session.send(new PacketGetPlayerDetailInfoScRsp()); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetSceneMapInfoCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetSceneMapInfoCsReq.java new file mode 100644 index 0000000..3b8b600 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetSceneMapInfoCsReq.java @@ -0,0 +1,20 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.GetSceneMapInfoCsReqOuterClass.GetSceneMapInfoCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketGetSceneMapInfoScRsp; + +@Opcodes(CmdId.GetSceneMapInfoCsReq) +public class HandlerGetSceneMapInfoCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = GetSceneMapInfoCsReq.parseFrom(data); + + session.send(new PacketGetSceneMapInfoScRsp(req.getEntryIdList())); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetShopListCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetShopListCsReq.java new file mode 100644 index 0000000..4894fb4 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetShopListCsReq.java @@ -0,0 +1,20 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.GetShopListCsReqOuterClass.GetShopListCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketGetShopListScRsp; + +@Opcodes(CmdId.GetShopListCsReq) +public class HandlerGetShopListCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = GetShopListCsReq.parseFrom(data); + + session.send(new PacketGetShopListScRsp(req.getShopType())); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerJoinLineupCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerJoinLineupCsReq.java new file mode 100644 index 0000000..4197615 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerJoinLineupCsReq.java @@ -0,0 +1,21 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.JoinLineupCsReqOuterClass.JoinLineupCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.JoinLineupCsReq) +public class HandlerJoinLineupCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = JoinLineupCsReq.parseFrom(data); + + session.getPlayer().getLineupManager().joinLineup(req.getIndex(), req.getSlot(), req.getBaseAvatarId()); + session.send(new BasePacket(CmdId.JoinLineupScRsp)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerLockEquipmentCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerLockEquipmentCsReq.java new file mode 100644 index 0000000..64803d0 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerLockEquipmentCsReq.java @@ -0,0 +1,21 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.LockEquipmentCsReqOuterClass.LockEquipmentCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.LockEquipmentCsReq) +public class HandlerLockEquipmentCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = LockEquipmentCsReq.parseFrom(data); + + session.getServer().getInventoryService().lockEquip(session.getPlayer(), req.getEquipmentUniqueId(), req.getIsProtected()); + session.send(new BasePacket(CmdId.LockEquipmentScRsp)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerLockRelicCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerLockRelicCsReq.java new file mode 100644 index 0000000..e28c47a --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerLockRelicCsReq.java @@ -0,0 +1,21 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.LockRelicCsReqOuterClass.LockRelicCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.LockRelicCsReq) +public class HandlerLockRelicCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = LockRelicCsReq.parseFrom(data); + + session.getServer().getInventoryService().lockEquip(session.getPlayer(), req.getRelicUniqueId(), req.getIsProtected()); + session.send(new BasePacket(CmdId.LockRelicScRsp)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerPVEBattleResultCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPVEBattleResultCsReq.java new file mode 100644 index 0000000..c121a88 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPVEBattleResultCsReq.java @@ -0,0 +1,26 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.PVEBattleResultCsReqOuterClass.PVEBattleResultCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketPVEBattleResultScRsp; + +@Opcodes(CmdId.PVEBattleResultCsReq) +public class HandlerPVEBattleResultCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = PVEBattleResultCsReq.parseFrom(data); + + session.getServer().getBattleService().onBattleResult( + session.getPlayer(), + req.getEndStatus(), + req.getStt().getBattleAvatarList() + ); + + session.send(new PacketPVEBattleResultScRsp(req)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerGetTokenCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerGetTokenCsReq.java new file mode 100644 index 0000000..89962f9 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerGetTokenCsReq.java @@ -0,0 +1,53 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.LunarRail; +import emu.lunarcore.game.account.Account; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.proto.PlayerGetTokenCsReqOuterClass.PlayerGetTokenCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.SessionState; +import emu.lunarcore.server.packet.send.PacketPlayerGetTokenScRsp; + +@Opcodes(CmdId.PlayerGetTokenCsReq) +public class HandlerPlayerGetTokenCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + // Parse packet data + var req = PlayerGetTokenCsReq.parseFrom(data); + + // Authenticate + Account account = LunarRail.getAccountDatabase().getObjectByField(Account.class, "_id", req.getUid()); + if (account == null || !account.getComboToken().equals(req.getToken())) { + return; + } + + // Set account object for session + session.setAccount(account); + + // Get player from database, if it doesnt exist, we create it + Player player = LunarRail.getGameDatabase().getObjectByField(Player.class, "accountUid", account.getUid()); + + if (player == null) { + player = new Player(session); + LunarRail.getGameDatabase().save(player); + } + + // Set player object for session + session.setPlayer(player); + + // Load player data from database + player.onLogin(); + + // Set session state + session.setUseSecretKey(true); + session.setState(SessionState.WAITING_FOR_LOGIN); + + // Finish and send packet + session.send(new PacketPlayerGetTokenScRsp(session)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerHeartBeatCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerHeartBeatCsReq.java new file mode 100644 index 0000000..505aacb --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerHeartBeatCsReq.java @@ -0,0 +1,22 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.PlayerHeartbeatCsReqOuterClass.PlayerHeartbeatCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketPlayerHeartBeatScRsp; + +@Opcodes(CmdId.PlayerHeartBeatCsReq) +public class HandlerPlayerHeartBeatCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + // Parse req data + var req = PlayerHeartbeatCsReq.parseFrom(data); + + // Send heartbeat response back + session.send(new PacketPlayerHeartBeatScRsp(req.getClientTimeMs())); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerLoginCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerLoginCsReq.java new file mode 100644 index 0000000..eb57e45 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerLoginCsReq.java @@ -0,0 +1,22 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.SessionState; +import emu.lunarcore.server.packet.send.PacketPlayerLoginScRsp; + +@Opcodes(CmdId.PlayerLoginCsReq) +public class HandlerPlayerLoginCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + // Set session flag + session.setState(SessionState.ACTIVE); + + // Send + session.send(new PacketPlayerLoginScRsp(session)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerLoginFinishCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerLoginFinishCsReq.java new file mode 100644 index 0000000..2348805 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerLoginFinishCsReq.java @@ -0,0 +1,17 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.PlayerLoginFinishCsReq) +public class HandlerPlayerLoginFinishCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + session.send(new BasePacket(CmdId.PlayerLoginFinishScRsp)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerLogoutCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerLogoutCsReq.java new file mode 100644 index 0000000..7cdb966 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPlayerLogoutCsReq.java @@ -0,0 +1,16 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.PlayerLogoutCsReq) +public class HandlerPlayerLogoutCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + session.close(); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerPromoteAvatarCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPromoteAvatarCsReq.java new file mode 100644 index 0000000..351ab4a --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPromoteAvatarCsReq.java @@ -0,0 +1,19 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.PromoteAvatarCsReqOuterClass.PromoteAvatarCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.PromoteAvatarCsReq) +public class HandlerPromoteAvatarCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = PromoteAvatarCsReq.parseFrom(data); + + session.getServer().getInventoryService().promoteAvatar(session.getPlayer(), req.getBaseAvatarId()); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerPromoteEquipmentCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPromoteEquipmentCsReq.java new file mode 100644 index 0000000..1d38946 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerPromoteEquipmentCsReq.java @@ -0,0 +1,19 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.PromoteEquipmentCsReqOuterClass.PromoteEquipmentCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.PromoteEquipmentCsReq) +public class HandlerPromoteEquipmentCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = PromoteEquipmentCsReq.parseFrom(data); + + session.getServer().getInventoryService().promoteEquipment(session.getPlayer(), req.getEquipmentUniqueId()); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerQuitLineupCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerQuitLineupCsReq.java new file mode 100644 index 0000000..b71863e --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerQuitLineupCsReq.java @@ -0,0 +1,21 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.QuitLineupCsReqOuterClass.QuitLineupCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.QuitLineupCsReq) +public class HandlerQuitLineupCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = QuitLineupCsReq.parseFrom(data); + + session.getPlayer().getLineupManager().quitLineup(req.getIndex(), req.getBaseAvatarId()); + session.send(new BasePacket(CmdId.QuitLineupScRsp)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerRankUpAvatarCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerRankUpAvatarCsReq.java new file mode 100644 index 0000000..d0342ca --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerRankUpAvatarCsReq.java @@ -0,0 +1,19 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.RankUpAvatarCsReqOuterClass.RankUpAvatarCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.RankUpAvatarCsReq) +public class HandlerRankUpAvatarCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = RankUpAvatarCsReq.parseFrom(data); + + session.getServer().getInventoryService().rankUpAvatar(session.getPlayer(), req.getBaseAvatarId()); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerRankUpEquipmentCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerRankUpEquipmentCsReq.java new file mode 100644 index 0000000..13d7a9c --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerRankUpEquipmentCsReq.java @@ -0,0 +1,29 @@ +package emu.lunarcore.server.packet.recv; + +import java.util.ArrayList; +import java.util.List; + +import emu.lunarcore.data.common.ItemParam; +import emu.lunarcore.proto.ItemCostOuterClass.ItemCost; +import emu.lunarcore.proto.RankUpEquipmentCsReqOuterClass.RankUpEquipmentCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.RankUpEquipmentCsReq) +public class HandlerRankUpEquipmentCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = RankUpEquipmentCsReq.parseFrom(data); + + List items = new ArrayList<>(req.getItemCostList().getItemList().length()); + for (ItemCost cost : req.getItemCostList().getItemList()) { + items.add(new ItemParam(cost)); + } + + session.getServer().getInventoryService().rankUpEquipment(session.getPlayer(), req.getEquipmentUniqueId(), items); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerReplaceLineupCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerReplaceLineupCsReq.java new file mode 100644 index 0000000..586bf81 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerReplaceLineupCsReq.java @@ -0,0 +1,30 @@ +package emu.lunarcore.server.packet.recv; + +import java.util.ArrayList; +import java.util.List; + +import emu.lunarcore.proto.LineupSlotDataOuterClass.LineupSlotData; +import emu.lunarcore.proto.ReplaceLineupCsReqOuterClass.ReplaceLineupCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.ReplaceLineupCsReq) +public class HandlerReplaceLineupCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = ReplaceLineupCsReq.parseFrom(data); + + List lineupList = new ArrayList<>(req.getSlots().length()); + for (LineupSlotData slot : req.getSlots()) { + lineupList.add(slot.getId()); + } + + session.getPlayer().getLineupManager().replaceLineup(req.getIndex(), lineupList); + session.send(new BasePacket(CmdId.ReplaceLineupScRsp)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerSceneCastSkillCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSceneCastSkillCsReq.java new file mode 100644 index 0000000..bf97eaa --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSceneCastSkillCsReq.java @@ -0,0 +1,24 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.SceneCastSkillCsReqOuterClass.SceneCastSkillCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketSceneCastSkillScRsp; + +@Opcodes(CmdId.SceneCastSkillCsReq) +public class HandlerSceneCastSkillCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = SceneCastSkillCsReq.parseFrom(data); + + if (req.hasAttackedEntityIdList()) { + session.getServer().getBattleService().onBattleStart(session.getPlayer(), req.getAttackerId(), req.getAttackedEntityIdList()); + } else { + session.send(new PacketSceneCastSkillScRsp()); + } + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerSceneEntityMoveCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSceneEntityMoveCsReq.java new file mode 100644 index 0000000..b9ebf08 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSceneEntityMoveCsReq.java @@ -0,0 +1,27 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.SceneEntityMoveCsReqOuterClass.SceneEntityMoveCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.SceneEntityMoveCsReq) +public class HandlerSceneEntityMoveCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = SceneEntityMoveCsReq.parseFrom(data); + + for (var entityMotion : req.getEntityMotionList()) { + if (session.getPlayer().getScene().getAvatarEntityIds().contains(entityMotion.getEntityId())) { + var vec = entityMotion.getMotion().getPos(); + session.getPlayer().getPos().set(vec.getX(), vec.getY(), vec.getZ()); + } + } + + session.send(new BasePacket(CmdId.SceneEntityMoveScRsp)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerSellItemCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSellItemCsReq.java new file mode 100644 index 0000000..f686ec0 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSellItemCsReq.java @@ -0,0 +1,29 @@ +package emu.lunarcore.server.packet.recv; + +import java.util.ArrayList; +import java.util.List; + +import emu.lunarcore.data.common.ItemParam; +import emu.lunarcore.proto.ItemCostOuterClass.ItemCost; +import emu.lunarcore.proto.SellItemCsReqOuterClass.SellItemCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.SellItemCsReq) +public class HandlerSellItemCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = SellItemCsReq.parseFrom(data); + + List items = new ArrayList<>(req.getItemCostList().getItemList().length()); + for (ItemCost cost : req.getItemCostList().getItemList()) { + items.add(new ItemParam(cost)); + } + + session.getServer().getInventoryService().sellItems(session.getPlayer(), items); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerSendMsgCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSendMsgCsReq.java new file mode 100644 index 0000000..285ed59 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSendMsgCsReq.java @@ -0,0 +1,29 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.MsgTypeOuterClass.MsgType; +import emu.lunarcore.proto.SendMsgCsReqOuterClass.SendMsgCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.SendMsgCsReq) +public class HandlerSendMsgCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = SendMsgCsReq.parseFrom(data); + + for (int targetUid : req.getToUid()) { + if (req.getMsgType() == MsgType.MSG_TYPE_CUSTOM_TEXT) { + session.getServer().getChatService().sendPrivChat(session.getPlayer(), targetUid, req.getText()); + } else if (req.getMsgType() == MsgType.MSG_TYPE_EMOJI) { + session.getServer().getChatService().sendPrivChat(session.getPlayer(), targetUid, req.getEmote()); + } + } + + session.send(new BasePacket(CmdId.SendMsgScRsp)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerSetGameplayBirthdayCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSetGameplayBirthdayCsReq.java new file mode 100644 index 0000000..5d9a24a --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSetGameplayBirthdayCsReq.java @@ -0,0 +1,25 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.SetGameplayBirthdayCsReqOuterClass.SetGameplayBirthdayCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketSetGameplayBirthdayScRsp; + +@Opcodes(CmdId.SetGameplayBirthdayCsReq) +public class HandlerSetGameplayBirthdayCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = SetGameplayBirthdayCsReq.parseFrom(data); + + int birthday = session.getPlayer().setBirthday(req.getBirthday()); + if (birthday != 0) { + session.send(new PacketSetGameplayBirthdayScRsp(birthday)); + } else { + session.send(new PacketSetGameplayBirthdayScRsp()); + } + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerSetLineupNameCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSetLineupNameCsReq.java new file mode 100644 index 0000000..cbe7e14 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSetLineupNameCsReq.java @@ -0,0 +1,21 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.SetLineupNameCsReqOuterClass.SetLineupNameCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketSetLineupNameScRsp; + +@Opcodes(CmdId.SetLineupNameCsReq) +public class HandlerSetLineupNameCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = SetLineupNameCsReq.parseFrom(data); + + var success = session.getPlayer().getLineupManager().changeLineupName(req.getIndex(), req.getName()); + session.send(new PacketSetLineupNameScRsp(success ? req.getName() : null)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerSetNicknameCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSetNicknameCsReq.java new file mode 100644 index 0000000..6bfca1c --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSetNicknameCsReq.java @@ -0,0 +1,23 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.SetNicknameCsReqOuterClass.SetNicknameCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.SetNicknameCsReq) +public class HandlerSetNicknameCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = SetNicknameCsReq.parseFrom(data); + + if (req.getNickname() != null) { + session.getPlayer().setNickname(req.getNickname()); + } + + session.send(CmdId.SetNicknameScRsp); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerSwapLineupCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSwapLineupCsReq.java new file mode 100644 index 0000000..5a474df --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSwapLineupCsReq.java @@ -0,0 +1,21 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.SwapLineupCsReqOuterClass.SwapLineupCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.SwapLineupCsReq) +public class HandlerSwapLineupCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = SwapLineupCsReq.parseFrom(data); + + session.getPlayer().getLineupManager().swapLineup(req.getIndex(), req.getSrcSlot(), req.getDstSlot()); + session.send(new BasePacket(CmdId.SwapLineupScRsp)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerSwitchLineupIndexCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSwitchLineupIndexCsReq.java new file mode 100644 index 0000000..305f6fa --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSwitchLineupIndexCsReq.java @@ -0,0 +1,21 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.SwitchLineupIndexCsReqOuterClass.SwitchLineupIndexCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketSwitchLineupIndexScRsp; + +@Opcodes(CmdId.SwitchLineupIndexCsReq) +public class HandlerSwitchLineupIndexCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = SwitchLineupIndexCsReq.parseFrom(data); + + session.getPlayer().getLineupManager().switchLineup(req.getIndex()); + session.send(new PacketSwitchLineupIndexScRsp(session.getPlayer().getLineupManager().getCurrentLineup())); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerSyncClientResVersionCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSyncClientResVersionCsReq.java new file mode 100644 index 0000000..6484f3d --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSyncClientResVersionCsReq.java @@ -0,0 +1,20 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.SyncClientResVersionCsReqOuterClass.SyncClientResVersionCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketSyncClientResVersionScRsp; + +@Opcodes(CmdId.SyncClientResVersionCsReq) +public class HandlerSyncClientResVersionCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = SyncClientResVersionCsReq.parseFrom(data); + + session.send(new PacketSyncClientResVersionScRsp(req.getClientResVersion())); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerTakeOffEquipmentCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerTakeOffEquipmentCsReq.java new file mode 100644 index 0000000..e4788ba --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerTakeOffEquipmentCsReq.java @@ -0,0 +1,22 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.GameConstants; +import emu.lunarcore.proto.TakeOffEquipmentCsReqOuterClass.TakeOffEquipmentCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.TakeOffEquipmentCsReq) +public class HandlerTakeOffEquipmentCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = TakeOffEquipmentCsReq.parseFrom(data); + + session.getPlayer().getInventory().unequipItem(req.getBaseAvatarId(), GameConstants.EQUIPMENT_SLOT_ID); + session.send(new BasePacket(CmdId.TakeOffEquipmentScRsp)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerTakeOffRelicCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerTakeOffRelicCsReq.java new file mode 100644 index 0000000..ead0912 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerTakeOffRelicCsReq.java @@ -0,0 +1,24 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.TakeOffRelicCsReqOuterClass.TakeOffRelicCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.TakeOffRelicCsReq) +public class HandlerTakeOffRelicCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = TakeOffRelicCsReq.parseFrom(data); + + for (int slot : req.getSlotList()) { + session.getPlayer().getInventory().unequipItem(req.getBaseAvatarId(), slot); + } + + session.send(new BasePacket(CmdId.TakeOffRelicScRsp)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerUnlockSkilltreeCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerUnlockSkilltreeCsReq.java new file mode 100644 index 0000000..1e34473 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerUnlockSkilltreeCsReq.java @@ -0,0 +1,19 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.UnlockSkilltreeCsReqOuterClass.UnlockSkilltreeCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.UnlockSkilltreeCsReq) +public class HandlerUnlockSkilltreeCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = UnlockSkilltreeCsReq.parseFrom(data); + + session.getServer().getInventoryService().unlockSkillTreeAvatar(session.getPlayer(), req.getPointId()); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/Packet.java b/src/main/java/emu/lunarcore/server/packet/send/Packet.java new file mode 100644 index 0000000..67ceb61 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/Packet.java @@ -0,0 +1,13 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class Packet extends BasePacket { + + public Packet() { + super(CmdId.NONE); + + // Template - Do not delete! + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketAvatarExpUpScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketAvatarExpUpScRsp.java new file mode 100644 index 0000000..02f0e4e --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketAvatarExpUpScRsp.java @@ -0,0 +1,31 @@ +package emu.lunarcore.server.packet.send; + +import java.util.Collection; + +import emu.lunarcore.game.inventory.GameItem; +import emu.lunarcore.proto.AvatarExpUpScRspOuterClass.AvatarExpUpScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketAvatarExpUpScRsp extends BasePacket { + + public PacketAvatarExpUpScRsp(Collection returnItems) { + super(CmdId.AvatarExpUpScRsp); + + var data = AvatarExpUpScRsp.newInstance(); + + for (GameItem item : returnItems) { + data.addReturnItemList(item.toPileProto()); + } + + this.setData(data); + } + + public PacketAvatarExpUpScRsp() { + super(CmdId.AvatarExpUpScRsp); + + var data = AvatarExpUpScRsp.newInstance().setRetcode(1); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketChangeLineupLeaderScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketChangeLineupLeaderScRsp.java new file mode 100644 index 0000000..373bd7a --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketChangeLineupLeaderScRsp.java @@ -0,0 +1,17 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.proto.ChangeLineupLeaderScRspOuterClass.ChangeLineupLeaderScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketChangeLineupLeaderScRsp extends BasePacket { + + public PacketChangeLineupLeaderScRsp(int slot) { + super(CmdId.ChangeLineupLeaderScRsp); + + var data = ChangeLineupLeaderScRsp.newInstance() + .setSlot(slot); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketDoGachaScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketDoGachaScRsp.java new file mode 100644 index 0000000..1eaeb0e --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketDoGachaScRsp.java @@ -0,0 +1,32 @@ +package emu.lunarcore.server.packet.send; + +import java.util.List; + +import emu.lunarcore.game.gacha.GachaBanner; +import emu.lunarcore.proto.DoGachaScRspOuterClass.DoGachaScRsp; +import emu.lunarcore.proto.GachaItemOuterClass.GachaItem; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketDoGachaScRsp extends BasePacket { + + public PacketDoGachaScRsp() { + super(CmdId.DoGachaScRsp); + + this.setData(DoGachaScRsp.newInstance().setRetcode(1)); + } + + public PacketDoGachaScRsp(GachaBanner banner, int num, List items) { + super(CmdId.DoGachaScRsp); + + var data = DoGachaScRsp.newInstance() + .setGachaNum(num) + .setGachaId(banner.getId()); + + for (GachaItem item : items) { + data.addGachaItemList(item); + } + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketEnterSceneByServerScNotify.java b/src/main/java/emu/lunarcore/server/packet/send/PacketEnterSceneByServerScNotify.java new file mode 100644 index 0000000..220e1bd --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketEnterSceneByServerScNotify.java @@ -0,0 +1,19 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.game.player.Player; +import emu.lunarcore.proto.EnterSceneByServerScNotifyOuterClass.EnterSceneByServerScNotify; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketEnterSceneByServerScNotify extends BasePacket { + + public PacketEnterSceneByServerScNotify(Player player) { + super(CmdId.EnterSceneByServerScNotify); + + var data = EnterSceneByServerScNotify.newInstance() + .setLineup(player.getLineupManager().getCurrentLineup().toProto()) + .setScene(player.getScene().toProto()); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketExpUpEquipmentScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketExpUpEquipmentScRsp.java new file mode 100644 index 0000000..19c5f42 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketExpUpEquipmentScRsp.java @@ -0,0 +1,31 @@ +package emu.lunarcore.server.packet.send; + +import java.util.Collection; + +import emu.lunarcore.game.inventory.GameItem; +import emu.lunarcore.proto.ExpUpEquipmentScRspOuterClass.ExpUpEquipmentScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketExpUpEquipmentScRsp extends BasePacket { + + public PacketExpUpEquipmentScRsp(Collection returnItems) { + super(CmdId.ExpUpEquipmentScRsp); + + var data = ExpUpEquipmentScRsp.newInstance(); + + for (GameItem item : returnItems) { + data.addReturnItemList(item.toPileProto()); + } + + this.setData(data); + } + + public PacketExpUpEquipmentScRsp() { + super(CmdId.ExpUpEquipmentScRsp); + + var data = ExpUpEquipmentScRsp.newInstance().setRetcode(1); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketExpUpRelicScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketExpUpRelicScRsp.java new file mode 100644 index 0000000..88b1e27 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketExpUpRelicScRsp.java @@ -0,0 +1,31 @@ +package emu.lunarcore.server.packet.send; + +import java.util.Collection; + +import emu.lunarcore.game.inventory.GameItem; +import emu.lunarcore.proto.ExpUpRelicScRspOuterClass.ExpUpRelicScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketExpUpRelicScRsp extends BasePacket { + + public PacketExpUpRelicScRsp(Collection returnItems) { + super(CmdId.ExpUpRelicScRsp); + + var data = ExpUpRelicScRsp.newInstance(); + + for (GameItem item : returnItems) { + data.addReturnItemList(item.toPileProto()); + } + + this.setData(data); + } + + public PacketExpUpRelicScRsp() { + super(CmdId.ExpUpRelicScRsp); + + var data = ExpUpRelicScRsp.newInstance().setRetcode(1); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketGetAllLineupDataScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketGetAllLineupDataScRsp.java new file mode 100644 index 0000000..32ecd4b --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketGetAllLineupDataScRsp.java @@ -0,0 +1,26 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.game.player.PlayerLineup; +import emu.lunarcore.game.player.LineupManager; +import emu.lunarcore.proto.GetAllLineupDataScRspOuterClass.GetAllLineupDataScRsp; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketGetAllLineupDataScRsp extends BasePacket { + + public PacketGetAllLineupDataScRsp(GameSession session) { + super(CmdId.GetAllLineupDataScRsp); + + LineupManager lineupManager = session.getPlayer().getLineupManager(); + + var data = GetAllLineupDataScRsp.newInstance() + .setCurIndex(session.getPlayer().getLineupManager().getCurrentIndex()); + + for (PlayerLineup lineup : lineupManager.getLineups()) { + data.addLineupList(lineup.toProto()); + } + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketGetAvatarDataScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketGetAvatarDataScRsp.java new file mode 100644 index 0000000..9494f2f --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketGetAvatarDataScRsp.java @@ -0,0 +1,23 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.game.avatar.GameAvatar; +import emu.lunarcore.proto.GetAvatarDataScRspOuterClass.GetAvatarDataScRsp; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketGetAvatarDataScRsp extends BasePacket { + + public PacketGetAvatarDataScRsp(GameSession session) { + super(CmdId.GetAvatarDataScRsp); + + var data = GetAvatarDataScRsp.newInstance() + .setIsGetAll(true); + + for (GameAvatar avatar : session.getPlayer().getAvatars()) { + data.addAvatarList(avatar.toProto()); + } + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketGetBagScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketGetBagScRsp.java new file mode 100644 index 0000000..b7c1c9f --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketGetBagScRsp.java @@ -0,0 +1,35 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.game.inventory.GameItem; +import emu.lunarcore.game.inventory.InventoryTab; +import emu.lunarcore.game.inventory.ItemMainType; +import emu.lunarcore.proto.GetBagScRspOuterClass.GetBagScRsp; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketGetBagScRsp extends BasePacket { + + public PacketGetBagScRsp(GameSession session) { + super(CmdId.GetBagScRsp); + + var data = GetBagScRsp.newInstance(); + + InventoryTab tabMaterial = session.getPlayer().getInventory().getInventoryTab(ItemMainType.Material); + for (GameItem item : tabMaterial) { + data.addMaterialList(item.toMaterialProto()); + } + + InventoryTab tabRelic = session.getPlayer().getInventory().getInventoryTab(ItemMainType.Relic); + for (GameItem item : tabRelic) { + data.addRelicList(item.toRelicProto()); + } + + InventoryTab tabEquipment = session.getPlayer().getInventory().getInventoryTab(ItemMainType.Equipment); + for (GameItem item : tabEquipment) { + data.addEquipmentList(item.toEquipmentProto()); + } + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketGetBasicInfoScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketGetBasicInfoScRsp.java new file mode 100644 index 0000000..c7fcc00 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketGetBasicInfoScRsp.java @@ -0,0 +1,22 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.proto.GetBasicInfoScRspOuterClass.GetBasicInfoScRsp; +import emu.lunarcore.proto.PlayerSettingInfoOuterClass.PlayerSettingInfo; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketGetBasicInfoScRsp extends BasePacket { + + public PacketGetBasicInfoScRsp(GameSession session) { + super(CmdId.GetBasicInfoScRsp); + + var data = GetBasicInfoScRsp.newInstance() + .setCurDay(1) + .setNextRecoverTime(0) + .setGameplayBirthday(session.getPlayer().getBirthday()) + .setPlayerSettingInfo(PlayerSettingInfo.newInstance()); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketGetCurLineupDataScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketGetCurLineupDataScRsp.java new file mode 100644 index 0000000..3a07a2d --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketGetCurLineupDataScRsp.java @@ -0,0 +1,18 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.proto.GetCurLineupDataScRspOuterClass.GetCurLineupDataScRsp; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketGetCurLineupDataScRsp extends BasePacket { + + public PacketGetCurLineupDataScRsp(GameSession session) { + super(CmdId.GetCurLineupDataScRsp); + + var data = GetCurLineupDataScRsp.newInstance() + .setLineup(session.getPlayer().getLineupManager().getCurrentLineup().toProto()); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketGetCurSceneInfoScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketGetCurSceneInfoScRsp.java new file mode 100644 index 0000000..5a7eadf --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketGetCurSceneInfoScRsp.java @@ -0,0 +1,18 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.proto.GetCurSceneInfoScRspOuterClass.GetCurSceneInfoScRsp; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketGetCurSceneInfoScRsp extends BasePacket { + + public PacketGetCurSceneInfoScRsp(GameSession session) { + super(CmdId.GetCurSceneInfoScRsp); + + var data = GetCurSceneInfoScRsp.newInstance() + .setScene(session.getPlayer().getScene().toProto()); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketGetFriendListInfoScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketGetFriendListInfoScRsp.java new file mode 100644 index 0000000..bd4f8c7 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketGetFriendListInfoScRsp.java @@ -0,0 +1,32 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.GameConstants; +import emu.lunarcore.proto.FriendAvatarInfoOuterClass.FriendAvatarInfo; +import emu.lunarcore.proto.FriendListInfoOuterClass.FriendListInfo; +import emu.lunarcore.proto.FriendOnlineStatusOuterClass.FriendOnlineStatus; +import emu.lunarcore.proto.GetFriendListInfoScRspOuterClass.GetFriendListInfoScRsp; +import emu.lunarcore.proto.PlatformTypeOuterClass.PlatformType; +import emu.lunarcore.proto.SimpleInfoOuterClass.SimpleInfo; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketGetFriendListInfoScRsp extends BasePacket { + + public PacketGetFriendListInfoScRsp() { + super(CmdId.GetFriendListInfoScRsp); + + var consoleFriend = SimpleInfo.newInstance() + .setNickname("Server") + .setLevel(1) + .setUid(GameConstants.SERVER_CONSOLE_UID) + .setOnlineStatus(FriendOnlineStatus.FRIEND_ONLINE_STATUS_ONLINE) + .setPlatformType(PlatformType.PC) + .setFriendAvatarInfo(FriendAvatarInfo.newInstance().setAvatarId(1001).setLevel(1)) + .setProfilePicture(201001); + + var data = GetFriendListInfoScRsp.newInstance() + .addFriendList(FriendListInfo.newInstance().setSimpleInfo(consoleFriend)); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketGetGachaInfoScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketGetGachaInfoScRsp.java new file mode 100644 index 0000000..2109abd --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketGetGachaInfoScRsp.java @@ -0,0 +1,14 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketGetGachaInfoScRsp extends BasePacket { + + public PacketGetGachaInfoScRsp(GameSession session) { + super(CmdId.GetGachaInfoScRsp); + + this.setData(session.getServer().getGachaService().toProto()); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketGetHeroBasicTypeInfoScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketGetHeroBasicTypeInfoScRsp.java new file mode 100644 index 0000000..fc466cf --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketGetHeroBasicTypeInfoScRsp.java @@ -0,0 +1,25 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.proto.GenderOuterClass.Gender; +import emu.lunarcore.proto.GetHeroBasicTypeInfoScRspOuterClass.GetHeroBasicTypeInfoScRsp; +import emu.lunarcore.proto.HeroBasicTypeInfoOuterClass.HeroBasicTypeInfo; +import emu.lunarcore.proto.HeroBasicTypeOuterClass.HeroBasicType; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketGetHeroBasicTypeInfoScRsp extends BasePacket { + + public PacketGetHeroBasicTypeInfoScRsp() { + super(CmdId.GetHeroBasicTypeInfoScRsp); + + var heroBasicType = HeroBasicTypeInfo.newInstance() + .setBasicType(HeroBasicType.BoyWarrior); + + var data = GetHeroBasicTypeInfoScRsp.newInstance() + .setGender(Gender.GenderMan) + .setCurBasicType(HeroBasicType.BoyWarrior) + .addBasicTypeInfoList(heroBasicType); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketGetMissionStatusScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketGetMissionStatusScRsp.java new file mode 100644 index 0000000..1b8f56c --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketGetMissionStatusScRsp.java @@ -0,0 +1,31 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.proto.GetMissionStatusCsReqOuterClass.GetMissionStatusCsReq; +import emu.lunarcore.proto.GetMissionStatusScRspOuterClass.GetMissionStatusScRsp; +import emu.lunarcore.proto.MissionOuterClass.Mission; +import emu.lunarcore.proto.MissionStatusOuterClass.MissionStatus; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketGetMissionStatusScRsp extends BasePacket { + + public PacketGetMissionStatusScRsp(GetMissionStatusCsReq req) { + super(CmdId.GetMissionStatusScRsp); + + var data = GetMissionStatusScRsp.newInstance(); + + for (int missionId : req.getMainMissionIdList()) { + data.addFinishedMainMissionIdList(missionId); + } + + for (int missionId : req.getSubMissionIdList()) { + var mission = Mission.newInstance() + .setId(missionId) + .setStatus(MissionStatus.MISSION_FINISH); + + data.addSubMissionStatusList(mission); + } + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketGetPlayerDetailInfoScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketGetPlayerDetailInfoScRsp.java new file mode 100644 index 0000000..6a12f64 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketGetPlayerDetailInfoScRsp.java @@ -0,0 +1,18 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.proto.GetPlayerDetailInfoScRspOuterClass.GetPlayerDetailInfoScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketGetPlayerDetailInfoScRsp extends BasePacket { + + public PacketGetPlayerDetailInfoScRsp() { + super(CmdId.GetPlayerDetailInfoScRsp); + + // TODO handle properly + var data = GetPlayerDetailInfoScRsp.newInstance() + .setRetcode(1); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketGetSceneMapInfoScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketGetSceneMapInfoScRsp.java new file mode 100644 index 0000000..a49c932 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketGetSceneMapInfoScRsp.java @@ -0,0 +1,57 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.config.FloorInfo; +import emu.lunarcore.data.config.GroupInfo; +import emu.lunarcore.data.excel.MapEntranceExcel; +import emu.lunarcore.proto.GetSceneMapInfoScRspOuterClass.GetSceneMapInfoScRsp; +import emu.lunarcore.proto.MapInfoChestTypeOuterClass.MapInfoChestType; +import emu.lunarcore.proto.MazeChestOuterClass.MazeChest; +import emu.lunarcore.proto.MazeGroupOuterClass.MazeGroup; +import emu.lunarcore.proto.MazeMapDataOuterClass.MazeMapData; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; +import us.hebi.quickbuf.RepeatedInt; + +public class PacketGetSceneMapInfoScRsp extends BasePacket { + + public PacketGetSceneMapInfoScRsp(RepeatedInt list) { + super(CmdId.GetSceneMapInfoScRsp); + + var data = GetSceneMapInfoScRsp.newInstance(); + + for (int entryId : list) { + var mazeMap = MazeMapData.newInstance() + .addUnlockedChestList(MazeChest.newInstance().setMapInfoChestType(MapInfoChestType.MAP_INFO_CHEST_TYPE_NORMAL)) + .addUnlockedChestList(MazeChest.newInstance().setMapInfoChestType(MapInfoChestType.MAP_INFO_CHEST_TYPE_PUZZLE)) + .addUnlockedChestList(MazeChest.newInstance().setMapInfoChestType(MapInfoChestType.MAP_INFO_CHEST_TYPE_CHALLENGE)) + .setEntryId(entryId); + + // Map sections. TODO un hardcode + for (int i = 0; i < 25; i++) { + mazeMap.addAllLightenSectionList(i); + } + + // Maze groups (Npc icons on the map, etc) + MapEntranceExcel excel = GameData.getMapEntranceExcelMap().get(entryId); + if (excel != null) { + FloorInfo floorInfo = GameData.getFloorInfo(excel.getPlaneID(), excel.getFloorID()); + if (floorInfo != null) { + // Add groups + for (GroupInfo groupInfo : floorInfo.getGroups().values()) { + var mazeGroup = MazeGroup.newInstance().setGroupId(groupInfo.getId()); + mazeMap.addMazeGroupList(mazeGroup); + } + // Map unlocked teleports + for (var teleport : floorInfo.getCachedTeleports().values()) { + mazeMap.addAllUnlockedTeleportList(teleport.getMappingInfoID()); + } + } + } + + data.addMapList(mazeMap); + } + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketGetShopListScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketGetShopListScRsp.java new file mode 100644 index 0000000..9a27cdc --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketGetShopListScRsp.java @@ -0,0 +1,17 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.proto.GetShopListScRspOuterClass.GetShopListScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketGetShopListScRsp extends BasePacket { + + public PacketGetShopListScRsp(int shopType) { + super(CmdId.GetShopListScRsp); + + var data = GetShopListScRsp.newInstance() + .setShopType(shopType); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketPVEBattleResultScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketPVEBattleResultScRsp.java new file mode 100644 index 0000000..b874515 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketPVEBattleResultScRsp.java @@ -0,0 +1,27 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.proto.ItemListOuterClass.ItemList; +import emu.lunarcore.proto.PVEBattleResultCsReqOuterClass.PVEBattleResultCsReq; +import emu.lunarcore.proto.PVEBattleResultScRspOuterClass.PVEBattleResultScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketPVEBattleResultScRsp extends BasePacket { + + public PacketPVEBattleResultScRsp(PVEBattleResultCsReq req) { + super(CmdId.PVEBattleResultScRsp); + + var data = PVEBattleResultScRsp.newInstance() + .setUnk1(ItemList.newInstance()) + .setUnk2(ItemList.newInstance()) + .setUnk3(ItemList.newInstance()) + .setResVersion(Integer.toString(req.getClientResVersion())) + .setBinVersion("") + .setBattleId(req.getBattleId()) + .setStageId(req.getStageId()) + .setEndStatus(req.getEndStatus()) + .setCheckIdentical(true); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerGetTokenScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerGetTokenScRsp.java new file mode 100644 index 0000000..e264540 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerGetTokenScRsp.java @@ -0,0 +1,20 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.proto.BlackInfoOuterClass.BlackInfo; +import emu.lunarcore.proto.PlayerGetTokenScRspOuterClass.PlayerGetTokenScRsp; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketPlayerGetTokenScRsp extends BasePacket { + + public PacketPlayerGetTokenScRsp(GameSession session) { + super(CmdId.PlayerGetTokenScRsp); + + var data = PlayerGetTokenScRsp.newInstance() + .setUid(session.getUid()) + .setBlackInfo(BlackInfo.newInstance()); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerHeartBeatScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerHeartBeatScRsp.java new file mode 100644 index 0000000..2363545 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerHeartBeatScRsp.java @@ -0,0 +1,18 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.proto.PlayerHeartbeatScRspOuterClass.PlayerHeartbeatScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketPlayerHeartBeatScRsp extends BasePacket { + + public PacketPlayerHeartBeatScRsp(long clientTime) { + super(CmdId.PlayerHeartBeatScRsp); + + var data = PlayerHeartbeatScRsp.newInstance() + .setClientTimeMs(clientTime) + .setServerTimeMs(System.currentTimeMillis()); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerLoginScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerLoginScRsp.java new file mode 100644 index 0000000..ad9cda3 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerLoginScRsp.java @@ -0,0 +1,22 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.GameConstants; +import emu.lunarcore.proto.PlayerLoginScRspOuterClass.PlayerLoginScRsp; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketPlayerLoginScRsp extends BasePacket { + + public PacketPlayerLoginScRsp(GameSession session) { + super(CmdId.PlayerLoginScRsp); + + var data = PlayerLoginScRsp.newInstance() + .setBasicInfo(session.getPlayer().toProto()) + .setCurTimezone(GameConstants.CURRENT_OFFSET.getTotalSeconds() / 60) + .setServerTimestampMs(System.currentTimeMillis()) + .setStamina(session.getPlayer().getStamina()); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerSyncScNotify.java b/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerSyncScNotify.java new file mode 100644 index 0000000..a5ae09e --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerSyncScNotify.java @@ -0,0 +1,101 @@ +package emu.lunarcore.server.packet.send; + +import java.util.Collection; + +import emu.lunarcore.game.avatar.GameAvatar; +import emu.lunarcore.game.inventory.GameItem; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.proto.AvatarSyncOuterClass.AvatarSync; +import emu.lunarcore.proto.PlayerSyncScNotifyOuterClass.PlayerSyncScNotify; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketPlayerSyncScNotify extends BasePacket { + + @Deprecated // This constructor does not create a proto + private PacketPlayerSyncScNotify() { + super(CmdId.PlayerSyncScNotify); + } + + public PacketPlayerSyncScNotify(Player player) { + this(); + + var data = PlayerSyncScNotify.newInstance() + .setBasicInfo(player.toProto()); + + this.setData(data); + } + + public PacketPlayerSyncScNotify(GameAvatar avatar) { + this(); + + var avatarSync = AvatarSync.newInstance() + .addAvatarList(avatar.toProto()); + + var data = PlayerSyncScNotify.newInstance() + .setAvatarSync(avatarSync); + + this.setData(data); + } + + public PacketPlayerSyncScNotify(GameAvatar avatar, GameItem item) { + this(); + + var avatarSync = AvatarSync.newInstance() + .addAvatarList(avatar.toProto()); + + var data = PlayerSyncScNotify.newInstance() + .setAvatarSync(avatarSync); + + this.addItemToProto(data, item); + + this.setData(data); + } + + public PacketPlayerSyncScNotify(GameItem item) { + this(); + + var data = PlayerSyncScNotify.newInstance(); + + this.addItemToProto(data, item); + + this.setData(data); + } + + public PacketPlayerSyncScNotify(Collection items) { + this(); + + var data = PlayerSyncScNotify.newInstance(); + + for (GameItem item : items) { + this.addItemToProto(data, item); + } + + this.setData(data); + } + + private void addItemToProto(PlayerSyncScNotify data, GameItem item) { + switch (item.getExcel().getItemMainType()) { + case Material -> { + data.addMaterialList(item.toMaterialProto()); + } + case Relic -> { + if (item.getCount() > 0) { + data.addRelicList(item.toRelicProto()); + } else { + data.addDelRelicList(item.getInternalUid()); + } + } + case Equipment -> { + if (item.getCount() > 0) { + data.addEquipmentList(item.toEquipmentProto()); + } else { + data.addDelEquipmentList(item.getInternalUid()); + } + } + default -> { + + } + } + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketRevcMsgScNotify.java b/src/main/java/emu/lunarcore/server/packet/send/PacketRevcMsgScNotify.java new file mode 100644 index 0000000..2c38ecc --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketRevcMsgScNotify.java @@ -0,0 +1,25 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.GameConstants; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.proto.ChatTypeOuterClass.ChatType; +import emu.lunarcore.proto.MsgTypeOuterClass.MsgType; +import emu.lunarcore.proto.RevcMsgScNotifyOuterClass.RevcMsgScNotify; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketRevcMsgScNotify extends BasePacket { + + public PacketRevcMsgScNotify(Player player, String msg) { + super(CmdId.RevcMsgScNotify); + + var data = RevcMsgScNotify.newInstance() + .setText(msg) + .setChatType(ChatType.CHAT_TYPE_PRIVATE) + .setMsgType(MsgType.MSG_TYPE_CUSTOM_TEXT) + .setFromUid(GameConstants.SERVER_CONSOLE_UID) + .setToUid(player.getUid()); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketSceneCastSkillScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketSceneCastSkillScRsp.java new file mode 100644 index 0000000..8f9c927 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketSceneCastSkillScRsp.java @@ -0,0 +1,68 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.game.avatar.GameAvatar; +import emu.lunarcore.game.player.PlayerLineup; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.game.scene.EntityMonster; +import emu.lunarcore.proto.SceneBattleInfoOuterClass.SceneBattleInfo; +import emu.lunarcore.proto.SceneCastSkillScRspOuterClass.SceneCastSkillScRsp; +import emu.lunarcore.proto.SceneMonsterOuterClass.SceneMonster; +import emu.lunarcore.proto.SceneMonsterWaveOuterClass.SceneMonsterWave; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.util.Utils; + +public class PacketSceneCastSkillScRsp extends BasePacket { + + public PacketSceneCastSkillScRsp() { + this(0); + } + + public PacketSceneCastSkillScRsp(int retcode) { + super(CmdId.SceneCastSkillScRsp); + + var data = SceneCastSkillScRsp.newInstance() + .setRetcode(retcode); + + this.setData(data); + } + + // TODO + public PacketSceneCastSkillScRsp(Player player, EntityMonster monster) { + super(CmdId.SceneCastSkillScRsp); + + var wave = SceneMonsterWave.newInstance() + .setStageId(monster.getStage().getId()); + + int[] monsters = {101203002, 100202003, 100204007, 100205006}; + + for (int i = 0; i < 5; i++) { + var m = SceneMonster.newInstance() + .setMonsterId(Utils.randomElement(monsters)); + + wave.addMonsterList(m); + } + + var battle = SceneBattleInfo.newInstance() + .setStageId(monster.getStage().getId()) + .setLogicRandomSeed(Utils.randomRange(1, Short.MAX_VALUE)) + .addMonsterWaveList(wave) + .setWorldLevel(player.getWorldLevel()); + + // Avatars + PlayerLineup lineup = player.getLineupManager().getCurrentLineup(); + for (int i = 0; i < lineup.getAvatars().size(); i++) { + GameAvatar avatar = player.getAvatarById(lineup.getAvatars().get(i)); + if (avatar == null) continue; + + battle.addBattleAvatarList(avatar.toBattleProto(i)); + } + + // Build data + var data = SceneCastSkillScRsp.newInstance() + .setAttackedGroupId(monster.getGroupId()) + .setBattleInfo(battle); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketSceneEntityUpdateScNotify.java b/src/main/java/emu/lunarcore/server/packet/send/PacketSceneEntityUpdateScNotify.java new file mode 100644 index 0000000..f4dc7b5 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketSceneEntityUpdateScNotify.java @@ -0,0 +1,18 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.game.scene.GameEntity; +import emu.lunarcore.proto.SceneEntityUpdateScNotifyOuterClass.SceneEntityUpdateScNotify; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketSceneEntityUpdateScNotify extends BasePacket { + + public PacketSceneEntityUpdateScNotify(GameEntity toAdd) { + super(CmdId.SceneEntityUpdateScNotify); + + var data = SceneEntityUpdateScNotify.newInstance() + .addEntityList(toAdd.toSceneEntityProto()); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketSceneGroupRefreshScNotify.java b/src/main/java/emu/lunarcore/server/packet/send/PacketSceneGroupRefreshScNotify.java new file mode 100644 index 0000000..e2e856c --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketSceneGroupRefreshScNotify.java @@ -0,0 +1,51 @@ +package emu.lunarcore.server.packet.send; + +import java.util.Collection; + +import emu.lunarcore.game.scene.GameEntity; +import emu.lunarcore.proto.SceneEntityRefreshInfoOuterClass.SceneEntityRefreshInfo; +import emu.lunarcore.proto.SceneGroupRefreshInfoOuterClass.SceneGroupRefreshInfo; +import emu.lunarcore.proto.SceneGroupRefreshScNotifyOuterClass.SceneGroupRefreshScNotify; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketSceneGroupRefreshScNotify extends BasePacket { + + public PacketSceneGroupRefreshScNotify(GameEntity toAdd, GameEntity toRemove) { + super(CmdId.SceneGroupRefreshScNotify); + + var group = SceneGroupRefreshInfo.newInstance().setGroupId(toAdd.getGroupId()); + + if (toAdd != null) { + group.addRefreshEntity(SceneEntityRefreshInfo.newInstance().setAddEntity(toAdd.toSceneEntityProto())); + } + + if (toRemove != null) { + group.addRefreshEntity(SceneEntityRefreshInfo.newInstance().setDelEntity(toRemove.getEntityId())); + } + + var data = SceneGroupRefreshScNotify.newInstance() + .addGroupRefreshInfo(group); + + this.setData(data); + } + + public PacketSceneGroupRefreshScNotify(Collection toAdd, Collection toRemove) { + super(CmdId.SceneGroupRefreshScNotify); + + var group = SceneGroupRefreshInfo.newInstance(); + + for (var entity : toAdd) { + group.addRefreshEntity(SceneEntityRefreshInfo.newInstance().setAddEntity(entity.toSceneEntityProto())); + } + + for (var entity : toRemove) { + group.addRefreshEntity(SceneEntityRefreshInfo.newInstance().setDelEntity(entity.getEntityId())); + } + + var data = SceneGroupRefreshScNotify.newInstance() + .addGroupRefreshInfo(group); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketSellItemScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketSellItemScRsp.java new file mode 100644 index 0000000..661403b --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketSellItemScRsp.java @@ -0,0 +1,28 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.proto.ItemListOuterClass.ItemList; +import emu.lunarcore.proto.ItemOuterClass.Item; +import emu.lunarcore.proto.SellItemScRspOuterClass.SellItemScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; +import it.unimi.dsi.fastutil.ints.Int2IntMap; + +public class PacketSellItemScRsp extends BasePacket { + + public PacketSellItemScRsp(Int2IntMap returnItems) { + super(CmdId.SellItemScRsp); + + var list = ItemList.newInstance(); + + if (returnItems != null) { + for (var item : returnItems.int2IntEntrySet()) { + list.addItemList(Item.newInstance().setItemId(item.getIntKey()).setNum(item.getIntValue())); + } + } + + var data = SellItemScRsp.newInstance() + .setReturnItemList(list); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketSetGameplayBirthdayScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketSetGameplayBirthdayScRsp.java new file mode 100644 index 0000000..1c721c4 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketSetGameplayBirthdayScRsp.java @@ -0,0 +1,26 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.proto.SetGameplayBirthdayScRspOuterClass.SetGameplayBirthdayScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketSetGameplayBirthdayScRsp extends BasePacket { + + public PacketSetGameplayBirthdayScRsp() { + super(CmdId.SetGameplayBirthdayScRsp); + + var data = SetGameplayBirthdayScRsp.newInstance() + .setRetcode(1); + + this.setData(data); + } + + public PacketSetGameplayBirthdayScRsp(int birthday) { + super(CmdId.SetGameplayBirthdayScRsp); + + var data = SetGameplayBirthdayScRsp.newInstance() + .setBirthday(birthday); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketSetLineupNameScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketSetLineupNameScRsp.java new file mode 100644 index 0000000..c1eb78a --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketSetLineupNameScRsp.java @@ -0,0 +1,22 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.proto.SetLineupNameScRspOuterClass.SetLineupNameScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketSetLineupNameScRsp extends BasePacket { + + public PacketSetLineupNameScRsp(String name) { + super(CmdId.SetLineupNameScRsp); + + var data = SetLineupNameScRsp.newInstance(); + + if (name != null) { + data.setName(name); + } else { + data.setRetcode(1); + } + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketSwitchLineupIndexScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketSwitchLineupIndexScRsp.java new file mode 100644 index 0000000..ebdaa4b --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketSwitchLineupIndexScRsp.java @@ -0,0 +1,18 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.game.player.PlayerLineup; +import emu.lunarcore.proto.SwitchLineupIndexScRspOuterClass.SwitchLineupIndexScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketSwitchLineupIndexScRsp extends BasePacket { + + public PacketSwitchLineupIndexScRsp(PlayerLineup lineup) { + super(CmdId.SwitchLineupIndexScRsp); + + var data = SwitchLineupIndexScRsp.newInstance() + .setIndex(lineup.getIndex()); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketSyncClientResVersionScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketSyncClientResVersionScRsp.java new file mode 100644 index 0000000..03b7e20 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketSyncClientResVersionScRsp.java @@ -0,0 +1,17 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.proto.SyncClientResVersionScRspOuterClass.SyncClientResVersionScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketSyncClientResVersionScRsp extends BasePacket { + + public PacketSyncClientResVersionScRsp(int res) { + super(CmdId.SyncClientResVersionScRsp); + + var data = SyncClientResVersionScRsp.newInstance() + .setClientResVersion(res); + + this.setData(data); + } +} \ No newline at end of file diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketSyncLineupNotify.java b/src/main/java/emu/lunarcore/server/packet/send/PacketSyncLineupNotify.java new file mode 100644 index 0000000..1d34089 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketSyncLineupNotify.java @@ -0,0 +1,18 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.game.player.PlayerLineup; +import emu.lunarcore.proto.SyncLineupNotifyOuterClass.SyncLineupNotify; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketSyncLineupNotify extends BasePacket { + + public PacketSyncLineupNotify(PlayerLineup lineup) { + super(CmdId.SyncLineupNotify); + + var data = SyncLineupNotify.newInstance() + .setLineup(lineup.toProto()); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketUnlockSkilltreeScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketUnlockSkilltreeScRsp.java new file mode 100644 index 0000000..daedc03 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketUnlockSkilltreeScRsp.java @@ -0,0 +1,27 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.proto.UnlockSkilltreeScRspOuterClass.UnlockSkilltreeScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketUnlockSkilltreeScRsp extends BasePacket { + + public PacketUnlockSkilltreeScRsp(int avatarId, int pointId, int level) { + super(CmdId.UnlockSkilltreeScRsp); + + var data = UnlockSkilltreeScRsp.newInstance() + .setBaseAvatarId(avatarId) + .setPointId(pointId) + .setLevel(level); + + this.setData(data); + } + + public PacketUnlockSkilltreeScRsp() { + super(CmdId.UnlockSkilltreeScRsp); + + var data = UnlockSkilltreeScRsp.newInstance().setRetcode(1); + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/util/Crypto.java b/src/main/java/emu/lunarcore/util/Crypto.java new file mode 100644 index 0000000..63e0f31 --- /dev/null +++ b/src/main/java/emu/lunarcore/util/Crypto.java @@ -0,0 +1,25 @@ +package emu.lunarcore.util; + +import java.security.SecureRandom; + +import emu.lunarcore.LunarRail; + +public final class Crypto { + private static final SecureRandom secureRandom = new SecureRandom(); + + public static void xor(byte[] packet, byte[] key) { + try { + for (int i = 0; i < packet.length; i++) { + packet[i] ^= key[i % key.length]; + } + } catch (Exception e) { + LunarRail.getLogger().error("Crypto error.", e); + } + } + + public static byte[] createSessionKey(int length) { + byte[] bytes = new byte[length]; + secureRandom.nextBytes(bytes); + return bytes; + } +} diff --git a/src/main/java/emu/lunarcore/util/FileUtils.java b/src/main/java/emu/lunarcore/util/FileUtils.java new file mode 100644 index 0000000..98b623a --- /dev/null +++ b/src/main/java/emu/lunarcore/util/FileUtils.java @@ -0,0 +1,39 @@ +package emu.lunarcore.util; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import emu.lunarcore.LunarRail; + +public class FileUtils { + public static void write(String dest, byte[] bytes) { + Path path = Paths.get(dest); + + try { + Files.write(path, bytes); + } catch (IOException e) { + LunarRail.getLogger().warn("Failed to write file: " + dest); + } + } + + public static byte[] read(String dest) { + return read(Paths.get(dest)); + } + + public static byte[] read(Path path) { + try { + return Files.readAllBytes(path); + } catch (IOException e) { + LunarRail.getLogger().warn("Failed to read file: " + path); + } + + return new byte[0]; + } + + public static byte[] read(File file) { + return read(file.getPath()); + } +} diff --git a/src/main/java/emu/lunarcore/util/Handbook.java b/src/main/java/emu/lunarcore/util/Handbook.java new file mode 100644 index 0000000..2835c28 --- /dev/null +++ b/src/main/java/emu/lunarcore/util/Handbook.java @@ -0,0 +1,104 @@ +package emu.lunarcore.util; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Map; + +import emu.lunarcore.GameConstants; +import emu.lunarcore.LunarRail; +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.excel.*; + +public class Handbook { + + public static void generate() { + // Load text map + Map textMap = null; + List list = null; + + try { + textMap = JsonUtils.loadToMap(LunarRail.getConfig().getResourceDir() + "/TextMap/TextMapEN.json", Long.class, String.class); + } catch (Exception e) { + e.printStackTrace(); + return; + } + + // Save to file + String file = "./Star Rail Handbook.txt"; + + try (PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8), true)) { + // Format date for header + DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); + LocalDateTime now = LocalDateTime.now(); + + // Header + writer.println("// Star Rail " + GameConstants.VERSION + " Handbook"); + writer.println("// Created " + dtf.format(now)); + + // Dump avatars + writer.println(System.lineSeparator()); + writer.println("// Avatars"); + list = GameData.getAvatarExcelMap().keySet().intStream().sorted().boxed().toList(); + for (int id : list) { + AvatarExcel excel = GameData.getAvatarExcelMap().get(id); + writer.print(excel.getId()); + writer.print(" : "); + writer.println(textMap.getOrDefault(excel.getAvatarName(), "null")); + } + + // Dump items + writer.println(System.lineSeparator()); + writer.println("// Items"); + list = GameData.getItemExcelMap().keySet().intStream().sorted().boxed().toList(); + for (int id : list) { + ItemExcel excel = GameData.getItemExcelMap().get(id); + writer.print(excel.getId()); + writer.print(" : "); + writer.println(textMap.getOrDefault(excel.getItemName(), "null")); + } + + // Dump npc monsters + writer.println(System.lineSeparator()); + writer.println("// NPC Monsters (Spawnable)"); + list = GameData.getNpcMonsterExcelMap().keySet().intStream().sorted().boxed().toList(); + for (int id : list) { + NpcMonsterExcel excel = GameData.getNpcMonsterExcelMap().get(id); + writer.print(excel.getId()); + writer.print(" : "); + writer.println(textMap.getOrDefault(excel.getNPCName(), "null")); + } + + // Dump stages + writer.println(System.lineSeparator()); + writer.println("// Stages"); + list = GameData.getStageExcelMap().keySet().intStream().sorted().boxed().toList(); + for (int id : list) { + StageExcel excel = GameData.getStageExcelMap().get(id); + writer.print(excel.getId()); + writer.print(" : "); + writer.print("[Level " + excel.getLevel() + "] "); + writer.println(textMap.getOrDefault(excel.getStageName(), "null")); + } + + // Dump monsters + writer.println(System.lineSeparator()); + writer.println("// Monsters"); + list = GameData.getMonsterExcelMap().keySet().intStream().sorted().boxed().toList(); + for (int id : list) { + MonsterExcel excel = GameData.getMonsterExcelMap().get(id); + writer.print(excel.getId()); + writer.print(" : "); + writer.println(textMap.getOrDefault(excel.getMonsterName(), "null")); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/emu/lunarcore/util/JsonUtils.java b/src/main/java/emu/lunarcore/util/JsonUtils.java new file mode 100644 index 0000000..2f9d6e4 --- /dev/null +++ b/src/main/java/emu/lunarcore/util/JsonUtils.java @@ -0,0 +1,108 @@ +package emu.lunarcore.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.reflect.TypeToken; + +import emu.lunarcore.Config; + +public class JsonUtils { + private static final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + private static final Gson gsonCompact = new GsonBuilder().create(); + + public static Gson getGsonFactory() { + return gson; + } + + /** + * Encode an object to a JSON string + */ + public static String encode(Object object) { + return gson.toJson(object); + } + + /** + * Encode an object to a JSON string + * @param object + * @param compact + * @return + */ + public static String encode(Object object, boolean compact) { + return compact ? gsonCompact.toJson(object) : gson.toJson(object); + } + + public static JsonElement encodeToElement(Object object) { + return gson.toJsonTree(object); + } + + /** + * Safely JSON decodes a given string. + * @param jsonData The JSON-encoded data. + * @return JSON decoded data, or null if an exception occurred. + */ + public static T decode(String jsonData, Class classType) { + try { + return gson.fromJson(jsonData, classType); + } catch (Exception ignored) { + return null; + } + } + + public static List decodeList(String jsonData, Class classType) { + if (jsonData == null) return null; + try { + return gson.fromJson(jsonData, TypeToken.getParameterized(List.class, classType).getType()); + } catch (Exception ignored) { + return null; + } + } + + public static Set decodeSet(String jsonData, Class classType) { + if (jsonData == null) return null; + try { + return gson.fromJson(jsonData, TypeToken.getParameterized(Set.class, classType).getType()); + } catch (Exception ignored) { + return null; + } + } + + public static T loadToClass(InputStreamReader fileReader, Class classType) throws IOException { + return gson.fromJson(fileReader, classType); + } + + public static T loadToClass(File file, Class classType) throws IOException { + try (InputStreamReader fileReader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8)) { + return loadToClass(fileReader, classType); + } + } + + public static List loadToList(InputStreamReader fileReader, Class classType) throws IOException { + return gson.fromJson(fileReader, TypeToken.getParameterized(List.class, classType).getType()); + } + + public static List loadToList(String filename, Class classType) throws IOException { + try (InputStreamReader fileReader = new InputStreamReader(new FileInputStream(Utils.toFilePath(filename)), StandardCharsets.UTF_8)) { + return loadToList(fileReader, classType); + } + } + + public static Map loadToMap(InputStreamReader fileReader, Class keyType, Class valueType) throws IOException { + return gson.fromJson(fileReader, TypeToken.getParameterized(Map.class, keyType, valueType).getType()); + } + + public static Map loadToMap(String filename, Class keyType, Class valueType) throws IOException { + try (InputStreamReader fileReader = new InputStreamReader(new FileInputStream(Utils.toFilePath(filename)), StandardCharsets.UTF_8)) { + return loadToMap(fileReader, keyType, valueType); + } + } +} diff --git a/src/main/java/emu/lunarcore/util/Position.java b/src/main/java/emu/lunarcore/util/Position.java new file mode 100644 index 0000000..829d8ce --- /dev/null +++ b/src/main/java/emu/lunarcore/util/Position.java @@ -0,0 +1,108 @@ +package emu.lunarcore.util; + +import dev.morphia.annotations.Entity; +import emu.lunarcore.proto.VectorOuterClass.Vector; + +@Entity(useDiscriminator = false) +public class Position { + private int x; + private int y; + private int z; + + public Position() { + + } + + public Position(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + public Position(Position position) { + this.x = position.getX(); + this.y = position.getY(); + this.z = position.getZ(); + } + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } + + public int getZ() { + return z; + } + + public void setZ(int z) { + this.z = z; + } + + public void set(Position pos) { + this.x = pos.getX(); + this.y = pos.getY(); + this.z = pos.getZ(); + } + + public void set(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + public Position add(int x, int y, int z) { + this.x += x; + this.y += y; + this.z += z; + return this; + } + + // Operations TODO + + public double get2dDist(Position pos) { + int x = this.getX() - pos.getX(); + int y = this.getY() - pos.getY(); + return Math.sqrt((x * x) + (y * y)); + } + + public int getFast2dDist(Position pos) { + int x = this.getX() - pos.getX(); + int y = this.getY() - pos.getY(); + return (x * x) + (y * y); + } + + public Vector toProto() { + return Vector.newInstance().setX(x).setY(y).setZ(z); + } + + // Overrides + + @Override + public Position clone() { + return new Position(getX(), getY(), getZ()); + } + + @Override + public boolean equals(Object o) { + if (o instanceof Position pos) { + return getX() == pos.getX() && getY() == pos.getY() && getZ() == pos.getZ(); + } + return false; + } + + @Override + public String toString() { + return "[ " + this.getX() + " , " + this.getY() + " ]"; + } +} diff --git a/src/main/java/emu/lunarcore/util/Snowflake32.java b/src/main/java/emu/lunarcore/util/Snowflake32.java new file mode 100644 index 0000000..e5268cf --- /dev/null +++ b/src/main/java/emu/lunarcore/util/Snowflake32.java @@ -0,0 +1,25 @@ +package emu.lunarcore.util; + +public class Snowflake32 { + private static final long EPOCH = 1672531200000L; // Sunday, January 1, 2023 12:00:00 AM (GMT) + private static int cachedTimestamp; + private static byte sequence; + + public synchronized static int newUid() { + int timestamp = (int) ((System.currentTimeMillis() - EPOCH) / 1000); + + if (cachedTimestamp != timestamp) { + sequence = 0; + cachedTimestamp = timestamp; + } else { + sequence++; + } + + return (cachedTimestamp << 4) + sequence; + } + + public synchronized static int toTimestamp(int snowflake) { + return (snowflake >> 4) + (int) (EPOCH / 1000); + } + +} diff --git a/src/main/java/emu/lunarcore/util/Utils.java b/src/main/java/emu/lunarcore/util/Utils.java new file mode 100644 index 0000000..efb51da --- /dev/null +++ b/src/main/java/emu/lunarcore/util/Utils.java @@ -0,0 +1,148 @@ +package emu.lunarcore.util; + +import java.io.File; +import java.security.SecureRandom; +import java.util.Base64; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class Utils { + private static final SecureRandom secureRandom = new SecureRandom(); + private static final char[] HEX_ARRAY = "0123456789abcdef".toCharArray(); + + public static final Object EMPTY_OBJECT = new Object(); + public static final int[] EMPTY_ARRAY = new int[0]; + public static final String EMPTY_STRING = ""; + + public static String bytesToHex(byte[] bytes) { + if (bytes == null) return ""; + char[] hexChars = new char[bytes.length * 2]; + for (int j = 0; j < bytes.length; j++) { + int v = bytes[j] & 0xFF; + hexChars[j * 2] = HEX_ARRAY[v >>> 4]; + hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F]; + } + return new String(hexChars); + } + + public static byte[] hexToBytes(String s) { + int len = s.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + + Character.digit(s.charAt(i+1), 16)); + } + return data; + } + + public static String capitalize(String s) { + StringBuilder sb = new StringBuilder(s); + sb.setCharAt(0, Character.toUpperCase(sb.charAt(0))); + return sb.toString(); + } + + public static String lowerCaseFirstChar(String s) { + StringBuilder sb = new StringBuilder(s); + sb.setCharAt(0, Character.toLowerCase(sb.charAt(0))); + return sb.toString(); + } + + /** + * Creates a string with the path to a file. + * @param path The path to the file. + * @return A path using the operating system's file separator. + */ + public static String toFilePath(String path) { + return path.replace("/", File.separator); + } + + /** + * Checks if a file exists on the file system. + * @param path The path to the file. + * @return True if the file exists, false otherwise. + */ + public static boolean fileExists(String path) { + return new File(path).exists(); + } + + /** + * Creates a folder on the file system. + * @param path The path to the folder. + * @return True if the folder was created, false otherwise. + */ + public static boolean createFolder(String path) { + return new File(path).mkdirs(); + } + + public static long getCurrentSeconds() { + return Math.floorDiv(System.currentTimeMillis(), 1000); + } + + public static byte[] generateRandomBytes(int length) { + byte[] bytes = new byte[length]; + secureRandom.nextBytes(bytes); + return bytes; + } + + public static String generateRandomString(int length) { + return bytesToHex(generateRandomBytes(length)); + } + + public static int parseSafeInt(String s) { + int i = 0; + + try { + i = Integer.parseInt(s); + } catch (Exception e) { + i = 0; + } + + return i; + } + + public static long parseSafeLong(String s) { + long i = 0; + + try { + i = Long.parseLong(s); + } catch (Exception e) { + i = 0; + } + + return i; + } + + public static double generateRandomDouble() { + return ThreadLocalRandom.current().nextDouble(); + } + + public static int randomRange(int min, int max) { + return ThreadLocalRandom.current().nextInt(min, max + 1); + } + + public static int randomElement(int[] array) { + return array[ThreadLocalRandom.current().nextInt(0, array.length)]; + } + + public static T randomElement(List list) { + return list.get(ThreadLocalRandom.current().nextInt(0, list.size())); + } + + /** + * Base64 encodes a given byte array. + * @param toEncode An array of bytes. + * @return A base64 encoded string. + */ + public static String base64Encode(byte[] toEncode) { + return Base64.getEncoder().encodeToString(toEncode); + } + + /** + * Base64 decodes a given string. + * @param toDecode A base64 encoded string. + * @return An array of bytes. + */ + public static byte[] base64Decode(String toDecode) { + return Base64.getDecoder().decode(toDecode); + } +} diff --git a/src/main/java/emu/lunarcore/util/WeightedList.java b/src/main/java/emu/lunarcore/util/WeightedList.java new file mode 100644 index 0000000..aaf278f --- /dev/null +++ b/src/main/java/emu/lunarcore/util/WeightedList.java @@ -0,0 +1,35 @@ +package emu.lunarcore.util; + +import java.util.NavigableMap; +import java.util.TreeMap; +import java.util.concurrent.ThreadLocalRandom; + +public class WeightedList { + private final NavigableMap map = new TreeMap<>(); + private double total = 0; + + public WeightedList() { + + } + + public WeightedList add(double weight, E result) { + if (weight <= 0) return this; + total += weight; + map.put(total, result); + return this; + } + + public E next() { + double value = ThreadLocalRandom.current().nextDouble() * total; + return map.higherEntry(value).getValue(); + } + + public int size() { + return map.size(); + } + + public void clear() { + this.map.clear(); + this.total = 0; + } +} \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000..8f42963 --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,14 @@ + + + + [%d{HH:mm:ss}] [%level] %msg%n + + + + + + + + + + \ No newline at end of file