From 8c53541d7f130fb21e8c15e7b043b3b23ce41e8b Mon Sep 17 00:00:00 2001 From: rfi Date: Tue, 10 Oct 2023 16:56:08 +0700 Subject: [PATCH] working tcp (kinda), send still brokey --- AscNet.Common/AscNet.Common.csproj | 1 + AscNet.Common/MsgPack/Types.cs | 2103 +++++++++++++++++++ AscNet.GameServer/Handlers/AccountModule.cs | 22 + AscNet.GameServer/Packet.cs | 49 +- AscNet.GameServer/Session.cs | 105 +- AscNet/AscNet.csproj | 1 + AscNet/Program.cs | 8 +- 7 files changed, 2279 insertions(+), 10 deletions(-) create mode 100644 AscNet.Common/MsgPack/Types.cs create mode 100644 AscNet.GameServer/Handlers/AccountModule.cs diff --git a/AscNet.Common/AscNet.Common.csproj b/AscNet.Common/AscNet.Common.csproj index f3cf9a7..5cbfb65 100644 --- a/AscNet.Common/AscNet.Common.csproj +++ b/AscNet.Common/AscNet.Common.csproj @@ -8,6 +8,7 @@ + diff --git a/AscNet.Common/MsgPack/Types.cs b/AscNet.Common/MsgPack/Types.cs new file mode 100644 index 0000000..e6954b1 --- /dev/null +++ b/AscNet.Common/MsgPack/Types.cs @@ -0,0 +1,2103 @@ +#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. +namespace AscNet.Common.MsgPack +{ + [global::MessagePack.MessagePackObject(true)] + public class HandshakeRequest + { + public String Sha1 { get; set; } + public String DocumentVersion { get; set; } + public String ApplicationVersion { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class HandshakeResponse + { + public Byte Code { get; set; } + public Byte UtcOpenTime { get; set; } + public dynamic? Sha1Table { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class LoginRequest + { + public Byte LoginType { get; set; } + public String ServerBean { get; set; } + public Byte LoginPlatform { get; set; } + public String ClientVersion { get; set; } + public String DeviceId { get; set; } + public String UserId { get; set; } + public String Token { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class LoginResponse + { + public Byte Code { get; set; } + public Byte UtcOffset { get; set; } + public UInt32 UtcServerTime { get; set; } + public String ReconnectToken { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyDailyLotteryData + { + public dynamic[] Lotteries { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyLogin + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginPlayerData + { + public UInt32 Id { get; set; } + public String Name { get; set; } + public Byte Level { get; set; } + public String Sign { get; set; } + public UInt32 DisplayCharId { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginPlayerDataBirthday + { + public Byte Mon { get; set; } + public Byte Day { get; set; } + } + + public NotifyLoginPlayerDataBirthday Birthday { get; set; } + public Byte HonorLevel { get; set; } + public String ServerId { get; set; } + public Byte Likes { get; set; } + public Byte CurrTeamId { get; set; } + public Byte ChallengeEventId { get; set; } + public UInt32 CurrHeadPortraitId { get; set; } + public Byte CurrHeadFrameId { get; set; } + public Byte CurrMedalId { get; set; } + public Byte AppearanceShowType { get; set; } + public Byte DailyReceiveGiftCount { get; set; } + public Byte DailyActivenessRewardStatus { get; set; } + public Byte WeeklyActivenessRewardStatus { get; set; } + public Byte[] Marks { get; set; } + public UInt32[] GuideData { get; set; } + public Byte[] Communications { get; set; } + public dynamic[] ShowCharacters { get; set; } + public dynamic[] ShieldFuncList { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginPlayerDataAppearanceSettingInfo + { + public Byte TitleType { get; set; } + public Byte CharacterType { get; set; } + public Byte FashionType { get; set; } + public Byte WeaponFashionType { get; set; } + public Byte DormitoryType { get; set; } + public Byte DormitoryId { get; set; } + } + + public NotifyLoginPlayerDataAppearanceSettingInfo AppearanceSettingInfo { get; set; } + public UInt32 CreateTime { get; set; } + public UInt32 LastLoginTime { get; set; } + public Byte ReportTime { get; set; } + public UInt32 ChangeNameTime { get; set; } + public Byte Flags { get; set; } + } + + public NotifyLoginPlayerData PlayerData { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginTimeLimitCtrlConfigList + { + public Byte Id { get; set; } + public UInt32 StartTime { get; set; } + public UInt32 EndTime { get; set; } + } + + public NotifyLoginTimeLimitCtrlConfigList[] TimeLimitCtrlConfigList { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginSharePlatformConfigList + { + public Byte Id { get; set; } + public Byte[] SdkId { get; set; } + } + + public NotifyLoginSharePlatformConfigList[] SharePlatformConfigList { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginItemList + { + public Byte Id { get; set; } + public UInt32 Count { get; set; } + public Byte BuyTimes { get; set; } + public Byte TotalBuyTimes { get; set; } + public Byte LastBuyTime { get; set; } + public UInt32 RefreshTime { get; set; } + public UInt32 CreateTime { get; set; } + } + + public NotifyLoginItemList[] ItemList { get; set; } + public Dictionary ItemRecycleDict { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginCharacterList + { + public UInt32 Id { get; set; } + public Byte Level { get; set; } + public Byte Exp { get; set; } + public Byte Quality { get; set; } + public Byte InitQuality { get; set; } + public Byte Star { get; set; } + public Byte Grade { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginCharacterListSkillList + { + public UInt32 Id { get; set; } + public Byte Level { get; set; } + } + + public NotifyLoginCharacterListSkillList[] SkillList { get; set; } + public dynamic[] EnhanceSkillList { get; set; } + public UInt32 FashionId { get; set; } + public UInt32 CreateTime { get; set; } + public Byte TrustLv { get; set; } + public Byte TrustExp { get; set; } + public UInt16 Ability { get; set; } + public Byte LiberateLv { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginCharacterListCharacterHeadInfo + { + public Byte HeadFashionId { get; set; } + public Byte HeadFashionType { get; set; } + } + + public NotifyLoginCharacterListCharacterHeadInfo CharacterHeadInfo { get; set; } + } + + public NotifyLoginCharacterList[] CharacterList { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginEquipList + { + public Byte Id { get; set; } + public UInt32 TemplateId { get; set; } + public UInt32 CharacterId { get; set; } + public Byte Level { get; set; } + public Byte Exp { get; set; } + public Byte Breakthrough { get; set; } + public dynamic[] ResonanceInfo { get; set; } + public dynamic[] UnconfirmedResonanceInfo { get; set; } + public dynamic[] AwakeSlotList { get; set; } + public Boolean IsLock { get; set; } + public UInt32 CreateTime { get; set; } + public Boolean IsRecycle { get; set; } + } + + public NotifyLoginEquipList[] EquipList { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginFashionList + { + public UInt32 Id { get; set; } + public Boolean IsLock { get; set; } + } + + public NotifyLoginFashionList[] FashionList { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginHeadPortraitList + { + public UInt32 Id { get; set; } + public Byte LeftCount { get; set; } + public UInt32 BeginTime { get; set; } + } + + public NotifyLoginHeadPortraitList[] HeadPortraitList { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginBaseEquipLoginData + { + public dynamic[] BaseEquipList { get; set; } + public dynamic[] DressedList { get; set; } + } + + public NotifyLoginBaseEquipLoginData BaseEquipLoginData { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginFubenData + { + public Dictionary StageData { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginFubenDataFubenBaseData + { + public Byte RefreshTime { get; set; } + public Byte SelectedCharId { get; set; } + public Byte UrgentAlarmCount { get; set; } + public Byte WeeklyUrgentCount { get; set; } + public dynamic? DayUrgentCount { get; set; } + } + + public NotifyLoginFubenDataFubenBaseData FubenBaseData { get; set; } + public dynamic[] UnlockHideStages { get; set; } + public dynamic[] StageDifficulties { get; set; } + } + + public NotifyLoginFubenData FubenData { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginFubenMainLineData + { + public UInt32[] TreasureData { get; set; } + public Dictionary LastPassStage { get; set; } + public dynamic[] MainChapterEventInfos { get; set; } + } + + public NotifyLoginFubenMainLineData FubenMainLineData { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginFubenChapterExtraLoginData + { + public dynamic[] TreasureData { get; set; } + public dynamic[] LastPassStage { get; set; } + public dynamic[] ChapterEventInfos { get; set; } + } + + public NotifyLoginFubenChapterExtraLoginData FubenChapterExtraLoginData { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginFubenUrgentEventData + { + public dynamic? UrgentEventData { get; set; } + } + + public NotifyLoginFubenUrgentEventData FubenUrgentEventData { get; set; } + public dynamic[] AutoFightRecords { get; set; } + public Dictionary TeamGroupData { get; set; } + public dynamic? TeamPrefabData { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginSignInf + { + public Byte Id { get; set; } + public Byte Round { get; set; } + public Byte Day { get; set; } + public Boolean Got { get; set; } + public Byte FinishDay { get; set; } + } + + public NotifyLoginSignInf[] SignInfos { get; set; } + public dynamic[] AssignChapterRecord { get; set; } + public dynamic[] WeaponFashionList { get; set; } + public dynamic[] PartnerList { get; set; } + public dynamic[] ShieldedProtocolList { get; set; } + public dynamic? LimitedLoginData { get; set; } + public UInt32 UseBackgroundId { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyLoginFubenShortStoryLoginData + { + public dynamic[] TreasureData { get; set; } + public dynamic[] LastPassStage { get; set; } + public dynamic[] ChapterEventInfos { get; set; } + } + + public NotifyLoginFubenShortStoryLoginData FubenShortStoryLoginData { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyPayInfo + { + public Single TotalPayMoney { get; set; } + public Boolean IsGetFirstPayReward { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyEquipChipGroupList + { + public dynamic[] ChipGroupDataList { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyEquipChipAutoRecycleSite + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyEquipChipAutoRecycleSiteChipRecycleSite + { + public Byte[] RecycleStar { get; set; } + public Byte Days { get; set; } + public Byte SetRecycleTime { get; set; } + } + + public NotifyEquipChipAutoRecycleSiteChipRecycleSite ChipRecycleSite { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyEquipGuideData + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyEquipGuideDataEquipGuideData + { + public Byte TargetId { get; set; } + public dynamic[] PutOnPosList { get; set; } + public dynamic[] FinishedTargets { get; set; } + } + + public NotifyEquipGuideDataEquipGuideData EquipGuideData { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyArchiveLoginData + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyArchiveLoginDataMonste + { + public UInt16 Id { get; set; } + public Byte Killed { get; set; } + } + + public NotifyArchiveLoginDataMonste[] Monsters { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyArchiveLoginDataEqui + { + public UInt32 Id { get; set; } + public Byte Level { get; set; } + public Byte Breakthrough { get; set; } + public Byte ResonanceCount { get; set; } + } + + public NotifyArchiveLoginDataEqui[] Equips { get; set; } + public dynamic[] MonsterUnlockIds { get; set; } + public dynamic[] WeaponUnlockIds { get; set; } + public dynamic[] AwarenessUnlockIds { get; set; } + public dynamic[] MonsterSettings { get; set; } + public dynamic[] WeaponSettings { get; set; } + public dynamic[] AwarenessSettings { get; set; } + public dynamic[] MonsterInfos { get; set; } + public dynamic[] MonsterSkills { get; set; } + public UInt32[] UnlockCgs { get; set; } + public dynamic[] UnlockStoryDetails { get; set; } + public dynamic[] PartnerUnlockIds { get; set; } + public dynamic[] PartnerSettings { get; set; } + public UInt32[] UnlockPvDetails { get; set; } + public dynamic[] UnlockMails { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyChatLoginData + { + public UInt32 RefreshTime { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyChatLoginDataUnlockEmoj + { + public UInt32 Id { get; set; } + public Byte EndTime { get; set; } + } + + public NotifyChatLoginDataUnlockEmoj[] UnlockEmojis { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifySocialData + { + public dynamic[] FriendData { get; set; } + public dynamic[] ApplyData { get; set; } + public dynamic[] Remarks { get; set; } + public dynamic[] BlockData { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyTaskData + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyTaskDataTaskData + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyTaskDataTaskDataTas + { + public UInt16 Id { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyTaskDataTaskDataTasSchedule + { + public UInt16 Id { get; set; } + public Byte Value { get; set; } + } + + public NotifyTaskDataTaskDataTasSchedule[] Schedule { get; set; } + public Byte State { get; set; } + public UInt32 RecordTime { get; set; } + public Byte ActivityId { get; set; } + } + + public NotifyTaskDataTaskDataTas[] Tasks { get; set; } + public UInt32[] Course { get; set; } + public Byte[] FinishedTasks { get; set; } + public Byte[] NewPlayerRewardRecord { get; set; } + public dynamic[] TaskLimitIdActiveInfos { get; set; } + public dynamic[] NewbieRecvProgress { get; set; } + public Boolean NewbieHonorReward { get; set; } + public Byte NewbieUnlockPeriod { get; set; } + } + + public NotifyTaskDataTaskData TaskData { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyActivenessStatus + { + public Byte DailyActivenessRewardStatus { get; set; } + public Byte WeeklyActivenessRewardStatus { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyNewPlayerTaskStatus + { + public UInt16 NewPlayerTaskActiveDay { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyRegression2Data + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyRegression2DataData + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyRegression2DataDataActivityData + { + public Byte Id { get; set; } + public Byte BeginTime { get; set; } + public Byte State { get; set; } + } + + public NotifyRegression2DataDataActivityData ActivityData { get; set; } + public dynamic? SignInData { get; set; } + public dynamic? InviteData { get; set; } + public dynamic[] GachaDatas { get; set; } + } + + public NotifyRegression2DataData Data { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyMaintainerActionData + { + public Byte Id { get; set; } + public UInt32 ResetTime { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyMaintainerActionDataNod + { + public Byte NodeId { get; set; } + public Byte NodeType { get; set; } + public Byte EventId { get; set; } + public String Value { get; set; } + } + + public NotifyMaintainerActionDataNod[] Nodes { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyMaintainerActionDataPlaye + { + public UInt32 PlayerId { get; set; } + public String PlayerName { get; set; } + public UInt32 HeadPortraitId { get; set; } + public Byte HeadFrameId { get; set; } + public Byte NodeId { get; set; } + public Boolean IsNodeTriggered { get; set; } + public Boolean Reverse { get; set; } + } + + public NotifyMaintainerActionDataPlaye[] Players { get; set; } + public Byte[] Cards { get; set; } + public Byte FightWinCount { get; set; } + public Byte BoxCount { get; set; } + public Byte UsedActionCount { get; set; } + public Byte ExtraActionCount { get; set; } + public Boolean HasWarehouseNode { get; set; } + public Byte WarehouseFinishCount { get; set; } + public Boolean HasMentorNode { get; set; } + public Byte MentorStatus { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyAllRedEnvelope + { + public dynamic[] Envelopes { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyScoreTitleData + { + public dynamic[] TitleInfos { get; set; } + public dynamic[] HideTypes { get; set; } + public Boolean IsHideCollection { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyScoreTitleDataWallInf + { + public Byte Id { get; set; } + public UInt16 PedestalId { get; set; } + public UInt16 BackgroundId { get; set; } + public Boolean IsShow { get; set; } + public dynamic[] CollectionSetInfos { get; set; } + } + + public NotifyScoreTitleDataWallInf[] WallInfos { get; set; } + public UInt16[] UnlockedDecorationIds { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyBfrtData + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyBfrtDataBfrtData + { + public dynamic[] BfrtGroupRecords { get; set; } + public dynamic[] BfrtTeamInfos { get; set; } + } + + public NotifyBfrtDataBfrtData BfrtData { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyTask + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyTaskTasks + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyTaskTasksTas + { + public UInt16 Id { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyTaskTasksTasSchedule + { + public UInt16 Id { get; set; } + public Byte Value { get; set; } + } + + public NotifyTaskTasksTasSchedule[] Schedule { get; set; } + public Byte State { get; set; } + public UInt32 RecordTime { get; set; } + public Byte ActivityId { get; set; } + } + + public NotifyTaskTasksTas[] Tasks { get; set; } + } + + public NotifyTaskTasks Tasks { get; set; } + public dynamic? TaskLimitIdActiveInfos { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyGuildEvent + { + public Byte Type { get; set; } + public UInt32 Value { get; set; } + public Byte Value2 { get; set; } + public dynamic? Str1 { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyAssistData + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyAssistDataAssistData + { + public UInt32 AssistCharacterId { get; set; } + } + + public NotifyAssistDataAssistData AssistData { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyWorkNextRefreshTime + { + public UInt32 NextRefreshTime { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyDormitoryData + { + public dynamic[] FurnitureCreateList { get; set; } + public dynamic[] WorkList { get; set; } + public UInt32[] FurnitureUnlockList { get; set; } + public Byte SnapshotTimes { get; set; } + public dynamic[] DormitoryList { get; set; } + public dynamic[] VisitorList { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyDormitoryDataFurnitureList + { + public Byte Id { get; set; } + public UInt32 ConfigId { get; set; } + public Byte X { get; set; } + public Byte Y { get; set; } + public Byte Angle { get; set; } + public Byte DormitoryId { get; set; } + public UInt16 Addition { get; set; } + public Byte[] AttrList { get; set; } + public Boolean IsLocked { get; set; } + } + + public NotifyDormitoryDataFurnitureList[] FurnitureList { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyDormitoryDataCharacterList + { + public UInt32 CharacterId { get; set; } + public SByte DormitoryId { get; set; } + public Byte Mood { get; set; } + public Byte Vitality { get; set; } + public Byte MoodSpeed { get; set; } + public Byte VitalitySpeed { get; set; } + public UInt32 LastFondleRecoveryTime { get; set; } + public Byte LeftFondleCount { get; set; } + public dynamic[] EventList { get; set; } + } + + public NotifyDormitoryDataCharacterList[] CharacterList { get; set; } + public dynamic[] Layouts { get; set; } + public dynamic[] BindRelations { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyNameplateLoginData + { + public Byte CurrentWearNameplate { get; set; } + public dynamic[] UnlockNameplates { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyGuildDormPlayerData + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyGuildDormPlayerDataGuildDormData + { + public Byte CurrentCharacterId { get; set; } + public Byte DailyInteractRewardTotalTimes { get; set; } + public Byte DailyInteractRewardCurTimes { get; set; } + } + + public NotifyGuildDormPlayerDataGuildDormData GuildDormData { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyBountyTaskInfo + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyBountyTaskInfoTaskInfo + { + public Byte RankLevel { get; set; } + public dynamic[] TaskCards { get; set; } + public Byte TaskPoolRefreshCount { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyBountyTaskInfoTaskInfoTaskPool + { + public Byte Id { get; set; } + public UInt32 StageId { get; set; } + public UInt16 RewardId { get; set; } + public UInt16 EventId { get; set; } + public UInt32 DifficultStageId { get; set; } + public Byte Status { get; set; } + } + + public NotifyBountyTaskInfoTaskInfoTaskPool[] TaskPool { get; set; } + } + + public NotifyBountyTaskInfoTaskInfo TaskInfo { get; set; } + public UInt32 RefreshTime { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyFiveTwentyRecord + { + public dynamic[] CharacterIds { get; set; } + public dynamic[] GroupRecord { get; set; } + public Byte ActivityNo { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class PurchaseDailyNotify + { + public dynamic[] ExpireInfoList { get; set; } + public dynamic[] DailyRewardInfoList { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class PurchaseDailyNotifyFreeRewardInfoList + { + public UInt32 Id { get; set; } + public String Name { get; set; } + } + + public PurchaseDailyNotifyFreeRewardInfoList[] FreeRewardInfoList { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyPurchaseRecommendConfig + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyPurchaseRecommendConfigData + { + public Dictionary AddOrModifyConfigs { get; set; } + public dynamic? RemoveIds { get; set; } + } + + public NotifyPurchaseRecommendConfigData Data { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyBackgroundLoginData + { + public UInt32[] HaveBackgroundIds { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyMedalData + { + public dynamic[] MedalInfos { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyExploreData + { + public dynamic[] ChapterDatas { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyGatherRewardList + { + public Byte[] GatherRewards { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyDrawTicketData + { + public dynamic[] DrawTicketInfos { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyAccumulatedPayData + { + public Byte PayId { get; set; } + public Single PayMoney { get; set; } + public dynamic[] PayRewardIds { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyArenaActivity + { + public Byte ActivityNo { get; set; } + public Byte ChallengeId { get; set; } + public Byte Status { get; set; } + public UInt32 NextStatusTime { get; set; } + public Byte ArenaLevel { get; set; } + public Byte JoinActivity { get; set; } + public Byte UnlockCount { get; set; } + public UInt32 TeamTime { get; set; } + public UInt32 FightTime { get; set; } + public UInt32 ResultTime { get; set; } + public dynamic[] MaxPointStageList { get; set; } + public Byte ContributeScore { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyPrequelUnlockChallengeStages + { + public dynamic[] UnlockChallengeStages { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyPrequelChallengeRefreshTime + { + public UInt32 NextRefreshTime { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyFubenPrequelData + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyFubenPrequelDataFubenPrequelData + { + public dynamic[] RewardedStages { get; set; } + public dynamic[] UnlockChallengeStages { get; set; } + } + + public NotifyFubenPrequelDataFubenPrequelData FubenPrequelData { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyMainLineActivity + { + public UInt16[] Chapters { get; set; } + public Byte BfrtChapter { get; set; } + public UInt32 EndTime { get; set; } + public Byte HideChapterBeginTime { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyDailyFubenLoginData + { + public UInt32 RefreshTime { get; set; } + public dynamic[] Records { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyBirthdayPlot + { + public UInt16 NextActiveYear { get; set; } + public Byte IsChange { get; set; } + public dynamic[] UnLockCg { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyBossActivityData + { + public Byte ActivityId { get; set; } + public Byte SectionId { get; set; } + public Byte Schedule { get; set; } + public dynamic[] StageStarInfos { get; set; } + public dynamic[] StarRewardIds { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyBriefStoryData + { + public dynamic[] FinishedIds { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyChessPursuitGroupInfo + { + public dynamic[] MapDBList { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyChessPursuitGroupInfoMapBossList + { + public Byte Id { get; set; } + public Byte InitHp { get; set; } + public Byte SubBossMaxHp { get; set; } + public Byte BossStepMin { get; set; } + public Byte BossStepMax { get; set; } + public Single BattleHurtRate { get; set; } + public Byte BattleHurtMax { get; set; } + public Byte SelfHpRate { get; set; } + public Byte SelfHpMax { get; set; } + public Byte ConvertHurtRate { get; set; } + } + + public NotifyChessPursuitGroupInfoMapBossList[] MapBossList { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyClickClearData + { + public dynamic[] Activities { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyCourseData + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyCourseDataData + { + public Byte TotalLessonPoint { get; set; } + public Byte MaxTotalLessonPoint { get; set; } + public dynamic[] ChapterDataList { get; set; } + public dynamic? StageDataDict { get; set; } + public dynamic[] RewardIds { get; set; } + } + + public NotifyCourseDataData Data { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyActivityDrawList + { + public UInt16[] DrawIdList { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyActivityDrawGroupCount + { + public Byte Count { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyExperimentData + { + public dynamic[] FinishIds { get; set; } + public dynamic[] ExperimentInfos { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyBabelTowerActivityStatus + { + public Byte ActivityNo { get; set; } + public Byte Status { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyBabelTowerData + { + public Byte ActivityNo { get; set; } + public Byte MaxScore { get; set; } + public Byte RankLevel { get; set; } + public dynamic[] StageDatas { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyBabelTowerDataExtraData + { + public Byte ActivityNo { get; set; } + public Byte MaxScore { get; set; } + public Byte RankLevel { get; set; } + public dynamic[] StageDatas { get; set; } + } + + public NotifyBabelTowerDataExtraData ExtraData { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyFubenBossSingleData + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyFubenBossSingleDataFubenBossSingleData + { + public Byte ActivityNo { get; set; } + public Byte TotalScore { get; set; } + public Byte MaxScore { get; set; } + public Byte OldLevelType { get; set; } + public Byte LevelType { get; set; } + public Byte ChallengeCount { get; set; } + public UInt32 RemainTime { get; set; } + public Byte AutoFightCount { get; set; } + public dynamic? CharacterPoints { get; set; } + public dynamic[] HistoryList { get; set; } + public dynamic[] RewardIds { get; set; } + public Byte RankPlatform { get; set; } + public Byte[] BossList { get; set; } + public dynamic[] TrialStageInfoList { get; set; } + } + + public NotifyFubenBossSingleDataFubenBossSingleData FubenBossSingleData { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyFestivalData + { + public dynamic[] FestivalInfos { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyPracticeData + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyPracticeDataChapterInf + { + public Byte Id { get; set; } + public UInt32[] FinishStages { get; set; } + } + + public NotifyPracticeDataChapterInf[] ChapterInfos { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyTrialData + { + public Byte[] FinishTrial { get; set; } + public Byte[] RewardRecord { get; set; } + public dynamic[] TypeRewardRecord { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyPivotCombatData + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyPivotCombatDataPivotCombatData + { + public Byte ActivityId { get; set; } + public Byte Difficulty { get; set; } + public dynamic[] RegionDataList { get; set; } + } + + public NotifyPivotCombatDataPivotCombatData PivotCombatData { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifySettingLoadingOption + { + public dynamic? LoadingData { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyRepeatChallengeData + { + public Byte Id { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyRepeatChallengeDataExpInfo + { + public Byte Level { get; set; } + public Byte Exp { get; set; } + } + + public NotifyRepeatChallengeDataExpInfo ExpInfo { get; set; } + public dynamic[] RcChapters { get; set; } + public dynamic[] RewardIds { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyPlayerReportData + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyPlayerReportDataReportData + { + public Byte ReportTimes { get; set; } + public Byte LastReportTime { get; set; } + } + + public NotifyPlayerReportDataReportData ReportData { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyReviewConfig + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyReviewConfigReviewActivityConfigList + { + public Byte Id { get; set; } + public UInt32 StartTime { get; set; } + public UInt32 EndTime { get; set; } + public UInt16 RewardId { get; set; } + } + + public NotifyReviewConfigReviewActivityConfigList[] ReviewActivityConfigList { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyStrongholdLoginData + { + public Byte Id { get; set; } + public UInt32 BeginTime { get; set; } + public UInt32 FightBeginTime { get; set; } + public Byte CurDay { get; set; } + public Byte AssistCharacterId { get; set; } + public Byte SetAssistCharacterTime { get; set; } + public Byte BorrowCount { get; set; } + public UInt16 ElectricEnergy { get; set; } + public Byte Endurance { get; set; } + public Byte MineralLeft { get; set; } + public Byte TotalMineral { get; set; } + public dynamic[] ElectricCharacterIds { get; set; } + public dynamic[] FinishGroupIds { get; set; } + public dynamic[] FinishGroupInfos { get; set; } + public dynamic[] HistoryFinishGroupInfos { get; set; } + public dynamic[] GroupInfos { get; set; } + public dynamic[] TeamInfos { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyStrongholdLoginDataGroupStageDat + { + public Byte Id { get; set; } + public UInt32[] StageIds { get; set; } + public Dictionary StageBuffId { get; set; } + public Byte SupportId { get; set; } + } + + public NotifyStrongholdLoginDataGroupStageDat[] GroupStageDatas { get; set; } + public Byte[] RuneList { get; set; } + public dynamic[] RewardIds { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyStrongholdLoginDataLastResultRecord + { + public Byte Id { get; set; } + public Byte FinishCount { get; set; } + public Byte MinerCount { get; set; } + public Byte MineralCount { get; set; } + public Byte AssistCount { get; set; } + public Byte AssistRewardValue { get; set; } + } + + public NotifyStrongholdLoginDataLastResultRecord LastResultRecord { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyStrongholdLoginDataMineRecor + { + public Byte Day { get; set; } + public Byte MinerCount { get; set; } + public Byte MineralCount { get; set; } + public Boolean IsStay { get; set; } + } + + public NotifyStrongholdLoginDataMineRecor[] MineRecords { get; set; } + public Byte LevelId { get; set; } + public dynamic[] StayDays { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifySummerSignInData + { + public Byte ActId { get; set; } + public dynamic[] MsgIdList { get; set; } + public Byte SurplusTimes { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyTaikoMasterData + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyTaikoMasterDataTaikoMasterData + { + public Byte ActivityId { get; set; } + public dynamic[] StageDataList { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyTaikoMasterDataTaikoMasterDataSetting + { + public Byte AppearOffset { get; set; } + public Byte JudgeOffset { get; set; } + } + + public NotifyTaikoMasterDataTaikoMasterDataSetting Setting { get; set; } + } + + public NotifyTaikoMasterDataTaikoMasterData TaikoMasterData { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyTeachingActivityInfo + { + public dynamic[] ActivityInfo { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyTheatreData + { + public Byte CurChapterId { get; set; } + public Byte CurRoleLv { get; set; } + public Byte DifficultyId { get; set; } + public Byte KeepsakeId { get; set; } + public dynamic[] UnlockPowerIds { get; set; } + public dynamic[] UnlockPowerFavorIds { get; set; } + public dynamic[] EffectPowerFavorIds { get; set; } + public dynamic[] Skills { get; set; } + public dynamic[] RecruitRole { get; set; } + public dynamic[] Keepsakes { get; set; } + public dynamic[] Decorations { get; set; } + public dynamic? CurChapterDb { get; set; } + public Byte ReopenCount { get; set; } + public dynamic[] SkillIllustratedBook { get; set; } + public dynamic? SingleTeamData { get; set; } + public dynamic[] MultiTeamDatas { get; set; } + public Byte UseOwnCharacter { get; set; } + public Byte FavorCoin { get; set; } + public Byte DecorationCoin { get; set; } + public dynamic[] PassChapterId { get; set; } + public dynamic? PassEventRecord { get; set; } + public Byte PassNodeCount { get; set; } + public dynamic[] EndingRecord { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyVoteData + { + public dynamic[] VoteAlarmDic { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyTRPGData + { + public UInt16 CurTargetLink { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyTRPGDataBaseInfo + { + public Byte Level { get; set; } + public Byte Exp { get; set; } + public Byte Endurance { get; set; } + } + + public NotifyTRPGDataBaseInfo BaseInfo { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyTRPGDataBossInfo + { + public Byte Id { get; set; } + public Byte ChallengeCount { get; set; } + public dynamic[] PhasesRewardList { get; set; } + } + + public NotifyTRPGDataBossInfo BossInfo { get; set; } + public dynamic[] TargetList { get; set; } + public dynamic[] RewardList { get; set; } + public dynamic[] FuncList { get; set; } + public dynamic[] Characters { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyTRPGDataShopInf + { + public Byte DisCount { get; set; } + public Byte AddBuyCount { get; set; } + public UInt32 Id { get; set; } + public dynamic[] ItemInfos { get; set; } + } + + public NotifyTRPGDataShopInf[] ShopInfos { get; set; } + public dynamic[] MazeInfos { get; set; } + public dynamic[] MemoirList { get; set; } + public Byte ItemCapacityAdd { get; set; } + public Boolean IsNormalPage { get; set; } + public dynamic[] StageList { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyBiancaTheatreActivityData + { + public Byte CurActivityId { get; set; } + public Byte CurChapterId { get; set; } + public Byte DifficultyId { get; set; } + public Byte CurTeamId { get; set; } + public dynamic? CurChapterDb { get; set; } + public dynamic[] Characters { get; set; } + public dynamic[] Items { get; set; } + public Byte TotalExp { get; set; } + public dynamic[] GetRewardIds { get; set; } + public dynamic[] StrengthenDbs { get; set; } + public dynamic? SingleTeamData { get; set; } + public dynamic[] UnlockItemId { get; set; } + public dynamic[] UnlockTeamId { get; set; } + public dynamic[] UnlockDifficultyId { get; set; } + public dynamic[] TeamRecords { get; set; } + public dynamic[] PassChapterIds { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyMentorData + { + public Byte PlayerType { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyMentorDataTeacher + { + public Byte PlayerId { get; set; } + public dynamic? PlayerName { get; set; } + public Byte Level { get; set; } + public Byte HeadPortraitId { get; set; } + public Byte HeadFrameId { get; set; } + public Boolean IsGraduate { get; set; } + public dynamic? Tag { get; set; } + public dynamic? OnlineTag { get; set; } + public dynamic? Announcement { get; set; } + public Byte StudentCount { get; set; } + public dynamic? StudentTask { get; set; } + public Boolean IsOnline { get; set; } + public dynamic? SystemTask { get; set; } + public dynamic? WeeklyTask { get; set; } + public Byte KizunaAmount { get; set; } + public Byte JoinTime { get; set; } + public Byte ReachTime { get; set; } + public Byte LastLoginTime { get; set; } + public Byte SendGiftCount { get; set; } + } + + public NotifyMentorDataTeacher Teacher { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyMentorDataStuden + { + public UInt32 PlayerId { get; set; } + public String PlayerName { get; set; } + public Byte Level { get; set; } + public UInt32 HeadPortraitId { get; set; } + public Byte HeadFrameId { get; set; } + public Boolean IsGraduate { get; set; } + public dynamic? Tag { get; set; } + public dynamic? OnlineTag { get; set; } + public dynamic? Announcement { get; set; } + public Byte StudentCount { get; set; } + public dynamic[] StudentTask { get; set; } + public Boolean IsOnline { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyMentorDataStudenSystemTask + { + public UInt16 TaskId { get; set; } + public Byte State { get; set; } + public dynamic[] Schedule { get; set; } + public Byte Status { get; set; } + public Byte RewardId { get; set; } + public dynamic[] EquipList { get; set; } + public Boolean HasChange { get; set; } + } + + public NotifyMentorDataStudenSystemTask[] SystemTask { get; set; } + public dynamic[] WeeklyTask { get; set; } + public Byte KizunaAmount { get; set; } + public Byte JoinTime { get; set; } + public Byte ReachTime { get; set; } + public Byte LastLoginTime { get; set; } + public Byte SendGiftCount { get; set; } + } + + public NotifyMentorDataStuden[] Students { get; set; } + public dynamic[] ApplyList { get; set; } + public Byte GraduateStudentCount { get; set; } + public dynamic[] StageReward { get; set; } + public dynamic[] WeeklyTaskReward { get; set; } + public Byte WeeklyTaskCompleteCount { get; set; } + public Byte[] Tag { get; set; } + public Byte[] OnlineTag { get; set; } + public String Announcement { get; set; } + public Byte DailyChangeTaskCount { get; set; } + public Byte WeeklyLevel { get; set; } + public Byte MonthlyStudentCount { get; set; } + public dynamic? Message { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyMentorChat + { + public dynamic[] ChatMessages { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyMaintainerActionDailyReset + { + public Byte UsedActionCount { get; set; } + public Byte ExtraActionCount { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyGuildData + { + public Byte GuildId { get; set; } + public String GuildName { get; set; } + public Byte GuildLevel { get; set; } + public Byte IconId { get; set; } + public Byte GuildRankLevel { get; set; } + public Byte HasContributeReward { get; set; } + public Boolean HasRecruit { get; set; } + public Byte BossEndTime { get; set; } + public Byte FreeChangeGuildNameCount { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyMails + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyMailsNewMailList + { + public String Id { get; set; } + public Byte GroupId { get; set; } + public dynamic? BatchId { get; set; } + public Byte Type { get; set; } + public Byte Status { get; set; } + public String SendName { get; set; } + public String Title { get; set; } + public String Content { get; set; } + public UInt32 CreateTime { get; set; } + public UInt32 SendTime { get; set; } + public UInt32 ExpireTime { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyMailsNewMailListRewardGoodsList + { + public Byte RewardType { get; set; } + public UInt32 TemplateId { get; set; } + public Byte Count { get; set; } + public Byte Level { get; set; } + public Byte Quality { get; set; } + public Byte Grade { get; set; } + public Byte Breakthrough { get; set; } + public Byte ConvertFrom { get; set; } + public Byte Id { get; set; } + } + + public NotifyMailsNewMailListRewardGoodsList[] RewardGoodsList { get; set; } + public Boolean IsForbidDelete { get; set; } + } + + public NotifyMailsNewMailList[] NewMailList { get; set; } + public dynamic? ExpireIdList { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class EnterWorldChatResponse + { + public Byte Code { get; set; } + public Byte ChannelId { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class GetWorldChannelInfoResponse + { + public Byte Code { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class GetWorldChannelInfoResponseChannelInf + { + public Byte ChannelId { get; set; } + public Byte PlayerNum { get; set; } + } + + public GetWorldChannelInfoResponseChannelInf[] ChannelInfos { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class HeartbeatResponse + { + public UInt32 UtcServerTime { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class GetPurchaseListRequest + { + public Byte[] UiTypeList { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class GetPurchaseListResponse + { + public Byte Code { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class GetPurchaseListResponsePurchaseInfoList + { + public UInt32 Id { get; set; } + public Byte TimeToInvalid { get; set; } + public Byte TimeToShelve { get; set; } + public Byte TimeToUnShelve { get; set; } + public Byte BuyTimes { get; set; } + public Byte BuyLimitTimes { get; set; } + public Byte ConsumeId { get; set; } + public Byte ConsumeCount { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class GetPurchaseListResponsePurchaseInfoListRewardGoodsList + { + public Byte RewardType { get; set; } + public Byte TemplateId { get; set; } + public UInt16 Count { get; set; } + public Byte Level { get; set; } + public Byte Quality { get; set; } + public Byte Grade { get; set; } + public Byte Breakthrough { get; set; } + public Byte ConvertFrom { get; set; } + public UInt32 Id { get; set; } + } + + public GetPurchaseListResponsePurchaseInfoListRewardGoodsList[] RewardGoodsList { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class GetPurchaseListResponsePurchaseInfoListDailyRewardGoodsList + { + public Byte RewardType { get; set; } + public Byte TemplateId { get; set; } + public Byte Count { get; set; } + public Byte Level { get; set; } + public Byte Quality { get; set; } + public Byte Grade { get; set; } + public Byte Breakthrough { get; set; } + public Byte ConvertFrom { get; set; } + public UInt32 Id { get; set; } + } + + public GetPurchaseListResponsePurchaseInfoListDailyRewardGoodsList[] DailyRewardGoodsList { get; set; } + public dynamic? FirstRewardGoods { get; set; } + public dynamic? ExtraRewardGoods { get; set; } + public Byte DailyRewardRemainDay { get; set; } + public Boolean IsDailyRewardGet { get; set; } + public String Name { get; set; } + public String Desc { get; set; } + public String Icon { get; set; } + public Byte UiType { get; set; } + public Byte SignInId { get; set; } + public Byte Tag { get; set; } + public Byte Priority { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class GetPurchaseListResponsePurchaseInfoListClientResetInfo + { + public Byte ResetType { get; set; } + public Byte DayCount { get; set; } + } + + public GetPurchaseListResponsePurchaseInfoListClientResetInfo ClientResetInfo { get; set; } + public Boolean IsUseMail { get; set; } + public dynamic? NormalDiscounts { get; set; } + public dynamic? DiscountCouponInfos { get; set; } + public dynamic? DiscountShowStr { get; set; } + public Byte LastBuyTime { get; set; } + public Byte MailCount { get; set; } + public dynamic? PayKeySuffix { get; set; } + public UInt32[] MutexPurchaseIds { get; set; } + public Byte ConvertSwitch { get; set; } + public Boolean CanMultiply { get; set; } + public dynamic? FashionLabel { get; set; } + } + + public GetPurchaseListResponsePurchaseInfoList[] PurchaseInfoList { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class OfflineMessageRequest + { + public SByte MessageId { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class OfflineMessageResponse + { + public Byte Code { get; set; } + public dynamic? Messages { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class DoClientTaskEventRequest + { + public Byte ClientTaskType { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class DoClientTaskEventResponse + { + public Byte Code { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class SignInRequest + { + public Byte Id { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyItemDataList + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyItemDataListItemDataList + { + public UInt16 Id { get; set; } + public Byte Count { get; set; } + public Byte BuyTimes { get; set; } + public Byte TotalBuyTimes { get; set; } + public Byte LastBuyTime { get; set; } + public UInt32 RefreshTime { get; set; } + public UInt32 CreateTime { get; set; } + } + + public NotifyItemDataListItemDataList[] ItemDataList { get; set; } + public dynamic? ItemRecycleDict { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class SignInResponse + { + public Byte Code { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class SignInResponseRewardGoodsList + { + public Byte RewardType { get; set; } + public UInt16 TemplateId { get; set; } + public Byte Count { get; set; } + public Byte Level { get; set; } + public Byte Quality { get; set; } + public Byte Grade { get; set; } + public Byte Breakthrough { get; set; } + public Byte ConvertFrom { get; set; } + public UInt32 Id { get; set; } + } + + public SignInResponseRewardGoodsList[] RewardGoodsList { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyEquipDataList + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyEquipDataListEquipDataList + { + public UInt16 Id { get; set; } + public UInt32 TemplateId { get; set; } + public Byte CharacterId { get; set; } + public Byte Level { get; set; } + public Byte Exp { get; set; } + public Byte Breakthrough { get; set; } + public dynamic[] ResonanceInfo { get; set; } + public dynamic[] UnconfirmedResonanceInfo { get; set; } + public dynamic[] AwakeSlotList { get; set; } + public Boolean IsLock { get; set; } + public UInt32 CreateTime { get; set; } + public Boolean IsRecycle { get; set; } + } + + public NotifyEquipDataListEquipDataList[] EquipDataList { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class CharacterLevelUpRequest + { + public Dictionary UseItems { get; set; } + public UInt32 TemplateId { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class NotifyCharacterDataList + { + [global::MessagePack.MessagePackObject(true)] + public class NotifyCharacterDataListCharacterDataList + { + public UInt32 Id { get; set; } + public Byte Level { get; set; } + public Byte Exp { get; set; } + public Byte Quality { get; set; } + public Byte InitQuality { get; set; } + public Byte Star { get; set; } + public Byte Grade { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyCharacterDataListCharacterDataListSkillList + { + public UInt32 Id { get; set; } + public Byte Level { get; set; } + } + + public NotifyCharacterDataListCharacterDataListSkillList[] SkillList { get; set; } + public dynamic[] EnhanceSkillList { get; set; } + public UInt32 FashionId { get; set; } + public UInt32 CreateTime { get; set; } + public Byte TrustLv { get; set; } + public Byte TrustExp { get; set; } + public UInt16 Ability { get; set; } + public Byte LiberateLv { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class NotifyCharacterDataListCharacterDataListCharacterHeadInfo + { + public Byte HeadFashionId { get; set; } + public Byte HeadFashionType { get; set; } + } + + public NotifyCharacterDataListCharacterDataListCharacterHeadInfo CharacterHeadInfo { get; set; } + } + + public NotifyCharacterDataListCharacterDataList[] CharacterDataList { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class CharacterLevelUpResponse + { + public Byte Code { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class AreaDataResponse + { + public Byte Code { get; set; } + public Byte TotalPoint { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class AreaDataResponseAreaList + { + public Byte AreaId { get; set; } + public Byte Lock { get; set; } + public Byte Point { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class AreaDataResponseAreaListLordList + { + public UInt32 Id { get; set; } + public String Name { get; set; } + public UInt32 CurrHeadPortraitId { get; set; } + public Byte CurrHeadFrameId { get; set; } + public UInt32 Point { get; set; } + } + + public AreaDataResponseAreaListLordList[] LordList { get; set; } + public dynamic? StageInfos { get; set; } + } + + public AreaDataResponseAreaList[] AreaList { get; set; } + public UInt16 GroupFightEvent { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class Ping + { + public UInt64 UtcTime { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class Pong + { + public UInt64 UtcTime { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class TeamSetTeamRequest + { + [global::MessagePack.MessagePackObject(true)] + public class TeamSetTeamRequestTeamData + { + public Byte TeamId { get; set; } + public Byte CaptainPos { get; set; } + public Byte FirstFightPos { get; set; } + public String TeamName { get; set; } + public Dictionary TeamData { get; set; } + } + + public TeamSetTeamRequestTeamData TeamData { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class TeamSetTeamResponse + { + public Byte Code { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class PreFightRequest + { + [global::MessagePack.MessagePackObject(true)] + public class PreFightRequestPreFightData + { + public Byte ChallengeCount { get; set; } + public Boolean IsHasAssist { get; set; } + public Byte FirstFightPos { get; set; } + public UInt32[] CardIds { get; set; } + public Byte CaptainPos { get; set; } + public UInt32 StageId { get; set; } + } + + public PreFightRequestPreFightData PreFightData { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class PreFightResponse + { + public Byte Code { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class PreFightResponseFightData + { + public Boolean Online { get; set; } + public UInt32 FightId { get; set; } + public dynamic? RoomId { get; set; } + public Byte OnlineMode { get; set; } + public UInt32 Seed { get; set; } + public UInt32 StageId { get; set; } + public Byte RebootId { get; set; } + public UInt16 PassTimeLimit { get; set; } + public Byte StarsMark { get; set; } + public dynamic? MonsterLevel { get; set; } + public dynamic[] EventIds { get; set; } + public dynamic? FightEventsWithLevel { get; set; } + public dynamic[] NormalEventIds { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class PreFightResponseFightDataRoleData + { + public UInt32 Id { get; set; } + public Byte Camp { get; set; } + public String Name { get; set; } + public Boolean IsRobot { get; set; } + public Byte CaptainIndex { get; set; } + public Byte FirstFightPos { get; set; } + public Dictionary NpcData { get; set; } + public dynamic? CustomNpc { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class PreFightResponseFightDataRoleDataAssistNpcData + { + public UInt32 Id { get; set; } + public Byte Level { get; set; } + public String Name { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class PreFightResponseFightDataRoleDataAssistNpcDataNpcData + { + [global::MessagePack.MessagePackObject(true)] + public class PreFightResponseFightDataRoleDataAssistNpcDataNpcDataCharacter + { + public UInt32 Id { get; set; } + public Byte Level { get; set; } + public Byte Exp { get; set; } + public Byte Quality { get; set; } + public Byte InitQuality { get; set; } + public Byte Star { get; set; } + public Byte Grade { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class PreFightResponseFightDataRoleDataAssistNpcDataNpcDataCharacterSkillList + { + public UInt32 Id { get; set; } + public Byte Level { get; set; } + } + + public PreFightResponseFightDataRoleDataAssistNpcDataNpcDataCharacterSkillList[] SkillList { get; set; } + public dynamic[] EnhanceSkillList { get; set; } + public UInt32 FashionId { get; set; } + public UInt32 CreateTime { get; set; } + public Byte TrustLv { get; set; } + public Byte TrustExp { get; set; } + public Byte Ability { get; set; } + public Byte LiberateLv { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class PreFightResponseFightDataRoleDataAssistNpcDataNpcDataCharacterCharacterHeadInfo + { + public UInt32 HeadFashionId { get; set; } + public Byte HeadFashionType { get; set; } + } + + public PreFightResponseFightDataRoleDataAssistNpcDataNpcDataCharacterCharacterHeadInfo CharacterHeadInfo { get; set; } + } + + public PreFightResponseFightDataRoleDataAssistNpcDataNpcDataCharacter Character { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class PreFightResponseFightDataRoleDataAssistNpcDataNpcDataEqui + { + public Byte Id { get; set; } + public UInt32 TemplateId { get; set; } + public UInt32 CharacterId { get; set; } + public Byte Level { get; set; } + public Byte Exp { get; set; } + public Byte Breakthrough { get; set; } + public dynamic[] ResonanceInfo { get; set; } + public dynamic[] UnconfirmedResonanceInfo { get; set; } + public dynamic[] AwakeSlotList { get; set; } + public Boolean IsLock { get; set; } + public UInt32 CreateTime { get; set; } + public Boolean IsRecycle { get; set; } + } + + public PreFightResponseFightDataRoleDataAssistNpcDataNpcDataEqui[] Equips { get; set; } + public dynamic[] AttribGroupList { get; set; } + public dynamic? CharacterSkillPlus { get; set; } + public dynamic[] EquipSkillPlus { get; set; } + public Byte AttribReviseId { get; set; } + public dynamic[] EventIds { get; set; } + public dynamic? FightEventsWithLevel { get; set; } + public Byte WeaponFashionId { get; set; } + public dynamic? Partner { get; set; } + public Boolean IsRobot { get; set; } + public dynamic? AttrRateTable { get; set; } + } + + public PreFightResponseFightDataRoleDataAssistNpcDataNpcData NpcData { get; set; } + public Byte AssistType { get; set; } + public Byte RuleTemplateId { get; set; } + public String Sign { get; set; } + public UInt32 HeadPortraitId { get; set; } + public Byte HeadFrameId { get; set; } + } + + public PreFightResponseFightDataRoleDataAssistNpcData AssistNpcData { get; set; } + } + + public PreFightResponseFightDataRoleData[] RoleData { get; set; } + public Byte ReviseId { get; set; } + public Byte PlayerLevel { get; set; } + public dynamic? NpcGroupList { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class PreFightResponseFightDataFightControlData + { + public Byte MaxFight { get; set; } + public Byte MaxRecommendFight { get; set; } + public Byte MaxShowFight { get; set; } + public Byte AvgFight { get; set; } + public Byte AvgRecommendFight { get; set; } + public Byte AvgShowFight { get; set; } + } + + public PreFightResponseFightDataFightControlData FightControlData { get; set; } + public Boolean DisableJoystick { get; set; } + public Boolean Restartable { get; set; } + public Boolean DisableDeadEffect { get; set; } + public dynamic? CustomData { get; set; } + public dynamic? Records { get; set; } + public dynamic? StageParams { get; set; } + public dynamic? StStageDropData { get; set; } + } + + public PreFightResponseFightData FightData { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class FightSettleRequest + { + [global::MessagePack.MessagePackObject(true)] + public class FightSettleRequestResult + { + public Boolean IsWin { get; set; } + public Boolean IsForceExit { get; set; } + public UInt32 StageId { get; set; } + public Byte StageLevel { get; set; } + public UInt32 FightId { get; set; } + public Byte RebootCount { get; set; } + public Byte AddStars { get; set; } + public Byte StartFrame { get; set; } + public UInt16 SettleFrame { get; set; } + public Byte PauseFrame { get; set; } + public Byte ExSkillPauseFrame { get; set; } + public UInt32 SettleCode { get; set; } + public Byte DodgeTimes { get; set; } + public Byte NormalAttackTimes { get; set; } + public Byte ConsumeBallTimes { get; set; } + public Byte StuntSkillTimes { get; set; } + public Byte PauseTimes { get; set; } + public Byte HighestCombo { get; set; } + public Byte DamagedTimes { get; set; } + public Byte MatrixTimes { get; set; } + public UInt16 HighestDamage { get; set; } + public UInt32 TotalDamage { get; set; } + public UInt16 TotalDamaged { get; set; } + public UInt16 TotalCure { get; set; } + public UInt32[] PlayerIds { get; set; } + public dynamic[] PlayerData { get; set; } + public dynamic? IntToIntRecord { get; set; } + public dynamic? StringToIntRecord { get; set; } + public Dictionary Operations { get; set; } + public UInt32[] Codes { get; set; } + public Byte LeftTime { get; set; } + public Dictionary NpcHpInfo { get; set; } + public Dictionary NpcDpsTable { get; set; } + public dynamic[] EventSet { get; set; } + public Byte DeathTotalMyTeam { get; set; } + public Byte DeathTotalEnemy { get; set; } + public Dictionary DeathRecord { get; set; } + public dynamic[] GroupDropDatas { get; set; } + public dynamic? EpisodeFightResults { get; set; } + public dynamic? CustomData { get; set; } + } + + public FightSettleRequestResult Result { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class FightSettleResponse + { + public Byte Code { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class FightSettleResponseSettle + { + public Boolean IsWin { get; set; } + public UInt32 StageId { get; set; } + public Byte StarsMark { get; set; } + public dynamic? RewardGoodsList { get; set; } + public Byte LeftTime { get; set; } + public Dictionary NpcHpInfo { get; set; } + public Byte UrgentEnventId { get; set; } + public dynamic? ClientAssistInfo { get; set; } + public dynamic[] FlopRewardList { get; set; } + public dynamic? ArenaResult { get; set; } + public dynamic? MultiRewardGoodsList { get; set; } + public Byte ChallengeCount { get; set; } + public dynamic? UnionKillResult { get; set; } + public dynamic? InfestorBossFightResult { get; set; } + public dynamic? GuildBossFightResult { get; set; } + public dynamic? WorldBossFightResult { get; set; } + public dynamic? BossSingleFightResult { get; set; } + public dynamic? NieRBossFightResult { get; set; } + public dynamic? TRPGBossFightResult { get; set; } + public dynamic? ExpeditionFightResult { get; set; } + public dynamic? ChessPursuitResult { get; set; } + public dynamic? StrongholdFightResult { get; set; } + public dynamic? AreaWarFightResult { get; set; } + public dynamic? GuildWarFightResult { get; set; } + public dynamic? ReformFightResult { get; set; } + public dynamic? KillZoneStageResult { get; set; } + public dynamic? EpisodeFightResult { get; set; } + public dynamic? StTargetStageFightResult { get; set; } + public dynamic? StMapTierDataOperation { get; set; } + public dynamic? SimulateTrainFightResult { get; set; } + public dynamic? SuperSmashBrosBattleResult { get; set; } + public dynamic? SpecialTrainRankFightResult { get; set; } + public dynamic? DoubleTowerFightResult { get; set; } + public dynamic? TaikoMasterSettleResult { get; set; } + public dynamic? MultiDimFightResult { get; set; } + public dynamic? MoewarParkourSettleResult { get; set; } + public dynamic? SpecialTrainBreakthroughResult { get; set; } + public dynamic? TwoSideTowerSettleResult { get; set; } + public dynamic? BabelTowerSettleResult { get; set; } + } + + public FightSettleResponseSettle Settle { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class FinishTaskRequest + { + public UInt16 TaskId { get; set; } + } + + + [global::MessagePack.MessagePackObject(true)] + public class FinishTaskResponse + { + public Byte Code { get; set; } + [global::MessagePack.MessagePackObject(true)] + public class FinishTaskResponseRewardGoodsList + { + public Byte RewardType { get; set; } + public Byte TemplateId { get; set; } + public UInt16 Count { get; set; } + public Byte Level { get; set; } + public Byte Quality { get; set; } + public Byte Grade { get; set; } + public Byte Breakthrough { get; set; } + public Byte ConvertFrom { get; set; } + public UInt32 Id { get; set; } + } + + public FinishTaskResponseRewardGoodsList[] RewardGoodsList { get; set; } + } +} diff --git a/AscNet.GameServer/Handlers/AccountModule.cs b/AscNet.GameServer/Handlers/AccountModule.cs new file mode 100644 index 0000000..09cb9fb --- /dev/null +++ b/AscNet.GameServer/Handlers/AccountModule.cs @@ -0,0 +1,22 @@ +using AscNet.Common.MsgPack; +using MessagePack; + +namespace AscNet.GameServer.Handlers +{ + internal class AccountModule + { + [PacketHandler("HandshakeRequest")] + public static void HandshakeRequestHandler(Session session, byte[] packet) + { + HandshakeRequest request = MessagePackSerializer.Deserialize(packet); + HandshakeResponse response = new() + { + Code = 0, + UtcOpenTime = 0, + Sha1Table = null + }; + + session.SendResponse(response); + } + } +} diff --git a/AscNet.GameServer/Packet.cs b/AscNet.GameServer/Packet.cs index e00a159..8c81ddf 100644 --- a/AscNet.GameServer/Packet.cs +++ b/AscNet.GameServer/Packet.cs @@ -1,4 +1,6 @@ -using MessagePack; +using System.Reflection; +using AscNet.Common.Util; +using MessagePack; namespace AscNet.GameServer { @@ -73,4 +75,49 @@ namespace AscNet.GameServer } } #pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. + + [AttributeUsage(AttributeTargets.Method)] + public class PacketHandler : Attribute + { + public string Name { get; } + + public PacketHandler(string name) + { + Name = name; + } + } + + public delegate void PacketHandlerDelegate(Session session, byte[] packet); + + public static class PacketFactory + { + public static readonly Dictionary Handlers = new(); + static readonly Logger c = new("Factory", ConsoleColor.Yellow); + + public static void LoadPacketHandlers() + { + c.Log("Loading Packet Handlers..."); + + IEnumerable classes = from t in Assembly.GetExecutingAssembly().GetTypes() + select t; + + foreach (var method in classes.SelectMany(t => t.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic))) + { + var attr = method.GetCustomAttribute(false); + if (attr == null || Handlers.ContainsKey(attr.Name)) continue; + Handlers.Add(attr.Name, (PacketHandlerDelegate)Delegate.CreateDelegate(typeof(PacketHandlerDelegate), method)); +#if DEBUG + c.Log($"Loaded {method.Name}"); +#endif + } + + c.Log("Finished Loading Packet Handlers"); + } + + public static PacketHandlerDelegate? GetPacketHandler(string name) + { + Handlers.TryGetValue(name, out PacketHandlerDelegate? handler); + return handler; + } + } } diff --git a/AscNet.GameServer/Session.cs b/AscNet.GameServer/Session.cs index 64dd1a3..96b0e18 100644 --- a/AscNet.GameServer/Session.cs +++ b/AscNet.GameServer/Session.cs @@ -1,5 +1,8 @@ -using System.Net.Sockets; +using System.Buffers.Binary; +using System.Net.Mail; +using System.Net.Sockets; using AscNet.Common.Util; +using MessagePack; namespace AscNet.GameServer { @@ -9,7 +12,8 @@ namespace AscNet.GameServer public readonly TcpClient client; public readonly Logger c; private long lastPacketTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); - // private ushort packetNo = 0; + private ushort packetNo = 0; + private readonly MessagePackSerializerOptions lz4Options = MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4Block); public Session(string id, TcpClient tcpClient) { @@ -35,7 +39,55 @@ namespace AscNet.GameServer if (len > 0) { lastPacketTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + List packets = new(); + int readbytes = 0; + while (readbytes < len) + { + int packetLen = BinaryPrimitives.ReadInt32LittleEndian(msg.AsSpan()[readbytes..]); + readbytes += 4; + if (packetLen < 4) + break; + else + { + byte[] packet = GC.AllocateUninitializedArray(packetLen); + Array.Copy(msg, readbytes, packet, 0, packetLen); + readbytes += packetLen; + Crypto.HaruCrypt.Decrypt(packet); + + try + { + packets.Add(MessagePackSerializer.Deserialize(packet, lz4Options)); + } + catch (Exception) + { + c.Error("Failed to deserialize packet: " + BitConverter.ToString(packet).Replace("-", "")); + } + } + } + + foreach (var packet in packets) + { + switch (packet.Type) + { + case Packet.ContentType.Request: + Packet.Request request = MessagePackSerializer.Deserialize(packet.Content); + c.Log(request.Name); + PacketFactory.GetPacketHandler(request.Name)?.Invoke(this, request.Content); + break; + case Packet.ContentType.Push: + Packet.Push push = MessagePackSerializer.Deserialize(packet.Content); + c.Log(push.Name); + PacketFactory.GetPacketHandler(push.Name)?.Invoke(this, push.Content); + break; + case Packet.ContentType.Exception: + Packet.Exception exception = MessagePackSerializer.Deserialize(packet.Content); + c.Error($"Exception packet received: {exception.Code}, {exception.Message}"); + break; + default: + break; + } + } } } @@ -52,6 +104,55 @@ namespace AscNet.GameServer DisconnectProtocol(); } + public void SendPush(T push) + { + Packet.Push packet = new() + { + Name = typeof(T).Name, + Content = MessagePackSerializer.Serialize(push) + }; + + Send(new Packet() + { + No = packetNo, + Type = Packet.ContentType.Push, + Content = MessagePackSerializer.Serialize(packet) + }); + c.Log(packet.Name); + packetNo++; + } + + public void SendResponse(T response) + { + Packet.Response packet = new() + { + Id = 0, + Name = typeof(T).Name, + Content = MessagePackSerializer.Serialize(response) + }; + + Send(new Packet() + { + No = packetNo, + Type = Packet.ContentType.Response, + Content = MessagePackSerializer.Serialize(packet) + }); + c.Log(packet.Name); + packetNo++; + } + + private void Send(Packet packet) + { + byte[] serializedPacket = MessagePackSerializer.Serialize(packet, lz4Options); + byte[] sendBytes = GC.AllocateUninitializedArray(serializedPacket.Length + 4); + + BinaryPrimitives.WriteInt32LittleEndian(sendBytes, serializedPacket.Length); + Array.Copy(serializedPacket, 0, sendBytes, 4, serializedPacket.Length); + + Crypto.HaruCrypt.Encrypt(sendBytes); + client.GetStream().Write(sendBytes); + } + public void DisconnectProtocol() { if (Server.Instance.Sessions.GetValueOrDefault(id) is null) diff --git a/AscNet/AscNet.csproj b/AscNet/AscNet.csproj index cac4759..d190923 100644 --- a/AscNet/AscNet.csproj +++ b/AscNet/AscNet.csproj @@ -8,6 +8,7 @@ + diff --git a/AscNet/Program.cs b/AscNet/Program.cs index d37dc5e..4226837 100644 --- a/AscNet/Program.cs +++ b/AscNet/Program.cs @@ -1,7 +1,5 @@ using AscNet.Common.Util; using AscNet.GameServer; -using MessagePack; -using Newtonsoft.Json; namespace AscNet { @@ -10,11 +8,7 @@ namespace AscNet static void Main(string[] args) { Logger.c.Log("Starting..."); - - byte[] test = Miscs.HexStringToByteArray("c9000036a163d20000d083f163930202c5d07d92ab4e6f746966794c6f67696ec5d06dde0019aa506c6179657244617461de001da24964ce00fd0cdca44e616d65a3726669a54c6576656c1ca45369676ea0ad446973706c6179436861724964ce000fbb5ba8426972746864617982a34d6f6e0ba344617908aa486f6e6f723900f02601a85365727665724964a435303030a54c696b657300aa437572725465616d496401b04368616c6c656e67654576656e74496400b21e00c048656164506f7274726169749400448ab3d1af1800904672616d65496400ab1100504d6564616c3600f11c417070656172616e636553686f775479706500b54461696c795265636569766547696674436f756e7400bb1700ff0d4163746976656e65737352657761726453746174757300bc5765656b1e0006f0b5a54d61726b73dc003505cd28a1cd2841cd05ddcd0578cd0579cd057acd057bcd057c0166cd01f7cd01f9cccccd0191cd28a2cd28a6cd03e9cd03eacd0708cd28a4cd28abcd28aacd28a3cd28a9cd28a8cd0641cd2776cd28a769cd0321cd0322cd025ace0001aa91cd07d1cd06a5cd0515ce0001aa92cd03ebcd0516cd2855cd0517cd1770cd28c3cd28c0cd27dccd070ace0001a9c9ce0001aa2dce0001aaf5ce0001ab59ce0001abbdcd28c2a9477569646544617461dc002bce000186a1ce000186a20a00f7bea3cdc350cdc3b5cdc3b6cdc3b7cdc419cdc41acdc41bcdc47dcdc4e1cdc545cdc5aacdc5abcdc60dcdc670cdc671cdc673cdc6d5ce00030d41cdc6f3cdc739cdc79dcdc801cdc865cdc8c9cdc92dcdc9f5cdcabdcdcb21cdcb3fcdcb85cdcc4dcdccb1cdcd15cdcd79cdc991cdcf0dcdce41cdcfd1ce000445cbcdcd7aae436f6d6d756e69636174696f6e73dc001d65666768016902036f6a04056b6c060708096d0a0b700c6e0e0f101913ae53686f774368617261637465727390ae536869656c6446756e634c69737490b5fa01f002657474696e67496e666f86a95469746c6508022501ad3e00010f0081ab46617368696f6e0d0078b1576561706f6e1300a1ad446f726d69746f7279220015ab0f00f109496400aa43726561746554696d65ce60fa7d32ad4c6173744f03011300b0651fee6aaa5265706f72741000b200ae4368616e67654e616d3300c06463353ea5466c61677300b72100f0004c696d69744374726c436f6e666967d000c2dc023983a2496417a9537461460090ce5cc6cb20a7456e64320050ce61558a642100171a21004563c8ea702100407242fce42100181b2100357211a021004063844050210017182100455d4b6600210040709c908021001719210036601bc54200042100171c210045651bbbf04200406f2804a042001f1d210005406524f634210017492100445f9f9250420010001d00184d1d0025e17d1d0041ce60333ac2001863210025bf362100013e00187b1d002afbdb1d0027cc871e0049603c74d0790028cc881e002b3dc63c0018891e002b4ee93c00188a1e003a6edb285a00178b1e004a615591a81e00188c1e002b962b3c00188d1e002bcd8a1e0018c91e002b0f6496001fca1e000a1fcb1e000a1fcc1e000a1fcd1e000a1fce1e000938cd012d1f002a8ca3690137cd01f41f00365f308ea30240655166c423023fcd01f52300054260e24b44230017f62300446330eb80740143ce633a25460018f72300271e7623002327b0230017f823003f651a088c00002703782300355f24f6830152ce600578408c0017fe23003665123bd80331654c3cb70337cd01ff23003663feb177033165e136560337cd0258230036651281fd030546002702bc23003a619155690238cd03211f000c6a0238cd03221f00259f5e8400015a0338cd03231f000e3e0018241f000e3e0018251f0025a8990401035d0017261f003c62651f7c0017271f003564ec457504033e0017281f00356295a08401021f002725e61f0035644f47710241ce645730540437cd284b2300355fca08800051ce600e5014c60127277523003664e41623003265123ac6012f27762300053164ed97fb043fcd277723000632f6d1b4690008520209690006460017794600356509461001078c00177a2300094600062300082e053664e5bc010332650aa6470328277c460009230022113d24032f277d2300060546001f7e230006054600187f23002ff8318c000118802300260aff810132643cd2c70128278123000faf0003188223000fc701031883230009460005d20018d923000f4600031fda2300040295022627db1f0007570423112f050216dc1f000a610000ff0202280218dd230007150352ce64f58070230018de230026f58034044264febaf0230018df230027feba4b022307f5460017e02300366507f5460005af0027283d23003764ed972300220552fa0228283e230027eee86900052300183f23002ff03a460001184023002ff18b460001184123002ff2dd46000117a1230035629843310442ce62a6c44b0227290523003764f6d16900220e8ca4012f290623000f1807230027f8238c00054600180823002ff974690001180923002ffac6460001186923000891023364f974af00186a23000f690003186b230008460006af001fcd2300053364fc1769001fd723000f18d8230026e5aed20006460009630326e6ff18010623000963032fe8514600010767034fce64e9a2460001096b032feaf44600010f6b030705f50018ded20008020306af00096b03080203062300086b03090203052300282a31690009a40104fc05292a3a2300165cf50005fc052f2a3b230005056004282a3c23000f600402192af7030f600402192af7030f600402182af7030c600402a604182af7033f65112fd200011795af003665000cc70106f50018f923002713e178052238cace06282afa23000fac0902282afb2300272504ab062249ee3707282b0223000fac09022f2b03230006221a6a7805282b042300271a6ad2002223a41801182ba604376523a41801232cdf460008a60437652cdf4600233619460008a604376536194600233f54460008a60437653f54460023488e460008a6043765488e460004e70a282b5dd2002f4348230001185e23002724f669002233766004282b5f23002713d246002328ea2300176023004562cfe920ff0bb862d8dd1483a24964cd2b61230026d8dd160a4262e75d9423001862230027eb52230023f9d22300088f0e0f23000417c246000aff0b2249e01c07282bc32300351489c0af00426521b8848c0018c423002726fe230023342d230018c5230027397323002246a22300282c2523000f3b0102182c8b0b0f230004080d0f0ad20004ea01282ced69000f4803022f2cee230004022109262cef1f0007a90331473d341001262cf01f000b6100221d0db402282cf12300271d0d4b02232799230018f223002727992300233225230018f323002732252300233cb1230018f42300273cb1230004af00282d5123000f1001022f2d52230006221bbb6303282d532300087d11326524f68c00282d542300094003232e30460018552300272e30400323376b46001856230027376bd2002340a5460017b523000cfa0211d0a401182e4d120a7005222f82c701182e560e0ad20004ef03182e5a0e0a23002230d3ef03192ed70209f5000546001726af00002e0106630305460008ca0c0ad7022324f6af00187e460009cb0f231bbb8c0008ca0c0af500046506182eca0c0f420603282e816900093b0105460008ca0c0f69000408ca0c0f2300041f8469000f1f8523000f178623003662af0f7b043262afb81407182e7e133662b75637073262b7692911182e83130aea01314cbbb053022730d569000f42060200eb1608df0b3761e29bfe05210784ab0f00250017a24a00376219fa2500252c6e250018a32500273ee425002563cd250018a425002776432500259b2c250018a5250027ada2250025d28b250018a6250026e5012500356309ea250017a7250037631c602500254149250018a825002753bf2500256633250018a925002778a92500259d92250018aa250027b008250025d4f1250018ab250027e767250025f9db250017ac250036640c5125003564313a250018ad25002543b0250001160657ce00155cc7210045626ae4302617316273136b0200250019c8250016652c10406273bc404a02002500083e150a4a00217c4d0f0a00250017ca4a003661a1204a003161aaa115040025001fcb25000621c650170400250017cc250037626a1f4e0821a8154e0800250017c125003661a0699a0e3161de609a0e0025000852083761a201940025df6b03011fc34a00110856083762107994002538066f0017c54a0036624d646f0000c600044d011fc6250011083d0e3662ca5cde004462d397144a00083f163663a560fd073563c887970117cf6f00366310829400356342554a0017d025004662d7ee402b0221e02b561557ce00155cd12500356339617102094a0018d22500274d276f00217079ed06004a0018d32500268c8b050535639fef250018d42500278940de0025927abc0108e6040a2500259bb4030117d64a0036645df24a00336489734a0028205d1b150abe0332d5fd50720137205d294a003663abcd06023363d74eb9003f205d2a250006074a00182b250027ae2a940023efd8c20338205d2c250026d6434d01336409ad08043f205d2d250011173225000f131402004a00183325002609aee101336437d206023f205d342500111835250009191403c814004a0018362500263cd24d01046e1600250018372500274e3c940025743197011f382500111f3925001109cb0f273e6a6f002147a45a1c009400183d4a002747a49701254e3b9701183e250009b900234f47780328205dd10f0a7117235dc7ea0438205d404a00265dc70c04356460b06f0009cc132760b1b9002574316f0018424a00273d18b900257477e1011f4325000d28cd23e2024564db22342f043164e416260138cd232b460036b10080230021d5ea740328cd23de023664b8db3b0b3164d096310628cd23dc023764af5ab100056900182e690009230023b8db46001f8d23000623e30b23001f8e23000630b6f06cfe0338cd238f230036b6f06cd20022b8db0d0c282390230009d20032c02aec46001891230036c02aec460022c215300c282392230026c215760c3364c5704600189e230027c570460023c60a8c001893230027c60a5e0123c965d2001894230027c965d20023cb504600082c123764cb50460023d29f8c001896460027d29f8c0023d48ad2001897230027d48ad20023dbda8c001898230027dbda8c0005a401189923000bea0103af00189a2300098101055e01189b2300095e0105f500189c230009f50005d200189d23000fd2000318be230009af0005f50018bf230009af0005230018c0230009af00052300080a090aa40105230008e10f0a460021d9d0770928cd23e10f0a460004230018240f0f0a8e0322c75b46002824b9af0009f50004b1032f24ba23000401f60636cd24bb1f000715070405022624bc1f000b61000405022824bd230009560122c367280219249c0127c367d70223cdf3230018bf460027cdf3230023d87f2300099c0127d87f230004af0028251d46000f1001022f258123000f1fe523000622c21579012825e723000f7005022f25e823000f1fe923000631e31944c1042f25ea23000604d905282649230009f5000418012f264a23000604b6051926e00c27afa03504044b022926ae460008230022b4e67b042826af230027b4e6460022be21c7012826b0230027be21c70123c75b460018b1230027c75b460023d096460018b2230027d096460023d9d0460018b3230027d9d0460023e30b460018b4230027e30b460004f500191fc50727a666230022af5a7d07281f434600278c167d0722ae5dc701281f442300278a705a0705460008f50e0f23000408f30e0f23000408f10e3f6493f1af000118ac8c00279d2b1801058c00090d020f8c0003090d020f690003090d020f690003090d020f690003090d020f690003090d020f690002182005180a3b01229694950828200a18012796943b0122a271f70328200b230027a2713b0123ae4f4600180c230009d2000523001f6d2300060481012f20d123000f1fd223000402d9051720f50d07d90505840008ef0d0a100122914e1d031820ed0d3764914e10012297e563031920eb0d2797e51001239e7d460009751d279e7d460023a666230009751d09630305af0009751d095601239d2b9c011fda100104003502029c011921280d09d20023a909230009260d096e0205230009240d09280205230009220d279937f50005230009200d2f9bda23000109d40c278ab65e010428021921d20c092300228ffca4011921d00c278ffc460022993781011921ce0c09af0023a271460009070509fa0223abac460009070527abacd20005af0009540a0f2a05021921540a0f2300022823a0ea0109f106048209281b59230027817c8c00228a70b605281b5c230009a7102182dbcc1028cd1b171c37645c4ce60d0546001f6146000e281c2123002771aa8c002289657602181cca16376461d82300227ae4df02181cca160a2300237993460008ca1637646b12ea0105460008ca160a230005460009950809f50023744d690018ead200276040ce0605230018eb23002764353b01042300181dcc1937645de3af00045e01281d5746000923002261d87602181d7f280a1801226b12bc02191d0d0209180123744d4600185a690027744d8101237d874600185b2300277d87af002386c246000953022786c2460005d20008011e0f530203191d530209810105460008011e376465cc8c0005230008011e3f646f078c00011864d2002f7841460001186523000f480302281d672300265e9a5e1441646a7804c50a281d682300266d1bf014326478f8011e281d692300277b9b4600238779460009e60709b10303581428cd1e80283764671ef500227ed9bc02191e802827686ff5000523000980282f69c1460001098028095302054600187dd2002f6c6446000108b61b0aa40105460018df4600090d02226f07d2001917012a27311fee07225608c9041917cb072733b3f50023477a460009cb0727477aaf00225b4083041918b306272f79d403215c4b1a1329cd182a1107230002950826189fce0007a70005610016a31f000b84002250b486032818a423002750b4ca0004460028190123002740e2230022589dca002819022300274234ed00052300180323002f44d72300010808230a3301054600180546002f4a1d4600010808233f644cc0230001180746002f4f63230001180823002f520623000109030b2f438518010109030b0fd2000309030b2f4b6e46000109030b0faf0003180daf002f5357460001186e23002731102300046e022f196f2300062233b33002281970230009fa02223ceeb6052819712300273cee3b012346284600187223002746288c00234f634600187323000bf5000346001874230027589d460005d20018c9230007400343ce6438f9bc0218ca230009ef03225b4eef032819cb2300094600224234ef031819cd1a0f46000408cb1a0a23000458042819d06900273656d200048e03191a5416098c00047b04191a54160f230003182f69002730ca72080546001830230027321c9e04052300183123002f336d460001183223002f3610230001183323002f376269000109771609b60522671e8101180fce063763feb1690022116cea01270e1169003663df535e013263e88e4600280e12230026e0a5bc02062300181323002fe1f6460001181423002fe348460001181523002fe499460000180fa90f3663c53ce6073263d224d2002807e1460027a551460022b7c6230018270d0237632ffc8c00214a5af500084d0836600e50c81a406014e7d07008084b08275e0bde23315e13ca880608712c3660178ae21931601e22e51a176ba700005600053618002e00006300726ca953746172747b372720c5840021275c8400186d210027275c63002129ff210008de04376029ff21002130978400176f42000fc600021f7621000d1f7721000d089e24365e0c27c600315f87d7840017264200365f51c9a500315f76b3c600089703375f6c27210021bf364200174242003662d110ce013162f9eef1011843210026c39b4d033162e8cbef01083a133662cd1b33020421001845420027d6566300034200184621002edf9042001864210027cfbe210021eb6e8400176521004660090b04100287128b2083a249646621000fc600020887060a210003080108850608210001b10216725f00063709044201087906083a0050ce62faf9e49d0008b8330fdf000208360b095c3931603774420008cb0a366024b9e70131602df4e701167ea1004ece62c541a500087d263661ce8e6b023161d7c84a0227cc8043000f85000218ccba170a2200212e3ad40f27cc8244003661ca99a8003261dd0e66001f8622000e08b0120a66002136236600082409365c20bce823315e38fa0d01072209060901315e36571d00081c0908740301e801081609004e00056802315e6f07c000160ebf00075b002169c11d00160f1d0045ce5e3b9d6401015b0017101d00355f75621d0041ce5f8291990016112100065b00315f7e9c5b00086706365f0a985901315f8bcb2100086506096e38042100086306455e49d744db00315f10e9b608086106275f2b2202315f473d63001616a10046ce5f15797801315f3e03c200181e2100272a3ca50021892842001f1f21000401210116201d0007000103090508c311375f30d43e0121449a5b0008a4380a21002143499d0016235f0047ce62664664041278a129074e2a068000041d001f273e000d1f2821000d17292100375f55bec20003e301162a2100068000040002085f200a3e02032101085a093662562ece08316268e9e805085809376259170001215d0c420b08560937626252c705216646400b1634a10047ce626b8c4200216f81420008de15376274c742002178bb420008dc1537627e0142002181f642001837630009c600218347c60008d81508e70010006805071f0f064201043a001f3a5b000d183b2100092102034200183c21002978bbbe0001a606072823078000031d00183e3e00277b5e3e00218452e40518552100278453890721970e5f0049ce0020cec70609840124776a250018f5ca0537625a6988012163a3460148ce0020f5cd053762b01a900025c28f2500178a67093762e8cb4a0025f0b46f0008c63e3762f0b42500035b07006f00188c4a000f88080100250008b92236628acec81b4062f36544e201002500188e4a00092500036f08002500188f2500096f0025e385b90008bf223762d11e6f0021ecce5102004a00084a0c0a4109074a0018926f00099400074a00087f223662fc9172013563217b720108c01136631ae44d01356322cdb900189f6f0026e1d1b9000825001fa0250006212189f10500de0017a82500376333f09400254665940017a925003662fadedc0235634cfd94001faa250006254d0bbc0109740d2758da6f00256b4f6f0017b34a0037634faede0025748a6f0018b42500272a5494000725001fb52500071598940017bc25003662d0ca780334838cb825262ff5bd25001117c6250037637dc4de0025a2aede0018c72500274e5db90021a3b9080400970108a62c0a2500259c25b90018d04a0027b5236f0025c7986f0008c81c0b342b15a36f0018d24a0027b12f750225ba694a0018d3250026a3ba28013563b675970118d4250027afdd940025b9182500080d153763a7f42500074a00080f150f6f0006082c0a37637dd34d0107de0018d894000a250004372c3f20f5d925001108e21c0b6f00064a0018db4a000a720106250018dc250027da0d030125fef7720118dd250027ca4ade0025dcbec20318de250009a41025ec824a0008c5163763cb8de10125de02970108633a0f25000618e16f00094a0025d4c76f0018e2250027abf7c20334feb164c8051fe325000625ef33de0018e4250009030125fdb4090317e525003661f394de00356211e694000855363664116c7201356423e1250017ef4a0036640d784a00356416b2250018f025002727d62500252f785303098226271d4a25002526844a0018f24a00260d86280135641ffbde00086b4436623c16b90034624551bc0119f650172710294a00031a1858ce0020f6036f0009250003a81800250009541709f615253a4b6f0018054a002636569400047714004a001706250036715c2a9400347177d9e10127f60c250037646db54a0024dc73280128f60d2500262a874a0034648a70500217f69b0d0b2500034f1e00940008a30d36645df2530304c31a00250018106f00099400076f00181125000f271f01004a0008330d3764672cb90003921f00250018174a0009250024ae5d060217f61e0d47ce64b252b90003aa26004a0008260d3764b2434d0125cdf3bc0118226f00094a0025d73b9701082e0d0f4a000607320d47ce648ac5940003bd2500940018256f0009250003192d00250008e8120a4a0003422700250018274a00097620072b02182a250026c22494003465123a9d0318f64e0d0a250003c843006f0009af2d25eee84d01041a0a19f65917072100096b0008350d35651675460045ce651fb0930108390d3764f19ab500254c3cb500083d0d0a250003f93700b50008410d0f25000608450d36652504960204a83e004a0017394901376538cb940007250008550d0a5f392540a5be0308590d2765130f1635651bbb2500085d0d0aef392524f62801183d9400096f0003ab3900b90008690d376530d3720103393a00250008b723376533762500f02038cac4b75368617265506c6174666f726d436f6e6669674c697374dc001382a2496400a553646b4964950102030405110012231100309201020e0019140e0019170e0019010e0012020e0010903600120b0c00034400190e0e0019100e00190f0e0019180e0019460e00122e0e00016000125e0c0003600019450e00190d0e0012120e001094df00009a0022cc881100033b0012380e00011f0052a84974656d1a01212c87df00015551f506ce000c9ca7a842757954696d657300ad546f74616c0f0053ab4c6173740e009000ab526566726573682a005cce60fa7d32544f005700120257001f00530038120353001f1e530038120453002fccaf5400204f65222620fa0001120c54001f325300200f4d0105121153001f15530038121553001f63530038121653000fa60039120753001f2fa600222a800a9f0120800a990232cd753b55001f2755003a123c55001f175500231ba2aa0011a2aa00229cae55001f0755003852ce00016f3857000f9c03230fac000422c35055002fccfaad003b225f9158001f0157003832cdc35155000f020139121453000f9e04232a85b601022085b60102120d53000fa600232a8a045300208a04530023cd02f0050f5500232a8ba35500218ba355002f9cb1aa00290f55000422753d55001f08fa01220f5500042201f755001f0a550039229cb255001f0555003913029c061f025500222a8e4ea901218e4ea901220200aa000f4e03230f550005120555000faa003a2201f855000fa802230faa000352ce00015f9e57000f01013a229ca855001f13ab01222a9164ab01219164ab01229ca755000faa02232aa84c550020a84c5500121c53002fccc8a900222aaeca540020aeca540032cd9ca456001f0b5500231bf3550010f3550052ce0001637857000f0102232ab0fc570020b0fc570032cd01f555001f06ac00222ac7ba550020c7ba5500005602129f57000fac00230f5700070300080fad022148646334dbae0000100004ae0012afae000f5700232a38d757003138d787755e230177a00b0f05012148651fa7e4570000100000570032cd01f6ac000f0603214a651fa815550021a815550022c35555000faa000638cd0384f20c59ce651fa934f60c4b651fa8195b0011195b00220fa95b001f0161022039651fa8b60500100000550052ce00015f9257000f6305210047000bac00030d061f1a5500292aa936550020a936ac0032cd01f955000fb101232aee79550030ee79afaf0ec052656379636c6544696374820e0122ae91911643015faeab1c00018d0e536538bcf0ac1100017f0e1001240015af2e001aaf2e003a3225702e00a0ad436861726163746572210f4197de0010db02f40e0f9449a54c6576656c0ba34578704ca75175616c69747901ab496e69740d00f004a45374617200a5477261646503a9536b696c6c4500219882430032018ed54300016f1000100012da1000140120001bdf100012e4100005300012e510000530001be610001be9100013eb100085b0456e68616e636592002390a93f5f008800385ec235720100810ea1a754727573744c7601a809008045787000a7416269f200f501cd0158aa4c696265726174654c7601b12f014048656164b55f2082ad0a000560002700af0f00555479706500530122bb5ba000101c530134cd0113550118035501180355011604550113995501229385450014061000128a100001e2115bce0001938f10001294100005300012951000053000129610001404500012991000052000129b1000052000129a10000f65010c3a60499d65012f81426501092f06d56501361259a000100565011407630118016301110163011202b8021602630104b8022292bd43000478022b92c210001bc710001bcc10001bcd10001bce10001bd1100013d310000f53010c2a48d553012f833e5301082fccf5520134331009799f000052011f00520108030a041e015201239a8d43000365022b9a9210001b9710001b9c10001b9d10001b9e10001ba1100013a310000f52010b2963562d074f60fa8b8c5201091fb9520134320fbb5a9f001016520134cd014654011802a6021102a6021201a6020f09040112214500130354012293261000043e052b932b100012301000053000123110000530001232100004f602229335100005200012371000052000133610000f64010b3a604939b6022f8ba36401083fcd02dd65013522944aa000121965011fae650122228f394500040e052b8f3e100012431000041e05228f481000053000034607051000039500053000124d3000051000124f1000046501238f4e10000fd3060d1a9965012f8e4e6501092f03a465013523e26aa000006501051c040fc802070f1c0400239709430003c8022b970e10001b1310001b1810001b1910001b1a10001b1d1000131f10000f53010b3a61cf7553012fc7ba5301082fccfb52012c60a945717569703e09f002dc004b8ca2496402aa54656d706c617465d707452e6ad1ab7a0800110005a009027a01f009ac427265616b7468726f75676800ad5265736f6e616e6365a1085090b8556e631d1a4a726d65641a00a0ad4177616b65536c6f747a009a90a649734c6f636bc2f90053800aa94973620a10c29b0019099b003b2dfd759b0004e808017a03190a9b001f019b002c1bc39b001ba29b00190a9b003f2e72a59b0004101e3601191e9b001f029b004c1a0e9b002b1cb19b000fd101572b82213601190f9b003f2df5a19b00671b419b0019129b003b1f01819b0004ef090f07034f2b833e9b001a179b002c09519b0003ef0b10236c020a07031f036c022c0ba2032b86569b0019359b003b1ee2429b00041c0710149b00192807030f3d043c2b89599b0019399b003f2dfd719b00040fd1014f2b8a2b9b00193a9b002d2e72070303bd070f9b0060193d9b003a1f538936010ba40b0fd101492b8b8c3601193e9b00382ec0c29b0013006c070068020f97004b1ba397001f3f9700090040070fcd01560d9b0019409b00381f05693201071f0c100f36011f1e36015a19479b00382e6eb99b000fcd01561c8cd0041a489700284f7a9700003201036b0501d7070ad0040f72082d0b6b052b8c5868021a499b002fc4aa9b000401060629ccaace010f73082d0f9c000d1a4a9c002c24819c001f5a9f03552b8c5f370119539b00291f7e9b000f6902562b8e2c97001a54970019cc03060f9700571b349700195597000ec90104cd040fd0074f2b8e4e9b0019569b003b1ede5964020fd70a570d9b00195e9b002d2e99720b0f3601562b913f36011a5f9b002bc0c136010422120f6b084f2b91409b001a609b002824849b000f0303562b914397001a799700284b9197000003060fcc04562ba6e79b002acc809c002f72a49c00662ca8769c0019869c00291f57700b0fcf01562ca9d99800198e9800382e47a934010f9800562cad8098001a9198002f4f809800622caead98001a9298002f95ca9800741b9398001fc99800741a98980028286a980000300403330a01a512191497090f030f3c2caf38cc011a999c002f9d9a9c000401cf0a195a9c000fcf0a3c0e9c0019a89c00292dafd6100f9803562cafd7340119ab9800292e0168080f9800571ce598001aac9800287689cc010f9800681aad98002f72a39800631cf930011aaed8162f01609800622cb0fc980019b298002f2df9c801631cc25f0e2bccb598001f8a3001622cc32a300119b698003f2e20999800630c5c112bccb79800095c050f9003562cc45b300119c798003f2dfd743001622cc7ba980019c99800381f2c7998000de21b098c060f28073c0e9c0019ca9c003b2e99b49c000f260d570e9c0019cb9c000ec8160f9c006919d79c00382ebcd938010f0403562ccb316c021add9800284f7c98000f94155a2ccbe99c0019eb9c00382dfd739c000f3401561dcd980619ee98003f2e47aa9800622ccfc130011af098002f6eba9800622cd02698001af298002fbcda9800631ce498001af69800194f68050f6002562cd34998001af798001fc4880f630e980019fc9800292dab25190f3001571c5130011ffd9800841ffe9800731c5230011fff98008339cd010699003f3bb5292904622bd3d6310139cd010c99002f2da71b19630f9900001a0d99000f1b10642dd41732010a5b233f3c0731cb01620f9900001f0f3201731d193201191099000f3201660e9900191199003f2e4b94cb01631d353201191299003f1f0d399900604d646334de9900191399000f4917634664633728990010c3252839cd011499000f4a146346646338db990001be2839cd011599003f3c2e41cb0162089900033201191699000ff408634d646338f932010aeb263f2e4b9232016046651fa91e9900033201191832013f3be0219900622daa0b9900191999000ffd026346651fee8e990003fd02191a99000ffd02630a990023c3ab3d35078433345ec2358d2c02f834335ec238110012c311003360499d110013c211002a48d511003a63561511003a60493911003a5ec29911003461cf751100c1b048656164506f72747261691e2d1294803782895441a94c6566746c3762a9426567696e5a4a346334bf23001f4223000f1f4323000d3f8ab3d123000752b242617365332ea66f67696e4461746182ad1400c069737490ab4472657373656456016190a946756265270010849c482067653200a1de003cce0098bdf58ea713000083113098bdf52000a072734d61726b07a65061420020c3ae080000e5007873546f6461790010003174616cf9390110019000a553636f726500ac3c4704350059ce60fa7f7e41474a646334bf4147d0800aae426573745265636f72646a002038ae430007100010ab20008043617264496473932c1240490000ab24000b140000c40019f6d2001ff6d200412f81b2d2000c2b8221d2001b30d2001f30d2000001981c0fd6000001180000da0019f7da001ff7da00412f82c2da000c2b8323da001b49da001f49da002119f8da001ff8da00412f8358da000d1ba6da001b3bda001e3bda00009b01105905000fb80100001700021c0058ce0098be59e2002fbe59e200412f8491e2000c2b8511e2001b36e2001f36e20029195ae2001f5ae200412f8556e2000d1b98e2001b2be2001f2be20029195be2001f5be200412f87a0e2000c2b881fe2000f80030a199097021100210529be5cc700028e6e0ff3053c2f8837c7000d1b80c7001b2fa9011f2fa9012919bde2001fbda901412f890ee2000c2b8959e2000f6d033a19bee2001fbee200421fb8e2000d1bece2001b20c4011f20c4012919bfe2001fbfe200412f8a61e2000c2b8a9ee2001b27e2001f27e2002919c0e2001fc0e2001f1f027b090e2f8ce2e2000d1bfee2001b25e2001f2de2001f105afa06685bce0098e505e2002fe505e2001f0f5d0a0f2f8d38e2000c2b8da4e2001b2ce2001f2ce2000302c60009400501790a00dd00021c0000e2001906e200024d580f4c053c2f8f3ce2000c2b8fcae2001b1fe2001d1fe200164ac6000de200071c0000e2001907e2001f07c401412f9084e2000c2b90e4e2001b37e2001f37e200291908e2001f08e200412fa2fde2000c2ba348e2001b34e2001f34e200291969e20002fa6c0fa6023c2fa3eee2000c2ba458e2000fb9080a01e50d078a020fa6020d196ae2001f6ac401412fa48be2000d1bf8e2001b3cc4011f3cc401264601ca8735e200000e0006a90f2000a66c0f0ea90f1f01a90f1e29a527e20000110071aa437265617465e4104b60faa543e2001b14e2001f14e20026480098e56bb90f26e56be2000f8b103729a571e2000e8b102ba5ffe2000fb90f0f0fa60218196ce200021f700f88033c1fa6980a0d1ca67a0b1b3fc4011f3fc401264601c9ed4de200000e0006c4010fa602051b03a6021f03d4080e29d3c3c4010011000aa6022ba6b7c4011b09e2001f09e20026490098e5cda60216cde2000fa6023729a755e2000ea6022ba7b8e2001b45e2001f45e200264601c9edb1e200000e0006e2000fc401050f6a041f29a81ee2000011000ac4012ba84ce2001b22e2001f22e20026490098e5cec40116cee2000fc4013729a882e2000ec4012ba8fbe2001b40e2001f40e2002919cfe2001fcfe200411fa96a040d2ba97ce2000fb609373701c9ebe40f000e0006e2000fa6023729a9abc4010011000aa6022ba9c7e2001b12c4011f12c4012919d0a60216d0e2000fa602371fa9200e0d2baa57e2001b3de2001f3de2002727a800d4084f00a80035e2004129ac1ac4010e88031cac33141b6be2001f6be200291736c4013fa80036e200421fa7e2000d1beac4010fd4080a0f33140039a80037c70002c0630fb9083c2fad0cc7000c1cadb9081b6aa9011f6aa901291938e2001f38a901411faddc150d2bade7a9011b41e2001841e2000fa901021939c7001f39c700421ff0a9010c2bae6ec7001b73c7001873c7000fea0d1a4601c9ec21e200000e0006e2000ff8053729ae8ae2000011000af8052baeade2001b17e2001f17e200264700a8003af80536a8003ae2000ff8053729af79e2000e16052bafc8e2000fcc0e0a0e8b024601cad555c700000e0006c7000fa9013729b033c7000011000aa9012bb0a9c7001b24a9011f24a9012737990c15a90136990c15e2000fa9013729c1a4e2000ea9012bc258e2002bcc93e30028cc93e4000eab014900990c16c9001f16c900411fc2331f0d2bc32ac9001b61c8001861c7000f36041a4900990c17e2001f17e200412fc34dab010c2bc3a3e2000f611e0f0f5c101639990c18e2001f18e200421fdae2000c2bc45be2001b69c4011f69c401291979e2001f79e200412fc46ee2000c2bc506e2002bcc8be3002fcc8be40029197ae4001f7ae400412fc514e4000d1b94e4001b6ce3001f6ce200264601c9edb2e200000e0006e2000f1706051b0522121f0522120e29ca8ee2000011000a17062bc66be2001b1ce2000f32192839990c7b1706167be2000f17063729c724e2000e17062bc786e2001b4ee2001f4ec401264900990c7ce2001f7ce200412fc851e2000c2bc8bfe2001b5ce2001f5ce2002919dde2001fdde200421fefe2000c2bc954e2001b55e2001855e2000fd9070219dec7001fdec700412fc962c7000d1bdbc7001b60c7001860c7000fd9071d19dfe2001fdfe200411fcaf10c0d2bcb31e2001b23e2001f23e2002919e0e2001fe0e200412fcc0ac4010c2bcc44e2001b29e2001f29e2002737a82745e2003fa82745e200412fce75e2000c2bcee3e2001b54e2001f54e200291946e2001f46e200412fcf06e2000c2bcf4ee2001b39e2001839e2000f4f040039a82747c7001f47c700421f5ac7000d1bc1c7001b59c7001859c7000f4f041b39a82748e2001f48e200421fd8e2000c2bd026e2001b46e2001846e2000fa901021949c7001f49c700411ad07c0f0e83082bd075c7001b3ac7001f3ac7000e194ac7001f4ac700420f9d2e0d2bd0e4c7001b51c7001851c7000f70021a4601c9edb3e200000e0006e2000f0e0b051b040e0b1f040e0b0e29d29470020011000a0e0b2bd1e9e2001b16e2000f6c1b28389933250e0b263325e2001f07b820041b00e2000f04260d4964633652e200004c6b08e20000a0360be2000f8308383798bd91e2003f98bd91e2003f00d1000fe2000a0021000be2003bcd01a4c60138cd01a4aa026891ce000f9449582302120000c4001992d2000238860fef173a00b1000fd2001d2bccd2d1002fccd2d000151993d0001f93a201730fd0002411adcd3300ee335844617461854601f10e00ae53656c656374656443686172496400b0557267656e74416c61726da3338274b15765656b6c7918000113004800ae44611000f10580b0556e6c6f636b4869646553746167657390b10800a0446966666963756c74691300018600714d61696e4c696e50349183ac547265617375720e00609fce000f462a0500102b0500602cce000f4a120500101305006014ce0010ccca050010cb050060ccce000f4dfa050010fb050060fcce0010d0b2050010b3050020b4ade933002c040187004086cd03e9513140c0cd03eaa02841d0cd044d2817f104cd03ebce00990ce0cd044ece00a8274acd03ec800410b5a6007243686170746572b2cd616e666f7390bac20004180045787472614d350acb001a9080002490b13400064c0011b44c00025501016300009b012b81af1100a380b04175746f46696768eb34c17390ad5465616d47726f75703200300186a81100605479706501a60a00f106496401aa4361707461696e506f7301ad4669727374420041506f73032d00003900208301cd03214a027a4810030600115b1c00604e616d65a0ae4900605072656661622c006080a95369676e1b64f014739385a2496402a5526f756e6401a344617905a3476f74c2a946696e697368446179002100172a21001f032100011f2b21000973b341737369676e3401e75265636f726490b1576561706f6efa377290ab506172746e886e2290b431cda1656450726f746f636f6cd43685b04c696d69746564a801b0c0af5573654261636b6772810000c33641d59f81b88d01a553686f727453746f72792f000fd70119506e666f7390"); - Crypto.HaruCrypt.Decrypt(test); - Console.WriteLine(JsonConvert.SerializeObject(MessagePackSerializer.Typeless.Deserialize(MessagePack.MessagePackSerializer.Deserialize(test, MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4Block)).Content))); - + PacketFactory.LoadPacketHandlers(); Task.Run(GameServer.Server.Instance.Start); SDKServer.SDKServer.Main(args); }