diff options
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) |