aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Entities/Player/Player.h15
-rwxr-xr-xsrc/server/game/Handlers/SpellHandler.cpp6
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp47
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.h1
-rwxr-xr-xsrc/server/game/Spells/Auras/SpellAuras.cpp11
-rw-r--r--src/server/game/Spells/SpellInfo.h2
-rw-r--r--src/server/game/Spells/SpellMgr.cpp7
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)