コード例 #1
0
    private static void HandleUpgradeGem(GameSession session, PacketReader packet)
    {
        long equipUid = packet.ReadLong();
        byte slot     = packet.ReadByte();
        long itemUid  = packet.ReadLong();

        ItemGemstoneUpgradeMetadata metadata;

        Inventory inventory = session.Player.Inventory;

        if (equipUid == 0) // this is a gemstone in the player's inventory
        {
            if (!inventory.Items.ContainsKey(itemUid))
            {
                session.Send(ItemSocketSystemPacket.Notice((int)ItemSocketSystemNotice.ItemIsNotInYourInventory));
                return;
            }

            Item gem = inventory.Items[itemUid];
            if (gem == null)
            {
                return;
            }

            metadata = ItemGemstoneUpgradeMetadataStorage.GetMetadata(gem.Id);
            if (metadata == null || metadata.NextItemId == 0)
            {
                return;
            }

            if (!CheckGemUpgradeIngredients(inventory, metadata))
            {
                return;
            }

            ConsumeIngredients(session, metadata);
            inventory.ConsumeItem(session, gem.Uid, 1);

            Item upgradeGem = new(metadata.NextItemId)
            {
                Rarity = gem.Rarity
            };
            inventory.AddItem(session, upgradeGem, true);
            session.Send(ItemSocketSystemPacket.UpgradeGem(equipUid, slot, upgradeGem));
            return;
        }

        // upgrade gem mounted on a equipment
        if (!inventory.Items.ContainsKey(equipUid))
        {
            session.Send(ItemSocketSystemPacket.Notice((int)ItemSocketSystemNotice.ItemIsNotInYourInventory));
            return;
        }

        Gemstone gemstone = inventory.Items[equipUid].Stats.GemSockets[slot].Gemstone;

        if (gemstone == null)
        {
            return;
        }

        metadata = ItemGemstoneUpgradeMetadataStorage.GetMetadata(gemstone.Id);
        if (metadata == null || metadata.NextItemId == 0)
        {
            return;
        }

        if (!CheckGemUpgradeIngredients(inventory, metadata))
        {
            return;
        }

        ConsumeIngredients(session, metadata);

        Item newGem = new(metadata.NextItemId)
        {
            IsLocked   = gemstone.IsLocked,
            UnlockTime = gemstone.UnlockTime
        };

        Player owner = GameServer.PlayerManager.GetPlayerById(gemstone.OwnerId);

        if (owner != null)
        {
            newGem.OwnerCharacterId   = owner.CharacterId;
            newGem.OwnerCharacterName = owner.Name;
        }

        Gemstone upgradedGemstone = new()
        {
            Id         = metadata.NextItemId,
            IsLocked   = gemstone.IsLocked,
            UnlockTime = gemstone.UnlockTime,
            OwnerId    = gemstone.OwnerId,
            OwnerName  = gemstone.OwnerName
        };

        inventory.Items[equipUid].Stats.GemSockets[slot].Gemstone = gemstone;
        session.Send(ItemSocketSystemPacket.UpgradeGem(equipUid, slot, newGem));
    }