aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRat <gmstreetrat@gmail.com>2014-11-29 12:48:12 +0100
committerRat <gmstreetrat@gmail.com>2014-11-29 12:48:12 +0100
commit8c4761e820d1185afb3d6384c47e0a53dce42fbc (patch)
tree99e24f51c92249b85a3210190b44026f7b68cceb /src
parentce5b683a073dd62988dc0c0a18798513252dabe6 (diff)
Core/Spells: more work on auras
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp11
-rw-r--r--src/server/game/Handlers/GroupHandler.cpp8
-rw-r--r--src/server/game/Server/Packets/SpellPackets.cpp82
-rw-r--r--src/server/game/Server/Packets/SpellPackets.h11
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp7
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h3
-rw-r--r--src/server/game/Spells/Auras/SpellAuraDefines.h14
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp47
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.h15
9 files changed, 145 insertions, 53 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 6bebd7a5fd7..567b240db07 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -23468,17 +23468,18 @@ void Player::SendAurasForTarget(Unit* target)
if (target->HasAuraType(SPELL_AURA_HOVER))
target->SetHover(true, true);
- WorldPacket data(SMSG_AURA_UPDATE_ALL);
- data << target->GetPackGUID();
-
Unit::VisibleAuraMap const* visibleAuras = target->GetVisibleAuras();
+
+ WorldPackets::Spell::SendAuraUpdate update;
+ update.Init(true, GetGUID(), visibleAuras->size());
+
for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
{
AuraApplication * auraApp = itr->second;
- auraApp->BuildUpdatePacket(data, false);
+ update.BuildUpdatePacket(auraApp, false, getLevel()); // TODO 6.x should be caster's level
}
- GetSession()->SendPacket(&data);
+ GetSession()->SendPacket(const_cast<WorldPacket*>(update.Write()));
}
void Player::SetDailyQuestStatus(uint32 quest_id)
diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp
index 097c47a228e..07258fbd976 100644
--- a/src/server/game/Handlers/GroupHandler.cpp
+++ b/src/server/game/Handlers/GroupHandler.cpp
@@ -1048,7 +1048,7 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke
*data << uint32(aurApp->GetBase()->GetId());
*data << uint16(aurApp->GetFlags());
- if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT)
+ if (aurApp->GetFlags() & AFLAG_SCALABLE)
{
for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
@@ -1150,7 +1150,7 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke
*data << uint32(aurApp->GetBase()->GetId());
*data << uint16(aurApp->GetFlags());
- if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT)
+ if (aurApp->GetFlags() & AFLAG_SCALABLE)
{
for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
@@ -1285,7 +1285,7 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recvData)
data << uint32(aurApp->GetBase()->GetId());
data << uint16(aurApp->GetFlags());
- if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT)
+ if (aurApp->GetFlags() & AFLAG_SCALABLE)
{
for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
@@ -1338,7 +1338,7 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recvData)
data << uint32(aurApp->GetBase()->GetId());
data << uint16(aurApp->GetFlags());
- if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT)
+ if (aurApp->GetFlags() & AFLAG_SCALABLE)
{
for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp
index 57c8bcb3e3d..9cf5bca318d 100644
--- a/src/server/game/Server/Packets/SpellPackets.cpp
+++ b/src/server/game/Server/Packets/SpellPackets.cpp
@@ -16,6 +16,7 @@
*/
#include "SpellPackets.h"
+#include "SpellAuraEffects.h"
WorldPacket const* WorldPackets::Spell::CategoryCooldown::Write()
{
@@ -44,3 +45,84 @@ WorldPacket const* WorldPackets::Spell::SendKnownSpells::Write()
return &_worldPacket;
}
+
+WorldPacket const* WorldPackets::Spell::SendAuraUpdate::Write()
+{
+ return &_worldPacket;
+}
+
+void WorldPackets::Spell::SendAuraUpdate::Init(bool IsFullUpdate, ObjectGuid Target, uint32 Count)
+{
+ _worldPacket.WriteBit(IsFullUpdate);
+ _worldPacket << Target;
+ _worldPacket << uint32(Count);
+}
+
+void WorldPackets::Spell::SendAuraUpdate::BuildUpdatePacket(AuraApplication* aurApp, bool remove, uint16 level)
+{
+ _worldPacket << uint8(aurApp->GetSlot());
+ _worldPacket.ResetBitPos();
+ _worldPacket.WriteBit(!remove);
+
+ if (remove)
+ return;
+
+ Aura const* aura = aurApp->GetBase();
+ _worldPacket << uint32(aura->GetId());
+
+ uint8 flags = aurApp->GetFlags();
+ if (aura->GetMaxDuration() > 0 && !(aura->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_HIDE_DURATION))
+ flags |= AFLAG_DURATION;
+ _worldPacket << uint8(flags);
+
+ _worldPacket << uint32(aurApp->GetEffectMask());
+
+ _worldPacket << uint16(level);
+
+ // send stack amount for aura which could be stacked (never 0 - causes incorrect display) or charges
+ // stack amount has priority over charges (checked on retail with spell 50262)
+ _worldPacket << uint8(aura->GetSpellInfo()->StackAmount ? aura->GetStackAmount() : aura->GetCharges());
+
+ uint32 int72 = 0;
+ _worldPacket << int72;
+
+ size_t pos = _worldPacket.wpos();
+ uint32 count = 0;
+ _worldPacket << count;
+
+ //for (int72)
+ // float
+
+ if (flags & AFLAG_SCALABLE)
+ {
+ for (AuraEffect const* effect : aura->GetAuraEffects())
+ {
+ if (effect && aurApp->HasEffect(effect->GetEffIndex())) // Not all of aura's effects have to be applied on every target
+ {
+ _worldPacket << int32(effect->GetAmount());
+ count++;
+ }
+ }
+ }
+
+ _worldPacket.put<uint32>(pos, count);
+
+ _worldPacket.ResetBitPos();
+
+ _worldPacket.WriteBit(!(flags & AFLAG_NOCASTER));
+ _worldPacket.WriteBit(aura->GetDuration());
+ _worldPacket.WriteBit(aura->GetMaxDuration());
+
+ if (!(flags & AFLAG_NOCASTER))
+ _worldPacket << aura->GetCasterGUID().WriteAsPacked();
+
+ if (aura->GetDuration())
+ {
+ _worldPacket << uint32(aura->GetDuration());
+ }
+
+ if (aura->GetMaxDuration())
+ {
+ _worldPacket << uint32(aura->GetMaxDuration());
+ }
+}
diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h
index dde50e46759..15b13f66eba 100644
--- a/src/server/game/Server/Packets/SpellPackets.h
+++ b/src/server/game/Server/Packets/SpellPackets.h
@@ -19,6 +19,7 @@
#define SpellPackets_h__
#include "Packet.h"
+#include "SpellAuras.h"
namespace WorldPackets
{
@@ -53,6 +54,16 @@ namespace WorldPackets
bool InitialLogin = false;
std::vector<uint32> KnownSpells;
};
+
+ class SendAuraUpdate final : public ServerPacket
+ {
+ public:
+ SendAuraUpdate() : ServerPacket(SMSG_AURA_UPDATE) { }
+
+ WorldPacket const* Write() override;
+ void Init(bool IsFullUpdate, ObjectGuid Target, uint32 Count);
+ void BuildUpdatePacket(AuraApplication* aurApp, bool remove, uint16 level);
+ };
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 118df977cd8..4711bf4f306 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -191,7 +191,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_GUILD_FILTER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarGuildFilter );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_REMOVE_EVENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarRemoveEvent );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_UPDATE_EVENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarUpdateEvent );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_AURA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelAuraOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_AURA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelAuraOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_AUTO_REPEAT_SPELL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelAutoRepeatSpellOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_CAST, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleCancelCastOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_CHANNELLING, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelChanneling );
@@ -200,7 +200,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_QUEUED_SPELL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_TEMP_ENCHANTMENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelTempEnchantmentOpcode);
DEFINE_HANDLER(CMSG_CANCEL_TRADE, STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT, PROCESS_THREADUNSAFE, WorldPackets::Trade::CancelTrade, &WorldSession::HandleCancelTradeOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_CAST_SPELL, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleCastSpellOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleCastSpellOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANGEPLAYER_DIFFICULTY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSeatsOnControlledVehicle);
DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_ANNOUNCEMENTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelAnnouncements );
@@ -726,8 +726,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_OWNER_NOTIFICATION, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_REMOVED_NOTIFICATION, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AURA_POINTS_DEPLETED, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_AURA_UPDATE, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_AURA_UPDATE_ALL, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AURA_UPDATE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_CHALLENGE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_RESPONSE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AVAILABLE_VOICE_CHANNEL, STATUS_UNHANDLED);
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index 65c33537ec6..be7f810eb6f 100644
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -141,7 +141,7 @@ enum OpcodeClient : uint32
CMSG_CANCEL_QUEUED_SPELL = 0xBADD,
CMSG_CANCEL_TEMP_ENCHANTMENT = 0xBADD,
CMSG_CANCEL_TRADE = 0x1159,
- CMSG_CAST_SPELL = 0xBADD,
+ CMSG_CAST_SPELL = 0x08FE,
CMSG_CHANGEPLAYER_DIFFICULTY = 0xBADD,
CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE = 0xBADD,
CMSG_CHANNEL_ANNOUNCEMENTS = 0xBADD,
@@ -725,7 +725,6 @@ enum OpcodeServer : uint32
SMSG_AURACASTLOG = 0xBADD,
SMSG_AURA_POINTS_DEPLETED = 0xBADD,
SMSG_AURA_UPDATE = 0x091C,
- SMSG_AURA_UPDATE_ALL = 0xBADD,
SMSG_AUTH_CHALLENGE = 0x1759,
SMSG_AUTH_RESPONSE = 0x0DA9,
SMSG_AVAILABLE_VOICE_CHANNEL = 0xBADD,
diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h
index 628e4e0721d..3c05c15a57d 100644
--- a/src/server/game/Spells/Auras/SpellAuraDefines.h
+++ b/src/server/game/Spells/Auras/SpellAuraDefines.h
@@ -23,14 +23,12 @@
enum AURA_FLAGS
{
AFLAG_NONE = 0x00,
- AFLAG_EFF_INDEX_0 = 0x01,
- AFLAG_EFF_INDEX_1 = 0x02,
- AFLAG_EFF_INDEX_2 = 0x04,
- AFLAG_CASTER = 0x08,
- AFLAG_POSITIVE = 0x10,
- AFLAG_DURATION = 0x20,
- AFLAG_ANY_EFFECT_AMOUNT_SENT = 0x40, // used with AFLAG_EFF_INDEX_0/1/2
- AFLAG_NEGATIVE = 0x80
+ AFLAG_NOCASTER = 0x01,
+ AFLAG_POSITIVE = 0x02,
+ AFLAG_DURATION = 0x04,
+ AFLAG_SCALABLE = 0x08,
+ AFLAG_NEGATIVE = 0x10,
+ AFLAG_UNK20 = 0x20
};
// these are modes, in which aura effect handler may be called
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index fef3cfc819c..819af225fe4 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -26,6 +26,7 @@
#include "Unit.h"
#include "Spell.h"
#include "SpellAuraEffects.h"
+#include "SpellPackets.h"
#include "DynamicObject.h"
#include "ObjectAccessor.h"
#include "Util.h"
@@ -39,7 +40,7 @@
AuraApplication::AuraApplication(Unit* target, Unit* caster, Aura* aura, uint32 effMask):
_target(target), _base(aura), _removeMode(AURA_REMOVE_NONE), _slot(MAX_AURAS),
-_flags(AFLAG_NONE), _effectsToApply(effMask), _needClientUpdate(false)
+_flags(AFLAG_NONE), _effectsToApply(effMask), _needClientUpdate(false), _effectMask(0)
{
ASSERT(GetTarget() && GetBase());
@@ -116,7 +117,7 @@ void AuraApplication::_Remove()
void AuraApplication::_InitFlags(Unit* caster, uint32 effMask)
{
// mark as selfcast if needed
- _flags |= (GetBase()->GetCasterGUID() == GetTarget()->GetGUID()) ? AFLAG_CASTER : AFLAG_NONE;
+ _flags |= (GetBase()->GetCasterGUID() == GetTarget()->GetGUID()) ? AFLAG_NONE : AFLAG_NOCASTER;
// aura is cast by self or an enemy
// one negative effect and we know aura is negative
@@ -150,7 +151,7 @@ void AuraApplication::_InitFlags(Unit* caster, uint32 effMask)
}
if (GetBase()->GetSpellInfo()->AttributesEx8 & SPELL_ATTR8_AURA_SEND_AMOUNT)
- _flags |= AFLAG_ANY_EFFECT_AMOUNT_SENT;
+ _flags |= AFLAG_SCALABLE;
}
void AuraApplication::_HandleEffect(uint8 effIndex, bool apply)
@@ -168,14 +169,14 @@ void AuraApplication::_HandleEffect(uint8 effIndex, bool apply)
if (apply)
{
- ASSERT(!(_flags & (1<<effIndex)));
- _flags |= 1<<effIndex;
+ ASSERT(!(_effectMask & (1<<effIndex)));
+ _effectMask |= 1<<effIndex;
aurEff->HandleEffect(this, AURA_EFFECT_HANDLE_REAL, true);
}
else
{
- ASSERT(_flags & (1<<effIndex));
- _flags &= ~(1<<effIndex);
+ ASSERT(_effectMask & (1<<effIndex));
+ _effectMask &= ~(1<<effIndex);
aurEff->HandleEffect(this, AURA_EFFECT_HANDLE_REAL, false);
// Remove all triggered by aura spells vs unlimited duration
@@ -198,7 +199,7 @@ void AuraApplication::BuildUpdatePacket(ByteBuffer& data, bool remove) const
Aura const* aura = GetBase();
data << uint32(aura->GetId());
- uint32 flags = _flags;
+ uint8 flags = _flags;
if (aura->GetMaxDuration() > 0 && !(aura->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_HIDE_DURATION))
flags |= AFLAG_DURATION;
data << uint16(flags);
@@ -207,7 +208,7 @@ void AuraApplication::BuildUpdatePacket(ByteBuffer& data, bool remove) const
// stack amount has priority over charges (checked on retail with spell 50262)
data << uint8(aura->GetSpellInfo()->StackAmount ? aura->GetStackAmount() : aura->GetCharges());
- if (!(flags & AFLAG_CASTER))
+ if (!(flags & AFLAG_NOCASTER))
data << aura->GetCasterGUID().WriteAsPacked();
if (flags & AFLAG_DURATION)
@@ -216,7 +217,7 @@ void AuraApplication::BuildUpdatePacket(ByteBuffer& data, bool remove) const
data << uint32(aura->GetDuration());
}
- if (flags & AFLAG_ANY_EFFECT_AMOUNT_SENT)
+ if (flags & AFLAG_SCALABLE)
for (AuraEffect const* effect : GetBase()->GetAuraEffects())
if (effect && HasEffect(effect->GetEffIndex())) // Not all of aura's effects have to be applied on every target
data << int32(effect->GetAmount());
@@ -226,11 +227,11 @@ void AuraApplication::ClientUpdate(bool remove)
{
_needClientUpdate = false;
- WorldPacket data(SMSG_AURA_UPDATE);
- data << GetTarget()->GetPackGUID();
- BuildUpdatePacket(data, remove);
+ WorldPackets::Spell::SendAuraUpdate update;
+ update.Init(false, GetTarget()->GetGUID(), 1);
+ update.BuildUpdatePacket(this, remove, GetTarget()->getLevel()); // TODO 6.x should be caster's level
- _target->SendMessageToSet(&data, true);
+ _target->SendMessageToSet(const_cast<WorldPacket*>(update.Write()), true);
}
uint32 Aura::BuildEffectMaskForOwner(SpellInfo const* spellProto, uint32 avalibleEffectMask, WorldObject* owner)
@@ -269,7 +270,7 @@ Aura* Aura::TryRefreshStackOrCreate(SpellInfo const* spellproto, uint32 tryEffMa
ASSERT(tryEffMask <= MAX_EFFECT_MASK);
if (refresh)
*refresh = false;
- uint8 effMask = Aura::BuildEffectMaskForOwner(spellproto, tryEffMask, owner);
+ uint32 effMask = Aura::BuildEffectMaskForOwner(spellproto, tryEffMask, owner);
if (!effMask)
return NULL;
if (Aura* foundAura = owner->ToUnit()->_TryStackingOrRefreshingExistingAura(spellproto, effMask, caster, baseAmount, castItem, casterGUID))
@@ -517,7 +518,7 @@ void Aura::UpdateTargetMap(Unit* caster, bool apply)
// fill up to date target list
// target, effMask
- std::map<Unit*, uint8> targets;
+ std::map<Unit*, uint32> targets;
FillTargetMap(targets, caster);
@@ -526,7 +527,7 @@ void Aura::UpdateTargetMap(Unit* caster, bool apply)
// mark all auras as ready to remove
for (ApplicationMap::iterator appIter = m_applications.begin(); appIter != m_applications.end();++appIter)
{
- std::map<Unit*, uint8>::iterator existing = targets.find(appIter->second->GetTarget());
+ std::map<Unit*, uint32>::iterator existing = targets.find(appIter->second->GetTarget());
// not found in current area - remove the aura
if (existing == targets.end())
targetsToRemove.push_back(appIter->second->GetTarget());
@@ -543,7 +544,7 @@ void Aura::UpdateTargetMap(Unit* caster, bool apply)
}
// register auras for units
- for (std::map<Unit*, uint8>::iterator itr = targets.begin(); itr!= targets.end();)
+ for (std::map<Unit*, uint32>::iterator itr = targets.begin(); itr!= targets.end();)
{
// aura mustn't be already applied on target
if (AuraApplication * aurApp = GetApplicationOfTarget(itr->first->GetGUID()))
@@ -636,7 +637,7 @@ void Aura::UpdateTargetMap(Unit* caster, bool apply)
return;
// apply aura effects for units
- for (std::map<Unit*, uint8>::iterator itr = targets.begin(); itr!= targets.end();++itr)
+ for (std::map<Unit*, uint32>::iterator itr = targets.begin(); itr!= targets.end();++itr)
{
if (AuraApplication * aurApp = GetApplicationOfTarget(itr->first->GetGUID()))
{
@@ -2317,7 +2318,7 @@ void UnitAura::Remove(AuraRemoveMode removeMode)
GetUnitOwner()->RemoveOwnedAura(this, removeMode);
}
-void UnitAura::FillTargetMap(std::map<Unit*, uint8> & targets, Unit* caster)
+void UnitAura::FillTargetMap(std::map<Unit*, uint32> & targets, Unit* caster)
{
for (SpellEffectInfo const* effect : GetSpellEffectInfos())
{
@@ -2377,7 +2378,7 @@ void UnitAura::FillTargetMap(std::map<Unit*, uint8> & targets, Unit* caster)
for (UnitList::iterator itr = targetList.begin(); itr!= targetList.end();++itr)
{
- std::map<Unit*, uint8>::iterator existing = targets.find(*itr);
+ std::map<Unit*, uint32>::iterator existing = targets.find(*itr);
if (existing != targets.end())
existing->second |= 1 << effect->EffectIndex;
else
@@ -2411,7 +2412,7 @@ void DynObjAura::Remove(AuraRemoveMode removeMode)
_Remove(removeMode);
}
-void DynObjAura::FillTargetMap(std::map<Unit*, uint8> & targets, Unit* /*caster*/)
+void DynObjAura::FillTargetMap(std::map<Unit*, uint32> & targets, Unit* /*caster*/)
{
Unit* dynObjOwnerCaster = GetDynobjOwner()->GetCaster();
float radius = GetDynobjOwner()->GetRadius();
@@ -2437,7 +2438,7 @@ void DynObjAura::FillTargetMap(std::map<Unit*, uint8> & targets, Unit* /*caster*
for (UnitList::iterator itr = targetList.begin(); itr!= targetList.end();++itr)
{
- std::map<Unit*, uint8>::iterator existing = targets.find(*itr);
+ std::map<Unit*, uint32>::iterator existing = targets.find(*itr);
if (existing != targets.end())
existing->second |= 1 << effect->EffectIndex;
else
diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h
index b3120b3dee6..c2c356efa4b 100644
--- a/src/server/game/Spells/Auras/SpellAuras.h
+++ b/src/server/game/Spells/Auras/SpellAuras.h
@@ -52,8 +52,9 @@ class AuraApplication
AuraRemoveMode _removeMode:8; // Store info for know remove aura reason
uint8 _slot; // Aura slot on unit
uint8 _flags; // Aura info flag
- uint8 _effectsToApply; // Used only at spell hit to determine which effect should be applied
+ uint32 _effectsToApply; // Used only at spell hit to determine which effect should be applied
bool _needClientUpdate:1;
+ uint32 _effectMask;
explicit AuraApplication(Unit* target, Unit* caster, Aura* base, uint32 effMask);
void _Remove();
@@ -67,10 +68,10 @@ class AuraApplication
uint8 GetSlot() const { return _slot; }
uint8 GetFlags() const { return _flags; }
- uint8 GetEffectMask() const { return _flags & (AFLAG_EFF_INDEX_0 | AFLAG_EFF_INDEX_1 | AFLAG_EFF_INDEX_2); }
- bool HasEffect(uint8 effect) const { ASSERT(effect < MAX_SPELL_EFFECTS); return (_flags & (1 << effect)) != 0; }
+ uint32 GetEffectMask() const { return _effectMask; }
+ bool HasEffect(uint8 effect) const { ASSERT(effect < MAX_SPELL_EFFECTS); return (_effectMask & (1 << effect)) != 0; }
bool IsPositive() const { return (_flags & AFLAG_POSITIVE) != 0; }
- bool IsSelfcast() const { return (_flags & AFLAG_CASTER) != 0; }
+ bool IsSelfcast() const { return (_flags & AFLAG_NOCASTER) == 0; }
uint8 GetEffectsToApply() const { return _effectsToApply; }
void SetRemoveMode(AuraRemoveMode mode) { _removeMode = mode; }
@@ -113,7 +114,7 @@ class Aura
void _Remove(AuraRemoveMode removeMode);
virtual void Remove(AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT) = 0;
- virtual void FillTargetMap(std::map<Unit*, uint8> & targets, Unit* caster) = 0;
+ virtual void FillTargetMap(std::map<Unit*, uint32> & targets, Unit* caster) = 0;
void UpdateTargetMap(Unit* caster, bool apply = true);
void _RegisterForTargets() {Unit* caster = GetCaster(); UpdateTargetMap(caster, false);}
@@ -294,7 +295,7 @@ class UnitAura : public Aura
void Remove(AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT) override;
- void FillTargetMap(std::map<Unit*, uint8> & targets, Unit* caster) override;
+ void FillTargetMap(std::map<Unit*, uint32> & targets, Unit* caster) override;
// Allow Apply Aura Handler to modify and access m_AuraDRGroup
void SetDiminishGroup(DiminishingGroup group) { m_AuraDRGroup = group; }
@@ -312,7 +313,7 @@ class DynObjAura : public Aura
void Remove(AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT) override;
- void FillTargetMap(std::map<Unit*, uint8> & targets, Unit* caster) override;
+ void FillTargetMap(std::map<Unit*, uint32> & targets, Unit* caster) override;
};
class ChargeDropEvent : public BasicEvent