diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Entities/Player/Player.h | 15 | ||||
-rwxr-xr-x | src/server/game/Handlers/SpellHandler.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 47 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.h | 1 | ||||
-rwxr-xr-x | src/server/game/Spells/Auras/SpellAuras.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 7 |
7 files changed, 74 insertions, 15 deletions
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index e785a7aa537..ccdea8654e8 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2605,6 +2605,19 @@ class Player : public Unit, public GridObject<Player> VoidStorageItem* GetVoidStorageItem(uint8 slot) const; VoidStorageItem* GetVoidStorageItem(uint64 id, uint8& slot) const; + // SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS handling + void AddSpellSwap(uint32 oldSpell, uint32 newSpell) { _spellSwaps[oldSpell] = newSpell; } + void RemoveSpellSwap(uint32 originalSpell) { _spellSwaps.erase(originalSpell); } + + uint32 GetSpellForCast(uint32 spellId) const + { + std::map<uint32, uint32>::const_iterator itr = _spellSwaps.find(spellId); + if (itr != _spellSwaps.end()) + return itr->second; + + return spellId; + } + protected: // Gamemaster whisper whitelist WhisperListContainer WhisperList; @@ -2933,6 +2946,8 @@ class Player : public Unit, public GridObject<Player> InstanceTimeMap _instanceResetTimes; uint32 _pendingBindId; uint32 _pendingBindTimer; + + std::map<uint32, uint32> _spellSwaps; }; void AddItemsSetItem(Player*player, Item* item); diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 31cce5b7239..b772db626f0 100755 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -350,8 +350,10 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) return; } - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); + if (Player* plrMover = mover->ToPlayer()) + spellId = plrMover->GetSpellForCast(spellId); + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); if (!spellInfo) { sLog->outError(LOG_FILTER_NETWORKIO, "WORLD: unknown spell id %u", spellId); @@ -362,7 +364,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) if (mover->GetTypeId() == TYPEID_PLAYER) { // not have spell in spellbook or spell passive and not casted by client - if (!mover->ToPlayer()->HasActiveSpell (spellId) || spellInfo->IsPassive()) + if (!mover->ToPlayer()->HasActiveSpell(spellId) || spellInfo->IsPassive()) { //cheater? kick? ban? recvPacket.rfinish(); // prevent spam at ignore packet diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index f7afab7ceb0..4ce914cfdc5 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -385,8 +385,8 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //329 SPELL_AURA_MOD_RUNE_REGEN_SPEED &AuraEffect::HandleNULL, //330 SPELL_AURA_CAST_WHILE_WALKING &AuraEffect::HandleNULL, //331 SPELL_AURA_331 - &AuraEffect::HandleNULL, //332 SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS - &AuraEffect::HandleNULL, //333 SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS_2 + &AuraEffect::HandleOverrideActionbar, //332 SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS + &AuraEffect::HandleOverrideActionbar, //333 SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS_2 &AuraEffect::HandleNULL, //334 SPELL_AURA_334 &AuraEffect::HandleNULL, //335 SPELL_AURA_335 &AuraEffect::HandleNULL, //336 SPELL_AURA_MOD_FLYING_RESTRICTIONS @@ -5675,6 +5675,49 @@ void AuraEffect::HandlePreventResurrection(AuraApplication const* aurApp, uint8 aurApp->GetTarget()->SetByteFlag(PLAYER_FIELD_BYTES, 0, PLAYER_FIELD_BYTE_RELEASE_TIMER); } +void AuraEffect::HandleOverrideActionbar(AuraApplication const* aurApp, uint8 mode, bool apply) const +{ + if (!(mode & AURA_EFFECT_HANDLE_REAL)) + return; + + Player* target = aurApp->GetTarget()->ToPlayer(); + if (!target) + return; + + uint32 newSpellId = uint32(GetAmount()); + if (!sSpellMgr->GetSpellInfo(newSpellId)) + return; + + bool foundAny = false; + PlayerSpellMap const& spells = target->GetSpellMap(); + for (PlayerSpellMap::const_iterator itr = spells.begin(); itr != spells.end(); ++itr) + { + if (itr->second->state == PLAYERSPELL_REMOVED) + continue; + + if (!itr->second->active || itr->second->disabled) + continue; + + SpellInfo const* info = sSpellMgr->GetSpellInfo(itr->first); + if (!IsAffectingSpell(info)) + continue; + + foundAny = true; + if (apply) + target->AddSpellSwap(itr->first, newSpellId); + else + target->RemoveSpellSwap(itr->first); + } + + if (foundAny) + { + if (apply) + target->AddTemporarySpell(newSpellId); + else + target->RemoveTemporarySpell(newSpellId); + } +} + void AuraEffect::HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const { switch (GetSpellInfo()->SpellFamilyName) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index 28a5beafa2c..5a85012f857 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -280,6 +280,7 @@ class AuraEffect void HandleAuraOverrideSpells(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraSetVehicle(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandlePreventResurrection(AuraApplication const* aurApp, uint8 mode, bool apply) const; + void HandleOverrideActionbar(AuraApplication const* aurApp, uint8 mode, bool apply) const; // aura effect periodic tick handlers void HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const; diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 3394d46fadf..be3f33bb5f1 100755 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -148,15 +148,8 @@ void AuraApplication::_InitFlags(Unit* caster, uint8 effMask) _flags |= positiveFound ? AFLAG_POSITIVE : AFLAG_NEGATIVE; } - // there are more auras that require this flag, this is just the beginning - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - { - if (((1 << i) & effMask) && GetBase()->GetSpellInfo()->Effects[i].ApplyAuraName == SPELL_AURA_MOUNTED) - { - _flags |= AFLAG_ANY_EFFECT_AMOUNT_SENT; - break; - } - } + if (GetBase()->GetSpellInfo()->AttributesCu & SPELL_ATTR0_CU_SCALABLE) + _flags |= AFLAG_ANY_EFFECT_AMOUNT_SENT; } void AuraApplication::_HandleEffect(uint8 effIndex, bool apply) diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index a338b8d627f..46f9906c4de 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -175,7 +175,7 @@ enum SpellCustomAttributes SPELL_ATTR0_CU_CONE_LINE = 0x00000004, SPELL_ATTR0_CU_SHARE_DAMAGE = 0x00000008, SPELL_ATTR0_CU_NO_INITIAL_THREAT = 0x00000010, - SPELL_ATTR0_CU_NONE2 = 0x00000020, // UNUSED + SPELL_ATTR0_CU_SCALABLE = 0x00000020, SPELL_ATTR0_CU_AURA_CC = 0x00000040, SPELL_ATTR0_CU_DIRECT_DAMAGE = 0x00000100, SPELL_ATTR0_CU_CHARGE = 0x00000200, diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index e887f8caa22..a1df9b997ef 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2612,7 +2612,7 @@ void SpellMgr::LoadSpellInfoStore() mSpellInfoMap[i] = new SpellInfo(spellEntry); } - sLog->outInfo(LOG_FILTER_SPELLS_AURAS, ">> Loaded spell custom attributes in %u ms", GetMSTimeDiffToNow(oldMSTime)); + sLog->outInfo(LOG_FILTER_SPELLS_AURAS, ">> Loaded spell info store in %u ms", GetMSTimeDiffToNow(oldMSTime)); } @@ -2670,6 +2670,11 @@ void SpellMgr::LoadSpellCustomAttr() case SPELL_AURA_POWER_BURN: spellInfo->AttributesCu |= SPELL_ATTR0_CU_NO_INITIAL_THREAT; break; + case SPELL_AURA_MOUNTED: + case SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS: + case SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS_2: + spellInfo->AttributesCu |= SPELL_ATTR0_CU_SCALABLE; + break; } switch (spellInfo->Effects[j].Effect) |