From 6a03b39f07df98e1970f3d1cfd892af12dc8ce69 Mon Sep 17 00:00:00 2001
From: Naruse <71993948+DevilProMT@users.noreply.github.com>
Date: Sat, 14 Jun 2025 11:15:32 +0800
Subject: [PATCH] Init enter game
---
.editorconfig | 125 +
.gitattributes | 2 +
.gitignore | 370 +
Common/Common.csproj | 36 +
Common/Configuration/ConfigContainer.cs | 84 +
Common/Configuration/HotfixContainer.cs | 75 +
Common/Data/Config/TimeStampConfig.cs | 7 +
Common/Data/Excel/ActChallengeDataExcel.cs | 24 +
Common/Data/Excel/ActivityTowerExcel.cs | 17 +
Common/Data/Excel/AffixListExcel.cs | 20 +
Common/Data/Excel/AvatarDataExcel.cs | 27 +
Common/Data/Excel/AvatarSubSkillDataExcel.cs | 22 +
Common/Data/Excel/AvatarTutorialExcel.cs | 17 +
Common/Data/Excel/ChapterGroupConfigExcel.cs | 25 +
Common/Data/Excel/CityEventPhotoExcel.cs | 21 +
Common/Data/Excel/CollectionExcel.cs | 17 +
Common/Data/Excel/CustomHeadDataExcel.cs | 19 +
Common/Data/Excel/DressDataExcel.cs | 20 +
Common/Data/Excel/ElfAstraMateDataExcel.cs | 30 +
Common/Data/Excel/ElfSkillDataExcel.cs | 18 +
Common/Data/Excel/EntryThemeDataExcel.cs | 18 +
Common/Data/Excel/EntryThemeItemDataExcel.cs | 16 +
Common/Data/Excel/FrameDataExcel.cs | 19 +
Common/Data/Excel/GeneralActivityExcel.cs | 18 +
.../Excel/GeneralActivityStageGroupExcel.cs | 24 +
Common/Data/Excel/GodWarEventExcel.cs | 20 +
Common/Data/Excel/GodWarMainAvatarExcel.cs | 17 +
Common/Data/Excel/GodWarRelationDataExcel.cs | 20 +
Common/Data/Excel/GodWarSupportAvatarExcel.cs | 17 +
Common/Data/Excel/GodWarTaleScheduleExcel.cs | 22 +
Common/Data/Excel/GodWarTalentDataExcel.cs | 19 +
Common/Data/Excel/MaterialDataExcel.cs | 22 +
Common/Data/Excel/MissionDataExcel.cs | 22 +
Common/Data/Excel/PhonePendantDataExcel.cs | 20 +
Common/Data/Excel/RandomPlotDataExcel.cs | 21 +
Common/Data/Excel/RecommendPanelExcel.cs | 17 +
Common/Data/Excel/StageDataMainExcel.cs | 28 +
.../Excel/StepMissionCompensationExcel.cs | 21 +
Common/Data/Excel/StigmataDataExcel.cs | 26 +
Common/Data/Excel/ThemeDataAvatarExcel.cs | 21 +
Common/Data/Excel/TutorialDataExcel.cs | 20 +
Common/Data/Excel/WeaponDataExcel.cs | 25 +
Common/Data/ExcelResource.cs | 18 +
Common/Data/GameData.cs | 45 +
Common/Data/Models/Dispatch/DispatchQuery.cs | 13 +
.../Models/Dispatch/QueryDispatchModels.cs | 17 +
.../Models/Dispatch/QueryGatewayModels.cs | 30 +
Common/Data/Models/Sdk/ComboGranterModels.cs | 34 +
.../Models/Sdk/DeviceFingerprintController.cs | 6 +
Common/Data/Models/Sdk/GameWeatherModels.cs | 20 +
Common/Data/Models/Sdk/MdkShieldModels.cs | 42 +
Common/Data/Models/Sdk/ResponseBase.cs | 9 +
Common/Data/ResourceEntity.cs | 33 +
Common/Data/ResourceManager.cs | 169 +
Common/Database/Account/AccountData.cs | 150 +
Common/Database/Avatar/AvatarData.cs | 95 +
Common/Database/BaseDatabaseDataHelper.cs | 8 +
Common/Database/Client/ClientData.cs | 28 +
Common/Database/CustomSerializeService.cs | 32 +
Common/Database/DatabaseHelper.cs | 307 +
Common/Database/Inventory/InventoryData.cs | 75 +
Common/Database/Lineup/LineupData.cs | 19 +
Common/Database/Player/GuideData.cs | 9 +
Common/Database/Player/PlayerData.cs | 73 +
Common/Enums/Item/ItemMainTypeEnum.cs | 8 +
.../Enums/Language/ProgramLanguageTypeEnum.cs | 9 +
Common/Enums/Player/BanTypeEnum.cs | 13 +
Common/Enums/Player/FriendEnum.cs | 7 +
Common/Enums/Player/OperationEnum.cs | 9 +
Common/Enums/Player/PermEnum.cs | 9 +
Common/Enums/Player/PlayerStatusEnum.cs | 13 +
Common/Enums/Player/RegionEnum.cs | 29 +
Common/Internationalization/I18nManager.cs | 102 +
.../Message/LanguageCHS.cs | 527 +
.../Message/LanguageCHT.cs | 530 +
.../Message/LanguageEN.cs | 570 +
.../PluginLanguageAttribute.cs | 9 +
Common/Util/ConfigManager.cs | 99 +
Common/Util/Crpyto/DispatchEncryption.cs | 35 +
Common/Util/Extensions/Extensions.cs | 232 +
.../Extensions/JsonStringToObjectConverter.cs | 24 +
Common/Util/GameConstants.cs | 11 +
Common/Util/IConsole.cs | 185 +
Common/Util/Logger.cs | 109 +
Common/Util/LoggingMiddleware.cs | 34 +
Common/Util/Security/Crypto.cs | 29 +
Config/Config.json | 64 +
Config/Hotfix.json | 35 +
GameServer/Command/CommandArg.cs | 79 +
GameServer/Command/CommandAttribute.cs | 25 +
GameServer/Command/CommandExecutor.cs | 19 +
GameServer/Command/CommandInterface.cs | 3 +
GameServer/Command/CommandManager.cs | 126 +
GameServer/Command/CommandSender.cs | 41 +
GameServer/Game/Avatar/AvatarManager.cs | 63 +
GameServer/Game/BasePlayerManager.cs | 8 +
GameServer/Game/Inventory/InventoryManager.cs | 86 +
GameServer/Game/Player/PlayerInstance.cs | 110 +
GameServer/GameServer.csproj | 22 +
GameServer/Server/Connection.cs | 189 +
GameServer/Server/Listener.cs | 13 +
GameServer/Server/Packet/Handler.cs | 6 +
GameServer/Server/Packet/HandlerManager.cs | 31 +
GameServer/Server/Packet/Opcode.cs | 7 +
.../HandlerArkPlusActivityGetDataReq.cs | 13 +
.../HandlerBuffAssistGetActivityReq.cs | 13 +
.../HandlerGeneralActivityGetMainInfoReq.cs | 14 +
.../HandlerGeneralActivityGetScheduleReq.cs | 13 +
.../Activity/HandlerGetActivityMainDataReq.cs | 13 +
...andlerGetActivityRewardStatisticDataReq.cs | 13 +
.../HandlerGetBulletinActivityMissionReq.cs | 13 +
.../Recv/Activity/HandlerGetBulletinReq.cs | 13 +
.../HandlerGetChapterActivityDataReq.cs | 13 +
.../HandlerGetChapterCompensationInfoReq.cs | 13 +
.../HandlerGetDropLimitActivityReq.cs | 13 +
.../HandlerGetExtractReforgeActivityReq.cs | 13 +
.../Activity/HandlerGetFarmActivityDataReq.cs | 13 +
.../Activity/HandlerGetGardenScheduleReq.cs | 13 +
.../HandlerGetInviteActivityInviteeDataReq.cs | 13 +
.../HandlerGetInviteActivityInviterDataReq.cs | 13 +
.../Activity/HandlerGetLoginActivityReq.cs | 13 +
.../Activity/HandlerGetMosaicActivityReq.cs | 13 +
.../Activity/HandlerGetNewbieActivityReq.cs | 13 +
.../Activity/HandlerGetNinjaActivityReq.cs | 13 +
.../Recv/Activity/HandlerGetThemeWantedReq.cs | 13 +
.../Adventure/HandlerGetAdventureGroupReq.cs | 13 +
.../HandlerGetAdventureStorySweepInfoReq.cs | 13 +
.../HandlerGetConsignedOrderDataReq.cs | 13 +
.../Armada/HandlerGetArmadaActivityListReq.cs | 13 +
.../Recv/Armada/HandlerGetArmadaDataReq.cs | 13 +
.../HandlerGetArmadaStageScoreActivityReq.cs | 13 +
.../Packet/Recv/Auth/HandlerGetAuthkeyReq.cs | 14 +
.../Avatar/HandlerAddCustomAvatarTeamReq.cs | 13 +
.../Avatar/HandlerAvatarSubSkillLevelUpReq.cs | 13 +
.../Avatar/HandlerDelCustomAvatarTeamReq.cs | 13 +
.../Recv/Avatar/HandlerDressEquipmentReq.cs | 13 +
.../Recv/Avatar/HandlerGetAvatarDataReq.cs | 25 +
.../HandlerGetAvatarMissionActivityReq.cs | 13 +
.../Avatar/HandlerGetAvatarRollDataReq.cs | 13 +
.../Avatar/HandlerGetAvatarTeamDataReq.cs | 13 +
.../HandlerUpdateCustomAvatarTeamReq.cs | 13 +
.../Recv/Battle/HandlerGetBuffEffectReq.cs | 14 +
.../HandlerGetBattlePassMissionPanelReq.cs | 13 +
...dlerGetChallengeStepCompensationInfoReq.cs | 13 +
.../Chapter/HandlerChapterArkGetDataReq.cs | 14 +
.../HandlerChapterBwWorldGetDataReq.cs | 14 +
.../Chapter/HandlerChapterGroupGetDataReq.cs | 13 +
.../HandlerChapterKnightRichManGetDataReq.cs | 14 +
...ndlerGetEliteChapterCompensationInfoReq.cs | 13 +
.../HandlerChatworldBeastGetActivityReq.cs | 13 +
.../HandlerChatworldGetActivityScheduleReq.cs | 13 +
.../Chat/HandlerChatworldGetPrayInfoReq.cs | 13 +
.../Recv/Chat/HandlerEnterWorldChatroomReq.cs | 13 +
.../Recv/Chat/HandlerGetChatgroupListReq.cs | 13 +
.../Recv/Client/HandlerClientReportReq.cs | 13 +
.../Recv/Client/HandlerGetClientDataReq.cs | 15 +
.../Client/HandlerGetClientMailDataReq.cs | 13 +
.../Recv/Client/HandlerGetClientSettingReq.cs | 14 +
.../Recv/Client/HandlerKeepAliveNotify.cs | 13 +
.../HandlerReportClientDataVersionReq.cs | 14 +
.../Recv/Client/HandlerSetClientDataReq.cs | 27 +
.../Collection/HandlerGetCollectionListReq.cs | 13 +
.../Packet/Recv/DLC/HandlerGetDLCAvatarReq.cs | 13 +
.../Packet/Recv/DLC/HandlerGetDLCReq.cs | 13 +
.../Packet/Recv/DLC/HandlerGetDLCTowerReq.cs | 13 +
.../Packet/Recv/Dorm/HandlerGetDormDataReq.cs | 13 +
.../Recv/Dummy/HandlerGetPlotListReq.cs | 13 +
.../Recv/Dummy/HandlerGetPrivilegeInfoReq.cs | 13 +
.../Recv/Dummy/HandlerGetProductListReq.cs | 13 +
.../HandlerGetProductRecommendListReq.cs | 13 +
.../Recv/Dummy/HandlerGetRaffleActivityReq.cs | 13 +
.../Dummy/HandlerGetRankScheduleDataReq.cs | 13 +
.../Dummy/HandlerGetRecommendFriendListReq.cs | 13 +
.../Recv/Dummy/HandlerGetRecommendGoodsReq.cs | 13 +
.../Dummy/HandlerGetRewardLineActivityReq.cs | 13 +
.../Recv/Dummy/HandlerGetRoomDataReq.cs | 13 +
.../Packet/Recv/Dummy/HandlerGetRpgTaleReq.cs | 13 +
.../Recv/Dummy/HandlerGetScratchTicketReq.cs | 13 +
.../Dummy/HandlerGetSecurityPasswordReq.cs | 13 +
.../Recv/Dummy/HandlerGetShopListReq.cs | 13 +
.../Dummy/HandlerGetShoppingMallListReq.cs | 13 +
.../Dummy/HandlerGetSupportActivityReq.cs | 13 +
.../Recv/Dummy/HandlerGetSurveyDataReq.cs | 13 +
.../Dummy/HandlerGetTowerRaidActivityReq.cs | 13 +
.../Dummy/HandlerGetTradingCardActivityReq.cs | 13 +
.../Recv/Dummy/HandlerGetTrialAvatarReq.cs | 13 +
.../Recv/Dummy/HandlerGetVipRewardDataReq.cs | 13 +
.../HandlerGetVirtualAvatarGroupDetailReq.cs | 14 +
.../Packet/Recv/Elf/HandlerGetElfDataReq.cs | 13 +
.../Endless/HandlerGetEndlessStatusReq.cs | 13 +
.../HandlerGetGalInteractTriggerEventReq.cs | 14 +
.../Recv/ExBoss/HandlerExBossStageBeginReq.cs | 13 +
.../Recv/ExBoss/HandlerExBossStageEndReq.cs | 14 +
.../Recv/ExBoss/HandlerGetExBossInfoReq.cs | 13 +
.../Recv/ExBoss/HandlerGetExBossRankReq.cs | 13 +
.../ExBoss/HandlerGetExBossScheduleReq.cs | 13 +
.../HandlerGetCurrencyExchangeInfoReq.cs | 13 +
.../Friend/HandlerGetAskAddFriendListReq.cs | 13 +
.../Recv/Friend/HandlerGetFriendListReq.cs | 13 +
.../Friend/HandlerGetFriendRemarkListReq.cs | 13 +
.../Recv/Gacha/HandlerGetGachaDisplayReq.cs | 13 +
.../Packet/Recv/GodWar/HandlerGetGobackReq.cs | 13 +
.../Recv/GodWar/HandlerGetGodWarLobbyReq.cs | 13 +
.../Packet/Recv/GodWar/HandlerGetGodWarReq.cs | 13 +
.../Recv/GodWar/HandlerGetGrandKeyReq.cs | 13 +
.../GodWar/HandlerRefreshGodWarTicketReq.cs | 14 +
.../Recv/Goods/HandlerAddGoodfeelReq.cs | 13 +
.../Recv/Guide/HandlerFinishGuideReportReq.cs | 20 +
.../Guide/HandlerGetFinishGuideDataReq.cs | 13 +
.../Recv/Item/HandlerGetEquipmentDataReq.cs | 13 +
.../Item/HandlerGetEquipmentForgeDataReq.cs | 13 +
.../HandlerGetHasGotFurnitureIdListReq.cs | 13 +
.../Item/HandlerGetHasGotItemIdListReq.cs | 13 +
.../HandlerGetMasterPupilApplyReq.cs | 13 +
.../HandlerGetMasterPupilCardReq.cs | 13 +
.../HandlerGetMasterPupilDataReq.cs | 13 +
.../HandlerGetMasterPupilMainDataReq.cs | 13 +
.../Recv/Mission/HandlerGetMissionDataReq.cs | 64 +
.../HandlerGetMissionGroupMainInfoReq.cs | 13 +
.../Mission/HandlerGetMissionThemeDataReq.cs | 13 +
.../HandlerGetRecommendMissionPanelListReq.cs | 13 +
.../OpenWorld/HandlerGetNewOpenworldReq.cs | 13 +
.../HandlerGetOpenworldEndlessDataReq.cs | 14 +
.../HandlerGetOpenworldMechaDefenseReq.cs | 13 +
.../HandlerGetOpenworldQuestActivityReq.cs | 13 +
.../Pjms/HandlerPjmsGetAchievementDataReq.cs | 13 +
.../Pjms/HandlerPjmsGetActivityPanelReq.cs | 13 +
.../Recv/Pjms/HandlerPjmsGetChapterDataReq.cs | 13 +
.../Pjms/HandlerPjmsGetConditionDataReq.cs | 13 +
.../Recv/Pjms/HandlerPjmsGetCurWorldReq.cs | 13 +
.../Recv/Pjms/HandlerPjmsGetMainDataReq.cs | 13 +
.../HandlerPjmsGetResidentStageDataReq.cs | 13 +
.../Recv/Pjms/HandlerPjmsGetStoryDataReq.cs | 13 +
.../HandlerGetAssistantFrozenListReq.cs | 13 +
.../Recv/Player/HandlerGetBlackListReq.cs | 13 +
.../Packet/Recv/Player/HandlerGetConfigReq.cs | 13 +
.../Player/HandlerGetCustomHeadDataReq.cs | 13 +
.../Recv/Player/HandlerGetEmojiDataReq.cs | 13 +
.../Recv/Player/HandlerGetFrameDataReq.cs | 13 +
.../Recv/Player/HandlerGetMainDataReq.cs | 13 +
.../Recv/Player/HandlerGetMedalDataReq.cs | 13 +
.../HandlerGetOfflineResourceDataReq.cs | 13 +
.../Packet/Recv/Player/HandlerGetPediaReq.cs | 13 +
.../Player/HandlerGetPhonePendantDataReq.cs | 13 +
.../Recv/Player/HandlerGetPhotoDataReq.cs | 14 +
.../Recv/Player/HandlerGetPlayerCardReq.cs | 13 +
.../Recv/Player/HandlerGetPlayerTokenReq.cs | 47 +
.../Player/HandlerGetRegionUidRangeReq.cs | 13 +
.../Recv/Player/HandlerGetThemeDataReq.cs | 13 +
.../Recv/Player/HandlerPlayerLoginReq.cs | 16 +
.../Packet/Recv/Player/HandlerSyncTimeReq.cs | 14 +
.../HandlerTakeGalInteractTriggerEventReq.cs | 14 +
.../Product/HandlerGetCardProductInfoReq.cs | 13 +
.../Stage/HandlerGetStageActDifficultyReq.cs | 13 +
.../Recv/Stage/HandlerGetStageChapterReq.cs | 13 +
.../Recv/Stage/HandlerGetStageDataReq.cs | 14 +
.../Stage/HandlerGetStageDropDisplayReq.cs | 14 +
.../HandlerGetStageRecommendAvatarReq.cs | 14 +
.../Packet/Recv/Stage/HandlerStageBeginReq.cs | 14 +
.../Packet/Recv/Stage/HandlerStageEndReq.cs | 18 +
.../Stage/HandlerStageInnerDataReportReq.cs | 13 +
.../Recv/Story/HandlerGetExtraStoryDataReq.cs | 13 +
.../Recv/Test/HandlerGetWebActivityInfoReq.cs | 13 +
.../Test/HandlerGetWeekDayActivityDataReq.cs | 13 +
.../Recv/Test/HandlerGetWeeklyReportReq.cs | 13 +
.../HandlerGetWeeklyRoutineActivityReq.cs | 13 +
.../Packet/Recv/Test/HandlerGetWikiDataReq.cs | 13 +
.../Recv/Test/HandlerGetWorldMapDataReq.cs | 13 +
.../Test/HandlerGetWorldMapRecommendReq.cs | 13 +
.../Test/HandlerGrandKeyActivateSkillReq.cs | 13 +
.../Test/HandlerLoginWishGetMainDataReq.cs | 13 +
.../Test/HandlerOpenworldGetMechaTeamReq.cs | 13 +
.../HandlerOpenworldHuntActivityGetDataReq.cs | 13 +
.../Recv/Test/HandlerRaidReplaceGetDataReq.cs | 13 +
.../Recv/Test/HandlerRefineStigmataRuneReq.cs | 13 +
.../Recv/Test/HandlerRefreshAvatarSkillReq.cs | 13 +
.../Test/HandlerReunionCookGetActivityReq.cs | 13 +
.../Test/HandlerSanctuaryGetMainInfoReq.cs | 13 +
.../HandlerSelectGodWarChallengeAvatarReq.cs | 13 +
.../Test/HandlerSelectNewStigmataRuneReq.cs | 13 +
.../Packet/Recv/Test/HandlerSetDressReq.cs | 13 +
.../Packet/Recv/Test/HandlerSetWarshipReq.cs | 13 +
.../HandlerSimplifiedGodWarGetActivityReq.cs | 13 +
.../Test/HandlerSusannaTrialGetActivityReq.cs | 13 +
.../HandlerThemeWantedRefreshTicketReq.cs | 13 +
.../Recv/Test/HandlerTriggerGodWarEventReq.cs | 13 +
.../Test/HandlerUltraEndlessEnterSiteReq.cs | 13 +
.../Test/HandlerUltraEndlessGetMainDataReq.cs | 13 +
.../Test/HandlerUltraEndlessGetTopRankReq.cs | 13 +
.../HandlerUltraEndlessReportSiteFloorReq.cs | 13 +
.../Test/HandlerUpdateMissionProgressReq.cs | 13 +
.../Test/HandlerWaveRushGetActivityReq.cs | 13 +
.../Recv/Warship/HandlerGetWarshipDataReq.cs | 13 +
.../Warship/HandlerGetWarshipItemDataReq.cs | 13 +
.../Warship/HandlerGetWarshipTrialDataReq.cs | 13 +
.../Warship/HandlerSetWarshipAvatarReq.cs | 21 +
.../PacketArkPlusActivityGetDataRsp.cs | 17 +
.../PacketBuffAssistGetActivityRsp.cs | 17 +
.../PacketGeneralActivityGetMainInfoRsp.cs | 107 +
.../PacketGeneralActivityGetScheduleRsp.cs | 42 +
.../Activity/PacketGetActivityMainDataRsp.cs | 17 +
...PacketGetActivityRewardStatisticDataRsp.cs | 29 +
.../PacketGetBulletinActivityMissionRsp.cs | 399 +
.../Send/Activity/PacketGetBulletinRsp.cs | 17 +
.../PacketGetChapterActivityDataRsp.cs | 17 +
.../PacketGetChapterCompensationInfoRsp.cs | 17 +
.../Activity/PacketGetDropLimitActivityRsp.cs | 136 +
.../PacketGetExtractReforgeActivityRsp.cs | 17 +
.../Activity/PacketGetFarmActivityDataRsp.cs | 17 +
.../Activity/PacketGetGardenScheduleRsp.cs | 17 +
.../PacketGetInviteActivityInviteeDataRsp.cs | 25 +
.../PacketGetInviteActivityInviterDataRsp.cs | 29 +
.../Activity/PacketGetLoginActivityRsp.cs | 30 +
.../Activity/PacketGetMosaicActivityRsp.cs | 17 +
.../Activity/PacketGetNewbieActivityRsp.cs | 17 +
.../Activity/PacketGetNinjaActivityRsp.cs | 17 +
.../Send/Activity/PacketGetThemeWantedRsp.cs | 48 +
.../Adventure/PacketGetAdventureGroupRsp.cs | 17 +
.../PacketGetAdventureStorySweepInfoRsp.cs | 57 +
.../PacketGetConsignedOrderDataRsp.cs | 17 +
.../Armada/PacketGetArmadaActivityListRsp.cs | 27 +
.../Send/Armada/PacketGetArmadaDataRsp.cs | 17 +
.../PacketGetArmadaStageScoreActivityRsp.cs | 17 +
.../Packet/Send/Auth/PacketGetAuthkeyRsp.cs | 20 +
.../Avatar/PacketAddCustomAvatarTeamRsp.cs | 17 +
.../Avatar/PacketAvatarSubSkillLevelUpRsp.cs | 18 +
.../Avatar/PacketDelCustomAvatarTeamRsp.cs | 17 +
.../Send/Avatar/PacketDressEquipmentRsp.cs | 18 +
.../Send/Avatar/PacketGetAvatarDataRsp.cs | 19 +
.../PacketGetAvatarMissionActivityRsp.cs | 17 +
.../Send/Avatar/PacketGetAvatarRollDataRsp.cs | 161 +
.../Send/Avatar/PacketGetAvatarTeamDataRsp.cs | 17 +
.../Avatar/PacketUpdateCustomAvatarTeamRsp.cs | 17 +
.../Send/Battle/PacketGetBuffEffectRsp.cs | 27 +
.../PacketGetBattlePassMissionPanelRsp.cs | 17 +
...cketGetChallengeStepCompensationInfoRsp.cs | 38 +
.../Chapter/PacketChapterArkGetDataRsp.cs | 44 +
.../Chapter/PacketChapterBwWorldGetDataRsp.cs | 20 +
.../Chapter/PacketChapterGroupGetDataRsp.cs | 35 +
.../PacketChapterKnightRichManGetDataRsp.cs | 19 +
...acketGetEliteChapterCompensationInfoRsp.cs | 25 +
.../PacketChatworldBeastGetActivityRsp.cs | 17 +
.../PacketChatworldGetActivityScheduleRsp.cs | 19 +
.../Chat/PacketChatworldGetPrayInfoRsp.cs | 17 +
.../Send/Chat/PacketEnterWorldChatroomRsp.cs | 19 +
.../Send/Chat/PacketGetChatgroupListRsp.cs | 17 +
.../Send/Client/PacketClientReportRsp.cs | 17 +
.../Send/Client/PacketGetClientDataRsp.cs | 21 +
.../Send/Client/PacketGetClientMailDataRsp.cs | 17 +
.../Send/Client/PacketGetClientSettingRsp.cs | 18 +
.../PacketReportClientDataVersionRsp.cs | 17 +
.../Send/Client/PacketSetClientDataRsp.cs | 18 +
.../Collection/PacketGetCollectionListRsp.cs | 21 +
.../Packet/Send/DLC/PacketGetDLCAvatarRsp.cs | 17 +
.../Server/Packet/Send/DLC/PacketGetDLCRsp.cs | 17 +
.../Packet/Send/DLC/PacketGetDLCTowerRsp.cs | 17 +
.../Packet/Send/Dorm/PacketGetDormDataRsp.cs | 218 +
.../Packet/Send/Dummy/PacketGetPlotListRsp.cs | 4285 ++
.../Send/Dummy/PacketGetPrivilegeInfoRsp.cs | 97 +
.../Send/Dummy/PacketGetProductListRsp.cs | 21 +
.../Dummy/PacketGetProductRecommendListRsp.cs | 20 +
.../Send/Dummy/PacketGetRaffleActivityRsp.cs | 17 +
.../Dummy/PacketGetRankScheduleDataRsp.cs | 17 +
.../Dummy/PacketGetRecommendFriendListRsp.cs | 17 +
.../Send/Dummy/PacketGetRecommendGoodsRsp.cs | 17 +
.../Dummy/PacketGetRewardLineActivityRsp.cs | 27 +
.../Packet/Send/Dummy/PacketGetRoomDataRsp.cs | 17 +
.../Packet/Send/Dummy/PacketGetRpgTaleRsp.cs | 17 +
.../Send/Dummy/PacketGetScratchTicketRsp.cs | 17 +
.../Dummy/PacketGetSecurityPasswordRsp.cs | 17 +
.../Packet/Send/Dummy/PacketGetShopListRsp.cs | 17 +
.../Dummy/PacketGetShoppingMallListRsp.cs | 17 +
.../Send/Dummy/PacketGetSupportActivityRsp.cs | 17 +
.../Send/Dummy/PacketGetSurveyDataRsp.cs | 17 +
.../Dummy/PacketGetTowerRaidActivityRsp.cs | 17 +
.../Dummy/PacketGetTradingCardActivityRsp.cs | 17 +
.../Send/Dummy/PacketGetTrialAvatarRsp.cs | 17 +
.../Send/Dummy/PacketGetVipRewardDataRsp.cs | 145 +
.../PacketGetVirtualAvatarGroupDetailRsp.cs | 41 +
.../Packet/Send/Elf/PacketGetElfDataRsp.cs | 719 +
.../Send/Endless/PacketGetEndlessStatusRsp.cs | 35 +
.../PacketGetGalInteractTriggerEventRsp.cs | 17 +
.../Send/ExBoss/PacketExBossStageBeginRsp.cs | 17 +
.../Send/ExBoss/PacketExBossStageEndRsp.cs | 18 +
.../Send/ExBoss/PacketGetExBossInfoRsp.cs | 26 +
.../Send/ExBoss/PacketGetExBossRankRsp.cs | 39 +
.../Send/ExBoss/PacketGetExBossScheduleRsp.cs | 22 +
.../PacketGetCurrencyExchangeInfoRsp.cs | 17 +
.../Friend/PacketGetAskAddFriendListRsp.cs | 17 +
.../Send/Friend/PacketGetFriendListRsp.cs | 17 +
.../Friend/PacketGetFriendRemarkListRsp.cs | 17 +
.../Send/Gacha/PacketGetGachaDisplayRsp.cs | 17 +
.../Packet/Send/GodWar/PacketGetGobackRsp.cs | 17 +
.../Send/GodWar/PacketGetGodWarLobbyRsp.cs | 20 +
.../Packet/Send/GodWar/PacketGetGodWarRsp.cs | 18 +
.../Send/GodWar/PacketGetGrandKeyRsp.cs | 99 +
.../GodWar/PacketRefreshGodWarTicketRsp.cs | 17 +
.../Packet/Send/Goods/PacketAddGoodfeelRsp.cs | 17 +
.../Send/Guide/PacketFinishGuideReportRsp.cs | 20 +
.../Send/Guide/PacketGetFinishGuideDataRsp.cs | 731 +
.../Send/Item/PacketGetEquipmentDataRsp.cs | 18 +
.../Item/PacketGetEquipmentForgeDataRsp.cs | 67 +
.../Item/PacketGetHasGotFurnitureIdListRsp.cs | 33 +
.../Send/Item/PacketGetHasGotItemIdListRsp.cs | 580 +
.../PacketGetMasterPupilApplyRsp.cs | 18 +
.../PacketGetMasterPupilCardRsp.cs | 17 +
.../PacketGetMasterPupilDataRsp.cs | 17 +
.../PacketGetMasterPupilMainDataRsp.cs | 17 +
.../Send/Mission/PacketGetMissionDataRsp.cs | 22 +
.../PacketGetMissionGroupMainInfoRsp.cs | 19 +
.../Mission/PacketGetMissionThemeDataRsp.cs | 19 +
.../PacketGetRecommendMissionPanelListRsp.cs | 31 +
.../OpenWorld/PacketGetNewOpenworldRsp.cs | 168 +
.../PacketGetOpenworldEndlessDataRsp.cs | 24 +
.../PacketGetOpenworldMechaDefenseRsp.cs | 20 +
.../PacketGetOpenworldQuestActivityRsp.cs | 17 +
.../Pjms/PacketPjmsGetAchievementDataRsp.cs | 17 +
.../Pjms/PacketPjmsGetActivityPanelRsp.cs | 60 +
.../Send/Pjms/PacketPjmsGetChapterDataRsp.cs | 85 +
.../Pjms/PacketPjmsGetConditionDataRsp.cs | 17 +
.../Send/Pjms/PacketPjmsGetCurWorldRsp.cs | 17 +
.../Send/Pjms/PacketPjmsGetMainDataRsp.cs | 17 +
.../Pjms/PacketPjmsGetResidentStageDataRsp.cs | 17 +
.../Send/Pjms/PacketPjmsGetStoryDataRsp.cs | 17 +
.../Player/PacketGetAssistantFrozenListRsp.cs | 17 +
.../Send/Player/PacketGetBlackListRsp.cs | 17 +
.../Packet/Send/Player/PacketGetConfigRsp.cs | 407 +
.../Send/Player/PacketGetCustomHeadDataRsp.cs | 24 +
.../Send/Player/PacketGetEmojiDataRsp.cs | 17 +
.../Send/Player/PacketGetFrameDataRsp.cs | 27 +
.../Send/Player/PacketGetMainDataRsp.cs | 28 +
.../Send/Player/PacketGetMedalDataRsp.cs | 74 +
.../Player/PacketGetOfflineResourceDataRsp.cs | 17 +
.../Packet/Send/Player/PacketGetPediaRsp.cs | 7021 +++
.../Player/PacketGetPhonePendantDataRsp.cs | 38 +
.../Send/Player/PacketGetPhotoDataRsp.cs | 128 +
.../Send/Player/PacketGetPlayerCardRsp.cs | 17 +
.../Send/Player/PacketGetPlayerTokenRsp.cs | 32 +
.../Send/Player/PacketGetRegionUidRangeRsp.cs | 26 +
.../Send/Player/PacketGetThemeDataRsp.cs | 28 +
.../Send/Player/PacketPlayerLoginRsp.cs | 21 +
.../Packet/Send/Player/PacketSyncTimeRsp.cs | 19 +
.../PacketTakeGalInteractTriggerEventRsp.cs | 18 +
.../Product/PacketGetCardProductInfoRsp.cs | 17 +
.../Stage/PacketGetStageActDifficultyRsp.cs | 27 +
.../Send/Stage/PacketGetStageChapterRsp.cs | 17 +
.../Send/Stage/PacketGetStageDataRsp.cs | 105 +
.../Stage/PacketGetStageDropDisplayRsp.cs | 24 +
.../Stage/PacketGetStageRecommendAvatarRsp.cs | 24 +
.../Packet/Send/Stage/PacketStageBeginRsp.cs | 17 +
.../Packet/Send/Stage/PacketStageEndRsp.cs | 18 +
.../Stage/PacketStageInnerDataReportRsp.cs | 17 +
.../Send/Story/PacketGetExtraStoryDataRsp.cs | 17 +
.../Send/Test/PacketGetWebActivityInfoRsp.cs | 17 +
.../Test/PacketGetWeekDayActivityDataRsp.cs | 31 +
.../Send/Test/PacketGetWeeklyReportRsp.cs | 19 +
.../Test/PacketGetWeeklyRoutineActivityRsp.cs | 17 +
.../Packet/Send/Test/PacketGetWikiDataRsp.cs | 18 +
.../Send/Test/PacketGetWorldMapDataRsp.cs | 201 +
.../Test/PacketGetWorldMapRecommendRsp.cs | 82 +
.../Test/PacketGrandKeyActivateSkillRsp.cs | 17 +
.../Test/PacketLoginWishGetMainDataRsp.cs | 29 +
.../Test/PacketOpenworldGetMechaTeamRsp.cs | 17 +
.../PacketOpenworldHuntActivityGetDataRsp.cs | 17 +
.../Send/Test/PacketRaidReplaceGetDataRsp.cs | 17 +
.../Send/Test/PacketRefineStigmataRuneRsp.cs | 17 +
.../Send/Test/PacketRefreshAvatarSkillRsp.cs | 17 +
.../Test/PacketReunionCookGetActivityRsp.cs | 17 +
.../Test/PacketSanctuaryGetMainInfoRsp.cs | 17 +
.../PacketSelectGodWarChallengeAvatarRsp.cs | 17 +
.../Test/PacketSelectNewStigmataRuneRsp.cs | 17 +
.../Packet/Send/Test/PacketSetDressRsp.cs | 17 +
.../Send/Test/PacketSetWarshipAvatarRsp.cs | 17 +
.../Packet/Send/Test/PacketSetWarshipRsp.cs | 17 +
.../PacketSimplifiedGodWarGetActivityRsp.cs | 17 +
.../Test/PacketSusannaTrialGetActivityRsp.cs | 17 +
.../Test/PacketThemeWantedRefreshTicketRsp.cs | 17 +
.../Send/Test/PacketTriggerGodWarEventRsp.cs | 17 +
.../Test/PacketUltraEndlessEnterSiteRsp.cs | 17 +
.../Test/PacketUltraEndlessGetMainDataRsp.cs | 17 +
.../Test/PacketUltraEndlessGetTopRankRsp.cs | 17 +
.../PacketUltraEndlessReportSiteFloorRsp.cs | 17 +
.../Test/PacketUpdateMissionProgressRsp.cs | 17 +
.../Send/Test/PacketWaveRushGetActivityRsp.cs | 17 +
.../Send/Warship/PacketGetWarshipDataRsp.cs | 41 +
.../Warship/PacketGetWarshipItemDataRsp.cs | 19 +
.../Warship/PacketGetWarshipTrialDataRsp.cs | 17 +
.../Send/Warship/PacketSetWarshipAvatarRsp.cs | 17 +
KcpSharp/Base/ArrayMemoryOwner.cs | 23 +
KcpSharp/Base/AsyncAutoResetEvent.cs | 112 +
.../Base/DefaultArrayPoolBufferAllocator.cs | 11 +
KcpSharp/Base/IKcpBufferPool.cs | 14 +
KcpSharp/Base/IKcpConversation.cs | 25 +
...KcpConversationUpdateNotificationSource.cs | 7 +
KcpSharp/Base/IKcpExceptionProducer.cs | 16 +
KcpSharp/Base/IKcpMultiplexConnection.cs | 56 +
KcpSharp/Base/IKcpMultiplexConnectionOfT.cs | 56 +
KcpSharp/Base/IKcpTransport.cs | 18 +
KcpSharp/Base/IKcpTransportOfT.cs | 22 +
KcpSharp/Base/KcpAcknowledgeList.cs | 93 +
KcpSharp/Base/KcpBuffer.cs | 51 +
KcpSharp/Base/KcpBufferPoolRentOptions.cs | 50 +
KcpSharp/Base/KcpCommand.cs | 9 +
...KcpConversation.FlushAsyncMethodBuilder.cs | 272 +
KcpSharp/Base/KcpConversation.cs | 1467 +
KcpSharp/Base/KcpConversationOptions.cs | 98 +
KcpSharp/Base/KcpConversationReceiveResult.cs | 77 +
.../Base/KcpConversationUpdateActivation.cs | 474 +
.../Base/KcpConversationUpdateNotification.cs | 27 +
.../Base/KcpExceptionProducerExtensions.cs | 106 +
KcpSharp/Base/KcpGlobalVars.cs | 13 +
KcpSharp/Base/KcpKeepAliveOptions.cs | 26 +
KcpSharp/Base/KcpMultiplexConnection.cs | 281 +
KcpSharp/Base/KcpPacketHeader.cs | 89 +
KcpSharp/Base/KcpProbeType.cs | 9 +
KcpSharp/Base/KcpRawChannel.cs | 400 +
KcpSharp/Base/KcpRawChannelOptions.cs | 34 +
KcpSharp/Base/KcpRawReceiveQueue.cs | 343 +
KcpSharp/Base/KcpRawSendOperation.cs | 184 +
KcpSharp/Base/KcpReceiveQueue.cs | 638 +
.../KcpReceiveWindowNotificationOptions.cs | 30 +
KcpSharp/Base/KcpRentedBuffer.cs | 195 +
KcpSharp/Base/KcpSendQueue.cs | 653 +
KcpSharp/Base/KcpSendReceiveBufferItem.cs | 8 +
.../Base/KcpSendReceiveBufferItemCache.cs | 68 +
KcpSharp/Base/KcpSendReceiveQueueItemCache.cs | 76 +
KcpSharp/Base/KcpSendSegmentStats.cs | 17 +
KcpSharp/Base/KcpSocketTransport.cs | 123 +
.../Base/KcpSocketTransportForConversation.cs | 48 +
...cpSocketTransportForMultiplexConnection.cs | 42 +
.../Base/KcpSocketTransportForRawChannel.cs | 43 +
KcpSharp/Base/KcpSocketTransportOfT.cs | 199 +
KcpSharp/Base/KcpStream.cs | 176 +
.../AwaitableSocketAsyncEventArgs.cs | 36 +
.../NetstandardShim/CancellationTokenShim.cs | 12 +
.../NetstandardShim/LinkedListNetstandard.cs | 212 +
.../NetstandardShim/TaskCompletionSource.cs | 10 +
KcpSharp/Base/ThrowHelper.cs | 84 +
KcpSharp/BasePacket.cs | 67 +
KcpSharp/KcpConnection.cs | 165 +
KcpSharp/KcpListener.cs | 148 +
KcpSharp/KcpSharp.csproj | 21 +
KcpSharp/SessionStateEnum.cs | 10 +
KianaBH.sln | 60 +
KianaBH/KianaBH.csproj | 21 +
KianaBH/Program/KianaBH.cs | 92 +
KianaBH/Program/LoaderManager.cs | 175 +
.../KianaBH-Win64-Debug.pubxml | 18 +
.../KianaBH-Win64-MultiFile.pubxml | 19 +
.../KianaBH-Win64-OneFile.pubxml | 19 +
KianaBH/Source/Kiana.ico | Bin 0 -> 432254 bytes
KianaBH/Tool/AssemblyGenerater.cs | 38 +
KianaBH/Tool/HandbookGenerator.cs | 95 +
Proto/BH3.proto | 52490 ++++++++++++++++
Proto/CmdIds.cs | 3094 +
Proto/Proto.csproj | 26 +
.../Dispatch/QueryDispatchController.cs | 41 +
.../Dispatch/QueryGatewayController.cs | 191 +
SdkServer/Handlers/Sdk/AbTestController.cs | 33 +
.../Handlers/Sdk/ComboGranterController.cs | 123 +
.../Sdk/DeviceFingerprintController.cs | 57 +
.../Handlers/Sdk/GameWeatherController.cs | 31 +
.../Handlers/Sdk/LogDataUploadController.cs | 36 +
.../Handlers/Sdk/MaPassportController.cs | 50 +
SdkServer/Handlers/Sdk/MdkController.cs | 153 +
SdkServer/Handlers/Sdk/RiskyController.cs | 14 +
SdkServer/SdkServer.cs | 53 +
SdkServer/SdkServer.csproj | 32 +
568 files changed, 92872 insertions(+)
create mode 100644 .editorconfig
create mode 100644 .gitattributes
create mode 100644 .gitignore
create mode 100644 Common/Common.csproj
create mode 100644 Common/Configuration/ConfigContainer.cs
create mode 100644 Common/Configuration/HotfixContainer.cs
create mode 100644 Common/Data/Config/TimeStampConfig.cs
create mode 100644 Common/Data/Excel/ActChallengeDataExcel.cs
create mode 100644 Common/Data/Excel/ActivityTowerExcel.cs
create mode 100644 Common/Data/Excel/AffixListExcel.cs
create mode 100644 Common/Data/Excel/AvatarDataExcel.cs
create mode 100644 Common/Data/Excel/AvatarSubSkillDataExcel.cs
create mode 100644 Common/Data/Excel/AvatarTutorialExcel.cs
create mode 100644 Common/Data/Excel/ChapterGroupConfigExcel.cs
create mode 100644 Common/Data/Excel/CityEventPhotoExcel.cs
create mode 100644 Common/Data/Excel/CollectionExcel.cs
create mode 100644 Common/Data/Excel/CustomHeadDataExcel.cs
create mode 100644 Common/Data/Excel/DressDataExcel.cs
create mode 100644 Common/Data/Excel/ElfAstraMateDataExcel.cs
create mode 100644 Common/Data/Excel/ElfSkillDataExcel.cs
create mode 100644 Common/Data/Excel/EntryThemeDataExcel.cs
create mode 100644 Common/Data/Excel/EntryThemeItemDataExcel.cs
create mode 100644 Common/Data/Excel/FrameDataExcel.cs
create mode 100644 Common/Data/Excel/GeneralActivityExcel.cs
create mode 100644 Common/Data/Excel/GeneralActivityStageGroupExcel.cs
create mode 100644 Common/Data/Excel/GodWarEventExcel.cs
create mode 100644 Common/Data/Excel/GodWarMainAvatarExcel.cs
create mode 100644 Common/Data/Excel/GodWarRelationDataExcel.cs
create mode 100644 Common/Data/Excel/GodWarSupportAvatarExcel.cs
create mode 100644 Common/Data/Excel/GodWarTaleScheduleExcel.cs
create mode 100644 Common/Data/Excel/GodWarTalentDataExcel.cs
create mode 100644 Common/Data/Excel/MaterialDataExcel.cs
create mode 100644 Common/Data/Excel/MissionDataExcel.cs
create mode 100644 Common/Data/Excel/PhonePendantDataExcel.cs
create mode 100644 Common/Data/Excel/RandomPlotDataExcel.cs
create mode 100644 Common/Data/Excel/RecommendPanelExcel.cs
create mode 100644 Common/Data/Excel/StageDataMainExcel.cs
create mode 100644 Common/Data/Excel/StepMissionCompensationExcel.cs
create mode 100644 Common/Data/Excel/StigmataDataExcel.cs
create mode 100644 Common/Data/Excel/ThemeDataAvatarExcel.cs
create mode 100644 Common/Data/Excel/TutorialDataExcel.cs
create mode 100644 Common/Data/Excel/WeaponDataExcel.cs
create mode 100644 Common/Data/ExcelResource.cs
create mode 100644 Common/Data/GameData.cs
create mode 100644 Common/Data/Models/Dispatch/DispatchQuery.cs
create mode 100644 Common/Data/Models/Dispatch/QueryDispatchModels.cs
create mode 100644 Common/Data/Models/Dispatch/QueryGatewayModels.cs
create mode 100644 Common/Data/Models/Sdk/ComboGranterModels.cs
create mode 100644 Common/Data/Models/Sdk/DeviceFingerprintController.cs
create mode 100644 Common/Data/Models/Sdk/GameWeatherModels.cs
create mode 100644 Common/Data/Models/Sdk/MdkShieldModels.cs
create mode 100644 Common/Data/Models/Sdk/ResponseBase.cs
create mode 100644 Common/Data/ResourceEntity.cs
create mode 100644 Common/Data/ResourceManager.cs
create mode 100644 Common/Database/Account/AccountData.cs
create mode 100644 Common/Database/Avatar/AvatarData.cs
create mode 100644 Common/Database/BaseDatabaseDataHelper.cs
create mode 100644 Common/Database/Client/ClientData.cs
create mode 100644 Common/Database/CustomSerializeService.cs
create mode 100644 Common/Database/DatabaseHelper.cs
create mode 100644 Common/Database/Inventory/InventoryData.cs
create mode 100644 Common/Database/Lineup/LineupData.cs
create mode 100644 Common/Database/Player/GuideData.cs
create mode 100644 Common/Database/Player/PlayerData.cs
create mode 100644 Common/Enums/Item/ItemMainTypeEnum.cs
create mode 100644 Common/Enums/Language/ProgramLanguageTypeEnum.cs
create mode 100644 Common/Enums/Player/BanTypeEnum.cs
create mode 100644 Common/Enums/Player/FriendEnum.cs
create mode 100644 Common/Enums/Player/OperationEnum.cs
create mode 100644 Common/Enums/Player/PermEnum.cs
create mode 100644 Common/Enums/Player/PlayerStatusEnum.cs
create mode 100644 Common/Enums/Player/RegionEnum.cs
create mode 100644 Common/Internationalization/I18nManager.cs
create mode 100644 Common/Internationalization/Message/LanguageCHS.cs
create mode 100644 Common/Internationalization/Message/LanguageCHT.cs
create mode 100644 Common/Internationalization/Message/LanguageEN.cs
create mode 100644 Common/Internationalization/PluginLanguageAttribute.cs
create mode 100644 Common/Util/ConfigManager.cs
create mode 100644 Common/Util/Crpyto/DispatchEncryption.cs
create mode 100644 Common/Util/Extensions/Extensions.cs
create mode 100644 Common/Util/Extensions/JsonStringToObjectConverter.cs
create mode 100644 Common/Util/GameConstants.cs
create mode 100644 Common/Util/IConsole.cs
create mode 100644 Common/Util/Logger.cs
create mode 100644 Common/Util/LoggingMiddleware.cs
create mode 100644 Common/Util/Security/Crypto.cs
create mode 100644 Config/Config.json
create mode 100644 Config/Hotfix.json
create mode 100644 GameServer/Command/CommandArg.cs
create mode 100644 GameServer/Command/CommandAttribute.cs
create mode 100644 GameServer/Command/CommandExecutor.cs
create mode 100644 GameServer/Command/CommandInterface.cs
create mode 100644 GameServer/Command/CommandManager.cs
create mode 100644 GameServer/Command/CommandSender.cs
create mode 100644 GameServer/Game/Avatar/AvatarManager.cs
create mode 100644 GameServer/Game/BasePlayerManager.cs
create mode 100644 GameServer/Game/Inventory/InventoryManager.cs
create mode 100644 GameServer/Game/Player/PlayerInstance.cs
create mode 100644 GameServer/GameServer.csproj
create mode 100644 GameServer/Server/Connection.cs
create mode 100644 GameServer/Server/Listener.cs
create mode 100644 GameServer/Server/Packet/Handler.cs
create mode 100644 GameServer/Server/Packet/HandlerManager.cs
create mode 100644 GameServer/Server/Packet/Opcode.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerArkPlusActivityGetDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerBuffAssistGetActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerGeneralActivityGetMainInfoReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerGeneralActivityGetScheduleReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerGetActivityMainDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerGetActivityRewardStatisticDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerGetBulletinActivityMissionReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerGetBulletinReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerGetChapterActivityDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerGetChapterCompensationInfoReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerGetDropLimitActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerGetExtractReforgeActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerGetFarmActivityDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerGetGardenScheduleReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerGetInviteActivityInviteeDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerGetInviteActivityInviterDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerGetLoginActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerGetMosaicActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerGetNewbieActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerGetNinjaActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Activity/HandlerGetThemeWantedReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Adventure/HandlerGetAdventureGroupReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Adventure/HandlerGetAdventureStorySweepInfoReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Adventure/HandlerGetConsignedOrderDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Armada/HandlerGetArmadaActivityListReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Armada/HandlerGetArmadaDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Armada/HandlerGetArmadaStageScoreActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Auth/HandlerGetAuthkeyReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Avatar/HandlerAddCustomAvatarTeamReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Avatar/HandlerAvatarSubSkillLevelUpReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Avatar/HandlerDelCustomAvatarTeamReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Avatar/HandlerDressEquipmentReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Avatar/HandlerGetAvatarDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Avatar/HandlerGetAvatarMissionActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Avatar/HandlerGetAvatarRollDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Avatar/HandlerGetAvatarTeamDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Avatar/HandlerUpdateCustomAvatarTeamReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Battle/HandlerGetBuffEffectReq.cs
create mode 100644 GameServer/Server/Packet/Recv/BattlePass/HandlerGetBattlePassMissionPanelReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Challenge/HandlerGetChallengeStepCompensationInfoReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Chapter/HandlerChapterArkGetDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Chapter/HandlerChapterBwWorldGetDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Chapter/HandlerChapterGroupGetDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Chapter/HandlerChapterKnightRichManGetDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Chapter/HandlerGetEliteChapterCompensationInfoReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Chat/HandlerChatworldBeastGetActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Chat/HandlerChatworldGetActivityScheduleReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Chat/HandlerChatworldGetPrayInfoReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Chat/HandlerEnterWorldChatroomReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Chat/HandlerGetChatgroupListReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Client/HandlerClientReportReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Client/HandlerGetClientDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Client/HandlerGetClientMailDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Client/HandlerGetClientSettingReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Client/HandlerKeepAliveNotify.cs
create mode 100644 GameServer/Server/Packet/Recv/Client/HandlerReportClientDataVersionReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Client/HandlerSetClientDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Collection/HandlerGetCollectionListReq.cs
create mode 100644 GameServer/Server/Packet/Recv/DLC/HandlerGetDLCAvatarReq.cs
create mode 100644 GameServer/Server/Packet/Recv/DLC/HandlerGetDLCReq.cs
create mode 100644 GameServer/Server/Packet/Recv/DLC/HandlerGetDLCTowerReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dorm/HandlerGetDormDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetPlotListReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetPrivilegeInfoReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetProductListReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetProductRecommendListReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetRaffleActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetRankScheduleDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetRecommendFriendListReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetRecommendGoodsReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetRewardLineActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetRoomDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetRpgTaleReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetScratchTicketReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetSecurityPasswordReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetShopListReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetShoppingMallListReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetSupportActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetSurveyDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetTowerRaidActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetTradingCardActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetTrialAvatarReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetVipRewardDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Dummy/HandlerGetVirtualAvatarGroupDetailReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Elf/HandlerGetElfDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Endless/HandlerGetEndlessStatusReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Event/HandlerGetGalInteractTriggerEventReq.cs
create mode 100644 GameServer/Server/Packet/Recv/ExBoss/HandlerExBossStageBeginReq.cs
create mode 100644 GameServer/Server/Packet/Recv/ExBoss/HandlerExBossStageEndReq.cs
create mode 100644 GameServer/Server/Packet/Recv/ExBoss/HandlerGetExBossInfoReq.cs
create mode 100644 GameServer/Server/Packet/Recv/ExBoss/HandlerGetExBossRankReq.cs
create mode 100644 GameServer/Server/Packet/Recv/ExBoss/HandlerGetExBossScheduleReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Exchange/HandlerGetCurrencyExchangeInfoReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Friend/HandlerGetAskAddFriendListReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Friend/HandlerGetFriendListReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Friend/HandlerGetFriendRemarkListReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Gacha/HandlerGetGachaDisplayReq.cs
create mode 100644 GameServer/Server/Packet/Recv/GodWar/HandlerGetGobackReq.cs
create mode 100644 GameServer/Server/Packet/Recv/GodWar/HandlerGetGodWarLobbyReq.cs
create mode 100644 GameServer/Server/Packet/Recv/GodWar/HandlerGetGodWarReq.cs
create mode 100644 GameServer/Server/Packet/Recv/GodWar/HandlerGetGrandKeyReq.cs
create mode 100644 GameServer/Server/Packet/Recv/GodWar/HandlerRefreshGodWarTicketReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Goods/HandlerAddGoodfeelReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Guide/HandlerFinishGuideReportReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Guide/HandlerGetFinishGuideDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Item/HandlerGetEquipmentDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Item/HandlerGetEquipmentForgeDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Item/HandlerGetHasGotFurnitureIdListReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Item/HandlerGetHasGotItemIdListReq.cs
create mode 100644 GameServer/Server/Packet/Recv/MasterPupil/HandlerGetMasterPupilApplyReq.cs
create mode 100644 GameServer/Server/Packet/Recv/MasterPupil/HandlerGetMasterPupilCardReq.cs
create mode 100644 GameServer/Server/Packet/Recv/MasterPupil/HandlerGetMasterPupilDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/MasterPupil/HandlerGetMasterPupilMainDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Mission/HandlerGetMissionDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Mission/HandlerGetMissionGroupMainInfoReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Mission/HandlerGetMissionThemeDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Mission/HandlerGetRecommendMissionPanelListReq.cs
create mode 100644 GameServer/Server/Packet/Recv/OpenWorld/HandlerGetNewOpenworldReq.cs
create mode 100644 GameServer/Server/Packet/Recv/OpenWorld/HandlerGetOpenworldEndlessDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/OpenWorld/HandlerGetOpenworldMechaDefenseReq.cs
create mode 100644 GameServer/Server/Packet/Recv/OpenWorld/HandlerGetOpenworldQuestActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Pjms/HandlerPjmsGetAchievementDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Pjms/HandlerPjmsGetActivityPanelReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Pjms/HandlerPjmsGetChapterDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Pjms/HandlerPjmsGetConditionDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Pjms/HandlerPjmsGetCurWorldReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Pjms/HandlerPjmsGetMainDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Pjms/HandlerPjmsGetResidentStageDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Pjms/HandlerPjmsGetStoryDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerGetAssistantFrozenListReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerGetBlackListReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerGetConfigReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerGetCustomHeadDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerGetEmojiDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerGetFrameDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerGetMainDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerGetMedalDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerGetOfflineResourceDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerGetPediaReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerGetPhonePendantDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerGetPhotoDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerGetPlayerCardReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerGetPlayerTokenReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerGetRegionUidRangeReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerGetThemeDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerPlayerLoginReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerSyncTimeReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Player/HandlerTakeGalInteractTriggerEventReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Product/HandlerGetCardProductInfoReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Stage/HandlerGetStageActDifficultyReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Stage/HandlerGetStageChapterReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Stage/HandlerGetStageDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Stage/HandlerGetStageDropDisplayReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Stage/HandlerGetStageRecommendAvatarReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Stage/HandlerStageBeginReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Stage/HandlerStageEndReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Stage/HandlerStageInnerDataReportReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Story/HandlerGetExtraStoryDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerGetWebActivityInfoReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerGetWeekDayActivityDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerGetWeeklyReportReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerGetWeeklyRoutineActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerGetWikiDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerGetWorldMapDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerGetWorldMapRecommendReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerGrandKeyActivateSkillReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerLoginWishGetMainDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerOpenworldGetMechaTeamReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerOpenworldHuntActivityGetDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerRaidReplaceGetDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerRefineStigmataRuneReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerRefreshAvatarSkillReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerReunionCookGetActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerSanctuaryGetMainInfoReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerSelectGodWarChallengeAvatarReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerSelectNewStigmataRuneReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerSetDressReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerSetWarshipReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerSimplifiedGodWarGetActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerSusannaTrialGetActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerThemeWantedRefreshTicketReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerTriggerGodWarEventReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerUltraEndlessEnterSiteReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerUltraEndlessGetMainDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerUltraEndlessGetTopRankReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerUltraEndlessReportSiteFloorReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerUpdateMissionProgressReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Test/HandlerWaveRushGetActivityReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Warship/HandlerGetWarshipDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Warship/HandlerGetWarshipItemDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Warship/HandlerGetWarshipTrialDataReq.cs
create mode 100644 GameServer/Server/Packet/Recv/Warship/HandlerSetWarshipAvatarReq.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketArkPlusActivityGetDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketBuffAssistGetActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketGeneralActivityGetMainInfoRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketGeneralActivityGetScheduleRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketGetActivityMainDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketGetActivityRewardStatisticDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketGetBulletinActivityMissionRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketGetBulletinRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketGetChapterActivityDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketGetChapterCompensationInfoRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketGetDropLimitActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketGetExtractReforgeActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketGetFarmActivityDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketGetGardenScheduleRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketGetInviteActivityInviteeDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketGetInviteActivityInviterDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketGetLoginActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketGetMosaicActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketGetNewbieActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketGetNinjaActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Activity/PacketGetThemeWantedRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Adventure/PacketGetAdventureGroupRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Adventure/PacketGetAdventureStorySweepInfoRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Adventure/PacketGetConsignedOrderDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Armada/PacketGetArmadaActivityListRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Armada/PacketGetArmadaDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Armada/PacketGetArmadaStageScoreActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Auth/PacketGetAuthkeyRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Avatar/PacketAddCustomAvatarTeamRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Avatar/PacketAvatarSubSkillLevelUpRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Avatar/PacketDelCustomAvatarTeamRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Avatar/PacketDressEquipmentRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Avatar/PacketGetAvatarDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Avatar/PacketGetAvatarMissionActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Avatar/PacketGetAvatarRollDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Avatar/PacketGetAvatarTeamDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Avatar/PacketUpdateCustomAvatarTeamRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Battle/PacketGetBuffEffectRsp.cs
create mode 100644 GameServer/Server/Packet/Send/BattlePass/PacketGetBattlePassMissionPanelRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Challenge/PacketGetChallengeStepCompensationInfoRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Chapter/PacketChapterArkGetDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Chapter/PacketChapterBwWorldGetDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Chapter/PacketChapterGroupGetDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Chapter/PacketChapterKnightRichManGetDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Chapter/PacketGetEliteChapterCompensationInfoRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Chat/PacketChatworldBeastGetActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Chat/PacketChatworldGetActivityScheduleRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Chat/PacketChatworldGetPrayInfoRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Chat/PacketEnterWorldChatroomRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Chat/PacketGetChatgroupListRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Client/PacketClientReportRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Client/PacketGetClientDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Client/PacketGetClientMailDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Client/PacketGetClientSettingRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Client/PacketReportClientDataVersionRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Client/PacketSetClientDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Collection/PacketGetCollectionListRsp.cs
create mode 100644 GameServer/Server/Packet/Send/DLC/PacketGetDLCAvatarRsp.cs
create mode 100644 GameServer/Server/Packet/Send/DLC/PacketGetDLCRsp.cs
create mode 100644 GameServer/Server/Packet/Send/DLC/PacketGetDLCTowerRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dorm/PacketGetDormDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetPlotListRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetPrivilegeInfoRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetProductListRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetProductRecommendListRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetRaffleActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetRankScheduleDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetRecommendFriendListRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetRecommendGoodsRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetRewardLineActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetRoomDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetRpgTaleRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetScratchTicketRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetSecurityPasswordRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetShopListRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetShoppingMallListRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetSupportActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetSurveyDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetTowerRaidActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetTradingCardActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetTrialAvatarRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetVipRewardDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Dummy/PacketGetVirtualAvatarGroupDetailRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Elf/PacketGetElfDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Endless/PacketGetEndlessStatusRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Event/PacketGetGalInteractTriggerEventRsp.cs
create mode 100644 GameServer/Server/Packet/Send/ExBoss/PacketExBossStageBeginRsp.cs
create mode 100644 GameServer/Server/Packet/Send/ExBoss/PacketExBossStageEndRsp.cs
create mode 100644 GameServer/Server/Packet/Send/ExBoss/PacketGetExBossInfoRsp.cs
create mode 100644 GameServer/Server/Packet/Send/ExBoss/PacketGetExBossRankRsp.cs
create mode 100644 GameServer/Server/Packet/Send/ExBoss/PacketGetExBossScheduleRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Exchange/PacketGetCurrencyExchangeInfoRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Friend/PacketGetAskAddFriendListRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Friend/PacketGetFriendListRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Friend/PacketGetFriendRemarkListRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Gacha/PacketGetGachaDisplayRsp.cs
create mode 100644 GameServer/Server/Packet/Send/GodWar/PacketGetGobackRsp.cs
create mode 100644 GameServer/Server/Packet/Send/GodWar/PacketGetGodWarLobbyRsp.cs
create mode 100644 GameServer/Server/Packet/Send/GodWar/PacketGetGodWarRsp.cs
create mode 100644 GameServer/Server/Packet/Send/GodWar/PacketGetGrandKeyRsp.cs
create mode 100644 GameServer/Server/Packet/Send/GodWar/PacketRefreshGodWarTicketRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Goods/PacketAddGoodfeelRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Guide/PacketFinishGuideReportRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Guide/PacketGetFinishGuideDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Item/PacketGetEquipmentDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Item/PacketGetEquipmentForgeDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Item/PacketGetHasGotFurnitureIdListRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Item/PacketGetHasGotItemIdListRsp.cs
create mode 100644 GameServer/Server/Packet/Send/MasterPupil/PacketGetMasterPupilApplyRsp.cs
create mode 100644 GameServer/Server/Packet/Send/MasterPupil/PacketGetMasterPupilCardRsp.cs
create mode 100644 GameServer/Server/Packet/Send/MasterPupil/PacketGetMasterPupilDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/MasterPupil/PacketGetMasterPupilMainDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Mission/PacketGetMissionDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Mission/PacketGetMissionGroupMainInfoRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Mission/PacketGetMissionThemeDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Mission/PacketGetRecommendMissionPanelListRsp.cs
create mode 100644 GameServer/Server/Packet/Send/OpenWorld/PacketGetNewOpenworldRsp.cs
create mode 100644 GameServer/Server/Packet/Send/OpenWorld/PacketGetOpenworldEndlessDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/OpenWorld/PacketGetOpenworldMechaDefenseRsp.cs
create mode 100644 GameServer/Server/Packet/Send/OpenWorld/PacketGetOpenworldQuestActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Pjms/PacketPjmsGetAchievementDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Pjms/PacketPjmsGetActivityPanelRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Pjms/PacketPjmsGetChapterDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Pjms/PacketPjmsGetConditionDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Pjms/PacketPjmsGetCurWorldRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Pjms/PacketPjmsGetMainDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Pjms/PacketPjmsGetResidentStageDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Pjms/PacketPjmsGetStoryDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Player/PacketGetAssistantFrozenListRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Player/PacketGetBlackListRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Player/PacketGetConfigRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Player/PacketGetCustomHeadDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Player/PacketGetEmojiDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Player/PacketGetFrameDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Player/PacketGetMainDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Player/PacketGetMedalDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Player/PacketGetOfflineResourceDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Player/PacketGetPediaRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Player/PacketGetPhonePendantDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Player/PacketGetPhotoDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Player/PacketGetPlayerCardRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Player/PacketGetPlayerTokenRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Player/PacketGetRegionUidRangeRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Player/PacketGetThemeDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Player/PacketPlayerLoginRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Player/PacketSyncTimeRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Player/PacketTakeGalInteractTriggerEventRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Product/PacketGetCardProductInfoRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Stage/PacketGetStageActDifficultyRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Stage/PacketGetStageChapterRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Stage/PacketGetStageDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Stage/PacketGetStageDropDisplayRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Stage/PacketGetStageRecommendAvatarRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Stage/PacketStageBeginRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Stage/PacketStageEndRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Stage/PacketStageInnerDataReportRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Story/PacketGetExtraStoryDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketGetWebActivityInfoRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketGetWeekDayActivityDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketGetWeeklyReportRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketGetWeeklyRoutineActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketGetWikiDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketGetWorldMapDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketGetWorldMapRecommendRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketGrandKeyActivateSkillRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketLoginWishGetMainDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketOpenworldGetMechaTeamRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketOpenworldHuntActivityGetDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketRaidReplaceGetDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketRefineStigmataRuneRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketRefreshAvatarSkillRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketReunionCookGetActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketSanctuaryGetMainInfoRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketSelectGodWarChallengeAvatarRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketSelectNewStigmataRuneRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketSetDressRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketSetWarshipAvatarRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketSetWarshipRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketSimplifiedGodWarGetActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketSusannaTrialGetActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketThemeWantedRefreshTicketRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketTriggerGodWarEventRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketUltraEndlessEnterSiteRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketUltraEndlessGetMainDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketUltraEndlessGetTopRankRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketUltraEndlessReportSiteFloorRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketUpdateMissionProgressRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Test/PacketWaveRushGetActivityRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Warship/PacketGetWarshipDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Warship/PacketGetWarshipItemDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Warship/PacketGetWarshipTrialDataRsp.cs
create mode 100644 GameServer/Server/Packet/Send/Warship/PacketSetWarshipAvatarRsp.cs
create mode 100644 KcpSharp/Base/ArrayMemoryOwner.cs
create mode 100644 KcpSharp/Base/AsyncAutoResetEvent.cs
create mode 100644 KcpSharp/Base/DefaultArrayPoolBufferAllocator.cs
create mode 100644 KcpSharp/Base/IKcpBufferPool.cs
create mode 100644 KcpSharp/Base/IKcpConversation.cs
create mode 100644 KcpSharp/Base/IKcpConversationUpdateNotificationSource.cs
create mode 100644 KcpSharp/Base/IKcpExceptionProducer.cs
create mode 100644 KcpSharp/Base/IKcpMultiplexConnection.cs
create mode 100644 KcpSharp/Base/IKcpMultiplexConnectionOfT.cs
create mode 100644 KcpSharp/Base/IKcpTransport.cs
create mode 100644 KcpSharp/Base/IKcpTransportOfT.cs
create mode 100644 KcpSharp/Base/KcpAcknowledgeList.cs
create mode 100644 KcpSharp/Base/KcpBuffer.cs
create mode 100644 KcpSharp/Base/KcpBufferPoolRentOptions.cs
create mode 100644 KcpSharp/Base/KcpCommand.cs
create mode 100644 KcpSharp/Base/KcpConversation.FlushAsyncMethodBuilder.cs
create mode 100644 KcpSharp/Base/KcpConversation.cs
create mode 100644 KcpSharp/Base/KcpConversationOptions.cs
create mode 100644 KcpSharp/Base/KcpConversationReceiveResult.cs
create mode 100644 KcpSharp/Base/KcpConversationUpdateActivation.cs
create mode 100644 KcpSharp/Base/KcpConversationUpdateNotification.cs
create mode 100644 KcpSharp/Base/KcpExceptionProducerExtensions.cs
create mode 100644 KcpSharp/Base/KcpGlobalVars.cs
create mode 100644 KcpSharp/Base/KcpKeepAliveOptions.cs
create mode 100644 KcpSharp/Base/KcpMultiplexConnection.cs
create mode 100644 KcpSharp/Base/KcpPacketHeader.cs
create mode 100644 KcpSharp/Base/KcpProbeType.cs
create mode 100644 KcpSharp/Base/KcpRawChannel.cs
create mode 100644 KcpSharp/Base/KcpRawChannelOptions.cs
create mode 100644 KcpSharp/Base/KcpRawReceiveQueue.cs
create mode 100644 KcpSharp/Base/KcpRawSendOperation.cs
create mode 100644 KcpSharp/Base/KcpReceiveQueue.cs
create mode 100644 KcpSharp/Base/KcpReceiveWindowNotificationOptions.cs
create mode 100644 KcpSharp/Base/KcpRentedBuffer.cs
create mode 100644 KcpSharp/Base/KcpSendQueue.cs
create mode 100644 KcpSharp/Base/KcpSendReceiveBufferItem.cs
create mode 100644 KcpSharp/Base/KcpSendReceiveBufferItemCache.cs
create mode 100644 KcpSharp/Base/KcpSendReceiveQueueItemCache.cs
create mode 100644 KcpSharp/Base/KcpSendSegmentStats.cs
create mode 100644 KcpSharp/Base/KcpSocketTransport.cs
create mode 100644 KcpSharp/Base/KcpSocketTransportForConversation.cs
create mode 100644 KcpSharp/Base/KcpSocketTransportForMultiplexConnection.cs
create mode 100644 KcpSharp/Base/KcpSocketTransportForRawChannel.cs
create mode 100644 KcpSharp/Base/KcpSocketTransportOfT.cs
create mode 100644 KcpSharp/Base/KcpStream.cs
create mode 100644 KcpSharp/Base/NetstandardShim/AwaitableSocketAsyncEventArgs.cs
create mode 100644 KcpSharp/Base/NetstandardShim/CancellationTokenShim.cs
create mode 100644 KcpSharp/Base/NetstandardShim/LinkedListNetstandard.cs
create mode 100644 KcpSharp/Base/NetstandardShim/TaskCompletionSource.cs
create mode 100644 KcpSharp/Base/ThrowHelper.cs
create mode 100644 KcpSharp/BasePacket.cs
create mode 100644 KcpSharp/KcpConnection.cs
create mode 100644 KcpSharp/KcpListener.cs
create mode 100644 KcpSharp/KcpSharp.csproj
create mode 100644 KcpSharp/SessionStateEnum.cs
create mode 100644 KianaBH.sln
create mode 100644 KianaBH/KianaBH.csproj
create mode 100644 KianaBH/Program/KianaBH.cs
create mode 100644 KianaBH/Program/LoaderManager.cs
create mode 100644 KianaBH/Properties/PublishProfiles/KianaBH-Win64-Debug.pubxml
create mode 100644 KianaBH/Properties/PublishProfiles/KianaBH-Win64-MultiFile.pubxml
create mode 100644 KianaBH/Properties/PublishProfiles/KianaBH-Win64-OneFile.pubxml
create mode 100644 KianaBH/Source/Kiana.ico
create mode 100644 KianaBH/Tool/AssemblyGenerater.cs
create mode 100644 KianaBH/Tool/HandbookGenerator.cs
create mode 100644 Proto/BH3.proto
create mode 100644 Proto/CmdIds.cs
create mode 100644 Proto/Proto.csproj
create mode 100644 SdkServer/Handlers/Dispatch/QueryDispatchController.cs
create mode 100644 SdkServer/Handlers/Dispatch/QueryGatewayController.cs
create mode 100644 SdkServer/Handlers/Sdk/AbTestController.cs
create mode 100644 SdkServer/Handlers/Sdk/ComboGranterController.cs
create mode 100644 SdkServer/Handlers/Sdk/DeviceFingerprintController.cs
create mode 100644 SdkServer/Handlers/Sdk/GameWeatherController.cs
create mode 100644 SdkServer/Handlers/Sdk/LogDataUploadController.cs
create mode 100644 SdkServer/Handlers/Sdk/MaPassportController.cs
create mode 100644 SdkServer/Handlers/Sdk/MdkController.cs
create mode 100644 SdkServer/Handlers/Sdk/RiskyController.cs
create mode 100644 SdkServer/SdkServer.cs
create mode 100644 SdkServer/SdkServer.csproj
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..3d4d3e3
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,125 @@
+[*.cs]
+
+# IDE0022: 使用方法的程序块主体
+csharp_style_expression_bodied_methods = false:silent
+
+[*.cs]
+#### 命名样式 ####
+
+# 命名规则
+
+dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
+dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
+dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
+
+dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.types_should_be_pascal_case.symbols = types
+dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
+
+dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
+dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
+
+# 符号规范
+
+dotnet_naming_symbols.interface.applicable_kinds = interface
+dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.interface.required_modifiers =
+
+dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
+dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.types.required_modifiers =
+
+dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
+dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.non_field_members.required_modifiers =
+
+# 命名样式
+
+dotnet_naming_style.begins_with_i.required_prefix = I
+dotnet_naming_style.begins_with_i.required_suffix =
+dotnet_naming_style.begins_with_i.word_separator =
+dotnet_naming_style.begins_with_i.capitalization = pascal_case
+
+dotnet_naming_style.pascal_case.required_prefix =
+dotnet_naming_style.pascal_case.required_suffix =
+dotnet_naming_style.pascal_case.word_separator =
+dotnet_naming_style.pascal_case.capitalization = pascal_case
+
+dotnet_naming_style.pascal_case.required_prefix =
+dotnet_naming_style.pascal_case.required_suffix =
+dotnet_naming_style.pascal_case.word_separator =
+dotnet_naming_style.pascal_case.capitalization = pascal_case
+csharp_using_directive_placement = outside_namespace:silent
+csharp_style_expression_bodied_constructors = false:silent
+csharp_style_expression_bodied_operators = false:silent
+csharp_style_expression_bodied_properties = true:silent
+csharp_style_expression_bodied_indexers = true:silent
+csharp_style_expression_bodied_accessors = true:silent
+csharp_style_expression_bodied_lambdas = true:silent
+csharp_style_expression_bodied_local_functions = false:silent
+csharp_style_conditional_delegate_call = true:suggestion
+csharp_style_var_for_built_in_types = false:silent
+csharp_style_var_when_type_is_apparent = false:silent
+csharp_style_var_elsewhere = false:silent
+csharp_prefer_simple_using_statement = true:suggestion
+csharp_space_around_binary_operators = before_and_after
+csharp_indent_labels = one_less_than_current
+
+[*.vb]
+#### 命名样式 ####
+
+# 命名规则
+
+dotnet_naming_rule.interface_should_be_以_i_开始.severity = suggestion
+dotnet_naming_rule.interface_should_be_以_i_开始.symbols = interface
+dotnet_naming_rule.interface_should_be_以_i_开始.style = 以_i_开始
+
+dotnet_naming_rule.类型_should_be_帕斯卡拼写法.severity = suggestion
+dotnet_naming_rule.类型_should_be_帕斯卡拼写法.symbols = 类型
+dotnet_naming_rule.类型_should_be_帕斯卡拼写法.style = 帕斯卡拼写法
+
+dotnet_naming_rule.非字段成员_should_be_帕斯卡拼写法.severity = suggestion
+dotnet_naming_rule.非字段成员_should_be_帕斯卡拼写法.symbols = 非字段成员
+dotnet_naming_rule.非字段成员_should_be_帕斯卡拼写法.style = 帕斯卡拼写法
+
+# 符号规范
+
+dotnet_naming_symbols.interface.applicable_kinds = interface
+dotnet_naming_symbols.interface.applicable_accessibilities = public, friend, private, protected, protected_friend, private_protected
+dotnet_naming_symbols.interface.required_modifiers =
+
+dotnet_naming_symbols.类型.applicable_kinds = class, struct, interface, enum
+dotnet_naming_symbols.类型.applicable_accessibilities = public, friend, private, protected, protected_friend, private_protected
+dotnet_naming_symbols.类型.required_modifiers =
+
+dotnet_naming_symbols.非字段成员.applicable_kinds = property, event, method
+dotnet_naming_symbols.非字段成员.applicable_accessibilities = public, friend, private, protected, protected_friend, private_protected
+dotnet_naming_symbols.非字段成员.required_modifiers =
+
+# 命名样式
+
+dotnet_naming_style.以_i_开始.required_prefix = I
+dotnet_naming_style.以_i_开始.required_suffix =
+dotnet_naming_style.以_i_开始.word_separator =
+dotnet_naming_style.以_i_开始.capitalization = pascal_case
+
+dotnet_naming_style.帕斯卡拼写法.required_prefix =
+dotnet_naming_style.帕斯卡拼写法.required_suffix =
+dotnet_naming_style.帕斯卡拼写法.word_separator =
+dotnet_naming_style.帕斯卡拼写法.capitalization = pascal_case
+
+dotnet_naming_style.帕斯卡拼写法.required_prefix =
+dotnet_naming_style.帕斯卡拼写法.required_suffix =
+dotnet_naming_style.帕斯卡拼写法.word_separator =
+dotnet_naming_style.帕斯卡拼写法.capitalization = pascal_case
+
+[*.{cs,vb}]
+end_of_line = crlf
+dotnet_style_qualification_for_field = false:silent
+dotnet_style_qualification_for_property = false:silent
+dotnet_style_qualification_for_method = false:silent
+dotnet_style_qualification_for_event = false:silent
+tab_width = 4
+indent_size = 4
+dotnet_style_operator_placement_when_wrapping = beginning_of_line
\ No newline at end of file
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..dfe0770
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+# Auto detect text files and perform LF normalization
+* text=auto
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4207fbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,370 @@
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+##
+## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
+
+# User-specific files
+*.rsuser
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Mono auto generated files
+mono_crash.*
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+[Ww][Ii][Nn]32/
+[Aa][Rr][Mm]/
+[Aa][Rr][Mm]64/
+bld/
+[Bb]in/
+[Oo]bj/
+[Oo]ut/
+[Ll]og/
+[Ll]ogs/
+
+# Visual Studio 2015/2017 cache/options directory
+.vs/
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
+
+.idea/
+
+# Visual Studio 2017 auto generated files
+Generated\ Files/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUnit
+*.VisualState.xml
+TestResult.xml
+nunit-*.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+# Benchmark Results
+BenchmarkDotNet.Artifacts/
+
+# .NET Core
+project.lock.json
+project.fragment.lock.json
+artifacts/
+
+# ASP.NET Scaffolding
+ScaffoldingReadMe.txt
+
+# StyleCop
+StyleCopReport.xml
+
+# Files built by Visual Studio
+*_i.c
+*_p.c
+*_h.h
+*.ilk
+*.meta
+*.obj
+*.iobj
+*.pch
+*.pdb
+*.ipdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*_wpftmp.csproj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+*.VC.VC.opendb
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+*.sap
+
+# Visual Studio Trace Files
+*.e2e
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# AxoCover is a Code Coverage Tool
+.axoCover/*
+!.axoCover/settings.json
+
+# Coverlet is a free, cross platform Code Coverage Tool
+coverage*.json
+coverage*.xml
+coverage*.info
+
+# Visual Studio code coverage results
+*.coverage
+*.coveragexml
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+[Ll]aunchSettings.json
+# Note: Comment the next line if you want to checkin your web deploy settings,
+# but database connection strings (with potential passwords) will be unencrypted
+# *.pubxml
+# *.publishproj
+
+# Microsoft Azure Web App publish settings. Comment the next line if you want to
+# checkin your Azure Web App publish settings, but sensitive information contained
+# in these scripts will be unencrypted
+PublishScripts/
+
+# NuGet Packages
+*.nupkg
+# NuGet Symbol Packages
+*.snupkg
+# The packages folder can be ignored because of Package Restore
+**/[Pp]ackages/*
+# except build/, which is used as an MSBuild target.
+!**/[Pp]ackages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/[Pp]ackages/repositories.config
+# NuGet v3's project.json files produces more ignorable files
+*.nuget.props
+*.nuget.targets
+
+# Microsoft Azure Build Output
+csx/
+*.build.csdef
+
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Windows Store app package directories and files
+AppPackages/
+BundleArtifacts/
+Package.StoreAssociation.xml
+_pkginfo.txt
+*.appx
+*.appxbundle
+*.appxupload
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!?*.[Cc]ache/
+
+# Others
+ClientBin/
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.jfm
+*.publishsettings
+orleans.codegen.cs
+
+# Including strong name files can present a security risk
+# (https://github.com/github/gitignore/pull/2483#issue-259490424)
+#*.snk
+
+# Since there are multiple workflows, uncomment next line to ignore bower_components
+# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
+#bower_components/
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+ServiceFabricBackup/
+*.rptproj.bak
+
+# SQL Server files
+*.mdf
+*.ldf
+*.ndf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+*.rptproj.rsuser
+*- [Bb]ackup.rdl
+*- [Bb]ackup ([0-9]).rdl
+*- [Bb]ackup ([0-9][0-9]).rdl
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+node_modules/
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
+*.vbw
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
+# Paket dependency manager
+.paket/paket.exe
+paket-files/
+
+# FAKE - F# Make
+.fake/
+
+# CodeRush personal settings
+.cr/personal
+
+# Python Tools for Visual Studio (PTVS)
+__pycache__/
+*.pyc
+
+# Cake - Uncomment if you are using it
+# tools/**
+# !tools/packages.config
+
+# Tabs Studio
+*.tss
+
+# Telerik's JustMock configuration file
+*.jmconfig
+
+# BizTalk build output
+*.btp.cs
+*.btm.cs
+*.odx.cs
+*.xsd.cs
+
+# OpenCover UI analysis results
+OpenCover/
+
+# Azure Stream Analytics local run output
+ASALocalRun/
+
+# MSBuild Binary and Structured Log
+*.binlog
+
+# NVidia Nsight GPU debugger configuration file
+*.nvuser
+
+# MFractors (Xamarin productivity tool) working folder
+.mfractor/
+
+# Local History for Visual Studio
+.localhistory/
+
+# BeatPulse healthcheck temp database
+healthchecksdb
+
+# Backup folder for Package Reference Convert tool in Visual Studio 2017
+MigrationBackup/
+
+# Ionide (cross platform F# VS Code tools) working folder
+.ionide/
+
+# Fody - auto-generated XML schema
+FodyWeavers.xsd
+
+# Special Files
+/SdkServer/Properties
+/GameServer/OriginalProto
+*.rar
\ No newline at end of file
diff --git a/Common/Common.csproj b/Common/Common.csproj
new file mode 100644
index 0000000..068792b
--- /dev/null
+++ b/Common/Common.csproj
@@ -0,0 +1,36 @@
+
+
+
+ net9.0
+ enable
+ enable
+ false
+ KianaBH
+ KianaCommon
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Common/Configuration/ConfigContainer.cs b/Common/Configuration/ConfigContainer.cs
new file mode 100644
index 0000000..0b440d9
--- /dev/null
+++ b/Common/Configuration/ConfigContainer.cs
@@ -0,0 +1,84 @@
+namespace KianaBH.Configuration;
+
+public class ConfigContainer
+{
+ public HttpServerConfig HttpServer { get; set; } = new();
+ public GameServerConfig GameServer { get; set; } = new();
+ public PathConfig Path { get; set; } = new();
+ public ServerOption ServerOption { get; set; } = new();
+}
+
+public class HttpServerConfig
+{
+ public string BindAddress { get; set; } = "0.0.0.0";
+ public string PublicAddress { get; set; } = "127.0.0.1";
+ public int Port { get; set; } = 80;
+
+ public string GetDisplayAddress()
+ {
+ return "http" + "://" + PublicAddress + ":" + Port;
+ }
+
+ public string GetBindDisplayAddress()
+ {
+ return "http" + "://" + BindAddress + ":" + Port;
+ }
+}
+
+public class GameServerConfig
+{
+ public string BindAddress { get; set; } = "0.0.0.0";
+ public string PublicAddress { get; set; } = "127.0.0.1";
+ public int Port { get; set; } = 21000;
+ public int KcpAliveMs { get; set; } = 45000;
+ public string DatabaseName { get; set; } = "kiana.db";
+ public string GameServerId { get; set; } = "KianaBH";
+ public string GameServerName { get; set; } = "KianaBH";
+ public string GetDisplayAddress()
+ {
+ return PublicAddress + ":" + Port;
+ }
+}
+
+public class PathConfig
+{
+ public string ResourcePath { get; set; } = "Resources";
+ public string ConfigPath { get; set; } = "Config";
+ public string DatabasePath { get; set; } = "Config/Database";
+ public string HandbookPath { get; set; } = "Config/Handbook";
+ public string LogPath { get; set; } = "Config/Logs";
+ public string DataPath { get; set; } = "Config/Data";
+}
+
+public class ServerOption
+{
+ public bool EnableMission { get; set; } = false;
+ public string DefaultGender { get; set; } = "Woman";
+ public string Language { get; set; } = "EN";
+ public string FallbackLanguage { get; set; } = "EN";
+ public string[] DefaultPermissions { get; set; } = ["Admin"];
+ public ServerProfile ServerProfile { get; set; } = new();
+ public bool AutoCreateUser { get; set; } = true;
+ public bool SavePersonalDebugFile { get; set; } = false;
+ public bool AutoSendResponseWhenNoHandler { get; set; } = true;
+#if DEBUG
+ public bool EnableDebug { get; set; } = true;
+#else
+ public bool EnableDebug { get; set; } = false;
+#endif
+ public bool DebugMessage { get; set; } = true;
+ public bool DebugDetailMessage { get; set; } = true;
+ public bool DebugNoHandlerPacket { get; set; } = true;
+}
+
+public class ServerProfile
+{
+ public string Name { get; set; } = "Server";
+ public int Uid { get; set; } = 80;
+ public string Signature { get; set; } = "Type /help for a list of commands";
+ public int Level { get; set; } = 1;
+ public int HeadIcon { get; set; } = 200105;
+ public int ChatBubbleId { get; set; } = 220001;
+ public int DisplayAvatarId { get; set; } = 1001;
+ public int DisplayAvatarLevel { get; set; } = 1;
+}
\ No newline at end of file
diff --git a/Common/Configuration/HotfixContainer.cs b/Common/Configuration/HotfixContainer.cs
new file mode 100644
index 0000000..0e3d60d
--- /dev/null
+++ b/Common/Configuration/HotfixContainer.cs
@@ -0,0 +1,75 @@
+using System.Text.Json.Serialization;
+using Newtonsoft.Json;
+
+namespace KianaBH.Configuration;
+
+public class HotfixContainer
+{
+ public bool UseLocalCache { get; set; } = false;
+ public Dictionary Hotfixes { get; set; } = new();
+ public Dictionary AesKeys { get; set; } = new ();
+
+ public static string ExtractVersionNumber(string? version)
+ {
+ try
+ {
+ return version == null ? "" : version[..version.IndexOf('_')];
+ }
+ catch
+ {
+ return "";
+ }
+ }
+}
+
+public class HotfixManfiset
+{
+ [JsonPropertyName("Asb")] public AsbData Asb { get; set; } = new();
+ [JsonPropertyName("AsbPreDownload")] public AsbPreDownloadData AsbPreDownload { get; set; } = new();
+ [JsonPropertyName("Audio")] public AudioData Audio { get; set; } = new();
+ [JsonPropertyName("AudioPreDownload")] public AudioPreDownloadData AudioPreDownload { get; set; } = new();
+ [JsonPropertyName("VideoEncrypt")] public VideoEncryptData VideoEncrypt { get; set; } = new();
+}
+
+public class AsbData
+{
+ [JsonPropertyName("android")] public PlatformInfo Android { get; set; } = new();
+ [JsonPropertyName("iphone")] public PlatformInfo Iphone { get; set; } = new();
+ [JsonPropertyName("pc")] public PlatformInfo Pc { get; set; } = new();
+}
+
+public class AsbPreDownloadData
+{
+ [JsonPropertyName("android")] public PlatformEncryptedInfo Android { get; set; } = new();
+ [JsonPropertyName("iphone")] public PlatformEncryptedInfo Iphone { get; set; } = new();
+}
+
+public class AudioData
+{
+ [JsonPropertyName("platform")] public Dictionary Platform { get; set; } = new();
+ [JsonPropertyName("revision")] public int Revision { get; set; }
+}
+
+public class AudioPreDownloadData
+{
+ [JsonPropertyName("enable_time")] public long EnableTime { get; set; }
+ [JsonPropertyName("platform")] public Dictionary Platform { get; set; } = new();
+ [JsonPropertyName("revision")] public int Revision { get; set; }
+}
+
+public class VideoEncryptData
+{
+ [JsonPropertyName("filename")] public string FileName { get; set; } = "";
+}
+
+public class PlatformInfo
+{
+ [JsonPropertyName("enable_time")] public long EnableTime { get; set; }
+ [JsonPropertyName("revision")] public string Revision { get; set; } = "";
+ [JsonPropertyName("suffix")] public string Suffix { get; set; } = "";
+}
+
+public class PlatformEncryptedInfo : PlatformInfo
+{
+ [JsonPropertyName("encrypt_key")] public string EncryptKey { get; set; } = "";
+}
\ No newline at end of file
diff --git a/Common/Data/Config/TimeStampConfig.cs b/Common/Data/Config/TimeStampConfig.cs
new file mode 100644
index 0000000..68d1bc6
--- /dev/null
+++ b/Common/Data/Config/TimeStampConfig.cs
@@ -0,0 +1,7 @@
+namespace KianaBH.Data.Config;
+
+public class TimestampConfig
+{
+ public uint TimeStampForBakedReader { get; set; }
+}
+
diff --git a/Common/Data/Excel/ActChallengeDataExcel.cs b/Common/Data/Excel/ActChallengeDataExcel.cs
new file mode 100644
index 0000000..4818146
--- /dev/null
+++ b/Common/Data/Excel/ActChallengeDataExcel.cs
@@ -0,0 +1,24 @@
+using System.Text.Json.Serialization;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("ActChallengeData.json")]
+public class ActChallengeDataExcel : ExcelResource
+{
+ [JsonPropertyName("actId")] public uint ActId { get; set; }
+ [JsonPropertyName("difficulty")] public uint Difficulty { get; set; }
+
+ public override int GetId()
+ {
+ return (int)ActId;
+ }
+
+ public override void Loaded()
+ {
+ if (!GameData.ActChallengeData.ContainsKey(GetId()))
+ {
+ GameData.ActChallengeData[GetId()] = new List();
+ }
+ GameData.ActChallengeData[GetId()].Add(this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/ActivityTowerExcel.cs b/Common/Data/Excel/ActivityTowerExcel.cs
new file mode 100644
index 0000000..eda089a
--- /dev/null
+++ b/Common/Data/Excel/ActivityTowerExcel.cs
@@ -0,0 +1,17 @@
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("ActivityTower.json")]
+public class ActivityTowerExcel : ExcelResource
+{
+ public uint ActivityID { get; set; }
+
+ public override int GetId()
+ {
+ return (int)ActivityID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.ActivityTowerData.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/AffixListExcel.cs b/Common/Data/Excel/AffixListExcel.cs
new file mode 100644
index 0000000..8bdfa69
--- /dev/null
+++ b/Common/Data/Excel/AffixListExcel.cs
@@ -0,0 +1,20 @@
+using System.Text.Json.Serialization;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("AffixList.json")]
+public class AffixListExcel : ExcelResource
+{
+ [JsonPropertyName("affixID")] public int AffixID { get; set; }
+ [JsonPropertyName("level")] public int Level { get; set; }
+
+ public override int GetId()
+ {
+ return AffixID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.AffixListData.Add(AffixID, this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/AvatarDataExcel.cs b/Common/Data/Excel/AvatarDataExcel.cs
new file mode 100644
index 0000000..2c75718
--- /dev/null
+++ b/Common/Data/Excel/AvatarDataExcel.cs
@@ -0,0 +1,27 @@
+using System.Text.Json.Serialization;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("AvatarData.json")]
+public class AvatarDataExcel : ExcelResource
+{
+ [JsonPropertyName("avatarID")] public int AvatarID { get; set; }
+ [JsonPropertyName("unlockStar")] public int UnlockStar { get; set; }
+ [JsonPropertyName("initialWeapon")] public int InitialWeapon { get; set; }
+ [JsonPropertyName("skillList")] public List SkillList { get; set; } = [];
+ public int DefaultDressId { get; set; }
+
+ public override int GetId()
+ {
+ return AvatarID;
+ }
+
+ public override void Loaded()
+ {
+ if (AvatarID != 316 && (AvatarID < 9000 || AvatarID > 20000))
+ {
+ GameData.AvatarData.Add(AvatarID, this);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/AvatarSubSkillDataExcel.cs b/Common/Data/Excel/AvatarSubSkillDataExcel.cs
new file mode 100644
index 0000000..45144f9
--- /dev/null
+++ b/Common/Data/Excel/AvatarSubSkillDataExcel.cs
@@ -0,0 +1,22 @@
+using System.Text.Json.Serialization;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("AvatarSubSkillData.json")]
+public class AvatarSubSkillDataExcel : ExcelResource
+{
+ [JsonPropertyName("skillId")] public int SkillId { get; set; }
+ [JsonPropertyName("unlockScoin")] public int UnlockScoin { get; set; }
+ [JsonPropertyName("maxLv")] public int MaxLv { get; set; }
+ [JsonPropertyName("avatarSubSkillId")] public int AvatarSubSkillId { get; set; }
+
+ public override int GetId()
+ {
+ return AvatarSubSkillId;
+ }
+
+ public override void Loaded()
+ {
+ GameData.AvatarSubSkillData.Add(AvatarSubSkillId, this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/AvatarTutorialExcel.cs b/Common/Data/Excel/AvatarTutorialExcel.cs
new file mode 100644
index 0000000..f18d4d5
--- /dev/null
+++ b/Common/Data/Excel/AvatarTutorialExcel.cs
@@ -0,0 +1,17 @@
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("AvatarTutorial.json")]
+public class AvatarTutorialExcel : ExcelResource
+{
+ public uint ActivityID { get; set; }
+
+ public override int GetId()
+ {
+ return (int)ActivityID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.AvatarTutorialData.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/ChapterGroupConfigExcel.cs b/Common/Data/Excel/ChapterGroupConfigExcel.cs
new file mode 100644
index 0000000..50e18c9
--- /dev/null
+++ b/Common/Data/Excel/ChapterGroupConfigExcel.cs
@@ -0,0 +1,25 @@
+using KianaBH.Data.Config;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("ChapterGroupConfig.json")]
+public class ChapterGroupConfigExcel : ExcelResource
+{
+ public uint ID { get; set; }
+ public uint GroupType { get; set; }
+ public TimestampConfig? BeginShowTime { get; set; }
+ public TimestampConfig? BeginTime { get; set; }
+ public uint BeginShowLevel { get; set; }
+ public List SiteList { get; set; } = [];
+ public uint UnlockLevel { get; set; }
+
+ public override int GetId()
+ {
+ return (int)ID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.ChapterGroupConfigData.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/CityEventPhotoExcel.cs b/Common/Data/Excel/CityEventPhotoExcel.cs
new file mode 100644
index 0000000..c27522c
--- /dev/null
+++ b/Common/Data/Excel/CityEventPhotoExcel.cs
@@ -0,0 +1,21 @@
+using System.Text.Json.Serialization;
+using KianaBH.Data.Config;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("CityEventPhoto.json")]
+public class CityEventPhotoExcel : ExcelResource
+{
+ public uint PhotoID { get; set; }
+ [JsonPropertyName("photoType")] public uint PhotoType { get; set; }
+
+ public override int GetId()
+ {
+ return (int)PhotoID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.CityEventPhotoData.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/CollectionExcel.cs b/Common/Data/Excel/CollectionExcel.cs
new file mode 100644
index 0000000..542fc82
--- /dev/null
+++ b/Common/Data/Excel/CollectionExcel.cs
@@ -0,0 +1,17 @@
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("Collection.json")]
+public class CollectionExcel : ExcelResource
+{
+ public int ID { get; set; }
+
+ public override int GetId()
+ {
+ return ID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.CollectionData.Add(ID, this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/CustomHeadDataExcel.cs b/Common/Data/Excel/CustomHeadDataExcel.cs
new file mode 100644
index 0000000..9382096
--- /dev/null
+++ b/Common/Data/Excel/CustomHeadDataExcel.cs
@@ -0,0 +1,19 @@
+using System.Text.Json.Serialization;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("CustomHeadData.json")]
+public class CustomHeadDataExcel : ExcelResource
+{
+ [JsonPropertyName("headID")] public uint HeadID { get; set; }
+
+ public override int GetId()
+ {
+ return (int)HeadID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.CustomHeadData.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/DressDataExcel.cs b/Common/Data/Excel/DressDataExcel.cs
new file mode 100644
index 0000000..f64679f
--- /dev/null
+++ b/Common/Data/Excel/DressDataExcel.cs
@@ -0,0 +1,20 @@
+using System.Text.Json.Serialization;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("DressData.json")]
+public class DressDataExcel : ExcelResource
+{
+ [JsonPropertyName("dressID")] public uint DressID { get; set; }
+ [JsonPropertyName("avatarIDList")] public List AvatarIDList { get; set; } = [];
+
+ public override int GetId()
+ {
+ return (int)DressID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.DressData.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/ElfAstraMateDataExcel.cs b/Common/Data/Excel/ElfAstraMateDataExcel.cs
new file mode 100644
index 0000000..99484dd
--- /dev/null
+++ b/Common/Data/Excel/ElfAstraMateDataExcel.cs
@@ -0,0 +1,30 @@
+using System.Text.Json.Serialization;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("Elf_AstraMate_Data.json")]
+public class ElfAstraMateDataExcel : ExcelResource
+{
+ public uint ElfID { get; set; }
+ public uint MaxLevel { get; set; }
+ public uint MaxRarity { get; set; }
+
+ [JsonIgnore] public List SkillList = [];
+
+ public override int GetId()
+ {
+ return (int)ElfID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.ElfAstraMateData.Add(GetId(), this);
+ }
+
+ public override void AfterAllDone()
+ {
+ GameData.ElfSkillData.TryGetValue(GetId(), out var Skills);
+ if (Skills == null || !Skills.ElfIds.Contains(ElfID)) return;
+ SkillList.Add(Skills);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/ElfSkillDataExcel.cs b/Common/Data/Excel/ElfSkillDataExcel.cs
new file mode 100644
index 0000000..4170876
--- /dev/null
+++ b/Common/Data/Excel/ElfSkillDataExcel.cs
@@ -0,0 +1,18 @@
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("ElfSkillData.json")]
+public class ElfSkillDataExcel : ExcelResource
+{
+ public uint ElfSkillID { get; set; }
+ public uint MaxLv { get; set; }
+ public List ElfIds { get; set; } = [];
+ public override int GetId()
+ {
+ return (int)ElfSkillID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.ElfSkillData.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/EntryThemeDataExcel.cs b/Common/Data/Excel/EntryThemeDataExcel.cs
new file mode 100644
index 0000000..d5ac692
--- /dev/null
+++ b/Common/Data/Excel/EntryThemeDataExcel.cs
@@ -0,0 +1,18 @@
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("EntryThemeData.json")]
+public class EntryThemeDataExcel : ExcelResource
+{
+ public uint SpaceShipConfigId { get; set; }
+ public List ThemeBgmConfigList { get; set; } = [];
+ public List ThemeTagList { get; set; } = [];
+ public override int GetId()
+ {
+ return (int)SpaceShipConfigId;
+ }
+
+ public override void Loaded()
+ {
+ GameData.EntryThemeData.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/EntryThemeItemDataExcel.cs b/Common/Data/Excel/EntryThemeItemDataExcel.cs
new file mode 100644
index 0000000..aed66b7
--- /dev/null
+++ b/Common/Data/Excel/EntryThemeItemDataExcel.cs
@@ -0,0 +1,16 @@
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("EntryThemeItemData.json")]
+public class EntryThemeItemDataExcel : ExcelResource
+{
+ public int ThemeItemID { get; set; }
+ public override int GetId()
+ {
+ return ThemeItemID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.EntryThemeItemData.Add(ThemeItemID, this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/FrameDataExcel.cs b/Common/Data/Excel/FrameDataExcel.cs
new file mode 100644
index 0000000..cf97fc2
--- /dev/null
+++ b/Common/Data/Excel/FrameDataExcel.cs
@@ -0,0 +1,19 @@
+using System.Text.Json.Serialization;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("FrameData.json")]
+public class FrameDataExcel : ExcelResource
+{
+ [JsonPropertyName("id")] public uint Id { get; set; }
+
+ public override int GetId()
+ {
+ return (int)Id;
+ }
+
+ public override void Loaded()
+ {
+ GameData.FrameData.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/GeneralActivityExcel.cs b/Common/Data/Excel/GeneralActivityExcel.cs
new file mode 100644
index 0000000..8a1f1a6
--- /dev/null
+++ b/Common/Data/Excel/GeneralActivityExcel.cs
@@ -0,0 +1,18 @@
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("GeneralActivity.json")]
+public class GeneralActivityExcel : ExcelResource
+{
+ public uint AcitivityID { get; set; }
+ public uint Series { get; set; }
+
+ public override int GetId()
+ {
+ return (int)AcitivityID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.GeneralActivityData.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/GeneralActivityStageGroupExcel.cs b/Common/Data/Excel/GeneralActivityStageGroupExcel.cs
new file mode 100644
index 0000000..f0a8adb
--- /dev/null
+++ b/Common/Data/Excel/GeneralActivityStageGroupExcel.cs
@@ -0,0 +1,24 @@
+using System;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("GeneralActivityStageGroup.json")]
+public class GeneralActivityStageGroupExcel : ExcelResource
+{
+ public uint AcitivityId { get; set; }
+ public uint StageGroupId { get; set; }
+
+ public override int GetId()
+ {
+ return (int)AcitivityId;
+ }
+
+ public override void Loaded()
+ {
+ if (!GameData.GeneralActivityStageGroupData.ContainsKey(GetId()))
+ {
+ GameData.GeneralActivityStageGroupData[GetId()] = new List();
+ }
+ GameData.GeneralActivityStageGroupData[GetId()].Add(this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/GodWarEventExcel.cs b/Common/Data/Excel/GodWarEventExcel.cs
new file mode 100644
index 0000000..4ab5f14
--- /dev/null
+++ b/Common/Data/Excel/GodWarEventExcel.cs
@@ -0,0 +1,20 @@
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("GodWarEvent.json")]
+public class GodWarEventExcel : ExcelResource
+{
+ public uint EventID { get; set; }
+ public int EventType { get; set; }
+ public List ParamsVar { get; set; } = [];
+
+
+ public override int GetId()
+ {
+ return (int)EventID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.GodWarEventData.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/GodWarMainAvatarExcel.cs b/Common/Data/Excel/GodWarMainAvatarExcel.cs
new file mode 100644
index 0000000..16b807f
--- /dev/null
+++ b/Common/Data/Excel/GodWarMainAvatarExcel.cs
@@ -0,0 +1,17 @@
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("GodWarMainAvatar.json")]
+public class GodWarMainAvatarExcel : ExcelResource
+{
+ public int MainAvatarID { get; set; }
+
+ public override int GetId()
+ {
+ return MainAvatarID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.GodWarMainAvatarData.Add(MainAvatarID, this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/GodWarRelationDataExcel.cs b/Common/Data/Excel/GodWarRelationDataExcel.cs
new file mode 100644
index 0000000..f964bc7
--- /dev/null
+++ b/Common/Data/Excel/GodWarRelationDataExcel.cs
@@ -0,0 +1,20 @@
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("GodWarRelationData.json")]
+public class GodWarRelationDataExcel : ExcelResource
+{
+ public int AvatarID { get; set; }
+ public int RoleID { get; set; }
+ public int Level { get; set; }
+ public int MaxLevel { get; set; }
+
+ public override int GetId()
+ {
+ return AvatarID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.GodWarRelationData.Add(this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/GodWarSupportAvatarExcel.cs b/Common/Data/Excel/GodWarSupportAvatarExcel.cs
new file mode 100644
index 0000000..3335f70
--- /dev/null
+++ b/Common/Data/Excel/GodWarSupportAvatarExcel.cs
@@ -0,0 +1,17 @@
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("GodWarSupportAvatar.json")]
+public class GodWarSupportAvatarExcel : ExcelResource
+{
+ public int SupportAvatarID { get; set; }
+
+ public override int GetId()
+ {
+ return SupportAvatarID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.GodWarSupportAvatarData.Add(SupportAvatarID, this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/GodWarTaleScheduleExcel.cs b/Common/Data/Excel/GodWarTaleScheduleExcel.cs
new file mode 100644
index 0000000..d6f6b0e
--- /dev/null
+++ b/Common/Data/Excel/GodWarTaleScheduleExcel.cs
@@ -0,0 +1,22 @@
+using KianaBH.Data.Config;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("GodWarTaleSchedule.json")]
+public class GodWarTaleScheduleExcel : ExcelResource
+{
+ public uint TaleScheduleID { get; set; }
+ public List TaleIDList { get; set; } = [];
+ public TimestampConfig? BeginTime { get; set; }
+ public TimestampConfig? EndTime { get; set; }
+
+ public override int GetId()
+ {
+ return (int)TaleScheduleID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.GodWarTaleScheduleData.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/GodWarTalentDataExcel.cs b/Common/Data/Excel/GodWarTalentDataExcel.cs
new file mode 100644
index 0000000..f468041
--- /dev/null
+++ b/Common/Data/Excel/GodWarTalentDataExcel.cs
@@ -0,0 +1,19 @@
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("GodWarTalentData.json")]
+public class GodWarTalentDataExcel : ExcelResource
+{
+ public uint TalentID { get; set; }
+ public uint MaxLevel { get; set; }
+ public List TaleIDList { get; set; } = [];
+
+ public override int GetId()
+ {
+ return (int)TalentID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.GodWarTalentData.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/MaterialDataExcel.cs b/Common/Data/Excel/MaterialDataExcel.cs
new file mode 100644
index 0000000..ecdf10c
--- /dev/null
+++ b/Common/Data/Excel/MaterialDataExcel.cs
@@ -0,0 +1,22 @@
+using System.Text.Json.Serialization;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("MaterialData.json")]
+public class MaterialDataExcel : ExcelResource
+{
+ [JsonPropertyName("ID")] public int Id { get; set; }
+ [JsonPropertyName("rarity")] public int Rarity { get; set; }
+ [JsonPropertyName("maxRarity")] public int MaxRarity { get; set; }
+ [JsonPropertyName("quantityLimit")] public int QuantityLimit { get; set; }
+
+ public override int GetId()
+ {
+ return Id;
+ }
+
+ public override void Loaded()
+ {
+ GameData.MaterialData.Add(Id, this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/MissionDataExcel.cs b/Common/Data/Excel/MissionDataExcel.cs
new file mode 100644
index 0000000..d3c0367
--- /dev/null
+++ b/Common/Data/Excel/MissionDataExcel.cs
@@ -0,0 +1,22 @@
+using System.Text.Json.Serialization;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("MissionData.json")]
+public class MissionDataExcel : ExcelResource
+{
+ [JsonPropertyName("id")] public uint Id { get; set; }
+ [JsonPropertyName("totalProgress")] public uint TotalProgress { get; set; }
+ public uint Priority { get; set; }
+
+
+ public override int GetId()
+ {
+ return (int)Id;
+ }
+
+ public override void Loaded()
+ {
+ GameData.MissionData.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/PhonePendantDataExcel.cs b/Common/Data/Excel/PhonePendantDataExcel.cs
new file mode 100644
index 0000000..bf44054
--- /dev/null
+++ b/Common/Data/Excel/PhonePendantDataExcel.cs
@@ -0,0 +1,20 @@
+using System.Text.Json.Serialization;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("PhonePendantData.json")]
+public class PhonePendantDataExcel : ExcelResource
+{
+ public uint PendantId { get; set; }
+ public uint Rarity { get; set; }
+
+ public override int GetId()
+ {
+ return (int)PendantId;
+ }
+
+ public override void Loaded()
+ {
+ GameData.PhonePendantData.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/RandomPlotDataExcel.cs b/Common/Data/Excel/RandomPlotDataExcel.cs
new file mode 100644
index 0000000..3439de8
--- /dev/null
+++ b/Common/Data/Excel/RandomPlotDataExcel.cs
@@ -0,0 +1,21 @@
+using System.Text.Json.Serialization;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("RandomPlotData.json")]
+public class RandomPlotDataExcel : ExcelResource
+{
+ [JsonPropertyName("plotId")] public uint PlotId { get; set; }
+ [JsonPropertyName("startDialogId")] public uint StartDialogId { get; set; }
+ [JsonPropertyName("finishDialogIdList")] public List FinishDialogIdList { get; set; } = [];
+
+ public override int GetId()
+ {
+ return (int)PlotId;
+ }
+
+ public override void Loaded()
+ {
+ GameData.RandomPlotData.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/RecommendPanelExcel.cs b/Common/Data/Excel/RecommendPanelExcel.cs
new file mode 100644
index 0000000..4bef085
--- /dev/null
+++ b/Common/Data/Excel/RecommendPanelExcel.cs
@@ -0,0 +1,17 @@
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("RecommendPanel.json")]
+public class RecommendPanelExcel : ExcelResource
+{
+ public uint PanelId { get; set; }
+
+ public override int GetId()
+ {
+ return (int)PanelId;
+ }
+
+ public override void Loaded()
+ {
+ GameData.RecommendPanelData.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/StageDataMainExcel.cs b/Common/Data/Excel/StageDataMainExcel.cs
new file mode 100644
index 0000000..107c71d
--- /dev/null
+++ b/Common/Data/Excel/StageDataMainExcel.cs
@@ -0,0 +1,28 @@
+using System.Text.Json.Serialization;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("StageData_Main.json")]
+public class StageDataMainExcel : ExcelResource
+{
+ [JsonPropertyName("levelId")] public uint LevelId { get; set; }
+ [JsonPropertyName("maxProgress")] public uint MaxProgress { get; set; }
+ [JsonPropertyName("challengeList")] public List ChallengeList { get; set; } = [];
+
+ public override int GetId()
+ {
+ return (int)LevelId;
+ }
+
+ public override void Loaded()
+ {
+ GameData.StageDataMain.Add(GetId(), this);
+ }
+}
+
+
+public class ChallengeData
+{
+ [JsonPropertyName("challengeId")] public uint ChallengeId { get; set; }
+ [JsonPropertyName("rewardId")] public uint RewardId { get; set; }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/StepMissionCompensationExcel.cs b/Common/Data/Excel/StepMissionCompensationExcel.cs
new file mode 100644
index 0000000..b55d794
--- /dev/null
+++ b/Common/Data/Excel/StepMissionCompensationExcel.cs
@@ -0,0 +1,21 @@
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("StepMissionCompensation.json")]
+public class StepMissionCompensationExcel : ExcelResource
+{
+ public uint CompensationId { get; set; }
+ public uint UnlockLevel { get; set; }
+ public List MainLineStepIdList { get; set; } = [];
+ public List NewChallengeStepIdList { get; set; } = [];
+ public List OldChallengeStepIdList { get; set; } = [];
+
+ public override int GetId()
+ {
+ return (int)CompensationId;
+ }
+
+ public override void Loaded()
+ {
+ GameData.StepMissionCompensationData.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/StigmataDataExcel.cs b/Common/Data/Excel/StigmataDataExcel.cs
new file mode 100644
index 0000000..a0a434d
--- /dev/null
+++ b/Common/Data/Excel/StigmataDataExcel.cs
@@ -0,0 +1,26 @@
+using System.Text.Json.Serialization;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("StigmataData.json")]
+public class StigmataDataExcel : ExcelResource
+{
+ public int ID { get; set; }
+ [JsonPropertyName("maxLv")] public int MaxLv { get; set; }
+ [JsonPropertyName("rarity")] public int Rarity { get; set; }
+ [JsonPropertyName("maxRarity")] public int MaxRarity { get; set; }
+ [JsonPropertyName("evoID")] public int EvoID { get; set; }
+ [JsonPropertyName("quality")] public int Quality { get; set; }
+ [JsonPropertyName("isSecurityProtect")] public bool IsSecurityProtect { get; set; }
+ [JsonPropertyName("protect")] public bool Protect { get; set; }
+
+ public override int GetId()
+ {
+ return ID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.StigmataData.Add(ID, this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/ThemeDataAvatarExcel.cs b/Common/Data/Excel/ThemeDataAvatarExcel.cs
new file mode 100644
index 0000000..1a74321
--- /dev/null
+++ b/Common/Data/Excel/ThemeDataAvatarExcel.cs
@@ -0,0 +1,21 @@
+using System.Text.Json.Serialization;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("ThemeData_Avatar.json")]
+public class ThemeDataAvatarExcel : ExcelResource
+{
+ public uint AvatarData { get; set; }
+ public List BuffList { get; set; } = [];
+ [JsonPropertyName("avatarIDList")] public List AvatarIDList { get; set; } = [];
+
+ public override int GetId()
+ {
+ return (int)AvatarData;
+ }
+
+ public override void Loaded()
+ {
+ GameData.ThemeDataAvatar.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/TutorialDataExcel.cs b/Common/Data/Excel/TutorialDataExcel.cs
new file mode 100644
index 0000000..3d34769
--- /dev/null
+++ b/Common/Data/Excel/TutorialDataExcel.cs
@@ -0,0 +1,20 @@
+using System.Text.Json.Serialization;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("TutorialData.json")]
+public class TutorialDataExcel : ExcelResource
+{
+ [JsonPropertyName("id")] public uint Id { get; set; }
+ [JsonPropertyName("index")] public uint Index { get; set; }
+
+ public override int GetId()
+ {
+ return (int)Id;
+ }
+
+ public override void Loaded()
+ {
+ GameData.TutorialData.Add(GetId(), this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Excel/WeaponDataExcel.cs b/Common/Data/Excel/WeaponDataExcel.cs
new file mode 100644
index 0000000..15c5def
--- /dev/null
+++ b/Common/Data/Excel/WeaponDataExcel.cs
@@ -0,0 +1,25 @@
+using System.Text.Json.Serialization;
+
+namespace KianaBH.Data.Excel;
+
+[ResourceEntity("WeaponData.json")]
+public class WeaponDataExcel : ExcelResource
+{
+ public int ID { get; set; }
+ [JsonPropertyName("weaponMainID")] public int WeaponMainID { get; set; }
+ [JsonPropertyName("maxLv")] public int MaxLv { get; set; }
+ [JsonPropertyName("rarity")] public int Rarity { get; set; }
+ [JsonPropertyName("maxRarity")] public int MaxRarity { get; set; }
+ [JsonPropertyName("evoID")] public int EvoID { get; set; }
+ [JsonPropertyName("protect")] public bool Protect { get; set; }
+
+ public override int GetId()
+ {
+ return ID;
+ }
+
+ public override void Loaded()
+ {
+ GameData.WeaponData.Add(ID, this);
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/ExcelResource.cs b/Common/Data/ExcelResource.cs
new file mode 100644
index 0000000..084bf7f
--- /dev/null
+++ b/Common/Data/ExcelResource.cs
@@ -0,0 +1,18 @@
+namespace KianaBH.Data;
+
+public abstract class ExcelResource
+{
+ public abstract int GetId();
+
+ public virtual void Loaded()
+ {
+ }
+
+ public virtual void Finalized()
+ {
+ }
+
+ public virtual void AfterAllDone()
+ {
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/GameData.cs b/Common/Data/GameData.cs
new file mode 100644
index 0000000..c124bbb
--- /dev/null
+++ b/Common/Data/GameData.cs
@@ -0,0 +1,45 @@
+using KianaBH.Data.Excel;
+using KianaBH.Util.Extensions;
+using System.Collections.Concurrent;
+using System.Text.Json.Serialization;
+
+namespace KianaBH.Data;
+
+public static class GameData
+{
+ public static Dictionary> ActChallengeData { get; private set; } = [];
+ public static Dictionary ActivityTowerData { get; private set; } = [];
+ public static Dictionary AffixListData { get; private set; } = [];
+ public static Dictionary AvatarData { get; private set; } = [];
+ public static Dictionary AvatarSubSkillData { get; private set; } = [];
+ public static Dictionary AvatarTutorialData { get; private set; } = [];
+ public static Dictionary CollectionData { get; private set; } = [];
+ public static Dictionary CustomHeadData { get; private set; } = [];
+ public static Dictionary DressData { get; private set; } = [];
+ public static Dictionary ElfAstraMateData { get; private set; } = [];
+ public static Dictionary ElfSkillData { get; private set; } = [];
+ public static Dictionary EntryThemeData { get; private set; } = [];
+ public static Dictionary EntryThemeItemData { get; private set; } = [];
+ public static Dictionary FrameData { get; private set; } = [];
+ public static Dictionary> GeneralActivityStageGroupData { get; private set; } = [];
+ public static Dictionary GeneralActivityData { get; private set; } = [];
+ public static Dictionary GodWarEventData { get; private set; } = [];
+ public static Dictionary GodWarMainAvatarData { get; private set; } = [];
+ public static List GodWarRelationData { get; private set; } = [];
+ public static Dictionary GodWarSupportAvatarData { get; private set; } = [];
+ public static Dictionary GodWarTaleScheduleData { get; private set; } = [];
+ public static Dictionary GodWarTalentData { get; private set; } = [];
+ public static Dictionary MaterialData { get; private set; } = [];
+ public static Dictionary MissionData { get; private set; } = [];
+ public static Dictionary RecommendPanelData { get; private set; } = [];
+ public static Dictionary StageDataMain { get; private set; } = [];
+ public static Dictionary StepMissionCompensationData { get; private set; } = [];
+ public static Dictionary StigmataData { get; private set; } = [];
+ public static Dictionary ThemeDataAvatar { get; private set; } = [];
+ public static Dictionary WeaponData { get; private set; } = [];
+ public static Dictionary ChapterGroupConfigData { get; private set; } = [];
+ public static Dictionary PhonePendantData { get; private set; } = [];
+ public static Dictionary TutorialData { get; private set; } = [];
+ public static Dictionary CityEventPhotoData { get; private set; } = [];
+ public static Dictionary RandomPlotData { get; private set; } = [];
+}
\ No newline at end of file
diff --git a/Common/Data/Models/Dispatch/DispatchQuery.cs b/Common/Data/Models/Dispatch/DispatchQuery.cs
new file mode 100644
index 0000000..ce06972
--- /dev/null
+++ b/Common/Data/Models/Dispatch/DispatchQuery.cs
@@ -0,0 +1,13 @@
+using System.ComponentModel.DataAnnotations;
+using Microsoft.AspNetCore.Mvc;
+
+namespace KianaBH.Data.Models.Dispatch;
+
+public class DispatchQuery
+{
+ [Required] public string? Version { get; set; }
+ [FromQuery(Name = "t")] public int Timestamp { get; set; }
+ public string? Lang { get; set; }
+ public int Uid { get; set; }
+ public string? Token { get; set; }
+}
\ No newline at end of file
diff --git a/Common/Data/Models/Dispatch/QueryDispatchModels.cs b/Common/Data/Models/Dispatch/QueryDispatchModels.cs
new file mode 100644
index 0000000..ad1655f
--- /dev/null
+++ b/Common/Data/Models/Dispatch/QueryDispatchModels.cs
@@ -0,0 +1,17 @@
+namespace KianaBH.Data.Models.Dispatch;
+
+public class QueryDispatchResponse
+{
+ public int Retcode { get; set; }
+ public List RegionList { get; set; } = [];
+
+
+ public class RegionInfo
+ {
+ public string? DispatchUrl { get; set; }
+ public object? Ext { get; set; }
+ public string? Name { get; set; }
+ public int Retcode { get; set; }
+ public string? Title { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Models/Dispatch/QueryGatewayModels.cs b/Common/Data/Models/Dispatch/QueryGatewayModels.cs
new file mode 100644
index 0000000..a2b0bc6
--- /dev/null
+++ b/Common/Data/Models/Dispatch/QueryGatewayModels.cs
@@ -0,0 +1,30 @@
+using KianaBH.Util.Extensions;
+using KianaBH.Configuration;
+
+namespace KianaBH.Data.Models.Dispatch;
+
+public class QueryGatewayResponse
+{
+ public long ServerCurTime { get; set; } = Extensions.GetUnixSec();
+ public int ServerCurTimezone { get; set; } = (int)TimeZoneInfo.Local.GetUtcOffset(DateTime.Now).TotalHours;
+ public string RegionName { get; set; } = "KianaBH";
+ public string Msg { get; set; } = "";
+ public bool IsDataReady { get; set; } = true;
+ public int Retcode { get; set; }
+
+ public string? AccountUrl { get; set; }
+ public ServerInfo? Gameserver { get; set; }
+ public ServerInfo? Gateway { get; set; }
+ public List ExResourceUrlList { get; set; } = [];
+ public List ExAudioAndVideoUrlList { get; set; } = [];
+ public List AssetBundleUrlList { get; set; } = [];
+ public HotfixManfiset? Manifest { get; set; }
+ public Dictionary Ext { get; set; } = new();
+
+ public class ServerInfo
+ {
+ public string? Ip { get; set; }
+ public bool IsKcp { get; set; }
+ public int Port { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/Common/Data/Models/Sdk/ComboGranterModels.cs b/Common/Data/Models/Sdk/ComboGranterModels.cs
new file mode 100644
index 0000000..2716161
--- /dev/null
+++ b/Common/Data/Models/Sdk/ComboGranterModels.cs
@@ -0,0 +1,34 @@
+using System.Text.Json.Serialization;
+using System.ComponentModel.DataAnnotations;
+using KianaBH.Util.Extensions;
+
+namespace KianaBH.Data.Models.Sdk;
+
+public class ComboGranterData
+{
+ public string? Uid { get; set; }
+ public string? Token { get; set; }
+}
+
+public class ComboGranterRequest
+{
+ [Required]
+ [JsonConverter(typeof(JsonStringToObjectConverter))]
+ public ComboGranterData? Data { get; set; }
+}
+
+public class ComboGranterResponse : ResponseBase
+{
+ public new ComboGranterResponseData? Data { get; set; }
+
+ public class ComboGranterResponseData
+ {
+ public uint AccountType { get; set; }
+ public string? OpenId { get; set; }
+ public string? ComboId { get; set; }
+ public string? ComboToken { get; set; }
+ public bool Heartbeat { get; set; }
+ public string? Data { get; set; }
+ }
+}
+
diff --git a/Common/Data/Models/Sdk/DeviceFingerprintController.cs b/Common/Data/Models/Sdk/DeviceFingerprintController.cs
new file mode 100644
index 0000000..cf3f937
--- /dev/null
+++ b/Common/Data/Models/Sdk/DeviceFingerprintController.cs
@@ -0,0 +1,6 @@
+namespace KianaBH.Data.Models.Sdk;
+public class GetDeviceFingerprintRequest
+{
+ public string? DeviceFp { get; set; }
+}
+
diff --git a/Common/Data/Models/Sdk/GameWeatherModels.cs b/Common/Data/Models/Sdk/GameWeatherModels.cs
new file mode 100644
index 0000000..9c5ebb8
--- /dev/null
+++ b/Common/Data/Models/Sdk/GameWeatherModels.cs
@@ -0,0 +1,20 @@
+namespace KianaBH.Data.Models.Sdk;
+
+public class GetWeatherResponse : ResponseBase
+{
+ public new GetWeatherResponseData? Data { get; set; }
+
+ public class GetWeatherResponseData
+ {
+ public int Timezone { get; set; }
+ public List Hourly { get; set; } = [];
+
+ public class HourlyWeatherData
+ {
+ public int Condition { get; set; }
+ public int Hour { get; set; }
+ public string? Date { get; set; }
+ public int Temp { get; set; }
+ }
+ }
+}
diff --git a/Common/Data/Models/Sdk/MdkShieldModels.cs b/Common/Data/Models/Sdk/MdkShieldModels.cs
new file mode 100644
index 0000000..1b0945e
--- /dev/null
+++ b/Common/Data/Models/Sdk/MdkShieldModels.cs
@@ -0,0 +1,42 @@
+namespace KianaBH.Data.Models.Sdk;
+
+public class MdkShieldLoginRequest
+{
+ public string? Account { get; set; }
+ public string? Password { get; set; }
+ public bool IsCrypto { get; set; }
+}
+
+public class MdkShieldVerifyRequest
+{
+ public string? Uid { get; set; }
+ public string? Token { get; set; }
+}
+
+// TODO: Move this to DB instead
+public class MdkShieldAccountData
+{
+ public string? Token { get; set; }
+ public string? Uid { get; set; }
+
+ public string Email { get; set; } = "";
+ public string IsEmailVerify { get; set; } = "0";
+ public string AreaCode { get; set; } = "";
+ public string Country { get; set; } = "";
+ public string Name { get; set; } = "";
+ public string Realname { get; set; } = "";
+}
+
+public class MdkShieldResponse : ResponseBase
+{
+ public new MdkShieldResponseData? Data { get; set; }
+
+ public class MdkShieldResponseData
+ {
+ public MdkShieldAccountData? Account { get; set; }
+ public bool DeviceGrantRequired { get; set; }
+ public bool ReactiveRequired { get; set; }
+ public bool RealpersonRequired { get; set; }
+ public bool SafeMobileRequeired { get; set; }
+ }
+}
diff --git a/Common/Data/Models/Sdk/ResponseBase.cs b/Common/Data/Models/Sdk/ResponseBase.cs
new file mode 100644
index 0000000..c3da79a
--- /dev/null
+++ b/Common/Data/Models/Sdk/ResponseBase.cs
@@ -0,0 +1,9 @@
+namespace KianaBH.Data.Models.Sdk;
+
+public class ResponseBase
+{
+ public string Message { get; set; } = "OK";
+ public bool Success { get; set; } = true;
+ public int Retcode { get; set; }
+ public object? Data { get; set; }
+}
\ No newline at end of file
diff --git a/Common/Data/ResourceEntity.cs b/Common/Data/ResourceEntity.cs
new file mode 100644
index 0000000..44342a6
--- /dev/null
+++ b/Common/Data/ResourceEntity.cs
@@ -0,0 +1,33 @@
+namespace KianaBH.Data;
+
+[AttributeUsage(AttributeTargets.Class, Inherited = false)]
+public class ResourceEntity : Attribute
+{
+ [Obsolete("No effect")]
+ public ResourceEntity(string fileName, bool isCritical = false, bool isMultifile = false)
+ {
+ if (isMultifile)
+ FileName = new List(fileName.Split(','));
+ else
+ FileName = [fileName];
+ IsCritical = isCritical;
+ }
+
+
+ public ResourceEntity(string fileName, bool isMultifile = false)
+ {
+ if (isMultifile)
+ FileName = new List(fileName.Split(','));
+ else
+ FileName = [fileName];
+ }
+
+ public ResourceEntity(string fileName)
+ {
+ FileName = [fileName];
+ }
+
+ public List FileName { get; private set; }
+
+ [Obsolete("No effect")] public bool IsCritical { get; private set; } // deprecated
+}
\ No newline at end of file
diff --git a/Common/Data/ResourceManager.cs b/Common/Data/ResourceManager.cs
new file mode 100644
index 0000000..d285d01
--- /dev/null
+++ b/Common/Data/ResourceManager.cs
@@ -0,0 +1,169 @@
+using KianaBH.Internationalization;
+using KianaBH.Util;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System.Reflection;
+
+namespace KianaBH.Data;
+
+public class ResourceManager
+{
+ public static Logger Logger { get; } = new("ResourceManager");
+ public static bool IsLoaded { get; set; }
+
+ public static void LoadGameData()
+ {
+ LoadExcel();
+ }
+
+ public static void LoadExcel()
+ {
+ var classes = Assembly.GetExecutingAssembly().GetTypes(); // Get all classes in the assembly
+ List resList = [];
+
+ foreach (var cls in classes.Where(x => x.IsSubclassOf(typeof(ExcelResource))))
+ {
+ var res = LoadSingleExcelResource(cls);
+ if (res != null) resList.AddRange(res);
+ }
+
+ foreach (var cls in resList) cls.AfterAllDone();
+ }
+
+ public static List? LoadSingleExcel(Type cls) where T : ExcelResource, new()
+ {
+ return LoadSingleExcelResource(cls) as List;
+ }
+
+ public static List? LoadSingleExcelResource(Type cls)
+ {
+ var attribute = (ResourceEntity?)Attribute.GetCustomAttribute(cls, typeof(ResourceEntity));
+
+ if (attribute == null) return null;
+ var resource = (ExcelResource)Activator.CreateInstance(cls)!;
+ var count = 0;
+ List resList = [];
+ foreach (var fileName in attribute.FileName)
+ try
+ {
+ var path = ConfigManager.Config.Path.ResourcePath + "/ExcelOutput/" + fileName;
+ var file = new FileInfo(path);
+ if (!file.Exists)
+ {
+ Logger.Error(I18NManager.Translate("Server.ServerInfo.FailedToReadItem", fileName,
+ I18NManager.Translate("Word.NotFound")));
+ continue;
+ }
+
+ var json = file.OpenText().ReadToEnd();
+ using (var reader = new JsonTextReader(new StringReader(json)))
+ {
+ reader.Read();
+ switch (reader.TokenType)
+ {
+ case JsonToken.StartArray:
+ {
+ // array
+ var jArray = JArray.Parse(json);
+ foreach (var item in jArray)
+ {
+ var res = JsonConvert.DeserializeObject(item.ToString(), cls);
+ resList.Add((ExcelResource)res!);
+ ((ExcelResource?)res)?.Loaded();
+ count++;
+ }
+
+ break;
+ }
+ case JsonToken.StartObject:
+ {
+ // dictionary
+ var jObject = JObject.Parse(json);
+ foreach (var (_, obj) in jObject)
+ {
+ var instance = JsonConvert.DeserializeObject(obj!.ToString(), cls);
+
+ if (((ExcelResource?)instance)?.GetId() == 0 || (ExcelResource?)instance == null)
+ {
+ // Deserialize as JObject to handle nested dictionaries
+ var nestedObject = JsonConvert.DeserializeObject(obj.ToString());
+
+ foreach (var nestedItem in nestedObject ?? [])
+ {
+ var nestedInstance =
+ JsonConvert.DeserializeObject(nestedItem.Value!.ToString(), cls);
+ resList.Add((ExcelResource)nestedInstance!);
+ ((ExcelResource?)nestedInstance)?.Loaded();
+ count++;
+ }
+ }
+ else
+ {
+ resList.Add((ExcelResource)instance);
+ ((ExcelResource)instance).Loaded();
+ }
+
+ count++;
+ }
+
+ break;
+ }
+ }
+ }
+
+ resource.Finalized();
+ }
+ catch (Exception ex)
+ {
+ Logger.Error(
+ I18NManager.Translate("Server.ServerInfo.FailedToReadItem", fileName,
+ I18NManager.Translate("Word.Error")), ex);
+ }
+
+ Logger.Info(I18NManager.Translate("Server.ServerInfo.LoadedItems", count.ToString(), cls.Name));
+
+ return resList;
+ }
+
+ public static T? LoadCustomFile(string filetype, string filename)
+ {
+ var type = I18NManager.Translate("Word." + filetype);
+ Logger.Info(I18NManager.Translate("Server.ServerInfo.LoadingItem", type));
+ FileInfo file = new(ConfigManager.Config.Path.DataPath + $"/{filename}.json");
+ T? customFile = default;
+ if (!file.Exists)
+ {
+ Logger.Warn(I18NManager.Translate("Server.ServerInfo.ConfigMissing", type,
+ $"{ConfigManager.Config.Path.DataPath}/{filename}.json", type));
+ return customFile;
+ }
+
+ try
+ {
+ using var reader = file.OpenRead();
+ using StreamReader reader2 = new(reader);
+ var text = reader2.ReadToEnd();
+ var json = JsonConvert.DeserializeObject(text);
+ customFile = json;
+ }
+ catch (Exception ex)
+ {
+ Logger.Error("Error in reading " + file.Name, ex);
+ }
+
+ switch (customFile)
+ {
+ case Dictionary d:
+ Logger.Info(I18NManager.Translate("Server.ServerInfo.LoadedItems", d.Count.ToString(), type));
+ break;
+ case Dictionary> di:
+ Logger.Info(I18NManager.Translate("Server.ServerInfo.LoadedItems", di.Count.ToString(), type));
+ break;
+ default:
+ Logger.Info(I18NManager.Translate("Server.ServerInfo.LoadedItem", filetype));
+ break;
+ }
+
+ return customFile;
+ }
+}
\ No newline at end of file
diff --git a/Common/Database/Account/AccountData.cs b/Common/Database/Account/AccountData.cs
new file mode 100644
index 0000000..4ba0305
--- /dev/null
+++ b/Common/Database/Account/AccountData.cs
@@ -0,0 +1,150 @@
+using KianaBH.Enums.Player;
+using KianaBH.Util;
+using KianaBH.Util.Extensions;
+using KianaBH.Util.Security;
+using SqlSugar;
+
+namespace KianaBH.Database.Account;
+
+[SugarTable("Account")]
+public class AccountData : BaseDatabaseDataHelper
+{
+ public string Username { get; set; } = "";
+ public string Password { get; set; } = "";
+ public BanTypeEnum BanType { get; set; }
+
+ [SugarColumn(IsJson = true)] public List Permissions { get; set; } = [];
+
+ [SugarColumn(IsNullable = true)] public string? ComboToken { get; set; }
+
+ #region GetAccount
+
+ public static AccountData? GetAccountByUserName(string username)
+ {
+ AccountData? result = null;
+ DatabaseHelper.GetAllInstance()?.ForEach(account =>
+ {
+ if (account.Username == username) result = account;
+ });
+ return result;
+ }
+
+ public static AccountData? GetAccountByUid(int uid, bool force = false)
+ {
+ var result = DatabaseHelper.GetInstance(uid, force);
+ return result;
+ }
+
+ #endregion
+
+ #region Account
+
+ public static void CreateAccount(string username, int uid, string password)
+ {
+ var newUid = uid;
+ if (uid == 0)
+ {
+ newUid = 100001;
+ while (GetAccountByUid(newUid) != null) newUid++;
+ }
+
+ var account = new AccountData
+ {
+ Uid = newUid,
+ Username = username,
+ Password = "",
+ Permissions = [.. ConfigManager.Config.ServerOption.DefaultPermissions
+ .Select(perm => Enum.TryParse(perm, out PermEnum result) ? result : (PermEnum?)null)
+ .Where(result => result.HasValue).Select(result => result!.Value)]
+ };
+ SetPassword(account, password);
+
+ DatabaseHelper.CreateInstance(account);
+ }
+
+ public static void DeleteAccount(int uid)
+ {
+ if (GetAccountByUid(uid) == null) return;
+ DatabaseHelper.DeleteAllInstance(uid);
+ }
+
+ public static void SetPassword(AccountData account, string password)
+ {
+ if (password.Length > 0)
+ account.Password = Extensions.GetSha256Hash(password);
+ else
+ account.Password = "";
+ }
+
+ public static bool VerifyPassword(AccountData account, string password)
+ => account.Password == Extensions.GetSha256Hash(password);
+
+
+ #endregion
+
+ #region Permission
+
+ public static bool HasPerm(PermEnum[] perms, int uid)
+ {
+ if (uid == (int)ServerEnum.Console) return true;
+ var account = GetAccountByUid(uid);
+ if (account?.Permissions == null) return false;
+ if (account.Permissions.Contains(PermEnum.Admin)) return true;
+
+ return perms.Any(account.Permissions.Contains);
+ }
+
+ public static void AddPerm(PermEnum[] perms, int uid)
+ {
+ if (uid == (int)ServerEnum.Console) return;
+ var account = GetAccountByUid(uid);
+ if (account == null) return;
+
+ account.Permissions ??= [];
+ foreach (var perm in perms)
+ {
+ if (!account.Permissions.Contains(perm))
+ {
+ account.Permissions = [.. account.Permissions, perm];
+ }
+ }
+ }
+
+ public static void RemovePerm(PermEnum[] perms, int uid)
+ {
+ if (uid == (int)ServerEnum.Console) return;
+ var account = GetAccountByUid(uid);
+ if (account == null) return;
+ if (account.Permissions == null) return;
+
+ foreach (var perm in perms)
+ {
+ if (account.Permissions.Contains(perm))
+ {
+ account.Permissions = account.Permissions.Except([perm]).ToList();
+ }
+ }
+ }
+
+ public static void CleanPerm(int uid)
+ {
+ if (uid == (int)ServerEnum.Console) return;
+ var account = GetAccountByUid(uid);
+ if (account == null) return;
+
+ account.Permissions = [];
+ }
+
+ #endregion
+
+ #region Token
+
+ public string GenerateComboToken()
+ {
+ ComboToken = Crypto.CreateSessionKey(Uid.ToString());
+ DatabaseHelper.UpdateInstance(this);
+ return ComboToken;
+ }
+
+ #endregion
+}
\ No newline at end of file
diff --git a/Common/Database/Avatar/AvatarData.cs b/Common/Database/Avatar/AvatarData.cs
new file mode 100644
index 0000000..a0fdccd
--- /dev/null
+++ b/Common/Database/Avatar/AvatarData.cs
@@ -0,0 +1,95 @@
+using SqlSugar;
+using KianaBH.Proto;
+
+namespace KianaBH.Database.Avatar;
+
+[SugarTable("Avatar")]
+public class AvatarData : BaseDatabaseDataHelper
+{
+ [SugarColumn(IsJson = true)] public List Avatars { get; set; } = [];
+}
+
+public class AvatarInfo
+{
+ public int AvatarId { get; set; }
+ public int Star { get; set; }
+ public int Level { get; set; }
+ public int Exp { get; set; }
+ public int Fragment { get; set; }
+ public int WeaponUniqueId { get; set; }
+ public int StigmataUniqueId1 { get; set; }
+ public int StigmataUniqueId2 { get; set; }
+ public int StigmataUniqueId3 { get; set; }
+ public List SkillList { get; set; } = [];
+ public int TouchGoodFeel { get; set; }
+ public int TodayHasAddGoodFeel { get; set; }
+ public int StageGoodFeel { get; set; }
+ public List DressList { get; set; } = [];
+ public int DressId { get; set; }
+ public AvatarBindEquipMode Mode { get; set; } = AvatarBindEquipMode.AvatarBindEquipCommon;
+ public AvatarArtifactDetail? AvatarArtifact { get; set; }
+ public int SubStar { get; set; }
+ public long Timestamp { get; set; }
+ public Proto.Avatar ToProto()
+ {
+ var proto = new Proto.Avatar
+ {
+ AvatarId = (uint)AvatarId,
+ Star = (uint)Star,
+ Level = (uint)Level,
+ Exp = (uint)Exp,
+ Fragment = (uint)Fragment,
+ WeaponUniqueId = (uint)WeaponUniqueId,
+ StigmataUniqueId1 = (uint)StigmataUniqueId1,
+ StigmataUniqueId2 = (uint)StigmataUniqueId2,
+ StigmataUniqueId3 = (uint)StigmataUniqueId3,
+ TouchGoodfeel = (uint)TouchGoodFeel,
+ TodayHasAddGoodfeel = (uint)TodayHasAddGoodFeel,
+ StageGoodfeel = (uint)StageGoodFeel,
+ DressId = (uint)DressId,
+ Mode = Mode,
+ SubStar = (uint)SubStar,
+ };
+
+ foreach (var dressId in DressList)
+ {
+ proto.DressList.Add((uint)dressId);
+ }
+
+ foreach (var skill in SkillList)
+ {
+ var avatarSkill = new Proto.AvatarSkill
+ {
+ SkillId = (uint)skill.SkillId
+ };
+
+ avatarSkill.SubSkillList.AddRange(skill.SubSkillList.Select(x => new Proto.AvatarSubSkill
+ {
+ SubSkillId = (uint)x.SubSkillId,
+ Level = x.Level,
+ IsMask = x.IsMask
+ }));
+
+ proto.SkillList.Add(avatarSkill);
+ }
+ return proto;
+ }
+
+}
+public class AvatarSkill
+{
+ public int SkillId { get; set; }
+ public List SubSkillList { get; set; } = [];
+}
+public class AvatarSubSkill
+{
+ public int SubSkillId { get; set; }
+ public uint Level { get; set; }
+ public bool IsMask { get; set; }
+}
+public class AvatarArtifactDetail
+{
+ public int ArtifactId { get; set; }
+ public int ArtifactLevel { get; set; }
+ public bool IsArtifactSwitchOn { get; set; }
+}
\ No newline at end of file
diff --git a/Common/Database/BaseDatabaseDataHelper.cs b/Common/Database/BaseDatabaseDataHelper.cs
new file mode 100644
index 0000000..1ea2d77
--- /dev/null
+++ b/Common/Database/BaseDatabaseDataHelper.cs
@@ -0,0 +1,8 @@
+using SqlSugar;
+
+namespace KianaBH.Database;
+
+public abstract class BaseDatabaseDataHelper
+{
+ [SugarColumn(IsPrimaryKey = true)] public int Uid { get; set; }
+}
\ No newline at end of file
diff --git a/Common/Database/Client/ClientData.cs b/Common/Database/Client/ClientData.cs
new file mode 100644
index 0000000..4c336d5
--- /dev/null
+++ b/Common/Database/Client/ClientData.cs
@@ -0,0 +1,28 @@
+using Google.Protobuf;
+using KianaBH.Proto;
+using SqlSugar;
+
+namespace KianaBH.Database.Client;
+
+[SugarTable("client_data")]
+public class ClientData : BaseDatabaseDataHelper
+{
+ [SugarColumn(IsJson = true)] public List Clients { get; set; } = [];
+}
+
+public class ClientDBData
+{
+ public uint Id { get; set; }
+ public ClientDataType Type { get; set; } = ClientDataType.ClientDataNone;
+ public byte[] Data { get; set; } = Array.Empty();
+ public Proto.ClientData ToProto()
+ {
+ var proto = new Proto.ClientData
+ {
+ Id = Id,
+ Type = Type,
+ Data = ByteString.CopyFrom(Data)
+ };
+ return proto;
+ }
+}
\ No newline at end of file
diff --git a/Common/Database/CustomSerializeService.cs b/Common/Database/CustomSerializeService.cs
new file mode 100644
index 0000000..baf4f99
--- /dev/null
+++ b/Common/Database/CustomSerializeService.cs
@@ -0,0 +1,32 @@
+using Newtonsoft.Json;
+using SqlSugar;
+
+namespace KianaBH.Database;
+
+public class CustomSerializeService : ISerializeService
+{
+ private readonly JsonSerializerSettings _jsonSettings;
+
+ public CustomSerializeService()
+ {
+ _jsonSettings = new JsonSerializerSettings
+ {
+ DefaultValueHandling = DefaultValueHandling.Ignore // ignore default values
+ };
+ }
+
+ public string SerializeObject(object value)
+ {
+ return JsonConvert.SerializeObject(value, _jsonSettings);
+ }
+
+ public T DeserializeObject(string value)
+ {
+ return JsonConvert.DeserializeObject(value)!;
+ }
+
+ public string SugarSerializeObject(object value)
+ {
+ return JsonConvert.SerializeObject(value, _jsonSettings);
+ }
+}
\ No newline at end of file
diff --git a/Common/Database/DatabaseHelper.cs b/Common/Database/DatabaseHelper.cs
new file mode 100644
index 0000000..ea4b99d
--- /dev/null
+++ b/Common/Database/DatabaseHelper.cs
@@ -0,0 +1,307 @@
+using KianaBH.Database.Account;
+using KianaBH.Internationalization;
+using KianaBH.Util;
+using SqlSugar;
+using System.Collections.Concurrent;
+using System.Globalization;
+
+namespace KianaBH.Database;
+
+public class DatabaseHelper
+{
+ public static Logger logger = new("Database");
+ public static SqlSugarScope? sqlSugarScope;
+ public static readonly ConcurrentDictionary> UidInstanceMap = [];
+ public static readonly List ToSaveUidList = [];
+ public static long LastSaveTick = DateTime.UtcNow.Ticks;
+ public static Thread? SaveThread;
+ public static bool LoadAccount;
+ public static bool LoadAllData;
+
+ public void Initialize()
+ {
+ logger.Info(I18NManager.Translate("Server.ServerInfo.LoadingItem", I18NManager.Translate("Word.Database")));
+ var f = new FileInfo(ConfigManager.Config.Path.DatabasePath + "/" + ConfigManager.Config.GameServer.DatabaseName);
+ if (!f.Exists && f.Directory != null) f.Directory.Create();
+
+ sqlSugarScope = new SqlSugarScope(new ConnectionConfig
+ {
+ ConnectionString = $"Data Source={f.FullName};",
+ DbType = DbType.Sqlite,
+ IsAutoCloseConnection = true,
+ ConfigureExternalServices = new ConfigureExternalServices
+ {
+ SerializeService = new CustomSerializeService()
+ }
+ });
+
+ InitializeSqlite();
+
+ var baseType = typeof(BaseDatabaseDataHelper);
+ var assembly = typeof(BaseDatabaseDataHelper).Assembly;
+ var types = assembly.GetTypes().Where(t => t.IsSubclassOf(baseType));
+
+ var list = sqlSugarScope.Queryable().ToList();
+ foreach (var inst in list)
+ {
+ if (!UidInstanceMap.TryGetValue(inst.Uid, out var value))
+ {
+ value = [];
+ UidInstanceMap[inst.Uid] = value;
+ }
+
+ value.Add(inst); // add to the map
+ }
+
+ // start dispatch server
+ LoadAccount = true;
+
+ var res = Parallel.ForEach(list, account =>
+ {
+ Parallel.ForEach(types, t =>
+ {
+ if (t == typeof(AccountData)) return; // skip the account data
+
+ try
+ {
+ typeof(DatabaseHelper).GetMethod(nameof(InitializeTable))?.MakeGenericMethod(t)
+ .Invoke(null, [account.Uid]);
+ }
+ catch (Exception e)
+ {
+ logger.Error("Database initialization error: ", e);
+ }
+
+ }); // cache the data
+ });
+
+ while (!res.IsCompleted)
+ {
+ }
+
+ LastSaveTick = DateTime.UtcNow.Ticks;
+
+ SaveThread = new Thread(() =>
+ {
+ while (true) CalcSaveDatabase();
+ });
+ SaveThread.Start();
+
+ LoadAllData = true;
+ }
+
+ public static void InitializeTable(int uid) where T : BaseDatabaseDataHelper, new()
+ {
+ var list = sqlSugarScope?.Queryable()
+ .Select(x => x)
+ .Select()
+ .Where(x => x.Uid == uid)
+ .ToList();
+
+ foreach (var inst in list!.Select(instance => (instance as BaseDatabaseDataHelper)!))
+ {
+ if (!UidInstanceMap.TryGetValue(inst.Uid, out var value))
+ {
+ value = [];
+ UidInstanceMap[inst.Uid] = value;
+ }
+
+ value.Add(inst); // add to the map
+ }
+ }
+
+ public static void InitializeSqlite()
+ {
+ var baseType = typeof(BaseDatabaseDataHelper);
+ var assembly = typeof(BaseDatabaseDataHelper).Assembly;
+ var types = assembly.GetTypes().Where(t => t.IsSubclassOf(baseType));
+ foreach (var type in types)
+ typeof(DatabaseHelper).GetMethod("InitializeSqliteTable")?.MakeGenericMethod(type).Invoke(null, null);
+ }
+
+ // DO NOT DEL ReSharper disable once UnusedMember.Global
+ public static void InitializeSqliteTable() where T : BaseDatabaseDataHelper, new()
+ {
+ try
+ {
+ sqlSugarScope?.CodeFirst.InitTables();
+ }
+ catch
+ {
+ // ignored
+ }
+ }
+
+ public static T? GetInstance(int uid, bool forceReload = false) where T : BaseDatabaseDataHelper, new()
+ {
+ try
+ {
+ if (!forceReload && UidInstanceMap.TryGetValue(uid, out var value))
+ {
+ var instance = value.OfType().FirstOrDefault();
+ if (instance != null) return instance;
+ }
+ var t = sqlSugarScope?.Queryable()
+ .Where(x => x.Uid == uid)
+ .ToList();
+
+ if (t is { Count: > 0 })
+ {
+ var instance = t[0];
+
+ if (!UidInstanceMap.TryGetValue(uid, out var list))
+ {
+ list = new List();
+ UidInstanceMap[uid] = list;
+ }
+ else
+ {
+ list.RemoveAll(i => i is T);
+ }
+
+ list.Add(instance);
+ return instance;
+ }
+
+ return null;
+
+ return null;
+ }
+ catch (Exception e)
+ {
+ logger.Error("Unsupported type", e);
+ return null;
+ }
+ }
+
+ public static T GetInstanceOrCreateNew(int uid) where T : BaseDatabaseDataHelper, new()
+ {
+ var instance = GetInstance(uid);
+ if (instance != null) return instance;
+
+ instance = new T
+ {
+ Uid = uid
+ };
+ CreateInstance(instance);
+
+ return instance;
+ }
+
+ public static List? GetAllInstance() where T : BaseDatabaseDataHelper, new()
+ {
+ try
+ {
+ return sqlSugarScope?.Queryable()
+ .Select(x => x)
+ .ToList();
+ }
+ catch (Exception e)
+ {
+ logger.Error("Unsupported type", e);
+ return null;
+ }
+ }
+
+ public static void UpdateInstance(T instance) where T : BaseDatabaseDataHelper, new()
+ {
+ sqlSugarScope?.Updateable(instance).ExecuteCommand();
+ }
+
+ public static void CreateInstance(T instance) where T : BaseDatabaseDataHelper, new()
+ {
+ sqlSugarScope?.Insertable(instance).ExecuteCommand();
+ if (!UidInstanceMap.TryGetValue(instance.Uid, out var value))
+ {
+ value = [];
+ UidInstanceMap[instance.Uid] = value;
+ }
+ value.Add(instance);
+ }
+
+ public static void DeleteInstance(int key) where T : BaseDatabaseDataHelper, new()
+ {
+ try
+ {
+ sqlSugarScope?.Deleteable().Where(x => x.Uid == key).ExecuteCommand();
+ }
+ catch (Exception e)
+ {
+ logger.Error("An error occurred while delete the database", e);
+ }
+ }
+
+ public static void DeleteAllInstance(int key)
+ {
+
+ var value = UidInstanceMap[key];
+ var baseType = typeof(BaseDatabaseDataHelper);
+ var assembly = typeof(BaseDatabaseDataHelper).Assembly;
+ var types = assembly.GetTypes().Where(t => t.IsSubclassOf(baseType));
+ foreach (var type in types)
+ {
+ var instance = value.Find(x => x.GetType() == type);
+ if (instance != null)
+ typeof(DatabaseHelper).GetMethod("DeleteInstance")?.MakeGenericMethod(type)
+ .Invoke(null, [key]);
+ }
+
+ if (UidInstanceMap.TryRemove(key, out var instances))
+ ToSaveUidList.RemoveAll(x => x == key);
+ }
+
+ // Auto save per 5 min
+ public static void CalcSaveDatabase()
+ {
+ if (LastSaveTick + TimeSpan.TicksPerMinute * 5 > DateTime.UtcNow.Ticks) return;
+ SaveDatabase();
+ }
+
+ public static void SaveDatabase()
+ {
+ try
+ {
+ var prev = DateTime.Now;
+ var list = ToSaveUidList.ToList(); // copy the list to avoid the exception
+ foreach (var uid in list)
+ {
+ var value = UidInstanceMap[uid];
+ var baseType = typeof(BaseDatabaseDataHelper);
+ var assembly = typeof(BaseDatabaseDataHelper).Assembly;
+ var types = assembly.GetTypes().Where(t => t.IsSubclassOf(baseType));
+ foreach (var type in types)
+ {
+ var instance = value.Find(x => x.GetType() == type);
+ if (instance != null)
+ typeof(DatabaseHelper).GetMethod("SaveDatabaseType")?.MakeGenericMethod(type)
+ .Invoke(null, [instance]);
+ }
+ }
+
+ var t = (DateTime.Now - prev).TotalSeconds;
+ logger.Info(I18NManager.Translate("Server.ServerInfo.SaveDatabase",
+ Math.Round(t, 2).ToString(CultureInfo.InvariantCulture)));
+
+ ToSaveUidList.Clear();
+ }
+ catch (Exception e)
+ {
+ logger.Error("An error occurred while saving the database", e);
+ }
+
+ LastSaveTick = DateTime.UtcNow.Ticks;
+ }
+
+ // DO NOT DEL ReSharper save database from cache
+ public static void SaveDatabaseType(T instance) where T : BaseDatabaseDataHelper, new()
+ {
+ try
+ {
+ sqlSugarScope?.Updateable(instance).ExecuteCommand();
+ }
+ catch (Exception e)
+ {
+ logger.Error("An error occurred while saving the database", e);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Common/Database/Inventory/InventoryData.cs b/Common/Database/Inventory/InventoryData.cs
new file mode 100644
index 0000000..8de8dfc
--- /dev/null
+++ b/Common/Database/Inventory/InventoryData.cs
@@ -0,0 +1,75 @@
+using KianaBH.Proto;
+using SqlSugar;
+using static System.Runtime.InteropServices.JavaScript.JSType;
+
+namespace KianaBH.Database.Inventory;
+
+[SugarTable("InventoryData")]
+public class InventoryData : BaseDatabaseDataHelper
+{
+ [SugarColumn(IsJson = true)] public List MaterialItems { get; set; } = [];
+
+ [SugarColumn(IsJson = true)] public List WeaponItems { get; set; } = [];
+
+ [SugarColumn(IsJson = true)] public List StigmataItems { get; set; } = [];
+
+ public int NextUniqueId { get; set; } = 100;
+}
+
+public class ItemData
+{
+ public int UniqueId { get; set; }
+ public int ItemId { get; set; }
+ public int SubItemId { get; set; }
+ public int Count { get; set; }
+ public int Level { get; set; }
+ public int Exp { get; set; }
+ public bool Locked { get; set; }
+ public bool AffixIdentify { get; set; }
+ public uint CancelLockedTime { get; set; }
+ public bool Extracted { get; set; }
+ public int SlotNum { get; set; }
+ public int Refine { get; set; }
+ public int Promote { get; set; }
+ public int Homology { get; set; }
+ public List QuantumBranchLists { get; set; } = [];
+ public List RuneLists { get; set; } = [];
+ public List WaitSelectRuneLists { get; set; } = [];
+ public List WaitSelectRuneGroupLists { get; set; } = [];
+ public int EquipAvatar { get; set; }
+
+
+ public Material ToMaterialProto()
+ {
+ return new Material
+ {
+ Id = (uint)ItemId,
+ Num = (uint)Count
+ };
+ }
+
+ public Weapon ToWeaponProto()
+ {
+ return new Weapon
+ {
+ Id = (uint)ItemId,
+ UniqueId = (uint)UniqueId,
+ Level = (uint)Level,
+ Exp = (uint)Exp,
+ IsProtected = Locked,
+ IsExtracted = Extracted,
+ };
+ }
+}
+
+public class RuneGroup
+{
+ public int UniqueId { get; set; }
+ public List RuneLists { get; set; } = [];
+}
+
+public class Rune
+{
+ public int RuneId { get; set; }
+ public int Strength { get; set; }
+}
diff --git a/Common/Database/Lineup/LineupData.cs b/Common/Database/Lineup/LineupData.cs
new file mode 100644
index 0000000..46caae9
--- /dev/null
+++ b/Common/Database/Lineup/LineupData.cs
@@ -0,0 +1,19 @@
+using SqlSugar;
+
+namespace KianaBH.Database.Lineup;
+
+[SugarTable("Lineup")]
+public class LineupData : BaseDatabaseDataHelper
+{
+ [SugarColumn(IsJson = true)] public Dictionary Lineups { get; set; } = [];
+}
+
+public class LineupInfo
+{
+ public uint Id { get; set; }
+ public string? Name { get; set; }
+ public uint AstraMateId { get; set; }
+ public bool IsUsingAstraMate { get; set; }
+ public List AvatarIds { get; set; } = [];
+ public List ElfIds { get; set; } = [];
+}
\ No newline at end of file
diff --git a/Common/Database/Player/GuideData.cs b/Common/Database/Player/GuideData.cs
new file mode 100644
index 0000000..5bfff84
--- /dev/null
+++ b/Common/Database/Player/GuideData.cs
@@ -0,0 +1,9 @@
+using SqlSugar;
+
+namespace KianaBH.Database.Player;
+
+[SugarTable("player_guide")]
+public class GuideData : BaseDatabaseDataHelper
+{
+ [SugarColumn(IsJson = true)] public List GuideFinishList { get; set; } = [];
+}
\ No newline at end of file
diff --git a/Common/Database/Player/PlayerData.cs b/Common/Database/Player/PlayerData.cs
new file mode 100644
index 0000000..0c483d1
--- /dev/null
+++ b/Common/Database/Player/PlayerData.cs
@@ -0,0 +1,73 @@
+using System.Drawing;
+using KianaBH.Proto;
+using KianaBH.Util;
+using KianaBH.Util.Extensions;
+using SqlSugar;
+
+namespace KianaBH.Database.Player;
+
+[SugarTable("Player")]
+public class PlayerData : BaseDatabaseDataHelper
+{
+ public string? Name { get; set; } = "";
+ public string? Signature { get; set; } = "KianaPS";
+ public uint Level { get; set; } = 88;
+ public uint Exp { get; set; } = 0;
+ public uint HCoin { get; set; } = 0;
+ public uint Stamina { get; set; } = 240;
+ public uint HeadIcon { get; set; } = 161090;
+ public uint HeadFrame { get; set; } = 200001;
+ public uint WarshipId { get; set; } = 400004;
+ public uint PhonePendantId { get; set; } = 350005;
+ public uint AssistantAvatarId { get; set; } = 101;
+ public uint BirthDay { get; set; } = 0;
+ [SugarColumn(IsJson = true)] public WarshipAvatarData WarshipAvatar { get; set; } = new();
+ [SugarColumn(IsNullable = true)] public long LastActiveTime { get; set; }
+ public long RegisterTime { get; set; } = Extensions.GetUnixSec();
+
+ public static PlayerData? GetPlayerByUid(long uid)
+ {
+ var result = DatabaseHelper.GetInstance((int)uid);
+ return result;
+ }
+ public GetMainDataRsp ToProto()
+ {
+ return new GetMainDataRsp
+ {
+ IsAll = true,
+ AssistantAvatarId = 0,
+ Birthday = BirthDay,
+ Nickname = Name,
+ Level = Level,
+ Exp = Exp,
+ Hcoin = HCoin,
+ CustomHeadId = HeadIcon,
+ RegisterTime = (uint)RegisterTime,
+ WarshipAvatar = new Proto.WarshipAvatarData
+ {
+ WarshipFirstAvatarId = 0,
+ WarshipSecondAvatarId = 0,
+ },
+ SelfDesc = Signature,
+ UseFrameId = HeadFrame,
+ OnPhonePendantId = PhonePendantId,
+ Stamina = Stamina,
+ StaminaRecoverConfigTime = GameConstants.STAMINA_RECOVERY_TIME,
+ StaminaRecoverLeftTime = GameConstants.STAMINA_RECOVERY_TIME,
+ EquipmentSizeLimit = GameConstants.INVENTORY_MAX_EQUIPMENT,
+ TypeList = { Enumerable.Range(2, 38).Select(i => (uint)i) },
+ LevelLockId = 1,
+ WarshipTheme = new WarshipThemeData
+ {
+ WarshipId=0
+ },
+ TotalLoginDays = 1
+ };
+ }
+}
+
+public class WarshipAvatarData
+{
+ public uint FirstAvatarId { get; set; } = 101;
+ public uint SecondAvatarId { get; set; } = 0;
+}
\ No newline at end of file
diff --git a/Common/Enums/Item/ItemMainTypeEnum.cs b/Common/Enums/Item/ItemMainTypeEnum.cs
new file mode 100644
index 0000000..57fab53
--- /dev/null
+++ b/Common/Enums/Item/ItemMainTypeEnum.cs
@@ -0,0 +1,8 @@
+namespace KianaBH.Enums.Item;
+
+public enum ItemMainTypeEnum
+{
+ Material = 1,
+ Weapon = 2,
+ Stigmata = 3,
+}
\ No newline at end of file
diff --git a/Common/Enums/Language/ProgramLanguageTypeEnum.cs b/Common/Enums/Language/ProgramLanguageTypeEnum.cs
new file mode 100644
index 0000000..6bbf26c
--- /dev/null
+++ b/Common/Enums/Language/ProgramLanguageTypeEnum.cs
@@ -0,0 +1,9 @@
+namespace KianaBH.Enums.Language;
+
+public enum ProgramLanguageTypeEnum
+{
+ EN = 0,
+ CHS = 1,
+ CHT = 2,
+ JP = 3
+}
\ No newline at end of file
diff --git a/Common/Enums/Player/BanTypeEnum.cs b/Common/Enums/Player/BanTypeEnum.cs
new file mode 100644
index 0000000..4cad11e
--- /dev/null
+++ b/Common/Enums/Player/BanTypeEnum.cs
@@ -0,0 +1,13 @@
+namespace KianaBH.Enums.Player;
+
+public enum BanTypeEnum
+{
+ None = 0,
+ UseThirdPartySoftware = 1,
+ ThirdPartySoftware = 2,
+ AbnormalLogin = 4,
+ AbnormalAccount = 5,
+ ViolationTermsService = 6,
+ AccountRisk = 7,
+ Unknown = 8
+}
\ No newline at end of file
diff --git a/Common/Enums/Player/FriendEnum.cs b/Common/Enums/Player/FriendEnum.cs
new file mode 100644
index 0000000..919b9a9
--- /dev/null
+++ b/Common/Enums/Player/FriendEnum.cs
@@ -0,0 +1,7 @@
+namespace KianaBH.Enums.Player;
+
+public enum ServerEnum
+{
+ Console = 0,
+ Chat = 1
+}
\ No newline at end of file
diff --git a/Common/Enums/Player/OperationEnum.cs b/Common/Enums/Player/OperationEnum.cs
new file mode 100644
index 0000000..f2a7e48
--- /dev/null
+++ b/Common/Enums/Player/OperationEnum.cs
@@ -0,0 +1,9 @@
+namespace KianaBH.Enums.Player;
+
+public enum OperationEnum
+{
+ And = 0,
+ Or = 1,
+ Not = 2,
+ Unknow = 3
+}
\ No newline at end of file
diff --git a/Common/Enums/Player/PermEnum.cs b/Common/Enums/Player/PermEnum.cs
new file mode 100644
index 0000000..4453de8
--- /dev/null
+++ b/Common/Enums/Player/PermEnum.cs
@@ -0,0 +1,9 @@
+namespace KianaBH.Enums.Player;
+
+public enum PermEnum
+{
+ Trial = 0,
+ Support = 1,
+ Admin = 2,
+ Other = 10
+}
\ No newline at end of file
diff --git a/Common/Enums/Player/PlayerStatusEnum.cs b/Common/Enums/Player/PlayerStatusEnum.cs
new file mode 100644
index 0000000..2ce79c5
--- /dev/null
+++ b/Common/Enums/Player/PlayerStatusEnum.cs
@@ -0,0 +1,13 @@
+namespace KianaBH.Enums.Player;
+
+public enum PlayerStatusEnum
+{
+ Offline = 0,
+ Explore = 1,
+}
+
+public enum PlayerSubStatusEnum
+{
+ None = 0,
+ Battle = 1
+}
\ No newline at end of file
diff --git a/Common/Enums/Player/RegionEnum.cs b/Common/Enums/Player/RegionEnum.cs
new file mode 100644
index 0000000..d9722e3
--- /dev/null
+++ b/Common/Enums/Player/RegionEnum.cs
@@ -0,0 +1,29 @@
+namespace KianaBH.Enums.Player;
+
+public enum BaseRegionEnum
+{
+ None = 0,
+ CN = 11,
+ OS = 2
+}
+
+public enum RegionEnum
+{
+ PRODCN = 0,
+ SANDBOXCN = 1,
+ PRODOVERSEA = 2,
+ SANDBOXOVERSEA = 3,
+ PRODCNPRE = 4,
+ PRODOVERSEAPRE = 5,
+ TESTCN = 6,
+ TESTOVERSEA = 7,
+ PETCN = 8,
+ BETACN = 9,
+ BETACNPRE = 10,
+ BETAOVERSEA = 11,
+ PETOS = 12,
+ HOTFIXCN = 19,
+ HOTFIXOVERSEA = 20,
+ UNKNOWN = 21,
+ UNKNOWN2 = 22,
+}
\ No newline at end of file
diff --git a/Common/Internationalization/I18nManager.cs b/Common/Internationalization/I18nManager.cs
new file mode 100644
index 0000000..2bdc84b
--- /dev/null
+++ b/Common/Internationalization/I18nManager.cs
@@ -0,0 +1,102 @@
+using KianaBH.Enums.Language;
+using KianaBH.Internationalization.Message;
+using KianaBH.Util;
+using System.Reflection;
+
+namespace KianaBH.Internationalization;
+
+public static class I18NManager
+{
+ public static Logger Logger = new("I18nManager");
+
+ public static object Language { get; set; } = new LanguageEN();
+ public static Dictionary> PluginLanguages { get; } = [];
+
+ public static void LoadLanguage()
+ {
+ var languageStr = "KianaBH.Internationalization.Message.Language" +
+ ConfigManager.Config.ServerOption.Language;
+ var languageType = Type.GetType(languageStr);
+ if (languageType == null)
+ {
+ Logger.Warn("Language not found, fallback to EN");
+ // fallback to English
+ languageType = Type.GetType("KianaBH.Internationalization.Message.LanguageEN")!;
+ }
+
+ var language = Activator.CreateInstance(languageType) ?? throw new Exception("Language not found");
+ Language = language;
+
+ Logger.Info(Translate("Server.ServerInfo.LoadedItem", Translate("Word.Language")));
+ }
+
+ public static void LoadPluginLanguage(Dictionary> pluginAssemblies)
+ {
+ foreach (var (pluginName, types) in pluginAssemblies)
+ {
+ var languageType = types.FindAll(x => x.GetCustomAttribute() != null);
+ if (languageType.Count == 0) // no language to use
+ continue;
+
+ PluginLanguages.Add(pluginName, []);
+ foreach (var type in languageType)
+ {
+ var attr = type.GetCustomAttribute();
+ if (attr == null) continue;
+
+ var language = Activator.CreateInstance(type);
+ if (language == null) continue;
+ PluginLanguages[pluginName].Add(attr.LanguageType, language);
+ }
+ }
+ }
+
+ public static string Translate(string key, params string[] args)
+ {
+ var pluginLangs = PluginLanguages.Values;
+ var langs = (from pluginLang in pluginLangs
+ from o in pluginLang
+ where o.Key == Enum.Parse(ConfigManager.Config.ServerOption.Language)
+ select o.Value).ToList(); // get all plugin languages
+ langs.Add(Language); // add server language
+
+ var result = langs.Select(lang => GetNestedPropertyValue(lang, key)).OfType().FirstOrDefault() ?? key;
+
+ var index = 0;
+
+ return args.Aggregate(result, (current, arg) => current.Replace("{" + index++ + "}", arg));
+ }
+
+ public static string TranslateAsCertainLang(string langStr, string key, params string[] args)
+ {
+ var languageStr = "KianaBH.Internationalization.Message.Language" +
+ langStr;
+ var languageType = Type.GetType(languageStr) ??
+ Type.GetType("KianaBH.Internationalization.Message.LanguageEN")!;
+ var language = Activator.CreateInstance(languageType) ?? throw new Exception("Language not found");
+
+ List