/// <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); }
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); }
/// <summary> /// Strike using given weapon /// </summary> public void Strike(IAsda2Weapon weapon) { var action = GetUnusedAction(); var target = m_target; Strike(weapon, action, target); }
internal void Reset(Unit attacker, Unit target, IAsda2Weapon weapon) { Attacker = attacker; Victim = target; Weapon = weapon; ProcHitFlags = ProcHitFlags.None; }
internal void Reset(Unit attacker, Unit target, IAsda2Weapon weapon) { this.Attacker = attacker; this.Victim = target; this.Weapon = weapon; this.ProcHitFlags = ProcHitFlags.None; }
public void SetWeapon(InventorySlotType slot, IAsda2Weapon weapon) { switch (slot) { case InventorySlotType.WeaponMainHand: MainWeapon = weapon; break; } }
/// <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); } }
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); }
/// <summary> /// Strike the target using given weapon /// </summary> public void Strike(IAsda2Weapon weapon, Unit target) { Strike(weapon, GetUnusedAction(), target); }
public void GainWeaponSkill(int targetLevel, IAsda2Weapon weapon) { }
public float GetAttackRange(IAsda2Weapon weapon, Unit target) { return(weapon.MaxRange + CombatReach + target.CombatReach); }
public float GetMinAttackRange(IAsda2Weapon weapon, Unit target) { return(weapon.MinRange); }
/// <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; } }
/// <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); }
/// <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)); }
/// <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); }
/// <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); }