Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: Packet queue adjustments #648

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions Arrowgene.Ddon.GameServer/Characters/EquipManager.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#nullable enable
using Arrowgene.Ddon.Server;
using Arrowgene.Ddon.Shared.Entity;
using Arrowgene.Ddon.Server.Network;
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
using Arrowgene.Ddon.Shared.Entity.Structure;
using Arrowgene.Ddon.Shared.Model;
Expand Down Expand Up @@ -119,8 +119,10 @@ public void EquipJobItem(DdonGameServer server, GameClient client, CharacterComm
}
}

public (IPacketStructure, IPacketStructure) HandleChangeEquipList(DdonGameServer server, GameClient client, CharacterCommon characterToEquipTo, List<CDataCharacterEquipInfo> changeCharacterEquipList, ItemNoticeType updateType, List<StorageType> storageTypes, DbConnection? connectionIn = null)
public PacketQueue HandleChangeEquipList(DdonGameServer server, GameClient client, CharacterCommon characterToEquipTo, List<CDataCharacterEquipInfo> changeCharacterEquipList, ItemNoticeType updateType, List<StorageType> storageTypes, DbConnection? connectionIn = null)
{
PacketQueue queue = new();

S2CItemUpdateCharacterItemNtc updateCharacterItemNtc = new S2CItemUpdateCharacterItemNtc()
{
UpdateType = updateType
Expand Down Expand Up @@ -238,7 +240,10 @@ public void EquipJobItem(DdonGameServer server, GameClient client, CharacterComm
// TODO: Unk0
};

return (updateCharacterItemNtc, changeCharacterEquipNtc);
client.Enqueue(updateCharacterItemNtc, queue);
server.ClientLookup.EnqueueToAll(changeCharacterEquipNtc, queue);

return queue;
}
else if(characterToEquipTo is Pawn pawn)
{
Expand All @@ -251,7 +256,8 @@ public void EquipJobItem(DdonGameServer server, GameClient client, CharacterComm
// TODO: Unk0
};

return (updateCharacterItemNtc, changePawnEquipNtc);
client.Enqueue(updateCharacterItemNtc, queue);
server.ClientLookup.EnqueueToAll(changePawnEquipNtc, queue);
}

throw new ResponseErrorException(ErrorCode.ERROR_CODE_FAIL); //TODO: Find a better code.
Expand Down
34 changes: 22 additions & 12 deletions Arrowgene.Ddon.GameServer/Characters/JobManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,15 @@
using Arrowgene.Ddon.Database;
using Arrowgene.Ddon.GameServer.Handler;
using Arrowgene.Ddon.Server;
using Arrowgene.Ddon.Server.Network;
using Arrowgene.Ddon.Shared;
using Arrowgene.Ddon.Shared.Entity;
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
using Arrowgene.Ddon.Shared.Entity.Structure;
using Arrowgene.Ddon.Shared.Model;
using Arrowgene.Logging;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Entity;
using System.Linq;

namespace Arrowgene.Ddon.GameServer.Characters
Expand All @@ -31,19 +30,16 @@ public JobManager(DdonGameServer server)
_Server = server;
}

