Ejemplo n.º 1
0
        /// <summary>
        /// Re-calculates the mainhand melee damage of this Unit
        /// References:
        /// http://www.wowwiki.com/Attack_power
        /// </summary>
        internal static void UpdateMainDamage(this Unit unit)
        {
            float        num1       = 0.0f;
            float        num2       = 0.0f;
            float        num3       = 0.0f;
            float        num4       = 0.0f;
            IAsda2Weapon mainWeapon = unit.MainWeapon;

            foreach (DamageInfo damage in mainWeapon.Damages)
            {
                if (damage.School == DamageSchoolMask.Magical)
                {
                    num3 += UnitUpdates.CalcMagicDamage(unit, damage.Minimum);
                    num4 += UnitUpdates.CalcMagicDamage(unit, damage.Maximum);
                }
                else
                {
                    num1 += UnitUpdates.GetModifiedDamage(unit, damage.Minimum);
                    num2 += UnitUpdates.GetModifiedDamage(unit, damage.Maximum);
                }
            }

            unit.MinDamage      = num1 + (float)mainWeapon.BonusDamage;
            unit.MaxDamage      = num2 + (float)mainWeapon.BonusDamage;
            unit.MinMagicDamage = (int)num3;
            unit.MaxMagicDamage = (int)num4;
            Character character = unit as Character;

            if (character == null)
            {
                return;
            }
            Asda2CharacterHandler.SendUpdateStatsResponse(character.Client);
        }
