diff options
author | Vincent-Michael <Vincent_Michael@gmx.de> | 2013-08-12 21:56:39 +0200 |
---|---|---|
committer | Vincent-Michael <Vincent_Michael@gmx.de> | 2013-08-12 21:57:19 +0200 |
commit | dd171f6070d6c54e54d973bdc20de7dd23fe62a7 (patch) | |
tree | bccaf31664970471d69e96548b51f4a5161f6875 /src/server/game/Handlers/PetHandler.cpp | |
parent | faa2ec9732f8ac22e9e62087bd7199c739607bc9 (diff) |
Core/Vehicle: Fix spell focus check for vehicle caster
Diffstat (limited to 'src/server/game/Handlers/PetHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/PetHandler.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 84bdaf4104f..e2cbd5829dc 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -32,6 +32,8 @@ #include "Group.h" #include "SpellInfo.h" #include "Player.h" +#include "GridNotifiers.h" +#include "GridNotifiersImpl.h" void WorldSession::HandleDismissCritter(WorldPacket& recvData) { @@ -778,6 +780,27 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket) return; } + // check spell focus object + if (spellInfo->RequiresSpellFocus && caster->IsVehicle()) + { + CellCoord p(Trinity::ComputeCellCoord(caster->GetPositionX(), caster->GetPositionY())); + Cell cell(p); + + GameObject* ok = NULL; + Trinity::GameObjectFocusCheck goCheck(caster, spellInfo->RequiresSpellFocus); + Trinity::GameObjectSearcher<Trinity::GameObjectFocusCheck> checker(caster, ok, goCheck); + + TypeContainerVisitor<Trinity::GameObjectSearcher<Trinity::GameObjectFocusCheck>, GridTypeMapContainer > objectChecker(checker); + Map& map = *caster->GetMap(); + cell.Visit(p, objectChecker, map, *caster, caster->GetVisibilityRange()); + + if (!ok) + { + caster->SendPetCastFail(spellId, SPELL_FAILED_REQUIRES_SPELL_FOCUS); + return; + } + } + // do not cast not learned spells if (!caster->HasSpell(spellId) || spellInfo->IsPassive()) return; @@ -798,6 +821,7 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket) result = spell->CheckPetCast(caster->m_movedPlayer->GetSelectedUnit()); else result = spell->CheckPetCast(NULL); + if (result == SPELL_CAST_OK) { if (caster->GetTypeId() == TYPEID_UNIT) |