aboutsummaryrefslogtreecommitdiff
path: root/src/game/SpellEffects.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/SpellEffects.cpp')
-rw-r--r--src/game/SpellEffects.cpp17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index 739fa96cee2..daf05ec51a0 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -3490,6 +3490,9 @@ void Spell::EffectPickPocket(uint32 /*i*/)
void Spell::EffectAddFarsight(uint32 i)
{
+ if (m_caster->GetTypeId() != TYPEID_PLAYER)
+ return;
+
float radius = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
int32 duration = GetSpellDuration(m_spellInfo);
DynamicObject* dynObj = new DynamicObject;
@@ -3501,8 +3504,18 @@ void Spell::EffectAddFarsight(uint32 i)
dynObj->SetUInt32Value(OBJECT_FIELD_TYPE, 65);
dynObj->SetUInt32Value(DYNAMICOBJECT_BYTES, 0x80000002);
m_caster->AddDynObject(dynObj);
- MapManager::Instance().GetMap(dynObj->GetMapId(), dynObj)->Add(dynObj);
- m_caster->SetUInt64Value(PLAYER_FARSIGHT, dynObj->GetGUID());
+
+ CellPair pair = Trinity::ComputeCellPair(dynObj->GetPositionX(), dynObj->GetPositionY());
+ Cell cell(pair);
+ Map* map = MapManager::Instance().GetMap(dynObj->GetMapId(), dynObj);
+ map->LoadGrid(cell); // In case the spell is casted into a different grid by player
+ map->Add(dynObj);
+ map->SwitchGridContainers(dynObj, true); // Needed for forwarding player packets
+ dynObj->setActive(true); // Keep the grid updated even if there are no players in it
+
+ // Need to update visibility of object for client to accept farsight guid
+ ((Player*)m_caster)->UpdateVisibilityOf(dynObj);
+ ((Player*)m_caster)->SetFarsightTarget(dynObj);
}
void Spell::EffectSummonWild(uint32 i)