diff --git a/Arrowgene.Ddon.GameServer/Handler/PawnGetLostPawnListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/PawnGetLostPawnListHandler.cs index cdb1873a..ea9c32ea 100644 --- a/Arrowgene.Ddon.GameServer/Handler/PawnGetLostPawnListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/PawnGetLostPawnListHandler.cs @@ -1,15 +1,13 @@ using Arrowgene.Ddon.Server; -using Arrowgene.Ddon.Server.Network; -using Arrowgene.Ddon.Shared.Network; using Arrowgene.Logging; using Arrowgene.Ddon.Shared.Entity.PacketStructure; -using Arrowgene.Ddon.Shared.Model.Quest; using Arrowgene.Ddon.Shared.Entity.Structure; -using System.Collections.Generic; +using System.Linq; +using Arrowgene.Ddon.Shared.Model; namespace Arrowgene.Ddon.GameServer.Handler { - public class PawnGetLostPawnListHandler : StructurePacketHandler + public class PawnGetLostPawnListHandler : GameRequestPacketHandler { private static readonly ServerLogger Logger = LogProvider.Logger(typeof(PawnGetLostPawnListHandler)); @@ -17,10 +15,33 @@ namespace Arrowgene.Ddon.GameServer.Handler { } - public override void Handle(GameClient client, StructurePacket req) + public override S2CPawnGetLostPawnListRes Handle(GameClient client, C2SPawnGetLostPawnListReq request) { - var res = new S2CPawnGetLostPawnListRes(); - client.Send(res); + return new S2CPawnGetLostPawnListRes() + { + LostPawnList = client.Character.Pawns + .Select((pawn, index) => new { pawn, slot = index+1 }) + .Where(tuple => tuple.pawn.PawnState == PawnState.Lost) + .Select(tuple => new CDataLostPawnList() + { + PawnId = (int) tuple.pawn.PawnId, + SlotNo = (uint) tuple.slot, + Name = tuple.pawn.Name, + Sex = tuple.pawn.EditInfo.Sex, + PawnState = tuple.pawn.PawnState, + // TODO: ShareRange + ReviveCost = 1, // TODO: Make it configurable + PawnListData = new CDataPawnListData() + { + Job = tuple.pawn.Job, + Level = tuple.pawn.ActiveCharacterJobData.Lv, + CraftRank = tuple.pawn.CraftData.CraftRank, + PawnCraftSkillList = tuple.pawn.CraftData.PawnCraftSkillList, + // TODO: CommentSize, LatestReturnDate + } + }) + .ToList() + }; } } } diff --git a/Arrowgene.Ddon.GameServer/Handler/PawnPawnLostHandler.cs b/Arrowgene.Ddon.GameServer/Handler/PawnPawnLostHandler.cs index 7fa729f5..e4a4756d 100644 --- a/Arrowgene.Ddon.GameServer/Handler/PawnPawnLostHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/PawnPawnLostHandler.cs @@ -2,12 +2,11 @@ using System.Linq; using Arrowgene.Ddon.Server; using Arrowgene.Ddon.Shared.Entity.PacketStructure; using Arrowgene.Ddon.Shared.Model; -using Arrowgene.Ddon.Shared.Network; using Arrowgene.Logging; namespace Arrowgene.Ddon.GameServer.Handler { - public class PawnPawnLostHandler : GameStructurePacketHandler + public class PawnPawnLostHandler : GameRequestPacketHandler { private static readonly ServerLogger Logger = LogProvider.Logger(typeof(PawnPawnLostHandler)); @@ -15,16 +14,25 @@ namespace Arrowgene.Ddon.GameServer.Handler { } - public override void Handle(GameClient client, StructurePacket packet) + public override S2CPawnPawnLostRes Handle(GameClient client, C2SPawnPawnLostReq request) { - // TODO: Lost pawns system - Pawn pawn = client.Character.Pawns.Where(pawn => pawn.PawnId == packet.Structure.PawnId).Single(); - client.Send(new S2CPawnPawnLostRes() + Pawn pawn = client.Character.Pawns.Where(pawn => pawn.PawnId == request.PawnId).Single(); + pawn.PawnState = PawnState.Lost; + + S2CPawnPawnLostNtc ntc = new S2CPawnPawnLostNtc() { PawnId = pawn.PawnId, PawnName = pawn.Name, - IsLost = false - }); + IsLost = pawn.PawnState == PawnState.Lost + }; + client.Party.SendToAll(ntc); + + return new S2CPawnPawnLostRes() + { + PawnId = pawn.PawnId, + PawnName = pawn.Name, + IsLost = pawn.PawnState == PawnState.Lost + }; } } } \ No newline at end of file diff --git a/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs b/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs index b481cb15..60d4f86d 100644 --- a/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs +++ b/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs @@ -991,6 +991,7 @@ namespace Arrowgene.Ddon.Shared.Entity Create(new S2CPawnGetPawnTotalScoreRes.Serializer()); Create(new S2CPawnGetRegisteredPawnDataRes.Serializer()); Create(new S2CPawnJoinPartyMypawnRes.Serializer()); + Create(new S2CPawnPawnLostNtc.Serializer()); Create(new S2CPawnPawnLostRes.Serializer()); Create(new S2CPawnSpSkillDeleteStockSkillRes.Serializer()); Create(new S2CPawnSpSkillGetActiveSkillRes.Serializer()); diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CPawnGetLostPawnListRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CPawnGetLostPawnListRes.cs index 1521b7fe..2bcd1ae2 100644 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CPawnGetLostPawnListRes.cs +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CPawnGetLostPawnListRes.cs @@ -11,24 +11,24 @@ namespace Arrowgene.Ddon.Shared.Entity.PacketStructure public S2CPawnGetLostPawnListRes() { - LostPawnList = new List(); + LostPawnList = new List(); } - public List LostPawnList { get; set; } + public List LostPawnList { get; set; } public class Serializer : PacketEntitySerializer { public override void Write(IBuffer buffer, S2CPawnGetLostPawnListRes obj) { WriteServerResponse(buffer, obj); - WriteEntityList(buffer, obj.LostPawnList); + WriteEntityList(buffer, obj.LostPawnList); } public override S2CPawnGetLostPawnListRes Read(IBuffer buffer) { S2CPawnGetLostPawnListRes obj = new S2CPawnGetLostPawnListRes(); ReadServerResponse(buffer, obj); - obj.LostPawnList = ReadEntityList(buffer); + obj.LostPawnList = ReadEntityList(buffer); return obj; } } diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CPawnPawnLostNtc.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CPawnPawnLostNtc.cs new file mode 100644 index 00000000..9cc0035a --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CPawnPawnLostNtc.cs @@ -0,0 +1,39 @@ +using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Network; + +namespace Arrowgene.Ddon.Shared.Entity.PacketStructure +{ + public class S2CPawnPawnLostNtc : IPacketStructure + { + public PacketId Id => PacketId.S2C_PAWN_PAWN_LOST_NTC; + + public S2CPawnPawnLostNtc() + { + PawnName = string.Empty; + } + + public uint PawnId { get; set; } + public string PawnName { get; set; } + public bool IsLost { get; set; } + + public class Serializer : PacketEntitySerializer + { + public override void Write(IBuffer buffer, S2CPawnPawnLostNtc obj) + { + WriteUInt32(buffer, obj.PawnId); + WriteMtString(buffer, obj.PawnName); + WriteBool(buffer, obj.IsLost); + } + + public override S2CPawnPawnLostNtc Read(IBuffer buffer) + { + S2CPawnPawnLostNtc obj = new S2CPawnPawnLostNtc(); + obj.PawnId = ReadUInt32(buffer); + obj.PawnName = ReadMtString(buffer); + obj.IsLost = ReadBool(buffer); + return obj; + } + } + + } +} \ No newline at end of file diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataLostPawn.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataLostPawnList.cs similarity index 77% rename from Arrowgene.Ddon.Shared/Entity/Structure/CDataLostPawn.cs rename to Arrowgene.Ddon.Shared/Entity/Structure/CDataLostPawnList.cs index 3e0637f7..31217615 100644 --- a/Arrowgene.Ddon.Shared/Entity/Structure/CDataLostPawn.cs +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataLostPawnList.cs @@ -1,11 +1,11 @@ -using System.Collections.Generic; using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Model; namespace Arrowgene.Ddon.Shared.Entity.Structure { - public class CDataLostPawn + public class CDataLostPawnList { - public CDataLostPawn() + public CDataLostPawnList() { PawnListData = new CDataPawnListData(); } @@ -14,33 +14,33 @@ namespace Arrowgene.Ddon.Shared.Entity.Structure public uint SlotNo { get; set; } public string Name { get; set; } public byte Sex { get; set; } - public byte PawnState { get; set; } + public PawnState PawnState { get; set; } public byte ShareRange { get; set; } public uint ReviveCost { get; set; } public CDataPawnListData PawnListData { get; set; } - public class Serializer : EntitySerializer + public class Serializer : EntitySerializer { - public override void Write(IBuffer buffer, CDataLostPawn obj) + public override void Write(IBuffer buffer, CDataLostPawnList obj) { WriteInt32(buffer, obj.PawnId); WriteUInt32(buffer, obj.SlotNo); WriteMtString(buffer, obj.Name); WriteByte(buffer, obj.Sex); - WriteByte(buffer, obj.PawnState); + WriteByte(buffer, (byte) obj.PawnState); WriteByte(buffer, obj.ShareRange); WriteUInt32(buffer, obj.ReviveCost); WriteEntity(buffer, obj.PawnListData); } - public override CDataLostPawn Read(IBuffer buffer) + public override CDataLostPawnList Read(IBuffer buffer) { - CDataLostPawn obj = new CDataLostPawn(); + CDataLostPawnList obj = new CDataLostPawnList(); obj.PawnId = ReadInt32(buffer); obj.SlotNo = ReadUInt32(buffer); obj.Name = ReadMtString(buffer); obj.Sex = ReadByte(buffer); - obj.PawnState = ReadByte(buffer); + obj.PawnState = (PawnState) ReadByte(buffer); obj.ShareRange = ReadByte(buffer); obj.ReviveCost = ReadUInt32(buffer); obj.PawnListData = ReadEntity(buffer); diff --git a/Arrowgene.Ddon.Shared/Network/PacketId.cs b/Arrowgene.Ddon.Shared/Network/PacketId.cs index 7a18f262..acf03205 100644 --- a/Arrowgene.Ddon.Shared/Network/PacketId.cs +++ b/Arrowgene.Ddon.Shared/Network/PacketId.cs @@ -475,7 +475,7 @@ namespace Arrowgene.Ddon.Shared.Network public static readonly PacketId S2C_PAWN_GET_LEGEND_PAWN_LIST_RES = new PacketId(8, 18, 2, "S2C_PAWN_GET_LEGEND_PAWN_LIST_RES", ServerType.Game, PacketSource.Server); // レジェンドポーンリスト取得に public static readonly PacketId C2S_PAWN_PAWN_LOST_REQ = new PacketId(8, 19, 1, "C2S_PAWN_PAWN_LOST_REQ", ServerType.Game, PacketSource.Client); public static readonly PacketId S2C_PAWN_PAWN_LOST_RES = new PacketId(8, 19, 2, "S2C_PAWN_PAWN_LOST_RES", ServerType.Game, PacketSource.Server); // ポーンロストに - public static readonly PacketId S2C_PAWN_8_19_16_NTC = new PacketId(8, 19, 16, "S2C_PAWN_8_19_16_NTC", ServerType.Game, PacketSource.Server); + public static readonly PacketId S2C_PAWN_PAWN_LOST_NTC = new PacketId(8, 19, 16, "S2C_PAWN_PAWN_LOST_RES", ServerType.Game, PacketSource.Server, "S2C_PAWN_8_19_16_NTC"); public static readonly PacketId C2S_PAWN_GET_LOST_PAWN_LIST_REQ = new PacketId(8, 20, 1, "C2S_PAWN_GET_LOST_PAWN_LIST_REQ", ServerType.Game, PacketSource.Client); public static readonly PacketId S2C_PAWN_GET_LOST_PAWN_LIST_RES = new PacketId(8, 20, 2, "S2C_PAWN_GET_LOST_PAWN_LIST_RES", ServerType.Game, PacketSource.Server); // ロストポーンポーンリスト取得に public static readonly PacketId C2S_PAWN_LOST_PAWN_REVIVE_REQ = new PacketId(8, 21, 1, "C2S_PAWN_LOST_PAWN_REVIVE_REQ", ServerType.Game, PacketSource.Client); @@ -2401,7 +2401,7 @@ namespace Arrowgene.Ddon.Shared.Network AddPacketIdEntry(packetIds, S2C_PAWN_GET_LEGEND_PAWN_LIST_RES); AddPacketIdEntry(packetIds, C2S_PAWN_PAWN_LOST_REQ); AddPacketIdEntry(packetIds, S2C_PAWN_PAWN_LOST_RES); - AddPacketIdEntry(packetIds, S2C_PAWN_8_19_16_NTC); + AddPacketIdEntry(packetIds, S2C_PAWN_PAWN_LOST_NTC); AddPacketIdEntry(packetIds, C2S_PAWN_GET_LOST_PAWN_LIST_REQ); AddPacketIdEntry(packetIds, S2C_PAWN_GET_LOST_PAWN_LIST_RES); AddPacketIdEntry(packetIds, C2S_PAWN_LOST_PAWN_REVIVE_REQ); diff --git a/research/GamePackets.md b/research/GamePackets.md index 0ae4e8a2..3248e9f0 100644 --- a/research/GamePackets.md +++ b/research/GamePackets.md @@ -264,7 +264,7 @@ |S2C_PAWN_GET_LEGEND_PAWN_LIST_RES|8|18|2|0x7ea770|レジェンドポーンリスト取得に| |C2S_PAWN_PAWN_LOST_REQ|8|19|1|0x834263|| |S2C_PAWN_PAWN_LOST_RES|8|19|2|0x7ec490|ポーンロストに| -|S2C_PAWN_8_19_16_NTC|8|19|16|0x7ec2f0|None| +|S2C_PAWN_PAWN_LOST_NTC|8|19|16|0x7ec2f0|None| |C2S_PAWN_GET_LOST_PAWN_LIST_REQ|8|20|1|0x8331e3|| |S2C_PAWN_GET_LOST_PAWN_LIST_RES|8|20|2|0x7ea870|ロストポーンポーンリスト取得に| |C2S_PAWN_LOST_PAWN_REVIVE_REQ|8|21|1|0x834073|| @@ -275,9 +275,9 @@ |S2C_PAWN_LOST_PAWN_GOLDEN_REVIVE_RES|8|23|2|0x7ec030|ロストポーン復活(黄金石消費)に| |C2S_PAWN_LOST_PAWN_WALLET_REVIVE_REQ|8|24|1|0x834153|| |S2C_PAWN_LOST_PAWN_WALLET_REVIVE_RES|8|24|2|0x7ec240|ロストポーン復活(通貨消費)に| -|C2S_PAWN_8_25_1_REQ|8|25|1|0x834343|| -|S2C_PAWN_8_25_2_RES|8|25|2|0x7ec5e0|None| -|S2C_PAWN_8_25_16_NTC|8|25|16|0x7ec560|None| +|C2S_PAWN_RENTAL_PAWN_LOST_REQ|8|25|1|0x834343|| +|S2C_PAWN_RENTAL_PAWN_LOST_RES|8|25|2|0x7ec5e0|None| +|S2C_PAWN_RENTAL_PAWN_LOST_NTC|8|25|16|0x7ec560|None| |C2S_PAWN_UPDATE_PAWN_REACTION_LIST_REQ|8|26|1|0x834da3|| |S2C_PAWN_UPDATE_PAWN_REACTION_LIST_RES|8|26|2|0x7eda50|ポーンリアクションリスト更新に| |S2C_PAWN_8_26_16_NTC|8|26|16|0x7ed940|None| @@ -1125,8 +1125,8 @@ |C2S_GP_GP_SHOP_CAN_BUY_REQ|28|23|1|0x829e63|| |S2C_GP_GP_SHOP_CAN_BUY_RES|28|23|2|0x7d84e0|課金商品購入可能状態の取得に| |S2C_GP_28_24_16_NTC|28|24|16|0x7d6fd0|None| -|S2C_GP_28_25_16_NTC|28|25|16|0x7d8010|None| -|S2C_GP_28_26_16_NTC|28|26|16|0x7d78f0|None| +|S2C_GP_COURSE_START_NTC|28|25|16|0x7d8010|None| +|S2C_GP_COURSE_EXTEND_NTC|28|26|16|0x7d78f0|None| |S2C_GP_28_27_16_NTC|28|27|16|0x7d7770|None| |S2C_GP_28_28_16_NTC|28|28|16|0x7d80c0|None| |S2C_GP_28_29_16_NTC|28|29|16|0x7d7810|None|