aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/PetHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Handlers/PetHandler.cpp')
-rw-r--r--src/server/game/Handlers/PetHandler.cpp24
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)