Skip to content

Commit ed32423

Browse files
committed
Basic guards on changing jobs/getting quest rewards with a full box.
1 parent ff1b2a2 commit ed32423

4 files changed

Lines changed: 59 additions & 13 deletions

File tree

Arrowgene.Ddon.GameServer/Characters/JobManager.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,26 @@ public JobManager(DdonGameServer server)
3131
_Server = server;
3232
}
3333

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

39+
var totalSlots = common.Equipment.GetItems(EquipType.Performance)
40+
.Concat(common.Equipment.GetItems(EquipType.Visual))
41+
.Where(x => x != null)
42+
.ToList()
43+
.Count;
44+
if (totalSlots > client.Character.Storage.GetStorage(StorageType.StorageBoxNormal).EmptySlots())
45+
{
46+
return (new S2CJobChangeJobRes()
47+
{
48+
Error = (uint)ErrorCode.ERROR_CODE_JOBCHANGE_ITEM_CAPACITY_OVER
49+
},
50+
null,
51+
null);
52+
}
53+
3954
JobId oldJobId = common.Job;
4055
common.Job = jobId;
4156

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
1+
using Arrowgene.Ddon.GameServer.Characters;
12
using Arrowgene.Ddon.Server;
2-
using Arrowgene.Ddon.Server.Network;
33
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
44
using Arrowgene.Logging;
5-
using Arrowgene.Ddon.Shared.Network;
6-
using Arrowgene.Ddon.GameServer.Characters;
7-
using Arrowgene.Ddon.Shared.Entity.Structure;
8-
using Arrowgene.Ddon.Shared.Entity;
95

106
namespace Arrowgene.Ddon.GameServer.Handler
117
{
12-
public class JobChangeJobHandler : StructurePacketHandler<GameClient, C2SJobChangeJobReq>
8+
public class JobChangeJobHandler : GameRequestPacketHandler<C2SJobChangeJobReq, S2CJobChangeJobRes>
139
{
1410
private static readonly ServerLogger Logger = LogProvider.Logger<ServerLogger>(typeof(JobChangeJobHandler));
1511

@@ -20,22 +16,30 @@ public JobChangeJobHandler(DdonGameServer server) : base(server)
2016
jobManager = server.JobManager;
2117
}
2218

23-
public override void Handle(GameClient client, StructurePacket<C2SJobChangeJobReq> packet)
19+
public override S2CJobChangeJobRes Handle(GameClient client, C2SJobChangeJobReq request)
2420
{
2521
(S2CJobChangeJobRes jobRes, S2CItemUpdateCharacterItemNtc itemNtc, S2CJobChangeJobNtc jobNtc) jobResult = (null, null, null);
2622

2723
Server.Database.ExecuteInTransaction(connection =>
2824
{
2925
jobResult = ((S2CJobChangeJobRes, S2CItemUpdateCharacterItemNtc, S2CJobChangeJobNtc))
30-
jobManager.SetJob(client, client.Character, packet.Structure.JobId, connection);
26+
jobManager.SetJob(client, client.Character, request.JobId, connection);
3127
});
3228

33-
foreach (GameClient otherClient in Server.ClientLookup.GetAll())
29+
if (jobResult.jobNtc != null)
3430
{
35-
otherClient.Send(jobResult.jobNtc);
31+
foreach (GameClient otherClient in Server.ClientLookup.GetAll())
32+
{
33+
otherClient.Send(jobResult.jobNtc);
34+
}
3635
}
37-
client.Send(jobResult.itemNtc);
38-
client.Send(jobResult.jobRes);
36+
37+
if (jobResult.itemNtc != null)
38+
{
39+
client.Send(jobResult.itemNtc);
40+
}
41+
42+
return jobResult.jobRes;
3943
}
4044
}
4145
}

Arrowgene.Ddon.GameServer/Handler/PawnCreatePawnHandler.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ public PawnCreatePawnHandler(DdonGameServer server) : base(server)
2222

2323
public override S2CPawnCreatePawnRes Handle(GameClient client, C2SPawnCreatePawnReq request)
2424
{
25+
// I hate hardcoding this but people legitimately keep finding ways to break this.
26+
if (request.SlotNo > 3)
27+
{
28+
throw new ResponseErrorException(ErrorCode.ERROR_CODE_PAWN_CREATE_NUM_OVER);
29+
}
30+
2531
if (request.SlotNo == 1)
2632
{
2733
const byte myPawnSlotNum = 2;
@@ -62,6 +68,17 @@ public override S2CPawnCreatePawnRes Handle(GameClient client, C2SPawnCreatePawn
6268
Error = (uint)ErrorCode.ERROR_CODE_CHARACTER_ITEM_NOT_FOUND
6369
};
6470
}
71+
else
72+
{
73+
client.Send(new S2CItemUpdateCharacterItemNtc()
74+
{
75+
UpdateType = ItemNoticeType.CreatePawn,
76+
UpdateItemList = new()
77+
{
78+
result
79+
}
80+
});
81+
}
6582
}
6683

6784
Pawn pawn = new Pawn(client.Character.CharacterId)

Arrowgene.Ddon.GameServer/Handler/QuestGetRewardBoxItemHandler.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,16 @@ public override S2CQuestGetRewardBoxItemRes Handle(GameClient client, C2SQuestGe
6262
}
6363
}
6464

65+
var slotCount = coalescedRewards
66+
.Where(x => !Server.ItemManager.IsItemWalletPoint(x.Value.ItemId) && x.Value.Num > 0)
67+
.ToList()
68+
.Count;
69+
70+
if (slotCount > client.Character.Storage.GetStorage(StorageType.StorageBoxNormal).EmptySlots())
71+
{
72+
throw new ResponseErrorException(ErrorCode.ERROR_CODE_ITEM_STORAGE_OVERFLOW);
73+
}
74+
6575
foreach (var rewardUID in packet.GetRewardBoxItemList.Select(x => x.UID).Distinct().ToList())
6676
{
6777
var reward = coalescedRewards[rewardUID];

0 commit comments

Comments
 (0)