public D3ItemGemLabelControl(SocketedGem socketedGem) : this() { guiGemEffectLabel.Text = String.Empty; if (socketedGem.Attributes.Primary != null && socketedGem.Attributes.Primary.Any()) { foreach (var primary in socketedGem.Attributes.Primary) { guiGemEffectLabel.Text += primary.Text; } } if (socketedGem.Attributes.Secondary != null && socketedGem.Attributes.Secondary.Any()) { foreach (var secondary in socketedGem.Attributes.Secondary) { guiGemEffectLabel.Text += secondary.Text; } } if (socketedGem.Attributes.Passive != null && socketedGem.Attributes.Passive.Any()) { foreach (var passive in socketedGem.Attributes.Passive) { guiGemEffectLabel.Text += passive.Text; } } if (socketedGem.AttributesRaw.JewelRank != null) { guiGemEffectLabel.Text += Environment.NewLine + String.Format("Rank {0}", socketedGem.AttributesRaw.JewelRank.Min); } }
public D3ItemJewelLabelControl(SocketedGem socketedGem) : this() { guiJewelEffectLabel.Text = String.Empty; guiJewelNameLabel.Text = socketedGem.Item.Name; guiJewelRankLabel.Text = socketedGem.JewelRank.ToString(); if (socketedGem.Attributes.Primary != null && socketedGem.Attributes.Primary.Any()) { foreach (var primary in socketedGem.Attributes.Primary) { LabelHelper.ConcatOnNewLine(ref guiJewelEffectLabel, primary.Text); } } if (socketedGem.Attributes.Secondary != null && socketedGem.Attributes.Secondary.Any()) { foreach (var secondary in socketedGem.Attributes.Secondary) { LabelHelper.ConcatOnNewLine(ref guiJewelEffectLabel, secondary.Text); } } if (socketedGem.Attributes.Passive != null && socketedGem.Attributes.Passive.Any()) { foreach (var passive in socketedGem.Attributes.Passive) { LabelHelper.ConcatOnNewLine(ref guiJewelEffectLabel, passive.Text); } } }
public ItemInstance(SocketedGem gem) { ItemID = gem.ItemId; ItemBonuses bonus = new ItemBonuses(); bonus.Context = (ItemContext)(byte)gem.Context; foreach (ushort bonusListId in gem.BonusListIDs) { if (bonusListId != 0) { bonus.BonusListIDs.Add(bonusListId); } } if (bonus.Context != 0 || !bonus.BonusListIDs.Empty()) { ItemBonus.Set(bonus); } }
void HandleSocketGems(SocketGems socketGems) { if (socketGems.ItemGuid.IsEmpty()) { return; } //cheat . tried to socket same gem multiple times if ((!socketGems.GemItem[0].IsEmpty() && (socketGems.GemItem[0] == socketGems.GemItem[1] || socketGems.GemItem[0] == socketGems.GemItem[2])) || (!socketGems.GemItem[1].IsEmpty() && (socketGems.GemItem[1] == socketGems.GemItem[2]))) { return; } Item itemTarget = GetPlayer().GetItemByGuid(socketGems.ItemGuid); if (!itemTarget) //missing item to socket { return; } ItemTemplate itemProto = itemTarget.GetTemplate(); if (itemProto == null) { return; } //this slot is excepted when applying / removing meta gem bonus byte slot = itemTarget.IsEquipped() ? itemTarget.GetSlot() : ItemConst.NullSlot; Item[] gems = new Item[ItemConst.MaxGemSockets]; ItemDynamicFieldGems[] gemData = new ItemDynamicFieldGems[ItemConst.MaxGemSockets]; GemPropertiesRecord[] gemProperties = new GemPropertiesRecord[ItemConst.MaxGemSockets]; SocketedGem[] oldGemData = new SocketedGem[ItemConst.MaxGemSockets]; for (int i = 0; i < ItemConst.MaxGemSockets; ++i) { Item gem = _player.GetItemByGuid(socketGems.GemItem[i]); if (gem) { gems[i] = gem; gemData[i].ItemId = gem.GetEntry(); gemData[i].Context = (byte)gem.m_itemData.Context; for (int b = 0; b < ((List <uint>)gem.m_itemData.BonusListIDs).Count && b < 16; ++b) { gemData[i].BonusListIDs[b] = (ushort)((List <uint>)gem.m_itemData.BonusListIDs)[b]; } gemProperties[i] = CliDB.GemPropertiesStorage.LookupByKey(gem.GetTemplate().GetGemProperties()); } oldGemData[i] = itemTarget.GetGem((ushort)i); } // Find first prismatic socket uint firstPrismatic = 0; while (firstPrismatic < ItemConst.MaxGemSockets && itemTarget.GetSocketColor(firstPrismatic) != 0) { ++firstPrismatic; } for (uint i = 0; i < ItemConst.MaxGemSockets; ++i) //check for hack maybe { if (gemProperties[i] == null) { continue; } // tried to put gem in socket where no socket exists (take care about prismatic sockets) if (itemTarget.GetSocketColor(i) == 0) { // no prismatic socket if (itemTarget.GetEnchantmentId(EnchantmentSlot.Prismatic) == 0) { return; } if (i != firstPrismatic) { return; } } // Gem must match socket color if (ItemConst.SocketColorToGemTypeMask[(int)itemTarget.GetSocketColor(i)] != gemProperties[i].Type) { // unless its red, blue, yellow or prismatic if (!ItemConst.SocketColorToGemTypeMask[(int)itemTarget.GetSocketColor(i)].HasAnyFlag(SocketColor.Prismatic) || !gemProperties[i].Type.HasAnyFlag(SocketColor.Prismatic)) { return; } } } // check unique-equipped conditions for (int i = 0; i < ItemConst.MaxGemSockets; ++i) { if (!gems[i]) { continue; } // continue check for case when attempt add 2 similar unique equipped gems in one item. ItemTemplate iGemProto = gems[i].GetTemplate(); // unique item (for new and already placed bit removed enchantments if (iGemProto.HasFlag(ItemFlags.UniqueEquippable)) { for (int j = 0; j < ItemConst.MaxGemSockets; ++j) { if (i == j) // skip self { continue; } if (gems[j]) { if (iGemProto.GetId() == gems[j].GetEntry()) { GetPlayer().SendEquipError(InventoryResult.ItemUniqueEquippableSocketed, itemTarget); return; } } else if (oldGemData[j] != null) { if (iGemProto.GetId() == oldGemData[j].ItemId) { GetPlayer().SendEquipError(InventoryResult.ItemUniqueEquippableSocketed, itemTarget); return; } } } } // unique limit type item int limit_newcount = 0; if (iGemProto.GetItemLimitCategory() != 0) { ItemLimitCategoryRecord limitEntry = CliDB.ItemLimitCategoryStorage.LookupByKey(iGemProto.GetItemLimitCategory()); if (limitEntry != null) { // NOTE: limitEntry.mode is not checked because if item has limit then it is applied in equip case for (int j = 0; j < ItemConst.MaxGemSockets; ++j) { if (gems[j]) { // new gem if (iGemProto.GetItemLimitCategory() == gems[j].GetTemplate().GetItemLimitCategory()) { ++limit_newcount; } } else if (oldGemData[j] != null) { // existing gem ItemTemplate jProto = Global.ObjectMgr.GetItemTemplate(oldGemData[j].ItemId); if (jProto != null) { if (iGemProto.GetItemLimitCategory() == jProto.GetItemLimitCategory()) { ++limit_newcount; } } } } if (limit_newcount > 0 && limit_newcount > _player.GetItemLimitCategoryQuantity(limitEntry)) { GetPlayer().SendEquipError(InventoryResult.ItemUniqueEquippableSocketed, itemTarget); return; } } } // for equipped item check all equipment for duplicate equipped gems if (itemTarget.IsEquipped()) { InventoryResult res = GetPlayer().CanEquipUniqueItem(gems[i], slot, (uint)Math.Max(limit_newcount, 0)); if (res != 0) { GetPlayer().SendEquipError(res, itemTarget); return; } } } bool SocketBonusActivated = itemTarget.GemsFitSockets(); //save state of socketbonus GetPlayer().ToggleMetaGemsActive(slot, false); //turn off all metagems (except for the target item) //if a meta gem is being equipped, all information has to be written to the item before testing if the conditions for the gem are met //remove ALL mods - gem can change item level if (itemTarget.IsEquipped()) { _player._ApplyItemMods(itemTarget, itemTarget.GetSlot(), false); } for (ushort i = 0; i < ItemConst.MaxGemSockets; ++i) { if (gems[i]) { uint gemScalingLevel = _player.GetLevel(); uint fixedLevel = gems[i].GetModifier(ItemModifier.TimewalkerLevel); if (fixedLevel != 0) { gemScalingLevel = fixedLevel; } itemTarget.SetGem(i, gemData[i], gemScalingLevel); if (gemProperties[i] != null && gemProperties[i].EnchantId != 0) { itemTarget.SetEnchantment(EnchantmentSlot.Sock1 + i, gemProperties[i].EnchantId, 0, 0, GetPlayer().GetGUID()); } uint gemCount = 1; GetPlayer().DestroyItemCount(gems[i], ref gemCount, true); } } if (itemTarget.IsEquipped()) { _player._ApplyItemMods(itemTarget, itemTarget.GetSlot(), true); } Item childItem = _player.GetChildItemByGuid(itemTarget.GetChildItem()); if (childItem) { if (childItem.IsEquipped()) { _player._ApplyItemMods(childItem, childItem.GetSlot(), false); } childItem.CopyArtifactDataFromParent(itemTarget); if (childItem.IsEquipped()) { _player._ApplyItemMods(childItem, childItem.GetSlot(), true); } } bool SocketBonusToBeActivated = itemTarget.GemsFitSockets(); //current socketbonus state if (SocketBonusActivated ^ SocketBonusToBeActivated) //if there was a change... { GetPlayer().ApplyEnchantment(itemTarget, EnchantmentSlot.Bonus, false); itemTarget.SetEnchantment(EnchantmentSlot.Bonus, SocketBonusToBeActivated ? itemTarget.GetTemplate().GetSocketBonus() : 0, 0, 0, GetPlayer().GetGUID()); GetPlayer().ApplyEnchantment(itemTarget, EnchantmentSlot.Bonus, true); //it is not displayed, client has an inbuilt system to determine if the bonus is activated } GetPlayer().ToggleMetaGemsActive(slot, true); //turn on all metagems (except for target item) GetPlayer().RemoveTradeableItem(itemTarget); itemTarget.ClearSoulboundTradeable(GetPlayer()); // clear tradeable flag itemTarget.SendUpdateSockets(); }
public Item GetEditedItem() { var item = new Item(); var attr = new ItemAttributes(); item.Name = guiItemName.Text; item.Id = guiItemId.Text; item.Type = new ItemType(guiItemTypeId.Text, false); attr.dexterityItem = GetData(guiDexterity); attr.intelligenceItem = GetData(guiIntelligence); attr.strengthItem = GetData(guiStrength); attr.vitalityItem = GetData(guiVitality); attr.attacksPerSecondPercent = GetDataPercent(guiAttackSpeed); attr.critDamagePercent = GetDataPercent(guiCriticDamage); attr.critPercentBonusCapped = GetDataPercent(guiCriticChance); attr.hitpointsMaxPercentBonusItem = GetDataPercent(guiHitpointsMaxPercent); attr.armorItem = GetData(guiArmor); attr.hitpointsOnHit = GetData(guiHitpointsOnHit); attr.hitpointsRegenPerSecond = GetData(guiHitpointsRegenPerSecond); attr.stealHealthPercent = GetDataPercent(guiLifeSteal); attr.attacksPerSecondItem = GetData(guiWeaponAttackPerSecond); attr.damageWeaponPercentBonus_Physical = GetDataPercent(guiWeaponDamagePercentBonus); var damageWeaponPercentBonus_Physical = (attr.damageWeaponPercentBonus_Physical == null ? 0 : attr.damageWeaponPercentBonus_Physical.Min); attr.damageWeaponMin_Arcane = GetData(guiWeaponDamageMinArcane); attr.damageWeaponMin_Cold = GetData(guiWeaponDamageMinCold); attr.damageWeaponMin_Fire = GetData(guiWeaponDamageMinFire); attr.damageWeaponMin_Holy = GetData(guiWeaponDamageMinHoly); attr.damageWeaponMin_Lightning = GetData(guiWeaponDamageMinLightning); attr.damageWeaponMin_Physical = GetData(guiWeaponDamageMinPhysical) / (1 + damageWeaponPercentBonus_Physical); attr.damageWeaponMin_Poison = GetData(guiWeaponDamageMinPoison); attr.damageWeaponDelta_Arcane = GetData(guiWeaponDamageMaxArcane) - attr.damageWeaponMin_Arcane; attr.damageWeaponDelta_Cold = GetData(guiWeaponDamageMaxCold) - attr.damageWeaponMin_Cold; attr.damageWeaponDelta_Fire = GetData(guiWeaponDamageMaxFire) - attr.damageWeaponMin_Fire; attr.damageWeaponDelta_Holy = GetData(guiWeaponDamageMaxHoly) - attr.damageWeaponMin_Holy; attr.damageWeaponDelta_Lightning = GetData(guiWeaponDamageMaxLightning) - attr.damageWeaponMin_Lightning; attr.damageWeaponDelta_Physical = GetData(guiWeaponDamageMaxPhysical) / (1 + damageWeaponPercentBonus_Physical) - attr.damageWeaponMin_Physical; attr.damageWeaponDelta_Poison = GetData(guiWeaponDamageMaxPoison) - attr.damageWeaponMin_Poison; attr.damageMin_Arcane = GetData(guiBonusDamageMinArcane); attr.damageMin_Cold = GetData(guiBonusDamageMinCold); attr.damageMin_Fire = GetData(guiBonusDamageMinFire); attr.damageMin_Holy = GetData(guiBonusDamageMinHoly); attr.damageMin_Lightning = GetData(guiBonusDamageMinLightning); attr.damageMin_Physical = GetData(guiBonusDamageMinPhysical); attr.damageMin_Poison = GetData(guiBonusDamageMinPoison); attr.damageDelta_Arcane = GetData(guiBonusDamageMaxArcane) - attr.damageMin_Arcane; attr.damageDelta_Cold = GetData(guiBonusDamageMaxCold) - attr.damageMin_Cold; attr.damageDelta_Fire = GetData(guiBonusDamageMaxFire) - attr.damageMin_Fire; attr.damageDelta_Holy = GetData(guiBonusDamageMaxHoly) - attr.damageMin_Holy; attr.damageDelta_Lightning = GetData(guiBonusDamageMaxLightning) - attr.damageMin_Lightning; attr.damageDelta_Physical = GetData(guiBonusDamageMaxPhysical) - attr.damageMin_Physical; attr.damageDelta_Poison = GetData(guiBonusDamageMaxPoison) - attr.damageMin_Poison; attr.damageTypePercentBonus_Arcane = GetDataPercent(guiBonusDamagePercentArcane); attr.damageTypePercentBonus_Cold = GetDataPercent(guiBonusDamagePercentCold); attr.damageTypePercentBonus_Fire = GetDataPercent(guiBonusDamagePercentFire); attr.damageTypePercentBonus_Holy = GetDataPercent(guiBonusDamagePercentHoly); attr.damageTypePercentBonus_Lightning = GetDataPercent(guiBonusDamagePercentLightning); attr.damageTypePercentBonus_Physical = GetDataPercent(guiBonusDamagePercentPhysical); attr.damageTypePercentBonus_Poison = GetDataPercent(guiBonusDamagePercentPoison); attr.resistance_All = GetData(guiResistance_All); attr.resistance_Arcane = GetData(guiResistance_Arcane); attr.resistance_Cold = GetData(guiResistance_Cold); attr.resistance_Fire = GetData(guiResistance_Fire); attr.resistance_Lightning = GetData(guiResistance_Lightning); attr.resistance_Physical = GetData(guiResistance_Physical); attr.resistance_Poison = GetData(guiResistance_Poison); // Shield attr.blockChanceItem = GetData(guiShieldBlockPercent); attr.blockAmountItemMin = GetData(guiShieldBlockMin); attr.blockAmountItemDelta = GetData(guiShieldBlockMax) - attr.blockAmountItemMin; item.AttributesRaw = attr; var gems = new List <SocketedGem>(); if (guiGem1.SelectedIndex > 0) { var gem = new SocketedGem(new Item(((GemsListViewItem)guiGem1.SelectedItem).Item)); gems.Add(gem); } if (guiGem2.SelectedIndex > 0) { var gem = new SocketedGem(new Item(((GemsListViewItem)guiGem2.SelectedItem).Item)); gems.Add(gem); } if (guiGem3.SelectedIndex > 0) { var gem = new SocketedGem(new Item(((GemsListViewItem)guiGem3.SelectedItem).Item)); gems.Add(gem); } item.Gems = gems.ToArray(); return(item); }