[8218] Final part of talent 17962 and ranks fixes.

* Support correct aura state at server set for different casters effects
* Correctly check this telent (per caster) aura state at cast
* Correctly show per-caster aura state for cleitns.
This commit is contained in:
VladimirMangos 2009-07-20 11:43:33 +04:00
parent d2dadbcb99
commit 36605805b4
7 changed files with 72 additions and 29 deletions

View file

@ -579,6 +579,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
return; return;
bool IsActivateToQuest = false; bool IsActivateToQuest = false;
bool IsPerCasterAuraState = false;
if (updatetype == UPDATETYPE_CREATE_OBJECT || updatetype == UPDATETYPE_CREATE_OBJECT2) if (updatetype == UPDATETYPE_CREATE_OBJECT || updatetype == UPDATETYPE_CREATE_OBJECT2)
{ {
if (isType(TYPEMASK_GAMEOBJECT) && !((GameObject*)this)->IsTransport()) if (isType(TYPEMASK_GAMEOBJECT) && !((GameObject*)this)->IsTransport())
@ -589,6 +590,14 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
updateMask->SetBit(GAMEOBJECT_DYNAMIC); updateMask->SetBit(GAMEOBJECT_DYNAMIC);
} }
} }
else if (isType(TYPEMASK_UNIT))
{
if( ((Unit*)this)->HasAuraState(AURA_STATE_CONFLAGRATE))
{
IsPerCasterAuraState = true;
updateMask->SetBit(UNIT_FIELD_AURASTATE);
}
}
} }
else // case UPDATETYPE_VALUES else // case UPDATETYPE_VALUES
{ {
@ -601,6 +610,14 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
updateMask->SetBit(GAMEOBJECT_DYNAMIC); updateMask->SetBit(GAMEOBJECT_DYNAMIC);
updateMask->SetBit(GAMEOBJECT_BYTES_1); updateMask->SetBit(GAMEOBJECT_BYTES_1);
} }
else if (isType(TYPEMASK_UNIT))
{
if( ((Unit*)this)->HasAuraState(AURA_STATE_CONFLAGRATE))
{
IsPerCasterAuraState = true;
updateMask->SetBit(UNIT_FIELD_AURASTATE);
}
}
} }
WPAssert(updateMask && updateMask->GetCount() == m_valuesCount); WPAssert(updateMask && updateMask->GetCount() == m_valuesCount);
@ -625,6 +642,19 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
*data << uint32(appendValue); *data << uint32(appendValue);
} }
else if (index == UNIT_FIELD_AURASTATE)
{
if(IsPerCasterAuraState)
{
// IsPerCasterAuraState set if related pet caster aura state set already
if (((Unit*)this)->HasAuraStateForCaster(AURA_STATE_CONFLAGRATE,target->GetGUID()))
*data << m_uint32Values[ index ];
else
*data << (m_uint32Values[ index ] & ~(1 << (AURA_STATE_CONFLAGRATE-1)));
}
else
*data << m_uint32Values[ index ];
}
// FIXME: Some values at server stored in float format but must be sent to client in uint32 format // FIXME: Some values at server stored in float format but must be sent to client in uint32 format
else if(index >= UNIT_FIELD_BASEATTACKTIME && index <= UNIT_FIELD_RANGEDATTACKTIME) else if(index >= UNIT_FIELD_BASEATTACKTIME && index <= UNIT_FIELD_RANGEDATTACKTIME)
{ {

View file

@ -893,7 +893,7 @@ enum AuraState
//AURA_STATE_UNKNOWN11 = 11, // t| //AURA_STATE_UNKNOWN11 = 11, // t|
AURA_STATE_FAERIE_FIRE = 12, // c t| AURA_STATE_FAERIE_FIRE = 12, // c t|
AURA_STATE_HEALTHLESS_35_PERCENT = 13, // C T | AURA_STATE_HEALTHLESS_35_PERCENT = 13, // C T |
AURA_STATE_CONFLAGRATE = 14, // T | AURA_STATE_CONFLAGRATE = 14, // T | per-caster
AURA_STATE_SWIFTMEND = 15, // T | AURA_STATE_SWIFTMEND = 15, // T |
AURA_STATE_DEADLY_POISON = 16, // T | AURA_STATE_DEADLY_POISON = 16, // T |
AURA_STATE_ENRAGE = 17, // C | AURA_STATE_ENRAGE = 17, // C |

View file

@ -3739,7 +3739,7 @@ SpellCastResult Spell::CheckCast(bool strict)
if(target != m_caster) if(target != m_caster)
{ {
// target state requirements (apply to non-self only), to allow cast affects to self like Dirty Deeds // target state requirements (apply to non-self only), to allow cast affects to self like Dirty Deeds
if(m_spellInfo->TargetAuraState && !target->HasAuraState(AuraState(m_spellInfo->TargetAuraState))) if(m_spellInfo->TargetAuraState && !target->HasAuraStateForCaster(AuraState(m_spellInfo->TargetAuraState),m_caster->GetGUID()))
return SPELL_FAILED_TARGET_AURASTATE; return SPELL_FAILED_TARGET_AURASTATE;
// Not allow casting on flying player // Not allow casting on flying player

View file

@ -1093,35 +1093,20 @@ void Aura::_RemoveAura()
removeState = AURA_STATE_JUDGEMENT; // Update Seals information removeState = AURA_STATE_JUDGEMENT; // Update Seals information
break; break;
case SPELLFAMILY_WARLOCK: case SPELLFAMILY_WARLOCK:
// Conflagrate aura state on Immolate and Shadowflame // Conflagrate aura state on Immolate and Shadowflame,
// Check Immolate case if ((m_spellProto->SpellFamilyFlags & UI64LIT(0x0000000000000004)) ||
if (m_spellProto->SpellFamilyFlags & UI64LIT(0x0000000000000004)) (m_spellProto->SpellFamilyFlags2 & 0x00000002))
{ {
//check if there is a Shadowflame DOT present, if not, remove AURA_STATE_CONFLAGRATE // it can have both from same caster or same effect from different casters
bool removeAuraState=true; bool removeAuraState=true;
Unit::AuraList const& SFDOT = m_target->GetAurasByType(SPELL_AURA_PERIODIC_DAMAGE); Unit::AuraList const& dotList = m_target->GetAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
for(Unit::AuraList::const_iterator i = SFDOT.begin(); i != SFDOT.end(); ++i) for(Unit::AuraList::const_iterator i = dotList.begin(); i != dotList.end(); ++i)
{ {
if ((*i)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_WARLOCK && if ((*i)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_WARLOCK &&
((*i)->GetSpellProto()->SpellFamilyFlags2 & 0x00000002)) // Immolate
{ (((*i)->GetSpellProto()->SpellFamilyFlags & UI64LIT(0x0000000000000004)) ||
removeAuraState=false; // Shadowflame
break; ((*i)->GetSpellProto()->SpellFamilyFlags2 & 0x00000002)))
}
}
if(removeAuraState)
removeState = AURA_STATE_CONFLAGRATE;
}
// Check Shadowflame case
else if (m_spellProto->SpellFamilyFlags2 & 0x00000002)
{
//check if there is a Immolate DOT present, if not, remove AURA_STATE_CONFLAGRATE
bool removeAuraState=true;
Unit::AuraList const& IMDOT = m_target->GetAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
for(Unit::AuraList::const_iterator i = IMDOT.begin(); i != IMDOT.end(); ++i)
{
if ((*i)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_WARLOCK &&
((*i)->GetSpellProto()->SpellFamilyFlags & UI64LIT(0x0000000000000004)))
{ {
removeAuraState=false; removeAuraState=false;
break; break;

View file

@ -7456,6 +7456,34 @@ void Unit::RemoveAllAttackers()
} }
} }
bool Unit::HasAuraStateForCaster(AuraState flag, uint64 caster) const
{
if(!HasAuraState(flag))
return false;
// single per-caster aura state
if(flag == AURA_STATE_CONFLAGRATE)
{
Unit::AuraList const& dotList = GetAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
for(Unit::AuraList::const_iterator i = dotList.begin(); i != dotList.end(); ++i)
{
if ((*i)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_WARLOCK &&
(*i)->GetCasterGUID() == caster &&
// Immolate
(((*i)->GetSpellProto()->SpellFamilyFlags & UI64LIT(0x0000000000000004)) ||
// Shadowflame
((*i)->GetSpellProto()->SpellFamilyFlags2 & 0x00000002)))
{
return true;
}
}
return false;
}
return true;
}
void Unit::ModifyAuraState(AuraState flag, bool apply) void Unit::ModifyAuraState(AuraState flag, bool apply)
{ {
if (apply) if (apply)
@ -7508,7 +7536,6 @@ void Unit::ModifyAuraState(AuraState flag, bool apply)
} }
} }
} }
Unit *Unit::GetOwner() const Unit *Unit::GetOwner() const
{ {
if(uint64 ownerid = GetOwnerGUID()) if(uint64 ownerid = GetOwnerGUID())

View file

@ -1406,6 +1406,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
float GetAPMultiplier(WeaponAttackType attType, bool normalized); float GetAPMultiplier(WeaponAttackType attType, bool normalized);
void ModifyAuraState(AuraState flag, bool apply); void ModifyAuraState(AuraState flag, bool apply);
bool HasAuraState(AuraState flag) const { return HasFlag(UNIT_FIELD_AURASTATE, 1<<(flag-1)); } bool HasAuraState(AuraState flag) const { return HasFlag(UNIT_FIELD_AURASTATE, 1<<(flag-1)); }
bool HasAuraStateForCaster(AuraState flag, uint64 caster) const;
void UnsummonAllTotems(); void UnsummonAllTotems();
Unit* SelectMagnetTarget(Unit *victim, SpellEntry const *spellInfo = NULL); Unit* SelectMagnetTarget(Unit *victim, SpellEntry const *spellInfo = NULL);
int32 SpellBaseDamageBonus(SpellSchoolMask schoolMask); int32 SpellBaseDamageBonus(SpellSchoolMask schoolMask);

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "8217" #define REVISION_NR "8218"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__