[11282] Use uint32 datatype for aura charges and stacks

* Some spells have StackAmount > 255, for example 22735, 54314
* In SMSG_AURA_UPDATE maximum stack amount is limited by 255
* Move duplicate code into SpellAuraHolder::BuildUpdatePacket function
* Cleanup some weird type casts in _LoadAuras
This commit is contained in:
zergtmn 2011-03-25 14:40:09 +05:00
parent 77e612cbf7
commit 0bc4bc1d75
8 changed files with 62 additions and 102 deletions

View file

@ -1206,18 +1206,18 @@ void Pet::_LoadAuras(uint32 timediff)
uint64 caster_guid = fields[0].GetUInt64(); uint64 caster_guid = fields[0].GetUInt64();
uint32 item_lowguid = fields[1].GetUInt32(); uint32 item_lowguid = fields[1].GetUInt32();
uint32 spellid = fields[2].GetUInt32(); uint32 spellid = fields[2].GetUInt32();
uint32 stackcount= fields[3].GetUInt32(); uint32 stackcount = fields[3].GetUInt32();
int32 remaincharges = (int32)fields[4].GetUInt32(); uint32 remaincharges = fields[4].GetUInt32();
int32 damage[MAX_EFFECT_INDEX]; int32 damage[MAX_EFFECT_INDEX];
int32 maxduration[MAX_EFFECT_INDEX]; int32 maxduration[MAX_EFFECT_INDEX];
int32 remaintime[MAX_EFFECT_INDEX]; int32 remaintime[MAX_EFFECT_INDEX];
for (int32 i = 0; i < MAX_EFFECT_INDEX; ++i) for (int32 i = 0; i < MAX_EFFECT_INDEX; ++i)
{ {
damage[i] = (int32)fields[i+5].GetUInt32(); damage[i] = fields[i+5].GetInt32();
maxduration[i] = (int32)fields[i+8].GetUInt32(); maxduration[i] = fields[i+8].GetInt32();
remaintime[i] = (int32)fields[i+11].GetUInt32(); remaintime[i] = fields[i+11].GetInt32();
} }
uint32 effIndexMask = (int32)fields[14].GetUInt32(); uint32 effIndexMask = fields[14].GetUInt32();
SpellEntry const* spellproto = sSpellStore.LookupEntry(spellid); SpellEntry const* spellproto = sSpellStore.LookupEntry(spellid);
if (!spellproto) if (!spellproto)
@ -1234,7 +1234,7 @@ void Pet::_LoadAuras(uint32 timediff)
uint32 procCharges = spellproto->procCharges; uint32 procCharges = spellproto->procCharges;
if (procCharges) if (procCharges)
{ {
if (remaincharges <= 0 || remaincharges > (int32)procCharges) if (remaincharges <= 0 || remaincharges > procCharges)
remaincharges = procCharges; remaincharges = procCharges;
} }
else else

View file

