public override void UpdateArmor() { float baseValue = 0.0f; float value = 0.0f; float bonus_armor = 0.0f; UnitMods unitMod = UnitMods.Armor; // hunter pets gain 35% of owner's armor value, warlock pets gain 100% of owner's armor if (IsHunterPet()) { bonus_armor = MathFunctions.CalculatePct(GetOwner().GetArmor(), 70); } else if (IsPet()) { bonus_armor = GetOwner().GetArmor(); } value = GetModifierValue(unitMod, UnitModifierType.BaseValue); baseValue = value; value *= GetModifierValue(unitMod, UnitModifierType.BasePCT); value += GetModifierValue(unitMod, UnitModifierType.TotalValue) + bonus_armor; value *= GetModifierValue(unitMod, UnitModifierType.TotalPCT); SetArmor((int)baseValue, (int)(value - baseValue)); }
public override void UpdateMaxPower(PowerType power) { UnitMods unitMod = UnitMods.PowerStart + (int)power; float addValue = (power == PowerType.Mana) ? GetStat(Stats.Intellect) - GetCreateStat(Stats.Intellect) : 0.0f; float multiplicator = 15.0f; switch (GetEntry()) { case ENTRY_IMP: multiplicator = 4.95f; break; case ENTRY_VOIDWALKER: case ENTRY_SUCCUBUS: case ENTRY_FELHUNTER: case ENTRY_FELGUARD: multiplicator = 11.5f; break; default: multiplicator = 15.0f; break; } float value = GetModifierValue(unitMod, UnitModifierType.BaseValue) + GetCreatePowers(power); value *= GetModifierValue(unitMod, UnitModifierType.BasePCT); value += GetModifierValue(unitMod, UnitModifierType.TotalValue) + addValue * multiplicator; value *= GetModifierValue(unitMod, UnitModifierType.TotalPCT); SetMaxPower(power, (int)value); }
public override void UpdateDamagePhysical(WeaponAttackType attType) { if (attType > WeaponAttackType.BaseAttack) { return; } float bonusDamage = 0.0f; Player playerOwner = m_owner.ToPlayer(); if (playerOwner != null) { //force of nature if (GetEntry() == ENTRY_TREANT) { int spellDmg = playerOwner.m_activePlayerData.ModDamageDonePos[(int)SpellSchools.Nature] - playerOwner.m_activePlayerData.ModDamageDoneNeg[(int)SpellSchools.Nature]; if (spellDmg > 0) { bonusDamage = spellDmg * 0.09f; } } //greater fire elemental else if (GetEntry() == ENTRY_FIRE_ELEMENTAL) { int spellDmg = playerOwner.m_activePlayerData.ModDamageDonePos[(int)SpellSchools.Fire] - playerOwner.m_activePlayerData.ModDamageDoneNeg[(int)SpellSchools.Fire]; if (spellDmg > 0) { bonusDamage = spellDmg * 0.4f; } } } UnitMods unitMod = UnitMods.DamageMainHand; float att_speed = GetBaseAttackTime(WeaponAttackType.BaseAttack) / 1000.0f; float base_value = GetFlatModifierValue(unitMod, UnitModifierFlatType.Base) + GetTotalAttackPowerValue(attType, false) / 3.5f * att_speed + bonusDamage; float base_pct = GetPctModifierValue(unitMod, UnitModifierPctType.Base); float total_value = GetFlatModifierValue(unitMod, UnitModifierFlatType.Total); float total_pct = GetPctModifierValue(unitMod, UnitModifierPctType.Total); float weapon_mindamage = GetWeaponDamageRange(WeaponAttackType.BaseAttack, WeaponDamageRange.MinDamage); float weapon_maxdamage = GetWeaponDamageRange(WeaponAttackType.BaseAttack, WeaponDamageRange.MaxDamage); float mindamage = ((base_value + weapon_mindamage) * base_pct + total_value) * total_pct; float maxdamage = ((base_value + weapon_maxdamage) * base_pct + total_value) * total_pct; SetUpdateFieldStatValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MinDamage), mindamage); SetUpdateFieldStatValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MaxDamage), maxdamage); }
public override void UpdateDamagePhysical(WeaponAttackType attType) { if (attType > WeaponAttackType.BaseAttack) { return; } float bonusDamage = 0.0f; if (GetOwner().IsTypeId(TypeId.Player)) { //force of nature if (GetEntry() == ENTRY_TREANT) { int spellDmg = GetOwner().GetInt32Value(PlayerFields.ModDamageDonePos + (int)SpellSchools.Nature) - GetOwner().GetInt32Value(PlayerFields.ModDamageDoneNeg + (int)SpellSchools.Nature); if (spellDmg > 0) { bonusDamage = spellDmg * 0.09f; } } //greater fire elemental else if (GetEntry() == ENTRY_FIRE_ELEMENTAL) { int spellDmg = GetOwner().GetInt32Value(PlayerFields.ModDamageDonePos + (int)SpellSchools.Fire) - GetOwner().GetInt32Value(PlayerFields.ModDamageDoneNeg + (int)SpellSchools.Fire); if (spellDmg > 0) { bonusDamage = spellDmg * 0.4f; } } } UnitMods unitMod = UnitMods.DamageMainHand; float att_speed = GetBaseAttackTime(WeaponAttackType.BaseAttack) / 1000.0f; float base_value = GetModifierValue(unitMod, UnitModifierType.BaseValue) + GetTotalAttackPowerValue(attType) / 3.5f * att_speed + bonusDamage; float base_pct = GetModifierValue(unitMod, UnitModifierType.BasePCT); float total_value = GetModifierValue(unitMod, UnitModifierType.TotalValue); float total_pct = GetModifierValue(unitMod, UnitModifierType.TotalPCT); float weapon_mindamage = GetWeaponDamageRange(WeaponAttackType.BaseAttack, WeaponDamageRange.MinDamage); float weapon_maxdamage = GetWeaponDamageRange(WeaponAttackType.BaseAttack, WeaponDamageRange.MaxDamage); float mindamage = ((base_value + weapon_mindamage) * base_pct + total_value) * total_pct; float maxdamage = ((base_value + weapon_maxdamage) * base_pct + total_value) * total_pct; SetStatFloatValue(UnitFields.MinDamage, mindamage); SetStatFloatValue(UnitFields.MaxDamage, maxdamage); }
public override void UpdateMaxHealth() { UnitMods unitMod = UnitMods.Health; float stamina = GetStat(Stats.Stamina) - GetCreateStat(Stats.Stamina); float multiplicator; switch (GetEntry()) { case ENTRY_IMP: multiplicator = 8.4f; break; case ENTRY_VOIDWALKER: multiplicator = 11.0f; break; case ENTRY_SUCCUBUS: multiplicator = 9.1f; break; case ENTRY_FELHUNTER: multiplicator = 9.5f; break; case ENTRY_FELGUARD: multiplicator = 11.0f; break; case ENTRY_BLOODWORM: multiplicator = 1.0f; break; default: multiplicator = 10.0f; break; } float value = GetFlatModifierValue(unitMod, UnitModifierFlatType.Base) + GetCreateHealth(); value *= GetPctModifierValue(unitMod, UnitModifierPctType.Base); value += GetFlatModifierValue(unitMod, UnitModifierFlatType.Total) + stamina * multiplicator; value *= GetPctModifierValue(unitMod, UnitModifierPctType.Total); SetMaxHealth((uint)value); }
public override void UpdateMaxPower(PowerType power) { if (GetPowerIndex(power) == (uint)PowerType.Max) { return; } UnitMods unitMod = UnitMods.PowerStart + (int)power; float value = GetFlatModifierValue(unitMod, UnitModifierFlatType.Base) + GetCreatePowers(power); value *= GetPctModifierValue(unitMod, UnitModifierPctType.Base); value += GetFlatModifierValue(unitMod, UnitModifierFlatType.Total); value *= GetPctModifierValue(unitMod, UnitModifierPctType.Total); SetMaxPower(power, (int)value); }
public override void UpdateAttackPowerAndDamage(bool ranged = false) { if (ranged) { return; } float val = 0.0f; float bonusAP = 0.0f; UnitMods unitMod = UnitMods.AttackPower; if (GetEntry() == ENTRY_IMP) // imp's attack power { val = GetStat(Stats.Strength) - 10.0f; } else { val = 2 * GetStat(Stats.Strength) - 20.0f; } Player owner = GetOwner() ? GetOwner().ToPlayer() : null; if (owner != null) { if (IsHunterPet()) //hunter pets benefit from owner's attack power { float mod = 1.0f; //Hunter contribution modifier bonusAP = owner.GetTotalAttackPowerValue(WeaponAttackType.RangedAttack) * 0.22f * mod; SetBonusDamage((int)(owner.GetTotalAttackPowerValue(WeaponAttackType.RangedAttack) * 0.1287f * mod)); } else if (IsPetGhoul()) //ghouls benefit from deathknight's attack power (may be summon pet or not) { bonusAP = owner.GetTotalAttackPowerValue(WeaponAttackType.BaseAttack) * 0.22f; SetBonusDamage((int)(owner.GetTotalAttackPowerValue(WeaponAttackType.BaseAttack) * 0.1287f)); } else if (IsSpiritWolf()) //wolf benefit from shaman's attack power { float dmg_multiplier = 0.31f; bonusAP = owner.GetTotalAttackPowerValue(WeaponAttackType.BaseAttack) * dmg_multiplier; SetBonusDamage((int)(owner.GetTotalAttackPowerValue(WeaponAttackType.BaseAttack) * dmg_multiplier)); } //demons benefit from warlocks shadow or fire damage else if (IsPet()) { int fire = owner.m_activePlayerData.ModDamageDonePos[(int)SpellSchools.Fire] - owner.m_activePlayerData.ModDamageDoneNeg[(int)SpellSchools.Fire]; int shadow = owner.m_activePlayerData.ModDamageDonePos[(int)SpellSchools.Shadow] - owner.m_activePlayerData.ModDamageDoneNeg[(int)SpellSchools.Shadow]; int maximum = (fire > shadow) ? fire : shadow; if (maximum < 0) { maximum = 0; } SetBonusDamage((int)(maximum * 0.15f)); bonusAP = maximum * 0.57f; } //water elementals benefit from mage's frost damage else if (GetEntry() == ENTRY_WATER_ELEMENTAL) { int frost = owner.m_activePlayerData.ModDamageDonePos[(int)SpellSchools.Frost] - owner.m_activePlayerData.ModDamageDoneNeg[(int)SpellSchools.Frost]; if (frost < 0) { frost = 0; } SetBonusDamage((int)(frost * 0.4f)); } } SetStatFlatModifier(UnitMods.AttackPower, UnitModifierFlatType.Base, val + bonusAP); //in BASE_VALUE of UNIT_MOD_ATTACK_POWER for creatures we store data of meleeattackpower field in DB float base_attPower = GetFlatModifierValue(unitMod, UnitModifierFlatType.Base) * GetPctModifierValue(unitMod, UnitModifierPctType.Base); float attPowerMultiplier = GetPctModifierValue(unitMod, UnitModifierPctType.Total) - 1.0f; SetAttackPower((int)base_attPower); SetAttackPowerMultiplier(attPowerMultiplier); //automatically update weapon damage after attack power modification UpdateDamagePhysical(WeaponAttackType.BaseAttack); }
public override void UpdateAttackPowerAndDamage(bool ranged = false) { if (ranged) { return; } float val = 0.0f; float bonusAP = 0.0f; UnitMods unitMod = UnitMods.AttackPower; if (GetEntry() == ENTRY_IMP) // imp's attack power { val = GetStat(Stats.Strength) - 10.0f; } else { val = 2 * GetStat(Stats.Strength) - 20.0f; } Unit owner = GetOwner(); if (owner != null && owner.IsTypeId(TypeId.Player)) { if (IsHunterPet()) //hunter pets benefit from owner's attack power { float mod = 1.0f; //Hunter contribution modifier bonusAP = owner.GetTotalAttackPowerValue(WeaponAttackType.RangedAttack) * 0.22f * mod; SetBonusDamage((int)(owner.GetTotalAttackPowerValue(WeaponAttackType.RangedAttack) * 0.1287f * mod)); } else if (IsPetGhoul()) //ghouls benefit from deathknight's attack power (may be summon pet or not) { bonusAP = owner.GetTotalAttackPowerValue(WeaponAttackType.BaseAttack) * 0.22f; SetBonusDamage((int)(owner.GetTotalAttackPowerValue(WeaponAttackType.BaseAttack) * 0.1287f)); } else if (IsSpiritWolf()) //wolf benefit from shaman's attack power { float dmg_multiplier = 0.31f; if (GetOwner().GetAuraEffect(63271, 0) != null) // Glyph of Feral Spirit { dmg_multiplier = 0.61f; } bonusAP = owner.GetTotalAttackPowerValue(WeaponAttackType.BaseAttack) * dmg_multiplier; SetBonusDamage((int)(owner.GetTotalAttackPowerValue(WeaponAttackType.BaseAttack) * dmg_multiplier)); } //demons benefit from warlocks shadow or fire damage else if (IsPet()) { int fire = (int)((owner.GetUInt32Value(PlayerFields.ModDamageDonePos + (int)SpellSchools.Fire)) + owner.GetUInt32Value(PlayerFields.ModDamageDoneNeg + (int)SpellSchools.Fire)); int shadow = (int)((owner.GetUInt32Value(PlayerFields.ModDamageDonePos + (int)SpellSchools.Shadow)) + owner.GetUInt32Value(PlayerFields.ModDamageDoneNeg + (int)SpellSchools.Shadow)); int maximum = (fire > shadow) ? fire : shadow; if (maximum < 0) { maximum = 0; } SetBonusDamage((int)(maximum * 0.15f)); bonusAP = maximum * 0.57f; } //water elementals benefit from mage's frost damage else if (GetEntry() == ENTRY_WATER_ELEMENTAL) { int frost = (int)((owner.GetUInt32Value(PlayerFields.ModDamageDonePos + (int)SpellSchools.Frost)) + owner.GetUInt32Value(PlayerFields.ModDamageDoneNeg + (int)SpellSchools.Frost)); if (frost < 0) { frost = 0; } SetBonusDamage((int)(frost * 0.4f)); } } SetModifierValue(UnitMods.AttackPower, UnitModifierType.BaseValue, val + bonusAP); //in BASE_VALUE of UNIT_MOD_ATTACK_POWER for creatures we store data of meleeattackpower field in DB float base_attPower = GetModifierValue(unitMod, UnitModifierType.BaseValue) * GetModifierValue(unitMod, UnitModifierType.BasePCT); float attPowerMultiplier = GetModifierValue(unitMod, UnitModifierType.TotalPCT) - 1.0f; //UNIT_FIELD_(RANGED)_ATTACK_POWER field SetInt32Value(UnitFields.AttackPower, (int)base_attPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field SetFloatValue(UnitFields.AttackPowerMultiplier, attPowerMultiplier); //automatically update weapon damage after attack power modification UpdateDamagePhysical(WeaponAttackType.BaseAttack); }
public override void UpdateDamagePhysical(WeaponAttackType attType) { if (attType > WeaponAttackType.BaseAttack) { return; } float bonusDamage = 0.0f; if (GetOwner().IsTypeId(TypeId.Player)) { //force of nature if (GetEntry() == ENTRY_TREANT) { int spellDmg = (int)((GetOwner().GetUInt32Value(PlayerFields.ModDamageDonePos + (int)SpellSchools.Nature)) + GetOwner().GetUInt32Value(PlayerFields.ModDamageDoneNeg + (int)SpellSchools.Nature)); if (spellDmg > 0) { bonusDamage = spellDmg * 0.09f; } } //greater fire elemental else if (GetEntry() == ENTRY_FIRE_ELEMENTAL) { int spellDmg = (int)((GetOwner().GetUInt32Value(PlayerFields.ModDamageDonePos + (int)SpellSchools.Fire)) + GetOwner().GetUInt32Value(PlayerFields.ModDamageDoneNeg + (int)SpellSchools.Fire)); if (spellDmg > 0) { bonusDamage = spellDmg * 0.4f; } } } UnitMods unitMod = UnitMods.DamageMainHand; float att_speed = GetBaseAttackTime(WeaponAttackType.BaseAttack) / 1000.0f; float base_value = GetModifierValue(unitMod, UnitModifierType.BaseValue) + GetTotalAttackPowerValue(attType) / 3.5f * att_speed + bonusDamage; float base_pct = GetModifierValue(unitMod, UnitModifierType.BasePCT); float total_value = GetModifierValue(unitMod, UnitModifierType.TotalValue); float total_pct = GetModifierValue(unitMod, UnitModifierType.TotalPCT); float weapon_mindamage = GetWeaponDamageRange(WeaponAttackType.BaseAttack, WeaponDamageRange.MinDamage); float weapon_maxdamage = GetWeaponDamageRange(WeaponAttackType.BaseAttack, WeaponDamageRange.MaxDamage); float mindamage = ((base_value + weapon_mindamage) * base_pct + total_value) * total_pct; float maxdamage = ((base_value + weapon_maxdamage) * base_pct + total_value) * total_pct; var mDummy = GetAuraEffectsByType(AuraType.ModAttackspeed); foreach (var eff in mDummy) { switch (eff.GetSpellInfo().Id) { case 61682: case 61683: MathFunctions.AddPct(ref mindamage, -eff.GetAmount()); MathFunctions.AddPct(ref maxdamage, -eff.GetAmount()); break; default: break; } } SetStatFloatValue(UnitFields.MinDamage, mindamage); SetStatFloatValue(UnitFields.MaxDamage, maxdamage); }