aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent-Michael <Vincent_Michael@gmx.de>2014-05-04 04:24:59 +0200
committerVincent-Michael <Vincent_Michael@gmx.de>2014-05-04 04:24:59 +0200
commit5e3e431b0694d0df2b60f67b68a76a41dba30963 (patch)
tree330c0c29f6be2e8f38d14a727e39024ad01f6ecf
parent13ec761ad2cc2aec24f850520f459bb124050a34 (diff)
parent2cd0388adf67063af18706b5caef41ee22aedd49 (diff)
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
-rw-r--r--sql/updates/world/2014_05_04_00_world_creature_template.sql2
-rw-r--r--src/server/game/Spells/Spell.cpp34
-rw-r--r--src/server/game/Spells/Spell.h2
-rw-r--r--src/server/game/Spells/SpellEffects.cpp3
4 files changed, 35 insertions, 6 deletions
diff --git a/sql/updates/world/2014_05_04_00_world_creature_template.sql b/sql/updates/world/2014_05_04_00_world_creature_template.sql
new file mode 100644
index 00000000000..c0bc62b8a0e
--- /dev/null
+++ b/sql/updates/world/2014_05_04_00_world_creature_template.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `creature_template` SET `flags_extra`=0 WHERE `entry`=26918;
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 6f309a148ce..a9961e06cbc 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -3024,7 +3024,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 +3279,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 +3439,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 +4298,7 @@ void Spell::TakeCastItem()
m_targets.SetItemTarget(NULL);
m_CastItem = NULL;
+ m_castItemGUID = 0;
}
}
@@ -4521,6 +4537,7 @@ void Spell::TakeReagents()
}
m_CastItem = NULL;
+ m_castItemGUID = 0;
}
// if GetItemTarget is also spell reagent
@@ -6336,7 +6353,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 +6365,18 @@ 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;
+ }
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 +6397,8 @@ void Spell::UpdatePointers()
dest._position.RelocateOffset(dest._transportOffset);
}
}
+
+ return true;
}
CurrentSpellTypes Spell::GetCurrentContainer() const
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 65ff9f7551d..94e1ea44ce7 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -491,7 +491,7 @@ class Spell
SpellInfo const* GetSpellInfo() const { return m_spellInfo; }
int32 GetPowerCost() const { return m_powerCost; }
- void UpdatePointers(); // must be used at call Spell code after time delay (non triggered spell cast/update spell call/etc)
+ bool UpdatePointers(); // must be used at call Spell code after time delay (non triggered spell cast/update spell call/etc)
void CleanupTargetList();
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index d2fa8650c13..041757d152d 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -1933,6 +1933,7 @@ void Spell::EffectSummonChangeItem(SpellEffIndex effIndex)
m_targets.SetItemTarget(NULL);
m_CastItem = NULL;
+ m_castItemGUID = 0;
player->StoreItem(dest, pNewItem, true);
return;
@@ -1951,6 +1952,7 @@ void Spell::EffectSummonChangeItem(SpellEffIndex effIndex)
m_targets.SetItemTarget(NULL);
m_CastItem = NULL;
+ m_castItemGUID = 0;
player->BankItem(dest, pNewItem, true);
return;
@@ -1973,6 +1975,7 @@ void Spell::EffectSummonChangeItem(SpellEffIndex effIndex)
m_targets.SetItemTarget(NULL);
m_CastItem = NULL;
+ m_castItemGUID = 0;
player->EquipItem(dest, pNewItem, true);
player->AutoUnequipOffhandIfNeed();