aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/Object.cpp30
-rw-r--r--src/game/SharedDefines.h2
-rw-r--r--src/game/Unit.cpp54
3 files changed, 73 insertions, 13 deletions
diff --git a/src/game/Object.cpp b/src/game/Object.cpp
index d565818910e..1ac4c8fa2f0 100644
--- a/src/game/Object.cpp
+++ b/src/game/Object.cpp
@@ -465,6 +465,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
return;
bool IsActivateToQuest = false;
+ bool IsPerCasterAuraState = false;
if (updatetype == UPDATETYPE_CREATE_OBJECT || updatetype == UPDATETYPE_CREATE_OBJECT2)
{
if (isType(TYPEMASK_GAMEOBJECT) && !((GameObject*)this)->IsTransport())
@@ -477,6 +478,14 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
if (((GameObject*)this)->GetGoArtKit())
updateMask->SetBit(GAMEOBJECT_BYTES_1);
}
+ else if (isType(TYPEMASK_UNIT))
+ {
+ if( ((Unit*)this)->HasAuraState(AURA_STATE_CONFLAGRATE))
+ {
+ IsPerCasterAuraState = true;
+ updateMask->SetBit(UNIT_FIELD_AURASTATE);
+ }
+ }
}
else // case UPDATETYPE_VALUES
{
@@ -489,6 +498,14 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
updateMask->SetBit(GAMEOBJECT_DYNAMIC);
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);
@@ -513,6 +530,19 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
*data << uint32(appendValue);
}
+ else if (index == UNIT_FIELD_AURASTATE)
+ {
+ if(IsPerCasterAuraState)
+ {
+ // IsPerCasterAuraState set if related pet caster aura state set already
+ if (((Unit*)this)->HasAuraState(AURA_STATE_CONFLAGRATE, NULL, target))
+ *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
else if(index >= UNIT_FIELD_BASEATTACKTIME && index <= UNIT_FIELD_RANGEDATTACKTIME)
{
diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h
index 0540f8f7dbe..a708a80199c 100644
--- a/src/game/SharedDefines.h
+++ b/src/game/SharedDefines.h
@@ -908,7 +908,7 @@ enum AuraState
//AURA_STATE_UNKNOWN11 = 11, // t|
AURA_STATE_FAERIE_FIRE = 12, // 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_DEADLY_POISON = 16, // T |
AURA_STATE_ENRAGE = 17, // C |
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 359e31c3acc..84590d47336 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -8536,6 +8536,48 @@ void Unit::RemoveAllAttackers()
}
}
+bool Unit::HasAuraState(AuraState flag, SpellEntry const *spellProto, Unit * Caster) const
+{
+ if (Caster && spellProto)
+ {
+ AuraEffectList const& stateAuras = Caster->GetAurasByType(SPELL_AURA_ABILITY_IGNORE_AURASTATE);
+ for(AuraEffectList::const_iterator j = stateAuras.begin();j != stateAuras.end(); ++j)
+ if((*j)->isAffectedOnSpell(spellProto))
+ return true;
+ }
+ return HasFlag(UNIT_FIELD_AURASTATE, 1<<(flag-1));
+}
+
+/*
+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)
{
if (apply)
@@ -8581,18 +8623,6 @@ void Unit::ModifyAuraState(AuraState flag, bool apply)
}
}
-bool Unit::HasAuraState(AuraState flag, SpellEntry const *spellProto, Unit * Caster) const
-{
- if (Caster && spellProto)
- {
- AuraEffectList const& stateAuras = Caster->GetAurasByType(SPELL_AURA_ABILITY_IGNORE_AURASTATE);
- for(AuraEffectList::const_iterator j = stateAuras.begin();j != stateAuras.end(); ++j)
- if((*j)->isAffectedOnSpell(spellProto))
- return true;
- }
- return HasFlag(UNIT_FIELD_AURASTATE, 1<<(flag-1));
-}
-
Unit *Unit::GetOwner() const
{
if(uint64 ownerid = GetOwnerGUID())