-
Notifications
You must be signed in to change notification settings - Fork 83
Expand file tree
/
Copy pathInstanceGetGatheringItemListHandler.cs
More file actions
110 lines (97 loc) · 5.06 KB
/
Copy pathInstanceGetGatheringItemListHandler.cs
File metadata and controls
110 lines (97 loc) · 5.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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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.Linq;
namespace Arrowgene.Ddon.GameServer.Handler
{
public class InstanceGetGatheringItemListHandler : GameRequestPacketHandler<C2SInstanceGetGatheringItemListReq, S2CInstanceGetGatheringItemListRes>
{
private static readonly ServerLogger Logger = LogProvider.Logger<ServerLogger>(typeof(InstanceGetGatheringItemListHandler));
private static readonly Dictionary<ItemId, double> BreakChance = new Dictionary<ItemId, double>()
{
};
public InstanceGetGatheringItemListHandler(DdonGameServer server) : base(server)
{
}
public override S2CInstanceGetGatheringItemListRes Handle(GameClient client, C2SInstanceGetGatheringItemListReq request)
{
PacketQueue queue = new();
var (isNew, gatheringItems) = client.InstanceGatheringItemManager.FetchOrGenerate(request.LayoutId, request.PosId);
bool isGatheringItemBreak = false;
Server.Database.ExecuteInTransaction(connection =>
{
if (isNew && request.GatheringItemUId.Any())
{
var gatheringItem = Server.ItemManager.LookupInfoByUID(Server, request.GatheringItemUId, connection);
switch ((ItemId)gatheringItem.ItemId)
{
case ItemId.Pickaxe:
case ItemId.ArtisansPickaxe:
case ItemId.EnhancedPickaxe:
queue.AddRange(Server.AchievementManager.HandleCollect(client, AchievementCollectParam.Ore, connection));
break;
case ItemId.Lockpick:
case ItemId.AllPurposeLockpick:
case ItemId.EnhancedLockpick:
queue.AddRange(Server.AchievementManager.HandleCollect(client, AchievementCollectParam.Chest, connection));
break;
case ItemId.LumberKnife:
case ItemId.ArtisansLumberKnife:
case ItemId.EnhancedLumberKnife:
queue.AddRange(Server.AchievementManager.HandleCollect(client, AchievementCollectParam.Wood, connection));
break;
}
double breakChance = 0.3; // Set the default break chance in case an item is missing
var itemId = gatheringItem.ItemId;
if (Server.GameSettings.GameServerSettings.ToolBreakChance.ContainsKey((ItemId)itemId))
{
breakChance = Server.GameSettings.GameServerSettings.ToolBreakChance[(ItemId)itemId];
}
if (Random.Shared.NextDouble() < breakChance)
{
isGatheringItemBreak = true;
S2CItemUpdateCharacterItemNtc ntc = new S2CItemUpdateCharacterItemNtc();
ntc.UpdateItemList.AddRange(Server.ItemManager.ConsumeItemByUIdFromMultipleStorages(Server, client.Character, ItemManager.ItemBagStorageTypes, request.GatheringItemUId, 1, connection));
client.Enqueue(ntc, queue);
}
}
uint stageNo = StageManager.ConvertIdToStageNo(request.LayoutId.AsStageLayoutId());
if (Server.AssetRepository.GatheringSpotInfoAsset.GatheringInfoMap.TryGetValue(stageNo, out var spots)
&& spots.TryGetValue((request.LayoutId.AsStageLayoutId().GroupId, request.PosId), out var spotInfo))
{
if (spotInfo.GatheringType is GatheringType.OM_GATHER_GRASS
or GatheringType.OM_GATHER_FLOWER
or GatheringType.OM_GATHER_MUSHROOM)
{
queue.AddRange(Server.AchievementManager.HandleCollect(client, AchievementCollectParam.Herb, connection));
}
}
});
queue.Send();
S2CInstanceGetGatheringItemListRes res = new()
{
LayoutId = request.LayoutId,
PosId = request.PosId,
GatheringItemUId = request.GatheringItemUId,
IsGatheringItemBreak = isGatheringItemBreak,
ItemList = gatheringItems
.Select((asset, index) => new CDataGatheringItemElement()
{
SlotNo = (uint)index,
ItemId = (uint) asset.ItemId,
ItemNum = asset.ItemNum,
Quality = asset.Quality,
IsHidden = asset.IsHidden
})
.ToList()
};
return res;
}
}
}