aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/SpellHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Handlers/SpellHandler.cpp')
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp39
1 files changed, 22 insertions, 17 deletions
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp
index d3468f38983..c98a9fbcb5c 100644
--- a/src/server/game/Handlers/SpellHandler.cpp
+++ b/src/server/game/Handlers/SpellHandler.cpp
@@ -345,7 +345,6 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
return;
}
-
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
if (!spellInfo)
{
@@ -354,25 +353,31 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
return;
}
- if (mover->GetTypeId() == TYPEID_PLAYER)
+ if (spellInfo->IsPassive())
{
- // not have spell in spellbook or spell passive and not casted by client
- if (!mover->ToPlayer()->HasActiveSpell(spellId) || spellInfo->IsPassive())
- {
- //cheater? kick? ban?
- recvPacket.rfinish(); // prevent spam at ignore packet
- return;
- }
+ recvPacket.rfinish(); // prevent spam at ignore packet
+ return;
}
- else
+
+ Unit* caster = mover;
+ if (caster->GetTypeId() == TYPEID_UNIT && !caster->ToCreature()->HasSpell(spellId))
{
- // not have spell in spellbook or spell passive and not casted by client
- if ((mover->GetTypeId() == TYPEID_UNIT && !mover->ToCreature()->HasSpell(spellId)) || spellInfo->IsPassive())
+ // If the vehicle creature does not have the spell but it allows the passenger to cast own spells
+ // change caster to player and let him cast
+ if (!_player->IsOnVehicle(caster) || spellInfo->CheckVehicle(_player) != SPELL_CAST_OK)
{
- //cheater? kick? ban?
recvPacket.rfinish(); // prevent spam at ignore packet
return;
}
+
+ caster = _player;
+ }
+
+ if (caster->GetTypeId() == TYPEID_PLAYER && !caster->ToPlayer()->HasActiveSpell(spellId))
+ {
+ // not have spell in spellbook
+ recvPacket.rfinish(); // prevent spam at ignore packet
+ return;
}
Unit::AuraEffectList swaps = mover->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS);
@@ -398,8 +403,8 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
// Client is resending autoshot cast opcode when other spell is casted during shoot rotation
// Skip it to prevent "interrupt" message
- if (spellInfo->IsAutoRepeatRangedSpell() && _player->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL)
- && _player->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL)->m_spellInfo == spellInfo)
+ if (spellInfo->IsAutoRepeatRangedSpell() && caster->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL)
+ && caster->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL)->m_spellInfo == spellInfo)
{
recvPacket.rfinish();
return;
@@ -414,7 +419,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
// client provided targets
SpellCastTargets targets;
- targets.Read(recvPacket, mover);
+ targets.Read(recvPacket, caster);
HandleClientCastFlags(recvPacket, castFlags, targets);
// auto-selection buff level base at target level (in spellInfo)
@@ -427,7 +432,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
spellInfo = actualSpellInfo;
}
- Spell* spell = new Spell(mover, spellInfo, TRIGGERED_NONE, 0, false);
+ Spell* spell = new Spell(caster, spellInfo, TRIGGERED_NONE, 0, false);
spell->m_cast_count = castCount; // set count of casts
spell->m_glyphIndex = glyphIndex;
spell->prepare(&targets);