mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 16:37:01 +00:00
[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:
parent
d2dadbcb99
commit
36605805b4
7 changed files with 72 additions and 29 deletions
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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())
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue