mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-18 08:28:32 +01:00
*Update to Mangos 7100.
--HG-- branch : trunk
This commit is contained in:
@@ -905,7 +905,7 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa
|
||||
if(spell->getState() == SPELL_STATE_PREPARING)
|
||||
{
|
||||
uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
|
||||
if(interruptFlags & SPELL_INTERRUPT_FLAG_DAMAGE)
|
||||
if(interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
|
||||
pVictim->InterruptNonMeleeSpells(false);
|
||||
else if(interruptFlags & SPELL_INTERRUPT_FLAG_PUSH_BACK)
|
||||
spell->Delayed();
|
||||
@@ -5004,7 +5004,8 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
||||
triggered_spell_id = 22858;
|
||||
break;
|
||||
}
|
||||
else if (dummySpell->SpellIconID == 1697) // Second Wind
|
||||
// Second Wind
|
||||
if (dummySpell->SpellIconID == 1697)
|
||||
{
|
||||
// only for spells and hit/crit (trigger start always) and not start from self casted spells (5530 Mace Stun Effect for example)
|
||||
if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT|PROC_EX_CRITICAL_HIT)) || this == pVictim)
|
||||
@@ -5017,6 +5018,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
||||
{
|
||||
case 29838: triggered_spell_id=29842; break;
|
||||
case 29834: triggered_spell_id=29841; break;
|
||||
case 42770: triggered_spell_id=42771; break;
|
||||
default:
|
||||
sLog.outError("Unit::HandleDummyAuraProc: non handled spell id: %u (SW)",dummySpell->Id);
|
||||
return false;
|
||||
@@ -5025,6 +5027,13 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
||||
target = this;
|
||||
break;
|
||||
}
|
||||
// Damage Shield
|
||||
if (dummySpell->SpellIconID == 3214)
|
||||
{
|
||||
triggered_spell_id = 59653;
|
||||
basepoints0 = GetShieldBlockValue() * triggeredByAura->GetModifier()->m_amount / 100;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPELLFAMILY_WARLOCK:
|
||||
@@ -5074,6 +5083,16 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
||||
mod->m_amount-=damage;
|
||||
return true;
|
||||
}
|
||||
// Fel Synergy
|
||||
if (dummySpell->SpellIconID == 3222)
|
||||
{
|
||||
target = GetPet();
|
||||
if (!target)
|
||||
return false;
|
||||
triggered_spell_id = 54181;
|
||||
basepoints0 = damage * triggeredByAura->GetModifier()->m_amount / 100;
|
||||
break;
|
||||
}
|
||||
switch(dummySpell->Id)
|
||||
{
|
||||
// Nightfall
|
||||
@@ -5194,7 +5213,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
||||
return false;
|
||||
|
||||
// heal amount
|
||||
basepoints0 = int32(damage * 2 / 100);
|
||||
basepoints0 = damage * triggeredByAura->GetModifier()->m_amount/100;
|
||||
target = this;
|
||||
triggered_spell_id = 39373;
|
||||
break;
|
||||
@@ -5326,6 +5345,31 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Cut to the Chase
|
||||
if( dummySpell->SpellIconID == 2909 )
|
||||
{
|
||||
// "refresh your Slice and Dice duration to its 5 combo point maximum"
|
||||
// lookup Slice and Dice
|
||||
AuraList const& sd = GetAurasByType(SPELL_AURA_MOD_HASTE);
|
||||
for(AuraList::const_iterator itr = sd.begin(); itr != sd.end(); ++itr)
|
||||
{
|
||||
SpellEntry const *spellProto = (*itr)->GetSpellProto();
|
||||
if( spellProto->SpellFamilyName == SPELLFAMILY_ROGUE &&
|
||||
spellProto->SpellFamilyFlags & 0x0000000000040000LL)
|
||||
{
|
||||
(*itr)->SetAuraMaxDuration(GetSpellMaxDuration(spellProto));
|
||||
(*itr)->RefreshAura();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
// Deadly Brew
|
||||
if( dummySpell->SpellIconID == 2963 )
|
||||
{
|
||||
triggered_spell_id = 25809;
|
||||
break;
|
||||
}
|
||||
// Quick Recovery
|
||||
if( dummySpell->SpellIconID == 2116 )
|
||||
{
|
||||
@@ -5360,6 +5404,33 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
||||
triggered_spell_id = 34720;
|
||||
break;
|
||||
}
|
||||
// Hunting Party
|
||||
if ( dummySpell->SpellIconID == 3406 )
|
||||
{
|
||||
triggered_spell_id = 57669;
|
||||
target = this;
|
||||
return true;
|
||||
}
|
||||
// Lock and Load
|
||||
if ( dummySpell->SpellIconID == 3579 )
|
||||
{
|
||||
// Proc only from periodic (from trap activation proc another aura of this spell)
|
||||
if (!(procFlag & PROC_FLAG_ON_DO_PERIODIC))
|
||||
return false;
|
||||
if (!roll_chance_i(triggeredByAura->GetModifier()->m_amount))
|
||||
return false;
|
||||
triggered_spell_id = 56453;
|
||||
target = this;
|
||||
break;
|
||||
}
|
||||
// Rapid Recuperation
|
||||
if ( dummySpell->SpellIconID == 3560 )
|
||||
{
|
||||
// mane regen from Rapid Killing
|
||||
triggered_spell_id = 56654;
|
||||
target = this;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPELLFAMILY_PALADIN:
|
||||
@@ -5702,8 +5773,27 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
||||
triggered_spell_id = 55533;
|
||||
break;
|
||||
}
|
||||
// Spirit Hunt
|
||||
case 58877:
|
||||
{
|
||||
// Cast on owner
|
||||
target = GetOwner();
|
||||
if(!target)
|
||||
return false;
|
||||
basepoints0 = triggeredByAura->GetModifier()->m_amount * damage / 100;
|
||||
triggered_spell_id = 58879;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Ancestral Awakening
|
||||
if (dummySpell->SpellIconID == 2018)
|
||||
{
|
||||
// TODO: frite dummy fot triggered spell
|
||||
triggered_spell_id = 52759;
|
||||
basepoints0 = triggeredByAura->GetModifier()->m_amount * damage / 100;
|
||||
target = this;
|
||||
break;
|
||||
}
|
||||
|
||||
// Earth Shield
|
||||
if(dummySpell->SpellFamilyFlags & 0x0000040000000000LL)
|
||||
{
|
||||
@@ -5712,6 +5802,26 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
||||
triggered_spell_id = 379;
|
||||
break;
|
||||
}
|
||||
// Improved Water Shield
|
||||
if (dummySpell->SpellIconID == 2287)
|
||||
{
|
||||
// lookup water shield
|
||||
AuraList const& vs = GetAurasByType(SPELL_AURA_PROC_TRIGGER_SPELL);
|
||||
for(AuraList::const_iterator itr = vs.begin(); itr != vs.end(); ++itr)
|
||||
{
|
||||
if( (*itr)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_SHAMAN &&
|
||||
(*itr)->GetSpellProto()->SpellFamilyFlags & 0x0000002000000000LL)
|
||||
{
|
||||
uint32 spell = (*itr)->GetSpellProto()->EffectTriggerSpell[(*itr)->GetEffIndex()];
|
||||
CastSpell(this, spell, true, castItem, triggeredByAura);
|
||||
if ((*itr)->DropAuraCharge())
|
||||
RemoveAurasDueToSpell((*itr)->GetId());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
// Lightning Overload
|
||||
if (dummySpell->SpellIconID == 2018) // only this spell have SpellFamily Shaman SpellIconID == 2018 and dummy aura
|
||||
{
|
||||
@@ -5755,6 +5865,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
||||
return false;
|
||||
}
|
||||
// No thread generated mod
|
||||
// TODO: exist special flag in spell attributes for this, need found and use!
|
||||
SpellModifier *mod = new SpellModifier;
|
||||
mod->op = SPELLMOD_THREAT;
|
||||
mod->value = -100;
|
||||
@@ -5777,10 +5888,78 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
||||
|
||||
return true;
|
||||
}
|
||||
// Static Shock
|
||||
if(dummySpell->SpellIconID == 3059)
|
||||
{
|
||||
// lookup Lightning Shield
|
||||
AuraList const& vs = GetAurasByType(SPELL_AURA_PROC_TRIGGER_SPELL);
|
||||
for(AuraList::const_iterator itr = vs.begin(); itr != vs.end(); ++itr)
|
||||
{
|
||||
if( (*itr)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_SHAMAN &&
|
||||
(*itr)->GetSpellProto()->SpellFamilyFlags & 0x0000000000000400LL)
|
||||
{
|
||||
uint32 spell = 0;
|
||||
switch ((*itr)->GetId())
|
||||
{
|
||||
case 324: spell = 26364; break;
|
||||
case 325: spell = 26365; break;
|
||||
case 905: spell = 26366; break;
|
||||
case 945: spell = 26367; break;
|
||||
case 8134: spell = 26369; break;
|
||||
case 10431: spell = 26370; break;
|
||||
case 10432: spell = 26363; break;
|
||||
case 25469: spell = 26371; break;
|
||||
case 25472: spell = 26372; break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
CastSpell(this, spell, true, castItem, triggeredByAura);
|
||||
if ((*itr)->DropAuraCharge())
|
||||
RemoveAurasDueToSpell((*itr)->GetId());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPELLFAMILY_DEATHKNIGHT:
|
||||
{
|
||||
// Blood Aura
|
||||
if (dummySpell->SpellIconID == 2636)
|
||||
{
|
||||
if (GetTypeId() != TYPEID_PLAYER || !((Player*)this)->isHonorOrXPTarget(pVictim))
|
||||
return false;
|
||||
basepoints0 = triggeredByAura->GetModifier()->m_amount * damage / 100;
|
||||
triggered_spell_id = 53168;
|
||||
break;
|
||||
}
|
||||
// Butchery
|
||||
if (dummySpell->SpellIconID == 2664)
|
||||
{
|
||||
basepoints0 = triggeredByAura->GetModifier()->m_amount;
|
||||
triggered_spell_id = 50163;
|
||||
target = this;
|
||||
break;
|
||||
}
|
||||
// Dancing Rune Weapon
|
||||
if (dummySpell->Id == 49028)
|
||||
{
|
||||
// 1 dummy aura for dismiss rune blade
|
||||
if (triggeredByAura->GetEffIndex()!=2)
|
||||
return false;
|
||||
// TODO: wite script for this "fights on its own, doing the same attacks"
|
||||
// NOTE: Trigger here on every attack and spell cast
|
||||
return false;
|
||||
}
|
||||
// Mark of Blood
|
||||
if (dummySpell->Id == 49005)
|
||||
{
|
||||
// TODO: need more info (cooldowns/PPM)
|
||||
triggered_spell_id = 50424;
|
||||
break;
|
||||
}
|
||||
// Vendetta
|
||||
if (dummySpell->SpellFamilyFlags & 0x0000000000010000LL)
|
||||
{
|
||||
@@ -5790,20 +5969,34 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
||||
break;
|
||||
}
|
||||
// Necrosis
|
||||
else if (dummySpell->SpellIconID == 2709)
|
||||
if (dummySpell->SpellIconID == 2709)
|
||||
{
|
||||
basepoints0 = triggeredByAura->GetModifier()->m_amount * damage / 100;
|
||||
triggered_spell_id = 51460;
|
||||
break;
|
||||
}
|
||||
// Butchery
|
||||
else if (dummySpell->SpellIconID == 2664)
|
||||
// Runic Power Back on Snare/Root
|
||||
if (dummySpell->Id == 61257)
|
||||
{
|
||||
basepoints0 = triggeredByAura->GetModifier()->m_amount;
|
||||
triggered_spell_id = 50163;
|
||||
// only for spells and hit/crit (trigger start always) and not start from self casted spells
|
||||
if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT|PROC_EX_CRITICAL_HIT)) || this == pVictim)
|
||||
return false;
|
||||
// Need snare or root mechanic
|
||||
if (!(GetAllSpellMechanicMask(procSpell) & ((1<<MECHANIC_ROOT)|(1<<MECHANIC_SNARE))))
|
||||
return false;
|
||||
triggered_spell_id = 61258;
|
||||
target = this;
|
||||
break;
|
||||
}
|
||||
// Wandering Plague
|
||||
if (dummySpell->SpellIconID == 1614)
|
||||
{
|
||||
if (!roll_chance_f(GetUnitCriticalChance(BASE_ATTACK, pVictim)))
|
||||
return false;
|
||||
basepoints0 = triggeredByAura->GetModifier()->m_amount * damage / 100;
|
||||
triggered_spell_id = 50526;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -6272,10 +6465,6 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredB
|
||||
trigger_spell_id = 26371; break;
|
||||
case 25472: // Rank 9
|
||||
trigger_spell_id = 26372; break;
|
||||
case 49280: // Rank 10
|
||||
trigger_spell_id = 49278; break;
|
||||
case 49281: // Rank 11
|
||||
trigger_spell_id = 49279; break;
|
||||
default:
|
||||
sLog.outError("Unit::HandleProcTriggerSpell: Spell %u not handled in LShield", auraSpellInfo->Id);
|
||||
return false;
|
||||
@@ -6494,8 +6683,9 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredB
|
||||
// Astral Shift
|
||||
case 52179:
|
||||
{
|
||||
if(!procSpell)
|
||||
if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT|PROC_EX_CRITICAL_HIT)) || this == pVictim)
|
||||
return false;
|
||||
|
||||
// Need stun, fear or silence mechanic
|
||||
if (!(GetAllSpellMechanicMask(procSpell) & ((1<<MECHANIC_SILENCE)|(1<<MECHANIC_STUN)|(1<<MECHANIC_FEAR))))
|
||||
return false;
|
||||
@@ -7587,21 +7777,10 @@ uint32 Unit::SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint3
|
||||
DotFactor = 0.95f;
|
||||
CastingTime = 3500;
|
||||
}
|
||||
// Seal of Righteousness - 10.2%/9.8% ( based on weapon type ) of Holy Damage, multiplied by weapon speed
|
||||
else if((spellProto->SpellFamilyFlags & 0x8000000LL) && spellProto->SpellIconID == 25)
|
||||
// Judgement of Righteousness - 32%
|
||||
else if (spellProto->SpellFamilyFlags & 0x0000000000000400LL)
|
||||
{
|
||||
Item *item = ((Player*)this)->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND);
|
||||
float wspeed = GetAttackTime(BASE_ATTACK)/1000.0f;
|
||||
|
||||
if( item && item->GetProto()->InventoryType == INVTYPE_2HWEAPON)
|
||||
CastingTime = uint32(wspeed*3500*0.102f);
|
||||
else
|
||||
CastingTime = uint32(wspeed*3500*0.098f);
|
||||
}
|
||||
// Judgement of Righteousness - 73%
|
||||
else if ((spellProto->SpellFamilyFlags & 1024) && spellProto->SpellIconID == 25)
|
||||
{
|
||||
CastingTime = 2555;
|
||||
CastingTime = 1120;
|
||||
}
|
||||
// Seal of Vengeance - 17% per Fully Stacked Tick - 5 Applications
|
||||
else if ((spellProto->SpellFamilyFlags & 0x80000000000LL) && spellProto->SpellIconID == 2292)
|
||||
@@ -7619,11 +7798,6 @@ uint32 Unit::SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint3
|
||||
{
|
||||
CastingTime = 0;
|
||||
}
|
||||
// Seal of Righteousness trigger - already computed for parent spell
|
||||
else if ( spellProto->SpellFamilyName==SPELLFAMILY_PALADIN && spellProto->SpellIconID==25 && spellProto->AttributesEx4 & 0x00800000LL )
|
||||
{
|
||||
return pdamage;
|
||||
}
|
||||
break;
|
||||
case SPELLFAMILY_SHAMAN:
|
||||
// totem attack
|
||||
@@ -7749,6 +7923,9 @@ int32 Unit::SpellBaseDamageBonus(SpellSchoolMask schoolMask)
|
||||
|
||||
if (GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
// Base value
|
||||
DoneAdvertisedBenefit +=((Player*)this)->GetBaseSpellDamageBonus();
|
||||
|
||||
// Damage bonus from stats
|
||||
AuraList const& mDamageDoneOfStatPercent = GetAurasByType(SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT);
|
||||
for(AuraList::const_iterator i = mDamageDoneOfStatPercent.begin();i != mDamageDoneOfStatPercent.end(); ++i)
|
||||
@@ -8126,6 +8303,9 @@ int32 Unit::SpellBaseHealingBonus(SpellSchoolMask schoolMask)
|
||||
// Healing bonus of spirit, intellect and strength
|
||||
if (GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
// Base value
|
||||
AdvertisedBenefit +=((Player*)this)->GetBaseSpellHealingBonus();
|
||||
|
||||
// Healing bonus from stats
|
||||
AuraList const& mHealingDoneOfStatPercent = GetAurasByType(SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT);
|
||||
for(AuraList::const_iterator i = mHealingDoneOfStatPercent.begin();i != mHealingDoneOfStatPercent.end(); ++i)
|
||||
|
||||
Reference in New Issue
Block a user