~ruther/NosSmooth

ref: ed76c27b262982f8550d615a3ed83f669c72f2d5 NosSmooth/Core/NosSmooth.Game/Helpers/EquipmentHelpers.cs -rw-r--r-- 3.4 KiB
ed76c27b — Rutherther docs: fix MateWalkCommand header 2 years ago
                                                                                
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
//
//  EquipmentHelpers.cs
//
//  Copyright (c) František Boháček. All rights reserved.
//  Licensed under the MIT license. See LICENSE file in the project root for full license information.

using NosSmooth.Data.Abstractions;
using NosSmooth.Game.Data.Items;
using NosSmooth.Packets.Server.Maps;
using NosSmooth.Packets.Server.Weapons;

namespace NosSmooth.Game.Helpers;

/// <summary>
/// Helpers for creating equipment from packets.
/// </summary>
public static class EquipmentHelpers
{
    /// <summary>
    /// Create <see cref="Equipment"/> from the given in equipment subpacket.
    /// </summary>
    /// <param name="infoService">The info service.</param>
    /// <param name="equipmentSubPacket">The subpacket.</param>
    /// <param name="weaponUpgradeRare">The weapon upgrade.</param>
    /// <param name="armorUpgradeRare">The armor upgrade.</param>
    /// <param name="ct">The cancellation token for cancelling the operation.</param>
    /// <returns>The equipment or an error.</returns>
    public static async Task<Equipment> CreateEquipmentFromInSubpacketAsync
    (
        IInfoService infoService,
        InEquipmentSubPacket equipmentSubPacket,
        UpgradeRareSubPacket? weaponUpgradeRare = default,
        UpgradeRareSubPacket? armorUpgradeRare = default,
        CancellationToken ct = default
    )
    {
        var fairy = await CreateItemAsync(infoService, equipmentSubPacket.FairyVNum, ct);
        var mask = await CreateItemAsync(infoService, equipmentSubPacket.MaskVNum, ct);
        var hat = await CreateItemAsync(infoService, equipmentSubPacket.HatVNum, ct);
        var costumeSuit = await CreateItemAsync(infoService, equipmentSubPacket.CostumeSuitVNum, ct);
        var costumeHat = await CreateItemAsync(infoService, equipmentSubPacket.CostumeHatVNum, ct);
        var mainWeapon = await CreateItemAsync(infoService, equipmentSubPacket.MainWeaponVNum, weaponUpgradeRare, ct);
        var secondaryWeapon = await CreateItemAsync(infoService, equipmentSubPacket.SecondaryWeaponVNum, null, ct);
        var armor = await CreateItemAsync(infoService, equipmentSubPacket.ArmorVNum, armorUpgradeRare, ct);

        return new Equipment
        (
            hat,
            armor,
            mainWeapon,
            secondaryWeapon,
            mask,
            fairy,
            costumeSuit,
            costumeHat,
            equipmentSubPacket.WeaponSkin,
            equipmentSubPacket.WingSkin
        );
    }

    private static async Task<Item?> CreateItemAsync(IInfoService infoService, int? itemVNum, CancellationToken ct = default)
    {
        if (itemVNum is null)
        {
            return null;
        }

        var itemInfo = await infoService.GetItemInfoAsync(itemVNum.Value, ct);

        return new Item
        (
            itemVNum.Value,
            itemInfo.IsSuccess ? itemInfo.Entity : null
        );
    }

    private static async Task<UpgradeableItem?> CreateItemAsync
        (IInfoService infoService, int? itemVNum, UpgradeRareSubPacket? upgradeRareSubPacket, CancellationToken ct = default)
    {
        if (itemVNum is null)
        {
            return null;
        }

        var itemInfo = await infoService.GetItemInfoAsync(itemVNum.Value, ct);

        return new UpgradeableItem
        (
            itemVNum.Value,
            itemInfo.IsSuccess ? itemInfo.Entity : null,
            upgradeRareSubPacket?.Upgrade,
            upgradeRareSubPacket?.Rare,
            null
        );
    }
}
Do not follow this link