Lose pawns on pawn death

This commit is contained in:
alborrajo 2024-09-01 21:42:04 +02:00
parent 66b24d496c
commit baec9ae582
8 changed files with 107 additions and 38 deletions

View file

@ -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<GameClient, C2SPawnGetLostPawnListReq>
public class PawnGetLostPawnListHandler : GameRequestPacketHandler<C2SPawnGetLostPawnListReq, S2CPawnGetLostPawnListRes>
{
private static readonly ServerLogger Logger = LogProvider.Logger<ServerLogger>(typeof(PawnGetLostPawnListHandler));
@ -17,10 +15,33 @@ namespace Arrowgene.Ddon.GameServer.Handler
{
}
public override void Handle(GameClient client, StructurePacket<C2SPawnGetLostPawnListReq> 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()
};
}
}
}

View file

@ -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<C2SPawnPawnLostReq>
public class PawnPawnLostHandler : GameRequestPacketHandler<C2SPawnPawnLostReq, S2CPawnPawnLostRes>
{
private static readonly ServerLogger Logger = LogProvider.Logger<ServerLogger>(typeof(PawnPawnLostHandler));
@ -15,16 +14,25 @@ namespace Arrowgene.Ddon.GameServer.Handler
{
}
public override void Handle(GameClient client, StructurePacket<C2SPawnPawnLostReq> 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
};
}
}
}

View file

@ -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());

View file

@ -11,24 +11,24 @@ namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
public S2CPawnGetLostPawnListRes()
{
LostPawnList = new List<CDataLostPawn>();
LostPawnList = new List<CDataLostPawnList>();
}
public List<CDataLostPawn> LostPawnList { get; set; }
public List<CDataLostPawnList> LostPawnList { get; set; }
public class Serializer : PacketEntitySerializer<S2CPawnGetLostPawnListRes>
{
public override void Write(IBuffer buffer, S2CPawnGetLostPawnListRes obj)
{
WriteServerResponse(buffer, obj);
WriteEntityList<CDataLostPawn>(buffer, obj.LostPawnList);
WriteEntityList<CDataLostPawnList>(buffer, obj.LostPawnList);
}
public override S2CPawnGetLostPawnListRes Read(IBuffer buffer)
{
S2CPawnGetLostPawnListRes obj = new S2CPawnGetLostPawnListRes();
ReadServerResponse(buffer, obj);
obj.LostPawnList = ReadEntityList<CDataLostPawn>(buffer);
obj.LostPawnList = ReadEntityList<CDataLostPawnList>(buffer);
return obj;
}
}

View file

@ -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<S2CPawnPawnLostNtc>
{
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;
}
}
}
}

View file

@ -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<CDataLostPawn>
public class Serializer : EntitySerializer<CDataLostPawnList>
{
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<CDataPawnListData>(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<CDataPawnListData>(buffer);

View file

@ -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);

View file

@ -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|