private static void HandleExtractGem(GameSession session, PacketReader packet)
    {
        long equipItemUid = packet.ReadLong();
        byte slot         = packet.ReadByte();

        if (!session.Player.Inventory.HasItem(equipItemUid) && !session.Player.Inventory.ItemIsEquipped(equipItemUid))
        {
            session.Send(ItemSocketSystemPacket.Notice((int)ItemSocketSystemNotice.ItemIsNotInYourInventory));
            return;
        }

        Item equipItem = session.Player.Inventory.GetByUid(equipItemUid);

        if (equipItem.Stats.GemSockets[slot].Gemstone == null)
        {
            return;
        }

        Gemstone gemstone = equipItem.Stats.GemSockets[slot].Gemstone;

        int gemLevel = ItemGemstoneUpgradeMetadataStorage.GetGemLevel(gemstone.Id);

        Script   script       = ScriptLoader.GetScript("Functions/calcGetGemStonePutOffPrice");
        DynValue scriptResult = script.RunFunction("calcGetGemStonePutOffPrice", gemLevel, (int)equipItem.InventoryTab);

        string itemTag        = scriptResult.Tuple[0].String;
        int    ingredientCost = (int)scriptResult.Tuple[1].Number;

        if (!ConsumeIngredients(session, session.Player.Inventory, ingredientCost, itemTag))
        {
            return;
        }

        Item gemstoneItem = new(gemstone.Id, rarity : 4)
        {
            IsLocked   = gemstone.IsLocked,
            UnlockTime = gemstone.UnlockTime,
        };

        if (gemstone.OwnerId != 0)
        {
            Player owner = GameServer.PlayerManager.GetPlayerById(gemstone.OwnerId);
            if (owner != null)
            {
                gemstoneItem.OwnerCharacterId   = owner.CharacterId;
                gemstoneItem.OwnerCharacterName = owner.Name;
            }
        }

        // remove gemstone from item
        equipItem.Stats.GemSockets[slot].Gemstone = null;

        session.Player.Inventory.AddItem(session, gemstoneItem, true);
        session.Send(ItemSocketSystemPacket.ExtractGem(equipItemUid, gemstoneItem.Uid, slot));
    }
示例#2
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));
    }