mirror of
https://github.com/mangosfour/server.git
synced 2025-12-21 10:37:06 +00:00
Merge commit 'origin/master' into 320
This commit is contained in:
commit
f97da77cbd
38 changed files with 788 additions and 538 deletions
|
|
@ -1027,7 +1027,7 @@ void Aura::_AddAura()
|
|||
}
|
||||
}
|
||||
|
||||
void Aura::_RemoveAura()
|
||||
bool Aura::_RemoveAura()
|
||||
{
|
||||
// Remove all triggered by aura spells vs unlimited duration
|
||||
// except same aura replace case
|
||||
|
|
@ -1051,10 +1051,10 @@ void Aura::_RemoveAura()
|
|||
uint8 slot = GetAuraSlot();
|
||||
|
||||
if(slot >= MAX_AURAS) // slot not set
|
||||
return;
|
||||
return false;
|
||||
|
||||
if(m_target->GetVisibleAura(slot) == 0)
|
||||
return;
|
||||
return false;
|
||||
|
||||
bool lastaura = true;
|
||||
|
||||
|
|
@ -1075,96 +1075,98 @@ void Aura::_RemoveAura()
|
|||
}
|
||||
|
||||
// only remove icon when the last aura of the spell is removed (current aura already removed from list)
|
||||
if (lastaura)
|
||||
if (!lastaura)
|
||||
return false;
|
||||
|
||||
// unregister aura diminishing (and store last time)
|
||||
if (getDiminishGroup() != DIMINISHING_NONE )
|
||||
m_target->ApplyDiminishingAura(getDiminishGroup(), false);
|
||||
|
||||
SetAura(true);
|
||||
SetAuraFlags(AFLAG_NONE);
|
||||
SetAuraLevel(0);
|
||||
SendAuraUpdate(true);
|
||||
|
||||
// update for out of range group members
|
||||
m_target->UpdateAuraForGroup(slot);
|
||||
|
||||
//*****************************************************
|
||||
// Update target aura state flag (at last aura remove)
|
||||
//*****************************************************
|
||||
// Enrage aura state
|
||||
if(m_spellProto->Dispel == DISPEL_ENRAGE)
|
||||
m_target->ModifyAuraState(AURA_STATE_ENRAGE, false);
|
||||
|
||||
uint32 removeState = 0;
|
||||
uint64 removeFamilyFlag = m_spellProto->SpellFamilyFlags;
|
||||
uint32 removeFamilyFlag2 = m_spellProto->SpellFamilyFlags2;
|
||||
switch(m_spellProto->SpellFamilyName)
|
||||
{
|
||||
// unregister aura diminishing (and store last time)
|
||||
if (getDiminishGroup() != DIMINISHING_NONE )
|
||||
m_target->ApplyDiminishingAura(getDiminishGroup(), false);
|
||||
|
||||
SetAura(true);
|
||||
SetAuraFlags(AFLAG_NONE);
|
||||
SetAuraLevel(0);
|
||||
SendAuraUpdate(true);
|
||||
|
||||
// update for out of range group members
|
||||
m_target->UpdateAuraForGroup(slot);
|
||||
|
||||
//*****************************************************
|
||||
// Update target aura state flag (at last aura remove)
|
||||
//*****************************************************
|
||||
// Enrage aura state
|
||||
if(m_spellProto->Dispel == DISPEL_ENRAGE)
|
||||
m_target->ModifyAuraState(AURA_STATE_ENRAGE, false);
|
||||
|
||||
uint32 removeState = 0;
|
||||
uint64 removeFamilyFlag = m_spellProto->SpellFamilyFlags;
|
||||
uint32 removeFamilyFlag2 = m_spellProto->SpellFamilyFlags2;
|
||||
switch(m_spellProto->SpellFamilyName)
|
||||
case SPELLFAMILY_PALADIN:
|
||||
if (IsSealSpell(m_spellProto))
|
||||
removeState = AURA_STATE_JUDGEMENT; // Update Seals information
|
||||
break;
|
||||
case SPELLFAMILY_WARLOCK:
|
||||
// Conflagrate aura state on Immolate and Shadowflame,
|
||||
if ((m_spellProto->SpellFamilyFlags & UI64LIT(0x0000000000000004)) ||
|
||||
(m_spellProto->SpellFamilyFlags2 & 0x00000002))
|
||||
{
|
||||
case SPELLFAMILY_PALADIN:
|
||||
if (IsSealSpell(m_spellProto))
|
||||
removeState = AURA_STATE_JUDGEMENT; // Update Seals information
|
||||
break;
|
||||
case SPELLFAMILY_WARLOCK:
|
||||
// Conflagrate aura state on Immolate and Shadowflame,
|
||||
if ((m_spellProto->SpellFamilyFlags & UI64LIT(0x0000000000000004)) ||
|
||||
(m_spellProto->SpellFamilyFlags2 & 0x00000002))
|
||||
{
|
||||
removeFamilyFlag = UI64LIT(0x0000000000000004);
|
||||
removeFamilyFlag2 = 0x00000002;
|
||||
removeState = AURA_STATE_CONFLAGRATE;
|
||||
}
|
||||
break;
|
||||
case SPELLFAMILY_DRUID:
|
||||
if(m_spellProto->SpellFamilyFlags & UI64LIT(0x0000000000000400))
|
||||
removeState = AURA_STATE_FAERIE_FIRE; // Faerie Fire (druid versions)
|
||||
else if(m_spellProto->SpellFamilyFlags & UI64LIT(0x50))
|
||||
{
|
||||
removeFamilyFlag = 0x50;
|
||||
removeState = AURA_STATE_SWIFTMEND; // Swiftmend aura state
|
||||
}
|
||||
break;
|
||||
case SPELLFAMILY_WARRIOR:
|
||||
if(m_spellProto->SpellFamilyFlags & UI64LIT(0x0004000000000000))
|
||||
removeState = AURA_STATE_WARRIOR_VICTORY_RUSH; // Victorious
|
||||
break;
|
||||
case SPELLFAMILY_ROGUE:
|
||||
if(m_spellProto->SpellFamilyFlags & UI64LIT(0x10000))
|
||||
removeState = AURA_STATE_DEADLY_POISON; // Deadly poison aura state
|
||||
break;
|
||||
case SPELLFAMILY_HUNTER:
|
||||
if(m_spellProto->SpellFamilyFlags & UI64LIT(0x1000000000000000))
|
||||
removeState = AURA_STATE_FAERIE_FIRE; // Sting (hunter versions)
|
||||
|
||||
removeFamilyFlag = UI64LIT(0x0000000000000004);
|
||||
removeFamilyFlag2 = 0x00000002;
|
||||
removeState = AURA_STATE_CONFLAGRATE;
|
||||
}
|
||||
// Remove state (but need check other auras for it)
|
||||
if (removeState)
|
||||
break;
|
||||
case SPELLFAMILY_DRUID:
|
||||
if(m_spellProto->SpellFamilyFlags & UI64LIT(0x0000000000000400))
|
||||
removeState = AURA_STATE_FAERIE_FIRE; // Faerie Fire (druid versions)
|
||||
else if(m_spellProto->SpellFamilyFlags & UI64LIT(0x50))
|
||||
{
|
||||
bool found = false;
|
||||
Unit::AuraMap& Auras = m_target->GetAuras();
|
||||
for(Unit::AuraMap::iterator i = Auras.begin(); i != Auras.end(); ++i)
|
||||
{
|
||||
SpellEntry const *auraSpellInfo = (*i).second->GetSpellProto();
|
||||
if(auraSpellInfo->SpellFamilyName == m_spellProto->SpellFamilyName &&
|
||||
(auraSpellInfo->SpellFamilyFlags & removeFamilyFlag || auraSpellInfo->SpellFamilyFlags2 & removeFamilyFlag2))
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// this has been last aura
|
||||
if(!found)
|
||||
m_target->ModifyAuraState(AuraState(removeState), false);
|
||||
removeFamilyFlag = 0x50;
|
||||
removeState = AURA_STATE_SWIFTMEND; // Swiftmend aura state
|
||||
}
|
||||
break;
|
||||
case SPELLFAMILY_WARRIOR:
|
||||
if(m_spellProto->SpellFamilyFlags & UI64LIT(0x0004000000000000))
|
||||
removeState = AURA_STATE_WARRIOR_VICTORY_RUSH; // Victorious
|
||||
break;
|
||||
case SPELLFAMILY_ROGUE:
|
||||
if(m_spellProto->SpellFamilyFlags & UI64LIT(0x10000))
|
||||
removeState = AURA_STATE_DEADLY_POISON; // Deadly poison aura state
|
||||
break;
|
||||
case SPELLFAMILY_HUNTER:
|
||||
if(m_spellProto->SpellFamilyFlags & UI64LIT(0x1000000000000000))
|
||||
removeState = AURA_STATE_FAERIE_FIRE; // Sting (hunter versions)
|
||||
|
||||
// reset cooldown state for spells
|
||||
if(caster && caster->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
if ( GetSpellProto()->Attributes & SPELL_ATTR_DISABLED_WHILE_ACTIVE )
|
||||
// note: item based cooldowns and cooldown spell mods with charges ignored (unknown existed cases)
|
||||
((Player*)caster)->SendCooldownEvent(GetSpellProto());
|
||||
}
|
||||
}
|
||||
// Remove state (but need check other auras for it)
|
||||
if (removeState)
|
||||
{
|
||||
bool found = false;
|
||||
Unit::AuraMap& Auras = m_target->GetAuras();
|
||||
for(Unit::AuraMap::iterator i = Auras.begin(); i != Auras.end(); ++i)
|
||||
{
|
||||
SpellEntry const *auraSpellInfo = (*i).second->GetSpellProto();
|
||||
if(auraSpellInfo->SpellFamilyName == m_spellProto->SpellFamilyName &&
|
||||
(auraSpellInfo->SpellFamilyFlags & removeFamilyFlag || auraSpellInfo->SpellFamilyFlags2 & removeFamilyFlag2))
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// this has been last aura
|
||||
if(!found)
|
||||
m_target->ModifyAuraState(AuraState(removeState), false);
|
||||
}
|
||||
|
||||
// reset cooldown state for spells
|
||||
if(caster && caster->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
if ( GetSpellProto()->Attributes & SPELL_ATTR_DISABLED_WHILE_ACTIVE )
|
||||
// note: item based cooldowns and cooldown spell mods with charges ignored (unknown existed cases)
|
||||
((Player*)caster)->SendCooldownEvent(GetSpellProto());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Aura::SendAuraUpdate(bool remove)
|
||||
|
|
@ -3314,9 +3316,17 @@ void Aura::HandleModCharm(bool apply, bool Real)
|
|||
CreatureInfo const *cinfo = ((Creature*)m_target)->GetCreatureInfo();
|
||||
if(cinfo && cinfo->type == CREATURE_TYPE_DEMON)
|
||||
{
|
||||
//does not appear to have relevance. Why code added initially? See note below at !apply
|
||||
//to prevent client crash
|
||||
//m_target->SetFlag(UNIT_FIELD_BYTES_0, 2048);
|
||||
// creature with pet number expected have class set
|
||||
if(m_target->GetByteValue(UNIT_FIELD_BYTES_0, 1)==0)
|
||||
{
|
||||
if(cinfo->unit_class==0)
|
||||
sLog.outErrorDb("Creature (Entry: %u) have unit_class = 0 but used in charmed spell, that will be result client crash.",cinfo->Entry);
|
||||
else
|
||||
sLog.outError("Creature (Entry: %u) have unit_class = %u but at charming have class 0!!! that will be result client crash.",cinfo->Entry,cinfo->unit_class);
|
||||
|
||||
m_target->SetByteValue(UNIT_FIELD_BYTES_0, 1, CLASS_MAGE);
|
||||
}
|
||||
|
||||
//just to enable stat window
|
||||
charmInfo->SetPetNumber(objmgr.GeneratePetNumber(), true);
|
||||
//if charmed two demons the same session, the 2nd gets the 1st one's name
|
||||
|
|
@ -3352,13 +3362,8 @@ void Aura::HandleModCharm(bool apply, bool Real)
|
|||
// restore UNIT_FIELD_BYTES_0
|
||||
if(cinfo && caster->GetTypeId() == TYPEID_PLAYER && caster->getClass() == CLASS_WARLOCK && cinfo->type == CREATURE_TYPE_DEMON)
|
||||
{
|
||||
//does not appear to have relevance. Why code added initially? Class, gender, powertype should be same.
|
||||
//db field removed and replaced with better way to set class, restore using this if problems
|
||||
/*CreatureDataAddon const *cainfo = ((Creature*)m_target)->GetCreatureAddon();
|
||||
if(cainfo && cainfo->bytes0 != 0)
|
||||
m_target->SetUInt32Value(UNIT_FIELD_BYTES_0, cainfo->bytes0);
|
||||
else
|
||||
m_target->RemoveFlag(UNIT_FIELD_BYTES_0, 2048);*/
|
||||
// DB must have proper class set in field at loading, not req. restore, including workaround case at apply
|
||||
// m_target->SetByteValue(UNIT_FIELD_BYTES_0, 1, cinfo->unit_class);
|
||||
|
||||
if(m_target->GetCharmInfo())
|
||||
m_target->GetCharmInfo()->SetPetNumber(0, true);
|
||||
|
|
@ -5555,6 +5560,107 @@ void Aura::HandleShapeshiftBoosts(bool apply)
|
|||
m_target->SetHealth(uint32(ceil((double)m_target->GetMaxHealth() * healthPercentage)));*/
|
||||
}
|
||||
|
||||
void Aura::HandleSpellSpecificBoosts(bool apply)
|
||||
{
|
||||
uint32 spellId1 = 0;
|
||||
uint32 spellId2 = 0;
|
||||
uint32 spellId3 = 0;
|
||||
|
||||
switch(GetSpellProto()->SpellFamilyName)
|
||||
{
|
||||
case SPELLFAMILY_WARRIOR:
|
||||
{
|
||||
if(!apply)
|
||||
{
|
||||
// Remove Blood Frenzy only if target no longer has any Deep Wound or Rend (applying is handled by procs)
|
||||
if (GetSpellProto()->Mechanic != MECHANIC_BLEED)
|
||||
return;
|
||||
|
||||
// If target still has one of Warrior's bleeds, do nothing
|
||||
Unit::AuraList const& PeriodicDamage = m_target->GetAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
|
||||
for(Unit::AuraList::const_iterator i = PeriodicDamage.begin(); i != PeriodicDamage.end(); ++i)
|
||||
if( (*i)->GetCasterGUID() == GetCasterGUID() &&
|
||||
(*i)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_WARRIOR &&
|
||||
(*i)->GetSpellProto()->Mechanic == MECHANIC_BLEED)
|
||||
return;
|
||||
|
||||
spellId1 = 30069;
|
||||
spellId2 = 30070;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPELLFAMILY_HUNTER:
|
||||
{
|
||||
if(GetSpellSpecific(m_spellProto->Id) != SPELL_ASPECT)
|
||||
return;
|
||||
|
||||
// Aspect of the Dragonhawk dodge
|
||||
if (GetSpellProto()->SpellFamilyFlags2 & 0x00001000)
|
||||
spellId1 = 61848;
|
||||
else
|
||||
return;
|
||||
|
||||
break;
|
||||
}
|
||||
case SPELLFAMILY_PALADIN:
|
||||
{
|
||||
// Only process on player casting paladin aura
|
||||
// all aura bonuses applied also in aura area effect way to caster
|
||||
if (GetCasterGUID() != m_target->GetGUID() || !IS_PLAYER_GUID(GetCasterGUID()))
|
||||
return;
|
||||
|
||||
if (GetSpellSpecific(m_spellProto->Id) != SPELL_AURA)
|
||||
return;
|
||||
|
||||
// Sanctified Retribution and Swift Retribution (they share one aura), but not Retribution Aura (already gets modded)
|
||||
if ((GetSpellProto()->SpellFamilyFlags & UI64LIT(0x0000000000000008))==0)
|
||||
spellId1 = 63531; // placeholder for talent spell mods
|
||||
// Improved Concentration Aura (auras bonus)
|
||||
spellId2 = 63510; // placeholder for talent spell mods
|
||||
// Improved Devotion Aura (auras bonus)
|
||||
spellId3 = 63514; // placeholder for talent spell mods
|
||||
break;
|
||||
}
|
||||
case SPELLFAMILY_DEATHKNIGHT:
|
||||
{
|
||||
if (GetSpellSpecific(m_spellProto->Id) != SPELL_PRESENCE)
|
||||
return;
|
||||
|
||||
// Frost Presence health
|
||||
if (GetId() == 48263)
|
||||
spellId1 = 61261;
|
||||
// Unholy Presence move speed
|
||||
else if (GetId() == 48265)
|
||||
spellId1 = 49772;
|
||||
else
|
||||
return;
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
if (apply)
|
||||
{
|
||||
if (spellId1)
|
||||
m_target->CastSpell(m_target, spellId1, true, NULL, this);
|
||||
if (spellId2)
|
||||
m_target->CastSpell(m_target, spellId2, true, NULL, this);
|
||||
if (spellId3)
|
||||
m_target->CastSpell(m_target, spellId3, true, NULL, this);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (spellId1)
|
||||
m_target->RemoveAurasByCasterSpell(spellId1, GetCasterGUID());
|
||||
if (spellId2)
|
||||
m_target->RemoveAurasByCasterSpell(spellId2, GetCasterGUID());
|
||||
if (spellId3)
|
||||
m_target->RemoveAurasByCasterSpell(spellId3, GetCasterGUID());
|
||||
}
|
||||
}
|
||||
|
||||
void Aura::HandleAuraEmpathy(bool apply, bool /*Real*/)
|
||||
{
|
||||
if(m_target->GetTypeId() != TYPEID_UNIT)
|
||||
|
|
@ -5751,14 +5857,6 @@ void Aura::HandleSpiritOfRedemption( bool apply, bool Real )
|
|||
|
||||
void Aura::CleanupTriggeredSpells()
|
||||
{
|
||||
if (m_spellProto->SpellFamilyName == SPELLFAMILY_WARRIOR && (m_spellProto->SpellFamilyFlags & UI64LIT(0x0000001000000020)))
|
||||
{
|
||||
// Blood Frenzy remove
|
||||
m_target->RemoveAurasDueToSpell(30069);
|
||||
m_target->RemoveAurasDueToSpell(30070);
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 tSpellId = m_spellProto->EffectTriggerSpell[GetEffIndex()];
|
||||
if(!tSpellId)
|
||||
return;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue