diff --git a/Arrowgene.Ddon.GameServer/Characters/GpCourseManager.cs b/Arrowgene.Ddon.GameServer/Characters/GpCourseManager.cs index ae9056ce9..89ad458a4 100644 --- a/Arrowgene.Ddon.GameServer/Characters/GpCourseManager.cs +++ b/Arrowgene.Ddon.GameServer/Characters/GpCourseManager.cs @@ -184,7 +184,7 @@ public void EvaluateCourses() _CourseIsActive[id] = true; ApplyCourseEffects(id); - var ntc = new S2CGPCourseStartNtc() + var ntc = new S2CGpCourseStartNtc() { CourseID = id, ExpiryTimestamp = course.EndTime, diff --git a/Arrowgene.Ddon.GameServer/Characters/WalletManager.cs b/Arrowgene.Ddon.GameServer/Characters/WalletManager.cs index f8174bba9..b32576bf6 100644 --- a/Arrowgene.Ddon.GameServer/Characters/WalletManager.cs +++ b/Arrowgene.Ddon.GameServer/Characters/WalletManager.cs @@ -24,7 +24,8 @@ public WalletManager(DdonGameServer server) Server = server; WalletLimits = server.GameSettings.GameServerSettings.WalletLimits; } - public bool AddToWalletNtc(Client Client, Character Character, WalletType Type, uint Amount, uint BonusAmount = 0, ItemNoticeType updateType = ItemNoticeType.Default, DbConnection? connectionIn = null) + + public uint AddToWalletNtc(Client Client, Character Character, WalletType Type, uint Amount, uint BonusAmount = 0, ItemNoticeType updateType = ItemNoticeType.Default, DbConnection? connectionIn = null) { CDataUpdateWalletPoint UpdateWalletPoint = AddToWallet(Character, Type, Amount, BonusAmount, connectionIn); @@ -34,7 +35,7 @@ public bool AddToWalletNtc(Client Client, Character Character, WalletType Type, Client.Send(UpdateCharacterItemNtc); - return true; + return UpdateWalletPoint.Value; } public CDataUpdateWalletPoint AddToWallet(Character Character, WalletType Type, uint Amount, uint BonusAmount = 0, DbConnection? connectionIn = null) diff --git a/Arrowgene.Ddon.GameServer/DdonGameServer.cs b/Arrowgene.Ddon.GameServer/DdonGameServer.cs index 7f2a43f18..98045a6c4 100644 --- a/Arrowgene.Ddon.GameServer/DdonGameServer.cs +++ b/Arrowgene.Ddon.GameServer/DdonGameServer.cs @@ -262,10 +262,10 @@ private void LoadPacketHandler() AddHandler(new CharacterPawnGoldenReviveHandler(this)); AddHandler(new CharacterPawnPointReviveHandler(this)); AddHandler(new CharacterSetOnlineStatusHandler(this)); - AddHandler(new CharacterEditGetShopPriceHandler(this)); - AddHandler(new CharacterEditUpdateCharacterEditParamHandler(this)); + AddHandler(new CharacterEditGetShopPriceHandler(this)); + AddHandler(new CharacterEditUpdateCharacterEditParamHandler(this)); AddHandler(new CharacterEditUpdateCharacterEditParamExHandler(this)); - AddHandler(new CharacterEditUpdatePawnEditParamHandler(this)); + AddHandler(new CharacterEditUpdatePawnEditParamHandler(this)); AddHandler(new CharacterEditUpdatePawnEditParamExHandler(this)); AddHandler(new CharacterCharacterDeadHandler(this)); AddHandler(new CharacterCharacterDownCancelHandler(this)); @@ -330,6 +330,24 @@ private void LoadPacketHandler() AddHandler(new CraftRecipeGetCraftRecipeHandler(this)); AddHandler(new CraftStartCraftHandler(this)); AddHandler(new CraftSkillUpHandler(this)); + + AddHandler(new GpShopDisplayTypeHandler(this)); + AddHandler(new GpCogGetIdHandler(this)); + AddHandler(new GpGetCapToGpChangeListHandler(this)); + AddHandler(new GpChangeCapToGpHandler(this)); + AddHandler(new GpCourseGetValidListHandler(this)); + AddHandler(new GpShopGetBuyHistoryHandler(this)); + AddHandler(new GpCourseUseFromAvailableHandler(this)); + AddHandler(new GpGetCapHandler(this)); + + AddHandler(new GachaListHandler(this)); + AddHandler(new BoxGachaListHandler(this)); + AddHandler(new BoxGachaBuyHandler(this)); + AddHandler(new GachaBuyHandler(this)); + AddHandler(new BoxGachaDrawInfoHandler(this)); + + AddHandler(new EventCodeInputHandler(this)); + AddHandler(new CraftGetCraftProductInfoHandler(this)); AddHandler(new CraftCancelCraftHandler(this)); AddHandler(new CraftTimeSaveHandler(this)); @@ -426,6 +444,7 @@ private void LoadPacketHandler() AddHandler(new ItemGetSpecifiedHavingItemListHandler(this)); AddHandler(new ItemEmbodyItemsHandler(this)); AddHandler(new ItemChangeAttrDiscardHandler(this)); + AddHandler(new ItemGetItemStorageInfoHandler(this)); AddHandler(new JobChangeJobHandler(this)); AddHandler(new JobChangePawnJobHandler(this)); @@ -495,6 +514,7 @@ private void LoadPacketHandler() AddHandler(new PartySendBinaryMsgAllHandler(this)); AddHandler(new PartySendBinaryMsgHandler(this)); + AddHandler(new PawnGetFreeRentalPawnListHandler(this)); AddHandler(new PawnGetLostPawnListHandler(this)); AddHandler(new PawnGetMypawnDataHandler(this)); AddHandler(new PawnGetMyPawnListHandler(this)); @@ -560,6 +580,7 @@ private void LoadPacketHandler() AddHandler(new QuestLeaderQuestProgressRequestHandler(this)); AddHandler(new QuestGetEndContentsGroupHandler(this)); AddHandler(new QuestGetCycleContentsNewsListHandler(this)); + AddHandler(new QuestQuestOrderHandler(this)); AddHandler(new QuestQuestProgressHandler(this)); AddHandler(new QuestSendLeaderQuestOrderConditionInfoHandler(this)); @@ -683,8 +704,8 @@ private void LoadPacketHandler() AddHandler(new StageGetSpAreaChangeInfoHandler(this)); AddHandler(new StampBonusCheckHandler(this)); - AddHandler(new StampBonusGetListHandler(this)); - AddHandler(new StampBonusReceiveDailyHandler(this)); + AddHandler(new StampBonusGetListHandler(this)); + AddHandler(new StampBonusReceiveDailyHandler(this)); AddHandler(new StampBonusReceiveTotalHandler(this)); AddHandler(new WarpAreaWarpHandler(this)); diff --git a/Arrowgene.Ddon.GameServer/Handler/BoxGachaBuyHandler.cs b/Arrowgene.Ddon.GameServer/Handler/BoxGachaBuyHandler.cs new file mode 100644 index 000000000..bc56a52c2 --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/BoxGachaBuyHandler.cs @@ -0,0 +1,50 @@ +using Arrowgene.Ddon.Server; +using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Model; +using Arrowgene.Logging; +using System.Collections.Generic; + +namespace Arrowgene.Ddon.GameServer.Handler +{ + public class BoxGachaBuyHandler : GameRequestPacketHandler + { + private static readonly ServerLogger Logger = LogProvider.Logger(typeof(BoxGachaBuyHandler)); + + public BoxGachaBuyHandler(DdonGameServer server) : base(server) + { + } + + public override S2CBoxGachaBuyRes Handle(GameClient client, C2SBoxGachaBuyReq request) + { + throw new ResponseErrorException(ErrorCode.ERROR_CODE_NOT_IMPLEMENTED); + + S2CBoxGachaBuyRes res = new S2CBoxGachaBuyRes(); + + // TODO: based on gacha ID & draw ID figure out which items were bought + res.BoxGachaId = request.BoxGachaId; + res.BoxGachaItemList.Add(new CDataBoxGachaItemInfo + { + ItemId = 13800, + ItemNum = 5, + ItemStock = 13, + Rank = 2, + Effect = 0, + Probability = 0, + DrawNum = 0 + }); + + List itemUpdateResult = new List(); + foreach (CDataBoxGachaItemInfo gachaItemInfo in res.BoxGachaItemList) + { + // TODO: support adding to item post + itemUpdateResult.AddRange(Server.ItemManager.AddItem(Server, client.Character, true, gachaItemInfo.ItemId, gachaItemInfo.ItemNum)); + } + + // TODO: based on Settlement ID figure out which currency was used + Server.WalletManager.RemoveFromWalletNtc(client, client.Character, WalletType.GoldenGemstones, request.Price); + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/BoxGachaDrawInfoHandler.cs b/Arrowgene.Ddon.GameServer/Handler/BoxGachaDrawInfoHandler.cs new file mode 100644 index 000000000..1bedb03de --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/BoxGachaDrawInfoHandler.cs @@ -0,0 +1,40 @@ +using Arrowgene.Ddon.Server; +using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Model; +using Arrowgene.Logging; + +namespace Arrowgene.Ddon.GameServer.Handler +{ + public class BoxGachaDrawInfoHandler : GameRequestPacketHandler + { + private static readonly ServerLogger Logger = LogProvider.Logger(typeof(BoxGachaDrawInfoHandler)); + + public BoxGachaDrawInfoHandler(DdonGameServer server) : base(server) + { + } + + public override S2CBoxGachaDrawInfoRes Handle(GameClient client, C2SBoxGachaDrawInfoReq request) + { + throw new ResponseErrorException(ErrorCode.ERROR_CODE_NOT_IMPLEMENTED); + + S2CBoxGachaDrawInfoRes res = new S2CBoxGachaDrawInfoRes(); + + // Reflects received results to user in the appropriate tab + // TODO: unsure if request's DrawId should be directly sent back or box gacha ID should be figured out based on DrawId + res.BoxGachaId = 93; + res.BoxGachaItemList.Add(new CDataBoxGachaItemInfo + { + ItemId = 13800, + ItemNum = 5, + ItemStock = 13, + Rank = 2, + Effect = 0, + Probability = 0, + DrawNum = 0 + }); + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/BoxGachaListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/BoxGachaListHandler.cs new file mode 100644 index 000000000..5db0cba6c --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/BoxGachaListHandler.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using Arrowgene.Ddon.Server; +using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Model; +using Arrowgene.Logging; + +namespace Arrowgene.Ddon.GameServer.Handler +{ + public class BoxGachaListHandler : GameRequestPacketHandler + { + private static readonly ServerLogger Logger = LogProvider.Logger(typeof(BoxGachaListHandler)); + + public BoxGachaListHandler(DdonGameServer server) : base(server) + { + } + + public override S2CBoxGachaListRes Handle(GameClient client, C2SBoxGachaListReq request) + { + throw new ResponseErrorException(ErrorCode.ERROR_CODE_NOT_IMPLEMENTED); + + S2CBoxGachaListRes res = new S2CBoxGachaListRes(); + + string urlBase = Server.GameSettings.GameServerSettings.UrlDomain; + + res.BoxGachaList.Add(new CDataBoxGachaInfo + { + Id = 93, + Begin = DateTimeOffset.UtcNow.ToUnixTimeSeconds() - 1000, + End = DateTimeOffset.UtcNow.AddMonths(12).ToUnixTimeSeconds(), + Unk1 = true, + Name = "Consumables box lot", + Description = "Rare supplies are available!", + Detail = + "The \"Consumables Box Lot\" is a lottery that can be drawn by spending Silver Tickets.\r\n\r\nYou can get consumables such as \"White Dragon Seal Elixir, Top\" and \"Talisman of the Twin Gods\". \r\n\r\nYou can reset the contents of the box to its initial state with the About Box Treasure Slot reset button, so please use it when you have obtained all the items you are looking for.", + WeightDispType = 1, + FreeSpaceText = "", + ListAddr = $"{urlBase}/sp_ingame/campaign/bnr/lotto/lot_icon_170316_03.jpg", + ImageAddr = $"{urlBase}/sp_ingame/campaign/bnr/lotto/lot_icon_170316_03.jpg", + SettlementList = new List + { + new() + { + DrawId = 199, + Id = 2, + Price = 10, + BasePrice = 10, + DrawNum = 1, + BonusNum = 0, + PurchaseNum = 0, + PurchaseMaxNum = 0, + SpecialPriceNum = 0, + SpecialPriceMaxNum = 0, + Unk1 = 0 + } + }, + BoxGachaSets = new List + { + new() + { + ItemId = 13800, + ItemNum = 5, + ItemStock = 13, + Rank = 2, + Effect = 0, + Probability = 0, + DrawNum = 0 + } + } + }); + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/CharacterDecideCharacterIdHandler.cs b/Arrowgene.Ddon.GameServer/Handler/CharacterDecideCharacterIdHandler.cs index cad8a2bf4..e98f76ec7 100644 --- a/Arrowgene.Ddon.GameServer/Handler/CharacterDecideCharacterIdHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/CharacterDecideCharacterIdHandler.cs @@ -39,7 +39,7 @@ public override PacketQueue Handle(GameClient client, C2SCharacterDecideCharacte { if (now >= course.StartTime && now <= course.EndTime) { - client.Enqueue(new S2CGPCourseStartNtc() + client.Enqueue(new S2CGpCourseStartNtc() { CourseID = course.Id, ExpiryTimestamp = course.EndTime diff --git a/Arrowgene.Ddon.GameServer/Handler/ConnectionMoveInServerHandler.cs b/Arrowgene.Ddon.GameServer/Handler/ConnectionMoveInServerHandler.cs index b9b40f7ed..520b24f19 100644 --- a/Arrowgene.Ddon.GameServer/Handler/ConnectionMoveInServerHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/ConnectionMoveInServerHandler.cs @@ -57,7 +57,7 @@ public override S2CConnectionMoveInServerRes Handle(GameClient client, C2SConnec { if (now >= course.StartTime && now <= course.EndTime) { - S2CGPCourseExtendNtc courseExtendNtc = new S2CGPCourseExtendNtc() + S2CGpCourseExtendNtc courseExtendNtc = new S2CGpCourseExtendNtc() { CourseID = course.Id, ExpiryTimestamp = course.EndTime diff --git a/Arrowgene.Ddon.GameServer/Handler/EventCodeInputHandler.cs b/Arrowgene.Ddon.GameServer/Handler/EventCodeInputHandler.cs new file mode 100644 index 000000000..b691fd954 --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/EventCodeInputHandler.cs @@ -0,0 +1,37 @@ +using Arrowgene.Ddon.Server; +using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Ddon.Shared.Model; +using Arrowgene.Logging; + +namespace Arrowgene.Ddon.GameServer.Handler +{ + public class EventCodeInputHandler : GameRequestPacketHandler + { + private static readonly ServerLogger Logger = LogProvider.Logger(typeof(EventCodeInputHandler)); + + public EventCodeInputHandler(DdonGameServer server) : base(server) + { + } + + public override S2CEventCodeInputRes Handle(GameClient client, C2SEventCodeInputReq request) + { + S2CEventCodeInputRes res = new S2CEventCodeInputRes(); + + // TODO: based on event code figure out which items should be sent + // https://h1g.jp/dd-on/?%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89 + // https://dengekionline.com/elem/000/001/138/1138291/ + if (request.Code == "UPCT-YUAW-3K16-8255") + { + res.Name = "Silver Tickets and Trial Support Boat Course"; + } + else + { + throw new ResponseErrorException(ErrorCode.ERROR_CODE_EVENT_CODE_INPUT_LOCK); + } + + // TODO: send mail with items + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/GachaBuyHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GachaBuyHandler.cs new file mode 100644 index 000000000..0d688b6c1 --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/GachaBuyHandler.cs @@ -0,0 +1,110 @@ +using Arrowgene.Ddon.Server; +using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Ddon.Shared.Model; +using Arrowgene.Logging; +using System; + +namespace Arrowgene.Ddon.GameServer.Handler +{ + public class GachaBuyHandler : GameRequestPacketHandler + { + private static readonly ServerLogger Logger = LogProvider.Logger(typeof(GachaBuyHandler)); + + public GachaBuyHandler(DdonGameServer server) : base(server) + { + } + + public override S2CGachaBuyRes Handle(GameClient client, C2SGachaBuyReq request) + { + throw new ResponseErrorException(ErrorCode.ERROR_CODE_NOT_IMPLEMENTED); + + S2CGachaBuyRes res = new S2CGachaBuyRes() + { + GachaId = request.GachaId, + }; + + var gachaAsset = Server.AssetRepository.GachaAsset; + + if (!gachaAsset.GachaInfoList.ContainsKey(request.GachaId)) + { + throw new ResponseErrorException(ErrorCode.ERROR_CODE_GACHA_NOT_FOUND); + } + + var lootBox = gachaAsset.GachaInfoList[request.GachaId]; + + WalletType walletType; + switch (request.SettlementId) + { + case 1: + walletType = WalletType.GoldenGemstones; + break; + case 2: + walletType = WalletType.SilverTickets; + break; + default: + return res; + } + + if (Server.WalletManager.RemoveFromWalletNtc(client, client.Character, walletType, request.Price)) + { + throw new ResponseErrorException(ErrorCode.ERROR_CODE_GACHA_PRICE_NO_MATCH); + } + + foreach (var drawGroup in lootBox.DrawGroups) + { + var itemList = drawGroup.GachaDrawList[0]; + res.GachaItemList.Add(itemList.GachaItemInfo[Random.Shared.Next(itemList.GachaItemInfo.Count)]); + } + + S2CItemUpdateCharacterItemNtc updateCharacterItemNtc = new S2CItemUpdateCharacterItemNtc() + { + UpdateType = 0 + }; + + Server.Database.ExecuteInTransaction(connection => + { + foreach (var item in res.GachaItemList) + { + if (Server.ItemManager.IsItemWalletPoint(item.ItemId)) + { + (WalletType walletType, uint amount) = Server.ItemManager.ItemToWalletPoint(item.ItemId); + var result = Server.WalletManager.AddToWallet(client.Character, walletType, amount * item.ItemNum, connectionIn: connection); + updateCharacterItemNtc.UpdateWalletList.Add(result); + } + else if (item.ItemNum > 0) + { + var result = Server.ItemManager.AddItem(Server, client.Character, true, item.ItemId, item.ItemNum, connectionIn: connection); + updateCharacterItemNtc.UpdateItemList.AddRange(result); + } + } + }); + + client.Send(updateCharacterItemNtc); + +#if false + // TODO: based on gacha ID & draw ID figure out which items were bought + res.GachaId = request.GachaId; + res.GachaItemList.Add(new CDataGachaItemInfo + { + ItemId = 10290, + ItemNum = 1, + Rank = 1, + Effect = 0, + Probability = 0.68 + }); + + List itemUpdateResult = new List(); + foreach (CDataGachaItemInfo gachaItemInfo in res.GachaItemList) + { + // TODO: support adding to item post + itemUpdateResult.AddRange(Server.ItemManager.AddItem(Server, client.Character, true, gachaItemInfo.ItemId, gachaItemInfo.ItemNum)); + } + + // TODO: based on Settlement ID figure out which currency was used + Server.WalletManager.RemoveFromWalletNtc(client, client.Character, WalletType.GoldenGemstones, request.Price); +#endif + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/GachaListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GachaListHandler.cs new file mode 100644 index 000000000..5fb520f29 --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/GachaListHandler.cs @@ -0,0 +1,109 @@ +#nullable enable +using Arrowgene.Ddon.Server; +using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Ddon.Shared.Model; +using Arrowgene.Logging; +using System.Linq; + +namespace Arrowgene.Ddon.GameServer.Handler +{ + public class GachaListHandler : GameRequestPacketHandler + { + private static readonly ServerLogger Logger = LogProvider.Logger(typeof(GachaListHandler)); + + public GachaListHandler(DdonGameServer server) : base(server) + { + } + + public override S2CGachaListRes Handle(GameClient client, C2SGachaListReq request) + { + throw new ResponseErrorException(ErrorCode.ERROR_CODE_NOT_IMPLEMENTED); + + S2CGachaListRes res = new S2CGachaListRes() + { + GachaList = Server.AssetRepository.GachaAsset.GachaInfoList.Values.ToList() + }; + + string urlBase = Server.GameSettings.GameServerSettings.UrlDomain; + foreach (var gacha in res.GachaList) + { + gacha.ListAddr = $"{urlBase}{gacha.ListAddr}"; + gacha.ImageAddr = $"{urlBase}{gacha.ImageAddr}"; + } + +#if false + string urlBase = Server.GameSettings.GameServerSettings.UrlDomain; + + res.GachaList.Add(new CDataGachaInfo + { + Id = 266, + Begin = DateTimeOffset.UtcNow.ToUnixTimeSeconds() - 1000, + End = DateTimeOffset.UtcNow.AddMonths(12).ToUnixTimeSeconds(), + Name = "Weapons Lot [TypeA]", + Description = "Any of the weapons we have sold in the past.\r\nYou will always get one!", + Detail = + "The \"Weapon Lot [Type A]\" is a lottery in which you can win by spending either gold rocks or silver tickets,\r\nSilver Ticket.\r\n\r\nWeapons sold in the past,\r\nYou can get one of the 144 types out of the 290 types of weapons sold in the past.\r\n\r\n[Included lineup] + { + new CDataGachaDrawGroupInfo + { + GachaSettlementList = new List + { + new CDataGachaSettlementInfo + { + DrawGroupId = 351, + Id = 1, + Price = 1, + BasePrice = 1, + PurchaseNum = 0, + PurchaseMaxNum = 0, + SpecialPriceNum = 0, + SpecialPriceMaxNum = 0, + Unk1 = 0 + }, + new CDataGachaSettlementInfo + { + DrawGroupId = 352, + Id = 2, + Price = 10, + BasePrice = 10, + PurchaseNum = 0, + PurchaseMaxNum = 0, + SpecialPriceNum = 0, + SpecialPriceMaxNum = 0, + Unk1 = 0 + } + }, + GachaDrawList = new List + { + new CDataGachaDrawInfo + { + Num = 1, + IsBonus = false, + GachaItemInfo = new List + { + new CDataGachaItemInfo + { + ItemId = 10215, + ItemNum = 1, + Rank = 1, + Effect = 0, + Probability = 0.69 + } + } + } + } + } + } + }); +#endif + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/GpChangeCapToGpHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpChangeCapToGpHandler.cs new file mode 100644 index 000000000..b78021d72 --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/GpChangeCapToGpHandler.cs @@ -0,0 +1,36 @@ +#nullable enable +using Arrowgene.Ddon.Server; +using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Model; +using Arrowgene.Logging; + +namespace Arrowgene.Ddon.GameServer.Handler +{ + public class GpChangeCapToGpHandler : GameRequestPacketHandler + { + private static readonly ServerLogger Logger = LogProvider.Logger(typeof(GpChangeCapToGpHandler)); + + public GpChangeCapToGpHandler(DdonGameServer server) : base(server) + { + } + + public override S2CGpChangeCapToGpRes Handle(GameClient client, C2SGpChangeCapToGpReq request) + { + S2CGpChangeCapToGpRes res = new S2CGpChangeCapToGpRes(); + + // TODO: fetch number of GP via some asset for change list IDs + res.ChangeListID = request.ChangeListID; + uint changeListGPValue = 1; + + // TODO: based on Settlement ID figure out which currency was used + uint walletPoints = Server.WalletManager.AddToWalletNtc(client, client.Character, WalletType.GoldenGemstones, changeListGPValue); + + res.GP = walletPoints; + // TODO: store CAP somewhere? + res.CAP = 0; + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/GpCogGetIdHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpCogGetIdHandler.cs new file mode 100644 index 000000000..cdcf418c0 --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/GpCogGetIdHandler.cs @@ -0,0 +1,26 @@ +#nullable enable +using Arrowgene.Ddon.Server; +using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Logging; + +namespace Arrowgene.Ddon.GameServer.Handler +{ + public class GpCogGetIdHandler : GameRequestPacketHandler + { + private static readonly ServerLogger Logger = LogProvider.Logger(typeof(GpCogGetIdHandler)); + + public GpCogGetIdHandler(DdonGameServer server) : base(server) + { + } + + public override S2CGpCogGetIdRes Handle(GameClient client, C2SGpCogGetIdReq request) + { + S2CGpCogGetIdRes res = new S2CGpCogGetIdRes(); + + // TODO: store CogId somewhere in account + res.CogId = "Arrowgene"; + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/GpCourseGetValidListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpCourseGetValidListHandler.cs new file mode 100644 index 000000000..9995cd737 --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/GpCourseGetValidListHandler.cs @@ -0,0 +1,37 @@ +#nullable enable +using System; +using Arrowgene.Ddon.Server; +using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Logging; + +namespace Arrowgene.Ddon.GameServer.Handler; + +public class GpCourseGetValidListHandler : GameRequestPacketHandler +{ + private static readonly ServerLogger Logger = LogProvider.Logger(typeof(GpCourseGetValidListHandler)); + + public GpCourseGetValidListHandler(DdonGameServer server) : base(server) + { + } + + public override S2CGpCourseGetValidListRes Handle(GameClient client, C2SGpCourseGetValidListReq request) + { + var res = new S2CGpCourseGetValidListRes(); + string urlBase = Server.GameSettings.GameServerSettings.UrlDomain; + + // TODO: track active courses in DB + var offset = DateTimeOffset.UtcNow; + res.Items.Add(new CDataGPCourseValid + { + Id = 1, + CourseId = 1, + Name = "Adventure Passport (active)", + ImageAddr = $"{urlBase}/shop/img/payment/icon_course1.png", + StartTime = (ulong)offset.ToUnixTimeSeconds(), + EndTime = (ulong)offset.AddMonths(12).ToUnixTimeSeconds() + }); + + return res; + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/GpCourseUseFromAvailableHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpCourseUseFromAvailableHandler.cs new file mode 100644 index 000000000..cfdf3ef0f --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/GpCourseUseFromAvailableHandler.cs @@ -0,0 +1,28 @@ +#nullable enable +using System; +using Arrowgene.Ddon.Server; +using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Logging; + +namespace Arrowgene.Ddon.GameServer.Handler; + +public class GpCourseUseFromAvailableHandler : GameRequestPacketHandler +{ + private static readonly ServerLogger Logger = LogProvider.Logger(typeof(GpCourseUseFromAvailableHandler)); + + public GpCourseUseFromAvailableHandler(DdonGameServer server) : base(server) + { + } + + public override S2CGpCourseUseFromAvailableRes Handle(GameClient client, C2SGpCourseUseFromAvailableReq request) + { + var res = new S2CGpCourseUseFromAvailableRes(); + + // TODO: remove requested available course ID from available courses + + // TODO: get period from requested available course ID + res.FinishDateTime = (ulong)DateTimeOffset.UtcNow.AddMonths(12).ToUnixTimeSeconds(); + + return res; + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/GpGetCapHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpGetCapHandler.cs new file mode 100644 index 000000000..fad712a71 --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/GpGetCapHandler.cs @@ -0,0 +1,25 @@ +#nullable enable +using Arrowgene.Ddon.Server; +using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Logging; + +namespace Arrowgene.Ddon.GameServer.Handler +{ + public class GpGetCapHandler : GameRequestPacketHandler + { + private static readonly ServerLogger Logger = LogProvider.Logger(typeof(GpGetCapHandler)); + + public GpGetCapHandler(DdonGameServer server) : base(server) + { + } + + public override S2CGpGetCapRes Handle(GameClient client, C2SGpGetCapReq request) + { + S2CGpGetCapRes res = new S2CGpGetCapRes(); + + res.CAP = 123; + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/GpGetCapToGpChangeListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpGetCapToGpChangeListHandler.cs new file mode 100644 index 000000000..2ffec444d --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/GpGetCapToGpChangeListHandler.cs @@ -0,0 +1,48 @@ +#nullable enable +using System.Collections.Generic; +using Arrowgene.Ddon.Server; +using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Logging; + +namespace Arrowgene.Ddon.GameServer.Handler +{ + public class GpGetCapToGpChangeListHandler : GameRequestPacketHandler + { + private static readonly ServerLogger Logger = LogProvider.Logger(typeof(GpGetCapToGpChangeListHandler)); + + public GpGetCapToGpChangeListHandler(DdonGameServer server) : base(server) + { + } + + public override S2CGpGetCapToGpChangeListRes Handle(GameClient client, C2SGpGetCapToGpChangeListReq request) + { + S2CGpGetCapToGpChangeListRes res = new S2CGpGetCapToGpChangeListRes(); + + // TODO: introduce some form of asset to track all potential variants of GG + res.List.AddRange(new List + { + new() + { + ID = 1, + CAP = 0, + GP = 1, + Comment = "ID1 0CAP for 1GG", + BackIconID = 0, + FrameIconID = 0 + }, + new() + { + ID = 2, + CAP = 0, + GP = 10, + Comment = "ID2 0CAP for 10GG", + BackIconID = 0, + FrameIconID = 1 + } + }); + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/GpGetGpDetailHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpGetGpDetailHandler.cs index c0be14d1d..037b3bfe8 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GpGetGpDetailHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GpGetGpDetailHandler.cs @@ -1,8 +1,9 @@ +using System; using Arrowgene.Ddon.Server; using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Ddon.Shared.Entity.Structure; using Arrowgene.Ddon.Shared.Model; using Arrowgene.Logging; -using System; namespace Arrowgene.Ddon.GameServer.Handler { @@ -16,16 +17,18 @@ public GpGetGpDetailHandler(DdonGameServer server) : base(server) public override S2CGpGetGpDetailRes Handle(GameClient client, C2SGpGetGpDetailReq packet) { - var res = new S2CGpGetGpDetailRes(); - var amount = Server.WalletManager.GetWalletAmount(client.Character, WalletType.GoldenGemstones); + S2CGpGetGpDetailRes res = new S2CGpGetGpDetailRes(); + uint amount = Server.WalletManager.GetWalletAmount(client.Character, WalletType.GoldenGemstones); + DateTimeOffset offset = DateTimeOffset.UtcNow; - res.GPList.Add(new Shared.Entity.Structure.CDataGPDetail() + res.GPList.Add(new CDataGPDetail() { GP = amount, Max = amount, - isFree = true, - Type = GPDetailType.None, - Created = DateTimeOffset.Now + IsFree = false, + GetType = GPDetailType.OnlineShopPurchase, + Expire = offset.AddMonths(12), + Created = offset }); return res; diff --git a/Arrowgene.Ddon.GameServer/Handler/GpGetGpHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpGetGpHandler.cs index 0e1e02d79..59d55a5b4 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GpGetGpHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GpGetGpHandler.cs @@ -1,7 +1,9 @@ +using System; using Arrowgene.Ddon.Server; using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Ddon.Shared.Model; +using Arrowgene.Ddon.Shared.Network; using Arrowgene.Logging; -using System; namespace Arrowgene.Ddon.GameServer.Handler { @@ -15,13 +17,14 @@ public GpGetGpHandler(DdonGameServer server) : base(server) public override S2CGpGetGpRes Handle(GameClient client, C2SGpGetGpReq request) { - var amount = Server.WalletManager.GetWalletAmount(client.Character, Shared.Model.WalletType.GoldenGemstones); + uint amount = Server.WalletManager.GetWalletAmount(client.Character, WalletType.GoldenGemstones); + DateTimeOffset offset = DateTimeOffset.UtcNow; - return new S2CGpGetGpRes() + return new S2CGpGetGpRes { GP = amount, - UseLimit = 0, ///TODO: Investigate. - RealTime = DateTimeOffset.Now + UseLimit = offset.AddMonths(12), + RealTime = offset }; } } diff --git a/Arrowgene.Ddon.GameServer/Handler/GpGetGpPeriodHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpGetGpPeriodHandler.cs index fc6cf1472..a4cc0c928 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GpGetGpPeriodHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GpGetGpPeriodHandler.cs @@ -1,8 +1,9 @@ +using System; using Arrowgene.Ddon.Server; using Arrowgene.Ddon.Shared.Entity.PacketStructure; using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Model; using Arrowgene.Logging; -using System; namespace Arrowgene.Ddon.GameServer.Handler { @@ -16,8 +17,8 @@ public GpGetGpPeriodHandler(DdonGameServer server) : base(server) public override S2CGpGetGpPeriodRes Handle(GameClient client, C2SGpGetGpPeriodReq packet) { - var res = new S2CGpGetGpPeriodRes(); - var amount = Server.WalletManager.GetWalletAmount(client.Character, Shared.Model.WalletType.GoldenGemstones); + S2CGpGetGpPeriodRes res = new S2CGpGetGpPeriodRes(); + uint amount = Server.WalletManager.GetWalletAmount(client.Character, WalletType.GoldenGemstones); res.GPPeriodList.Add(new CDataGPPeriod() { diff --git a/Arrowgene.Ddon.GameServer/Handler/GpGetUpdateAppCourseBonusFlagHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpGetUpdateAppCourseBonusFlagHandler.cs index 868986024..a3d6bfe5b 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GpGetUpdateAppCourseBonusFlagHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GpGetUpdateAppCourseBonusFlagHandler.cs @@ -19,6 +19,7 @@ public GpGetUpdateAppCourseBonusFlagHandler(DdonGameServer server) : base(server public override void Handle(GameClient client, IPacket packet) { + // TODO: C2S_GP_GET_UPDATE_APP_COURSE_BONUS_FLAG_REQ client.Send(InGameDump.Dump_97); } } diff --git a/Arrowgene.Ddon.GameServer/Handler/GpGpCourseGetAvailableListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpGpCourseGetAvailableListHandler.cs index a72164062..44330738e 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GpGpCourseGetAvailableListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GpGpCourseGetAvailableListHandler.cs @@ -1,15 +1,14 @@ -using Arrowgene.Buffers; -using Arrowgene.Ddon.GameServer.Dump; +using System; +using System.Collections.Generic; using Arrowgene.Ddon.Server; -using Arrowgene.Ddon.Server.Network; using Arrowgene.Ddon.Shared; using Arrowgene.Ddon.Shared.Entity.PacketStructure; -using Arrowgene.Ddon.Shared.Network; +using Arrowgene.Ddon.Shared.Entity.Structure; using Arrowgene.Logging; namespace Arrowgene.Ddon.GameServer.Handler { - public class GpGpCourseGetAvailableListHandler : PacketHandler + public class GpGpCourseGetAvailableListHandler : GameRequestPacketHandler { private static readonly ServerLogger Logger = LogProvider.Logger(typeof(GpGpCourseGetAvailableListHandler)); @@ -20,20 +19,26 @@ public GpGpCourseGetAvailableListHandler(DdonGameServer server) : base(server) _AssetRepo = server.AssetRepository; } - public override PacketId Id => PacketId.C2S_GP_GP_COURSE_GET_AVAILABLE_LIST_REQ; - - public override void Handle(GameClient client, IPacket packet) + public override S2CGpGpCourseGetAvailableListRes Handle(GameClient client, C2SGpCourseGetAvailableListReq request) { - S2CGpGpCourseGetAvailableListRes Response = new S2CGpGpCourseGetAvailableListRes(); + S2CGpGpCourseGetAvailableListRes res = new S2CGpGpCourseGetAvailableListRes(); - // foreach (var Course in _AssetRepo.GPCourseInfoAsset.ValidCourses) - // { - // - // } + string urlBase = Server.GameSettings.GameServerSettings.UrlDomain; + DateTimeOffset offset = DateTimeOffset.UtcNow; + res.Items = new List + { + new CDataGPCourseAvailable + { + ID = 1, + Name = "Adventure Passport (available)", + UseLimitTime = offset.AddMonths(12), + CourseID = 1, + LineupID = 1, + ImageAddr = $"{urlBase}/shop/img/payment/icon_course1.png", + } + }; - // TODO: Send back real data based on JSON contents? - // TODO: PCAP doesn't have sample packet contents to see what is in it. - client.Send(Response); + return res; } } } diff --git a/Arrowgene.Ddon.GameServer/Handler/GpGpEditGetVoiceListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpGpEditGetVoiceListHandler.cs index cfa6e67d9..223dc954d 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GpGpEditGetVoiceListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GpGpEditGetVoiceListHandler.cs @@ -21,12 +21,14 @@ public GpGpEditGetVoiceListHandler(DdonGameServer server) : base(server) public override void Handle(GameClient client, IPacket packet) { + // TODO: C2S_GP_GP_EDIT_GET_VOICE_LIST_REQ S2CGpGpEditGetVoiceListRes response = EntitySerializer.Get().Read(GameFull.data_Dump_703); foreach (var voice in response.VoiceList) { voice.IsValid = true; // Unlock } + client.Send(response); } } -} \ No newline at end of file +} diff --git a/Arrowgene.Ddon.GameServer/Handler/GpShopDisplayTypeHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpShopDisplayTypeHandler.cs new file mode 100644 index 000000000..8130bd955 --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/GpShopDisplayTypeHandler.cs @@ -0,0 +1,44 @@ +#nullable enable +using System.Collections.Generic; +using Arrowgene.Ddon.Server; +using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Logging; + +namespace Arrowgene.Ddon.GameServer.Handler +{ + public class GpShopDisplayTypeHandler : GameRequestPacketHandler + { + private static readonly ServerLogger Logger = LogProvider.Logger(typeof(GpShopDisplayTypeHandler)); + + public GpShopDisplayTypeHandler(DdonGameServer server) : base(server) + { + } + + public override S2CGpShopDisplayGetTypeRes Handle(GameClient client, C2SGpShopDisplayGetTypeReq request) + { + S2CGpShopDisplayGetTypeRes res = new S2CGpShopDisplayGetTypeRes(); + + // https://h1g.jp/dd-on/?%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%97 + // TODO: add to some asset + List items = new List + { + new() { ID = 1, Name = "Selection", InGameUrlID = 11 }, + new() { ID = 3, Name = "Passport", InGameUrlID = 11 }, + // new() { ID = 6, Name = "Optional Courses", InGameUrlID = 11 }, + // new() { ID = 7, Name = "Pawn Voices", InGameUrlID = 11 }, + // new() { ID = 8, Name = "Crafting related", InGameUrlID = 11 }, + // new() { ID = 9, Name = "Crests", InGameUrlID = 11 }, + // new() { ID = 10, Name = "Consumables & Accessories", InGameUrlID = 11 }, + // new() { ID = 11, Name = "Voice Templates & Shortcut Box", InGameUrlID = 11 }, + // new() { ID = 12, Name = "Lvl. 100 & Job Training Set", InGameUrlID = 11 }, + // new() { ID = 13, Name = "Pearl to be lvl. 100", InGameUrlID = 11 }, + // new() { ID = 14, Name = "Season 1-2 combat skills and job training all unlocked", InGameUrlID = 11 }, + // new() { ID = 15, Name = "!Limited time only!", InGameUrlID = 11 } + }; + res.Items = items; + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/GpShopGetBuyHistoryHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpShopGetBuyHistoryHandler.cs new file mode 100644 index 000000000..f8a005326 --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/GpShopGetBuyHistoryHandler.cs @@ -0,0 +1,34 @@ +#nullable enable +using System; +using Arrowgene.Ddon.Server; +using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Logging; + +namespace Arrowgene.Ddon.GameServer.Handler +{ + public class GpShopGetBuyHistoryHandler : GameRequestPacketHandler + { + private static readonly ServerLogger Logger = LogProvider.Logger(typeof(GpShopGetBuyHistoryHandler)); + + public GpShopGetBuyHistoryHandler(DdonGameServer server) : base(server) + { + } + + public override S2CGpShopGetBuyHistoryRes Handle(GameClient client, C2SGpShopGetBuyHistoryReq request) + { + S2CGpShopGetBuyHistoryRes res = new S2CGpShopGetBuyHistoryRes(); + + // TODO: track which GP shop items were bought before in DB + res.Items.Add(new CDataGPShopBuyHistoryElement + { + ID = 1, + Name = "Adventure Passport (history)", + Price = 1, + AcquisitionTime = (ulong)DateTimeOffset.UtcNow.ToUnixTimeSeconds() + }); + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/ItemGetItemStorageInfoHandler.cs b/Arrowgene.Ddon.GameServer/Handler/ItemGetItemStorageInfoHandler.cs new file mode 100644 index 000000000..38e252bad --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/ItemGetItemStorageInfoHandler.cs @@ -0,0 +1,36 @@ +#nullable enable +using Arrowgene.Ddon.Server; +using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Model; +using Arrowgene.Logging; + +namespace Arrowgene.Ddon.GameServer.Handler +{ + public class ItemGetItemStorageInfoHandler : GameRequestPacketHandler + { + private static readonly ServerLogger Logger = LogProvider.Logger(typeof(ItemGetItemStorageInfoHandler)); + + public ItemGetItemStorageInfoHandler(DdonGameServer server) : base(server) + { + } + + public override S2CItemGetItemStorageInfoRes Handle(GameClient client, C2SItemGetItemStorageInfoReq request) + { + S2CItemGetItemStorageInfoRes res = new S2CItemGetItemStorageInfoRes(); + + var itemPost = client.Character.Storage.GetStorage(StorageType.ItemPost); + res.GameItemStorageInfoList.Add(new CDataGameItemStorageInfo + { + GameItemStorage = new CDataGameItemStorage + { + StorageType = StorageType.ItemPost + }, + UsedSlotNum = itemPost.EmptySlots(), + MaxSlotNum = itemPost.MaxSlots() + }); + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/PawnGetFreeRentalPawnListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/PawnGetFreeRentalPawnListHandler.cs new file mode 100644 index 000000000..a59d628ca --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/PawnGetFreeRentalPawnListHandler.cs @@ -0,0 +1,48 @@ +using Arrowgene.Ddon.Server; +using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Model; +using Arrowgene.Logging; +using System; + +namespace Arrowgene.Ddon.GameServer.Handler +{ + public class PawnGetFreeRentalPawnListHandler : GameRequestPacketHandler + { + private static readonly ServerLogger Logger = LogProvider.Logger(typeof(PawnGetFreeRentalPawnListHandler)); + + public PawnGetFreeRentalPawnListHandler(DdonGameServer server) : base(server) + { + } + + public override S2CPawnGetFreeRentalPawnListRes Handle(GameClient client, C2SPawnGetFreeRentalPawnListReq request) + { + throw new ResponseErrorException(ErrorCode.ERROR_CODE_NOT_IMPLEMENTED); + + S2CPawnGetFreeRentalPawnListRes res = new S2CPawnGetFreeRentalPawnListRes(); + string urlBase = Server.GameSettings.GameServerSettings.UrlDomain; + + // TODO: track free rental pawns courses in DB + res.FreeRentalPawnList.Add( + new CDataFreeRentalPawnList + { + PawnId = 1, + Name = "FreeRentalPawn1 (active)", + ImageAddr = $"{urlBase}/shop/img/payment/icon_pawn1.png", + LineupId = 1, + ExpireDateTime = (ulong)DateTimeOffset.UtcNow.AddMonths(12).ToUnixTimeSeconds() + }); + res.FreeRentalPawnList.Add( + new CDataFreeRentalPawnList + { + PawnId = 2, + Name = "FreeRentalPawn2 (expired)", + ImageAddr = $"{urlBase}/shop/img/payment/icon_pawn1.png", + LineupId = 2, + ExpireDateTime = (ulong)DateTimeOffset.UtcNow.ToUnixTimeSeconds() - 1000 + }); + + return res; + } + } +} diff --git a/Arrowgene.Ddon.LoginServer/Handler/GetCharacterListHandler.cs b/Arrowgene.Ddon.LoginServer/Handler/GetCharacterListHandler.cs index ed5555830..be9b2bb10 100644 --- a/Arrowgene.Ddon.LoginServer/Handler/GetCharacterListHandler.cs +++ b/Arrowgene.Ddon.LoginServer/Handler/GetCharacterListHandler.cs @@ -48,8 +48,8 @@ public override L2CGetCharacterListRes Handle(LoginClient client, C2LGetCharacte { Id = c.CharacterId, CourseId = ValidCourse.Value.Id, - NameA = Server.AssetRepository.GPCourseInfoAsset.Courses[ValidCourse.Value.Id].Name, // Course Name - NameB = Server.AssetRepository.GPCourseInfoAsset.Courses[ValidCourse.Value.Id].IconPath, // Link to a icon + Name = Server.AssetRepository.GPCourseInfoAsset.Courses[ValidCourse.Value.Id].Name, // Course Name + ImageAddr = Server.AssetRepository.GPCourseInfoAsset.Courses[ValidCourse.Value.Id].IconPath, // Link to a icon }; if ((now >= ValidCourse.Value.StartTime) && (now <= ValidCourse.Value.EndTime)) diff --git a/Arrowgene.Ddon.Shared/Asset/GachaAsset.cs b/Arrowgene.Ddon.Shared/Asset/GachaAsset.cs new file mode 100644 index 000000000..de27a84e6 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Asset/GachaAsset.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using Arrowgene.Ddon.Shared.Entity.Structure; + +namespace Arrowgene.Ddon.Shared.Asset +{ + public class GachaAsset + { + public GachaAsset() + { + GachaInfoList = new Dictionary(); + } + public Dictionary GachaInfoList { get; set; } + } +} diff --git a/Arrowgene.Ddon.Shared/AssetReader/GachaAssetDeserializer.cs b/Arrowgene.Ddon.Shared/AssetReader/GachaAssetDeserializer.cs new file mode 100644 index 000000000..449cf0418 --- /dev/null +++ b/Arrowgene.Ddon.Shared/AssetReader/GachaAssetDeserializer.cs @@ -0,0 +1,102 @@ +using Arrowgene.Ddon.Shared.Asset; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Logging; +using System.Data; +using System; +using System.IO; +using System.Text.Json; +using Arrowgene.Ddon.Shared.Model; + +namespace Arrowgene.Ddon.Shared.AssetReader +{ + public class GachaAssetDeserializer : IAssetDeserializer + { + private static readonly ILogger Logger = LogProvider.Logger(typeof(GachaAssetDeserializer)); + + public GachaAsset ReadPath(string path) + { + Logger.Info($"Reading {path}"); + + GachaAsset asset = new GachaAsset(); + + string json = File.ReadAllText(path); + JsonDocument document = JsonDocument.Parse(json); + + foreach (var jLootBox in document.RootElement.GetProperty("boxes").EnumerateArray()) + { + var gachaInfo = new CDataGachaInfo() + { + Id = jLootBox.GetProperty("gacha_id").GetUInt32(), + Begin = jLootBox.GetProperty("start_time").GetInt64(), + End = jLootBox.GetProperty("end_time").GetInt64(), + Name = jLootBox.GetProperty("name").GetString(), + Description = jLootBox.GetProperty("description").GetString(), + Detail = jLootBox.GetProperty("detail").GetString(), + WeightDispType = jLootBox.GetProperty("weight_display_type").GetByte(), + WeightDispTitle = jLootBox.GetProperty("weight_display_title").GetString(), + WeightDispText = jLootBox.GetProperty("weight_display_text").GetString(), + ListAddr = jLootBox.GetProperty("list_address").GetString(), + ImageAddr = jLootBox.GetProperty("image_address").GetString(), + }; + + + var drawGroupInfo = new CDataGachaDrawGroupInfo(); + foreach (var jSettlementInfo in jLootBox.GetProperty("draw_groups").EnumerateArray()) + { + WalletType walletType; + if (!Enum.TryParse(jSettlementInfo.GetProperty("wallet_type").GetString(), true, out walletType)) + { + Logger.Error($"Failed to parse WalletType for {path}. Skipping."); + break; + } + + if (walletType != WalletType.GoldenGemstones && walletType != WalletType.SilverTickets) + { + Logger.Error($"The currency '{walletType}' is not a valid loot box currency. Skipping."); + break; + } + + var settlementInfo = new CDataGachaSettlementInfo() + { + Id = (walletType == WalletType.GoldenGemstones) ? 1u : 2u, + DrawGroupId = jSettlementInfo.GetProperty("group_id").GetUInt32(), + Price = jSettlementInfo.GetProperty("price").GetUInt32(), + BasePrice = jSettlementInfo.GetProperty("base_price").GetUInt32(), + PurchaseNum = jSettlementInfo.GetProperty("purchase_num").GetUInt32(), + PurchaseMaxNum = jSettlementInfo.GetProperty("purchase_max_num").GetUInt32(), + SpecialPriceNum = jSettlementInfo.GetProperty("special_price_num").GetUInt32(), + SpecialPriceMaxNum = jSettlementInfo.GetProperty("special_price_max_num").GetUInt32(), + Unk1 = jSettlementInfo.GetProperty("unk1").GetUInt32(), + }; + + drawGroupInfo.GachaSettlementList.Add(settlementInfo); + } + + var drawInfo = new CDataGachaDrawInfo() + { + Num = 1, + IsBonus = false + }; + + foreach (var jItem in jLootBox.GetProperty("draw_list").EnumerateArray()) + { + drawInfo.GachaItemInfo.Add(new CDataGachaItemInfo() + { + ItemId = jItem.GetProperty("item_id").GetUInt32(), + ItemNum = jItem.GetProperty("amount").GetUInt32(), + Rank = jItem.GetProperty("rank").GetUInt32(), + Effect = jItem.GetProperty("effect").GetUInt32(), + Probability = jItem.GetProperty("chance").GetDouble() + }); + } + drawGroupInfo.GachaDrawList.Add(drawInfo); + + gachaInfo.DrawGroups.Add(drawGroupInfo); + + asset.GachaInfoList[gachaInfo.Id] = gachaInfo; + } + + return asset; + } + } +} diff --git a/Arrowgene.Ddon.Shared/AssetRepository.cs b/Arrowgene.Ddon.Shared/AssetRepository.cs index c1643c7b3..43871b7d7 100644 --- a/Arrowgene.Ddon.Shared/AssetRepository.cs +++ b/Arrowgene.Ddon.Shared/AssetRepository.cs @@ -60,6 +60,7 @@ public class AssetRepository public const string AreaRankSpotInfoKey = "AreaRankSpotInfo.csv"; public const string AreaRankSupplyKey = "AreaRankSupply.json"; public const string AreaRankRequirementKey = "AreaRankRequirements.json"; + public const string GachaKey = "Gacha.json"; public const string QuestAssestKey = "quests"; public const string EpitaphAssestKey = "epitaph"; @@ -122,6 +123,7 @@ public AssetRepository(string folder) AreaRankSpotInfoAsset = new(); AreaRankSupplyAsset = new(); AreaRankRequirementAsset = new(); + GachaAsset = new(); } public Dictionary ClientErrorCodes { get; private set; } @@ -163,6 +165,7 @@ public AssetRepository(string folder) public Dictionary> AreaRankSpotInfoAsset { get; private set; } public Dictionary> AreaRankSupplyAsset { get; private set; } public Dictionary> AreaRankRequirementAsset { get; private set; } + public GachaAsset GachaAsset { get; private set; } public void Initialize() { @@ -203,6 +206,7 @@ public void Initialize() RegisterAsset(value => AreaRankSpotInfoAsset = value.GroupBy(key => key.AreaId, val => val).ToDictionary(g => g.Key, g=> g.ToList()), AreaRankSpotInfoKey, new AreaRankSpotInfoCsv()); RegisterAsset(value => AreaRankSupplyAsset = value, AreaRankSupplyKey, new AreaRankSupplyDeserializer()); RegisterAsset(value => AreaRankRequirementAsset = value, AreaRankRequirementKey, new AreaRankRequirementDeserializer()); + RegisterAsset(value => GachaAsset = value, GachaKey, new GachaAssetDeserializer()); // This must be set before calling QuestAssertDeserializer and EpitaphTrialAssertDeserializer var commonEnemyDeserializer = new AssetCommonDeserializer(this.NamedParamAsset); diff --git a/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs b/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs index 6a5aae2b9..89cbc0028 100644 --- a/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs +++ b/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs @@ -213,6 +213,23 @@ static EntitySerializer() Create(new CDataGoodsParamRequirement.Serializer()); Create(new CDataHasRegionBreakReward.Serializer()); + + Create(new CDataGPShopDisplayType.Serializer()); + Create(new CDataGPShopBuyHistoryElement.Serializer()); + + Create(new CDataGachaInfo.Serializer()); + Create(new CDataGachaDrawGroupInfo.Serializer()); + Create(new CDataGachaSettlementInfo.Serializer()); + Create(new CDataGachaDrawInfo.Serializer()); + Create(new CDataGachaItemInfo.Serializer()); + Create(new CDataBoxGachaInfo.Serializer()); + Create(new CDataBoxGachaItemInfo.Serializer()); + Create(new CDataBoxGachaSettlementInfo.Serializer()); + + Create(new CDataGameItemStorageInfo.Serializer()); + Create(new CDataGameItemStorage.Serializer()); + + Create(new CDataHistoryElement.Serializer()); Create(new CDataInformationParagraph.Serializer()); @@ -327,6 +344,7 @@ static EntitySerializer() Create(new CDataPawnHistory.Serializer()); Create(new CDataPawnHp.Serializer()); Create(new CDataPawnInfo.Serializer()); + Create(new CDataPawnJobChangeInfo.Serializer()); Create(new CDataPawnList.Serializer()); Create(new CDataPawnListData.Serializer()); @@ -676,6 +694,24 @@ static EntitySerializer() Create(new C2SGpGetValidChatComGroupReq.Serializer()); Create(new C2SGpGpEditGetVoiceListReq.Serializer()); + Create(new C2SGpShopDisplayGetTypeReq.Serializer()); + Create(new C2SGpCogGetIdReq.Serializer()); + Create(new C2SGpGetCapToGpChangeListReq.Serializer()); + Create(new C2SGpChangeCapToGpReq.Serializer()); + Create(new C2SGpCourseGetAvailableListReq.Serializer()); + Create(new C2SGpCourseGetValidListReq.Serializer()); + Create(new C2SGpShopGetBuyHistoryReq.Serializer()); + Create(new C2SGpCourseUseFromAvailableReq.Serializer()); + Create(new C2SGpGetCapReq.Serializer()); + + Create(new C2SGachaListReq.Serializer()); + Create(new C2SBoxGachaListReq.Serializer()); + Create(new C2SBoxGachaBuyReq.Serializer()); + Create(new C2SBoxGachaDrawInfoReq.Serializer()); + Create(new C2SGachaBuyReq.Serializer()); + + Create(new C2SEventCodeInputReq.Serializer()); + Create(new C2SInnGetPenaltyHealStayPriceReq.Serializer()); Create(new C2SInnGetStayPriceReq.Serializer()); Create(new C2SInnHpRecoveryCompleteNtc.Serializer()); @@ -708,6 +744,7 @@ static EntitySerializer() Create(new C2SItemEmbodyItemsReq.Serializer()); Create(new C2SItemGetDefaultStorageEmptySlotNumReq.Serializer()); Create(new C2SItemGetEmbodyPayCostReq.Serializer()); + Create(new C2SItemGetItemStorageInfoReq.Serializer()); Create(new C2SItemGetPostItemListReq.Serializer()); Create(new C2SItemGetSpecifiedHavingItemListReq.Serializer()); Create(new C2SItemGetStorageItemListReq.Serializer()); @@ -783,6 +820,7 @@ static EntitySerializer() Create(new C2SPawnCreatePawnReq.Serializer()); Create(new C2SPawnDeleteMyPawnReq.Serializer()); Create(new C2SPawnExpeditionGetSallyInfoReq.Serializer()); + Create(new C2SPawnGetFreeRentalPawnListReq.Serializer()); Create(new C2SPawnGetLostPawnListReq.Serializer()); Create(new C2SPawnGetMyPawnListReq.Serializer()); Create(new C2SPawnGetMypawnDataReq.Serializer()); @@ -1020,6 +1058,10 @@ static EntitySerializer() Create(new S2CBinarySaveSetCharacterBinSaveDataRes.Serializer()); + Create(new S2CBoxGachaBuyRes.Serializer()); + Create(new S2CBoxGachaDrawInfoRes.Serializer()); + Create(new S2CBoxGachaListRes.Serializer()); + Create(new S2CCertClientChallengeRes.Serializer()); Create(new S2CCharacterCharacterGoldenReviveRes.Serializer()); @@ -1202,6 +1244,9 @@ static EntitySerializer() Create(new S2CEquipUpdateHideCharacterLanternRes.Serializer()); Create(new S2CEquipUpdateHidePawnHeadArmorRes.Serializer()); Create(new S2CEquipUpdateHidePawnLanternRes.Serializer()); + + Create(new S2CEventCodeInputRes.Serializer()); + Create(new S2CExtendEquipSlotNtc.Serializer()); Create(new S2CFriendApplyFriendNtc.Serializer()); @@ -1215,15 +1260,26 @@ static EntitySerializer() Create(new S2CFriendRemoveFriendNtc.Serializer()); Create(new S2CFriendRemoveFriendRes.Serializer()); - Create(new S2CGPCourseExtendNtc.Serializer()); - Create(new S2CGPCourseStartNtc.Serializer()); + Create(new S2CGachaBuyRes.Serializer()); + Create(new S2CGachaListRes.Serializer()); + + Create(new S2CGpChangeCapToGpRes.Serializer()); + Create(new S2CGpCogGetIdRes.Serializer()); Create(new S2CGpCourseEndNtc.Serializer()); + Create(new S2CGpCourseExtendNtc.Serializer()); + Create(new S2CGpCourseGetValidListRes.Serializer()); + Create(new S2CGpCourseStartNtc.Serializer()); + Create(new S2CGpCourseUseFromAvailableRes.Serializer()); + Create(new S2CGpGetCapRes.Serializer()); + Create(new S2CGpGetCapToGpChangeListRes.Serializer()); Create(new S2CGpGetGpDetailRes.Serializer()); Create(new S2CGpGetGpPeriodRes.Serializer()); Create(new S2CGpGetGpRes.Serializer()); Create(new S2CGpGetValidChatComGroupRes.Serializer()); Create(new S2CGpGpCourseGetAvailableListRes.Serializer()); Create(new S2CGpGpEditGetVoiceListRes.Serializer()); + Create(new S2CGpShopDisplayGetTypeRes.Serializer()); + Create(new S2CGpShopGetBuyHistoryRes.Serializer()); Create(new S2CInnGetPenaltyHealStayPriceRes.Serializer()); Create(new S2CInnGetStayPriceRes.Serializer()); @@ -1264,6 +1320,7 @@ static EntitySerializer() Create(new S2CItemExtendItemSlotNtc.Serializer()); Create(new S2CItemGetDefaultStorageEmptySlotNumRes.Serializer()); Create(new S2CItemGetEmbodyPayCostRes.Serializer()); + Create(new S2CItemGetItemStorageInfoRes.Serializer()); Create(new S2CItemGetPostItemListRes.Serializer()); Create(new S2CItemGetSpecifiedHavingItemListRes.Serializer()); Create(new S2CItemGetStorageItemListRes.Serializer()); @@ -1379,6 +1436,7 @@ static EntitySerializer() Create(new S2CPawnExpeditionGetSallyInfoRes.Serializer()); Create(new S2CPawnExtendMainPawnSlotNtc.Serializer()); Create(new S2CPawnExtendSupportPawnSlotNtc.Serializer()); + Create(new S2CPawnGetFreeRentalPawnListRes.Serializer()); Create(new S2CPawnGetLostPawnListRes.Serializer()); Create(new S2CPawnGetMypawnDataRes.Serializer()); Create(new S2CPawnGetMypawnListRes.Serializer()); @@ -1786,6 +1844,15 @@ public static IStructurePacket CreateStructurePacket(Packet packet) private static void TestSerializers() { + // These handlers do some unusual manipulation of byte arrays and get a pass for being misaligned in this test. + HashSet knownMisalignmentHandlers = new() + { + typeof(C2LClientChallengeReq), + typeof(C2SCertClientChallengeReq), + typeof(S2CCertClientChallengeRes), + typeof(L2CClientChallengeRes) + }; + foreach (var serializer in Serializers) { try @@ -1797,9 +1864,9 @@ private static void TestSerializers() buffer.SetPositionStart(); serializer.Value.ReadObj(buffer); - if (buffer.Position != endPosition) + if (!knownMisalignmentHandlers.Contains(serializer.Key) && buffer.Position != endPosition) { - //throw new DataMisalignedException($"Serializer reading fewer bytes than are written. {buffer.Position} < {endPosition}"); + throw new DataMisalignedException($"Serializer reading fewer bytes than are written. {buffer.Position} < {endPosition}"); } } catch (Exception ex) diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SBoxGachaBuyReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SBoxGachaBuyReq.cs new file mode 100644 index 000000000..89bf677d2 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SBoxGachaBuyReq.cs @@ -0,0 +1,42 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class C2SBoxGachaBuyReq : IPacketStructure + { + public PacketId Id => PacketId.C2S_BOX_GACHA_BOX_GACHA_BUY_REQ; + + public uint BoxGachaId { get; set; } + public uint DrawId { get; set; } + public uint SettlementId { get; set; } + public uint Price { get; set; } + + public C2SBoxGachaBuyReq() + { + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, C2SBoxGachaBuyReq obj) + { + WriteUInt32(buffer, obj.BoxGachaId); + WriteUInt32(buffer, obj.DrawId); + WriteUInt32(buffer, obj.SettlementId); + WriteUInt32(buffer, obj.Price); + } + + public override C2SBoxGachaBuyReq Read(IBuffer buffer) + { + C2SBoxGachaBuyReq obj = new C2SBoxGachaBuyReq(); + + obj.BoxGachaId = ReadUInt32(buffer); + obj.DrawId = ReadUInt32(buffer); + obj.SettlementId = ReadUInt32(buffer); + obj.Price = ReadUInt32(buffer); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SBoxGachaDrawInfoReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SBoxGachaDrawInfoReq.cs new file mode 100644 index 000000000..74706dea9 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SBoxGachaDrawInfoReq.cs @@ -0,0 +1,33 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class C2SBoxGachaDrawInfoReq : IPacketStructure + { + public PacketId Id => PacketId.C2S_BOX_GACHA_BOX_GACHA_DRAW_INFO_REQ; + + public uint DrawId { get; set; } + + public C2SBoxGachaDrawInfoReq() + { + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, C2SBoxGachaDrawInfoReq obj) + { + WriteUInt32(buffer, obj.DrawId); + } + + public override C2SBoxGachaDrawInfoReq Read(IBuffer buffer) + { + C2SBoxGachaDrawInfoReq obj = new C2SBoxGachaDrawInfoReq(); + + obj.DrawId = ReadUInt32(buffer); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SBoxGachaListReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SBoxGachaListReq.cs new file mode 100644 index 000000000..fc30137ab --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SBoxGachaListReq.cs @@ -0,0 +1,28 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class C2SBoxGachaListReq : IPacketStructure + { + public PacketId Id => PacketId.C2S_BOX_GACHA_BOX_GACHA_LIST_REQ; + + public C2SBoxGachaListReq() + { + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, C2SBoxGachaListReq obj) + { + } + + public override C2SBoxGachaListReq Read(IBuffer buffer) + { + C2SBoxGachaListReq obj = new C2SBoxGachaListReq(); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SEventCodeInputReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SEventCodeInputReq.cs new file mode 100644 index 000000000..3c995d5ef --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SEventCodeInputReq.cs @@ -0,0 +1,33 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class C2SEventCodeInputReq : IPacketStructure + { + public PacketId Id => PacketId.C2S_EVENT_CODE_EVENT_CODE_INPUT_REQ; + + public string Code { get; set; } = string.Empty; + + public C2SEventCodeInputReq() + { + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, C2SEventCodeInputReq obj) + { + WriteMtString(buffer, obj.Code); + } + + public override C2SEventCodeInputReq Read(IBuffer buffer) + { + C2SEventCodeInputReq obj = new C2SEventCodeInputReq(); + + obj.Code = ReadMtString(buffer); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGachaBuyReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGachaBuyReq.cs new file mode 100644 index 000000000..180cd890f --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGachaBuyReq.cs @@ -0,0 +1,42 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class C2SGachaBuyReq : IPacketStructure + { + public PacketId Id => PacketId.C2S_GACHA_GACHA_BUY_REQ; + + public uint GachaId { get; set; } + public uint DrawGroupId { get; set; } + public uint SettlementId { get; set; } + public uint Price { get; set; } + + public C2SGachaBuyReq() + { + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, C2SGachaBuyReq obj) + { + WriteUInt32(buffer, obj.GachaId); + WriteUInt32(buffer, obj.DrawGroupId); + WriteUInt32(buffer, obj.SettlementId); + WriteUInt32(buffer, obj.Price); + } + + public override C2SGachaBuyReq Read(IBuffer buffer) + { + C2SGachaBuyReq obj = new C2SGachaBuyReq(); + + obj.GachaId = ReadUInt32(buffer); + obj.DrawGroupId = ReadUInt32(buffer); + obj.SettlementId = ReadUInt32(buffer); + obj.Price = ReadUInt32(buffer); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGachaListReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGachaListReq.cs new file mode 100644 index 000000000..bb526b0a7 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGachaListReq.cs @@ -0,0 +1,28 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class C2SGachaListReq : IPacketStructure + { + public PacketId Id => PacketId.C2S_GACHA_GACHA_LIST_REQ; + + public C2SGachaListReq() + { + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, C2SGachaListReq obj) + { + } + + public override C2SGachaListReq Read(IBuffer buffer) + { + C2SGachaListReq obj = new C2SGachaListReq(); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpChangeCapToGpReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpChangeCapToGpReq.cs new file mode 100644 index 000000000..4ad445643 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpChangeCapToGpReq.cs @@ -0,0 +1,33 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class C2SGpChangeCapToGpReq : IPacketStructure + { + public PacketId Id => PacketId.C2S_GP_CHANGE_CAP_TO_GP_REQ; + + public uint ChangeListID { get; set; } + + public C2SGpChangeCapToGpReq() + { + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, C2SGpChangeCapToGpReq obj) + { + WriteUInt32(buffer, obj.ChangeListID); + } + + public override C2SGpChangeCapToGpReq Read(IBuffer buffer) + { + C2SGpChangeCapToGpReq obj = new C2SGpChangeCapToGpReq(); + + obj.ChangeListID = ReadUInt32(buffer); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpCogGetIdReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpCogGetIdReq.cs new file mode 100644 index 000000000..6c33e7894 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpCogGetIdReq.cs @@ -0,0 +1,29 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Model; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class C2SGpCogGetIdReq : IPacketStructure + { + public PacketId Id => PacketId.C2S_GP_COG_GET_ID_REQ; + + public C2SGpCogGetIdReq() + { + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, C2SGpCogGetIdReq obj) + { + } + + public override C2SGpCogGetIdReq Read(IBuffer buffer) + { + C2SGpCogGetIdReq obj = new C2SGpCogGetIdReq(); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpCourseGetAvailableListReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpCourseGetAvailableListReq.cs new file mode 100644 index 000000000..c035f389d --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpCourseGetAvailableListReq.cs @@ -0,0 +1,28 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class C2SGpCourseGetAvailableListReq : IPacketStructure + { + public PacketId Id => PacketId.C2S_GP_GP_COURSE_GET_AVAILABLE_LIST_REQ; + + public C2SGpCourseGetAvailableListReq() + { + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, C2SGpCourseGetAvailableListReq obj) + { + } + + public override C2SGpCourseGetAvailableListReq Read(IBuffer buffer) + { + C2SGpCourseGetAvailableListReq obj = new C2SGpCourseGetAvailableListReq(); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpCourseGetValidListReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpCourseGetValidListReq.cs new file mode 100644 index 000000000..0651cb079 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpCourseGetValidListReq.cs @@ -0,0 +1,23 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure; + +public class C2SGpCourseGetValidListReq : IPacketStructure +{ + public PacketId Id => PacketId.C2S_GP_GP_COURSE_GET_VALID_LIST_REQ; + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, C2SGpCourseGetValidListReq obj) + { + } + + public override C2SGpCourseGetValidListReq Read(IBuffer buffer) + { + var obj = new C2SGpCourseGetValidListReq(); + + return obj; + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpCourseUseFromAvailableReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpCourseUseFromAvailableReq.cs new file mode 100644 index 000000000..2d3f8deb8 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpCourseUseFromAvailableReq.cs @@ -0,0 +1,33 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class C2SGpCourseUseFromAvailableReq : IPacketStructure + { + public PacketId Id => PacketId.C2S_GP_GP_COURSE_USE_FROM_AVAILABLE_REQ; + + public uint AvailableId { get; set; } + + public C2SGpCourseUseFromAvailableReq() + { + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, C2SGpCourseUseFromAvailableReq obj) + { + WriteUInt32(buffer, obj.AvailableId); + } + + public override C2SGpCourseUseFromAvailableReq Read(IBuffer buffer) + { + C2SGpCourseUseFromAvailableReq obj = new C2SGpCourseUseFromAvailableReq(); + + obj.AvailableId = ReadUInt32(buffer); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpGetCapReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpGetCapReq.cs new file mode 100644 index 000000000..51afe84aa --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpGetCapReq.cs @@ -0,0 +1,23 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure; + +public class C2SGpGetCapReq : IPacketStructure +{ + public PacketId Id => PacketId.C2S_GP_GET_CAP_REQ; + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, C2SGpGetCapReq obj) + { + } + + public override C2SGpGetCapReq Read(IBuffer buffer) + { + var obj = new C2SGpGetCapReq(); + + return obj; + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpGetCapToGpChangeListReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpGetCapToGpChangeListReq.cs new file mode 100644 index 000000000..b1c6023d4 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpGetCapToGpChangeListReq.cs @@ -0,0 +1,29 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Model; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class C2SGpGetCapToGpChangeListReq : IPacketStructure + { + public PacketId Id => PacketId.C2S_GP_GET_CAP_TO_GP_CHANGE_LIST_REQ; + + public C2SGpGetCapToGpChangeListReq() + { + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, C2SGpGetCapToGpChangeListReq obj) + { + } + + public override C2SGpGetCapToGpChangeListReq Read(IBuffer buffer) + { + C2SGpGetCapToGpChangeListReq obj = new C2SGpGetCapToGpChangeListReq(); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpShopDisplayGetTypeReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpShopDisplayGetTypeReq.cs new file mode 100644 index 000000000..de9f85f40 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpShopDisplayGetTypeReq.cs @@ -0,0 +1,29 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Model; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class C2SGpShopDisplayGetTypeReq : IPacketStructure + { + public PacketId Id => PacketId.C2S_GP_GP_SHOP_DISPLAY_GET_TYPE_REQ; + + public C2SGpShopDisplayGetTypeReq() + { + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, C2SGpShopDisplayGetTypeReq obj) + { + } + + public override C2SGpShopDisplayGetTypeReq Read(IBuffer buffer) + { + C2SGpShopDisplayGetTypeReq obj = new C2SGpShopDisplayGetTypeReq(); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpShopGetBuyHistoryReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpShopGetBuyHistoryReq.cs new file mode 100644 index 000000000..44f58c422 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpShopGetBuyHistoryReq.cs @@ -0,0 +1,28 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class C2SGpShopGetBuyHistoryReq : IPacketStructure + { + public PacketId Id => PacketId.C2S_GP_GP_SHOP_GET_BUY_HISTORY_REQ; + + public C2SGpShopGetBuyHistoryReq() + { + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, C2SGpShopGetBuyHistoryReq obj) + { + } + + public override C2SGpShopGetBuyHistoryReq Read(IBuffer buffer) + { + C2SGpShopGetBuyHistoryReq obj = new C2SGpShopGetBuyHistoryReq(); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SItemGetItemStorageInfoReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SItemGetItemStorageInfoReq.cs new file mode 100644 index 000000000..2c5bcfd10 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SItemGetItemStorageInfoReq.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class C2SItemGetItemStorageInfoReq : IPacketStructure + { + public PacketId Id => PacketId.C2S_ITEM_GET_ITEM_STORAGE_INFO_REQ; + + public List GameItemStorageList; + + public C2SItemGetItemStorageInfoReq() + { + GameItemStorageList = new List(); + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, C2SItemGetItemStorageInfoReq obj) + { + WriteEntityList(buffer, obj.GameItemStorageList); + } + + public override C2SItemGetItemStorageInfoReq Read(IBuffer buffer) + { + C2SItemGetItemStorageInfoReq obj = new C2SItemGetItemStorageInfoReq(); + + obj.GameItemStorageList = ReadEntityList(buffer); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SPawnGetFreeRentalPawnListReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SPawnGetFreeRentalPawnListReq.cs new file mode 100644 index 000000000..ee0a31428 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SPawnGetFreeRentalPawnListReq.cs @@ -0,0 +1,28 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class C2SPawnGetFreeRentalPawnListReq : IPacketStructure + { + public PacketId Id => PacketId.C2S_PAWN_GET_FREE_RENTAL_PAWN_LIST_REQ; + + public C2SPawnGetFreeRentalPawnListReq() + { + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, C2SPawnGetFreeRentalPawnListReq obj) + { + } + + public override C2SPawnGetFreeRentalPawnListReq Read(IBuffer buffer) + { + C2SPawnGetFreeRentalPawnListReq obj = new C2SPawnGetFreeRentalPawnListReq(); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CBoxGachaBuyRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CBoxGachaBuyRes.cs new file mode 100644 index 000000000..ac7976e0a --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CBoxGachaBuyRes.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class S2CBoxGachaBuyRes : ServerResponse + { + public override PacketId Id => PacketId.S2C_BOX_GACHA_BOX_GACHA_BUY_RES; + + public uint BoxGachaId { get; set; } + public List BoxGachaItemList { get; set; } + + public S2CBoxGachaBuyRes() + { + BoxGachaItemList = new List(); + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, S2CBoxGachaBuyRes obj) + { + WriteServerResponse(buffer, obj); + + WriteUInt32(buffer, obj.BoxGachaId); + WriteEntityList(buffer, obj.BoxGachaItemList); + } + + public override S2CBoxGachaBuyRes Read(IBuffer buffer) + { + S2CBoxGachaBuyRes obj = new S2CBoxGachaBuyRes(); + + ReadServerResponse(buffer, obj); + + obj.BoxGachaId = ReadUInt32(buffer); + obj.BoxGachaItemList = ReadEntityList(buffer); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CBoxGachaDrawInfoRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CBoxGachaDrawInfoRes.cs new file mode 100644 index 000000000..41ca00de0 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CBoxGachaDrawInfoRes.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class S2CBoxGachaDrawInfoRes : ServerResponse + { + public override PacketId Id => PacketId.S2C_BOX_GACHA_BOX_GACHA_DRAW_INFO_RES; + + public uint BoxGachaId { get; set; } + public List BoxGachaItemList { get; set; } + + public S2CBoxGachaDrawInfoRes() + { + BoxGachaItemList = new List(); + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, S2CBoxGachaDrawInfoRes obj) + { + WriteServerResponse(buffer, obj); + + WriteUInt32(buffer, obj.BoxGachaId); + WriteEntityList(buffer, obj.BoxGachaItemList); + } + + public override S2CBoxGachaDrawInfoRes Read(IBuffer buffer) + { + S2CBoxGachaDrawInfoRes obj = new S2CBoxGachaDrawInfoRes(); + + ReadServerResponse(buffer, obj); + + obj.BoxGachaId = ReadUInt32(buffer); + obj.BoxGachaItemList = ReadEntityList(buffer); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CBoxGachaListRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CBoxGachaListRes.cs new file mode 100644 index 000000000..75458e584 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CBoxGachaListRes.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class S2CBoxGachaListRes : ServerResponse + { + public override PacketId Id => PacketId.S2C_BOX_GACHA_BOX_GACHA_LIST_RES; + + public List BoxGachaList { get; set; } + + public S2CBoxGachaListRes() + { + BoxGachaList = new List(); + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, S2CBoxGachaListRes obj) + { + WriteServerResponse(buffer, obj); + + WriteEntityList(buffer, obj.BoxGachaList); + } + + public override S2CBoxGachaListRes Read(IBuffer buffer) + { + S2CBoxGachaListRes obj = new S2CBoxGachaListRes(); + + ReadServerResponse(buffer, obj); + + obj.BoxGachaList = ReadEntityList(buffer); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CEventCodeInputRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CEventCodeInputRes.cs new file mode 100644 index 000000000..28b2d7f9c --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CEventCodeInputRes.cs @@ -0,0 +1,37 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class S2CEventCodeInputRes : ServerResponse + { + public override PacketId Id => PacketId.S2C_EVENT_CODE_EVENT_CODE_INPUT_RES; + + public string Name { get; set; } = string.Empty; + + public S2CEventCodeInputRes() + { + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, S2CEventCodeInputRes obj) + { + WriteServerResponse(buffer, obj); + + WriteMtString(buffer, obj.Name); + } + + public override S2CEventCodeInputRes Read(IBuffer buffer) + { + S2CEventCodeInputRes obj = new S2CEventCodeInputRes(); + + ReadServerResponse(buffer, obj); + + obj.Name = ReadMtString(buffer); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGPCourseExtendNtc.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGPCourseExtendNtc.cs index 258786d11..50a1e999e 100644 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGPCourseExtendNtc.cs +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGPCourseExtendNtc.cs @@ -4,24 +4,24 @@ namespace Arrowgene.Ddon.Shared.Entity.PacketStructure { - public class S2CGPCourseExtendNtc : IPacketStructure + public class S2CGpCourseExtendNtc : IPacketStructure { public PacketId Id => PacketId.S2C_GP_COURSE_EXTEND_NTC; public UInt32 CourseID { get; set; } public UInt64 ExpiryTimestamp { get; set; } - public class Serializer : PacketEntitySerializer + public class Serializer : PacketEntitySerializer { - public override void Write(IBuffer buffer, S2CGPCourseExtendNtc obj) + public override void Write(IBuffer buffer, S2CGpCourseExtendNtc obj) { WriteUInt32(buffer, obj.CourseID); WriteUInt64(buffer, obj.ExpiryTimestamp); } - public override S2CGPCourseExtendNtc Read(IBuffer buffer) + public override S2CGpCourseExtendNtc Read(IBuffer buffer) { - S2CGPCourseExtendNtc obj = new S2CGPCourseExtendNtc(); + S2CGpCourseExtendNtc obj = new S2CGpCourseExtendNtc(); obj.CourseID = ReadUInt32(buffer); obj.ExpiryTimestamp = ReadUInt64(buffer); return obj; diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGPCourseStartNtc.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGPCourseStartNtc.cs index 5b3098d1e..7a6bbfd9d 100644 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGPCourseStartNtc.cs +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGPCourseStartNtc.cs @@ -1,10 +1,9 @@ using Arrowgene.Buffers; using Arrowgene.Ddon.Shared.Network; -using System; namespace Arrowgene.Ddon.Shared.Entity.PacketStructure { - public class S2CGPCourseStartNtc : IPacketStructure + public class S2CGpCourseStartNtc : IPacketStructure { public PacketId Id => PacketId.S2C_GP_COURSE_START_NTC; @@ -12,18 +11,18 @@ public class S2CGPCourseStartNtc : IPacketStructure public ulong ExpiryTimestamp { get; set; } public uint AnnounceType { get; set; } - public class Serializer : PacketEntitySerializer + public class Serializer : PacketEntitySerializer { - public override void Write(IBuffer buffer, S2CGPCourseStartNtc obj) + public override void Write(IBuffer buffer, S2CGpCourseStartNtc obj) { WriteUInt32(buffer, obj.CourseID); WriteUInt64(buffer, obj.ExpiryTimestamp); WriteUInt32(buffer, obj.AnnounceType); } - public override S2CGPCourseStartNtc Read(IBuffer buffer) + public override S2CGpCourseStartNtc Read(IBuffer buffer) { - S2CGPCourseStartNtc obj = new S2CGPCourseStartNtc(); + S2CGpCourseStartNtc obj = new S2CGpCourseStartNtc(); obj.CourseID = ReadUInt32(buffer); obj.ExpiryTimestamp = ReadUInt64(buffer); obj.AnnounceType = ReadUInt32(buffer); diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGachaBuyRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGachaBuyRes.cs new file mode 100644 index 000000000..6ea29f069 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGachaBuyRes.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class S2CGachaBuyRes : ServerResponse + { + public override PacketId Id => PacketId.S2C_GACHA_GACHA_BUY_RES; + + public uint GachaId { get; set; } + public List GachaItemList { get; set; } + + public S2CGachaBuyRes() + { + GachaItemList = new List(); + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, S2CGachaBuyRes obj) + { + WriteServerResponse(buffer, obj); + + WriteUInt32(buffer, obj.GachaId); + WriteEntityList(buffer, obj.GachaItemList); + } + + public override S2CGachaBuyRes Read(IBuffer buffer) + { + S2CGachaBuyRes obj = new S2CGachaBuyRes(); + + ReadServerResponse(buffer, obj); + + obj.GachaId = ReadUInt32(buffer); + obj.GachaItemList = ReadEntityList(buffer); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGachaListRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGachaListRes.cs new file mode 100644 index 000000000..0264e178c --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGachaListRes.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class S2CGachaListRes : ServerResponse + { + public override PacketId Id => PacketId.S2C_GACHA_GACHA_LIST_RES; + + public List GachaList { get; set; } + + public S2CGachaListRes() + { + GachaList = new List(); + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, S2CGachaListRes obj) + { + WriteServerResponse(buffer, obj); + + WriteEntityList(buffer, obj.GachaList); + } + + public override S2CGachaListRes Read(IBuffer buffer) + { + S2CGachaListRes obj = new S2CGachaListRes(); + + ReadServerResponse(buffer, obj); + + obj.GachaList = ReadEntityList(buffer); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpChangeCapToGpRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpChangeCapToGpRes.cs new file mode 100644 index 000000000..db0cf1fe8 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpChangeCapToGpRes.cs @@ -0,0 +1,43 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class S2CGpChangeCapToGpRes : ServerResponse + { + public override PacketId Id => PacketId.S2C_GP_CHANGE_CAP_TO_GP_RES; + + public uint ChangeListID { get; set; } + public uint GP { get; set; } + public uint CAP { get; set; } + + public S2CGpChangeCapToGpRes() + { + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, S2CGpChangeCapToGpRes obj) + { + WriteServerResponse(buffer, obj); + + WriteUInt32(buffer, obj.ChangeListID); + WriteUInt32(buffer, obj.GP); + WriteUInt32(buffer, obj.CAP); + } + + public override S2CGpChangeCapToGpRes Read(IBuffer buffer) + { + S2CGpChangeCapToGpRes obj = new S2CGpChangeCapToGpRes(); + + ReadServerResponse(buffer, obj); + + obj.ChangeListID = ReadUInt32(buffer); + obj.GP = ReadUInt32(buffer); + obj.CAP = ReadUInt32(buffer); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpCogGetIdRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpCogGetIdRes.cs new file mode 100644 index 000000000..be4b2342f --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpCogGetIdRes.cs @@ -0,0 +1,37 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class S2CGpCogGetIdRes : ServerResponse + { + public override PacketId Id => PacketId.S2C_GP_COG_GET_ID_RES; + + public string CogId { get; set; } = string.Empty; + + public S2CGpCogGetIdRes() + { + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, S2CGpCogGetIdRes obj) + { + WriteServerResponse(buffer, obj); + + WriteMtString(buffer, obj.CogId); + } + + public override S2CGpCogGetIdRes Read(IBuffer buffer) + { + S2CGpCogGetIdRes obj = new S2CGpCogGetIdRes(); + + ReadServerResponse(buffer, obj); + + obj.CogId = ReadMtString(buffer); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpCourseGetValidListRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpCourseGetValidListRes.cs new file mode 100644 index 000000000..2a864e7df --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpCourseGetValidListRes.cs @@ -0,0 +1,39 @@ +using System.Collections.Generic; +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure; + +public class S2CGpCourseGetValidListRes : ServerResponse +{ + public S2CGpCourseGetValidListRes() + { + Items = new List(); + } + + public override PacketId Id => PacketId.S2C_GP_GP_COURSE_GET_VALID_LIST_RES; + + public List Items { get; set; } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, S2CGpCourseGetValidListRes obj) + { + WriteServerResponse(buffer, obj); + + WriteEntityList(buffer, obj.Items); + } + + public override S2CGpCourseGetValidListRes Read(IBuffer buffer) + { + var obj = new S2CGpCourseGetValidListRes(); + + ReadServerResponse(buffer, obj); + + obj.Items = ReadEntityList(buffer); + + return obj; + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpCourseUseFromAvailableRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpCourseUseFromAvailableRes.cs new file mode 100644 index 000000000..908f744eb --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpCourseUseFromAvailableRes.cs @@ -0,0 +1,32 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure; + +public class S2CGpCourseUseFromAvailableRes : ServerResponse +{ + public override PacketId Id => PacketId.S2C_GP_GP_COURSE_USE_FROM_AVAILABLE_RES; + + public ulong FinishDateTime { get; set; } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, S2CGpCourseUseFromAvailableRes obj) + { + WriteServerResponse(buffer, obj); + + WriteUInt64(buffer, obj.FinishDateTime); + } + + public override S2CGpCourseUseFromAvailableRes Read(IBuffer buffer) + { + var obj = new S2CGpCourseUseFromAvailableRes(); + + ReadServerResponse(buffer, obj); + + obj.FinishDateTime = ReadUInt64(buffer); + + return obj; + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetCapRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetCapRes.cs new file mode 100644 index 000000000..55da16e2b --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetCapRes.cs @@ -0,0 +1,32 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure; + +public class S2CGpGetCapRes : ServerResponse +{ + public override PacketId Id => PacketId.S2C_GP_GET_CAP_RES; + + public uint CAP { get; set; } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, S2CGpGetCapRes obj) + { + WriteServerResponse(buffer, obj); + + WriteUInt32(buffer, obj.CAP); + } + + public override S2CGpGetCapRes Read(IBuffer buffer) + { + var obj = new S2CGpGetCapRes(); + + ReadServerResponse(buffer, obj); + + obj.CAP = ReadUInt32(buffer); + + return obj; + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetCapToGpChangeListRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetCapToGpChangeListRes.cs new file mode 100644 index 000000000..6c7fd3c94 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetCapToGpChangeListRes.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class S2CGpGetCapToGpChangeListRes : ServerResponse + { + public override PacketId Id => PacketId.S2C_GP_GET_CAP_TO_GP_CHANGE_LIST_RES; + + public List List { get; set; } + + public S2CGpGetCapToGpChangeListRes() + { + List = new List(); + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, S2CGpGetCapToGpChangeListRes obj) + { + WriteServerResponse(buffer, obj); + + WriteEntityList(buffer, obj.List); + } + + public override S2CGpGetCapToGpChangeListRes Read(IBuffer buffer) + { + S2CGpGetCapToGpChangeListRes obj = new S2CGpGetCapToGpChangeListRes(); + + ReadServerResponse(buffer, obj); + + obj.List = ReadEntityList(buffer); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpDetailRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpDetailRes.cs index 95aa41321..8362d27b6 100644 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpDetailRes.cs +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpDetailRes.cs @@ -1,11 +1,7 @@ +using System.Collections.Generic; using Arrowgene.Buffers; using Arrowgene.Ddon.Shared.Entity.Structure; using Arrowgene.Ddon.Shared.Network; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Arrowgene.Ddon.Shared.Entity.PacketStructure { diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpPeriodRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpPeriodRes.cs index 35edf0ff3..cc2ee9c9a 100644 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpPeriodRes.cs +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpPeriodRes.cs @@ -1,11 +1,7 @@ +using System.Collections.Generic; using Arrowgene.Buffers; using Arrowgene.Ddon.Shared.Entity.Structure; using Arrowgene.Ddon.Shared.Network; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Arrowgene.Ddon.Shared.Entity.PacketStructure { diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpRes.cs index fdb99edc9..80dbf743a 100644 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpRes.cs +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpRes.cs @@ -10,11 +10,10 @@ public class S2CGpGetGpRes : ServerResponse public S2CGpGetGpRes() { - RealTime = DateTimeOffset.MinValue; } public uint GP { get; set; } - public long UseLimit { get; set; } + public DateTimeOffset UseLimit { get; set; } public DateTimeOffset RealTime { get; set; } public class Serializer : PacketEntitySerializer @@ -23,9 +22,9 @@ public override void Write(IBuffer buffer, S2CGpGetGpRes obj) { WriteServerResponse(buffer, obj); WriteUInt32(buffer, obj.GP); - WriteInt64(buffer, obj.UseLimit); + WriteInt64(buffer, obj.UseLimit.ToUnixTimeSeconds()); WriteInt64(buffer, obj.RealTime.ToUnixTimeSeconds()); - WriteUInt16(buffer, (ushort) obj.RealTime.Millisecond); + WriteUInt16(buffer, (ushort)obj.RealTime.Millisecond); } public override S2CGpGetGpRes Read(IBuffer buffer) @@ -33,10 +32,10 @@ public override S2CGpGetGpRes Read(IBuffer buffer) S2CGpGetGpRes obj = new S2CGpGetGpRes(); ReadServerResponse(buffer, obj); obj.GP = ReadUInt32(buffer); - obj.UseLimit = ReadInt64(buffer); + obj.UseLimit = DateTimeOffset.FromUnixTimeSeconds(ReadInt64(buffer)); long unixTimeSeconds = ReadInt64(buffer); - ushort unixTimeMilliseconds = ReadUInt16(buffer); - obj.RealTime = DateTimeOffset.FromUnixTimeSeconds((long) unixTimeSeconds).AddMilliseconds(unixTimeMilliseconds); + var milliseconds = ReadUInt16(buffer); + obj.RealTime = DateTimeOffset.FromUnixTimeSeconds(unixTimeSeconds).AddMilliseconds(milliseconds); return obj; } } diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGpCourseGetAvailableListRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGpCourseGetAvailableListRes.cs index 00e89237f..435f6ac92 100644 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGpCourseGetAvailableListRes.cs +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGpCourseGetAvailableListRes.cs @@ -1,7 +1,7 @@ +using System.Collections.Generic; using Arrowgene.Buffers; using Arrowgene.Ddon.Shared.Entity.Structure; using Arrowgene.Ddon.Shared.Network; -using System.Collections.Generic; namespace Arrowgene.Ddon.Shared.Entity.PacketStructure { @@ -9,26 +9,26 @@ public class S2CGpGpCourseGetAvailableListRes : ServerResponse { public override PacketId Id => PacketId.S2C_GP_GP_COURSE_GET_AVAILABLE_LIST_RES; + public List Items { get; set; } + public S2CGpGpCourseGetAvailableListRes() { - AvailableCourses = new List(); + Items = new List(); } - public List AvailableCourses { get; set; } - public class Serializer : PacketEntitySerializer { public override void Write(IBuffer buffer, S2CGpGpCourseGetAvailableListRes obj) { WriteServerResponse(buffer, obj); - WriteEntityList(buffer, obj.AvailableCourses); + WriteEntityList(buffer, obj.Items); } public override S2CGpGpCourseGetAvailableListRes Read(IBuffer buffer) { S2CGpGpCourseGetAvailableListRes obj = new S2CGpGpCourseGetAvailableListRes(); ReadServerResponse(buffer, obj); - obj.AvailableCourses = ReadEntityList(buffer); + obj.Items = ReadEntityList(buffer); return obj; } } diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpShopDisplayGetTypeRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpShopDisplayGetTypeRes.cs new file mode 100644 index 000000000..bd4976ac6 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpShopDisplayGetTypeRes.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class S2CGpShopDisplayGetTypeRes : ServerResponse + { + public override PacketId Id => PacketId.S2C_GP_GP_SHOP_DISPLAY_GET_TYPE_RES; + + public List Items { get; set; } + + public S2CGpShopDisplayGetTypeRes() + { + Items = new List(); + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, S2CGpShopDisplayGetTypeRes obj) + { + WriteServerResponse(buffer, obj); + + WriteEntityList(buffer, obj.Items); + } + + public override S2CGpShopDisplayGetTypeRes Read(IBuffer buffer) + { + S2CGpShopDisplayGetTypeRes obj = new S2CGpShopDisplayGetTypeRes(); + + ReadServerResponse(buffer, obj); + + obj.Items = ReadEntityList(buffer); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpShopGetBuyHistoryRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpShopGetBuyHistoryRes.cs new file mode 100644 index 000000000..fe82bf907 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpShopGetBuyHistoryRes.cs @@ -0,0 +1,39 @@ +using System.Collections.Generic; +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure; + +public class S2CGpShopGetBuyHistoryRes : ServerResponse +{ + public S2CGpShopGetBuyHistoryRes() + { + Items = new List(); + } + + public override PacketId Id => PacketId.S2C_GP_GP_SHOP_GET_BUY_HISTORY_RES; + + public List Items { get; set; } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, S2CGpShopGetBuyHistoryRes obj) + { + WriteServerResponse(buffer, obj); + + WriteEntityList(buffer, obj.Items); + } + + public override S2CGpShopGetBuyHistoryRes Read(IBuffer buffer) + { + var obj = new S2CGpShopGetBuyHistoryRes(); + + ReadServerResponse(buffer, obj); + + obj.Items = ReadEntityList(buffer); + + return obj; + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CItemGetItemStorageInfoRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CItemGetItemStorageInfoRes.cs new file mode 100644 index 000000000..602d5a35f --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CItemGetItemStorageInfoRes.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class S2CItemGetItemStorageInfoRes : ServerResponse + { + public override PacketId Id => PacketId.S2C_ITEM_GET_ITEM_STORAGE_INFO_RES; + + public List GameItemStorageInfoList { get; set; } + + public S2CItemGetItemStorageInfoRes() + { + GameItemStorageInfoList = new List(); + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, S2CItemGetItemStorageInfoRes obj) + { + WriteServerResponse(buffer, obj); + + WriteEntityList(buffer, obj.GameItemStorageInfoList); + } + + public override S2CItemGetItemStorageInfoRes Read(IBuffer buffer) + { + S2CItemGetItemStorageInfoRes obj = new S2CItemGetItemStorageInfoRes(); + + ReadServerResponse(buffer, obj); + + obj.GameItemStorageInfoList = ReadEntityList(buffer); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CPawnGetFreeRentalPawnListRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CPawnGetFreeRentalPawnListRes.cs new file mode 100644 index 000000000..a69ef1702 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CPawnGetFreeRentalPawnListRes.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Entity.Structure; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class S2CPawnGetFreeRentalPawnListRes : ServerResponse + { + public override PacketId Id => PacketId.S2C_PAWN_GET_FREE_RENTAL_PAWN_LIST_RES; + + public List FreeRentalPawnList { get; set; } + + public S2CPawnGetFreeRentalPawnListRes() + { + FreeRentalPawnList = new List(); + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, S2CPawnGetFreeRentalPawnListRes obj) + { + WriteServerResponse(buffer, obj); + + WriteEntityList(buffer, obj.FreeRentalPawnList); + } + + public override S2CPawnGetFreeRentalPawnListRes Read(IBuffer buffer) + { + S2CPawnGetFreeRentalPawnListRes obj = new S2CPawnGetFreeRentalPawnListRes(); + + ReadServerResponse(buffer, obj); + + obj.FreeRentalPawnList = ReadEntityList(buffer); + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataBoxGachaInfo.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataBoxGachaInfo.cs new file mode 100644 index 000000000..2f89269a4 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataBoxGachaInfo.cs @@ -0,0 +1,70 @@ +using System.Collections.Generic; +using Arrowgene.Buffers; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataBoxGachaInfo + { + public uint Id { get; set; } + public long Begin { get; set; } + public long End { get; set; } + public bool Unk1 { get; set; } + public string Name { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public string Detail { get; set; } = string.Empty; + public byte WeightDispType { get; set; } + public string FreeSpaceText { get; set; } = string.Empty; + public string ListAddr { get; set; } = string.Empty; + public string ImageAddr { get; set; } = string.Empty; + public List SettlementList { get; set; } + public List BoxGachaSets { get; set; } + + public CDataBoxGachaInfo() + { + SettlementList = new List(); + BoxGachaSets = new List(); + } + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataBoxGachaInfo obj) + { + WriteUInt32(buffer, obj.Id); + WriteInt64(buffer, obj.Begin); + WriteInt64(buffer, obj.End); + WriteBool(buffer, obj.Unk1); + WriteMtString(buffer, obj.Name); + WriteMtString(buffer, obj.Description); + WriteMtString(buffer, obj.Detail); + WriteByte(buffer, obj.WeightDispType); + WriteMtString(buffer, obj.FreeSpaceText); + WriteMtString(buffer, obj.ListAddr); + WriteMtString(buffer, obj.ImageAddr); + WriteEntityList(buffer, obj.SettlementList); + WriteEntityList(buffer, obj.BoxGachaSets); + } + + public override CDataBoxGachaInfo Read(IBuffer buffer) + { + CDataBoxGachaInfo obj = new CDataBoxGachaInfo + { + Id = ReadUInt32(buffer), + Begin = ReadInt64(buffer), + End = ReadInt64(buffer), + Unk1 = ReadBool(buffer), + Name = ReadMtString(buffer), + Description = ReadMtString(buffer), + Detail = ReadMtString(buffer), + WeightDispType = ReadByte(buffer), + FreeSpaceText = ReadMtString(buffer), + ListAddr = ReadMtString(buffer), + ImageAddr = ReadMtString(buffer), + SettlementList = ReadEntityList(buffer), + BoxGachaSets = ReadEntityList(buffer) + }; + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataBoxGachaItemInfo.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataBoxGachaItemInfo.cs new file mode 100644 index 000000000..0acbadf9f --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataBoxGachaItemInfo.cs @@ -0,0 +1,49 @@ +using Arrowgene.Buffers; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataBoxGachaItemInfo + { + public uint ItemId { get; set; } + public uint ItemNum { get; set; } + public uint ItemStock { get; set; } + public uint Rank { get; set; } + public uint Effect { get; set; } + public double Probability { get; set; } + public ushort DrawNum { get; set; } + + public CDataBoxGachaItemInfo() + { + } + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataBoxGachaItemInfo obj) + { + WriteUInt32(buffer, obj.ItemId); + WriteUInt32(buffer, obj.ItemNum); + WriteUInt32(buffer, obj.ItemStock); + WriteUInt32(buffer, obj.Rank); + WriteUInt32(buffer, obj.Effect); + WriteDouble(buffer, obj.Probability); + WriteUInt16(buffer, obj.DrawNum); + } + + public override CDataBoxGachaItemInfo Read(IBuffer buffer) + { + CDataBoxGachaItemInfo obj = new CDataBoxGachaItemInfo + { + ItemId = ReadUInt32(buffer), + ItemNum = ReadUInt32(buffer), + ItemStock = ReadUInt32(buffer), + Rank = ReadUInt32(buffer), + Effect = ReadUInt32(buffer), + Probability = ReadDouble(buffer), + DrawNum = ReadUInt16(buffer) + }; + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataBoxGachaSettlementInfo.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataBoxGachaSettlementInfo.cs new file mode 100644 index 000000000..88737f693 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataBoxGachaSettlementInfo.cs @@ -0,0 +1,61 @@ +using Arrowgene.Buffers; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataBoxGachaSettlementInfo + { + public uint DrawId { get; set; } + public uint Id { get; set; } + public uint Price { get; set; } + public uint BasePrice { get; set; } + public byte DrawNum { get; set; } + public byte BonusNum { get; set; } + public uint PurchaseNum { get; set; } + public uint PurchaseMaxNum { get; set; } + public uint SpecialPriceNum { get; set; } + public uint SpecialPriceMaxNum { get; set; } + public uint Unk1 { get; set; } + + public CDataBoxGachaSettlementInfo() + { + } + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataBoxGachaSettlementInfo obj) + { + WriteUInt32(buffer, obj.DrawId); + WriteUInt32(buffer, obj.Id); + WriteUInt32(buffer, obj.Price); + WriteUInt32(buffer, obj.BasePrice); + WriteUInt32(buffer, obj.PurchaseNum); + WriteByte(buffer, obj.DrawNum); + WriteByte(buffer, obj.BonusNum); + WriteUInt32(buffer, obj.PurchaseMaxNum); + WriteUInt32(buffer, obj.SpecialPriceNum); + WriteUInt32(buffer, obj.SpecialPriceMaxNum); + WriteUInt32(buffer, obj.Unk1); + } + + public override CDataBoxGachaSettlementInfo Read(IBuffer buffer) + { + CDataBoxGachaSettlementInfo obj = new CDataBoxGachaSettlementInfo + { + DrawId = ReadUInt32(buffer), + Id = ReadUInt32(buffer), + Price = ReadUInt32(buffer), + BasePrice = ReadUInt32(buffer), + DrawNum = ReadByte(buffer), + BonusNum = ReadByte(buffer), + PurchaseNum = ReadUInt32(buffer), + PurchaseMaxNum = ReadUInt32(buffer), + SpecialPriceNum = ReadUInt32(buffer), + SpecialPriceMaxNum = ReadUInt32(buffer), + Unk1 = ReadUInt32(buffer) + }; + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataCAPtoGPChangeElement.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataCAPtoGPChangeElement.cs new file mode 100644 index 000000000..38cec6369 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataCAPtoGPChangeElement.cs @@ -0,0 +1,48 @@ +using Arrowgene.Buffers; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataCAPtoGPChangeElement + { + public uint ID { get; set; } + + /// cost in COG CAP currency + public uint CAP { get; set; } + + // Amount of golden Gemstones offered + public uint GP { get; set; } + + public string Comment { get; set; } + + // Seemingly only one icon, can be either 0, 1, .. makes no difference + public uint BackIconID { get; set; } + + // Two icons, 0 is a regular gold frame, 1 has an additional fancy + sign + public uint FrameIconID { get; set; } + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataCAPtoGPChangeElement obj) + { + WriteUInt32(buffer, obj.ID); + WriteUInt32(buffer, obj.CAP); + WriteUInt32(buffer, obj.GP); + WriteMtString(buffer, obj.Comment); + WriteUInt32(buffer, obj.BackIconID); + WriteUInt32(buffer, obj.FrameIconID); + } + + public override CDataCAPtoGPChangeElement Read(IBuffer buffer) + { + CDataCAPtoGPChangeElement obj = new CDataCAPtoGPChangeElement(); + obj.ID = ReadUInt32(buffer); + obj.CAP = ReadUInt32(buffer); + obj.GP = ReadUInt32(buffer); + obj.Comment = ReadMtString(buffer); + obj.BackIconID = ReadUInt32(buffer); + obj.FrameIconID = ReadUInt32(buffer); + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataFreeRentalPawnList.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataFreeRentalPawnList.cs new file mode 100644 index 000000000..fbc62edb0 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataFreeRentalPawnList.cs @@ -0,0 +1,43 @@ +using Arrowgene.Buffers; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataFreeRentalPawnList + { + public uint PawnId { get; set; } + public string Name { get; set; } + public string ImageAddr { get; set; } + public uint LineupId { get; set; } + public ulong ExpireDateTime { get; set; } + + public CDataFreeRentalPawnList() + { + } + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataFreeRentalPawnList obj) + { + WriteUInt32(buffer, obj.PawnId); + WriteMtString(buffer, obj.Name); + WriteMtString(buffer, obj.ImageAddr); + WriteUInt32(buffer, obj.LineupId); + WriteUInt64(buffer, obj.ExpireDateTime); + } + + public override CDataFreeRentalPawnList Read(IBuffer buffer) + { + CDataFreeRentalPawnList obj = new CDataFreeRentalPawnList + { + PawnId = ReadUInt32(buffer), + Name = ReadMtString(buffer), + ImageAddr = ReadMtString(buffer), + LineupId = ReadUInt32(buffer), + ExpireDateTime = ReadUInt64(buffer), + }; + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseAvailable.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseAvailable.cs index 1d2af4a76..04034b5e0 100644 --- a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseAvailable.cs +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseAvailable.cs @@ -1,5 +1,5 @@ -using Arrowgene.Buffers; using System; +using Arrowgene.Buffers; namespace Arrowgene.Ddon.Shared.Entity.Structure { @@ -7,42 +7,38 @@ public class CDataGPCourseAvailable { public CDataGPCourseAvailable() { - CourseID = 0; - CourseName = ""; } - // Character ID? - public UInt32 ID { get; set; } - public string CourseName { get; set; } - public UInt64 UseLimitTime { get; set; } - public UInt32 CourseID { get; set; } - public UInt32 LineupID { get; set; } - public UInt32 BackIconID { get; set; } - public UInt32 FrameIconID { get; set; } - + public uint ID { get; set; } + public string Name { get; set; } = string.Empty; + public DateTimeOffset UseLimitTime { get; set; } + public uint CourseID { get; set; } + public uint LineupID { get; set; } + public string ImageAddr { get; set; } = string.Empty; + public class Serializer : EntitySerializer { public override void Write(IBuffer buffer, CDataGPCourseAvailable obj) { WriteUInt32(buffer, obj.ID); - WriteMtString(buffer, obj.CourseName); - WriteUInt64(buffer, obj.UseLimitTime); + WriteMtString(buffer, obj.Name); + WriteInt64(buffer, obj.UseLimitTime.ToUnixTimeSeconds()); WriteUInt32(buffer, obj.CourseID); WriteUInt32(buffer, obj.LineupID); - WriteUInt32(buffer, obj.BackIconID); - WriteUInt32(buffer, obj.FrameIconID); + WriteMtString(buffer, obj.ImageAddr); } public override CDataGPCourseAvailable Read(IBuffer buffer) { CDataGPCourseAvailable obj = new CDataGPCourseAvailable(); + obj.ID = ReadUInt32(buffer); - obj.CourseName = ReadMtString(buffer); - obj.UseLimitTime = ReadUInt64(buffer); + obj.Name = ReadMtString(buffer); + obj.UseLimitTime = DateTimeOffset.FromUnixTimeSeconds(ReadInt64(buffer)); obj.CourseID = ReadUInt32(buffer); obj.LineupID = ReadUInt32(buffer); - obj.BackIconID = ReadUInt32(buffer); - obj.FrameIconID = ReadUInt32(buffer); + obj.ImageAddr = ReadMtString(buffer); + return obj; } } diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseValid.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseValid.cs index 67a05323e..51e6423c3 100644 --- a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseValid.cs +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseValid.cs @@ -6,20 +6,14 @@ public class CDataGPCourseValid { public CDataGPCourseValid() { - Id = 0; - CourseId = 0; - NameA = ""; - NameB = ""; - StartTime = 0; - EndTime = 0; } - public uint Id; - public uint CourseId; - public string NameA; - public string NameB; - public ulong StartTime; - public ulong EndTime; + public uint Id { get; set; } + public uint CourseId { get; set; } + public string Name { get; set; } = string.Empty; + public string ImageAddr { get; set; } = string.Empty; + public ulong StartTime { get; set; } + public ulong EndTime { get; set; } public class Serializer : EntitySerializer { @@ -27,9 +21,9 @@ public override void Write(IBuffer buffer, CDataGPCourseValid obj) { WriteUInt32(buffer, obj.Id); WriteUInt32(buffer, obj.CourseId); - WriteMtString(buffer, obj.NameA); - WriteMtString(buffer, obj.NameB); - WriteUInt64(buffer, obj.StartTime); // TODO verify endianness big + WriteMtString(buffer, obj.Name); + WriteMtString(buffer, obj.ImageAddr); + WriteUInt64(buffer, obj.StartTime); WriteUInt64(buffer, obj.EndTime); } @@ -38,8 +32,8 @@ public override CDataGPCourseValid Read(IBuffer buffer) CDataGPCourseValid obj = new CDataGPCourseValid(); obj.Id = ReadUInt32(buffer); obj.CourseId = ReadUInt32(buffer); - obj.NameA = ReadMtString(buffer); - obj.NameB = ReadMtString(buffer); + obj.Name = ReadMtString(buffer); + obj.ImageAddr = ReadMtString(buffer); obj.StartTime = ReadUInt64(buffer); obj.EndTime = ReadUInt64(buffer); return obj; diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPDetail.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPDetail.cs index 0afc9c7f5..501c9aa22 100644 --- a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPDetail.cs +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPDetail.cs @@ -1,10 +1,6 @@ +using System; using Arrowgene.Buffers; using Arrowgene.Ddon.Shared.Model; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Arrowgene.Ddon.Shared.Entity.Structure { @@ -12,8 +8,8 @@ public class CDataGPDetail { public uint GP { get; set; } public uint Max { get; set; } - public bool isFree { get; set; } - public GPDetailType Type { get; set; } + public bool IsFree { get; set; } + public GPDetailType GetType { get; set; } public DateTimeOffset Expire { get; set; } public DateTimeOffset Created { get; set; } @@ -21,8 +17,8 @@ public CDataGPDetail() { GP = 0; Max = 0; - isFree = false; - Type = GPDetailType.None; + IsFree = false; + GetType = GPDetailType.None; Expire = DateTimeOffset.MaxValue; Created = DateTimeOffset.UnixEpoch; } @@ -33,8 +29,8 @@ public override void Write(IBuffer buffer, CDataGPDetail obj) { WriteUInt32(buffer, obj.GP); WriteUInt32(buffer, obj.Max); - WriteBool(buffer, obj.isFree); - WriteUInt32(buffer, (uint)obj.Type); + WriteBool(buffer, obj.IsFree); + WriteUInt32(buffer, (uint)obj.GetType); WriteInt64(buffer, obj.Expire.ToUnixTimeSeconds()); WriteInt64(buffer, obj.Created.ToUnixTimeSeconds()); } @@ -44,11 +40,11 @@ public override CDataGPDetail Read(IBuffer buffer) CDataGPDetail obj = new CDataGPDetail(); obj.GP = ReadUInt32(buffer); obj.Max = ReadUInt32(buffer); - obj.isFree = ReadBool(buffer); - obj.Type = (GPDetailType)ReadUInt32(buffer); + obj.IsFree = ReadBool(buffer); + obj.GetType = (GPDetailType)ReadUInt32(buffer); obj.Expire = DateTimeOffset.FromUnixTimeSeconds(ReadInt64(buffer)); obj.Created = DateTimeOffset.FromUnixTimeSeconds(ReadInt64(buffer)); - + return obj; } } diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPPeriod.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPPeriod.cs index 24f88127a..b3469aa6f 100644 --- a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPPeriod.cs +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPPeriod.cs @@ -1,5 +1,5 @@ -using Arrowgene.Buffers; using System; +using Arrowgene.Buffers; namespace Arrowgene.Ddon.Shared.Entity.Structure { @@ -8,11 +8,12 @@ public class CDataGPPeriod public uint GP { get; set; } public bool isFreeGP { get; set; } public DateTimeOffset Period { get; set; } - public CDataGPPeriod() - { + + public CDataGPPeriod() + { GP = 0; isFreeGP = false; - Period = DateTimeOffset.Now; + Period = DateTimeOffset.UtcNow; } public class Serializer : EntitySerializer @@ -21,7 +22,7 @@ public override void Write(IBuffer buffer, CDataGPPeriod obj) { WriteUInt32(buffer, obj.GP); WriteBool(buffer, obj.isFreeGP); - WriteInt64(buffer, obj.Period.ToUnixTimeSeconds()); + WriteUInt64(buffer, (ulong)obj.Period.ToUnixTimeSeconds()); } public override CDataGPPeriod Read(IBuffer buffer) @@ -29,7 +30,7 @@ public override CDataGPPeriod Read(IBuffer buffer) CDataGPPeriod obj = new CDataGPPeriod(); obj.GP = ReadUInt32(buffer); obj.isFreeGP = ReadBool(buffer); - obj.Period = DateTimeOffset.FromUnixTimeSeconds(ReadInt64(buffer)); + obj.Period = DateTimeOffset.FromUnixTimeSeconds((long)ReadUInt64(buffer)); return obj; } } diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPShopBuyHistoryElement.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPShopBuyHistoryElement.cs new file mode 100644 index 000000000..793da07e9 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPShopBuyHistoryElement.cs @@ -0,0 +1,40 @@ +using Arrowgene.Buffers; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataGPShopBuyHistoryElement + { + public uint ID { get; set; } + public string Name { get; set; } = string.Empty; + public uint Price { get; set; } + public ulong AcquisitionTime { get; set; } + + public CDataGPShopBuyHistoryElement() + { + } + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataGPShopBuyHistoryElement obj) + { + WriteUInt32(buffer, obj.ID); + WriteMtString(buffer, obj.Name); + WriteUInt32(buffer, obj.Price); + WriteUInt64(buffer, obj.AcquisitionTime); + } + + public override CDataGPShopBuyHistoryElement Read(IBuffer buffer) + { + CDataGPShopBuyHistoryElement obj = new CDataGPShopBuyHistoryElement + { + ID = ReadUInt32(buffer), + Name = ReadMtString(buffer), + Price = ReadUInt32(buffer), + AcquisitionTime = ReadUInt64(buffer), + }; + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPShopDisplayType.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPShopDisplayType.cs new file mode 100644 index 000000000..0d2746dca --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPShopDisplayType.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Model; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataGPShopDisplayType + { + public uint ID { get; set; } + public string Name { get; set; } = string.Empty; + public uint InGameUrlID { get; set; } + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataGPShopDisplayType obj) + { + WriteUInt32(buffer, obj.ID); + WriteMtString(buffer, obj.Name); + WriteUInt32(buffer, obj.InGameUrlID); + } + + public override CDataGPShopDisplayType Read(IBuffer buffer) + { + CDataGPShopDisplayType obj = new CDataGPShopDisplayType(); + obj.ID = ReadUInt32(buffer); + obj.Name = ReadMtString(buffer); + obj.InGameUrlID = ReadUInt32(buffer); + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaDrawGroupInfo.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaDrawGroupInfo.cs new file mode 100644 index 000000000..2a502bc3d --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaDrawGroupInfo.cs @@ -0,0 +1,37 @@ +using System.Collections.Generic; +using Arrowgene.Buffers; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataGachaDrawGroupInfo + { + public List GachaSettlementList { get; set; } + public List GachaDrawList { get; set; } + + public CDataGachaDrawGroupInfo() + { + GachaSettlementList = new List(); + GachaDrawList = new List(); + } + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataGachaDrawGroupInfo obj) + { + WriteEntityList(buffer, obj.GachaSettlementList); + WriteEntityList(buffer, obj.GachaDrawList); + } + + public override CDataGachaDrawGroupInfo Read(IBuffer buffer) + { + CDataGachaDrawGroupInfo obj = new CDataGachaDrawGroupInfo + { + GachaSettlementList = ReadEntityList(buffer), + GachaDrawList = ReadEntityList(buffer) + }; + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaDrawInfo.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaDrawInfo.cs new file mode 100644 index 000000000..f3ce6bbe0 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaDrawInfo.cs @@ -0,0 +1,39 @@ +using System.Collections.Generic; +using Arrowgene.Buffers; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataGachaDrawInfo + { + public uint Num { get; set; } + public bool IsBonus { get; set; } + public List GachaItemInfo { get; set; } + + public CDataGachaDrawInfo() + { + GachaItemInfo = new List(); + } + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataGachaDrawInfo obj) + { + WriteUInt32(buffer, obj.Num); + WriteBool(buffer, obj.IsBonus); + WriteEntityList(buffer, obj.GachaItemInfo); + } + + public override CDataGachaDrawInfo Read(IBuffer buffer) + { + CDataGachaDrawInfo obj = new CDataGachaDrawInfo + { + Num = ReadUInt32(buffer), + IsBonus = ReadBool(buffer), + GachaItemInfo = ReadEntityList(buffer), + }; + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaInfo.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaInfo.cs new file mode 100644 index 000000000..f53a0a48d --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaInfo.cs @@ -0,0 +1,66 @@ +using System.Collections.Generic; +using Arrowgene.Buffers; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataGachaInfo + { + public uint Id { get; set; } + public long Begin { get; set; } + public long End { get; set; } + public string Name { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public string Detail { get; set; } = string.Empty; + public byte WeightDispType { get; set; } + public string WeightDispTitle { get; set; } = string.Empty; + public string WeightDispText { get; set; } = string.Empty; + public string ListAddr { get; set; } = string.Empty; + public string ImageAddr { get; set; } = string.Empty; + public List DrawGroups { get; set; } + + public CDataGachaInfo() + { + DrawGroups = new List(); + } + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataGachaInfo obj) + { + WriteUInt32(buffer, obj.Id); + WriteInt64(buffer, obj.Begin); + WriteInt64(buffer, obj.End); + WriteMtString(buffer, obj.Name); + WriteMtString(buffer, obj.Description); + WriteMtString(buffer, obj.Detail); + WriteByte(buffer, obj.WeightDispType); + WriteMtString(buffer, obj.WeightDispTitle); + WriteMtString(buffer, obj.WeightDispText); + WriteMtString(buffer, obj.ListAddr); + WriteMtString(buffer, obj.ImageAddr); + WriteEntityList(buffer, obj.DrawGroups); + } + + public override CDataGachaInfo Read(IBuffer buffer) + { + CDataGachaInfo obj = new CDataGachaInfo + { + Id = ReadUInt32(buffer), + Begin = ReadInt64(buffer), + End = ReadInt64(buffer), + Name = ReadMtString(buffer), + Description = ReadMtString(buffer), + Detail = ReadMtString(buffer), + WeightDispType = ReadByte(buffer), + WeightDispTitle = ReadMtString(buffer), + WeightDispText = ReadMtString(buffer), + ListAddr = ReadMtString(buffer), + ImageAddr = ReadMtString(buffer), + DrawGroups = ReadEntityList(buffer) + }; + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaItemInfo.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaItemInfo.cs new file mode 100644 index 000000000..95c8c9c6b --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaItemInfo.cs @@ -0,0 +1,43 @@ +using Arrowgene.Buffers; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataGachaItemInfo + { + public uint ItemId { get; set; } + public uint ItemNum { get; set; } + public uint Rank { get; set; } + public uint Effect { get; set; } + public double Probability { get; set; } + + public CDataGachaItemInfo() + { + } + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataGachaItemInfo obj) + { + WriteUInt32(buffer, obj.ItemId); + WriteUInt32(buffer, obj.ItemNum); + WriteUInt32(buffer, obj.Rank); + WriteUInt32(buffer, obj.Effect); + WriteDouble(buffer, obj.Probability); + } + + public override CDataGachaItemInfo Read(IBuffer buffer) + { + CDataGachaItemInfo obj = new CDataGachaItemInfo + { + ItemId = ReadUInt32(buffer), + ItemNum = ReadUInt32(buffer), + Rank = ReadUInt32(buffer), + Effect = ReadUInt32(buffer), + Probability = ReadDouble(buffer) + }; + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaSettlementInfo.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaSettlementInfo.cs new file mode 100644 index 000000000..530a93291 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaSettlementInfo.cs @@ -0,0 +1,57 @@ +using Arrowgene.Buffers; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataGachaSettlementInfo + { + public uint DrawGroupId { get; set; } + + // Golden Gemstone = 1, Silver Tickets = 2 + public uint Id { get; set; } + public uint Price { get; set; } + public uint BasePrice { get; set; } + public uint PurchaseNum { get; set; } + public uint PurchaseMaxNum { get; set; } + public uint SpecialPriceNum { get; set; } + public uint SpecialPriceMaxNum { get; set; } + public uint Unk1 { get; set; } + + public CDataGachaSettlementInfo() + { + } + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataGachaSettlementInfo obj) + { + WriteUInt32(buffer, obj.DrawGroupId); + WriteUInt32(buffer, obj.Id); + WriteUInt32(buffer, obj.Price); + WriteUInt32(buffer, obj.BasePrice); + WriteUInt32(buffer, obj.PurchaseNum); + WriteUInt32(buffer, obj.PurchaseMaxNum); + WriteUInt32(buffer, obj.SpecialPriceNum); + WriteUInt32(buffer, obj.SpecialPriceMaxNum); + WriteUInt32(buffer, obj.Unk1); + } + + public override CDataGachaSettlementInfo Read(IBuffer buffer) + { + CDataGachaSettlementInfo obj = new CDataGachaSettlementInfo + { + DrawGroupId = ReadUInt32(buffer), + Id = ReadUInt32(buffer), + Price = ReadUInt32(buffer), + BasePrice = ReadUInt32(buffer), + PurchaseNum = ReadUInt32(buffer), + PurchaseMaxNum = ReadUInt32(buffer), + SpecialPriceNum = ReadUInt32(buffer), + SpecialPriceMaxNum = ReadUInt32(buffer), + Unk1 = ReadUInt32(buffer) + }; + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGameItemStorage.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGameItemStorage.cs new file mode 100644 index 000000000..de9e1c3b9 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGameItemStorage.cs @@ -0,0 +1,32 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Model; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataGameItemStorage + { + public StorageType StorageType { get; set; } + + public CDataGameItemStorage() + { + } + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataGameItemStorage obj) + { + WriteByte(buffer, (byte)obj.StorageType); + } + + public override CDataGameItemStorage Read(IBuffer buffer) + { + CDataGameItemStorage obj = new CDataGameItemStorage + { + StorageType = (StorageType)ReadByte(buffer), + }; + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGameItemStorageInfo.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGameItemStorageInfo.cs new file mode 100644 index 000000000..8dab9ea50 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGameItemStorageInfo.cs @@ -0,0 +1,33 @@ +using Arrowgene.Buffers; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataGameItemStorageInfo + { + public CDataGameItemStorage GameItemStorage { get; set; } = new(); + public ushort UsedSlotNum { get; set; } + public ushort MaxSlotNum { get; set; } + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataGameItemStorageInfo obj) + { + WriteEntity(buffer, obj.GameItemStorage); + WriteUInt16(buffer, obj.UsedSlotNum); + WriteUInt16(buffer, obj.MaxSlotNum); + } + + public override CDataGameItemStorageInfo Read(IBuffer buffer) + { + CDataGameItemStorageInfo obj = new CDataGameItemStorageInfo + { + GameItemStorage = ReadEntity(buffer), + UsedSlotNum = ReadUInt16(buffer), + MaxSlotNum = ReadUInt16(buffer), + }; + + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Files/Assets/Gacha.json b/Arrowgene.Ddon.Shared/Files/Assets/Gacha.json new file mode 100644 index 000000000..333db2a2c --- /dev/null +++ b/Arrowgene.Ddon.Shared/Files/Assets/Gacha.json @@ -0,0 +1,132 @@ +{ + "comment": "This file describes loot box contents", + "boxes": [ + { + "gacha_id": 1225, + "start_time": 0, + "end_time": 4131210198, + "name": "Shining snow Christmas box", + "description": "Lottery for Christmas event items from the Shining snow Christmas box", + "detail": "", + "weight_display_type": 2, + "weight_display_title": "Percentage Provided", + "weight_display_text": "Class S 100.0%\r\n*Probability of provision is rounded to one decimal place.", + "list_address": "/shop/img/payment/icon_lot.png", + "image_address": "shop/img/payment/image_lot1225_campaign.jpg", + "draw_groups": [ + { + "group_id": 351, + "wallet_type": "GoldenGemstones", + "price": 1, + "base_price": 1, + "purchase_num": 0, + "purchase_max_num": 0, + "special_price_num": 0, + "special_price_max_num": 0, + "unk1": 0 + }, + { + "group_id": 352, + "wallet_type": "SilverTickets", + "price": 10, + "base_price": 10, + "purchase_num": 0, + "purchase_max_num": 0, + "special_price_num": 0, + "special_price_max_num": 0, + "unk1": 0 + } + ], + "draw_list": [ + { + "comment": "Christmas Tree onepiece", + "item_id": 23461, + "amount": 1, + "rank": 1, + "effect": 0, + "chance": 0.1 + }, + { + "comment": "Santa's Robe Coat (red)", + "item_id": 23452, + "amount": 1, + "rank": 1, + "effect": 0, + "chance": 0.1 + }, + { + "comment": "Santa's Robe Coat (White)", + "item_id": 23453, + "amount": 1, + "rank": 1, + "effect": 0, + "chance": 0.1 + }, + { + "comment": "Reindeer's Ears (Brown)", + "item_id": 23454, + "amount": 1, + "rank": 1, + "effect": 0, + "chance": 0.1 + }, + { + "comment": "Reindeer's Ears (White)", + "item_id": 23455, + "amount": 1, + "rank": 1, + "effect": 0, + "chance": 0.1 + }, + { + "comment": "Reindeer's Costume (Brown)", + "item_id": 23456, + "amount": 1, + "rank": 1, + "effect": 0, + "chance": 0.1 + }, + { + "comment": "Reindeer's Costume (White)", + "item_id": 23457, + "amount": 1, + "rank": 1, + "effect": 0, + "chance": 0.1 + }, + { + "comment": "Reindeer's Mouton Boots (Brown)", + "item_id": 23458, + "amount": 1, + "rank": 1, + "effect": 0, + "chance": 0.1 + }, + { + "comment": "Reindeer's Mouton Boots (White)", + "item_id": 23459, + "amount": 1, + "rank": 1, + "effect": 0, + "chance": 0.1 + }, + { + "comment": "Sparkling Snow Large Crystal", + "item_id": 23548, + "amount": 50, + "rank": 3, + "effect": 0, + "chance": 0.5 + }, + { + "comment": "Rainbow Dye", + "item_id": 8141, + "amount": 1, + "rank": 3, + "effect": 0, + "chance": 0.5 + } + ] + } + ] +} diff --git a/Arrowgene.Ddon.Shared/Files/Assets/GpCourseInfo.json b/Arrowgene.Ddon.Shared/Files/Assets/GpCourseInfo.json index 5007fb413..df47bd686 100644 --- a/Arrowgene.Ddon.Shared/Files/Assets/GpCourseInfo.json +++ b/Arrowgene.Ddon.Shared/Files/Assets/GpCourseInfo.json @@ -862,4 +862,4 @@ "comment": "GP_COURSE_EFFECT_BLOOD_ORB_UP" } ] -} +} \ No newline at end of file