@ -15943,20 +15943,20 @@ void Player::_LoadAuras(QueryResult *result, uint32 timediff)
{ {
Field *fields = result->Fetch(); Field *fields = result->Fetch();
ObjectGuid caster_guid = fields[0].GetUInt64(); ObjectGuid caster_guid = fields[0].GetUInt64();
uint32 item_lowguid = fields[1].GetUInt64(); uint32 item_lowguid = fields[1].GetUInt32();
uint32 spellid = fields[2].GetUInt32(); uint32 spellid = fields[2].GetUInt32();
uint32 stackcount = fields[3].GetUInt32(); uint32 stackcount = fields[3].GetUInt32();
int32 remaincharges = (int32)fields[4].GetUInt32(); uint32 remaincharges = fields[4].GetUInt32();
int32 damage[MAX_EFFECT_INDEX]; int32 damage[MAX_EFFECT_INDEX];
int32 maxduration[MAX_EFFECT_INDEX]; int32 maxduration[MAX_EFFECT_INDEX];
int32 remaintime[MAX_EFFECT_INDEX]; int32 remaintime[MAX_EFFECT_INDEX];
for (int32 i = 0; i < MAX_EFFECT_INDEX; ++i) for (int32 i = 0; i < MAX_EFFECT_INDEX; ++i)
{ {
damage[i] = (int32)fields[i+5].GetUInt32(); damage[i] = fields[i+5].GetInt32();
maxduration[i] = (int32)fields[i+8].GetUInt32(); maxduration[i] = fields[i+8].GetInt32();
remaintime[i] = (int32)fields[i+11].GetUInt32(); remaintime[i] = fields[i+11].GetInt32();
} }
uint32 effIndexMask = (int32)fields[14].GetUInt32(); uint32 effIndexMask = fields[14].GetUInt32();
SpellEntry const* spellproto = sSpellStore.LookupEntry(spellid); SpellEntry const* spellproto = sSpellStore.LookupEntry(spellid);
if (!spellproto) if (!spellproto)
@ -15968,7 +15968,7 @@ void Player::_LoadAuras(QueryResult *result, uint32 timediff)
// prevent wrong values of remaincharges // prevent wrong values of remaincharges
if (spellproto->procCharges) if (spellproto->procCharges)
{ {
if (remaincharges <= 0 || remaincharges > (int32)spellproto->procCharges) if (remaincharges <= 0 || remaincharges > spellproto->procCharges)
remaincharges = spellproto->procCharges; remaincharges = spellproto->procCharges;
} }
else else
@ -20150,59 +20150,12 @@ void Player::SendAurasForTarget(Unit *target)
WorldPacket data(SMSG_AURA_UPDATE_ALL); WorldPacket data(SMSG_AURA_UPDATE_ALL);
data << target->GetPackGUID(); data << target->GetPackGUID();
if(!target->GetVisibleAuras()->empty()) // speedup things Unit::VisibleAuraMap const& visibleAuras = target->GetVisibleAuras();
for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras.begin(); itr != visibleAuras.end(); ++itr)
{ {
Unit::VisibleAuraMap const *visibleAuras = target->GetVisibleAuras(); SpellAuraHolderConstBounds bounds = target->GetSpellAuraHolderBounds(itr->second);
for(Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr) for (SpellAuraHolderMap::const_iterator iter = bounds.first; iter != bounds.second; ++iter)
{ iter->second->BuildUpdatePacket(data);
SpellAuraHolderBounds bounds = target->GetSpellAuraHolderBounds(itr->second);
for (SpellAuraHolderMap::const_iterator iter = bounds.first; iter != bounds.second; ++iter)
{
SpellAuraHolder *holder = iter->second;
data << uint8(holder->GetAuraSlot());
data << uint32(holder->GetId());
if(holder->GetId())
{
uint8 auraFlags = holder->GetAuraFlags();
// flags
data << uint8(auraFlags);
// level
data << uint8(holder->GetAuraLevel());
// charges
if (holder->GetAuraCharges())
data << uint8(holder->GetAuraCharges() * holder->GetStackAmount());
else
data << uint8(holder->GetStackAmount());
if(!(auraFlags & AFLAG_NOT_CASTER)) // packed GUID of caster
{
data.appendPackGUID(holder->GetCasterGUID());
}
if(auraFlags & AFLAG_DURATION) // include aura duration
{
// take highest - to display icon even if stun fades
uint32 max_duration = 0;
uint32 duration = 0;
for (int32 i = 0; i < MAX_EFFECT_INDEX; ++i)
{
if (Aura *aura = holder->GetAuraByEffectIndex(SpellEffectIndex(i)))
{
if (uint32(aura->GetAuraMaxDuration()) > max_duration)
{
max_duration = aura->GetAuraMaxDuration();
duration = aura->GetAuraDuration();
}
}
}
data << uint32(max_duration);
data << uint32(duration);
}
}
}
}
} }
GetSession()->SendPacket(&data); GetSession()->SendPacket(&data);

View file

@ -8288,11 +8288,11 @@ void SpellAuraHolder::_AddSpellAuraHolder()
// Lookup free slot // Lookup free slot
if (m_target->GetVisibleAurasCount() < MAX_AURAS) if (m_target->GetVisibleAurasCount() < MAX_AURAS)
{ {
Unit::VisibleAuraMap const *visibleAuras = m_target->GetVisibleAuras(); Unit::VisibleAuraMap const& visibleAuras = m_target->GetVisibleAuras();
for(uint8 i = 0; i < MAX_AURAS; ++i) for(uint8 i = 0; i < MAX_AURAS; ++i)
{ {
Unit::VisibleAuraMap::const_iterator itr = visibleAuras->find(i); Unit::VisibleAuraMap::const_iterator itr = visibleAuras.find(i);
if(itr == visibleAuras->end()) if (itr == visibleAuras.end())
{ {
slot = i; slot = i;
// update for out of range group members (on 1 slot use) // update for out of range group members (on 1 slot use)
@ -8584,8 +8584,8 @@ void SpellAuraHolder::SetStackAmount(uint32 stackAmount)
if (!target || !caster) if (!target || !caster)
return; return;
bool refresh = stackAmount >= uint32(m_stackAmount); bool refresh = stackAmount >= m_stackAmount;
if (stackAmount != uint32(m_stackAmount)) if (stackAmount != m_stackAmount)
{ {
m_stackAmount = stackAmount; m_stackAmount = stackAmount;
@ -8674,23 +8674,17 @@ bool SpellAuraHolder::IsNeedVisibleSlot(Unit const* caster) const
return !m_isPassive || totemAura || HasAreaAuraEffect(m_spellProto); return !m_isPassive || totemAura || HasAreaAuraEffect(m_spellProto);
} }
void SpellAuraHolder::SendAuraUpdate(bool remove) const void SpellAuraHolder::BuildUpdatePacket(WorldPacket& data) const
{ {
WorldPacket data(SMSG_AURA_UPDATE);
data << m_target->GetPackGUID();
data << uint8(GetAuraSlot()); data << uint8(GetAuraSlot());
data << uint32(remove ? 0 : GetId()); data << uint32(GetId());
if(remove)
{
m_target->SendMessageToSet(&data, true);
return;
}
uint8 auraFlags = GetAuraFlags(); uint8 auraFlags = GetAuraFlags();
data << uint8(auraFlags); data << uint8(auraFlags);
data << uint8(GetAuraLevel()); data << uint8(GetAuraLevel());
data << uint8(m_procCharges ? m_procCharges*m_stackAmount : m_stackAmount);
uint32 stackCount = m_procCharges ? m_procCharges*m_stackAmount : m_stackAmount;
data << uint8(stackCount <= 255 ? stackCount : 255);
if(!(auraFlags & AFLAG_NOT_CASTER)) if(!(auraFlags & AFLAG_NOT_CASTER))
{ {
@ -8717,6 +8711,20 @@ void SpellAuraHolder::SendAuraUpdate(bool remove) const
data << uint32(max_duration); data << uint32(max_duration);
data << uint32(duration); data << uint32(duration);
} }
}
void SpellAuraHolder::SendAuraUpdate(bool remove) const
{
WorldPacket data(SMSG_AURA_UPDATE);
data << m_target->GetPackGUID();
if(remove)
{
data << uint8(GetAuraSlot());
data << uint32(0);
}
else
BuildUpdatePacket(data);
m_target->SendMessageToSet(&data, true); m_target->SendMessageToSet(&data, true);
} }

View file

@ -52,6 +52,7 @@ class MANGOS_DLL_SPEC SpellAuraHolder
void ApplyAuraModifiers(bool apply, bool real = false); void ApplyAuraModifiers(bool apply, bool real = false);
void _AddSpellAuraHolder(); void _AddSpellAuraHolder();
void _RemoveSpellAuraHolder(); void _RemoveSpellAuraHolder();
void BuildUpdatePacket(WorldPacket& data) const;
void SendAuraUpdate(bool remove) const; void SendAuraUpdate(bool remove) const;
void HandleSpellSpecificBoosts(bool apply); void HandleSpellSpecificBoosts(bool apply);
void CleanupTriggeredSpells(); void CleanupTriggeredSpells();
@ -117,8 +118,8 @@ class MANGOS_DLL_SPEC SpellAuraHolder
void SetAuraFlags(uint8 flags) { m_auraFlags = flags; } void SetAuraFlags(uint8 flags) { m_auraFlags = flags; }
uint8 GetAuraLevel() const { return m_auraLevel; } uint8 GetAuraLevel() const { return m_auraLevel; }
void SetAuraLevel(uint8 level) { m_auraLevel = level; } void SetAuraLevel(uint8 level) { m_auraLevel = level; }
uint8 GetAuraCharges() const { return m_procCharges; } uint32 GetAuraCharges() const { return m_procCharges; }
void SetAuraCharges(uint8 charges) void SetAuraCharges(uint32 charges)
{ {
if (m_procCharges == charges) if (m_procCharges == charges)
return; return;
@ -139,7 +140,7 @@ class MANGOS_DLL_SPEC SpellAuraHolder
void SetVisibleAura(bool remove) { m_target->SetVisibleAura(m_auraSlot, remove ? 0 : GetId()); } void SetVisibleAura(bool remove) { m_target->SetVisibleAura(m_auraSlot, remove ? 0 : GetId()); }
void SetRemoveMode(AuraRemoveMode mode) { m_removeMode = mode; } void SetRemoveMode(AuraRemoveMode mode) { m_removeMode = mode; }
void SetLoadedState(ObjectGuid casterGUID, ObjectGuid itemGUID, int32 stackAmount, int32 charges) void SetLoadedState(ObjectGuid const& casterGUID, ObjectGuid const& itemGUID, uint32 stackAmount, uint32 charges)
{ {
m_casterGuid = casterGUID; m_casterGuid = casterGUID;
m_castItemGuid = itemGUID; m_castItemGuid = itemGUID;
@ -162,8 +163,8 @@ class MANGOS_DLL_SPEC SpellAuraHolder
uint8 m_auraSlot; // Aura slot on unit (for show in client) uint8 m_auraSlot; // Aura slot on unit (for show in client)
uint8 m_auraFlags; // Aura info flag (for send data to client) uint8 m_auraFlags; // Aura info flag (for send data to client)
uint8 m_auraLevel; // Aura level (store caster level for correct show level dep amount) uint8 m_auraLevel; // Aura level (store caster level for correct show level dep amount)
uint8 m_procCharges; // Aura charges (0 for infinite) uint32 m_procCharges; // Aura charges (0 for infinite)
uint8 m_stackAmount; // Aura stack amount uint32 m_stackAmount; // Aura stack amount
AuraRemoveMode m_removeMode:8; // Store info for know remove aura reason AuraRemoveMode m_removeMode:8; // Store info for know remove aura reason
DiminishingGroup m_AuraDRGroup:8; // Diminishing DiminishingGroup m_AuraDRGroup:8; // Diminishing

View file

@ -2040,12 +2040,10 @@ void Spell::EffectDummy(SpellEffectIndex eff_idx)
const uint32 spellShrink = 53805; const uint32 spellShrink = 53805;
const uint32 spellTransf = 53806; const uint32 spellTransf = 53806;
if (Aura* pAura = m_caster->GetAura(spellShrink, EFFECT_INDEX_0)) if (SpellAuraHolder* holder = m_caster->GetSpellAuraHolder(spellShrink))
{ {
uint32 stackNum = pAura->GetStackAmount();
// chance to become pygmified (5, 10, 15 etc) // chance to become pygmified (5, 10, 15 etc)
if (roll_chance_i(stackNum*5)) if (roll_chance_i(holder->GetStackAmount() * 5))
{ {
m_caster->RemoveAurasDueToSpell(spellShrink); m_caster->RemoveAurasDueToSpell(spellShrink);
m_caster->CastSpell(m_caster, spellTransf, true); m_caster->CastSpell(m_caster, spellTransf, true);
@ -2053,7 +2051,7 @@ void Spell::EffectDummy(SpellEffectIndex eff_idx)
} }
} }
if (m_caster->HasAura(spellTransf, EFFECT_INDEX_0)) if (m_caster->HasAura(spellTransf))
return; return;
m_caster->CastSpell(m_caster, spellShrink, true); m_caster->CastSpell(m_caster, spellShrink, true);

View file

@ -4406,7 +4406,7 @@ void Unit::RemoveSingleAuraFromSpellAuraHolder(uint32 spellId, SpellEffectIndex
} }
} }
void Unit::RemoveAuraHolderDueToSpellByDispel(uint32 spellId, int32 stackAmount, uint64 casterGUID, Unit *dispeler) void Unit::RemoveAuraHolderDueToSpellByDispel(uint32 spellId, uint32 stackAmount, uint64 casterGUID, Unit *dispeller)
{ {
SpellEntry const* spellEntry = sSpellStore.LookupEntry(spellId); SpellEntry const* spellEntry = sSpellStore.LookupEntry(spellId);
@ -4424,7 +4424,7 @@ void Unit::RemoveAuraHolderDueToSpellByDispel(uint32 spellId, int32 stackAmount,
RemoveAuraHolderFromStack(spellId, stackAmount, casterGUID, AURA_REMOVE_BY_DISPEL); RemoveAuraHolderFromStack(spellId, stackAmount, casterGUID, AURA_REMOVE_BY_DISPEL);
// backfire damage and silence // backfire damage and silence
dispeler->CastCustomSpell(dispeler, 31117, &damage, NULL, NULL, true, NULL, NULL,casterGUID); dispeller->CastCustomSpell(dispeller, 31117, &damage, NULL, NULL, true, NULL, NULL, casterGUID);
return; return;
} }
} }
@ -4574,14 +4574,14 @@ void Unit::RemoveAurasWithDispelType( DispelType type, uint64 casterGUID )
} }
} }
void Unit::RemoveAuraHolderFromStack(uint32 spellId, int32 stackAmount, uint64 casterGUID, AuraRemoveMode mode) void Unit::RemoveAuraHolderFromStack(uint32 spellId, uint32 stackAmount, uint64 casterGUID, AuraRemoveMode mode)
{ {
SpellAuraHolderBounds spair = GetSpellAuraHolderBounds(spellId); SpellAuraHolderBounds spair = GetSpellAuraHolderBounds(spellId);
for(SpellAuraHolderMap::iterator iter = spair.first; iter != spair.second; ++iter) for(SpellAuraHolderMap::iterator iter = spair.first; iter != spair.second; ++iter)
{ {
if (!casterGUID || iter->second->GetCasterGUID() == casterGUID) if (!casterGUID || iter->second->GetCasterGUID() == casterGUID)
{ {
if (iter->second->ModStackAmount(-stackAmount)) if (iter->second->ModStackAmount(-int32(stackAmount)))
{ {
RemoveSpellAuraHolder(iter->second, mode); RemoveSpellAuraHolder(iter->second, mode);
break; break;

View file

@ -1596,8 +1596,8 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
void RemoveAllAurasOnDeath(); void RemoveAllAurasOnDeath();
// removing specific aura FROM stack by diff reasons and selections // removing specific aura FROM stack by diff reasons and selections
void RemoveAuraHolderFromStack(uint32 spellId, int32 stackAmount = 1, uint64 casterGUID = 0, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT); void RemoveAuraHolderFromStack(uint32 spellId, uint32 stackAmount = 1, uint64 casterGUID = 0, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT);
void RemoveAuraHolderDueToSpellByDispel(uint32 spellId, int32 stackAmount, uint64 casterGUID, Unit *dispeler); void RemoveAuraHolderDueToSpellByDispel(uint32 spellId, uint32 stackAmount, uint64 casterGUID, Unit *dispeller);
void DelaySpellAuraHolder(uint32 spellId, int32 delaytime, uint64 casterGUID); void DelaySpellAuraHolder(uint32 spellId, int32 delaytime, uint64 casterGUID);
@ -1739,7 +1739,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
void removeHatedBy(HostileReference* /*pHostileReference*/ ) { /* nothing to do yet */ } void removeHatedBy(HostileReference* /*pHostileReference*/ ) { /* nothing to do yet */ }
HostileRefManager& getHostileRefManager() { return m_HostileRefManager; } HostileRefManager& getHostileRefManager() { return m_HostileRefManager; }
uint32 GetVisibleAura(uint8 slot) uint32 GetVisibleAura(uint8 slot) const
{ {
VisibleAuraMap::const_iterator itr = m_visibleAuras.find(slot); VisibleAuraMap::const_iterator itr = m_visibleAuras.find(slot);
if(itr != m_visibleAuras.end()) if(itr != m_visibleAuras.end())
@ -1753,8 +1753,8 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
else else
m_visibleAuras[slot] = spellid; m_visibleAuras[slot] = spellid;
} }
VisibleAuraMap const *GetVisibleAuras() { return &m_visibleAuras; } VisibleAuraMap const& GetVisibleAuras() const { return m_visibleAuras; }
uint8 GetVisibleAurasCount() { return m_visibleAuras.size(); } uint8 GetVisibleAurasCount() const { return m_visibleAuras.size(); }
Aura* GetAura(uint32 spellId, SpellEffectIndex effindex); Aura* GetAura(uint32 spellId, SpellEffectIndex effindex);
Aura* GetAura(AuraType type, SpellFamily family, uint64 familyFlag, uint32 familyFlag2 = 0, ObjectGuid casterGuid = ObjectGuid()); Aura* GetAura(AuraType type, SpellFamily family, uint64 familyFlag, uint32 familyFlag2 = 0, ObjectGuid casterGuid = ObjectGuid());

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 "11281" #define REVISION_NR "11282"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__