コード例 #1
0
ファイル: Item.cs プロジェクト: 0xFh/Asda2-Project
        /// <summary>
        /// Called when this Item gets unequipped.
        /// Requires map context.
        /// </summary>
        public void OnUnEquip(InventorySlot slot)
        {
            if (!IsApplied)
            {
                return;
            }
            IsApplied = false;
            if (!m_template.IsAmmo)
            {
                m_owner.SetVisibleItem(slot, null);
            }
            m_template.RemoveStatMods(m_owner);
            if (m_template.EquipSpells != null)
            {
                foreach (Spell equipSpell in m_template.EquipSpells)
                {
                    if (equipSpell.IsAura)
                    {
                        m_owner.Auras.Remove(equipSpell);
                    }
                }
            }

            for (int index = 0; index < m_template.Resistances.Length; ++index)
            {
                int resistance = m_template.Resistances[index];
                if (resistance > 0)
                {
                    m_owner.ModBaseResistance((DamageSchool)index, -resistance);
                }
            }

            if (slot == InventorySlot.Invalid)
            {
                m_owner.UpdateRangedDamage();
            }
            else if (m_template.InventorySlotType == InventorySlotType.Shield)
            {
                m_owner.UpdateBlockChance();
            }
            if (m_template.Set != null)
            {
                Spell[] spellArray =
                    m_template.Set.Boni.Get(m_owner.Inventory.GetSetCount(m_template.Set) - 1U);
                if (spellArray != null)
                {
                    foreach (Spell index in spellArray)
                    {
                        Aura aura = m_owner.Auras[index, true];
                        if (aura != null)
                        {
                            aura.Remove(false);
                        }
                    }
                }
            }

            if (m_hitProc != null)
            {
                m_owner.RemoveProcHandler(m_hitProc);
                m_hitProc = null;
            }

            m_owner.PlayerAuras.OnBeforeUnEquip(this);
            if (m_owner.Inventory.m_ItemEquipmentEventHandlers != null)
            {
                foreach (IItemEquipmentEventHandler equipmentEventHandler in m_owner.Inventory
                         .m_ItemEquipmentEventHandlers)
                {
                    equipmentEventHandler.OnBeforeUnEquip(this);
                }
            }

            m_template.NotifyUnequip(this);
        }
コード例 #2
0
ファイル: Item.cs プロジェクト: NecroSharper/WCell
        /// <summary>
        /// Called when this Item gets unequipped.
        /// Requires map context.
        /// </summary>
        public void OnUnEquip(InventorySlot slot)
        {
            if (!IsApplied)
            {
                return;
            }
            IsApplied = false;

            if (!m_template.IsAmmo)
            {
                m_owner.SetVisibleItem(slot, null);
            }
            m_template.RemoveStatMods(m_owner);

            // remove triggered buffs
            if (m_template.EquipSpells != null)
            {
                foreach (var spell in m_template.EquipSpells)
                {
                    if (spell.IsAura)
                    {
                        m_owner.Auras.Remove(spell);
                    }
                }
            }

            // remove procs
            if (m_template.HitSpells != null)
            {
                foreach (var spell in m_template.HitSpells)
                {
                    m_owner.RemoveProcHandler(spell.SpellId);
                }
            }

            // resistances
            for (var i = 0; i < m_template.Resistances.Length; i++)
            {
                var res = m_template.Resistances[i];
                if (res > 0)
                {
                    m_owner.ModBaseResistance((DamageSchool)i, -res);
                }
            }

            // ammo
            if (slot == InventorySlot.Invalid)
            {
                // ammo
                m_owner.UpdateRangedDamage();
            }

            // block rating
            else if (m_template.InventorySlotType == InventorySlotType.Shield)
            {
                m_owner.UpdateBlockChance();
            }

            // set boni
            if (m_template.Set != null)
            {
                var setCount = m_owner.Inventory.GetSetCount(m_template.Set);
                var boni     = m_template.Set.Boni.Get(setCount - 1);
                if (boni != null)
                {
                    foreach (var bonus in boni)
                    {
                        var aura = m_owner.Auras[bonus, true];
                        if (aura != null)
                        {
                            aura.Remove(false);
                        }
                    }
                }
            }

            // enchants
            if (m_enchantments != null)
            {
                foreach (var enchant in m_enchantments)
                {
                    if (enchant != null)
                    {
                        SetEnchantUnequipped(enchant);
                    }
                }
            }

            // hit proc
            if (m_hitProc != null)
            {
                m_owner.RemoveProcHandler(m_hitProc);
                m_hitProc = null;
            }

            m_owner.PlayerAuras.OnBeforeUnEquip(this);
            if (m_owner.Inventory.m_ItemEquipmentEventHandlers != null)
            {
                foreach (var handler in m_owner.Inventory.m_ItemEquipmentEventHandlers)
                {
                    handler.OnBeforeUnEquip(this);
                }
            }

            m_template.NotifyUnequip(this);
        }