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)); }
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)); }