aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/Spell.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2014-05-17 14:20:35 +0200
committerShauren <shauren.trinity@gmail.com>2014-05-17 14:20:35 +0200
commit1094783715c16faf7553d2391b8bf23bfc51524d (patch)
tree98ac29f4b341d05ff144492c66ba3406c30d136d /src/server/game/Spells/Spell.cpp
parent81b8deef529517a1f13397ff2aa13154bccf86c9 (diff)
parent4136f3c974d2b08e1e9098fe9ab410db9a6aebd4 (diff)
Merge branch '4.3.4' of github.com:TrinityCore/TrinityCore into 4.3.4
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
-rw-r--r--src/server/game/Spells/Spell.cpp55
1 files changed, 48 insertions, 7 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 6f309a148ce..6ec5e5d5f8f 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -573,6 +573,7 @@ m_caster((info->AttributesEx6 & SPELL_ATTR6_CAST_BY_CHARMER && caster->GetCharme
m_CastItem = NULL;
m_castItemGUID = 0;
+ m_castItemEntry = 0;
unitTarget = NULL;
itemTarget = NULL;
@@ -1243,8 +1244,12 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici
float angle = float(rand_norm()) * static_cast<float>(M_PI * 35.0f / 180.0f) - static_cast<float>(M_PI * 17.5f / 180.0f);
m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE, dist, angle);
- float ground = z;
- float liquidLevel = m_caster->GetMap()->GetWaterOrGroundLevel(x, y, z, &ground);
+ float ground = m_caster->GetMap()->GetHeight(m_caster->GetPhaseMask(), x, y, z, true, 50.0f);
+ float liquidLevel = VMAP_INVALID_HEIGHT_VALUE;
+ LiquidData liquidData;
+ if (m_caster->GetMap()->getLiquidStatus(x, y, z, MAP_ALL_LIQUIDS, &liquidData))
+ liquidLevel = liquidData.level;
+
if (liquidLevel <= ground) // When there is no liquid Map::GetWaterOrGroundLevel returns ground level
{
SendCastResult(SPELL_FAILED_NOT_HERE);
@@ -2808,9 +2813,15 @@ bool Spell::UpdateChanneledTargetList()
void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggeredByAura)
{
if (m_CastItem)
+ {
m_castItemGUID = m_CastItem->GetGUID();
+ m_castItemEntry = m_CastItem->GetEntry();
+ }
else
+ {
m_castItemGUID = 0;
+ m_castItemEntry = 0;
+ }
InitExplicitTargets(*targets);
@@ -3024,7 +3035,12 @@ void Spell::cancel()
void Spell::cast(bool skipCheck)
{
// update pointers base at GUIDs to prevent access to non-existed already object
- UpdatePointers();
+ if (!UpdatePointers())
+ {
+ // cancel the spell if UpdatePointers() returned false, something wrong happened there
+ cancel();
+ return;
+ }
// cancel at lost explicit target during cast
if (m_targets.GetObjectTargetGUID() && !m_targets.GetObjectTarget())
@@ -3274,7 +3290,12 @@ void Spell::handle_immediate()
uint64 Spell::handle_delayed(uint64 t_offset)
{
- UpdatePointers();
+ if (!UpdatePointers())
+ {
+ // finish the spell if UpdatePointers() returned false, something wrong happened there
+ finish(false);
+ return 0;
+ }
if (m_caster->GetTypeId() == TYPEID_PLAYER)
m_caster->ToPlayer()->SetSpellModTakingSpell(this, true);
@@ -3429,7 +3450,12 @@ void Spell::SendSpellCooldown()
void Spell::update(uint32 difftime)
{
// update pointers based at it's GUIDs
- UpdatePointers();
+ if (!UpdatePointers())
+ {
+ // cancel the spell if UpdatePointers() returned false, something wrong happened there
+ cancel();
+ return;
+ }
if (m_targets.GetUnitTargetGUID() && !m_targets.GetUnitTarget())
{
@@ -4283,6 +4309,8 @@ void Spell::TakeCastItem()
m_targets.SetItemTarget(NULL);
m_CastItem = NULL;
+ m_castItemGUID = 0;
+ m_castItemEntry = 0;
}
}
@@ -4521,6 +4549,8 @@ void Spell::TakeReagents()
}
m_CastItem = NULL;
+ m_castItemGUID = 0;
+ m_castItemEntry = 0;
}
// if GetItemTarget is also spell reagent
@@ -6336,7 +6366,7 @@ void Spell::DelayedChannel()
SendChannelUpdate(m_timer);
}
-void Spell::UpdatePointers()
+bool Spell::UpdatePointers()
{
if (m_originalCasterGUID == m_caster->GetGUID())
m_originalCaster = m_caster;
@@ -6348,13 +6378,22 @@ void Spell::UpdatePointers()
}
if (m_castItemGUID && m_caster->GetTypeId() == TYPEID_PLAYER)
+ {
m_CastItem = m_caster->ToPlayer()->GetItemByGuid(m_castItemGUID);
+ // cast item not found, somehow the item is no longer where we expected
+ if (!m_CastItem)
+ return false;
+
+ // check if the item is really the same, in case it has been wrapped for example
+ if (m_castItemEntry != m_CastItem->GetEntry())
+ return false;
+ }
m_targets.Update(m_caster);
// further actions done only for dest targets
if (!m_targets.HasDst())
- return;
+ return true;
// cache last transport
WorldObject* transport = NULL;
@@ -6375,6 +6414,8 @@ void Spell::UpdatePointers()
dest._position.RelocateOffset(dest._transportOffset);
}
}
+
+ return true;
}
CurrentSpellTypes Spell::GetCurrentContainer() const