From c8268e0e019bc60a6c252d12b46dd95fb1e043ae Mon Sep 17 00:00:00 2001 From: Sehkah Date: Mon, 12 Aug 2024 00:17:25 +0200 Subject: [PATCH 1/6] Add initial GP shop setup to show GG. --- Arrowgene.Ddon.GameServer/DdonGameServer.cs | 3 ++ .../Handler/GpCogGetIdHandler.cs | 27 ++++++++++++ .../Handler/GpGetCapToGpChangeListHandler.cs | 36 ++++++++++++++++ .../Handler/GpShopDisplayTypeHandler.cs | 43 +++++++++++++++++++ .../Entity/EntitySerializer.cs | 4 ++ .../PacketStructure/C2SGpCogGetIdReq.cs | 29 +++++++++++++ .../C2SGpGetCapToGpChangeListReq.cs | 29 +++++++++++++ .../C2SGpShopDisplayGetTypeReq.cs | 29 +++++++++++++ .../PacketStructure/S2CGpCogGetIdRes.cs | 40 +++++++++++++++++ .../S2CGpGetCapToGpChangeListRes.cs | 40 +++++++++++++++++ .../S2CGpShopDisplayGetTypeRes.cs | 40 +++++++++++++++++ .../Structure/CDataCAPtoGPChangeElement.cs | 41 ++++++++++++++++++ .../Structure/CDataGPShopDisplayType.cs | 32 ++++++++++++++ 13 files changed, 393 insertions(+) create mode 100644 Arrowgene.Ddon.GameServer/Handler/GpCogGetIdHandler.cs create mode 100644 Arrowgene.Ddon.GameServer/Handler/GpGetCapToGpChangeListHandler.cs create mode 100644 Arrowgene.Ddon.GameServer/Handler/GpShopDisplayTypeHandler.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpCogGetIdReq.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpGetCapToGpChangeListReq.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpShopDisplayGetTypeReq.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpCogGetIdRes.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetCapToGpChangeListRes.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpShopDisplayGetTypeRes.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/Structure/CDataCAPtoGPChangeElement.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/Structure/CDataGPShopDisplayType.cs diff --git a/Arrowgene.Ddon.GameServer/DdonGameServer.cs b/Arrowgene.Ddon.GameServer/DdonGameServer.cs index 7f2a43f18..2e0ade50d 100644 --- a/Arrowgene.Ddon.GameServer/DdonGameServer.cs +++ b/Arrowgene.Ddon.GameServer/DdonGameServer.cs @@ -330,6 +330,9 @@ 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 CraftGetCraftProductInfoHandler(this)); AddHandler(new CraftCancelCraftHandler(this)); AddHandler(new CraftTimeSaveHandler(this)); diff --git a/Arrowgene.Ddon.GameServer/Handler/GpCogGetIdHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpCogGetIdHandler.cs new file mode 100644 index 000000000..6e9f7fe34 --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/GpCogGetIdHandler.cs @@ -0,0 +1,27 @@ +#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: implement S2C_GP_COG_GET_ID_RES + + res.CogId = "Arrowgene"; + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/GpGetCapToGpChangeListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpGetCapToGpChangeListHandler.cs new file mode 100644 index 000000000..da7b9ffcc --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/GpGetCapToGpChangeListHandler.cs @@ -0,0 +1,36 @@ +#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) + { + // TODO: implement S2C_GP_GET_CAP_TO_GP_CHANGE_LIST_RES + S2CGpGetCapToGpChangeListRes res = new S2CGpGetCapToGpChangeListRes(); + + res.List.Add(new CDataCAPtoGPChangeElement + { + ID = 1, + CAP = 1, + GP = 1, + Comment = "Test", + BackIconID = 0, + FrameIconID = 0 + }); + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/GpShopDisplayTypeHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpShopDisplayTypeHandler.cs new file mode 100644 index 000000000..1c8a7dd52 --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/GpShopDisplayTypeHandler.cs @@ -0,0 +1,43 @@ +#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) + { + // TODO: implement S2C_GP_GP_SHOP_DISPLAY_GET_TYPE_RES + S2CGpShopDisplayGetTypeRes res = new S2CGpShopDisplayGetTypeRes(); + + List items = new List + { + new() { ID = 1, Name = "ピックアップ", InGameUrlID = 11 }, + new() { ID = 3, Name = "パスポート", InGameUrlID = 11 }, + new() { ID = 6, Name = "オプションコース", InGameUrlID = 11 }, + new() { ID = 7, Name = "ポーンボイス", InGameUrlID = 11 }, + new() { ID = 8, Name = "クラフト関連", InGameUrlID = 11 }, + new() { ID = 9, Name = "クレスト", InGameUrlID = 11 }, + new() { ID = 10, Name = "消耗品&装備品", InGameUrlID = 11 }, + new() { ID = 11, Name = "ボイス定型文&ショートカット枠", InGameUrlID = 11 }, + new() { ID = 12, Name = "LV100&ジョブ修練セット", InGameUrlID = 11 }, + new() { ID = 13, Name = "LV.100になる宝珠", InGameUrlID = 11 }, + new() { ID = 14, Name = "シーズン1~2戦技・ジョブ修練全解放", InGameUrlID = 11 }, + new() { ID = 15, Name = "! 期間限定 !", InGameUrlID = 11 } + }; + res.Items = items; + + return res; + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs b/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs index 6a5aae2b9..54bc7f8eb 100644 --- a/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs +++ b/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs @@ -676,6 +676,10 @@ static EntitySerializer() Create(new C2SGpGetValidChatComGroupReq.Serializer()); Create(new C2SGpGpEditGetVoiceListReq.Serializer()); + Create(new C2SGpShopDisplayGetTypeReq.Serializer()); + Create(new C2SGpCogGetIdReq.Serializer()); + Create(new C2SGpGetCapToGpChangeListReq.Serializer()); + Create(new C2SInnGetPenaltyHealStayPriceReq.Serializer()); Create(new C2SInnGetStayPriceReq.Serializer()); Create(new C2SInnHpRecoveryCompleteNtc.Serializer()); 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/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/S2CGpCogGetIdRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpCogGetIdRes.cs new file mode 100644 index 000000000..bc996182e --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpCogGetIdRes.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 S2CGpCogGetIdRes : ServerResponse + { + public override PacketId Id => PacketId.S2C_GP_COG_GET_ID_RES; + + public string CogId { get; set; } + + 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/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/S2CGpShopDisplayGetTypeRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpShopDisplayGetTypeRes.cs new file mode 100644 index 000000000..a68a9eb29 --- /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); + + WriteEntity(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/Structure/CDataCAPtoGPChangeElement.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataCAPtoGPChangeElement.cs new file mode 100644 index 000000000..2b16f11d9 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataCAPtoGPChangeElement.cs @@ -0,0 +1,41 @@ +using System.Collections.Generic; +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Model; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataCAPtoGPChangeElement + { + public uint ID { get; set; } + public uint CAP { get; set; } + public uint GP { get; set; } + public string Comment { get; set; } + public uint BackIconID { get; set; } + 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/CDataGPShopDisplayType.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPShopDisplayType.cs new file mode 100644 index 000000000..f49fdbe50 --- /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; } + 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; + } + } + } +} From 3e4b58532578c16edd987365e5332fd87b336b66 Mon Sep 17 00:00:00 2001 From: Sehkah Date: Wed, 14 Aug 2024 20:05:37 +0200 Subject: [PATCH 2/6] Implement (box) gacha, some GP shop functions and event codes. The online shop still crashes currently. --- Arrowgene.Ddon.GameServer/DdonGameServer.cs | 11 +++ .../Handler/BoxGachaBuyHandler.cs | 66 +++++++++++++ .../Handler/BoxGachaDrawInfoHandler.cs | 37 ++++++++ .../Handler/BoxGachaListHandler.cs | 71 ++++++++++++++ .../Handler/EventCodeInputHandler.cs | 37 ++++++++ .../Handler/GachaBuyHandler.cs | 64 +++++++++++++ .../Handler/GachaListHandler.cs | 94 +++++++++++++++++++ .../Handler/GpChangeCapToGpHandler.cs | 47 ++++++++++ .../Handler/GpGetCapToGpChangeListHandler.cs | 30 ++++-- .../Handler/GpGetGpDetailHandler.cs | 17 ++-- .../Handler/GpGetGpHandler.cs | 16 ++-- .../Handler/GpGetGpPeriodHandler.cs | 7 +- .../GpGetUpdateAppCourseBonusFlagHandler.cs | 1 + .../GpGpCourseGetAvailableListHandler.cs | 34 ++++--- .../Handler/GpGpEditGetVoiceListHandler.cs | 4 +- .../Handler/ItemGetItemStorageInfoHandler.cs | 36 +++++++ .../Entity/EntitySerializer.cs | 26 +++++ .../PacketStructure/C2SBoxGachaBuyReq.cs | 42 +++++++++ .../PacketStructure/C2SBoxGachaDrawInfoReq.cs | 33 +++++++ .../PacketStructure/C2SBoxGachaListReq.cs | 28 ++++++ .../PacketStructure/C2SEventCodeInputReq.cs | 33 +++++++ .../Entity/PacketStructure/C2SGachaBuyReq.cs | 42 +++++++++ .../Entity/PacketStructure/C2SGachaListReq.cs | 28 ++++++ .../PacketStructure/C2SGpChangeCapToGpReq.cs | 33 +++++++ .../C2SGpCourseGetAvailableListReq.cs | 28 ++++++ .../C2SItemGetItemStorageInfoReq.cs | 36 +++++++ .../PacketStructure/S2CBoxGachaBuyRes.cs | 43 +++++++++ .../PacketStructure/S2CBoxGachaDrawInfoRes.cs | 43 +++++++++ .../PacketStructure/S2CBoxGachaListRes.cs | 40 ++++++++ .../PacketStructure/S2CEventCodeInputRes.cs | 37 ++++++++ .../PacketStructure/S2CGPCourseStartNtc.cs | 1 - .../Entity/PacketStructure/S2CGachaBuyRes.cs | 43 +++++++++ .../Entity/PacketStructure/S2CGachaListRes.cs | 40 ++++++++ .../PacketStructure/S2CGpChangeCapToGpRes.cs | 43 +++++++++ .../PacketStructure/S2CGpCogGetIdRes.cs | 3 - .../PacketStructure/S2CGpGetGpDetailRes.cs | 6 +- .../PacketStructure/S2CGpGetGpPeriodRes.cs | 6 +- .../Entity/PacketStructure/S2CGpGetGpRes.cs | 17 ++-- .../S2CGpGpCourseGetAvailableListRes.cs | 12 +-- .../S2CItemGetItemStorageInfoRes.cs | 40 ++++++++ .../Entity/Structure/CDataBoxGachaInfo.cs | 70 ++++++++++++++ .../Entity/Structure/CDataBoxGachaItemInfo.cs | 49 ++++++++++ .../Structure/CDataBoxGachaSettlementInfo.cs | 61 ++++++++++++ .../Structure/CDataCAPtoGPChangeElement.cs | 17 +++- .../Structure/CDataGPCourseAvailable.cs | 28 +++--- .../Entity/Structure/CDataGPDetail.cs | 24 ++--- .../Entity/Structure/CDataGPPeriod.cs | 13 +-- .../Structure/CDataGachaDrawGroupInfo.cs | 37 ++++++++ .../Entity/Structure/CDataGachaDrawInfo.cs | 38 ++++++++ .../Entity/Structure/CDataGachaInfo.cs | 66 +++++++++++++ .../Entity/Structure/CDataGachaItemInfo.cs | 43 +++++++++ .../Structure/CDataGachaSettlementInfo.cs | 57 +++++++++++ .../Entity/Structure/CDataGameItemStorage.cs | 32 +++++++ .../Structure/CDataGameItemStorageInfo.cs | 37 ++++++++ 54 files changed, 1739 insertions(+), 108 deletions(-) create mode 100644 Arrowgene.Ddon.GameServer/Handler/BoxGachaBuyHandler.cs create mode 100644 Arrowgene.Ddon.GameServer/Handler/BoxGachaDrawInfoHandler.cs create mode 100644 Arrowgene.Ddon.GameServer/Handler/BoxGachaListHandler.cs create mode 100644 Arrowgene.Ddon.GameServer/Handler/EventCodeInputHandler.cs create mode 100644 Arrowgene.Ddon.GameServer/Handler/GachaBuyHandler.cs create mode 100644 Arrowgene.Ddon.GameServer/Handler/GachaListHandler.cs create mode 100644 Arrowgene.Ddon.GameServer/Handler/GpChangeCapToGpHandler.cs create mode 100644 Arrowgene.Ddon.GameServer/Handler/ItemGetItemStorageInfoHandler.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SBoxGachaBuyReq.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SBoxGachaDrawInfoReq.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SBoxGachaListReq.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SEventCodeInputReq.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGachaBuyReq.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGachaListReq.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpChangeCapToGpReq.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpCourseGetAvailableListReq.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SItemGetItemStorageInfoReq.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CBoxGachaBuyRes.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CBoxGachaDrawInfoRes.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CBoxGachaListRes.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CEventCodeInputRes.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGachaBuyRes.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGachaListRes.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpChangeCapToGpRes.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CItemGetItemStorageInfoRes.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/Structure/CDataBoxGachaInfo.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/Structure/CDataBoxGachaItemInfo.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/Structure/CDataBoxGachaSettlementInfo.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaDrawGroupInfo.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaDrawInfo.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaInfo.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaItemInfo.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaSettlementInfo.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/Structure/CDataGameItemStorage.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/Structure/CDataGameItemStorageInfo.cs diff --git a/Arrowgene.Ddon.GameServer/DdonGameServer.cs b/Arrowgene.Ddon.GameServer/DdonGameServer.cs index 2e0ade50d..0063e0853 100644 --- a/Arrowgene.Ddon.GameServer/DdonGameServer.cs +++ b/Arrowgene.Ddon.GameServer/DdonGameServer.cs @@ -330,9 +330,20 @@ 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 GachaListHandler(this)); + AddHandler(new BoxGachaListHandler(this)); + AddHandler(new BoxGachaBuyHandler(this)); + AddHandler(new GachaBuyHandler(this)); + AddHandler(new BoxGachaDrawInfoHandler(this)); + AddHandler(new EventCodeInputHandler(this)); + AddHandler(new ItemGetItemStorageInfoHandler(this)); + AddHandler(new CraftGetCraftProductInfoHandler(this)); AddHandler(new CraftCancelCraftHandler(this)); AddHandler(new CraftTimeSaveHandler(this)); diff --git a/Arrowgene.Ddon.GameServer/Handler/BoxGachaBuyHandler.cs b/Arrowgene.Ddon.GameServer/Handler/BoxGachaBuyHandler.cs new file mode 100644 index 000000000..293549b61 --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/BoxGachaBuyHandler.cs @@ -0,0 +1,66 @@ +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 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) + { + 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 + CDataWalletPoint walletPoint = client.Character.WalletPointList.Find(l => l.Type == WalletType.GoldenGemstones); + walletPoint.Value--; + + S2CItemUpdateCharacterItemNtc itemUpdateNtc = new S2CItemUpdateCharacterItemNtc + { + UpdateType = ItemNoticeType.Default, + UpdateItemList = itemUpdateResult, + UpdateWalletList = new List + { + new() + { + Type = WalletType.GoldenGemstones, + Value = walletPoint.Value, + AddPoint = (int)-request.Price, + ExtraBonusPoint = 0 + } + } + }; + client.Send(itemUpdateNtc); + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/BoxGachaDrawInfoHandler.cs b/Arrowgene.Ddon.GameServer/Handler/BoxGachaDrawInfoHandler.cs new file mode 100644 index 000000000..a0afe460c --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/BoxGachaDrawInfoHandler.cs @@ -0,0 +1,37 @@ +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 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) + { + 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..9eb4c84e8 --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/BoxGachaListHandler.cs @@ -0,0 +1,71 @@ +using System; +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 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) + { + S2CBoxGachaListRes res = new S2CBoxGachaListRes(); + + 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 = "http://localhost:52099/sp_ingame/campaign/bnr/lotto/lot_icon_170316_03.jpg", + ImageAddr = "http://localhost:52099/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/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..5247a986f --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/GachaBuyHandler.cs @@ -0,0 +1,64 @@ +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 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) + { + S2CGachaBuyRes res = new S2CGachaBuyRes(); + + // 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 we have to figure out which currency was used + CDataWalletPoint walletPoint = client.Character.WalletPointList.Find(l => l.Type == WalletType.GoldenGemstones); + walletPoint.Value--; + + S2CItemUpdateCharacterItemNtc itemUpdateNtc = new S2CItemUpdateCharacterItemNtc + { + UpdateType = ItemNoticeType.Default, + UpdateItemList = itemUpdateResult, + UpdateWalletList = new List + { + new() + { + Type = WalletType.GoldenGemstones, + Value = walletPoint.Value, + AddPoint = (int)-request.Price, + ExtraBonusPoint = 0 + } + } + }; + client.Send(itemUpdateNtc); + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/GachaListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GachaListHandler.cs new file mode 100644 index 000000000..e0660970d --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/GachaListHandler.cs @@ -0,0 +1,94 @@ +#nullable enable +using System; +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 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) + { + S2CGachaListRes res = new S2CGachaListRes(); + + 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 + } + } + } + } + } + } + }); + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/GpChangeCapToGpHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpChangeCapToGpHandler.cs new file mode 100644 index 000000000..35c82f6dd --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/GpChangeCapToGpHandler.cs @@ -0,0 +1,47 @@ +#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; + + CDataWalletPoint walletPoint = client.Character.WalletPointList.Find(l => l.Type == WalletType.GoldenGemstones); + walletPoint.Value += changeListGPValue; + S2CItemUpdateCharacterItemNtc itemUpdateNtc = new S2CItemUpdateCharacterItemNtc(); + itemUpdateNtc.UpdateType = ItemNoticeType.ResetCraftpoint; + itemUpdateNtc.UpdateWalletList.Add(new CDataUpdateWalletPoint() + { + Type = WalletType.GoldenGemstones, + Value = walletPoint.Value, + AddPoint = (int)res.GP, + ExtraBonusPoint = 0 + }); + Server.Database.UpdateWalletPoint(client.Character.CharacterId, walletPoint); + client.Send(itemUpdateNtc); + + res.GP = walletPoint.Value; + // TODO: store CAP somewhere? + res.CAP = 0; + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/GpGetCapToGpChangeListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpGetCapToGpChangeListHandler.cs index da7b9ffcc..2ffec444d 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GpGetCapToGpChangeListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GpGetCapToGpChangeListHandler.cs @@ -17,19 +17,31 @@ public GpGetCapToGpChangeListHandler(DdonGameServer server) : base(server) public override S2CGpGetCapToGpChangeListRes Handle(GameClient client, C2SGpGetCapToGpChangeListReq request) { - // TODO: implement S2C_GP_GET_CAP_TO_GP_CHANGE_LIST_RES S2CGpGetCapToGpChangeListRes res = new S2CGpGetCapToGpChangeListRes(); - res.List.Add(new CDataCAPtoGPChangeElement + // TODO: introduce some form of asset to track all potential variants of GG + res.List.AddRange(new List { - ID = 1, - CAP = 1, - GP = 1, - Comment = "Test", - BackIconID = 0, - FrameIconID = 0 + 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..b602598fa 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,14 +17,16 @@ 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() + client.Send(new S2CGpGetGpRes { GP = amount, - UseLimit = 0, ///TODO: Investigate. - RealTime = DateTimeOffset.Now - }; + UseLimit = offset.AddMonths(12), + RealTime = offset, + Milliseconds = (ushort)offset.Millisecond + }); } } } 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..f88152a32 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GpGpCourseGetAvailableListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GpGpCourseGetAvailableListHandler.cs @@ -1,15 +1,12 @@ -using Arrowgene.Buffers; -using Arrowgene.Ddon.GameServer.Dump; +using System; 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.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 +17,27 @@ 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(); + + DateTimeOffset offset = DateTimeOffset.UtcNow; - // foreach (var Course in _AssetRepo.GPCourseInfoAsset.ValidCourses) + // res.Items = new List // { - // - // } + // new CDataGPCourseAvailable + // { + // ID = 1, + // Name = "Adventure Passport", + // UseLimitTime = offset.AddMonths(12), + // CourseID = 1, + // LineupID = 1, + // BackIconID = 0, + // FrameIconID = 0 + // } + // }; - // 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/ItemGetItemStorageInfoHandler.cs b/Arrowgene.Ddon.GameServer/Handler/ItemGetItemStorageInfoHandler.cs new file mode 100644 index 000000000..196ef4ba1 --- /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(); + + //TODO: fetch from actual item post? + res.GameItemStorageInfoList.Add(new CDataGameItemStorageInfo + { + GameItemStorage = new CDataGameItemStorage + { + StorageType = StorageType.ItemPost + }, + UsedSlotNum = 189, + MaxSlotNum = 400 + }); + + return res; + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs b/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs index 54bc7f8eb..f2fbc1010 100644 --- a/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs +++ b/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs @@ -213,6 +213,22 @@ static EntitySerializer() Create(new CDataGoodsParamRequirement.Serializer()); Create(new CDataHasRegionBreakReward.Serializer()); + + Create(new CDataGPShopDisplayType.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()); @@ -679,6 +695,16 @@ static EntitySerializer() Create(new C2SGpShopDisplayGetTypeReq.Serializer()); Create(new C2SGpCogGetIdReq.Serializer()); Create(new C2SGpGetCapToGpChangeListReq.Serializer()); + Create(new C2SGpChangeCapToGpReq.Serializer()); + Create(new C2SGpCourseGetAvailableListReq.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 C2SItemGetItemStorageInfoReq.Serializer()); Create(new C2SInnGetPenaltyHealStayPriceReq.Serializer()); Create(new C2SInnGetStayPriceReq.Serializer()); 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..2b881c533 --- /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; } + + 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/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/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/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..a9b4fa39f --- /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; } + + 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/S2CGPCourseStartNtc.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGPCourseStartNtc.cs index 5b3098d1e..9e08feae0 100644 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGPCourseStartNtc.cs +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGPCourseStartNtc.cs @@ -1,6 +1,5 @@ using Arrowgene.Buffers; using Arrowgene.Ddon.Shared.Network; -using System; namespace Arrowgene.Ddon.Shared.Entity.PacketStructure { 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 index bc996182e..b0932d34e 100644 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpCogGetIdRes.cs +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpCogGetIdRes.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; using Arrowgene.Buffers; -using Arrowgene.Ddon.Shared.Entity.Structure; using Arrowgene.Ddon.Shared.Network; namespace Arrowgene.Ddon.Shared.Entity.PacketStructure @@ -30,7 +28,6 @@ public override S2CGpCogGetIdRes Read(IBuffer buffer) ReadServerResponse(buffer, obj); - // は忘れないように注意しましょう。 obj.CogId = ReadMtString(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..bb332edd9 100644 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpRes.cs +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpRes.cs @@ -14,8 +14,9 @@ public S2CGpGetGpRes() } public uint GP { get; set; } - public long UseLimit { get; set; } + public DateTimeOffset UseLimit { get; set; } public DateTimeOffset RealTime { get; set; } + public ushort Milliseconds { get; set; } public class Serializer : PacketEntitySerializer { @@ -23,9 +24,9 @@ public override void Write(IBuffer buffer, S2CGpGetGpRes obj) { WriteServerResponse(buffer, obj); WriteUInt32(buffer, obj.GP); - WriteInt64(buffer, obj.UseLimit); - WriteInt64(buffer, obj.RealTime.ToUnixTimeSeconds()); - WriteUInt16(buffer, (ushort) obj.RealTime.Millisecond); + WriteInt64(buffer, obj.UseLimit.ToUnixTimeSeconds()); + WriteUInt64(buffer, (ulong)obj.RealTime.ToUnixTimeSeconds()); + WriteUInt16(buffer, (ushort)obj.RealTime.Millisecond); } public override S2CGpGetGpRes Read(IBuffer buffer) @@ -33,10 +34,10 @@ public override S2CGpGetGpRes Read(IBuffer buffer) S2CGpGetGpRes obj = new S2CGpGetGpRes(); ReadServerResponse(buffer, obj); obj.GP = ReadUInt32(buffer); - obj.UseLimit = ReadInt64(buffer); - long unixTimeSeconds = ReadInt64(buffer); - ushort unixTimeMilliseconds = ReadUInt16(buffer); - obj.RealTime = DateTimeOffset.FromUnixTimeSeconds((long) unixTimeSeconds).AddMilliseconds(unixTimeMilliseconds); + obj.UseLimit = DateTimeOffset.FromUnixTimeSeconds(ReadInt64(buffer)); + ulong unixTimeSeconds = ReadUInt64(buffer); + obj.Milliseconds = ReadUInt16(buffer); + obj.RealTime = DateTimeOffset.FromUnixTimeSeconds((long)unixTimeSeconds).AddMilliseconds(obj.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/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/Structure/CDataBoxGachaInfo.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataBoxGachaInfo.cs new file mode 100644 index 000000000..3c29b4c0f --- /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; } + public string Description { get; set; } + public string Detail { get; set; } + public byte WeightDispType { get; set; } + public string FreeSpaceText { get; set; } + public string ListAddr { get; set; } + public string ImageAddr { get; set; } + 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 index 2b16f11d9..38cec6369 100644 --- a/Arrowgene.Ddon.Shared/Entity/Structure/CDataCAPtoGPChangeElement.cs +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataCAPtoGPChangeElement.cs @@ -1,18 +1,25 @@ -using System.Collections.Generic; using Arrowgene.Buffers; -using Arrowgene.Ddon.Shared.Model; - + 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) @@ -24,7 +31,7 @@ public override void Write(IBuffer buffer, CDataCAPtoGPChangeElement obj) WriteUInt32(buffer, obj.BackIconID); WriteUInt32(buffer, obj.FrameIconID); } - + public override CDataCAPtoGPChangeElement Read(IBuffer buffer) { CDataCAPtoGPChangeElement obj = new CDataCAPtoGPChangeElement(); diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseAvailable.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseAvailable.cs index 1d2af4a76..1c1de3d00 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,26 +7,24 @@ 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; } + public DateTimeOffset UseLimitTime { get; set; } + public uint CourseID { get; set; } + public uint LineupID { get; set; } + public uint BackIconID { get; set; } + public uint FrameIconID { get; set; } 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); + WriteUInt64(buffer, (ulong)obj.UseLimitTime.ToUnixTimeSeconds()); WriteUInt32(buffer, obj.CourseID); WriteUInt32(buffer, obj.LineupID); WriteUInt32(buffer, obj.BackIconID); @@ -36,13 +34,15 @@ public override void Write(IBuffer buffer, CDataGPCourseAvailable obj) 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((long)ReadUInt64(buffer)); obj.CourseID = ReadUInt32(buffer); obj.LineupID = ReadUInt32(buffer); obj.BackIconID = ReadUInt32(buffer); obj.FrameIconID = ReadUInt32(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/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..56e1da853 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaDrawInfo.cs @@ -0,0 +1,38 @@ +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() + { + } + + 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..1975d4f45 --- /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; } + public string Description { get; set; } + public string Detail { get; set; } + public byte WeightDispType { get; set; } + public string WeightDispTitle { get; set; } + public string WeightDispText { get; set; } + public string ListAddr { get; set; } + public string ImageAddr { get; set; } + 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..8fc3220cd --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGameItemStorageInfo.cs @@ -0,0 +1,37 @@ +using Arrowgene.Buffers; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataGameItemStorageInfo + { + public CDataGameItemStorage GameItemStorage { get; set; } + public ushort UsedSlotNum { get; set; } + public ushort MaxSlotNum { get; set; } + + public CDataGameItemStorageInfo() + { + } + + 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; + } + } + } +} From 23efa3203c8327ec1244e59f3e2ac0fda4d4bb73 Mon Sep 17 00:00:00 2001 From: Sehkah Date: Thu, 15 Aug 2024 00:42:03 +0200 Subject: [PATCH 3/6] Functioning Online Station. --- .../Characters/WalletManager.cs | 5 +- Arrowgene.Ddon.GameServer/DdonGameServer.cs | 25 +- .../Handler/BoxGachaBuyHandler.cs | 21 +- .../Handler/GachaBuyHandler.cs | 22 +- .../Handler/GetFreeRentalPawnListHandler.cs | 44 + .../Handler/GpChangeCapToGpHandler.cs | 17 +- .../Handler/GpCogGetIdHandler.cs | 3 +- .../Handler/GpCourseGetValidListHandler.cs | 36 + .../GpCourseUseFromAvailableHandler.cs | 28 + .../Handler/GpGetCapHandler.cs | 25 + .../GpGpCourseGetAvailableListHandler.cs | 28 +- .../Handler/GpShopDisplayTypeHandler.cs | 27 +- .../Handler/GpShopGetBuyHistoryHandler.cs | 34 + .../Entity/EntitySerializer.cs | 8 +- .../C2SGetFreeRentalPawnListReq.cs | 28 + .../C2SGpCourseGetValidListReq.cs | 23 + .../C2SGpCourseUseFromAvailableReq.cs | 33 + .../Entity/PacketStructure/C2SGpGetCapReq.cs | 23 + .../C2SGpShopGetBuyHistoryReq.cs | 28 + .../S2CGetFreeRentalPawnListRes.cs | 40 + .../S2CGpCourseGetValidListRes.cs | 39 + .../S2CGpCourseUseFromAvailableRes.cs | 32 + .../Entity/PacketStructure/S2CGpGetCapRes.cs | 32 + .../Entity/PacketStructure/S2CGpGetGpRes.cs | 1 - .../S2CGpShopGetBuyHistoryRes.cs | 39 + .../Structure/CDataFreeRentalPawnList.cs | 43 + .../Structure/CDataGPCourseAvailable.cs | 12 +- .../Entity/Structure/CDataGPCourseValid.cs | 34 +- .../Structure/CDataGPShopBuyHistoryElement.cs | 40 + .../Files/Assets/GpCourseInfo.json | 1078 +++++++++++++++++ 30 files changed, 1725 insertions(+), 123 deletions(-) create mode 100644 Arrowgene.Ddon.GameServer/Handler/GetFreeRentalPawnListHandler.cs create mode 100644 Arrowgene.Ddon.GameServer/Handler/GpCourseGetValidListHandler.cs create mode 100644 Arrowgene.Ddon.GameServer/Handler/GpCourseUseFromAvailableHandler.cs create mode 100644 Arrowgene.Ddon.GameServer/Handler/GpGetCapHandler.cs create mode 100644 Arrowgene.Ddon.GameServer/Handler/GpShopGetBuyHistoryHandler.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGetFreeRentalPawnListReq.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpCourseGetValidListReq.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpCourseUseFromAvailableReq.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpGetCapReq.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGpShopGetBuyHistoryReq.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGetFreeRentalPawnListRes.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpCourseGetValidListRes.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpCourseUseFromAvailableRes.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetCapRes.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpShopGetBuyHistoryRes.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/Structure/CDataFreeRentalPawnList.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/Structure/CDataGPShopBuyHistoryElement.cs 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 0063e0853..2410483a4 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,20 +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 ItemGetItemStorageInfoHandler(this)); - + AddHandler(new CraftGetCraftProductInfoHandler(this)); AddHandler(new CraftCancelCraftHandler(this)); AddHandler(new CraftTimeSaveHandler(this)); @@ -440,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)); @@ -545,6 +550,7 @@ private void LoadPacketHandler() AddHandler(new PawnExpeditionGetSallyInfoHandler(this)); AddHandler(new PhotoPhotoTakeHandler(this)); + AddHandler(new GetFreeRentalPawnListHandler(this)); AddHandler(new ProfileGetCharacterProfileHandler(this)); AddHandler(new ProfileGetMyCharacterProfileHandler(this)); @@ -574,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)); @@ -697,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 index 293549b61..d4c9f35bd 100644 --- a/Arrowgene.Ddon.GameServer/Handler/BoxGachaBuyHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/BoxGachaBuyHandler.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using Arrowgene.Ddon.GameServer.Characters; using Arrowgene.Ddon.Server; using Arrowgene.Ddon.Shared.Entity.PacketStructure; using Arrowgene.Ddon.Shared.Entity.Structure; @@ -40,25 +41,7 @@ public override S2CBoxGachaBuyRes Handle(GameClient client, C2SBoxGachaBuyReq re } // TODO: based on Settlement ID figure out which currency was used - CDataWalletPoint walletPoint = client.Character.WalletPointList.Find(l => l.Type == WalletType.GoldenGemstones); - walletPoint.Value--; - - S2CItemUpdateCharacterItemNtc itemUpdateNtc = new S2CItemUpdateCharacterItemNtc - { - UpdateType = ItemNoticeType.Default, - UpdateItemList = itemUpdateResult, - UpdateWalletList = new List - { - new() - { - Type = WalletType.GoldenGemstones, - Value = walletPoint.Value, - AddPoint = (int)-request.Price, - ExtraBonusPoint = 0 - } - } - }; - client.Send(itemUpdateNtc); + Server.WalletManager.RemoveFromWalletNtc(client, client.Character, WalletType.GoldenGemstones, request.Price); return res; } diff --git a/Arrowgene.Ddon.GameServer/Handler/GachaBuyHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GachaBuyHandler.cs index 5247a986f..8a986fc6d 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GachaBuyHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GachaBuyHandler.cs @@ -37,26 +37,8 @@ public override S2CGachaBuyRes Handle(GameClient client, C2SGachaBuyReq request) itemUpdateResult.AddRange(Server.ItemManager.AddItem(Server, client.Character, true, gachaItemInfo.ItemId, gachaItemInfo.ItemNum)); } - // TODO: based on Settlement ID we have to figure out which currency was used - CDataWalletPoint walletPoint = client.Character.WalletPointList.Find(l => l.Type == WalletType.GoldenGemstones); - walletPoint.Value--; - - S2CItemUpdateCharacterItemNtc itemUpdateNtc = new S2CItemUpdateCharacterItemNtc - { - UpdateType = ItemNoticeType.Default, - UpdateItemList = itemUpdateResult, - UpdateWalletList = new List - { - new() - { - Type = WalletType.GoldenGemstones, - Value = walletPoint.Value, - AddPoint = (int)-request.Price, - ExtraBonusPoint = 0 - } - } - }; - client.Send(itemUpdateNtc); + // 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/GetFreeRentalPawnListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GetFreeRentalPawnListHandler.cs new file mode 100644 index 000000000..605a170bb --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/GetFreeRentalPawnListHandler.cs @@ -0,0 +1,44 @@ +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 GetFreeRentalPawnListHandler : GameRequestPacketHandler + { + private static readonly ServerLogger Logger = LogProvider.Logger(typeof(GetFreeRentalPawnListHandler)); + + public GetFreeRentalPawnListHandler(DdonGameServer server) : base(server) + { + } + + public override S2CGetFreeRentalPawnListRes Handle(GameClient client, C2SGetFreeRentalPawnListReq request) + { + S2CGetFreeRentalPawnListRes res = new S2CGetFreeRentalPawnListRes(); + + // TODO: track free rental pawns courses in DB + res.FreeRentalPawnList.Add( + new CDataFreeRentalPawnList + { + PawnId = 1, + Name = "FreeRentalPawn1 (active)", + ImageAddr = "http://localhost:52099/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 = "http://localhost:52099/shop/img/payment/icon_pawn1.png", + LineupId = 2, + ExpireDateTime = (ulong)DateTimeOffset.UtcNow.ToUnixTimeSeconds() - 1000 + }); + + return res; + } + } +} diff --git a/Arrowgene.Ddon.GameServer/Handler/GpChangeCapToGpHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpChangeCapToGpHandler.cs index 35c82f6dd..b78021d72 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GpChangeCapToGpHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GpChangeCapToGpHandler.cs @@ -23,21 +23,10 @@ public override S2CGpChangeCapToGpRes Handle(GameClient client, C2SGpChangeCapTo res.ChangeListID = request.ChangeListID; uint changeListGPValue = 1; - CDataWalletPoint walletPoint = client.Character.WalletPointList.Find(l => l.Type == WalletType.GoldenGemstones); - walletPoint.Value += changeListGPValue; - S2CItemUpdateCharacterItemNtc itemUpdateNtc = new S2CItemUpdateCharacterItemNtc(); - itemUpdateNtc.UpdateType = ItemNoticeType.ResetCraftpoint; - itemUpdateNtc.UpdateWalletList.Add(new CDataUpdateWalletPoint() - { - Type = WalletType.GoldenGemstones, - Value = walletPoint.Value, - AddPoint = (int)res.GP, - ExtraBonusPoint = 0 - }); - Server.Database.UpdateWalletPoint(client.Character.CharacterId, walletPoint); - client.Send(itemUpdateNtc); + // TODO: based on Settlement ID figure out which currency was used + uint walletPoints = Server.WalletManager.AddToWalletNtc(client, client.Character, WalletType.GoldenGemstones, changeListGPValue); - res.GP = walletPoint.Value; + res.GP = walletPoints; // TODO: store CAP somewhere? res.CAP = 0; diff --git a/Arrowgene.Ddon.GameServer/Handler/GpCogGetIdHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpCogGetIdHandler.cs index 6e9f7fe34..cdcf418c0 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GpCogGetIdHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GpCogGetIdHandler.cs @@ -17,8 +17,7 @@ public override S2CGpCogGetIdRes Handle(GameClient client, C2SGpCogGetIdReq requ { S2CGpCogGetIdRes res = new S2CGpCogGetIdRes(); - // TODO: implement S2C_GP_COG_GET_ID_RES - + // 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..5a3186bff --- /dev/null +++ b/Arrowgene.Ddon.GameServer/Handler/GpCourseGetValidListHandler.cs @@ -0,0 +1,36 @@ +#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(); + + // TODO: track active courses in DB + var offset = DateTimeOffset.UtcNow; + res.Items.Add(new CDataGPCourseValid + { + ID = 1, + CourseID = 1, + Name = "Adventure Passport (active)", + ImageAddr = "http://localhost:52099/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/GpGpCourseGetAvailableListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpGpCourseGetAvailableListHandler.cs index f88152a32..cd7fd0ab2 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GpGpCourseGetAvailableListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GpGpCourseGetAvailableListHandler.cs @@ -1,7 +1,9 @@ using System; +using System.Collections.Generic; using Arrowgene.Ddon.Server; using Arrowgene.Ddon.Shared; using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Ddon.Shared.Entity.Structure; using Arrowgene.Logging; namespace Arrowgene.Ddon.GameServer.Handler @@ -22,20 +24,18 @@ public override S2CGpGpCourseGetAvailableListRes Handle(GameClient client, C2SGp S2CGpGpCourseGetAvailableListRes res = new S2CGpGpCourseGetAvailableListRes(); DateTimeOffset offset = DateTimeOffset.UtcNow; - - // res.Items = new List - // { - // new CDataGPCourseAvailable - // { - // ID = 1, - // Name = "Adventure Passport", - // UseLimitTime = offset.AddMonths(12), - // CourseID = 1, - // LineupID = 1, - // BackIconID = 0, - // FrameIconID = 0 - // } - // }; + res.Items = new List + { + new CDataGPCourseAvailable + { + ID = 1, + Name = "Adventure Passport (available)", + UseLimitTime = offset.AddMonths(12), + CourseID = 1, + LineupID = 1, + ImageAddr = "http://localhost:52099/shop/img/payment/icon_course1.png", + } + }; return res; } diff --git a/Arrowgene.Ddon.GameServer/Handler/GpShopDisplayTypeHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpShopDisplayTypeHandler.cs index 1c8a7dd52..8130bd955 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GpShopDisplayTypeHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GpShopDisplayTypeHandler.cs @@ -17,23 +17,24 @@ public GpShopDisplayTypeHandler(DdonGameServer server) : base(server) public override S2CGpShopDisplayGetTypeRes Handle(GameClient client, C2SGpShopDisplayGetTypeReq request) { - // TODO: implement S2C_GP_GP_SHOP_DISPLAY_GET_TYPE_RES 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 = "ピックアップ", InGameUrlID = 11 }, - new() { ID = 3, Name = "パスポート", InGameUrlID = 11 }, - new() { ID = 6, Name = "オプションコース", InGameUrlID = 11 }, - new() { ID = 7, Name = "ポーンボイス", InGameUrlID = 11 }, - new() { ID = 8, Name = "クラフト関連", InGameUrlID = 11 }, - new() { ID = 9, Name = "クレスト", InGameUrlID = 11 }, - new() { ID = 10, Name = "消耗品&装備品", InGameUrlID = 11 }, - new() { ID = 11, Name = "ボイス定型文&ショートカット枠", InGameUrlID = 11 }, - new() { ID = 12, Name = "LV100&ジョブ修練セット", InGameUrlID = 11 }, - new() { ID = 13, Name = "LV.100になる宝珠", InGameUrlID = 11 }, - new() { ID = 14, Name = "シーズン1~2戦技・ジョブ修練全解放", InGameUrlID = 11 }, - new() { ID = 15, Name = "! 期間限定 !", InGameUrlID = 11 } + 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; 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.Shared/Entity/EntitySerializer.cs b/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs index f2fbc1010..73734c6be 100644 --- a/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs +++ b/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs @@ -215,6 +215,7 @@ static EntitySerializer() Create(new CDataHasRegionBreakReward.Serializer()); Create(new CDataGPShopDisplayType.Serializer()); + Create(new CDataGPShopBuyHistoryElement.Serializer()); Create(new CDataGachaInfo.Serializer()); Create(new CDataGachaDrawGroupInfo.Serializer()); @@ -343,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()); @@ -697,14 +699,18 @@ static EntitySerializer() 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 C2SItemGetItemStorageInfoReq.Serializer()); Create(new C2SInnGetPenaltyHealStayPriceReq.Serializer()); Create(new C2SInnGetStayPriceReq.Serializer()); diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGetFreeRentalPawnListReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGetFreeRentalPawnListReq.cs new file mode 100644 index 000000000..11ef8de68 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGetFreeRentalPawnListReq.cs @@ -0,0 +1,28 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class C2SGetFreeRentalPawnListReq : IPacketStructure + { + public PacketId Id => PacketId.C2S_PAWN_GET_FREE_RENTAL_PAWN_LIST_REQ; + + public C2SGetFreeRentalPawnListReq() + { + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, C2SGetFreeRentalPawnListReq obj) + { + } + + public override C2SGetFreeRentalPawnListReq Read(IBuffer buffer) + { + C2SGetFreeRentalPawnListReq obj = new C2SGetFreeRentalPawnListReq(); + + 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/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/S2CGetFreeRentalPawnListRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGetFreeRentalPawnListRes.cs new file mode 100644 index 000000000..21c9c82ad --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGetFreeRentalPawnListRes.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 S2CGetFreeRentalPawnListRes : ServerResponse + { + public override PacketId Id => PacketId.S2C_PAWN_GET_FREE_RENTAL_PAWN_LIST_RES; + + public List FreeRentalPawnList { get; set; } + + public S2CGetFreeRentalPawnListRes() + { + FreeRentalPawnList = new List(); + } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, S2CGetFreeRentalPawnListRes obj) + { + WriteServerResponse(buffer, obj); + + WriteEntityList(buffer, obj.FreeRentalPawnList); + } + + public override S2CGetFreeRentalPawnListRes Read(IBuffer buffer) + { + S2CGetFreeRentalPawnListRes obj = new S2CGetFreeRentalPawnListRes(); + + ReadServerResponse(buffer, obj); + + obj.FreeRentalPawnList = ReadEntityList(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/S2CGpGetGpRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpRes.cs index bb332edd9..c3440f26f 100644 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpRes.cs +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpRes.cs @@ -10,7 +10,6 @@ public class S2CGpGetGpRes : ServerResponse public S2CGpGetGpRes() { - RealTime = DateTimeOffset.MinValue; } public uint GP { get; set; } 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/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 1c1de3d00..7e8c51c57 100644 --- a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseAvailable.cs +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseAvailable.cs @@ -9,15 +9,13 @@ public CDataGPCourseAvailable() { } - // Character ID? public uint ID { get; set; } public string Name { get; set; } public DateTimeOffset UseLimitTime { get; set; } public uint CourseID { get; set; } public uint LineupID { get; set; } - public uint BackIconID { get; set; } - public uint FrameIconID { get; set; } - + public string ImageAddr { get; set; } + public class Serializer : EntitySerializer { public override void Write(IBuffer buffer, CDataGPCourseAvailable obj) @@ -27,8 +25,7 @@ public override void Write(IBuffer buffer, CDataGPCourseAvailable obj) WriteUInt64(buffer, (ulong)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) @@ -40,8 +37,7 @@ public override CDataGPCourseAvailable Read(IBuffer buffer) obj.UseLimitTime = DateTimeOffset.FromUnixTimeSeconds((long)ReadUInt64(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..5d1b566b2 100644 --- a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseValid.cs +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseValid.cs @@ -6,40 +6,34 @@ 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 uint ID; + public uint CourseID; + public string Name; + public string ImageAddr; public ulong StartTime; public ulong EndTime; - + public class Serializer : EntitySerializer { 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 + WriteUInt32(buffer, obj.ID); + WriteUInt32(buffer, obj.CourseID); + WriteMtString(buffer, obj.Name); + WriteMtString(buffer, obj.ImageAddr); + WriteUInt64(buffer, obj.StartTime); WriteUInt64(buffer, obj.EndTime); } 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.ID = ReadUInt32(buffer); + obj.CourseID = ReadUInt32(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/CDataGPShopBuyHistoryElement.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPShopBuyHistoryElement.cs new file mode 100644 index 000000000..418690373 --- /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; } + 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/Files/Assets/GpCourseInfo.json b/Arrowgene.Ddon.Shared/Files/Assets/GpCourseInfo.json index 5007fb413..6edc189fa 100644 --- a/Arrowgene.Ddon.Shared/Files/Assets/GpCourseInfo.json +++ b/Arrowgene.Ddon.Shared/Files/Assets/GpCourseInfo.json @@ -863,3 +863,1081 @@ } ] } +======= + "comment": [ + "You can find official course effects described at https://web.archive.org/web/20170711054053/https://members.dd-on.jp/shop/payment/stone/top", + "", + "It is possible to modify this file to change the course which is available to be used.", + "The 'valid_courses' key, contains a list of all valid courses for every character on the server.", + "The 'course_id' field corresponds to the 'id' field of the objects in the 'courses' key.", + "The 'start_time' and 'end_time' values are in unix timestamp format." + ], + "valid_courses": [ + { + "course_id": 17, + "start_time": 1440993600, + "end_time": 4103413199, + "comment": "Course 17 valid until the year 2100" + } + ], + "courses": [ + { + "id": 1, + "name": "冒険パスポート", + "comment": "Adventure Passport", + "icon_path": "http://localhost:52099/shop/img/payment/icon_course1.png", + "description": "Resurrection power is restored as many times as you like! A set of basic services that make playing DDON useful, such as expanding storage boxes.", + "url": "https://web.archive.org/web/20170711035052/https://members.dd-on.jp/shop/payment/course/1", + "target": 0, + "priority_grp": 100, + "priority_same_time": 70, + "announce_type": 2, + "effects": [ + 1, + 2, + 3, + 5, + 6, + 7, + 9, + 10, + 11, + 40, + 41, + 44, + 50, + 52, + 128, + 213, + 215, + 218, + 253 + ] + }, + { + "id": 2, + "name": "報酬サポートコース", + "comment": "Reward Support Course", + "icon_path": "http://localhost:52099/shop/img/payment/icon_course1.png", + "description": "Rarely small items are available! Acquisition amount of rims and blood orbs, acquisition number of collection/mining/treasure boxes, etc.", + "url": "https://web.archive.org/web/20170711035052/https://members.dd-on.jp/shop/payment/course/2", + "target": 1, + "priority_grp": 100, + "priority_same_time": 40, + "announce_type": 3, + "effects": [ + 12, + 13, + 14, + 15, + 16, + 17, + 51, + 59, + 149 + ] + }, + { + "id": 3, + "name": "成長サポートコース", + "comment": "Growth Support Course", + "icon_path": "http://localhost:52099/shop/img/payment/icon_course1.png", + "description": "Experience of learners and pawns, a course to help grow learners and pawns that also raise area points!", + "url": "https://web.archive.org/web/20170711035052/https://members.dd-on.jp/shop/payment/course/3", + "target": 1, + "priority_grp": 100, + "priority_same_time": 30, + "announce_type": 3, + "effects": [ + 18, + 19, + 20, + 22, + 23, + 25, + 26, + 27, + 70, + 119, + 150, + 151, + 208, + 209, + 210, + 211, + 212, + 246, + 254 + ] + }, + { + "id": 4, + "name": "安心アシストコース", + "comment": "Reliable Assist Course", + "icon_path": "http://localhost:52099/shop/img/payment/icon_course1.png", + "description": "Reduces damage to learners and pawns, as well as accumulation of abnormal conditions! It reduces the danger of adventure and provides a reassuring life.", + "url": "https://web.archive.org/web/20170711035052/https://members.dd-on.jp/shop/payment/course/4", + "target": 1, + "priority_grp": 100, + "priority_same_time": 50, + "announce_type": 3, + "effects": [ + 71, + 72, + 73, + 74, + 75 + ] + }, + { + "id": 5, + "name": "ダブル発動特典", + "comment": "Double Activation Benefit", + "icon_path": "", + "description": "", + "url": "", + "target": 0, + "priority_grp": 90, + "priority_same_time": 20, + "announce_type": 1, + "effects": [ + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 248, + 255, + 266 + ] + }, + { + "id": 6, + "name": "トリプル発動特典", + "comment": "Triple Activation Benefit", + "icon_path": "", + "description": "", + "url": "", + "target": 0, + "priority_grp": 80, + "priority_same_time": 10, + "announce_type": 1, + "effects": [ + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 247, + 256, + 264, + 265, + 267 + ] + }, + { + "id": 7, + "name": "グランドミッションコース", + "comment": "Grand Mission Course", + "icon_path": "", + "description": "Grand Mission Earnings Score and Job Points Up!Cumulative score rewards make it easier to aim for high rank rewards!", + "url": "https://web.archive.org/web/20170711035052/https://members.dd-on.jp/shop/payment/course/7", + "target": 0, + "priority_grp": 200, + "priority_same_time": 100, + "announce_type": 1, + "effects": [] + }, + { + "id": 8, + "name": "ネットカフェ特典コース", + "comment": "Internet Cafe Special Course", + "icon_path": "", + "description": "", + "url": "", + "target": 0, + "priority_grp": 50, + "priority_same_time": 0, + "announce_type": 1, + "effects": [ + 49, + 1, + 2, + 3, + 5, + 6, + 7, + 9, + 10, + 11, + 40, + 41, + 44, + 50, + 52, + 128, + 213, + 215, + 218, + 253, + 12, + 13, + 14, + 15, + 16, + 17, + 51, + 59, + 149, + 18, + 19, + 20, + 22, + 23, + 25, + 26, + 27, + 70, + 119, + 150, + 151, + 208, + 209, + 210, + 211, + 212, + 246, + 254, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 248, + 255, + 266, + 69, + 216, + 217 + ] + }, + { + "id": 9, + "name": "格納チェストパスポート1", + "comment": "Storage Chest Passport 1", + "icon_path": "", + "description": "Store 400 additional items!A passport that makes playing DDON even more convenient!", + "url": "https://web.archive.org/web/20170711035052/https://members.dd-on.jp/shop/payment/course/9", + "target": 0, + "priority_grp": 100, + "priority_same_time": 80, + "announce_type": 2, + "effects": [ + 69 + ] + }, + { + "id": 10, + "name": "討伐経験値5倍コース", + "comment": "Subjugation Experience Value 5x Course", + "icon_path": "", + "description": "", + "url": "", + "target": 0, + "priority_grp": 100, + "priority_same_time": 25, + "announce_type": 3, + "effects": [ + 76, + 77, + 78 + ] + }, + { + "id": 11, + "name": "格納チェストパスポート2", + "comment": "Storage Chest Passport 2", + "icon_path": "", + "description": "", + "url": "", + "target": 0, + "priority_grp": 100, + "priority_same_time": 85, + "announce_type": 2, + "effects": [ + 216 + ] + }, + { + "id": 12, + "name": "格納チェストパスポート3", + "comment": "Storage Chest Passport 3", + "icon_path": "", + "description": "", + "url": "", + "target": 0, + "priority_grp": 100, + "priority_same_time": 90, + "announce_type": 2, + "effects": [ + 217 + ] + }, + { + "id": 13, + "name": "PP獲得量3倍コース", + "comment": "3x PP Acquisition Course", + "icon_path": "", + "description": "", + "url": "", + "target": 0, + "priority_grp": 100, + "priority_same_time": 24, + "announce_type": 3, + "effects": [ + 219 + ] + }, + { + "id": 14, + "name": "PP獲得量5倍コース", + "comment": "5x PP Acquisition Course", + "icon_path": "", + "description": "", + "url": "", + "target": 0, + "priority_grp": 100, + "priority_same_time": 23, + "announce_type": 3, + "effects": [ + 229 + ] + }, + { + "id": 15, + "name": "全コース無料開放", + "comment": "All courses free of charge", + "icon_path": "", + "description": "", + "url": "", + "target": 0, + "priority_grp": 20, + "priority_same_time": 0, + "announce_type": 3, + "effects": [ + 1, + 2, + 3, + 5, + 6, + 7, + 9, + 10, + 11, + 40, + 41, + 44, + 50, + 52, + 128, + 213, + 215, + 218, + 253, + 12, + 13, + 14, + 15, + 16, + 17, + 51, + 59, + 149, + 18, + 19, + 20, + 22, + 23, + 25, + 26, + 27, + 70, + 119, + 150, + 151, + 208, + 209, + 210, + 211, + 212, + 246, + 254, + 71, + 72, + 73, + 74, + 75, + 69, + 216, + 217 + ] + }, + { + "id": 16, + "name": "PP獲得量5倍コースⅡ", + "comment": "5x PP Acquisition Course II", + "icon_path": "", + "description": "", + "url": "", + "target": 0, + "priority_grp": 100, + "priority_same_time": 22, + "announce_type": 3, + "effects": [ + 261, + 262 + ] + }, + { + "id": 17, + "name": "Arrowgene QOL Course", + "comment": "Example of custom made course effect.", + "icon_path": "", + "description": "Allows item boxes to be used outside the main city, enable expanded storage tabs and allows craft items to be consumed from the storage box.", + "url": "", + "target": 0, + "priority_grp": 100, + "priority_same_time": 70, + "announce_type": 2, + "effects": [ + 2, + 3, + 69, + 216, + 217, + 128 + ] + } + ], + "effects": [ + { + "uid": 1, + "id": 1, + "param0": 0, + "param1": 0, + "comment": "GP_COURSE_EFFECT_INFINITE_REVIVE" + }, + { + "uid": 2, + "id": 2, + "param0": 0, + "param1": 0, + "comment": "GP_COURSE_EFFECT_STRAGE_EXTEND" + }, + { + "uid": 3, + "id": 3, + "param0": 0, + "param1": 0, + "comment": "GP_COURSE_EFFECT_EXTRA_STRAGE_BOX" + }, + { + "uid": 5, + "id": 5, + "param0": 100, + "param1": 0, + "comment": "GP_COURSE_EFFECT_FREE_MY_WARP_POINT" + }, + { + "uid": 6, + "id": 6, + "param0": 50, + "param1": 0, + "comment": "GP_COURSE_EFFECT_WARP_DISCOUNT" + }, + { + "uid": 7, + "id": 7, + "param0": 10, + "param1": 0, + "comment": "GP_COURSE_EFFECT_QUEST_ORDER_LIST_EXTEND" + }, + { + "uid": 9, + "id": 9, + "param0": 5, + "param1": 0, + "comment": "GP_COURSE_EFFECT_BAZAAR_EXHIBIT_EXTEND" + }, + { + "uid": 10, + "id": 10, + "param0": 86400, + "param1": 0, + "comment": "GP_COURSE_EFFECT_BAZAAR_RE_EXHIBIT_SHORTEN" + }, + { + "uid": 11, + "id": 11, + "param0": 200, + "param1": 0, + "comment": "GP_COURSE_EFFECT_AREA_MASTER_SUPPLY" + }, + { + "uid": 12, + "id": 12, + "param0": 200, + "param1": 0, + "comment": "GP_COURSE_EFFECT_WORLD_QUEST_REWARD_REALITY_UP" + }, + { + "uid": 13, + "id": 13, + "param0": 0, + "param1": 0, + "comment": "GP_COURSE_EFFECT_WORLD_QUEST_SPECIAL_REWARD" + }, + { + "uid": 14, + "id": 14, + "param0": 200, + "param1": 0, + "comment": "GP_COURSE_EFFECT_RIM_BQ_REWARD_UP" + }, + { + "uid": 15, + "id": 15, + "param0": 200, + "param1": 0, + "comment": "GP_COURSE_EFFECT_RIM_WQ_REWARD_UP" + }, + { + "uid": 16, + "id": 16, + "param0": 200, + "param1": 0, + "comment": "GP_COURSE_EFFECT_ENEMY_DROP_UP" + }, + { + "uid": 17, + "id": 17, + "param0": 200, + "param1": 0, + "comment": "GP_COURSE_EFFECT_GATHERING_ITEM_NUM_UP" + }, + { + "uid": 18, + "id": 18, + "param0": 200, + "param1": 0, + "comment": "GP_COURSE_EFFECT_ENEMY_EXP_UP" + }, + { + "uid": 19, + "id": 19, + "param0": 200, + "param1": 0, + "comment": "GP_COURSE_EFFECT_BQ_REWARD_EXP_UP" + }, + { + "uid": 20, + "id": 20, + "param0": 200, + "param1": 0, + "comment": "GP_COURSE_EFFECT_WQ_REWARD_EXP_UP" + }, + { + "uid": 22, + "id": 22, + "param0": 150, + "param1": 0, + "comment": "GP_COURSE_EFFECT_AREA_POINT_BQ_REWARD_UP" + }, + { + "uid": 23, + "id": 23, + "param0": 150, + "param1": 0, + "comment": "GP_COURSE_EFFECT_AREA_POINT_WQ_REWARD_UP" + }, + { + "uid": 25, + "id": 25, + "param0": 200, + "param1": 0, + "comment": "GP_COURSE_EFFECT_PAWN_ENEMY_EXP_UP" + }, + { + "uid": 26, + "id": 26, + "param0": 200, + "param1": 0, + "comment": "GP_COURSE_EFFECT_PAWN_BQ_REWARD_EXP_UP" + }, + { + "uid": 27, + "id": 27, + "param0": 200, + "param1": 0, + "comment": "GP_COURSE_EFFECT_PAWN_WQ_REWARD_EXP_UP" + }, + { + "uid": 40, + "id": 28, + "param0": 150, + "param1": 0, + "comment": "GP_COURSE_EFFECT_PAWN_CRAFT_EXP_UP" + }, + { + "uid": 41, + "id": 4, + "param0": 0, + "param1": 0, + "comment": "GP_COURSE_EFFECT_ALL_RELEASE_WARP_POINT" + }, + { + "uid": 44, + "id": 38, + "param0": 0, + "param1": 0, + "comment": "GP_COURSE_EFFECT_PAWN_REVIVE_BY_RIM" + }, + { + "uid": 49, + "id": 40, + "param0": 1500, + "param1": 0, + "comment": "GP_COURSE_EFFECT_REGULARLY_SEND_MAIL" + }, + { + "uid": 50, + "id": 34, + "param0": 50, + "param1": 0, + "comment": "GP_COURSE_EFFECT_PAWN_RESCUE_MOTION_SHORTEN" + }, + { + "uid": 51, + "id": 37, + "param0": 150, + "param1": 0, + "comment": "GP_COURSE_EFFECT_BLOOD_ORB_UP" + }, + { + "uid": 52, + "id": 35, + "param0": 100, + "param1": 0, + "comment": "GP_COURSE_EFFECT_STAY_DISCOUNT" + }, + { + "uid": 59, + "id": 41, + "param0": 200, + "param1": 0, + "comment": "GP_COURSE_EFFECT_EXM_REWARD_UP" + }, + { + "uid": 69, + "id": 42, + "param0": 0, + "param1": 0, + "comment": "GP_COURSE_EFFECT_BAGGAGE_RENTAL01" + }, + { + "uid": 70, + "id": 43, + "param0": 0, + "param1": 0, + "comment": "GP_COURSE_EFFECT_DISABLE_PARTY_ADJUST_ENEMY_EXP" + }, + { + "uid": 71, + "id": 44, + "param0": 50, + "param1": 0, + "comment": "GP_COURSE_EFFECT_INCOMING_DAMAGE_CUT_OFF" + }, + { + "uid": 72, + "id": 45, + "param0": 125, + "param1": 0, + "comment": "GP_COURSE_EFFECT_ENDURANCE_UP" + }, + { + "uid": 73, + "id": 46, + "param0": 50, + "param1": 0, + "comment": "GP_COURSE_EFFECT_DEBUFF_DAMAGE_CUT_OFF" + }, + { + "uid": 74, + "id": 47, + "param0": 66, + "param1": 200, + "comment": "GP_COURSE_EFFECT_ENABLE_LEVER_GACHA_ASSIST" + }, + { + "uid": 75, + "id": 48, + "param0": 350, + "param1": 0, + "comment": "GP_COURSE_EFFECT_PAWN_AUTO_RESCUE" + }, + { + "uid": 76, + "id": 18, + "param0": 500, + "param1": 0, + "comment": "GP_COURSE_EFFECT_ENEMY_EXP_UP" + }, + { + "uid": 77, + "id": 25, + "param0": 500, + "param1": 0, + "comment": "GP_COURSE_EFFECT_PAWN_ENEMY_EXP_UP" + }, + { + "uid": 78, + "id": 43, + "param0": 0, + "param1": 0, + "comment": "GP_COURSE_EFFECT_DISABLE_PARTY_ADJUST_ENEMY_EXP" + }, + { + "uid": 119, + "id": 49, + "param0": 200, + "param1": 0, + "comment": "GP_COURSE_EFFECT_ENEMY_PP_UP" + }, + { + "uid": 128, + "id": 50, + "param0": 0, + "param1": 0, + "comment": "GP_COURSE_EFFECT_CRAFT_BAGGAGE_EXTEND" + }, + { + "uid": 149, + "id": 51, + "param0": 200, + "param1": 0, + "comment": "" + }, + { + "uid": 150, + "id": 52, + "param0": 200, + "param1": 0, + "comment": "" + }, + { + "uid": 151, + "id": 53, + "param0": 200, + "param1": 0, + "comment": "" + }, + { + "uid": 189, + "id": 18, + "param0": 250, + "param1": 0, + "comment": "GP_COURSE_EFFECT_ENEMY_EXP_UP" + }, + { + "uid": 190, + "id": 19, + "param0": 250, + "param1": 0, + "comment": "GP_COURSE_EFFECT_PAWN_ENEMY_EXP_UP" + }, + { + "uid": 191, + "id": 20, + "param0": 250, + "param1": 0, + "comment": "GP_COURSE_EFFECT_WQ_REWARD_EXP_UP" + }, + { + "uid": 192, + "id": 52, + "param0": 250, + "param1": 0, + "comment": "" + }, + { + "uid": 193, + "id": 25, + "param0": 250, + "param1": 0, + "comment": "GP_COURSE_EFFECT_PAWN_ENEMY_EXP_UP" + }, + { + "uid": 194, + "id": 26, + "param0": 250, + "param1": 0, + "comment": "GP_COURSE_EFFECT_PAWN_BQ_REWARD_EXP_UP" + }, + { + "uid": 195, + "id": 27, + "param0": 250, + "param1": 0, + "comment": "GP_COURSE_EFFECT_PAWN_WQ_REWARD_EXP_UP" + }, + { + "uid": 196, + "id": 53, + "param0": 250, + "param1": 0, + "comment": "" + }, + { + "uid": 197, + "id": 18, + "param0": 300, + "param1": 0, + "comment": "GP_COURSE_EFFECT_ENEMY_EXP_UP" + }, + { + "uid": 198, + "id": 19, + "param0": 300, + "param1": 0, + "comment": "GP_COURSE_EFFECT_BQ_REWARD_EXP_UP" + }, + { + "uid": 199, + "id": 20, + "param0": 300, + "param1": 0, + "comment": "GP_COURSE_EFFECT_WQ_REWARD_EXP_UP" + }, + { + "uid": 200, + "id": 52, + "param0": 300, + "param1": 0, + "comment": "" + }, + { + "uid": 201, + "id": 25, + "param0": 300, + "param1": 0, + "comment": "GP_COURSE_EFFECT_PAWN_ENEMY_EXP_UP" + }, + { + "uid": 202, + "id": 26, + "param0": 300, + "param1": 0, + "comment": "GP_COURSE_EFFECT_PAWN_BQ_REWARD_EXP_UP" + }, + { + "uid": 203, + "id": 27, + "param0": 300, + "param1": 0, + "comment": "GP_COURSE_EFFECT_PAWN_BQ_REWARD_EXP_UP" + }, + { + "uid": 204, + "id": 53, + "param0": 300, + "param1": 0, + "comment": "" + }, + { + "uid": 208, + "id": 60, + "param0": 200, + "param1": 0, + "comment": "" + }, + { + "uid": 209, + "id": 61, + "param0": 200, + "param1": 0, + "comment": "" + }, + { + "uid": 210, + "id": 64, + "param0": 200, + "param1": 0, + "comment": "" + }, + { + "uid": 211, + "id": 65, + "param0": 200, + "param1": 0, + "comment": "" + }, + { + "uid": 212, + "id": 59, + "param0": 200, + "param1": 0, + "comment": "" + }, + { + "uid": 213, + "id": 63, + "param0": 0, + "param1": 0, + "comment": "" + }, + { + "uid": 215, + "id": 57, + "param0": 0, + "param1": 0, + "comment": "" + }, + { + "uid": 216, + "id": 54, + "param0": 0, + "param1": 0, + "comment": "" + }, + { + "uid": 217, + "id": 55, + "param0": 0, + "param1": 0, + "comment": "" + }, + { + "uid": 218, + "id": 62, + "param0": 0, + "param1": 0, + "comment": "" + }, + { + "uid": 219, + "id": 49, + "param0": 300, + "param1": 0, + "comment": "GP_COURSE_EFFECT_ENEMY_PP_UP" + }, + { + "uid": 229, + "id": 49, + "param0": 500, + "param1": 0, + "comment": "GP_COURSE_EFFECT_ENEMY_PP_UP" + }, + { + "uid": 246, + "id": 72, + "param0": 200, + "param1": 0, + "comment": "" + }, + { + "uid": 247, + "id": 49, + "param0": 300, + "param1": 0, + "comment": "GP_COURSE_EFFECT_ENEMY_PP_UP" + }, + { + "uid": 248, + "id": 49, + "param0": 250, + "param1": 0, + "comment": "GP_COURSE_EFFECT_ENEMY_PP_UP" + }, + { + "uid": 253, + "id": 58, + "param0": 0, + "param1": 0, + "comment": "" + }, + { + "uid": 254, + "id": 73, + "param0": 200, + "param1": 0, + "comment": "" + }, + { + "uid": 255, + "id": 73, + "param0": 250, + "param1": 0, + "comment": "" + }, + { + "uid": 256, + "id": 73, + "param0": 300, + "param1": 0, + "comment": "" + }, + { + "uid": 261, + "id": 49, + "param0": 500, + "param1": 0, + "comment": "GP_COURSE_EFFECT_ENEMY_PP_UP" + }, + { + "uid": 262, + "id": 73, + "param0": 500, + "param1": 0, + "comment": "" + }, + { + "uid": 264, + "id": 16, + "param0": 300, + "param1": 0, + "comment": "GP_COURSE_EFFECT_ENEMY_DROP_UP" + }, + { + "uid": 265, + "id": 17, + "param0": 300, + "param1": 0, + "comment": "GP_COURSE_EFFECT_GATHERING_ITEM_NUM_UP" + }, + { + "uid": 266, + "id": 37, + "param0": 250, + "param1": 0, + "comment": "GP_COURSE_EFFECT_BLOOD_ORB_UP" + }, + { + "uid": 267, + "id": 37, + "param0": 300, + "param1": 0, + "comment": "GP_COURSE_EFFECT_BLOOD_ORB_UP" + } + ] +} +>>>>>>> 377eacb9 (Functioning Online Station.) From 83254b241829d402b55fa4fc4c7837004d672f9d Mon Sep 17 00:00:00 2001 From: Paul Campbell Date: Fri, 29 Nov 2024 12:35:39 -0500 Subject: [PATCH 4/6] json asset Added json asset to populate shop contents. --- .../Handler/GachaBuyHandler.cs | 68 +- .../Handler/GachaListHandler.cs | 11 +- Arrowgene.Ddon.Shared/Asset/GachaAsset.cs | 14 + .../AssetReader/GachaAssetDeserializer.cs | 102 ++ Arrowgene.Ddon.Shared/AssetRepository.cs | 4 + .../Entity/Structure/CDataGachaDrawInfo.cs | 1 + Arrowgene.Ddon.Shared/Files/Assets/Gacha.json | 132 ++ .../Files/Assets/GpCourseInfo.json | 1080 +---------------- 8 files changed, 328 insertions(+), 1084 deletions(-) create mode 100644 Arrowgene.Ddon.Shared/Asset/GachaAsset.cs create mode 100644 Arrowgene.Ddon.Shared/AssetReader/GachaAssetDeserializer.cs create mode 100644 Arrowgene.Ddon.Shared/Files/Assets/Gacha.json diff --git a/Arrowgene.Ddon.GameServer/Handler/GachaBuyHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GachaBuyHandler.cs index 8a986fc6d..857dcc7a9 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GachaBuyHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GachaBuyHandler.cs @@ -1,8 +1,10 @@ +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.Ddon.Shared.Model.Quest; using Arrowgene.Logging; namespace Arrowgene.Ddon.GameServer.Handler @@ -17,8 +19,71 @@ public GachaBuyHandler(DdonGameServer server) : base(server) public override S2CGachaBuyRes Handle(GameClient client, C2SGachaBuyReq request) { - S2CGachaBuyRes res = new S2CGachaBuyRes(); + S2CGachaBuyRes res = new S2CGachaBuyRes() + { + GachaId = request.GachaId, + }; + + var gachaAsset = Server.AssetRepository.GachaAsset; + + if (!gachaAsset.GachaInfoList.ContainsKey(request.GachaId)) + { + return res; + } + + 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)) + { + // Failed to deduct the cost + return res; + } + + 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 @@ -39,6 +104,7 @@ public override S2CGachaBuyRes Handle(GameClient client, C2SGachaBuyReq request) // 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 index e0660970d..8f32e08fe 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GachaListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GachaListHandler.cs @@ -1,10 +1,8 @@ #nullable enable -using System; -using System.Collections.Generic; using Arrowgene.Ddon.Server; using Arrowgene.Ddon.Shared.Entity.PacketStructure; -using Arrowgene.Ddon.Shared.Entity.Structure; using Arrowgene.Logging; +using System.Linq; namespace Arrowgene.Ddon.GameServer.Handler { @@ -18,8 +16,12 @@ public GachaListHandler(DdonGameServer server) : base(server) public override S2CGachaListRes Handle(GameClient client, C2SGachaListReq request) { - S2CGachaListRes res = new S2CGachaListRes(); + S2CGachaListRes res = new S2CGachaListRes() + { + GachaList = Server.AssetRepository.GachaAsset.GachaInfoList.Values.ToList() + }; +#if false res.GachaList.Add(new CDataGachaInfo { Id = 266, @@ -87,6 +89,7 @@ public override S2CGachaListRes Handle(GameClient client, C2SGachaListReq reques } } }); +#endif return res; } 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..32e05a137 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 GachaAsset(); } 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/Structure/CDataGachaDrawInfo.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaDrawInfo.cs index 56e1da853..f3ce6bbe0 100644 --- a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaDrawInfo.cs +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaDrawInfo.cs @@ -11,6 +11,7 @@ public class CDataGachaDrawInfo public CDataGachaDrawInfo() { + GachaItemInfo = new List(); } public class Serializer : EntitySerializer diff --git a/Arrowgene.Ddon.Shared/Files/Assets/Gacha.json b/Arrowgene.Ddon.Shared/Files/Assets/Gacha.json new file mode 100644 index 000000000..448f8fb23 --- /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": "http://localhost:52099/shop/img/payment/icon_lot.png", + "image_address": "http://localhost:52099/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 6edc189fa..df47bd686 100644 --- a/Arrowgene.Ddon.Shared/Files/Assets/GpCourseInfo.json +++ b/Arrowgene.Ddon.Shared/Files/Assets/GpCourseInfo.json @@ -862,1082 +862,4 @@ "comment": "GP_COURSE_EFFECT_BLOOD_ORB_UP" } ] -} -======= - "comment": [ - "You can find official course effects described at https://web.archive.org/web/20170711054053/https://members.dd-on.jp/shop/payment/stone/top", - "", - "It is possible to modify this file to change the course which is available to be used.", - "The 'valid_courses' key, contains a list of all valid courses for every character on the server.", - "The 'course_id' field corresponds to the 'id' field of the objects in the 'courses' key.", - "The 'start_time' and 'end_time' values are in unix timestamp format." - ], - "valid_courses": [ - { - "course_id": 17, - "start_time": 1440993600, - "end_time": 4103413199, - "comment": "Course 17 valid until the year 2100" - } - ], - "courses": [ - { - "id": 1, - "name": "冒険パスポート", - "comment": "Adventure Passport", - "icon_path": "http://localhost:52099/shop/img/payment/icon_course1.png", - "description": "Resurrection power is restored as many times as you like! A set of basic services that make playing DDON useful, such as expanding storage boxes.", - "url": "https://web.archive.org/web/20170711035052/https://members.dd-on.jp/shop/payment/course/1", - "target": 0, - "priority_grp": 100, - "priority_same_time": 70, - "announce_type": 2, - "effects": [ - 1, - 2, - 3, - 5, - 6, - 7, - 9, - 10, - 11, - 40, - 41, - 44, - 50, - 52, - 128, - 213, - 215, - 218, - 253 - ] - }, - { - "id": 2, - "name": "報酬サポートコース", - "comment": "Reward Support Course", - "icon_path": "http://localhost:52099/shop/img/payment/icon_course1.png", - "description": "Rarely small items are available! Acquisition amount of rims and blood orbs, acquisition number of collection/mining/treasure boxes, etc.", - "url": "https://web.archive.org/web/20170711035052/https://members.dd-on.jp/shop/payment/course/2", - "target": 1, - "priority_grp": 100, - "priority_same_time": 40, - "announce_type": 3, - "effects": [ - 12, - 13, - 14, - 15, - 16, - 17, - 51, - 59, - 149 - ] - }, - { - "id": 3, - "name": "成長サポートコース", - "comment": "Growth Support Course", - "icon_path": "http://localhost:52099/shop/img/payment/icon_course1.png", - "description": "Experience of learners and pawns, a course to help grow learners and pawns that also raise area points!", - "url": "https://web.archive.org/web/20170711035052/https://members.dd-on.jp/shop/payment/course/3", - "target": 1, - "priority_grp": 100, - "priority_same_time": 30, - "announce_type": 3, - "effects": [ - 18, - 19, - 20, - 22, - 23, - 25, - 26, - 27, - 70, - 119, - 150, - 151, - 208, - 209, - 210, - 211, - 212, - 246, - 254 - ] - }, - { - "id": 4, - "name": "安心アシストコース", - "comment": "Reliable Assist Course", - "icon_path": "http://localhost:52099/shop/img/payment/icon_course1.png", - "description": "Reduces damage to learners and pawns, as well as accumulation of abnormal conditions! It reduces the danger of adventure and provides a reassuring life.", - "url": "https://web.archive.org/web/20170711035052/https://members.dd-on.jp/shop/payment/course/4", - "target": 1, - "priority_grp": 100, - "priority_same_time": 50, - "announce_type": 3, - "effects": [ - 71, - 72, - 73, - 74, - 75 - ] - }, - { - "id": 5, - "name": "ダブル発動特典", - "comment": "Double Activation Benefit", - "icon_path": "", - "description": "", - "url": "", - "target": 0, - "priority_grp": 90, - "priority_same_time": 20, - "announce_type": 1, - "effects": [ - 189, - 190, - 191, - 192, - 193, - 194, - 195, - 196, - 248, - 255, - 266 - ] - }, - { - "id": 6, - "name": "トリプル発動特典", - "comment": "Triple Activation Benefit", - "icon_path": "", - "description": "", - "url": "", - "target": 0, - "priority_grp": 80, - "priority_same_time": 10, - "announce_type": 1, - "effects": [ - 197, - 198, - 199, - 200, - 201, - 202, - 203, - 204, - 247, - 256, - 264, - 265, - 267 - ] - }, - { - "id": 7, - "name": "グランドミッションコース", - "comment": "Grand Mission Course", - "icon_path": "", - "description": "Grand Mission Earnings Score and Job Points Up!Cumulative score rewards make it easier to aim for high rank rewards!", - "url": "https://web.archive.org/web/20170711035052/https://members.dd-on.jp/shop/payment/course/7", - "target": 0, - "priority_grp": 200, - "priority_same_time": 100, - "announce_type": 1, - "effects": [] - }, - { - "id": 8, - "name": "ネットカフェ特典コース", - "comment": "Internet Cafe Special Course", - "icon_path": "", - "description": "", - "url": "", - "target": 0, - "priority_grp": 50, - "priority_same_time": 0, - "announce_type": 1, - "effects": [ - 49, - 1, - 2, - 3, - 5, - 6, - 7, - 9, - 10, - 11, - 40, - 41, - 44, - 50, - 52, - 128, - 213, - 215, - 218, - 253, - 12, - 13, - 14, - 15, - 16, - 17, - 51, - 59, - 149, - 18, - 19, - 20, - 22, - 23, - 25, - 26, - 27, - 70, - 119, - 150, - 151, - 208, - 209, - 210, - 211, - 212, - 246, - 254, - 189, - 190, - 191, - 192, - 193, - 194, - 195, - 196, - 248, - 255, - 266, - 69, - 216, - 217 - ] - }, - { - "id": 9, - "name": "格納チェストパスポート1", - "comment": "Storage Chest Passport 1", - "icon_path": "", - "description": "Store 400 additional items!A passport that makes playing DDON even more convenient!", - "url": "https://web.archive.org/web/20170711035052/https://members.dd-on.jp/shop/payment/course/9", - "target": 0, - "priority_grp": 100, - "priority_same_time": 80, - "announce_type": 2, - "effects": [ - 69 - ] - }, - { - "id": 10, - "name": "討伐経験値5倍コース", - "comment": "Subjugation Experience Value 5x Course", - "icon_path": "", - "description": "", - "url": "", - "target": 0, - "priority_grp": 100, - "priority_same_time": 25, - "announce_type": 3, - "effects": [ - 76, - 77, - 78 - ] - }, - { - "id": 11, - "name": "格納チェストパスポート2", - "comment": "Storage Chest Passport 2", - "icon_path": "", - "description": "", - "url": "", - "target": 0, - "priority_grp": 100, - "priority_same_time": 85, - "announce_type": 2, - "effects": [ - 216 - ] - }, - { - "id": 12, - "name": "格納チェストパスポート3", - "comment": "Storage Chest Passport 3", - "icon_path": "", - "description": "", - "url": "", - "target": 0, - "priority_grp": 100, - "priority_same_time": 90, - "announce_type": 2, - "effects": [ - 217 - ] - }, - { - "id": 13, - "name": "PP獲得量3倍コース", - "comment": "3x PP Acquisition Course", - "icon_path": "", - "description": "", - "url": "", - "target": 0, - "priority_grp": 100, - "priority_same_time": 24, - "announce_type": 3, - "effects": [ - 219 - ] - }, - { - "id": 14, - "name": "PP獲得量5倍コース", - "comment": "5x PP Acquisition Course", - "icon_path": "", - "description": "", - "url": "", - "target": 0, - "priority_grp": 100, - "priority_same_time": 23, - "announce_type": 3, - "effects": [ - 229 - ] - }, - { - "id": 15, - "name": "全コース無料開放", - "comment": "All courses free of charge", - "icon_path": "", - "description": "", - "url": "", - "target": 0, - "priority_grp": 20, - "priority_same_time": 0, - "announce_type": 3, - "effects": [ - 1, - 2, - 3, - 5, - 6, - 7, - 9, - 10, - 11, - 40, - 41, - 44, - 50, - 52, - 128, - 213, - 215, - 218, - 253, - 12, - 13, - 14, - 15, - 16, - 17, - 51, - 59, - 149, - 18, - 19, - 20, - 22, - 23, - 25, - 26, - 27, - 70, - 119, - 150, - 151, - 208, - 209, - 210, - 211, - 212, - 246, - 254, - 71, - 72, - 73, - 74, - 75, - 69, - 216, - 217 - ] - }, - { - "id": 16, - "name": "PP獲得量5倍コースⅡ", - "comment": "5x PP Acquisition Course II", - "icon_path": "", - "description": "", - "url": "", - "target": 0, - "priority_grp": 100, - "priority_same_time": 22, - "announce_type": 3, - "effects": [ - 261, - 262 - ] - }, - { - "id": 17, - "name": "Arrowgene QOL Course", - "comment": "Example of custom made course effect.", - "icon_path": "", - "description": "Allows item boxes to be used outside the main city, enable expanded storage tabs and allows craft items to be consumed from the storage box.", - "url": "", - "target": 0, - "priority_grp": 100, - "priority_same_time": 70, - "announce_type": 2, - "effects": [ - 2, - 3, - 69, - 216, - 217, - 128 - ] - } - ], - "effects": [ - { - "uid": 1, - "id": 1, - "param0": 0, - "param1": 0, - "comment": "GP_COURSE_EFFECT_INFINITE_REVIVE" - }, - { - "uid": 2, - "id": 2, - "param0": 0, - "param1": 0, - "comment": "GP_COURSE_EFFECT_STRAGE_EXTEND" - }, - { - "uid": 3, - "id": 3, - "param0": 0, - "param1": 0, - "comment": "GP_COURSE_EFFECT_EXTRA_STRAGE_BOX" - }, - { - "uid": 5, - "id": 5, - "param0": 100, - "param1": 0, - "comment": "GP_COURSE_EFFECT_FREE_MY_WARP_POINT" - }, - { - "uid": 6, - "id": 6, - "param0": 50, - "param1": 0, - "comment": "GP_COURSE_EFFECT_WARP_DISCOUNT" - }, - { - "uid": 7, - "id": 7, - "param0": 10, - "param1": 0, - "comment": "GP_COURSE_EFFECT_QUEST_ORDER_LIST_EXTEND" - }, - { - "uid": 9, - "id": 9, - "param0": 5, - "param1": 0, - "comment": "GP_COURSE_EFFECT_BAZAAR_EXHIBIT_EXTEND" - }, - { - "uid": 10, - "id": 10, - "param0": 86400, - "param1": 0, - "comment": "GP_COURSE_EFFECT_BAZAAR_RE_EXHIBIT_SHORTEN" - }, - { - "uid": 11, - "id": 11, - "param0": 200, - "param1": 0, - "comment": "GP_COURSE_EFFECT_AREA_MASTER_SUPPLY" - }, - { - "uid": 12, - "id": 12, - "param0": 200, - "param1": 0, - "comment": "GP_COURSE_EFFECT_WORLD_QUEST_REWARD_REALITY_UP" - }, - { - "uid": 13, - "id": 13, - "param0": 0, - "param1": 0, - "comment": "GP_COURSE_EFFECT_WORLD_QUEST_SPECIAL_REWARD" - }, - { - "uid": 14, - "id": 14, - "param0": 200, - "param1": 0, - "comment": "GP_COURSE_EFFECT_RIM_BQ_REWARD_UP" - }, - { - "uid": 15, - "id": 15, - "param0": 200, - "param1": 0, - "comment": "GP_COURSE_EFFECT_RIM_WQ_REWARD_UP" - }, - { - "uid": 16, - "id": 16, - "param0": 200, - "param1": 0, - "comment": "GP_COURSE_EFFECT_ENEMY_DROP_UP" - }, - { - "uid": 17, - "id": 17, - "param0": 200, - "param1": 0, - "comment": "GP_COURSE_EFFECT_GATHERING_ITEM_NUM_UP" - }, - { - "uid": 18, - "id": 18, - "param0": 200, - "param1": 0, - "comment": "GP_COURSE_EFFECT_ENEMY_EXP_UP" - }, - { - "uid": 19, - "id": 19, - "param0": 200, - "param1": 0, - "comment": "GP_COURSE_EFFECT_BQ_REWARD_EXP_UP" - }, - { - "uid": 20, - "id": 20, - "param0": 200, - "param1": 0, - "comment": "GP_COURSE_EFFECT_WQ_REWARD_EXP_UP" - }, - { - "uid": 22, - "id": 22, - "param0": 150, - "param1": 0, - "comment": "GP_COURSE_EFFECT_AREA_POINT_BQ_REWARD_UP" - }, - { - "uid": 23, - "id": 23, - "param0": 150, - "param1": 0, - "comment": "GP_COURSE_EFFECT_AREA_POINT_WQ_REWARD_UP" - }, - { - "uid": 25, - "id": 25, - "param0": 200, - "param1": 0, - "comment": "GP_COURSE_EFFECT_PAWN_ENEMY_EXP_UP" - }, - { - "uid": 26, - "id": 26, - "param0": 200, - "param1": 0, - "comment": "GP_COURSE_EFFECT_PAWN_BQ_REWARD_EXP_UP" - }, - { - "uid": 27, - "id": 27, - "param0": 200, - "param1": 0, - "comment": "GP_COURSE_EFFECT_PAWN_WQ_REWARD_EXP_UP" - }, - { - "uid": 40, - "id": 28, - "param0": 150, - "param1": 0, - "comment": "GP_COURSE_EFFECT_PAWN_CRAFT_EXP_UP" - }, - { - "uid": 41, - "id": 4, - "param0": 0, - "param1": 0, - "comment": "GP_COURSE_EFFECT_ALL_RELEASE_WARP_POINT" - }, - { - "uid": 44, - "id": 38, - "param0": 0, - "param1": 0, - "comment": "GP_COURSE_EFFECT_PAWN_REVIVE_BY_RIM" - }, - { - "uid": 49, - "id": 40, - "param0": 1500, - "param1": 0, - "comment": "GP_COURSE_EFFECT_REGULARLY_SEND_MAIL" - }, - { - "uid": 50, - "id": 34, - "param0": 50, - "param1": 0, - "comment": "GP_COURSE_EFFECT_PAWN_RESCUE_MOTION_SHORTEN" - }, - { - "uid": 51, - "id": 37, - "param0": 150, - "param1": 0, - "comment": "GP_COURSE_EFFECT_BLOOD_ORB_UP" - }, - { - "uid": 52, - "id": 35, - "param0": 100, - "param1": 0, - "comment": "GP_COURSE_EFFECT_STAY_DISCOUNT" - }, - { - "uid": 59, - "id": 41, - "param0": 200, - "param1": 0, - "comment": "GP_COURSE_EFFECT_EXM_REWARD_UP" - }, - { - "uid": 69, - "id": 42, - "param0": 0, - "param1": 0, - "comment": "GP_COURSE_EFFECT_BAGGAGE_RENTAL01" - }, - { - "uid": 70, - "id": 43, - "param0": 0, - "param1": 0, - "comment": "GP_COURSE_EFFECT_DISABLE_PARTY_ADJUST_ENEMY_EXP" - }, - { - "uid": 71, - "id": 44, - "param0": 50, - "param1": 0, - "comment": "GP_COURSE_EFFECT_INCOMING_DAMAGE_CUT_OFF" - }, - { - "uid": 72, - "id": 45, - "param0": 125, - "param1": 0, - "comment": "GP_COURSE_EFFECT_ENDURANCE_UP" - }, - { - "uid": 73, - "id": 46, - "param0": 50, - "param1": 0, - "comment": "GP_COURSE_EFFECT_DEBUFF_DAMAGE_CUT_OFF" - }, - { - "uid": 74, - "id": 47, - "param0": 66, - "param1": 200, - "comment": "GP_COURSE_EFFECT_ENABLE_LEVER_GACHA_ASSIST" - }, - { - "uid": 75, - "id": 48, - "param0": 350, - "param1": 0, - "comment": "GP_COURSE_EFFECT_PAWN_AUTO_RESCUE" - }, - { - "uid": 76, - "id": 18, - "param0": 500, - "param1": 0, - "comment": "GP_COURSE_EFFECT_ENEMY_EXP_UP" - }, - { - "uid": 77, - "id": 25, - "param0": 500, - "param1": 0, - "comment": "GP_COURSE_EFFECT_PAWN_ENEMY_EXP_UP" - }, - { - "uid": 78, - "id": 43, - "param0": 0, - "param1": 0, - "comment": "GP_COURSE_EFFECT_DISABLE_PARTY_ADJUST_ENEMY_EXP" - }, - { - "uid": 119, - "id": 49, - "param0": 200, - "param1": 0, - "comment": "GP_COURSE_EFFECT_ENEMY_PP_UP" - }, - { - "uid": 128, - "id": 50, - "param0": 0, - "param1": 0, - "comment": "GP_COURSE_EFFECT_CRAFT_BAGGAGE_EXTEND" - }, - { - "uid": 149, - "id": 51, - "param0": 200, - "param1": 0, - "comment": "" - }, - { - "uid": 150, - "id": 52, - "param0": 200, - "param1": 0, - "comment": "" - }, - { - "uid": 151, - "id": 53, - "param0": 200, - "param1": 0, - "comment": "" - }, - { - "uid": 189, - "id": 18, - "param0": 250, - "param1": 0, - "comment": "GP_COURSE_EFFECT_ENEMY_EXP_UP" - }, - { - "uid": 190, - "id": 19, - "param0": 250, - "param1": 0, - "comment": "GP_COURSE_EFFECT_PAWN_ENEMY_EXP_UP" - }, - { - "uid": 191, - "id": 20, - "param0": 250, - "param1": 0, - "comment": "GP_COURSE_EFFECT_WQ_REWARD_EXP_UP" - }, - { - "uid": 192, - "id": 52, - "param0": 250, - "param1": 0, - "comment": "" - }, - { - "uid": 193, - "id": 25, - "param0": 250, - "param1": 0, - "comment": "GP_COURSE_EFFECT_PAWN_ENEMY_EXP_UP" - }, - { - "uid": 194, - "id": 26, - "param0": 250, - "param1": 0, - "comment": "GP_COURSE_EFFECT_PAWN_BQ_REWARD_EXP_UP" - }, - { - "uid": 195, - "id": 27, - "param0": 250, - "param1": 0, - "comment": "GP_COURSE_EFFECT_PAWN_WQ_REWARD_EXP_UP" - }, - { - "uid": 196, - "id": 53, - "param0": 250, - "param1": 0, - "comment": "" - }, - { - "uid": 197, - "id": 18, - "param0": 300, - "param1": 0, - "comment": "GP_COURSE_EFFECT_ENEMY_EXP_UP" - }, - { - "uid": 198, - "id": 19, - "param0": 300, - "param1": 0, - "comment": "GP_COURSE_EFFECT_BQ_REWARD_EXP_UP" - }, - { - "uid": 199, - "id": 20, - "param0": 300, - "param1": 0, - "comment": "GP_COURSE_EFFECT_WQ_REWARD_EXP_UP" - }, - { - "uid": 200, - "id": 52, - "param0": 300, - "param1": 0, - "comment": "" - }, - { - "uid": 201, - "id": 25, - "param0": 300, - "param1": 0, - "comment": "GP_COURSE_EFFECT_PAWN_ENEMY_EXP_UP" - }, - { - "uid": 202, - "id": 26, - "param0": 300, - "param1": 0, - "comment": "GP_COURSE_EFFECT_PAWN_BQ_REWARD_EXP_UP" - }, - { - "uid": 203, - "id": 27, - "param0": 300, - "param1": 0, - "comment": "GP_COURSE_EFFECT_PAWN_BQ_REWARD_EXP_UP" - }, - { - "uid": 204, - "id": 53, - "param0": 300, - "param1": 0, - "comment": "" - }, - { - "uid": 208, - "id": 60, - "param0": 200, - "param1": 0, - "comment": "" - }, - { - "uid": 209, - "id": 61, - "param0": 200, - "param1": 0, - "comment": "" - }, - { - "uid": 210, - "id": 64, - "param0": 200, - "param1": 0, - "comment": "" - }, - { - "uid": 211, - "id": 65, - "param0": 200, - "param1": 0, - "comment": "" - }, - { - "uid": 212, - "id": 59, - "param0": 200, - "param1": 0, - "comment": "" - }, - { - "uid": 213, - "id": 63, - "param0": 0, - "param1": 0, - "comment": "" - }, - { - "uid": 215, - "id": 57, - "param0": 0, - "param1": 0, - "comment": "" - }, - { - "uid": 216, - "id": 54, - "param0": 0, - "param1": 0, - "comment": "" - }, - { - "uid": 217, - "id": 55, - "param0": 0, - "param1": 0, - "comment": "" - }, - { - "uid": 218, - "id": 62, - "param0": 0, - "param1": 0, - "comment": "" - }, - { - "uid": 219, - "id": 49, - "param0": 300, - "param1": 0, - "comment": "GP_COURSE_EFFECT_ENEMY_PP_UP" - }, - { - "uid": 229, - "id": 49, - "param0": 500, - "param1": 0, - "comment": "GP_COURSE_EFFECT_ENEMY_PP_UP" - }, - { - "uid": 246, - "id": 72, - "param0": 200, - "param1": 0, - "comment": "" - }, - { - "uid": 247, - "id": 49, - "param0": 300, - "param1": 0, - "comment": "GP_COURSE_EFFECT_ENEMY_PP_UP" - }, - { - "uid": 248, - "id": 49, - "param0": 250, - "param1": 0, - "comment": "GP_COURSE_EFFECT_ENEMY_PP_UP" - }, - { - "uid": 253, - "id": 58, - "param0": 0, - "param1": 0, - "comment": "" - }, - { - "uid": 254, - "id": 73, - "param0": 200, - "param1": 0, - "comment": "" - }, - { - "uid": 255, - "id": 73, - "param0": 250, - "param1": 0, - "comment": "" - }, - { - "uid": 256, - "id": 73, - "param0": 300, - "param1": 0, - "comment": "" - }, - { - "uid": 261, - "id": 49, - "param0": 500, - "param1": 0, - "comment": "GP_COURSE_EFFECT_ENEMY_PP_UP" - }, - { - "uid": 262, - "id": 73, - "param0": 500, - "param1": 0, - "comment": "" - }, - { - "uid": 264, - "id": 16, - "param0": 300, - "param1": 0, - "comment": "GP_COURSE_EFFECT_ENEMY_DROP_UP" - }, - { - "uid": 265, - "id": 17, - "param0": 300, - "param1": 0, - "comment": "GP_COURSE_EFFECT_GATHERING_ITEM_NUM_UP" - }, - { - "uid": 266, - "id": 37, - "param0": 250, - "param1": 0, - "comment": "GP_COURSE_EFFECT_BLOOD_ORB_UP" - }, - { - "uid": 267, - "id": 37, - "param0": 300, - "param1": 0, - "comment": "GP_COURSE_EFFECT_BLOOD_ORB_UP" - } - ] -} ->>>>>>> 377eacb9 (Functioning Online Station.) +} \ No newline at end of file From 5495ab9b1c0c435fb81ab3c788eca1bc9bc9e2dc Mon Sep 17 00:00:00 2001 From: Ryan Yappert Date: Thu, 6 Mar 2025 21:58:18 -0800 Subject: [PATCH 5/6] Clean up handlers and serializers. --- .../Characters/GpCourseManager.cs | 2 +- Arrowgene.Ddon.GameServer/DdonGameServer.cs | 2 +- .../CharacterDecideCharacterIdHandler.cs | 2 +- .../Handler/ConnectionMoveInServerHandler.cs | 2 +- .../Handler/GpCourseGetValidListHandler.cs | 4 +- .../Handler/GpGetGpHandler.cs | 7 ++-- ...cs => PawnGetFreeRentalPawnListHandler.cs} | 10 ++--- .../Handler/GetCharacterListHandler.cs | 4 +- .../Entity/EntitySerializer.cs | 39 +++++++++++++++++-- .../PacketStructure/C2SEventCodeInputReq.cs | 2 +- .../C2SGetFreeRentalPawnListReq.cs | 28 ------------- .../C2SPawnGetFreeRentalPawnListReq.cs | 28 +++++++++++++ .../PacketStructure/S2CEventCodeInputRes.cs | 2 +- .../PacketStructure/S2CGPCourseExtendNtc.cs | 10 ++--- .../PacketStructure/S2CGPCourseStartNtc.cs | 10 ++--- .../PacketStructure/S2CGpCogGetIdRes.cs | 2 +- .../Entity/PacketStructure/S2CGpGetGpRes.cs | 9 ++--- .../S2CGpShopDisplayGetTypeRes.cs | 2 +- ....cs => S2CPawnGetFreeRentalPawnListRes.cs} | 12 +++--- .../Entity/Structure/CDataBoxGachaInfo.cs | 12 +++--- .../Structure/CDataGPCourseAvailable.cs | 8 ++-- .../Entity/Structure/CDataGPCourseValid.cs | 22 +++++------ .../Structure/CDataGPShopBuyHistoryElement.cs | 2 +- .../Structure/CDataGPShopDisplayType.cs | 2 +- .../Entity/Structure/CDataGachaInfo.cs | 14 +++---- .../Structure/CDataGameItemStorageInfo.cs | 6 +-- 26 files changed, 134 insertions(+), 109 deletions(-) rename Arrowgene.Ddon.GameServer/Handler/{GetFreeRentalPawnListHandler.cs => PawnGetFreeRentalPawnListHandler.cs} (71%) delete mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGetFreeRentalPawnListReq.cs create mode 100644 Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SPawnGetFreeRentalPawnListReq.cs rename Arrowgene.Ddon.Shared/Entity/PacketStructure/{S2CGetFreeRentalPawnListRes.cs => S2CPawnGetFreeRentalPawnListRes.cs} (64%) 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/DdonGameServer.cs b/Arrowgene.Ddon.GameServer/DdonGameServer.cs index 2410483a4..98045a6c4 100644 --- a/Arrowgene.Ddon.GameServer/DdonGameServer.cs +++ b/Arrowgene.Ddon.GameServer/DdonGameServer.cs @@ -514,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)); @@ -550,7 +551,6 @@ private void LoadPacketHandler() AddHandler(new PawnExpeditionGetSallyInfoHandler(this)); AddHandler(new PhotoPhotoTakeHandler(this)); - AddHandler(new GetFreeRentalPawnListHandler(this)); AddHandler(new ProfileGetCharacterProfileHandler(this)); AddHandler(new ProfileGetMyCharacterProfileHandler(this)); 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/GpCourseGetValidListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpCourseGetValidListHandler.cs index 5a3186bff..5e7c7bbe6 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GpCourseGetValidListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GpCourseGetValidListHandler.cs @@ -23,8 +23,8 @@ public override S2CGpCourseGetValidListRes Handle(GameClient client, C2SGpCourse var offset = DateTimeOffset.UtcNow; res.Items.Add(new CDataGPCourseValid { - ID = 1, - CourseID = 1, + Id = 1, + CourseId = 1, Name = "Adventure Passport (active)", ImageAddr = "http://localhost:52099/shop/img/payment/icon_course1.png", StartTime = (ulong)offset.ToUnixTimeSeconds(), diff --git a/Arrowgene.Ddon.GameServer/Handler/GpGetGpHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpGetGpHandler.cs index b602598fa..59d55a5b4 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GpGetGpHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GpGetGpHandler.cs @@ -20,13 +20,12 @@ public override S2CGpGetGpRes Handle(GameClient client, C2SGpGetGpReq request) uint amount = Server.WalletManager.GetWalletAmount(client.Character, WalletType.GoldenGemstones); DateTimeOffset offset = DateTimeOffset.UtcNow; - client.Send(new S2CGpGetGpRes + return new S2CGpGetGpRes { GP = amount, UseLimit = offset.AddMonths(12), - RealTime = offset, - Milliseconds = (ushort)offset.Millisecond - }); + RealTime = offset + }; } } } diff --git a/Arrowgene.Ddon.GameServer/Handler/GetFreeRentalPawnListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/PawnGetFreeRentalPawnListHandler.cs similarity index 71% rename from Arrowgene.Ddon.GameServer/Handler/GetFreeRentalPawnListHandler.cs rename to Arrowgene.Ddon.GameServer/Handler/PawnGetFreeRentalPawnListHandler.cs index 605a170bb..28111be66 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GetFreeRentalPawnListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/PawnGetFreeRentalPawnListHandler.cs @@ -6,17 +6,17 @@ namespace Arrowgene.Ddon.GameServer.Handler { - public class GetFreeRentalPawnListHandler : GameRequestPacketHandler + public class PawnGetFreeRentalPawnListHandler : GameRequestPacketHandler { - private static readonly ServerLogger Logger = LogProvider.Logger(typeof(GetFreeRentalPawnListHandler)); + private static readonly ServerLogger Logger = LogProvider.Logger(typeof(PawnGetFreeRentalPawnListHandler)); - public GetFreeRentalPawnListHandler(DdonGameServer server) : base(server) + public PawnGetFreeRentalPawnListHandler(DdonGameServer server) : base(server) { } - public override S2CGetFreeRentalPawnListRes Handle(GameClient client, C2SGetFreeRentalPawnListReq request) + public override S2CPawnGetFreeRentalPawnListRes Handle(GameClient client, C2SPawnGetFreeRentalPawnListReq request) { - S2CGetFreeRentalPawnListRes res = new S2CGetFreeRentalPawnListRes(); + S2CPawnGetFreeRentalPawnListRes res = new S2CPawnGetFreeRentalPawnListRes(); // TODO: track free rental pawns courses in DB res.FreeRentalPawnList.Add( 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/Entity/EntitySerializer.cs b/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs index 73734c6be..89cbc0028 100644 --- a/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs +++ b/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs @@ -744,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()); @@ -819,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()); @@ -1056,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()); @@ -1238,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()); @@ -1251,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()); @@ -1300,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()); @@ -1415,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()); @@ -1822,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 @@ -1833,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/C2SEventCodeInputReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SEventCodeInputReq.cs index 2b881c533..3c995d5ef 100644 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SEventCodeInputReq.cs +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SEventCodeInputReq.cs @@ -7,7 +7,7 @@ public class C2SEventCodeInputReq : IPacketStructure { public PacketId Id => PacketId.C2S_EVENT_CODE_EVENT_CODE_INPUT_REQ; - public string Code { get; set; } + public string Code { get; set; } = string.Empty; public C2SEventCodeInputReq() { diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGetFreeRentalPawnListReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGetFreeRentalPawnListReq.cs deleted file mode 100644 index 11ef8de68..000000000 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SGetFreeRentalPawnListReq.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Arrowgene.Buffers; -using Arrowgene.Ddon.Shared.Network; - -namespace Arrowgene.Ddon.Shared.Entity.PacketStructure -{ - public class C2SGetFreeRentalPawnListReq : IPacketStructure - { - public PacketId Id => PacketId.C2S_PAWN_GET_FREE_RENTAL_PAWN_LIST_REQ; - - public C2SGetFreeRentalPawnListReq() - { - } - - public class Serializer : PacketEntitySerializer - { - public override void Write(IBuffer buffer, C2SGetFreeRentalPawnListReq obj) - { - } - - public override C2SGetFreeRentalPawnListReq Read(IBuffer buffer) - { - C2SGetFreeRentalPawnListReq obj = new C2SGetFreeRentalPawnListReq(); - - 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/S2CEventCodeInputRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CEventCodeInputRes.cs index a9b4fa39f..28b2d7f9c 100644 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CEventCodeInputRes.cs +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CEventCodeInputRes.cs @@ -7,7 +7,7 @@ public class S2CEventCodeInputRes : ServerResponse { public override PacketId Id => PacketId.S2C_EVENT_CODE_EVENT_CODE_INPUT_RES; - public string Name { get; set; } + public string Name { get; set; } = string.Empty; public S2CEventCodeInputRes() { 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 9e08feae0..7a6bbfd9d 100644 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGPCourseStartNtc.cs +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGPCourseStartNtc.cs @@ -3,7 +3,7 @@ namespace Arrowgene.Ddon.Shared.Entity.PacketStructure { - public class S2CGPCourseStartNtc : IPacketStructure + public class S2CGpCourseStartNtc : IPacketStructure { public PacketId Id => PacketId.S2C_GP_COURSE_START_NTC; @@ -11,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/S2CGpCogGetIdRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpCogGetIdRes.cs index b0932d34e..be4b2342f 100644 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpCogGetIdRes.cs +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpCogGetIdRes.cs @@ -7,7 +7,7 @@ public class S2CGpCogGetIdRes : ServerResponse { public override PacketId Id => PacketId.S2C_GP_COG_GET_ID_RES; - public string CogId { get; set; } + public string CogId { get; set; } = string.Empty; public S2CGpCogGetIdRes() { diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpRes.cs index c3440f26f..80dbf743a 100644 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpRes.cs +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpGetGpRes.cs @@ -15,7 +15,6 @@ public S2CGpGetGpRes() public uint GP { get; set; } public DateTimeOffset UseLimit { get; set; } public DateTimeOffset RealTime { get; set; } - public ushort Milliseconds { get; set; } public class Serializer : PacketEntitySerializer { @@ -24,7 +23,7 @@ public override void Write(IBuffer buffer, S2CGpGetGpRes obj) WriteServerResponse(buffer, obj); WriteUInt32(buffer, obj.GP); WriteInt64(buffer, obj.UseLimit.ToUnixTimeSeconds()); - WriteUInt64(buffer, (ulong)obj.RealTime.ToUnixTimeSeconds()); + WriteInt64(buffer, obj.RealTime.ToUnixTimeSeconds()); WriteUInt16(buffer, (ushort)obj.RealTime.Millisecond); } @@ -34,9 +33,9 @@ public override S2CGpGetGpRes Read(IBuffer buffer) ReadServerResponse(buffer, obj); obj.GP = ReadUInt32(buffer); obj.UseLimit = DateTimeOffset.FromUnixTimeSeconds(ReadInt64(buffer)); - ulong unixTimeSeconds = ReadUInt64(buffer); - obj.Milliseconds = ReadUInt16(buffer); - obj.RealTime = DateTimeOffset.FromUnixTimeSeconds((long)unixTimeSeconds).AddMilliseconds(obj.Milliseconds); + long unixTimeSeconds = ReadInt64(buffer); + var milliseconds = ReadUInt16(buffer); + obj.RealTime = DateTimeOffset.FromUnixTimeSeconds(unixTimeSeconds).AddMilliseconds(milliseconds); return obj; } } diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpShopDisplayGetTypeRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpShopDisplayGetTypeRes.cs index a68a9eb29..bd4976ac6 100644 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpShopDisplayGetTypeRes.cs +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGpShopDisplayGetTypeRes.cs @@ -22,7 +22,7 @@ public override void Write(IBuffer buffer, S2CGpShopDisplayGetTypeRes obj) { WriteServerResponse(buffer, obj); - WriteEntity(buffer, obj.Items); + WriteEntityList(buffer, obj.Items); } public override S2CGpShopDisplayGetTypeRes Read(IBuffer buffer) diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGetFreeRentalPawnListRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CPawnGetFreeRentalPawnListRes.cs similarity index 64% rename from Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGetFreeRentalPawnListRes.cs rename to Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CPawnGetFreeRentalPawnListRes.cs index 21c9c82ad..a69ef1702 100644 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CGetFreeRentalPawnListRes.cs +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CPawnGetFreeRentalPawnListRes.cs @@ -5,29 +5,29 @@ namespace Arrowgene.Ddon.Shared.Entity.PacketStructure { - public class S2CGetFreeRentalPawnListRes : ServerResponse + public class S2CPawnGetFreeRentalPawnListRes : ServerResponse { public override PacketId Id => PacketId.S2C_PAWN_GET_FREE_RENTAL_PAWN_LIST_RES; public List FreeRentalPawnList { get; set; } - public S2CGetFreeRentalPawnListRes() + public S2CPawnGetFreeRentalPawnListRes() { FreeRentalPawnList = new List(); } - public class Serializer : PacketEntitySerializer + public class Serializer : PacketEntitySerializer { - public override void Write(IBuffer buffer, S2CGetFreeRentalPawnListRes obj) + public override void Write(IBuffer buffer, S2CPawnGetFreeRentalPawnListRes obj) { WriteServerResponse(buffer, obj); WriteEntityList(buffer, obj.FreeRentalPawnList); } - public override S2CGetFreeRentalPawnListRes Read(IBuffer buffer) + public override S2CPawnGetFreeRentalPawnListRes Read(IBuffer buffer) { - S2CGetFreeRentalPawnListRes obj = new S2CGetFreeRentalPawnListRes(); + S2CPawnGetFreeRentalPawnListRes obj = new S2CPawnGetFreeRentalPawnListRes(); ReadServerResponse(buffer, obj); diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataBoxGachaInfo.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataBoxGachaInfo.cs index 3c29b4c0f..2f89269a4 100644 --- a/Arrowgene.Ddon.Shared/Entity/Structure/CDataBoxGachaInfo.cs +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataBoxGachaInfo.cs @@ -9,13 +9,13 @@ public class CDataBoxGachaInfo public long Begin { get; set; } public long End { get; set; } public bool Unk1 { get; set; } - public string Name { get; set; } - public string Description { get; set; } - public string Detail { 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; } - public string ListAddr { get; set; } - public string ImageAddr { 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; } diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseAvailable.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseAvailable.cs index 7e8c51c57..04034b5e0 100644 --- a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseAvailable.cs +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseAvailable.cs @@ -10,11 +10,11 @@ public CDataGPCourseAvailable() } public uint ID { get; set; } - public string Name { 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; } + public string ImageAddr { get; set; } = string.Empty; public class Serializer : EntitySerializer { @@ -22,7 +22,7 @@ public override void Write(IBuffer buffer, CDataGPCourseAvailable obj) { WriteUInt32(buffer, obj.ID); WriteMtString(buffer, obj.Name); - WriteUInt64(buffer, (ulong)obj.UseLimitTime.ToUnixTimeSeconds()); + WriteInt64(buffer, obj.UseLimitTime.ToUnixTimeSeconds()); WriteUInt32(buffer, obj.CourseID); WriteUInt32(buffer, obj.LineupID); WriteMtString(buffer, obj.ImageAddr); @@ -34,7 +34,7 @@ public override CDataGPCourseAvailable Read(IBuffer buffer) obj.ID = ReadUInt32(buffer); obj.Name = ReadMtString(buffer); - obj.UseLimitTime = DateTimeOffset.FromUnixTimeSeconds((long)ReadUInt64(buffer)); + obj.UseLimitTime = DateTimeOffset.FromUnixTimeSeconds(ReadInt64(buffer)); obj.CourseID = ReadUInt32(buffer); obj.LineupID = ReadUInt32(buffer); obj.ImageAddr = ReadMtString(buffer); diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseValid.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseValid.cs index 5d1b566b2..51e6423c3 100644 --- a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseValid.cs +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPCourseValid.cs @@ -8,19 +8,19 @@ public CDataGPCourseValid() { } - public uint ID; - public uint CourseID; - public string Name; - public string ImageAddr; - 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 { public override void Write(IBuffer buffer, CDataGPCourseValid obj) { - WriteUInt32(buffer, obj.ID); - WriteUInt32(buffer, obj.CourseID); + WriteUInt32(buffer, obj.Id); + WriteUInt32(buffer, obj.CourseId); WriteMtString(buffer, obj.Name); WriteMtString(buffer, obj.ImageAddr); WriteUInt64(buffer, obj.StartTime); @@ -30,8 +30,8 @@ public override void Write(IBuffer buffer, CDataGPCourseValid obj) public override CDataGPCourseValid Read(IBuffer buffer) { CDataGPCourseValid obj = new CDataGPCourseValid(); - obj.ID = ReadUInt32(buffer); - obj.CourseID = ReadUInt32(buffer); + obj.Id = ReadUInt32(buffer); + obj.CourseId = ReadUInt32(buffer); obj.Name = ReadMtString(buffer); obj.ImageAddr = ReadMtString(buffer); obj.StartTime = ReadUInt64(buffer); diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPShopBuyHistoryElement.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPShopBuyHistoryElement.cs index 418690373..793da07e9 100644 --- a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPShopBuyHistoryElement.cs +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPShopBuyHistoryElement.cs @@ -5,7 +5,7 @@ namespace Arrowgene.Ddon.Shared.Entity.Structure public class CDataGPShopBuyHistoryElement { public uint ID { get; set; } - public string Name { get; set; } + public string Name { get; set; } = string.Empty; public uint Price { get; set; } public ulong AcquisitionTime { get; set; } diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPShopDisplayType.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPShopDisplayType.cs index f49fdbe50..0d2746dca 100644 --- a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPShopDisplayType.cs +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGPShopDisplayType.cs @@ -7,7 +7,7 @@ namespace Arrowgene.Ddon.Shared.Entity.Structure public class CDataGPShopDisplayType { public uint ID { get; set; } - public string Name { get; set; } + public string Name { get; set; } = string.Empty; public uint InGameUrlID { get; set; } public class Serializer : EntitySerializer diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaInfo.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaInfo.cs index 1975d4f45..f53a0a48d 100644 --- a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaInfo.cs +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGachaInfo.cs @@ -8,14 +8,14 @@ public class CDataGachaInfo public uint Id { get; set; } public long Begin { get; set; } public long End { get; set; } - public string Name { get; set; } - public string Description { get; set; } - public string Detail { 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; } - public string WeightDispText { get; set; } - public string ListAddr { get; set; } - public string ImageAddr { 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() diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGameItemStorageInfo.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGameItemStorageInfo.cs index 8fc3220cd..8dab9ea50 100644 --- a/Arrowgene.Ddon.Shared/Entity/Structure/CDataGameItemStorageInfo.cs +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataGameItemStorageInfo.cs @@ -4,14 +4,10 @@ namespace Arrowgene.Ddon.Shared.Entity.Structure { public class CDataGameItemStorageInfo { - public CDataGameItemStorage GameItemStorage { get; set; } + public CDataGameItemStorage GameItemStorage { get; set; } = new(); public ushort UsedSlotNum { get; set; } public ushort MaxSlotNum { get; set; } - public CDataGameItemStorageInfo() - { - } - public class Serializer : EntitySerializer { public override void Write(IBuffer buffer, CDataGameItemStorageInfo obj) From 49a3d7cfc21b48f96041b7a0326f575df059154c Mon Sep 17 00:00:00 2001 From: Ryan Yappert Date: Thu, 6 Mar 2025 23:04:55 -0800 Subject: [PATCH 6/6] Remove explicit localhost from handlers; block off some handlers that otherwise expose players to incomplete mechanics. --- .../Handler/BoxGachaBuyHandler.cs | 5 +++-- .../Handler/BoxGachaDrawInfoHandler.cs | 3 +++ .../Handler/BoxGachaListHandler.cs | 9 +++++++-- .../Handler/GachaBuyHandler.cs | 12 +++++------- .../Handler/GachaListHandler.cs | 16 ++++++++++++++-- .../Handler/GpCourseGetValidListHandler.cs | 3 ++- .../Handler/GpGpCourseGetAvailableListHandler.cs | 3 ++- .../Handler/ItemGetItemStorageInfoHandler.cs | 6 +++--- .../Handler/PawnGetFreeRentalPawnListHandler.cs | 10 +++++++--- Arrowgene.Ddon.Shared/AssetRepository.cs | 2 +- Arrowgene.Ddon.Shared/Files/Assets/Gacha.json | 4 ++-- 11 files changed, 49 insertions(+), 24 deletions(-) diff --git a/Arrowgene.Ddon.GameServer/Handler/BoxGachaBuyHandler.cs b/Arrowgene.Ddon.GameServer/Handler/BoxGachaBuyHandler.cs index d4c9f35bd..bc56a52c2 100644 --- a/Arrowgene.Ddon.GameServer/Handler/BoxGachaBuyHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/BoxGachaBuyHandler.cs @@ -1,10 +1,9 @@ -using System.Collections.Generic; -using Arrowgene.Ddon.GameServer.Characters; 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 { @@ -18,6 +17,8 @@ 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 diff --git a/Arrowgene.Ddon.GameServer/Handler/BoxGachaDrawInfoHandler.cs b/Arrowgene.Ddon.GameServer/Handler/BoxGachaDrawInfoHandler.cs index a0afe460c..1bedb03de 100644 --- a/Arrowgene.Ddon.GameServer/Handler/BoxGachaDrawInfoHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/BoxGachaDrawInfoHandler.cs @@ -1,6 +1,7 @@ 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 @@ -15,6 +16,8 @@ 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 diff --git a/Arrowgene.Ddon.GameServer/Handler/BoxGachaListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/BoxGachaListHandler.cs index 9eb4c84e8..5db0cba6c 100644 --- a/Arrowgene.Ddon.GameServer/Handler/BoxGachaListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/BoxGachaListHandler.cs @@ -3,6 +3,7 @@ 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 @@ -17,8 +18,12 @@ 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, @@ -31,8 +36,8 @@ public override S2CBoxGachaListRes Handle(GameClient client, C2SBoxGachaListReq "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 = "http://localhost:52099/sp_ingame/campaign/bnr/lotto/lot_icon_170316_03.jpg", - ImageAddr = "http://localhost:52099/sp_ingame/campaign/bnr/lotto/lot_icon_170316_03.jpg", + 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() diff --git a/Arrowgene.Ddon.GameServer/Handler/GachaBuyHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GachaBuyHandler.cs index 857dcc7a9..0d688b6c1 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GachaBuyHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GachaBuyHandler.cs @@ -1,11 +1,8 @@ -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.Ddon.Shared.Model.Quest; using Arrowgene.Logging; +using System; namespace Arrowgene.Ddon.GameServer.Handler { @@ -19,6 +16,8 @@ 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, @@ -28,7 +27,7 @@ public override S2CGachaBuyRes Handle(GameClient client, C2SGachaBuyReq request) if (!gachaAsset.GachaInfoList.ContainsKey(request.GachaId)) { - return res; + throw new ResponseErrorException(ErrorCode.ERROR_CODE_GACHA_NOT_FOUND); } var lootBox = gachaAsset.GachaInfoList[request.GachaId]; @@ -48,8 +47,7 @@ public override S2CGachaBuyRes Handle(GameClient client, C2SGachaBuyReq request) if (Server.WalletManager.RemoveFromWalletNtc(client, client.Character, walletType, request.Price)) { - // Failed to deduct the cost - return res; + throw new ResponseErrorException(ErrorCode.ERROR_CODE_GACHA_PRICE_NO_MATCH); } foreach (var drawGroup in lootBox.DrawGroups) diff --git a/Arrowgene.Ddon.GameServer/Handler/GachaListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GachaListHandler.cs index 8f32e08fe..5fb520f29 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GachaListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GachaListHandler.cs @@ -1,6 +1,7 @@ #nullable enable using Arrowgene.Ddon.Server; using Arrowgene.Ddon.Shared.Entity.PacketStructure; +using Arrowgene.Ddon.Shared.Model; using Arrowgene.Logging; using System.Linq; @@ -16,12 +17,23 @@ 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, @@ -34,8 +46,8 @@ public override S2CGachaListRes Handle(GameClient client, C2SGachaListReq reques WeightDispType = 2, WeightDispTitle = "Percentage Provided", WeightDispText = "Class S 100.0%\r\n*Probability of provision is rounded to one decimal place.", - ListAddr = "http://localhost:52099/shop/img/payment/icon_lot72.jpg", - ImageAddr = "http://localhost:52099/shop/img/payment/image_lot67_01_campaign2.jpg", + ListAddr = $"{urlBase}/shop/img/payment/icon_lot72.jpg", + ImageAddr = $"{urlBase}/shop/img/payment/image_lot67_01_campaign2.jpg", DrawGroups = new List { new CDataGachaDrawGroupInfo diff --git a/Arrowgene.Ddon.GameServer/Handler/GpCourseGetValidListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpCourseGetValidListHandler.cs index 5e7c7bbe6..9995cd737 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GpCourseGetValidListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GpCourseGetValidListHandler.cs @@ -18,6 +18,7 @@ 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; @@ -26,7 +27,7 @@ public override S2CGpCourseGetValidListRes Handle(GameClient client, C2SGpCourse Id = 1, CourseId = 1, Name = "Adventure Passport (active)", - ImageAddr = "http://localhost:52099/shop/img/payment/icon_course1.png", + ImageAddr = $"{urlBase}/shop/img/payment/icon_course1.png", StartTime = (ulong)offset.ToUnixTimeSeconds(), EndTime = (ulong)offset.AddMonths(12).ToUnixTimeSeconds() }); diff --git a/Arrowgene.Ddon.GameServer/Handler/GpGpCourseGetAvailableListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/GpGpCourseGetAvailableListHandler.cs index cd7fd0ab2..44330738e 100644 --- a/Arrowgene.Ddon.GameServer/Handler/GpGpCourseGetAvailableListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/GpGpCourseGetAvailableListHandler.cs @@ -23,6 +23,7 @@ public override S2CGpGpCourseGetAvailableListRes Handle(GameClient client, C2SGp { S2CGpGpCourseGetAvailableListRes res = new S2CGpGpCourseGetAvailableListRes(); + string urlBase = Server.GameSettings.GameServerSettings.UrlDomain; DateTimeOffset offset = DateTimeOffset.UtcNow; res.Items = new List { @@ -33,7 +34,7 @@ public override S2CGpGpCourseGetAvailableListRes Handle(GameClient client, C2SGp UseLimitTime = offset.AddMonths(12), CourseID = 1, LineupID = 1, - ImageAddr = "http://localhost:52099/shop/img/payment/icon_course1.png", + ImageAddr = $"{urlBase}/shop/img/payment/icon_course1.png", } }; diff --git a/Arrowgene.Ddon.GameServer/Handler/ItemGetItemStorageInfoHandler.cs b/Arrowgene.Ddon.GameServer/Handler/ItemGetItemStorageInfoHandler.cs index 196ef4ba1..38e252bad 100644 --- a/Arrowgene.Ddon.GameServer/Handler/ItemGetItemStorageInfoHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/ItemGetItemStorageInfoHandler.cs @@ -19,15 +19,15 @@ public override S2CItemGetItemStorageInfoRes Handle(GameClient client, C2SItemGe { S2CItemGetItemStorageInfoRes res = new S2CItemGetItemStorageInfoRes(); - //TODO: fetch from actual item post? + var itemPost = client.Character.Storage.GetStorage(StorageType.ItemPost); res.GameItemStorageInfoList.Add(new CDataGameItemStorageInfo { GameItemStorage = new CDataGameItemStorage { StorageType = StorageType.ItemPost }, - UsedSlotNum = 189, - MaxSlotNum = 400 + UsedSlotNum = itemPost.EmptySlots(), + MaxSlotNum = itemPost.MaxSlots() }); return res; diff --git a/Arrowgene.Ddon.GameServer/Handler/PawnGetFreeRentalPawnListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/PawnGetFreeRentalPawnListHandler.cs index 28111be66..a59d628ca 100644 --- a/Arrowgene.Ddon.GameServer/Handler/PawnGetFreeRentalPawnListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/PawnGetFreeRentalPawnListHandler.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,7 +17,10 @@ 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( @@ -24,7 +28,7 @@ public override S2CPawnGetFreeRentalPawnListRes Handle(GameClient client, C2SPaw { PawnId = 1, Name = "FreeRentalPawn1 (active)", - ImageAddr = "http://localhost:52099/shop/img/payment/icon_pawn1.png", + ImageAddr = $"{urlBase}/shop/img/payment/icon_pawn1.png", LineupId = 1, ExpireDateTime = (ulong)DateTimeOffset.UtcNow.AddMonths(12).ToUnixTimeSeconds() }); @@ -33,7 +37,7 @@ public override S2CPawnGetFreeRentalPawnListRes Handle(GameClient client, C2SPaw { PawnId = 2, Name = "FreeRentalPawn2 (expired)", - ImageAddr = "http://localhost:52099/shop/img/payment/icon_pawn1.png", + ImageAddr = $"{urlBase}/shop/img/payment/icon_pawn1.png", LineupId = 2, ExpireDateTime = (ulong)DateTimeOffset.UtcNow.ToUnixTimeSeconds() - 1000 }); diff --git a/Arrowgene.Ddon.Shared/AssetRepository.cs b/Arrowgene.Ddon.Shared/AssetRepository.cs index 32e05a137..43871b7d7 100644 --- a/Arrowgene.Ddon.Shared/AssetRepository.cs +++ b/Arrowgene.Ddon.Shared/AssetRepository.cs @@ -123,7 +123,7 @@ public AssetRepository(string folder) AreaRankSpotInfoAsset = new(); AreaRankSupplyAsset = new(); AreaRankRequirementAsset = new(); - GachaAsset = new GachaAsset(); + GachaAsset = new(); } public Dictionary ClientErrorCodes { get; private set; } diff --git a/Arrowgene.Ddon.Shared/Files/Assets/Gacha.json b/Arrowgene.Ddon.Shared/Files/Assets/Gacha.json index 448f8fb23..333db2a2c 100644 --- a/Arrowgene.Ddon.Shared/Files/Assets/Gacha.json +++ b/Arrowgene.Ddon.Shared/Files/Assets/Gacha.json @@ -11,8 +11,8 @@ "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": "http://localhost:52099/shop/img/payment/icon_lot.png", - "image_address": "http://localhost:52099/shop/img/payment/image_lot1225_campaign.jpg", + "list_address": "/shop/img/payment/icon_lot.png", + "image_address": "shop/img/payment/image_lot1225_campaign.jpg", "draw_groups": [ { "group_id": 351,