public (IPacketStructure jobRes, IPacketStructure? itemNtc, IPacketStructure? jobNtc) SetJob(GameClient client, CharacterCommon common, JobId jobId, DbConnection? connectionIn = null)
public PacketQueue SetJob(GameClient client, CharacterCommon common, JobId jobId, DbConnection? connectionIn = null)
{
// TODO: Reject job change if there's no primary and secondary weapon for the new job in storage
// (or give a lvl 1 weapon for free?)

PacketQueue queue = new();

if (!HasEmptySlotsForTemplateSwap(client, common, common.Job, jobId))
{
return (new S2CJobChangeJobRes()
{
Error = (uint)ErrorCode.ERROR_CODE_JOBCHANGE_ITEM_CAPACITY_OVER
},
null,
null);
throw new ResponseErrorException(ErrorCode.ERROR_CODE_JOBCHANGE_ITEM_CAPACITY_OVER);
}

JobId oldJobId = common.Job;
Expand All @@ -52,7 +48,6 @@ public JobManager(DdonGameServer server)
S2CItemUpdateCharacterItemNtc updateCharacterItemNtc = new S2CItemUpdateCharacterItemNtc();
updateCharacterItemNtc.UpdateItemList.AddRange(SwapEquipmentAndStorage(client, common, oldJobId, jobId, EquipType.Performance, connectionIn));
updateCharacterItemNtc.UpdateItemList.AddRange(SwapEquipmentAndStorage(client, common, oldJobId, jobId, EquipType.Visual, connectionIn));
client.Send(updateCharacterItemNtc);

CDataCharacterJobData? activeCharacterJobData = common.ActiveCharacterJobData;

Expand Down Expand Up @@ -102,6 +97,7 @@ public JobManager(DdonGameServer server)
changeJobNotice.LearnNormalSkillParamList = normalSkills;
changeJobNotice.EquipJobItemList = jobItems;
// TODO: Unk0


updateCharacterItemNtc.UpdateType = ItemNoticeType.ChangeJob;

Expand All @@ -118,8 +114,15 @@ public JobManager(DdonGameServer server)
.FirstOrDefault(new CDataPlayPointData());
changeJobResponse.Unk0.Unk0 = (byte)jobId;
changeJobResponse.Unk0.Unk1 = character.Storage.GetAllStoragesAsCDataCharacterItemSlotInfoList();

client.Enqueue(changeJobResponse, queue);
client.Enqueue(updateCharacterItemNtc, queue);
foreach (GameClient otherClient in _Server.ClientLookup.GetAll())
{
otherClient.Enqueue(changeJobNotice, queue);
}

return (changeJobResponse, updateCharacterItemNtc, changeJobNotice);
return queue;
}
else if (common is Pawn)
{
Expand Down Expand Up @@ -151,7 +154,14 @@ public JobManager(DdonGameServer server)
changeJobResponse.TrainingStatus = pawn.TrainingStatus.GetValueOrDefault(pawn.Job, new byte[64]);
changeJobResponse.SpSkillList = pawn.SpSkills.GetValueOrDefault(pawn.Job, new List<CDataSpSkill>());

return (changeJobResponse, updateCharacterItemNtc, changeJobNotice);
client.Enqueue(changeJobResponse, queue);
client.Enqueue(updateCharacterItemNtc, queue);
foreach (GameClient otherClient in _Server.ClientLookup.GetAll())
{
otherClient.Enqueue(changeJobNotice, queue);
}

return queue;
}
else
{
Expand Down
25 changes: 24 additions & 1 deletion Arrowgene.Ddon.GameServer/GameClientLookup.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
using System.Collections.Generic;
using Arrowgene.Ddon.Database.Model;
using Arrowgene.Ddon.Server;
using Arrowgene.Ddon.Server.Network;
using Arrowgene.Ddon.Shared.Entity;
using Arrowgene.Ddon.Shared.Model;
using Arrowgene.Ddon.Shared.Network;
using System.Collections.Generic;

namespace Arrowgene.Ddon.GameServer
{
Expand Down Expand Up @@ -84,5 +87,25 @@ public GameClient GetClientByCharacterName(string FirstName, string LastName)

return null;
}

public void SendToAll<TResStruct>(TResStruct res)
where TResStruct : class, IPacketStructure, new()
{
StructurePacket<TResStruct> packet = new StructurePacket<TResStruct>(res);
foreach (GameClient client in GetAll())
{
client.Send(packet);
}
}

public void EnqueueToAll<TResStruct>(TResStruct res, PacketQueue queue)
where TResStruct : class, IPacketStructure, new()
{
StructurePacket<TResStruct> packet = new StructurePacket<TResStruct>(res);
foreach (GameClient client in GetAll())
{
queue.Enqueue((client, packet));
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,10 @@
using Arrowgene.Ddon.GameServer.Characters;
using Arrowgene.Ddon.GameServer.Dump;
using Arrowgene.Ddon.Server;
using Arrowgene.Ddon.Shared.Csv;
using Arrowgene.Ddon.Shared.Entity;
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
using Arrowgene.Ddon.Shared.Entity.Structure;
using Arrowgene.Ddon.Shared.Model;
using Arrowgene.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Security.Cryptography;

namespace Arrowgene.Ddon.GameServer.Handler
{
Expand Down Expand Up @@ -56,12 +49,7 @@ public override S2CBattleContentContentResetRes Handle(GameClient client, C2SBat

// Set current job back to level 1 stats
var jobResults = Server.JobManager.SetJob(client, client.Character, client.Character.Job);
foreach (var otherClient in Server.ClientLookup.GetAll())
{
otherClient.Send((S2CJobChangeJobNtc)jobResults.jobNtc);
}
client.Send((S2CJobChangeJobNtc)jobResults.jobNtc);
client.Send((S2CItemUpdateCharacterItemNtc)jobResults.itemNtc);
jobResults.Send();

// Reset progress
client.Character.BbmProgress.StartTime = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

namespace Arrowgene.Ddon.GameServer.Handler
{
public class EquipChangeCharacterEquipHandler : GameRequestPacketHandler<C2SEquipChangeCharacterEquipReq, S2CEquipChangeCharacterEquipRes>
public class EquipChangeCharacterEquipHandler : GameRequestPacketQueueHandler<C2SEquipChangeCharacterEquipReq, S2CEquipChangeCharacterEquipRes>
{
private static readonly ServerLogger Logger = LogProvider.Logger<ServerLogger>(typeof(EquipChangeCharacterEquipHandler));

Expand All @@ -19,38 +19,35 @@ public EquipChangeCharacterEquipHandler(DdonGameServer server) : base(server)
equipManager = server.EquipManager;
}

public override S2CEquipChangeCharacterEquipRes Handle(GameClient client, C2SEquipChangeCharacterEquipReq request)
public override PacketQueue Handle(GameClient client, C2SEquipChangeCharacterEquipReq request)
{
(S2CItemUpdateCharacterItemNtc itemNtc, S2CEquipChangeCharacterEquipNtc equipNtc) equipResult = (null, null);

PacketQueue queue = new();

if (!Server.EquipManager.CanMeetStorageRequirements(Server, client, client.Character, request.ChangeCharacterEquipList, new List<StorageType>() { StorageType.ItemBagEquipment }))
{
throw new ResponseErrorException(ErrorCode.ERROR_CODE_ITEM_BAG_CAPACITY_OVER);
}

Server.Database.ExecuteInTransaction(connection =>
{
equipResult = ((S2CItemUpdateCharacterItemNtc, S2CEquipChangeCharacterEquipNtc))equipManager.HandleChangeEquipList(
queue.AddRange(equipManager.HandleChangeEquipList(
Server, client,
client.Character,
request.ChangeCharacterEquipList,
ItemNoticeType.ChangeEquip,
new List<StorageType>() { StorageType.ItemBagEquipment },
connection);
connection));
});

client.Send(equipResult.itemNtc);

foreach (Client otherClient in Server.ClientLookup.GetAll())
{
otherClient.Send(equipResult.equipNtc); //TODO: Investigate if we need to send this to *everyone*.
}

return new S2CEquipChangeCharacterEquipRes()
client.Enqueue(new S2CEquipChangeCharacterEquipRes()
{
CharacterEquipList = request.ChangeCharacterEquipList
// TODO: Unk0
};
}, queue);

return queue;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

namespace Arrowgene.Ddon.GameServer.Handler
{
public class EquipChangeCharacterStorageEquipHandler : GameRequestPacketHandler<C2SEquipChangeCharacterStorageEquipReq, S2CEquipChangeCharacterStorageEquipRes>
public class EquipChangeCharacterStorageEquipHandler : GameRequestPacketQueueHandler<C2SEquipChangeCharacterStorageEquipReq, S2CEquipChangeCharacterStorageEquipRes>
{
private static readonly ServerLogger Logger = LogProvider.Logger<ServerLogger>(typeof(EquipChangeCharacterStorageEquipHandler));

Expand All @@ -19,9 +19,9 @@ public EquipChangeCharacterStorageEquipHandler(DdonGameServer server) : base(ser
equipManager = server.EquipManager;
}

public override S2CEquipChangeCharacterStorageEquipRes Handle(GameClient client, C2SEquipChangeCharacterStorageEquipReq request)
public override PacketQueue Handle(GameClient client, C2SEquipChangeCharacterStorageEquipReq request)
{
(S2CItemUpdateCharacterItemNtc itemNtc, S2CEquipChangeCharacterEquipNtc equipNtc) equipResult = (null, null);
PacketQueue queue = new();

if (!Server.EquipManager.CanMeetStorageRequirements(Server, client, client.Character, request.ChangeCharacterEquipList, new List<StorageType>() { StorageType.StorageBoxNormal }))
{
Expand All @@ -30,29 +30,23 @@ public override S2CEquipChangeCharacterStorageEquipRes Handle(GameClient client,

Server.Database.ExecuteInTransaction(connection =>
{
equipResult = ((S2CItemUpdateCharacterItemNtc, S2CEquipChangeCharacterEquipNtc))
equipManager.HandleChangeEquipList(
queue.AddRange(equipManager.HandleChangeEquipList(
Server,
client,
client.Character,
request.ChangeCharacterEquipList,
ItemNoticeType.ChangeStorageEquip,
ItemManager.BoxStorageTypes,
connection);
connection));
});

client.Send(equipResult.itemNtc);

foreach (Client otherClient in Server.ClientLookup.GetAll())
{
otherClient.Send(equipResult.equipNtc);
}

return new S2CEquipChangeCharacterStorageEquipRes()
client.Enqueue(new S2CEquipChangeCharacterStorageEquipRes()
{
CharacterEquipList = request.ChangeCharacterEquipList
// TODO: Unk0
};
}, queue);

return queue;
}
}
}
27 changes: 12 additions & 15 deletions Arrowgene.Ddon.GameServer/Handler/EquipChangePawnEquipHandler.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Arrowgene.Ddon.GameServer.Characters;
using Arrowgene.Ddon.Server;
using Arrowgene.Ddon.Server.Network;
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
using Arrowgene.Ddon.Shared.Model;
using Arrowgene.Logging;
Expand All @@ -8,7 +9,7 @@

namespace Arrowgene.Ddon.GameServer.Handler
{
public class EquipChangePawnEquipHandler : GameRequestPacketHandler<C2SEquipChangePawnEquipReq, S2CEquipChangePawnEquipRes>
public class EquipChangePawnEquipHandler : GameRequestPacketQueueHandler<C2SEquipChangePawnEquipReq, S2CEquipChangePawnEquipRes>
{
private static readonly ServerLogger Logger = LogProvider.Logger<ServerLogger>(typeof(EquipChangePawnEquipHandler));

Expand All @@ -19,11 +20,11 @@ public EquipChangePawnEquipHandler(DdonGameServer server) : base(server)
equipManager = server.EquipManager;
}

public override S2CEquipChangePawnEquipRes Handle(GameClient client, C2SEquipChangePawnEquipReq request)
public override PacketQueue Handle(GameClient client, C2SEquipChangePawnEquipReq request)
{
(S2CItemUpdateCharacterItemNtc itemNtc, S2CEquipChangePawnEquipNtc equipNtc) equipResult = (null, null);

Pawn pawn = client.Character.Pawns.Where(pawn => pawn.PawnId == request.PawnId).Single();
PacketQueue queue = new();
Pawn pawn = client.Character.Pawns.Where(pawn => pawn.PawnId == request.PawnId).SingleOrDefault()
?? throw new ResponseErrorException(ErrorCode.ERROR_CODE_PAWN_INVALID);

if (!Server.EquipManager.CanMeetStorageRequirements(Server, client, pawn, request.ChangeCharacterEquipList, new List<StorageType>() { StorageType.ItemBagEquipment }))
{
Expand All @@ -32,28 +33,24 @@ public override S2CEquipChangePawnEquipRes Handle(GameClient client, C2SEquipCha

Server.Database.ExecuteInTransaction(connection =>
{
equipResult = ((S2CItemUpdateCharacterItemNtc, S2CEquipChangePawnEquipNtc))
equipManager.HandleChangeEquipList(
queue.AddRange(equipManager.HandleChangeEquipList(
Server,
client,
pawn,
request.ChangeCharacterEquipList,
ItemNoticeType.ChangePawnEquip,
new List<StorageType>() { StorageType.ItemBagEquipment },
connection);
connection));
});

client.Send(equipResult.itemNtc);

//Only the party needs to be updated, because only they can see pawns.
client.Party.SendToAllExcept(equipResult.equipNtc, client);

return new S2CEquipChangePawnEquipRes()
client.Enqueue(new S2CEquipChangePawnEquipRes()
{
PawnId = request.PawnId,
CharacterEquipList = request.ChangeCharacterEquipList
// TODO: Unk0
};
}, queue);

return queue;
}
}
}
Loading
Loading