diff options
author | Rat <gmstreetrat@gmail.com> | 2014-11-29 12:48:12 +0100 |
---|---|---|
committer | Rat <gmstreetrat@gmail.com> | 2014-11-29 12:48:12 +0100 |
commit | 8c4761e820d1185afb3d6384c47e0a53dce42fbc (patch) | |
tree | 99e24f51c92249b85a3210190b44026f7b68cceb /src | |
parent | ce5b683a073dd62988dc0c0a18798513252dabe6 (diff) |
Core/Spells: more work on auras
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Handlers/GroupHandler.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.cpp | 82 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.h | 11 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 3 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraDefines.h | 14 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 47 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.h | 15 |
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 |