Ejemplo n.º 2
0
        public float GetBaseCritChance(DamageSchool dmgSchool, Spell spell, IAsda2Weapon weapon)
        {
            var character = this as Character;

            if (character != null)
            {
                var chr = character;
                return(chr.CritChanceMeleePct);
            }
            var npc = this as NPC;

            if (npc != null)
            {
                switch (npc.Entry.Rank)
                {
                case CreatureRank.Normal:
                    return(200);

                case CreatureRank.Elite:
                    return(1000);

                case CreatureRank.Boss:
                    return(1500);

                case CreatureRank.WorldBoss:
                    return(2000);
                }
            }
            return(100);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Strike using given weapon
        /// </summary>
        public void Strike(IAsda2Weapon weapon)
        {
            var action = GetUnusedAction();
            var target = m_target;

            Strike(weapon, action, target);
        }
Ejemplo n.º 4
0
 internal void Reset(Unit attacker, Unit target, IAsda2Weapon weapon)
 {
     Attacker     = attacker;
     Victim       = target;
     Weapon       = weapon;
     ProcHitFlags = ProcHitFlags.None;
 }
Ejemplo n.º 5
0
 internal void Reset(Unit attacker, Unit target, IAsda2Weapon weapon)
 {
     this.Attacker     = attacker;
     this.Victim       = target;
     this.Weapon       = weapon;
     this.ProcHitFlags = ProcHitFlags.None;
 }
Ejemplo n.º 6
0
 public void SetWeapon(InventorySlotType slot, IAsda2Weapon weapon)
 {
     switch (slot)
     {
     case InventorySlotType.WeaponMainHand:
         MainWeapon = weapon;
         break;
     }
 }
Ejemplo n.º 7
0
 /// <summary>
 /// Do a single attack using the given weapon and action on the target
 /// </summary>
 public void Strike(IAsda2Weapon weapon, DamageAction action, Unit target)
 {
     IsInCombat = true;
     if (UsesPendingAbility(weapon))
     {
         m_spellCast.Perform();
     }
     else
     {
         Strike(weapon, action, target, null);
     }
 }
Ejemplo n.º 8
0
        public bool IsInAttackRangeSq(IAsda2Weapon weapon, Unit target, float distSq)
        {
            var max = GetAttackRange(weapon, target);

            if (UsesPendingAbility(weapon))
            {
                max = GetSpellMaxRange(m_spellCast.Spell, max);
            }

            if (distSq <= max * max)
            {
                if (weapon.IsRanged)
                {
                    var min = GetMinAttackRange(weapon, target);
                    if (distSq < min * min)
                    {
                        return(false);
                    }
                }
                return(true);
            }
            return(false);
        }
Ejemplo n.º 9
0
 /// <summary>
 /// Strike the target using given weapon
 /// </summary>
 public void Strike(IAsda2Weapon weapon, Unit target)
 {
     Strike(weapon, GetUnusedAction(), target);
 }
Ejemplo n.º 10
0
 public void GainWeaponSkill(int targetLevel, IAsda2Weapon weapon)
 {
 }
Ejemplo n.º 11
0
 public float GetAttackRange(IAsda2Weapon weapon, Unit target)
 {
     return(weapon.MaxRange + CombatReach + target.CombatReach);
 }
Ejemplo n.º 12
0
 public float GetMinAttackRange(IAsda2Weapon weapon, Unit target)
 {
     return(weapon.MinRange);
 }
Ejemplo n.º 13
0
        /// <summary>
        /// Returns random damage for the given weapon
        /// </summary>
        public void GetWeaponDamage(DamageAction action, IAsda2Weapon weapon, SpellCast usedAbility, int targetNo = 0)
        {
            int damage;

            if (weapon == m_offhandWeapon)
            {
                damage = Utility.Random((int)MinOffHandDamage, (int)MaxOffHandDamage + 1);
            }
            else
            {
                /*if (weapon.IsRanged)
                 * {
                 *  damage = Utility.Random((int)MinRangedDamage, (int)MaxRangedDamage + 1);
                 * }
                 * else
                 * {*/
                damage = Utility.Random((int)MinDamage, (int)MaxDamage);
                //}
            }

            if (this is NPC)
            {
                damage = (int)(damage * NPCMgr.DefaultNPCDamageFactor + 0.999999f);
            }

            if (usedAbility != null && usedAbility.IsCasting)
            {
                // get damage modifiers from spell
                var multiplier = 0;

                foreach (var effectHandler in usedAbility.Handlers)
                {
                    if (effectHandler.Effect.IsStrikeEffectFlat)
                    {
                        damage += effectHandler.CalcDamageValue(targetNo);
                    }
                    else if (effectHandler.Effect.IsStrikeEffectPct)
                    {
                        multiplier += effectHandler.CalcDamageValue(targetNo);
                    }
                }
                if (multiplier > 0)
                {
                    action.Damage = (damage * multiplier + 50) / 100;
                }
                else
                {
                    action.Damage = damage;
                }

                foreach (var effectHandler in usedAbility.Handlers)
                {
                    if (effectHandler is WeaponDamageEffectHandler)
                    {
                        ((WeaponDamageEffectHandler)effectHandler).OnHit(action);
                    }
                }
            }
            else
            {
                action.Damage = damage;
            }
        }
Ejemplo n.º 14
0
        /// <summary>
        /// Do a single attack on the target using given weapon, ability and action.
        /// </summary>
        public ProcHitFlags Strike(IAsda2Weapon weapon, DamageAction action, Unit target, SpellCast ability)
        {
            ProcHitFlags procHitFlags = ProcHitFlags.None;

            EnsureContext();
            if (!IsAlive)
            {
                return(procHitFlags);
            }

            if (!target.IsInContext || !target.IsAlive)
            {
                return(procHitFlags);
            }

            if (weapon == null)
            {
                log.Info("Trying to strike without weapon: " + this);
                return(procHitFlags);
            }

            //if (IsMovementControlled)
            //{
            //    // stop running when landing a hit
            //    m_Movement.Stop();
            //}

            target.IsInCombat = true;

            action.Victim   = target;
            action.Attacker = this;
            action.Weapon   = weapon;

            if (ability != null)
            {
                action.Schools     = ability.Spell.SchoolMask;
                action.SpellEffect = ability.Spell.Effects[0];

                // calc damage
                GetWeaponDamage(action, weapon, ability);
                procHitFlags = action.DoAttack();
                if (ability.Spell.AttributesExC.HasFlag(SpellAttributesExC.RequiresTwoWeapons) && m_offhandWeapon != null)
                {
                    // also strike with offhand
                    action.Reset(this, target, m_offhandWeapon);
                    GetWeaponDamage(action, m_offhandWeapon, ability);
                    procHitFlags       |= action.DoAttack();
                    m_lastOffhandStrike = Environment.TickCount;
                }
            }
            else
            {
                // no combat ability
                m_extraAttacks += 1;
                do
                {
                    // calc damage
                    GetWeaponDamage(action, weapon, null);

                    action.Schools = weapon.Damages.AllSchools();
                    if (action.Schools == DamageSchoolMask.None)
                    {
                        action.Schools = DamageSchoolMask.Physical;
                    }

                    // normal attack
                    action.DoAttack();
                } while (--m_extraAttacks > 0);
            }
            action.OnFinished();
            return(procHitFlags);
        }
Ejemplo n.º 15
0
 /// <summary>
 /// Do a single attack on the target using given weapon and ability.
 /// </summary>
 public ProcHitFlags Strike(IAsda2Weapon weapon, Unit target, SpellCast ability)
 {
     return(Strike(weapon, GetUnusedAction(), target, ability));
 }
Ejemplo n.º 16
0
        /// <summary>
        /// Melee has no Min range
        /// </summary>
        public bool IsInMeleeAttackRangeSq(IAsda2Weapon weapon, Unit target, float distSq)
        {
            var max = GetAttackRange(weapon, target);

            return(distSq <= max * max);
        }
Ejemplo n.º 17
0
 /// <summary>
 /// Whether this unit has an ability pending for the given weapon (Heroic Strike for melee, Poison Dart for throwing, Stun Shot for ranged weapons etc)
 /// </summary>
 public bool UsesPendingAbility(IAsda2Weapon weapon)
 {
     return(m_spellCast != null && m_spellCast.IsPending && m_spellCast.GetWeapon() == weapon);
 }