コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
                }
            }
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
        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();
        }
コード例 #5
0
        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);
        }