-
Notifications
You must be signed in to change notification settings - Fork 83
Expand file tree
/
Copy pathPartnerPawnPresentForPartnerPawnHandler.cs
More file actions
66 lines (55 loc) · 3.06 KB
/
Copy pathPartnerPawnPresentForPartnerPawnHandler.cs
File metadata and controls
66 lines (55 loc) · 3.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using Arrowgene.Ddon.Database.Model;
using Arrowgene.Ddon.GameServer.Characters;
using Arrowgene.Ddon.Server;
using Arrowgene.Ddon.Server.Network;
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.Xml.Linq;
namespace Arrowgene.Ddon.GameServer.Handler
{
public class PartnerPawnPresentForPartnerPawnHandler : GameRequestPacketQueueHandler<C2SPartnerPawnPresentForPartnerPawnReq, S2CPartnerPawnPresentForPartnerPawnRes>
{
private static readonly ServerLogger Logger = LogProvider.Logger<ServerLogger>(typeof(PartnerPawnPresentForPartnerPawnHandler));
public PartnerPawnPresentForPartnerPawnHandler(DdonGameServer server) : base(server)
{
}
public override PacketQueue Handle(GameClient client, C2SPartnerPawnPresentForPartnerPawnReq request)
{
CDataPartnerPawnData partnerPawnData = new CDataPartnerPawnData();
var packets = new PacketQueue();
List<CDataItemUpdateResult> itemUpdateResults = new List<CDataItemUpdateResult>();
Server.Database.ExecuteInTransaction(connection =>
{
if (Server.Database.HasPartnerPawnLastAffectionIncreaseRecord(client.Character.CharacterId, client.Character.PartnerPawnId, PartnerPawnAffectionAction.Gift, connection))
{
throw new ResponseErrorException(ErrorCode.ERROR_CODE_PAWN_ALREADY_GIFTED);
}
foreach (var item in request.ItemUIDList)
{
uint itemId = client.Character.Storage.FindItemByUIdInStorage(ItemManager.AllItemStorages, item.ItemUID)?.Item2.Item2.ItemId
?? throw new ResponseErrorException(ErrorCode.ERROR_CODE_ITEM_NOT_FOUND, $"Could not find item {item.ItemUID}.");
var searchResult = client.Character.Storage.FindItemByUIdInStorage(ItemManager.BothStorageTypes, item.ItemUID);
var itemUpdate = Server.ItemManager.ConsumeItemByUId(Server, client.Character, searchResult.Item1, item.ItemUID, item.Num, connectionIn: connection)
?? throw new ResponseErrorException(ErrorCode.ERROR_CODE_QUEST_DONT_HAVE_DELIVERY_ITEM);
itemUpdateResults.Add(itemUpdate);
packets.AddRange(Server.PartnerPawnManager.UpdateLikabilityIncreaseAction(client, PartnerPawnAffectionAction.Gift, connection));
}
partnerPawnData = Server.PartnerPawnManager.GetCDataPartnerPawnData(client, connection);
});
packets.Enqueue(client, new S2CItemUpdateCharacterItemNtc()
{
UpdateType = ItemNoticeType.QuestDelivery,
UpdateItemList = itemUpdateResults
});
packets.Enqueue(client, new S2CPartnerPawnPresentForPartnerPawnRes()
{
PartnerInfo = partnerPawnData
});
return packets;
}
}
}