Example #1
0
        void Update(Unit caster)
        {
            ObjectTarget = ObjectTargetGUID != 0 ? ((ObjectTargetGUID == caster.GetGUIDLow()) ? caster : ObjMgr.GetObject <WorldObject>(caster, ObjectTargetGUID)) : null;

            ItemTarget = null;
            if (caster is Player)
            {
                Player player = caster.ToPlayer();
                if (Convert.ToBoolean(TargetMask & SpellCastTargetFlags.Item))
                {
                    ItemTarget = player.GetItemByGuid(ItemTargetGUID);
                }
                else if (Convert.ToBoolean(TargetMask & SpellCastTargetFlags.TradeItem))
                {
                    //if (ItemTargetGUID == (uint)TradeSlots.NONTRADED) // here it is not guid but slot. Also prevents hacking slots
                    //if (TradeData* pTrade = player->GetTradeData())
                    //ItemTarget = pTrade->GetTraderData()->GetItem(TradeSlots.NONTRADED);
                }

                if (ItemTarget != null)
                {
                    ItemTargetEntry = ItemTarget.GetEntry();
                }
            }

            // update positions by transport move
            if (HasSrc() && Src.TransportGUID != 0)
            {
                WorldObject transport = ObjMgr.GetObject <WorldObject>(caster, Src.TransportGUID);
                if (transport != null)
                {
                    Src.Position.Relocate(transport.Position);
                    Src.Position.RelocateOffset(Src.TransportOffset);
                }
            }

            if (HasDst() && Dst.TransportGUID != 0)
            {
                WorldObject transport = ObjMgr.GetObject <WorldObject>(caster, Dst.TransportGUID);
                if (transport != null)
                {
                    Dst.Position.Relocate(transport.Position);
                    Dst.Position.RelocateOffset(Dst.TransportOffset);
                }
            }
        }
Example #2
0
        public Spell(Unit caster, SpellInfo info, TriggerCastFlags triggerFlags, ulong originalCasterGUID = 0, bool skipCheck = false)
        {
            m_spellInfo  = SpellMgr.GetSpellForDifficultyFromSpell(info, caster);
            m_caster     = Convert.ToBoolean(info.AttributesEx6 & SpellAttr6.CastByCharmer) ? null : caster;//&& caster->GetCharmerOrOwner()) ? caster->GetCharmerOrOwner() : caster
            m_spellValue = new SpellValue(m_spellInfo);

            m_customError   = SpellCustomErrors.None;
            m_skipCheck     = skipCheck;
            m_selfContainer = null;
            m_referencedFromCurrentSpell = false;
            m_executedCurrently          = false;
            m_needComboPoints            = m_spellInfo.NeedsComboPoints();
            m_comboPointGain             = 0;
            m_delayStart         = 0;
            m_delayAtDamageCount = 0;

            m_applyMultiplierMask = 0;
            m_auraScaleMask       = 0;

            // Get data for type of attack
            switch (m_spellInfo.DmgClass)
            {
            case SpellDmgClass.Melee:
                if (Convert.ToBoolean(m_spellInfo.AttributesEx3 & SpellAttr3.ReqOffhand))
                {
                    m_attackType = WeaponAttackType.OffAttack;
                }
                else
                {
                    m_attackType = WeaponAttackType.BaseAttack;
                }
                break;

            case SpellDmgClass.Ranged:
                m_attackType = m_spellInfo.IsRangedWeaponSpell() ? WeaponAttackType.RangedAttack : WeaponAttackType.BaseAttack;
                break;

            default:
                // Wands
                if (Convert.ToBoolean(m_spellInfo.AttributesEx2 & SpellAttr2.AutorepeatFlag))
                {
                    m_attackType = WeaponAttackType.RangedAttack;
                }
                else
                {
                    m_attackType = WeaponAttackType.BaseAttack;
                }
                break;
            }

            m_spellSchoolMask = info.GetSchoolMask();           // Can be override for some spell (wand shoot for example)

            if (m_attackType == WeaponAttackType.RangedAttack)
            {
                if ((m_caster.getClassMask() & SharedConst.ClassMaskWandUsers) != 0 && m_caster.GetTypeId() == ObjectType.Player)
                {
                    Item pItem = m_caster.ToPlayer().GetWeaponForAttack(WeaponAttackType.RangedAttack);
                    //if (pItem != null)
                    //m_spellSchoolMask = (SpellSchoolMask)(1 << (int)pItem.ItemInfo.ItemSparse.DamageType);
                }
            }

            if (originalCasterGUID != 0)
            {
                m_originalCasterGUID = originalCasterGUID;
            }
            else
            {
                m_originalCasterGUID = m_caster.GetGUID();
            }

            if (m_originalCasterGUID == m_caster.GetGUID())
            {
                m_originalCaster = m_caster;
            }
            else
            {
                m_originalCaster = ObjMgr.GetObject <Unit>(m_caster, m_originalCasterGUID);
                if (m_originalCaster != null && !m_originalCaster.IsInWorld)
                {
                    m_originalCaster = null;
                }
            }

            m_spellState        = SpellState.None;
            _triggeredCastFlags = triggerFlags;
            if (Convert.ToBoolean(info.AttributesEx4 & SpellAttr4.Triggered))
            {
                _triggeredCastFlags = TriggerCastFlags.FullMask;
            }

            m_CastItem     = null;
            m_castItemGUID = 0;

            unitTarget     = null;
            itemTarget     = null;
            gameObjTarget  = null;
            focusObject    = null;
            m_cast_count   = 0;
            m_glyphIndex   = 0;
            m_preCastSpell = 0;
            //m_triggeredByAuraSpell  = null;
            //m_spellAura = null;

            //Auto Shot & Shoot (wand)
            m_autoRepeat = m_spellInfo.IsAutoRepeatRangedSpell();

            m_runesState = 0;
            m_powerCost  = 0;                                       // setup to correct value in Spell::prepare, must not be used before.
            m_casttime   = 0;                                       // setup to correct value in Spell::prepare, must not be used before.
            m_timer      = 0;                                       // will set to castime in prepare

            //m_channelTargetEffectMask = 0;

            // Determine if spell can be reflected back to the caster
            // Patch 1.2 notes: Spell Reflection no longer reflects abilities
            m_canReflect = m_spellInfo.DmgClass == SpellDmgClass.Magic && !Convert.ToBoolean(m_spellInfo.Attributes & SpellAttr0.Ability) &&
                           !Convert.ToBoolean(m_spellInfo.AttributesEx & SpellAttr1.CantBeReflected) && !Convert.ToBoolean(m_spellInfo.Attributes & SpellAttr0.UnaffectedByInvulnerability) &&
                           !m_spellInfo.IsPassive() && !m_spellInfo.IsPositive();

            CleanupTargetList();

            for (var i = 0; i < SharedConst.MaxSpellEffects; ++i)
            {
                m_destTargets[i] = new SpellDestination(m_caster);
            }
        }