aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorQAston <qaston@gmail.com>2011-06-23 13:28:52 +0200
committerQAston <qaston@gmail.com>2011-06-23 13:28:52 +0200
commit3137a82c7cedb71f4a8ef06cb2d6e5741af65c9b (patch)
tree2c2345632592f55129ddd931e8b97391b0e2efb8 /src
parent9d9472e5cc2f761fbc93f8f0e87903898bf48b91 (diff)
Core/Spells: Cleanup in Spell.h:
- Codestyle (fix function naming) and cleanup changes in SpellCastTargets class, also access variables of this class by getters/setters - Move IsQuestTameSpell function to SpellMgr.h - Move UnitList typedef to Unit.h Additionally - add missing copyright notice to SpellAuraEffects.h
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/AI/CoreAI/PetAI.cpp2
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp10
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.h2
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/PetHandler.cpp6
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/SpellHandler.cpp23
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/TradeHandler.cpp4
-rwxr-xr-xsrc/server/game/Spells/Auras/SpellAuraEffects.cpp5
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.h18
-rwxr-xr-xsrc/server/game/Spells/Spell.cpp712
-rwxr-xr-xsrc/server/game/Spells/Spell.h162
-rwxr-xr-xsrc/server/game/Spells/SpellEffects.cpp106
-rwxr-xr-xsrc/server/game/Spells/SpellMgr.h5
-rwxr-xr-xsrc/server/game/Spells/SpellScript.cpp15
-rwxr-xr-xsrc/server/game/Spells/SpellScript.h4
-rw-r--r--src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp3
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp5
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp2
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp10
19 files changed, 569 insertions, 527 deletions
diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp
index a4cc49bf850..3f4c467d79e 100755
--- a/src/server/game/AI/CoreAI/PetAI.cpp
+++ b/src/server/game/AI/CoreAI/PetAI.cpp
@@ -212,7 +212,7 @@ void PetAI::UpdateAI(const uint32 diff)
targetSpellStore.erase(targetSpellStore.begin() + index);
SpellCastTargets targets;
- targets.setUnitTarget(target);
+ targets.SetUnitTarget(target);
if (!me->HasInArc(M_PI, target))
{
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 8c7536babd4..02da95581c0 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -845,7 +845,7 @@ void Unit::CastSpell(Unit* Victim, SpellEntry const *spellInfo, bool triggered,
originalCaster=owner->GetGUID();
SpellCastTargets targets;
- targets.setUnitTarget(Victim);
+ targets.SetUnitTarget(Victim);
if (castItem)
sLog->outStaticDebug("WORLD: cast Item spellId - %i", spellInfo->Id);
@@ -888,7 +888,7 @@ void Unit::CastCustomSpell(uint32 spellId, CustomSpellValues const &value, Unit*
}
SpellCastTargets targets;
- targets.setUnitTarget(Victim);
+ targets.SetUnitTarget(Victim);
if (!originalCaster && triggeredByAura)
originalCaster = triggeredByAura->GetCasterGUID();
@@ -927,9 +927,9 @@ void Unit::CastSpell(float x, float y, float z, uint32 spellId, bool triggered,
Spell* spell = new Spell(this, spellInfo, triggered, originalCaster);
SpellCastTargets targets;
- targets.setDst(x, y, z, GetOrientation());
+ targets.SetDst(x, y, z, GetOrientation());
if (OriginalVictim)
- targets.setUnitTarget(OriginalVictim);
+ targets.SetUnitTarget(OriginalVictim);
spell->m_CastItem = castItem;
spell->prepare(&targets, triggeredByAura);
}
@@ -963,7 +963,7 @@ void Unit::CastSpell(GameObject *go, uint32 spellId, bool triggered, Item *castI
Spell* spell = new Spell(this, spellInfo, triggered, originalCaster);
SpellCastTargets targets;
- targets.setGOTarget(go);
+ targets.SetGOTarget(go);
spell->m_CastItem = castItem;
spell->prepare(&targets, triggeredByAura);
}
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 4497a9ea61c..52e85b2e3db 100755
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -338,6 +338,8 @@ class Totem;
class Transport;
class Vehicle;
+typedef std::list<Unit*> UnitList;
+
struct SpellImmune
{
uint32 type;
diff --git a/src/server/game/Server/Protocol/Handlers/PetHandler.cpp b/src/server/game/Server/Protocol/Handlers/PetHandler.cpp
index 0c969c49184..625ce518e28 100755
--- a/src/server/game/Server/Protocol/Handlers/PetHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/PetHandler.cpp
@@ -332,7 +332,7 @@ void WorldSession::HandlePetActionHelper(Unit *pet, uint64 guid1, uint16 spellid
if (unit_target->GetTypeId() == TYPEID_PLAYER)
pet->SendUpdateToPlayer((Player*)unit_target);
}
- else if (Unit *unit_target2 = spell->m_targets.getUnitTarget())
+ else if (Unit *unit_target2 = spell->m_targets.GetUnitTarget())
{
pet->SetInFront(unit_target2);
if (unit_target2->GetTypeId() == TYPEID_PLAYER)
@@ -348,7 +348,7 @@ void WorldSession::HandlePetActionHelper(Unit *pet, uint64 guid1, uint16 spellid
{
pet->ToCreature()->AddCreatureSpellCooldown(spellid);
- unit_target = spell->m_targets.getUnitTarget();
+ unit_target = spell->m_targets.GetUnitTarget();
//10% chance to play special pet attack talk, else growl
//actually this only seems to happen on special spells, fire shield for imp, torment for voidwalker, but it's stupid to check every spell
@@ -769,7 +769,7 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket)
return;
SpellCastTargets targets;
- targets.read(recvPacket, caster);
+ targets.Read(recvPacket, caster);
HandleClientCastFlags(recvPacket, castFlags, targets);
caster->ClearUnitState(UNIT_STAT_FOLLOW);
diff --git a/src/server/game/Server/Protocol/Handlers/SpellHandler.cpp b/src/server/game/Server/Protocol/Handlers/SpellHandler.cpp
index e2f7f19ce79..b127831bad5 100755
--- a/src/server/game/Server/Protocol/Handlers/SpellHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/SpellHandler.cpp
@@ -32,14 +32,19 @@
#include "ScriptMgr.h"
#include "GameObjectAI.h"
-void WorldSession::HandleClientCastFlags(WorldPacket& recvPacket, uint8 castFlags, SpellCastTargets & targets)
+void WorldSession::HandleClientCastFlags(WorldPacket& recvPacket, uint8 castFlags, SpellCastTargets& targets)
{
// some spell cast packet including more data (for projectiles?)
if (castFlags & 0x02)
{
// not sure about these two
- recvPacket >> targets.m_elevation;
- recvPacket >> targets.m_speed;
+ float elevation, speed;
+ recvPacket >> elevation;
+ recvPacket >> speed;
+
+ targets.SetElevation(elevation);
+ targets.SetSpeed(speed);
+
uint8 hasMovementData;
recvPacket >> hasMovementData;
if (hasMovementData)
@@ -156,10 +161,10 @@ void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket)
}
SpellCastTargets targets;
- targets.read(recvPacket, pUser);
+ targets.Read(recvPacket, pUser);
HandleClientCastFlags(recvPacket, castFlags, targets);
- if (!pItem->IsTargetValidForItemUse(targets.getUnitTarget()))
+ if (!pItem->IsTargetValidForItemUse(targets.GetUnitTarget()))
{
// free gray item after use fail
pUser->SendEquipError(EQUIP_ERR_NONE, pItem, NULL);
@@ -168,7 +173,7 @@ void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket)
if (SpellEntry const* spellInfo = sSpellStore.LookupEntry(spellId))
{
// for implicit area/coord target spells
- if (!targets.getUnitTarget())
+ if (!targets.GetUnitTarget())
Spell::SendCastResult(_player, spellInfo, castCount, SPELL_FAILED_NO_VALID_TARGETS);
// for explicit target spells
else
@@ -384,13 +389,13 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
// client provided targets
SpellCastTargets targets;
- targets.read(recvPacket, mover);
+ targets.Read(recvPacket, mover);
HandleClientCastFlags(recvPacket, castFlags, targets);
// auto-selection buff level base at target level (in spellInfo)
- if (targets.getUnitTarget())
+ if (targets.GetUnitTarget())
{
- SpellEntry const *actualSpellInfo = sSpellMgr->SelectAuraRankForPlayerLevel(spellInfo, targets.getUnitTarget()->getLevel());
+ SpellEntry const *actualSpellInfo = sSpellMgr->SelectAuraRankForPlayerLevel(spellInfo, targets.GetUnitTarget()->getLevel());
// if rank not found then function return NULL but in explicit cast case original spell can be casted and later failed with appropriate error message
if (actualSpellInfo)
diff --git a/src/server/game/Server/Protocol/Handlers/TradeHandler.cpp b/src/server/game/Server/Protocol/Handlers/TradeHandler.cpp
index 9200f145d36..6eb2dbd7084 100755
--- a/src/server/game/Server/Protocol/Handlers/TradeHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/TradeHandler.cpp
@@ -353,7 +353,7 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
my_spell = new Spell(_player, spellEntry, true);
my_spell->m_CastItem = castItem;
- my_targets.setTradeItemTarget(_player);
+ my_targets.SetTradeItemTarget(_player);
my_spell->m_targets = my_targets;
SpellCastResult res = my_spell->CheckCast(true);
@@ -388,7 +388,7 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
his_spell = new Spell(trader, spellEntry, true);
his_spell->m_CastItem = castItem;
- his_targets.setTradeItemTarget(trader);
+ his_targets.SetTradeItemTarget(trader);
his_spell->m_targets = his_targets;
SpellCastResult res = his_spell->CheckCast(true);
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index bdfb6f210ef..a0544b96e60 100755
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -2421,7 +2421,7 @@ void AuraEffect::HandleFeignDeath(AuraApplication const* aurApp, uint8 mode, boo
for (uint32 i = CURRENT_FIRST_NON_MELEE_SPELL; i < CURRENT_MAX_SPELL; i++)
{
if ((*iter)->GetCurrentSpell(i)
- && (*iter)->GetCurrentSpell(i)->m_targets.getUnitTargetGUID() == target->GetGUID())
+ && (*iter)->GetCurrentSpell(i)->m_targets.GetUnitTargetGUID() == target->GetGUID())
{
(*iter)->InterruptSpell(CurrentSpellTypes(i), false);
}
@@ -4778,7 +4778,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool
// AT REMOVE
else
{
- if ((IsQuestTameSpell(GetId())) && caster && caster->isAlive() && target->isAlive())
+ if ((IsQuestTameSpell(GetSpellProto())) && caster && caster->isAlive() && target->isAlive())
{
uint32 finalSpelId = 0;
switch(GetId())
@@ -5409,7 +5409,6 @@ void AuraEffect::HandleAuraLinked(AuraApplication const* aurApp, uint8 mode, boo
else if (mode & AURA_EFFECT_HANDLE_REAPPLY && apply)
{
uint64 casterGUID = IsSpellRequiringFocusedTarget(GetSpellProto()) ? GetCasterGUID() : target->GetGUID();
-
// change the stack amount to be equal to stack amount of our aura
if (Aura* triggeredAura = target->GetAura(triggeredSpellId, casterGUID))
triggeredAura->ModStackAmount(GetBase()->GetStackAmount() - triggeredAura->GetStackAmount());
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h
index 2f1bab3f9fc..6a06d4d3a46 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.h
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.h
@@ -1,9 +1,25 @@
+/*
+ * Copyright (C) 2008-2011 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
#ifndef TRINITY_SPELLAURAEFFECTS_H
#define TRINITY_SPELLAURAEFFECTS_H
class Unit;
-class DynamicObject;
class AuraEffect;
class Aura;
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index c4872841dc7..bf444f27e86 100755
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -53,18 +53,8 @@
#include "SpellScript.h"
#include "InstanceScript.h"
-#define SPELL_CHANNEL_UPDATE_INTERVAL (1 * IN_MILLISECONDS)
-
extern pEffect SpellEffects[TOTAL_SPELL_EFFECTS];
-bool IsQuestTameSpell(uint32 spellId)
-{
- SpellEntry const *spellproto = sSpellStore.LookupEntry(spellId);
- if (!spellproto) return false;
-
- return spellproto->Effect[0] == SPELL_EFFECT_THREAT && spellproto->Effect[1] == SPELL_EFFECT_APPLY_AURA && spellproto->EffectApplyAuraName[1] == SPELL_AURA_DUMMY;
-}
-
SpellCastTargets::SpellCastTargets() : m_elevation(0), m_speed(0)
{
m_unitTarget = NULL;
@@ -91,7 +81,153 @@ SpellCastTargets::~SpellCastTargets()
{
}
-void SpellCastTargets::setUnitTarget(Unit* target)
+SpellCastTargets& SpellCastTargets::operator=(const SpellCastTargets &target)
+{
+ m_unitTarget = target.m_unitTarget;
+ m_itemTarget = target.m_itemTarget;
+ m_GOTarget = target.m_GOTarget;
+
+ m_unitTargetGUID = target.m_unitTargetGUID;
+ m_GOTargetGUID = target.m_GOTargetGUID;
+ m_CorpseTargetGUID = target.m_CorpseTargetGUID;
+ m_itemTargetGUID = target.m_itemTargetGUID;
+
+ m_itemTargetEntry = target.m_itemTargetEntry;
+
+ m_srcTransGUID = target.m_srcTransGUID;
+ m_srcTransOffset = target.m_srcTransOffset;
+ m_srcPos = target.m_srcPos;
+
+ m_dstTransGUID = target.m_dstTransGUID;
+ m_dstTransOffset = target.m_dstTransOffset;
+ m_dstPos = target.m_dstPos;
+
+ m_elevation = target.m_elevation;
+ m_speed = target.m_speed;
+
+ m_strTarget = target.m_strTarget;
+
+ m_targetMask = target.m_targetMask;
+
+ return *this;
+}
+
+void SpellCastTargets::Read(ByteBuffer& data, Unit* caster)
+{
+ data >> m_targetMask;
+
+ if (m_targetMask == TARGET_FLAG_SELF)
+ return;
+
+ if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_UNK17))
+ data.readPackGUID(m_unitTargetGUID);
+
+ if (m_targetMask & (TARGET_FLAG_OBJECT))
+ data.readPackGUID(m_GOTargetGUID);
+
+ if (m_targetMask & (TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM))
+ data.readPackGUID(m_itemTargetGUID);
+
+ if (m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE))
+ data.readPackGUID(m_CorpseTargetGUID);
+
+ if (m_targetMask & TARGET_FLAG_SOURCE_LOCATION)
+ {
+ data.readPackGUID(m_srcTransGUID);
+ if (m_srcTransGUID)
+ data >> m_srcTransOffset.PositionXYZStream();
+ else
+ data >> m_srcPos.PositionXYZStream();
+ }
+ else
+ {
+ m_srcTransGUID = caster->GetTransGUID();
+ if (m_srcTransGUID)
+ m_srcTransOffset.Relocate(caster->GetTransOffsetX(), caster->GetTransOffsetY(), caster->GetTransOffsetZ(), caster->GetTransOffsetO());
+ else
+ m_srcPos.Relocate(caster);
+ }
+
+ if (m_targetMask & TARGET_FLAG_DEST_LOCATION)
+ {
+ data.readPackGUID(m_dstTransGUID);
+ if (m_dstTransGUID)
+ data >> m_dstTransOffset.PositionXYZStream();
+ else
+ data >> m_dstPos.PositionXYZStream();
+ }
+ else
+ {
+ m_dstTransGUID = caster->GetTransGUID();
+ if (m_dstTransGUID)
+ m_dstTransOffset.Relocate(caster->GetTransOffsetX(), caster->GetTransOffsetY(), caster->GetTransOffsetZ(), caster->GetTransOffsetO());
+ else
+ m_dstPos.Relocate(caster);
+ }
+
+ if (m_targetMask & TARGET_FLAG_STRING)
+ data >> m_strTarget;
+
+ Update(caster);
+}
+
+void SpellCastTargets::Write(ByteBuffer& data)
+{
+ data << uint32(m_targetMask);
+
+ if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_PVP_CORPSE | TARGET_FLAG_OBJECT | TARGET_FLAG_CORPSE | TARGET_FLAG_UNK17))
+ {
+ if (m_targetMask & TARGET_FLAG_UNIT)
+ {
+ if (m_unitTarget)
+ data.append(m_unitTarget->GetPackGUID());
+ else
+ data << uint8(0);
+ }
+ else if (m_targetMask & TARGET_FLAG_OBJECT)
+ {
+ if (m_GOTarget)
+ data.append(m_GOTarget->GetPackGUID());
+ else
+ data << uint8(0);
+ }
+ else if (m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE))
+ data.appendPackGUID(m_CorpseTargetGUID);
+ else
+ data << uint8(0);
+ }
+
+ if (m_targetMask & (TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM))
+ {
+ if (m_itemTarget)
+ data.append(m_itemTarget->GetPackGUID());
+ else
+ data << uint8(0);
+ }
+
+ if (m_targetMask & TARGET_FLAG_SOURCE_LOCATION)
+ {
+ data.appendPackGUID(m_srcTransGUID); // relative position guid here - transport for example
+ if (m_srcTransGUID)
+ data << m_srcTransOffset.PositionXYZStream();
+ else
+ data << m_srcPos.PositionXYZStream();
+ }
+
+ if (m_targetMask & TARGET_FLAG_DEST_LOCATION)
+ {
+ data.appendPackGUID(m_dstTransGUID); // relative position guid here - transport for example
+ if (m_dstTransGUID)
+ data << m_dstTransOffset.PositionXYZStream();
+ else
+ data << m_dstPos.PositionXYZStream();
+ }
+
+ if (m_targetMask & TARGET_FLAG_STRING)
+ data << m_strTarget;
+}
+
+void SpellCastTargets::SetUnitTarget(Unit* target)
{
if (!target)
return;
@@ -101,21 +237,26 @@ void SpellCastTargets::setUnitTarget(Unit* target)
m_targetMask |= TARGET_FLAG_UNIT;
}
-void SpellCastTargets::setSrc(float x, float y, float z)
+Position const* SpellCastTargets::GetSrc() const
+{
+ return &m_srcPos;
+}
+
+void SpellCastTargets::SetSrc(float x, float y, float z)
{
m_srcPos.Relocate(x, y, z);
m_srcTransGUID = 0;
m_targetMask |= TARGET_FLAG_SOURCE_LOCATION;
}
-void SpellCastTargets::setSrc(Position &pos)
+void SpellCastTargets::SetSrc(Position const& pos)
{
m_srcPos.Relocate(pos);
m_srcTransGUID = 0;
m_targetMask |= TARGET_FLAG_SOURCE_LOCATION;
}
-void SpellCastTargets::setSrc(WorldObject &wObj)
+void SpellCastTargets::SetSrc(WorldObject const& wObj)
{
uint64 guid = wObj.GetTransGUID();
m_srcTransGUID = guid;
@@ -124,7 +265,7 @@ void SpellCastTargets::setSrc(WorldObject &wObj)
m_targetMask |= TARGET_FLAG_SOURCE_LOCATION;
}
-void SpellCastTargets::modSrc(Position &pos)
+void SpellCastTargets::ModSrc(Position const& pos)
{
ASSERT(m_targetMask & TARGET_FLAG_SOURCE_LOCATION);
@@ -137,7 +278,12 @@ void SpellCastTargets::modSrc(Position &pos)
m_srcPos.Relocate(pos);
}
-void SpellCastTargets::setDst(float x, float y, float z, float orientation, uint32 mapId)
+WorldLocation const* SpellCastTargets::GetDst() const
+{
+ return &m_dstPos;
+}
+
+void SpellCastTargets::SetDst(float x, float y, float z, float orientation, uint32 mapId)
{
m_dstPos.Relocate(x, y, z, orientation);
m_dstTransGUID = 0;
@@ -146,14 +292,14 @@ void SpellCastTargets::setDst(float x, float y, float z, float orientation, uint
m_dstPos.m_mapId = mapId;
}
-void SpellCastTargets::setDst(Position &pos)
+void SpellCastTargets::SetDst(Position const& pos)
{
m_dstPos.Relocate(pos);
m_dstTransGUID = 0;
m_targetMask |= TARGET_FLAG_DEST_LOCATION;
}
-void SpellCastTargets::setDst(WorldObject &wObj)
+void SpellCastTargets::SetDst(WorldObject const& wObj)
{
uint64 guid = wObj.GetTransGUID();
m_dstTransGUID = guid;
@@ -162,7 +308,7 @@ void SpellCastTargets::setDst(WorldObject &wObj)
m_targetMask |= TARGET_FLAG_DEST_LOCATION;
}
-void SpellCastTargets::setDst(SpellCastTargets &spellTargets)
+void SpellCastTargets::SetDst(SpellCastTargets const& spellTargets)
{
m_dstTransGUID = spellTargets.m_dstTransGUID;
m_dstTransOffset.Relocate(spellTargets.m_dstTransOffset);
@@ -170,7 +316,7 @@ void SpellCastTargets::setDst(SpellCastTargets &spellTargets)
m_targetMask |= TARGET_FLAG_DEST_LOCATION;
}
-void SpellCastTargets::modDst(Position &pos)
+void SpellCastTargets::ModDst(Position const& pos)
{
ASSERT(m_targetMask & TARGET_FLAG_DEST_LOCATION);
@@ -183,14 +329,14 @@ void SpellCastTargets::modDst(Position &pos)
m_dstPos.Relocate(pos);
}
-void SpellCastTargets::setGOTarget(GameObject *target)
+void SpellCastTargets::SetGOTarget(GameObject* target)
{
m_GOTarget = target;
m_GOTargetGUID = target->GetGUID();
m_targetMask |= TARGET_FLAG_OBJECT;
}
-void SpellCastTargets::setItemTarget(Item* item)
+void SpellCastTargets::SetItemTarget(Item* item)
{
if (!item)
return;
@@ -201,7 +347,7 @@ void SpellCastTargets::setItemTarget(Item* item)
m_targetMask |= TARGET_FLAG_ITEM;
}
-void SpellCastTargets::setTradeItemTarget(Player* caster)
+void SpellCastTargets::SetTradeItemTarget(Player* caster)
{
m_itemTargetGUID = uint64(TRADE_SLOT_NONTRADED);
m_itemTargetEntry = 0;
@@ -210,7 +356,16 @@ void SpellCastTargets::setTradeItemTarget(Player* caster)
Update(caster);
}
-void SpellCastTargets::setCorpseTarget(Corpse* corpse)
+void SpellCastTargets::UpdateTradeSlotItem()
+{
+ if (m_itemTarget && (m_targetMask & TARGET_FLAG_TRADE_ITEM))
+ {
+ m_itemTargetGUID = m_itemTarget->GetGUID();
+ m_itemTargetEntry = m_itemTarget->GetEntry();
+ }
+}
+
+void SpellCastTargets::SetCorpseTarget(Corpse* corpse)
{
m_CorpseTargetGUID = corpse->GetGUID();
}
@@ -255,7 +410,7 @@ void SpellCastTargets::Update(Unit* caster)
}
}
-void SpellCastTargets::OutDebug()
+void SpellCastTargets::OutDebug() const
{
if (!m_targetMask)
sLog->outString("TARGET_FLAG_SELF");
@@ -284,121 +439,6 @@ void SpellCastTargets::OutDebug()
sLog->outString("elevation: %f", m_elevation);
}
-void SpellCastTargets::read (ByteBuffer & data, Unit* caster)
-{
- data >> m_targetMask;
-
- if (m_targetMask == TARGET_FLAG_SELF)
- return;
-
- if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_UNK17))
- data.readPackGUID(m_unitTargetGUID);
-
- if (m_targetMask & (TARGET_FLAG_OBJECT))
- data.readPackGUID(m_GOTargetGUID);
-
- if (m_targetMask & (TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM))
- data.readPackGUID(m_itemTargetGUID);
-
- if (m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE))
- data.readPackGUID(m_CorpseTargetGUID);
-
- if (m_targetMask & TARGET_FLAG_SOURCE_LOCATION)
- {
- data.readPackGUID(m_srcTransGUID);
- if (m_srcTransGUID)
- data >> m_srcTransOffset.PositionXYZStream();
- else
- data >> m_srcPos.PositionXYZStream();
- }
- else
- {
- m_srcTransGUID = caster->GetTransGUID();
- if (m_srcTransGUID)
- m_srcTransOffset.Relocate(caster->GetTransOffsetX(), caster->GetTransOffsetY(), caster->GetTransOffsetZ(), caster->GetTransOffsetO());
- else
- m_srcPos.Relocate(caster);
- }
-
- if (m_targetMask & TARGET_FLAG_DEST_LOCATION)
- {
- data.readPackGUID(m_dstTransGUID);
- if (m_dstTransGUID)
- data >> m_dstTransOffset.PositionXYZStream();
- else
- data >> m_dstPos.PositionXYZStream();
- }
- else
- {
- m_dstTransGUID = caster->GetTransGUID();
- if (m_dstTransGUID)
- m_dstTransOffset.Relocate(caster->GetTransOffsetX(), caster->GetTransOffsetY(), caster->GetTransOffsetZ(), caster->GetTransOffsetO());
- else
- m_dstPos.Relocate(caster);
- }
-
- if (m_targetMask & TARGET_FLAG_STRING)
- data >> m_strTarget;
-
- Update(caster);
-}
-
-void SpellCastTargets::write (ByteBuffer & data)
-{
- data << uint32(m_targetMask);
-
- if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_PVP_CORPSE | TARGET_FLAG_OBJECT | TARGET_FLAG_CORPSE | TARGET_FLAG_UNK17))
- {
- if (m_targetMask & TARGET_FLAG_UNIT)
- {
- if (m_unitTarget)
- data.append(m_unitTarget->GetPackGUID());
- else
- data << uint8(0);
- }
- else if (m_targetMask & TARGET_FLAG_OBJECT)
- {
- if (m_GOTarget)
- data.append(m_GOTarget->GetPackGUID());
- else
- data << uint8(0);
- }
- else if (m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE))
- data.appendPackGUID(m_CorpseTargetGUID);
- else
- data << uint8(0);
- }
-
- if (m_targetMask & (TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM))
- {
- if (m_itemTarget)
- data.append(m_itemTarget->GetPackGUID());
- else
- data << uint8(0);
- }
-
- if (m_targetMask & TARGET_FLAG_SOURCE_LOCATION)
- {
- data.appendPackGUID(m_srcTransGUID); // relative position guid here - transport for example
- if (m_srcTransGUID)
- data << m_srcTransOffset.PositionXYZStream();
- else
- data << m_srcPos.PositionXYZStream();
- }
-
- if (m_targetMask & TARGET_FLAG_DEST_LOCATION)
- {
- data.appendPackGUID(m_dstTransGUID); // relative position guid here - transport for example
- if (m_dstTransGUID)
- data << m_dstTransOffset.PositionXYZStream();
- else
- data << m_dstPos.PositionXYZStream();
- }
-
- if (m_targetMask & TARGET_FLAG_STRING)
- data << m_strTarget;
-}
-
Spell::Spell(Unit* Caster, SpellEntry const *info, bool triggered, uint64 originalCasterGUID, bool skipCheck):
m_spellInfo(sSpellMgr->GetSpellForDifficultyFromSpell(info, Caster)),
m_caster(Caster), m_spellValue(new SpellValue(m_spellInfo))
@@ -593,8 +633,8 @@ void Spell::SelectSpellTargets()
if (effectTargetType == SPELL_REQUIRE_CASTER)
AddUnitTarget(m_caster, i);
else if (effectTargetType == SPELL_REQUIRE_ITEM)
- if (m_targets.getItemTarget())
- AddItemTarget(m_targets.getItemTarget(), i);
+ if (m_targets.GetItemTarget())
+ AddItemTarget(m_targets.GetItemTarget(), i);
continue;
}
@@ -632,7 +672,7 @@ void Spell::SelectSpellTargets()
AddUnitTarget((Unit*)result, i);
break;
case TYPEID_CORPSE:
- m_targets.setCorpseTarget((Corpse*)result);
+ m_targets.SetCorpseTarget((Corpse*)result);
if (Player* owner = ObjectAccessor::FindPlayer(((Corpse*)result)->GetOwnerGUID()))
AddUnitTarget(owner, i);
break;
@@ -651,8 +691,8 @@ void Spell::SelectSpellTargets()
break;
}
default:
- if (m_targets.getUnitTarget())
- AddUnitTarget(m_targets.getUnitTarget(), i);
+ if (m_targets.GetUnitTarget())
+ AddUnitTarget(m_targets.GetUnitTarget(), i);
else
AddUnitTarget(m_caster, i);
break;
@@ -670,8 +710,8 @@ void Spell::SelectSpellTargets()
case SPELL_EFFECT_REPUTATION:
case SPELL_EFFECT_LEARN_SPELL:
case SPELL_EFFECT_SEND_TAXI:
- if (m_targets.getUnitTarget())
- AddUnitTarget(m_targets.getUnitTarget(), i);
+ if (m_targets.GetUnitTarget())
+ AddUnitTarget(m_targets.GetUnitTarget(), i);
// Triggered spells have additional spell targets - cast them even if no explicit unit target is given (required for spell 50516 for example)
else if (m_spellInfo->Effect[i] == SPELL_EFFECT_TRIGGER_SPELL)
AddUnitTarget(m_caster, i);
@@ -685,11 +725,11 @@ void Spell::SelectSpellTargets()
}
break;
case SPELL_EFFECT_RESURRECT_NEW:
- if (m_targets.getUnitTarget())
- AddUnitTarget(m_targets.getUnitTarget(), i);
- if (m_targets.getCorpseTargetGUID())
+ if (m_targets.GetUnitTarget())
+ AddUnitTarget(m_targets.GetUnitTarget(), i);
+ if (m_targets.GetCorpseTargetGUID())
{
- Corpse *corpse = ObjectAccessor::GetCorpse(*m_caster, m_targets.getCorpseTargetGUID());
+ Corpse *corpse = ObjectAccessor::GetCorpse(*m_caster, m_targets.GetCorpseTargetGUID());
if (corpse)
{
Player* owner = ObjectAccessor::FindPlayer(corpse->GetOwnerGUID());
@@ -719,8 +759,8 @@ void Spell::SelectSpellTargets()
AddUnitTarget(m_caster, i);
break;
default: // apply to target in other case
- if (m_targets.getUnitTarget())
- AddUnitTarget(m_targets.getUnitTarget(), i);
+ if (m_targets.GetUnitTarget())
+ AddUnitTarget(m_targets.GetUnitTarget(), i);
break;
}
break;
@@ -730,11 +770,11 @@ void Spell::SelectSpellTargets()
SelectEffectTargets(i, TARGET_UNIT_PARTY_TARGET);
break;
case SPELL_EFFECT_SKIN_PLAYER_CORPSE:
- if (m_targets.getUnitTarget())
- AddUnitTarget(m_targets.getUnitTarget(), i);
- else if (m_targets.getCorpseTargetGUID())
+ if (m_targets.GetUnitTarget())
+ AddUnitTarget(m_targets.GetUnitTarget(), i);
+ else if (m_targets.GetCorpseTargetGUID())
{
- Corpse *corpse = ObjectAccessor::GetCorpse(*m_caster, m_targets.getCorpseTargetGUID());
+ Corpse *corpse = ObjectAccessor::GetCorpse(*m_caster, m_targets.GetCorpseTargetGUID());
if (corpse)
{
Player* owner = ObjectAccessor::FindPlayer(corpse->GetOwnerGUID());
@@ -795,7 +835,7 @@ void Spell::SelectSpellTargets()
}
else if (m_spellInfo->speed > 0.0f)
{
- float dist = m_caster->GetDistance(m_targets.m_dstPos);
+ float dist = m_caster->GetDistance(*m_targets.GetDst());
m_delayMoment = (uint64) floor(dist / m_spellInfo->speed * 1000.0f);
}
}
@@ -1154,7 +1194,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
}
// Do not take combo points on dodge and miss
- if (m_needComboPoints && m_targets.getUnitTargetGUID() == target->targetGUID)
+ if (m_needComboPoints && m_targets.GetUnitTargetGUID() == target->targetGUID)
if (missInfo != SPELL_MISS_NONE)
{
m_needComboPoints = false;
@@ -1681,7 +1721,7 @@ struct ChainHealingOrder : public std::binary_function<const Unit*, const Unit*,
void Spell::SearchChainTarget(std::list<Unit*> &TagUnitMap, float max_range, uint32 num, SpellTargets TargetType)
{
- Unit *cur = m_targets.getUnitTarget();
+ Unit *cur = m_targets.GetUnitTarget();
if (!cur)
return;
@@ -1751,20 +1791,20 @@ void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, SpellNo
if (TargetType == SPELL_TARGETS_GO)
return;
- Position *pos;
+ Position const* pos;
switch(type)
{
case PUSH_DST_CENTER:
CheckDst();
- pos = &m_targets.m_dstPos;
+ pos = m_targets.GetDst();
break;
case PUSH_SRC_CENTER:
CheckSrc();
- pos = &m_targets.m_srcPos;
+ pos = m_targets.GetSrc();
break;
case PUSH_CHAIN:
{
- Unit* target = m_targets.getUnitTarget();
+ Unit* target = m_targets.GetUnitTarget();
if (!target)
{
sLog->outError("SPELL: cannot find unit target for spell ID %u\n", m_spellInfo->Id);
@@ -1793,16 +1833,16 @@ void Spell::SearchGOAreaTarget(std::list<GameObject*> &TagGOMap, float radius, S
if (TargetType != SPELL_TARGETS_GO)
return;
- Position *pos;
+ Position const* pos;
switch (type)
{
case PUSH_DST_CENTER:
CheckDst();
- pos = &m_targets.m_dstPos;
+ pos = m_targets.GetDst();
break;
case PUSH_SRC_CENTER:
CheckSrc();
- pos = &m_targets.m_srcPos;
+ pos = m_targets.GetSrc();
break;
default:
pos = m_caster;
@@ -1873,8 +1913,8 @@ WorldObject* Spell::SearchNearbyTarget(float range, SpellTargets TargetType, Spe
}
break;
case SPELL_TARGET_TYPE_CREATURE:
- if (m_targets.getUnitTarget() && m_targets.getUnitTarget()->GetEntry() == (*i_spellST)->mConditionValue2)
- return m_targets.getUnitTarget();
+ if (m_targets.GetUnitTarget() && m_targets.GetUnitTarget()->GetEntry() == (*i_spellST)->mConditionValue2)
+ return m_targets.GetUnitTarget();
case SPELL_TARGET_TYPE_DEAD:
default:
if (Creature *cre = m_caster->FindNearestCreature((*i_spellST)->mConditionValue2, range, (*i_spellST)->mConditionValue1 != SPELL_TARGET_TYPE_DEAD))
@@ -1935,7 +1975,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
float dis = (float)rand_norm() * (max_dis - min_dis) + min_dis;
float x, y, z;
m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE, dis);
- m_targets.setDst(x, y, z, m_caster->GetOrientation());
+ m_targets.SetDst(x, y, z, m_caster->GetOrientation());
break;
}
case TARGET_UNIT_MASTER:
@@ -1977,7 +2017,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
case TARGET_TYPE_UNIT_TARGET:
{
- Unit* target = m_targets.getUnitTarget();
+ Unit* target = m_targets.GetUnitTarget();
if (!target)
{
sLog->outError("SPELL: no unit target for spell ID %u", m_spellInfo->Id);
@@ -1989,14 +2029,14 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
case TARGET_UNIT_TARGET_ENEMY:
if (Unit *magnet = m_caster->SelectMagnetTarget(target, m_spellInfo))
if (magnet != target)
- m_targets.setUnitTarget(magnet);
+ m_targets.SetUnitTarget(magnet);
pushType = PUSH_CHAIN;
break;
case TARGET_UNIT_TARGET_ANY:
if (!IsPositiveSpell(m_spellInfo->Id))
if (Unit *magnet = m_caster->SelectMagnetTarget(target, m_spellInfo))
if (magnet != target)
- m_targets.setUnitTarget(magnet);
+ m_targets.SetUnitTarget(magnet);
pushType = PUSH_CHAIN;
break;
case TARGET_UNIT_CHAINHEAL:
@@ -2054,8 +2094,8 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
{
pushType = PUSH_CHAIN;
- if (m_targets.getUnitTarget() != target)
- m_targets.setUnitTarget((Unit*)target);
+ if (m_targets.GetUnitTarget() != target)
+ m_targets.SetUnitTarget((Unit*)target);
}
break;
@@ -2082,12 +2122,12 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
{
if (cur == TARGET_SRC_CASTER)
{
- m_targets.setSrc(*m_caster);
+ m_targets.SetSrc(*m_caster);
break;
}
else if (cur == TARGET_DST_CASTER)
{
- m_targets.setDst(*m_caster);
+ m_targets.SetDst(*m_caster);
break;
}
@@ -2124,14 +2164,14 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
m_caster->GetFirstCollisionPosition(pos, dist, angle);
else
m_caster->GetNearPosition(pos, dist, angle);
- m_targets.setDst(*m_caster);
- m_targets.modDst(pos);
+ m_targets.SetDst(*m_caster);
+ m_targets.ModDst(pos);
break;
}
case TARGET_TYPE_DEST_TARGET: //2+8+2
{
- Unit* target = m_targets.getUnitTarget();
+ Unit* target = m_targets.GetUnitTarget();
if (!target)
{
sLog->outError("SPELL: no unit target for spell ID %u", m_spellInfo->Id);
@@ -2140,7 +2180,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
if (cur == TARGET_DST_TARGET_ENEMY || cur == TARGET_DEST_TARGET_ANY)
{
- m_targets.setDst(*target);
+ m_targets.SetDst(*target);
break;
}
@@ -2168,8 +2208,8 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
Position pos;
target->GetNearPosition(pos, dist, angle);
- m_targets.setDst(*target);
- m_targets.modDst(pos);
+ m_targets.SetDst(*target);
+ m_targets.ModDst(pos);
break;
}
@@ -2209,9 +2249,9 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
dist *= (float)rand_norm();
// must has dst, no need to set flag
- Position pos = m_targets.m_dstPos;
+ Position pos = *m_targets.GetDst();
m_caster->MovePosition(pos, dist, angle);
- m_targets.modDst(pos);
+ m_targets.ModDst(pos);
break;
}
@@ -2224,9 +2264,9 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
{
//TODO: fix this check
if (m_spellInfo->Effect[0] == SPELL_EFFECT_TELEPORT_UNITS || m_spellInfo->Effect[1] == SPELL_EFFECT_TELEPORT_UNITS || m_spellInfo->Effect[2] == SPELL_EFFECT_TELEPORT_UNITS)
- m_targets.setDst(st->target_X, st->target_Y, st->target_Z, st->target_Orientation, (int32)st->target_mapId);
+ m_targets.SetDst(st->target_X, st->target_Y, st->target_Z, st->target_Orientation, (int32)st->target_mapId);
else if (st->target_mapId == m_caster->GetMapId())
- m_targets.setDst(st->target_X, st->target_Y, st->target_Z, st->target_Orientation);
+ m_targets.SetDst(st->target_X, st->target_Y, st->target_Z, st->target_Orientation);
}
else
{
@@ -2234,12 +2274,12 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
Unit* target = NULL;
if (uint64 guid = m_caster->GetUInt64Value(UNIT_FIELD_TARGET))
target = ObjectAccessor::GetUnit(*m_caster, guid);
- m_targets.setDst(target ? *target : *m_caster);
+ m_targets.SetDst(target ? *target : *m_caster);
}
break;
case TARGET_DST_HOME:
if (m_caster->GetTypeId() == TYPEID_PLAYER)
- m_targets.setDst(m_caster->ToPlayer()->m_homebindX, m_caster->ToPlayer()->m_homebindY, m_caster->ToPlayer()->m_homebindZ, m_caster->ToPlayer()->GetOrientation(), m_caster->ToPlayer()->m_homebindMapId);
+ m_targets.SetDst(m_caster->ToPlayer()->m_homebindX, m_caster->ToPlayer()->m_homebindY, m_caster->ToPlayer()->m_homebindZ, m_caster->ToPlayer()->GetOrientation(), m_caster->ToPlayer()->m_homebindMapId);
break;
case TARGET_DST_NEARBY_ENTRY:
{
@@ -2247,7 +2287,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
if (modOwner) modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RANGE, range, this);
if (WorldObject *target = SearchNearbyTarget(range, SPELL_TARGETS_ENTRY, SpellEffIndex(i)))
- m_targets.setDst(*target);
+ m_targets.SetDst(*target);
break;
}
}
@@ -2266,21 +2306,21 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
{
case TARGET_UNIT_CHANNEL_TARGET:
// unit target may be no longer avalible - teleported out of map for example
- if (Unit* target = Unit::GetUnit(*m_caster, m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets.getUnitTargetGUID()))
+ if (Unit* target = Unit::GetUnit(*m_caster, m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets.GetUnitTargetGUID()))
AddUnitTarget(target, i);
else
sLog->outError("SPELL: cannot find channel spell target for spell ID %u", m_spellInfo->Id);
break;
case TARGET_DEST_CHANNEL_TARGET:
if (m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets.HasDst())
- m_targets.setDst(m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets);
- else if (Unit* target = Unit::GetUnit(*m_caster, m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets.getUnitTargetGUID()))
- m_targets.setDst(*target);
+ m_targets.SetDst(m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets);
+ else if (Unit* target = Unit::GetUnit(*m_caster, m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets.GetUnitTargetGUID()))
+ m_targets.SetDst(*target);
else
sLog->outError("SPELL: cannot find channel spell destination for spell ID %u", m_spellInfo->Id);
break;
case TARGET_DEST_CHANNEL_CASTER:
- m_targets.setDst(*m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->GetCaster());
+ m_targets.SetDst(*m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->GetCaster());
break;
}
break;
@@ -2291,17 +2331,17 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
switch (cur)
{
case TARGET_GAMEOBJECT:
- if (m_targets.getGOTarget())
- AddGOTarget(m_targets.getGOTarget(), i);
+ if (m_targets.GetGOTarget())
+ AddGOTarget(m_targets.GetGOTarget(), i);
break;
case TARGET_GAMEOBJECT_ITEM:
- if (m_targets.getGOTargetGUID())
- AddGOTarget(m_targets.getGOTarget(), i);
- else if (m_targets.getItemTarget())
- AddItemTarget(m_targets.getItemTarget(), i);
+ if (m_targets.GetGOTargetGUID())
+ AddGOTarget(m_targets.GetGOTarget(), i);
+ else if (m_targets.GetItemTarget())
+ AddItemTarget(m_targets.GetItemTarget(), i);
break;
case TARGET_UNIT_DRIVER:
- if (Unit* driver = m_targets.getUnitTarget())
+ if (Unit* driver = m_targets.GetUnitTarget())
if (driver->IsOnVehicle(m_caster))
AddUnitTarget(driver, i);
break;
@@ -2316,7 +2356,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
if (pushType == PUSH_CHAIN) // Chain
{
- Unit* target = m_targets.getUnitTarget();
+ Unit* target = m_targets.GetUnitTarget();
if (!target)
{
sLog->outError("SPELL: no chain unit target for spell ID %u", m_spellInfo->Id);
@@ -2449,7 +2489,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
switch(result->GetTypeId())
{
case TYPEID_UNIT:
- m_targets.setDst(*result);
+ m_targets.SetDst(*result);
break;
default:
break;
@@ -2464,13 +2504,13 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
case 51327:
case 51328:
// Search for ghoul if our ghoul or dead body not valid unit target
- if (!(m_targets.getUnitTarget() && ((m_targets.getUnitTarget()->GetEntry() == 26125 && m_targets.getUnitTarget()->GetOwnerGUID() == m_caster->GetGUID())
- || (m_targets.getUnitTarget()->getDeathState() == CORPSE
- && m_targets.getUnitTarget()->GetDisplayId() == m_targets.getUnitTarget()->GetNativeDisplayId()
- && m_targets.getUnitTarget()->GetTypeId() == TYPEID_UNIT
- && !m_targets.getUnitTarget()->ToCreature()->isDeadByDefault()
- && !(m_targets.getUnitTarget()->GetCreatureTypeMask() & CREATURE_TYPEMASK_MECHANICAL_OR_ELEMENTAL)
- && m_targets.getUnitTarget()->GetDisplayId() == m_targets.getUnitTarget()->GetNativeDisplayId()))))
+ if (!(m_targets.GetUnitTarget() && ((m_targets.GetUnitTarget()->GetEntry() == 26125 && m_targets.GetUnitTarget()->GetOwnerGUID() == m_caster->GetGUID())
+ || (m_targets.GetUnitTarget()->getDeathState() == CORPSE
+ && m_targets.GetUnitTarget()->GetDisplayId() == m_targets.GetUnitTarget()->GetNativeDisplayId()
+ && m_targets.GetUnitTarget()->GetTypeId() == TYPEID_UNIT
+ && !m_targets.GetUnitTarget()->ToCreature()->isDeadByDefault()
+ && !(m_targets.GetUnitTarget()->GetCreatureTypeMask() & CREATURE_TYPEMASK_MECHANICAL_OR_ELEMENTAL)
+ && m_targets.GetUnitTarget()->GetDisplayId() == m_targets.GetUnitTarget()->GetNativeDisplayId()))))
{
CleanupTargetList();
@@ -2482,7 +2522,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
{
case TYPEID_UNIT:
case TYPEID_PLAYER:
- m_targets.setUnitTarget((Unit*)result);
+ m_targets.SetUnitTarget((Unit*)result);
break;
default:
break;
@@ -2548,7 +2588,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
m_caster->GetPartyMemberInDist(unitList, radius); //fix me
break;
case TARGET_UNIT_PARTY_TARGET:
- m_targets.getUnitTarget()->GetPartyMemberInDist(unitList, radius);
+ m_targets.GetUnitTarget()->GetPartyMemberInDist(unitList, radius);
break;
case TARGET_UNIT_PARTY_CASTER:
m_caster->GetPartyMemberInDist(unitList, radius);
@@ -2558,8 +2598,8 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
break;
case TARGET_UNIT_CLASS_TARGET:
{
- Player* targetPlayer = m_targets.getUnitTarget() && m_targets.getUnitTarget()->GetTypeId() == TYPEID_PLAYER
- ? (Player*)m_targets.getUnitTarget() : NULL;
+ Player* targetPlayer = m_targets.GetUnitTarget() && m_targets.GetUnitTarget()->GetTypeId() == TYPEID_PLAYER
+ ? (Player*)m_targets.GetUnitTarget() : NULL;
Group* pGroup = targetPlayer ? targetPlayer->GetGroup() : NULL;
if (pGroup)
@@ -2573,8 +2613,8 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
AddUnitTarget(Target, i);
}
}
- else if (m_targets.getUnitTarget())
- AddUnitTarget(m_targets.getUnitTarget(), i);
+ else if (m_targets.GetUnitTarget())
+ AddUnitTarget(m_targets.GetUnitTarget(), i);
break;
}
}
@@ -2711,7 +2751,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
maxTargets += (*j)->GetAmount();
if (m_spellInfo->Id == 5246) //Intimidating Shout
- unitList.remove(m_targets.getUnitTarget());
+ unitList.remove(m_targets.GetUnitTarget());
Trinity::RandomResizeList(unitList, maxTargets);
}
@@ -2747,7 +2787,7 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered
m_targets = *targets;
- if (!m_targets.getUnitTargetGUID() && m_spellInfo->Targets & TARGET_FLAG_UNIT)
+ if (!m_targets.GetUnitTargetGUID() && m_spellInfo->Targets & TARGET_FLAG_UNIT)
{
Unit* target = NULL;
if (m_caster->GetTypeId() == TYPEID_UNIT)
@@ -2756,7 +2796,7 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered
target = ObjectAccessor::GetUnit(*m_caster, m_caster->ToPlayer()->GetSelection());
if (target && IsValidSingleTargetSpell(target))
- m_targets.setUnitTarget(target);
+ m_targets.SetUnitTarget(target);
else
{
SendCastResult(SPELL_FAILED_BAD_TARGETS);
@@ -2778,11 +2818,11 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered
}
}
if (!m_targets.HasSrc() && m_spellInfo->Targets & TARGET_FLAG_SOURCE_LOCATION)
- m_targets.setSrc(*m_caster);
+ m_targets.SetSrc(*m_caster);
if (!m_targets.HasDst() && m_spellInfo->Targets & TARGET_FLAG_DEST_LOCATION)
{
- Unit* target = m_targets.getUnitTarget();
+ Unit* target = m_targets.GetUnitTarget();
if (!target)
{
if (m_caster->GetTypeId() == TYPEID_UNIT)
@@ -2792,7 +2832,7 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered
}
if (target)
- m_targets.setDst(*target);
+ m_targets.SetDst(*target);
else
{
SendCastResult(SPELL_FAILED_BAD_TARGETS);
@@ -2894,7 +2934,7 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered
// set timer base at cast time
ReSetTimer();
- sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell::prepare: spell id %u source %u caster %d triggered %u mask %u", m_spellInfo->Id, m_caster->GetEntry(), m_originalCaster ? m_originalCaster->GetEntry() : -1, m_IsTriggeredSpell ? 1 : 0, m_targets.getTargetMask());
+ sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell::prepare: spell id %u source %u caster %d triggered %u mask %u", m_spellInfo->Id, m_caster->GetEntry(), m_originalCaster ? m_originalCaster->GetEntry() : -1, m_IsTriggeredSpell ? 1 : 0, m_targets.GetTargetMask());
//Containers for channeled spells have to be set
//TODO:Apply this to all casted spells if needed
@@ -2989,7 +3029,7 @@ void Spell::cast(bool skipCheck)
// update pointers base at GUIDs to prevent access to non-existed already object
UpdatePointers();
- if (Unit* target = m_targets.getUnitTarget())
+ if (Unit* target = m_targets.GetUnitTarget())
{
// three check: prepare, cast (m_casttime > 0), hit (delayed)
if (m_casttime && target->isAlive() && !target->IsFriendlyTo(m_caster) && !m_caster->canSeeOrDetect(target))
@@ -3003,7 +3043,7 @@ void Spell::cast(bool skipCheck)
else
{
// cancel at lost main target unit
- if (m_targets.getUnitTargetGUID() && m_targets.getUnitTargetGUID() != m_caster->GetGUID())
+ if (m_targets.GetUnitTargetGUID() && m_targets.GetUnitTargetGUID() != m_caster->GetGUID())
{
cancel();
return;
@@ -3017,8 +3057,8 @@ void Spell::cast(bool skipCheck)
SetExecutedCurrently(true);
- if (m_caster->GetTypeId() != TYPEID_PLAYER && m_targets.getUnitTarget() && m_targets.getUnitTarget() != m_caster)
- m_caster->SetInFront(m_targets.getUnitTarget());
+ if (m_caster->GetTypeId() != TYPEID_PLAYER && m_targets.GetUnitTarget() && m_targets.GetUnitTarget() != m_caster)
+ m_caster->SetInFront(m_targets.GetUnitTarget());
// Should this be done for original caster?
if (m_caster->GetTypeId() == TYPEID_PLAYER)
@@ -3051,7 +3091,7 @@ void Spell::cast(bool skipCheck)
// additional check after cast bar completes (must not be in CheckCast)
// if trade not complete then remember it in trade data
- if (m_targets.getTargetMask() & TARGET_FLAG_TRADE_ITEM)
+ if (m_targets.GetTargetMask() & TARGET_FLAG_TRADE_ITEM)
{
if (m_caster->GetTypeId() == TYPEID_PLAYER)
{
@@ -3122,7 +3162,7 @@ void Spell::cast(bool skipCheck)
// traded items have trade slot instead of guid in m_itemTargetGUID
// set to real guid to be sent later to the client
- m_targets.updateTradeSlotItem();
+ m_targets.UpdateTradeSlotItem();
if (m_caster->GetTypeId() == TYPEID_PLAYER)
{
@@ -3141,7 +3181,7 @@ void Spell::cast(bool skipCheck)
TakePower();
TakeReagents(); // we must remove reagents before HandleEffects to allow place crafted item in same slot
}
- else if (Item* targetItem = m_targets.getItemTarget())
+ else if (Item* targetItem = m_targets.GetItemTarget())
{
/// Not own traded item (in trader trade slot) req. reagents including triggered spell case
if (targetItem->GetOwnerGUID() != m_caster->GetGUID())
@@ -3221,7 +3261,7 @@ void Spell::cast(bool skipCheck)
if (*i < 0)
m_caster->RemoveAurasDueToSpell(-(*i));
else
- m_caster->CastSpell(m_targets.getUnitTarget() ? m_targets.getUnitTarget() : m_caster, *i, true);
+ m_caster->CastSpell(m_targets.GetUnitTarget() ? m_targets.GetUnitTarget() : m_caster, *i, true);
}
}
@@ -3386,7 +3426,7 @@ void Spell::_handle_immediate_phase()
if (EffectTargetType[m_spellInfo->Effect[j]] == SPELL_REQUIRE_DEST)
{
if (!m_targets.HasDst()) // FIXME: this will ignore dest set in effect
- m_targets.setDst(*m_caster);
+ m_targets.SetDst(*m_caster);
HandleEffects(m_originalCaster, NULL, NULL, j);
m_effectMask |= (1<<j);
}
@@ -3471,7 +3511,7 @@ void Spell::update(uint32 difftime)
// update pointers based at it's GUIDs
UpdatePointers();
- if (m_targets.getUnitTargetGUID() && !m_targets.getUnitTarget())
+ if (m_targets.GetUnitTargetGUID() && !m_targets.GetUnitTarget())
{
sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell %u is cancelled due to removal of target.", m_spellInfo->Id);
cancel();
@@ -3765,7 +3805,7 @@ void Spell::SendSpellStart()
data << uint32(castFlags); // cast flags
data << uint32(m_timer); // delay?
- m_targets.write(data);
+ m_targets.Write(data);
if (castFlags & CAST_FLAG_POWER_LEFT_SELF)
data << uint32(m_caster->GetPower((Powers)m_spellInfo->powerType));
@@ -3835,15 +3875,15 @@ void Spell::SendSpellGo()
/*
// statement below seems to be wrong - i've seen spells with both unit and dest target
// Can't have TARGET_FLAG_UNIT when *_LOCATION is present - it breaks missile visuals
- if (m_targets.getTargetMask() & (TARGET_FLAG_SOURCE_LOCATION | TARGET_FLAG_DEST_LOCATION))
- m_targets.setTargetMask(m_targets.getTargetMask() & ~TARGET_FLAG_UNIT);
+ if (m_targets.GetTargetMask() & (TARGET_FLAG_SOURCE_LOCATION | TARGET_FLAG_DEST_LOCATION))
+ m_targets.setTargetMask(m_targets.GetTargetMask() & ~TARGET_FLAG_UNIT);
else if (m_targets.getIntTargetFlags() & FLAG_INT_UNIT)
- m_targets.setTargetMask(m_targets.getTargetMask() | TARGET_FLAG_UNIT);
+ m_targets.setTargetMask(m_targets.GetTargetMask() | TARGET_FLAG_UNIT);
*/
WriteSpellGoTargets(&data);
- m_targets.write(data);
+ m_targets.Write(data);
if (castFlags & CAST_FLAG_POWER_LEFT_SELF)
data << uint32(m_caster->GetPower((Powers)m_spellInfo->powerType));
@@ -3882,7 +3922,7 @@ void Spell::SendSpellGo()
data << uint32(0);
}
- if (m_targets.getTargetMask() & TARGET_FLAG_DEST_LOCATION)
+ if (m_targets.GetTargetMask() & TARGET_FLAG_DEST_LOCATION)
{
data << uint8(0);
}
@@ -4271,9 +4311,9 @@ void Spell::TakeCastItem()
uint32 count = 1;
m_caster->ToPlayer()->DestroyItemCount(m_CastItem, count, true);
- // prevent crash at access to deleted m_targets.getItemTarget
- if (m_CastItem == m_targets.getItemTarget())
- m_targets.setItemTarget(NULL);
+ // prevent crash at access to deleted m_targets.GetItemTarget
+ if (m_CastItem == m_targets.GetItemTarget())
+ m_targets.SetItemTarget(NULL);
m_CastItem = NULL;
}
@@ -4288,7 +4328,7 @@ void Spell::TakePower()
if (m_caster->GetTypeId() == TYPEID_PLAYER)
{
if (m_spellInfo->powerType == POWER_RAGE || m_spellInfo->powerType == POWER_ENERGY || m_spellInfo->powerType == POWER_RUNE)
- if (uint64 targetGUID = m_targets.getUnitTargetGUID())
+ if (uint64 targetGUID = m_targets.GetUnitTargetGUID())
for (std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit)
if (ihit->targetGUID == targetGUID)
{
@@ -4488,7 +4528,7 @@ void Spell::TakeReagents()
{
if (m_IsTriggeredSpell) // reagents used in triggered spell removed by original spell or don't must be removed.
{
- Item* targetItem = m_targets.getItemTarget();
+ Item* targetItem = m_targets.GetItemTarget();
/// Not own traded item (in trader trade slot) req. reagents including triggered spell case
if (!(targetItem && targetItem->GetOwnerGUID() != m_caster->GetGUID()))
return;
@@ -4534,9 +4574,9 @@ void Spell::TakeReagents()
}
}
- // if getItemTarget is also spell reagent
- if (m_targets.getItemTargetEntry() == itemid)
- m_targets.setItemTarget(NULL);
+ // if GetItemTarget is also spell reagent
+ if (m_targets.GetItemTargetEntry() == itemid)
+ m_targets.SetItemTarget(NULL);
p_caster->DestroyItemCount(itemid, itemcount, true);
}
@@ -4544,10 +4584,10 @@ void Spell::TakeReagents()
void Spell::HandleThreatSpells(uint32 spellId)
{
- if (!m_targets.getUnitTarget() || !spellId)
+ if (!m_targets.GetUnitTarget() || !spellId)
return;
- if (!m_targets.getUnitTarget()->CanHaveThreatList())
+ if (!m_targets.GetUnitTarget()->CanHaveThreatList())
return;
uint16 threat = sSpellMgr->GetSpellThreat(spellId);
@@ -4555,7 +4595,7 @@ void Spell::HandleThreatSpells(uint32 spellId)
if (!threat)
return;
- m_targets.getUnitTarget()->AddThreat(m_caster, float(threat));
+ m_targets.GetUnitTarget()->AddThreat(m_caster, float(threat));
sLog->outStaticDebug("Spell %u, rank %u, added an additional %i threat", spellId, sSpellMgr->GetSpellRank(spellId), threat);
}
@@ -4702,10 +4742,10 @@ SpellCastResult Spell::CheckCast(bool strict)
return SPELL_FAILED_MOVING;
}
- Unit* target = m_targets.getUnitTarget();
+ Unit* target = m_targets.GetUnitTarget();
// In pure self-cast spells, the client won't send any unit target
- if (!target && (m_targets.getTargetMask() == TARGET_FLAG_SELF || m_targets.getTargetMask() & TARGET_FLAG_UNIT_CASTER)) // TARGET_FLAG_SELF == 0, remember!
+ if (!target && (m_targets.GetTargetMask() == TARGET_FLAG_SELF || m_targets.GetTargetMask() & TARGET_FLAG_UNIT_CASTER)) // TARGET_FLAG_SELF == 0, remember!
target = m_caster;
if (target)
@@ -4779,12 +4819,12 @@ SpellCastResult Spell::CheckCast(bool strict)
// Additional check for some spells
// If 0 spell effect empty - client not send target data (need use selection)
// TODO: check it on next client version
- if (m_targets.getTargetMask() == TARGET_FLAG_SELF &&
+ if (m_targets.GetTargetMask() == TARGET_FLAG_SELF &&
m_spellInfo->EffectImplicitTargetA[1] == TARGET_UNIT_TARGET_ENEMY)
{
target = m_caster->GetUnit(*m_caster, m_caster->ToPlayer()->GetSelection());
if (target)
- m_targets.setUnitTarget(target);
+ m_targets.SetUnitTarget(target);
else
return SPELL_FAILED_BAD_TARGETS;
}
@@ -4961,7 +5001,7 @@ SpellCastResult Spell::CheckCast(bool strict)
{
// spell different for friends and enemies
// hurt version required facing
- if (m_targets.getUnitTarget() && !m_caster->IsFriendlyTo(m_targets.getUnitTarget()) && !m_caster->HasInArc(static_cast<float>(M_PI), m_targets.getUnitTarget()))
+ if (m_targets.GetUnitTarget() && !m_caster->IsFriendlyTo(m_targets.GetUnitTarget()) && !m_caster->HasInArc(static_cast<float>(M_PI), m_targets.GetUnitTarget()))
return SPELL_FAILED_UNIT_NOT_INFRONT;
}
else if (m_spellInfo->SpellIconID == 33 && m_spellInfo->SpellFamilyName == SPELLFAMILY_SHAMAN && m_spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_SHAMAN_FIRE_NOVA)
@@ -4971,13 +5011,13 @@ SpellCastResult Spell::CheckCast(bool strict)
}
else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && m_spellInfo->SpellFamilyFlags[0] == 0x2000) // Death Coil (DeathKnight)
{
- Unit* target = m_targets.getUnitTarget();
+ Unit* target = m_targets.GetUnitTarget();
if (!target || (target->IsFriendlyTo(m_caster) && target->GetCreatureType() != CREATURE_TYPE_UNDEAD))
return SPELL_FAILED_BAD_TARGETS;
}
else if (m_spellInfo->Id == 19938) // Awaken Peon
{
- Unit *unit = m_targets.getUnitTarget();
+ Unit *unit = m_targets.GetUnitTarget();
if (!unit || !unit->HasAura(17743))
return SPELL_FAILED_BAD_TARGETS;
}
@@ -4991,7 +5031,7 @@ SpellCastResult Spell::CheckCast(bool strict)
if (m_caster->GetTypeId() != TYPEID_PLAYER)
return SPELL_FAILED_DONT_REPORT;
- Unit* target = m_targets.getUnitTarget();
+ Unit* target = m_targets.GetUnitTarget();
if (!target || !target->IsFriendlyTo(m_caster) || target->getAttackers().empty())
return SPELL_FAILED_BAD_TARGETS;
@@ -5053,7 +5093,7 @@ SpellCastResult Spell::CheckCast(bool strict)
if (m_caster->GetTypeId() != TYPEID_PLAYER)
return SPELL_FAILED_BAD_TARGETS;
- Item* foodItem = m_targets.getItemTarget();
+ Item* foodItem = m_targets.GetItemTarget();
if (!foodItem)
return SPELL_FAILED_BAD_TARGETS;
@@ -5078,7 +5118,7 @@ SpellCastResult Spell::CheckCast(bool strict)
{
// Can be area effect, Check only for players and not check if target - caster (spell can have multiply drain/burn effects)
if (m_caster->GetTypeId() == TYPEID_PLAYER)
- if (Unit* target = m_targets.getUnitTarget())
+ if (Unit* target = m_targets.GetUnitTarget())
if (target != m_caster && target->getPowerType() != Powers(m_spellInfo->EffectMiscValue[i]))
return SPELL_FAILED_BAD_TARGETS;
break;
@@ -5097,20 +5137,20 @@ SpellCastResult Spell::CheckCast(bool strict)
}
case SPELL_EFFECT_SKINNING:
{
- if (m_caster->GetTypeId() != TYPEID_PLAYER || !m_targets.getUnitTarget() || m_targets.getUnitTarget()->GetTypeId() != TYPEID_UNIT)
+ if (m_caster->GetTypeId() != TYPEID_PLAYER || !m_targets.GetUnitTarget() || m_targets.GetUnitTarget()->GetTypeId() != TYPEID_UNIT)
return SPELL_FAILED_BAD_TARGETS;
- if (!(m_targets.getUnitTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & UNIT_FLAG_SKINNABLE))
+ if (!(m_targets.GetUnitTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & UNIT_FLAG_SKINNABLE))
return SPELL_FAILED_TARGET_UNSKINNABLE;
- Creature* creature = m_targets.getUnitTarget()->ToCreature();
+ Creature* creature = m_targets.GetUnitTarget()->ToCreature();
if (creature->GetCreatureType() != CREATURE_TYPE_CRITTER && !creature->loot.isLooted())
return SPELL_FAILED_TARGET_NOT_LOOTED;
uint32 skill = creature->GetCreatureInfo()->GetRequiredLootSkill();
int32 skillValue = m_caster->ToPlayer()->GetSkillValue(skill);
- int32 TargetLevel = m_targets.getUnitTarget()->getLevel();
+ int32 TargetLevel = m_targets.GetUnitTarget()->getLevel();
int32 ReqValue = (skillValue < 100 ? (TargetLevel-10) * 10 : TargetLevel * 5);
if (ReqValue > skillValue)
return SPELL_FAILED_LOW_CASTLEVEL;
@@ -5131,39 +5171,39 @@ SpellCastResult Spell::CheckCast(bool strict)
if (m_caster->GetTypeId() != TYPEID_PLAYER // only players can open locks, gather etc.
// we need a go target in case of TARGET_GAMEOBJECT
- || (m_spellInfo->EffectImplicitTargetA[i] == TARGET_GAMEOBJECT && !m_targets.getGOTarget()))
+ || (m_spellInfo->EffectImplicitTargetA[i] == TARGET_GAMEOBJECT && !m_targets.GetGOTarget()))
return SPELL_FAILED_BAD_TARGETS;
Item *pTempItem = NULL;
- if (m_targets.getTargetMask() & TARGET_FLAG_TRADE_ITEM)
+ if (m_targets.GetTargetMask() & TARGET_FLAG_TRADE_ITEM)
{
if (TradeData* pTrade = m_caster->ToPlayer()->GetTradeData())
- pTempItem = pTrade->GetTraderData()->GetItem(TradeSlots(m_targets.getItemTargetGUID()));
+ pTempItem = pTrade->GetTraderData()->GetItem(TradeSlots(m_targets.GetItemTargetGUID()));
}
- else if (m_targets.getTargetMask() & TARGET_FLAG_ITEM)
- pTempItem = m_caster->ToPlayer()->GetItemByGuid(m_targets.getItemTargetGUID());
+ else if (m_targets.GetTargetMask() & TARGET_FLAG_ITEM)
+ pTempItem = m_caster->ToPlayer()->GetItemByGuid(m_targets.GetItemTargetGUID());
// we need a go target, or an openable item target in case of TARGET_GAMEOBJECT_ITEM
if (m_spellInfo->EffectImplicitTargetA[i] == TARGET_GAMEOBJECT_ITEM &&
- !m_targets.getGOTarget() &&
+ !m_targets.GetGOTarget() &&
(!pTempItem || !pTempItem->GetTemplate()->LockID || !pTempItem->IsLocked()))
return SPELL_FAILED_BAD_TARGETS;
- if (m_spellInfo->Id != 1842 || (m_targets.getGOTarget() &&
- m_targets.getGOTarget()->GetGOInfo()->type != GAMEOBJECT_TYPE_TRAP))
+ if (m_spellInfo->Id != 1842 || (m_targets.GetGOTarget() &&
+ m_targets.GetGOTarget()->GetGOInfo()->type != GAMEOBJECT_TYPE_TRAP))
if (m_caster->ToPlayer()->InBattleground() && // In Battleground players can use only flags and banners
!m_caster->ToPlayer()->CanUseBattlegroundObject())
return SPELL_FAILED_TRY_AGAIN;
// get the lock entry
uint32 lockId = 0;
- if (GameObject* go = m_targets.getGOTarget())
+ if (GameObject* go = m_targets.GetGOTarget())
{
lockId = go->GetGOInfo()->GetLockId();
if (!lockId)
return SPELL_FAILED_BAD_TARGETS;
}
- else if (Item* itm = m_targets.getItemTarget())
+ else if (Item* itm = m_targets.GetItemTarget())
lockId = itm->GetTemplate()->LockID;
SkillType skillId = SKILL_NONE;
@@ -5218,11 +5258,11 @@ SpellCastResult Spell::CheckCast(bool strict)
}
case SPELL_EFFECT_CREATE_TAMED_PET:
{
- if (m_targets.getUnitTarget())
+ if (m_targets.GetUnitTarget())
{
- if (m_targets.getUnitTarget()->GetTypeId() != TYPEID_PLAYER)
+ if (m_targets.GetUnitTarget()->GetTypeId() != TYPEID_PLAYER)
return SPELL_FAILED_BAD_TARGETS;
- if (m_targets.getUnitTarget()->GetPetGUID())
+ if (m_targets.GetUnitTarget()->GetPetGUID())
return SPELL_FAILED_ALREADY_HAVE_SUMMON;
}
break;
@@ -5288,7 +5328,7 @@ SpellCastResult Spell::CheckCast(bool strict)
}
case SPELL_EFFECT_STEAL_BENEFICIAL_BUFF:
{
- if (m_targets.getUnitTarget() == m_caster)
+ if (m_targets.GetUnitTarget() == m_caster)
return SPELL_FAILED_BAD_TARGETS;
break;
}
@@ -5298,7 +5338,7 @@ SpellCastResult Spell::CheckCast(bool strict)
if (m_caster->GetTypeId() == TYPEID_PLAYER && m_spellInfo->Id == 781 && !m_caster->isInCombat())
return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW;
- Unit* target = m_targets.getUnitTarget();
+ Unit* target = m_targets.GetUnitTarget();
if (m_caster == target && m_caster->HasUnitState(UNIT_STAT_ROOT))
{
if (m_caster->GetTypeId() == TYPEID_PLAYER)
@@ -5332,7 +5372,7 @@ SpellCastResult Spell::CheckCast(bool strict)
// Tag Murloc
case 30877:
{
- Unit* target = m_targets.getUnitTarget();
+ Unit* target = m_targets.GetUnitTarget();
if (!target || target->GetEntry() != 17326)
return SPELL_FAILED_BAD_TARGETS;
break;
@@ -5346,10 +5386,10 @@ SpellCastResult Spell::CheckCast(bool strict)
if (m_caster->GetTypeId() != TYPEID_PLAYER)
return SPELL_FAILED_BAD_TARGETS;
- if (!m_targets.getUnitTarget() || m_targets.getUnitTarget()->GetTypeId() == TYPEID_PLAYER)
+ if (!m_targets.GetUnitTarget() || m_targets.GetUnitTarget()->GetTypeId() == TYPEID_PLAYER)
return SPELL_FAILED_BAD_IMPLICIT_TARGETS;
- Creature* target = m_targets.getUnitTarget()->ToCreature();
+ Creature* target = m_targets.GetUnitTarget()->ToCreature();
if (target->getLevel() > m_caster->getLevel())
return SPELL_FAILED_HIGHLEVEL;
@@ -5410,7 +5450,7 @@ SpellCastResult Spell::CheckCast(bool strict)
return SPELL_FAILED_ALREADY_HAVE_CHARM;
}
- if (Unit* target = m_targets.getUnitTarget())
+ if (Unit* target = m_targets.GetUnitTarget())
{
if (target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->IsVehicle())
return SPELL_FAILED_BAD_IMPLICIT_TARGETS;
@@ -5448,11 +5488,11 @@ SpellCastResult Spell::CheckCast(bool strict)
}
case SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS:
{
- if (!m_targets.getUnitTarget())
+ if (!m_targets.GetUnitTarget())
return SPELL_FAILED_BAD_IMPLICIT_TARGETS;
// can be casted at non-friendly unit or own pet/charm
- if (m_caster->IsFriendlyTo(m_targets.getUnitTarget()))
+ if (m_caster->IsFriendlyTo(m_targets.GetUnitTarget()))
return SPELL_FAILED_TARGET_FRIENDLY;
break;
@@ -5472,13 +5512,13 @@ SpellCastResult Spell::CheckCast(bool strict)
}
case SPELL_AURA_PERIODIC_MANA_LEECH:
{
- if (!m_targets.getUnitTarget())
+ if (!m_targets.GetUnitTarget())
return SPELL_FAILED_BAD_IMPLICIT_TARGETS;
if (m_caster->GetTypeId() != TYPEID_PLAYER || m_CastItem)
break;
- if (m_targets.getUnitTarget()->getPowerType() != POWER_MANA)
+ if (m_targets.GetUnitTarget()->getPowerType() != POWER_MANA)
return SPELL_FAILED_BAD_TARGETS;
break;
@@ -5489,7 +5529,7 @@ SpellCastResult Spell::CheckCast(bool strict)
}
// check trade slot case (last, for allow catch any another cast problems)
- if (m_targets.getTargetMask() & TARGET_FLAG_TRADE_ITEM)
+ if (m_targets.GetTargetMask() & TARGET_FLAG_TRADE_ITEM)
{
if (m_CastItem)
return SPELL_FAILED_ITEM_ENCHANT_TRADE_WINDOW;
@@ -5502,7 +5542,7 @@ SpellCastResult Spell::CheckCast(bool strict)
if (!my_trade)
return SPELL_FAILED_NOT_TRADING;
- TradeSlots slot = TradeSlots(m_targets.getItemTargetGUID());
+ TradeSlots slot = TradeSlots(m_targets.GetItemTargetGUID());
if (slot != TRADE_SLOT_NONTRADED)
return SPELL_FAILED_BAD_TARGETS;
@@ -5536,8 +5576,8 @@ SpellCastResult Spell::CheckPetCast(Unit* target)
if (!owner->isAlive())
return SPELL_FAILED_CASTER_DEAD;
- if (!target && m_targets.getUnitTarget())
- target = m_targets.getUnitTarget();
+ if (!target && m_targets.GetUnitTarget())
+ target = m_targets.GetUnitTarget();
for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
@@ -5546,12 +5586,12 @@ SpellCastResult Spell::CheckPetCast(Unit* target)
{
if (!target)
return SPELL_FAILED_BAD_IMPLICIT_TARGETS;
- m_targets.setUnitTarget(target);
+ m_targets.SetUnitTarget(target);
break;
}
}
- Unit* _target = m_targets.getUnitTarget();
+ Unit* _target = m_targets.GetUnitTarget();
if (_target) //for target dead/target not valid
{
@@ -5726,7 +5766,7 @@ SpellCastResult Spell::CheckRange(bool strict)
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex);
- Unit* target = m_targets.getUnitTarget();
+ Unit* target = m_targets.GetUnitTarget();
float max_range = (float)m_caster->GetSpellMaxRangeForTarget(target, srange);
float min_range = (float)m_caster->GetSpellMinRangeForTarget(target, srange);
uint32 range_type = GetSpellRangeType(srange);
@@ -5760,9 +5800,9 @@ SpellCastResult Spell::CheckRange(bool strict)
if (m_targets.HasDst() && !m_targets.HasTraj())
{
- if (!m_caster->IsWithinDist3d(&m_targets.m_dstPos, max_range))
+ if (!m_caster->IsWithinDist3d(m_targets.GetDst(), max_range))
return SPELL_FAILED_OUT_OF_RANGE;
- if (min_range && m_caster->IsWithinDist3d(&m_targets.m_dstPos, min_range))
+ if (min_range && m_caster->IsWithinDist3d(m_targets.GetDst(), min_range))
return SPELL_FAILED_TOO_CLOSE;
}
@@ -5833,19 +5873,19 @@ SpellCastResult Spell::CheckItems()
return SPELL_FAILED_NO_CHARGES_REMAIN;
// consumable cast item checks
- if (proto->Class == ITEM_CLASS_CONSUMABLE && m_targets.getUnitTarget())
+ if (proto->Class == ITEM_CLASS_CONSUMABLE && m_targets.GetUnitTarget())
{
// such items should only fail if there is no suitable effect at all - see Rejuvenation Potions for example
SpellCastResult failReason = SPELL_CAST_OK;
for (int i = 0; i < MAX_SPELL_EFFECTS; i++)
{
- // skip check, pet not required like checks, and for TARGET_UNIT_PET m_targets.getUnitTarget() is not the real target but the caster
+ // skip check, pet not required like checks, and for TARGET_UNIT_PET m_targets.GetUnitTarget() is not the real target but the caster
if (m_spellInfo->EffectImplicitTargetA[i] == TARGET_UNIT_PET)
continue;
if (m_spellInfo->Effect[i] == SPELL_EFFECT_HEAL)
{
- if (m_targets.getUnitTarget()->IsFullHealth())
+ if (m_targets.GetUnitTarget()->IsFullHealth())
{
failReason = SPELL_FAILED_ALREADY_AT_FULL_HEALTH;
continue;
@@ -5867,7 +5907,7 @@ SpellCastResult Spell::CheckItems()
}
Powers power = Powers(m_spellInfo->EffectMiscValue[i]);
- if (m_targets.getUnitTarget()->GetPower(power) == m_targets.getUnitTarget()->GetMaxPower(power))
+ if (m_targets.GetUnitTarget()->GetPower(power) == m_targets.GetUnitTarget()->GetMaxPower(power))
{
failReason = SPELL_FAILED_ALREADY_AT_FULL_POWER;
continue;
@@ -5885,15 +5925,15 @@ SpellCastResult Spell::CheckItems()
}
// check target item
- if (m_targets.getItemTargetGUID())
+ if (m_targets.GetItemTargetGUID())
{
if (m_caster->GetTypeId() != TYPEID_PLAYER)
return SPELL_FAILED_BAD_TARGETS;
- if (!m_targets.getItemTarget())
+ if (!m_targets.GetItemTarget())
return SPELL_FAILED_ITEM_GONE;
- if (!m_targets.getItemTarget()->IsFitToSpellRequirements(m_spellInfo))
+ if (!m_targets.GetItemTarget()->IsFitToSpellRequirements(m_spellInfo))
return SPELL_FAILED_EQUIPPED_ITEM_CLASS;
}
// if not item target then required item must be equipped
@@ -5930,7 +5970,7 @@ SpellCastResult Spell::CheckItems()
bool checkReagents = !m_IsTriggeredSpell && !p_caster->CanNoReagentCast(m_spellInfo);
// Not own traded item (in trader trade slot) requires reagents even if triggered spell
if (!checkReagents)
- if (Item* targetItem = m_targets.getItemTarget())
+ if (Item* targetItem = m_targets.GetItemTarget())
if (targetItem->GetOwnerGUID() != m_caster->GetGUID())
checkReagents = true;
@@ -6039,11 +6079,11 @@ SpellCastResult Spell::CheckItems()
break;
}
case SPELL_EFFECT_ENCHANT_ITEM:
- if (m_spellInfo->EffectItemType[i] && m_targets.getItemTarget()
- && (m_targets.getItemTarget()->IsWeaponVellum() || m_targets.getItemTarget()->IsArmorVellum()))
+ if (m_spellInfo->EffectItemType[i] && m_targets.GetItemTarget()
+ && (m_targets.GetItemTarget()->IsWeaponVellum() || m_targets.GetItemTarget()->IsArmorVellum()))
{
// cannot enchant vellum for other player
- if (m_targets.getItemTarget()->GetOwner() != m_caster)
+ if (m_targets.GetItemTarget()->GetOwner() != m_caster)
return SPELL_FAILED_NOT_TRADEABLE;
// do not allow to enchant vellum from scroll made by vellum-prevent exploit
if (m_CastItem && m_CastItem->GetTemplate()->Flags & ITEM_PROTO_FLAG_TRIGGERED_CAST)
@@ -6058,7 +6098,7 @@ SpellCastResult Spell::CheckItems()
}
case SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC:
{
- Item* targetItem = m_targets.getItemTarget();
+ Item* targetItem = m_targets.GetItemTarget();
if (!targetItem)
return SPELL_FAILED_ITEM_NOT_FOUND;
@@ -6097,7 +6137,7 @@ SpellCastResult Spell::CheckItems()
}
case SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY:
{
- Item *item = m_targets.getItemTarget();
+ Item *item = m_targets.GetItemTarget();
if (!item)
return SPELL_FAILED_ITEM_NOT_FOUND;
// Not allow enchant in trade slot for some enchant type
@@ -6117,14 +6157,14 @@ SpellCastResult Spell::CheckItems()
break;
case SPELL_EFFECT_DISENCHANT:
{
- if (!m_targets.getItemTarget())
+ if (!m_targets.GetItemTarget())
return SPELL_FAILED_CANT_BE_DISENCHANTED;
// prevent disenchanting in trade slot
- if (m_targets.getItemTarget()->GetOwnerGUID() != m_caster->GetGUID())
+ if (m_targets.GetItemTarget()->GetOwnerGUID() != m_caster->GetGUID())
return SPELL_FAILED_CANT_BE_DISENCHANTED;
- ItemTemplate const* itemProto = m_targets.getItemTarget()->GetTemplate();
+ ItemTemplate const* itemProto = m_targets.GetItemTarget()->GetTemplate();
if (!itemProto)
return SPELL_FAILED_CANT_BE_DISENCHANTED;
@@ -6145,46 +6185,46 @@ SpellCastResult Spell::CheckItems()
}
case SPELL_EFFECT_PROSPECTING:
{
- if (!m_targets.getItemTarget())
+ if (!m_targets.GetItemTarget())
return SPELL_FAILED_CANT_BE_PROSPECTED;
//ensure item is a prospectable ore
- if (!(m_targets.getItemTarget()->GetTemplate()->Flags & ITEM_PROTO_FLAG_PROSPECTABLE))
+ if (!(m_targets.GetItemTarget()->GetTemplate()->Flags & ITEM_PROTO_FLAG_PROSPECTABLE))
return SPELL_FAILED_CANT_BE_PROSPECTED;
//prevent prospecting in trade slot
- if (m_targets.getItemTarget()->GetOwnerGUID() != m_caster->GetGUID())
+ if (m_targets.GetItemTarget()->GetOwnerGUID() != m_caster->GetGUID())
return SPELL_FAILED_CANT_BE_PROSPECTED;
//Check for enough skill in jewelcrafting
- uint32 item_prospectingskilllevel = m_targets.getItemTarget()->GetTemplate()->RequiredSkillRank;
+ uint32 item_prospectingskilllevel = m_targets.GetItemTarget()->GetTemplate()->RequiredSkillRank;
if (item_prospectingskilllevel >p_caster->GetSkillValue(SKILL_JEWELCRAFTING))
return SPELL_FAILED_LOW_CASTLEVEL;
//make sure the player has the required ores in inventory
- if (m_targets.getItemTarget()->GetCount() < 5)
+ if (m_targets.GetItemTarget()->GetCount() < 5)
return SPELL_FAILED_NEED_MORE_ITEMS;
- if (!LootTemplates_Prospecting.HaveLootFor(m_targets.getItemTargetEntry()))
+ if (!LootTemplates_Prospecting.HaveLootFor(m_targets.GetItemTargetEntry()))
return SPELL_FAILED_CANT_BE_PROSPECTED;
break;
}
case SPELL_EFFECT_MILLING:
{
- if (!m_targets.getItemTarget())
+ if (!m_targets.GetItemTarget())
return SPELL_FAILED_CANT_BE_MILLED;
//ensure item is a millable herb
- if (!(m_targets.getItemTarget()->GetTemplate()->Flags & ITEM_PROTO_FLAG_MILLABLE))
+ if (!(m_targets.GetItemTarget()->GetTemplate()->Flags & ITEM_PROTO_FLAG_MILLABLE))
return SPELL_FAILED_CANT_BE_MILLED;
//prevent milling in trade slot
- if (m_targets.getItemTarget()->GetOwnerGUID() != m_caster->GetGUID())
+ if (m_targets.GetItemTarget()->GetOwnerGUID() != m_caster->GetGUID())
return SPELL_FAILED_CANT_BE_MILLED;
//Check for enough skill in inscription
- uint32 item_millingskilllevel = m_targets.getItemTarget()->GetTemplate()->RequiredSkillRank;
+ uint32 item_millingskilllevel = m_targets.GetItemTarget()->GetTemplate()->RequiredSkillRank;
if (item_millingskilllevel >p_caster->GetSkillValue(SKILL_INSCRIPTION))
return SPELL_FAILED_LOW_CASTLEVEL;
//make sure the player has the required herbs in inventory
- if (m_targets.getItemTarget()->GetCount() < 5)
+ if (m_targets.GetItemTarget()->GetCount() < 5)
return SPELL_FAILED_NEED_MORE_ITEMS;
- if (!LootTemplates_Milling.HaveLootFor(m_targets.getItemTargetEntry()))
+ if (!LootTemplates_Milling.HaveLootFor(m_targets.GetItemTargetEntry()))
return SPELL_FAILED_CANT_BE_MILLED;
break;
@@ -6534,10 +6574,10 @@ bool Spell::CheckTarget(Unit* target, uint32 eff)
// player far away, maybe his corpse near?
if (target != m_caster && !target->IsWithinLOSInMap(m_caster))
{
- if (!m_targets.getCorpseTargetGUID())
+ if (!m_targets.GetCorpseTargetGUID())
return false;
- Corpse *corpse = ObjectAccessor::GetCorpse(*m_caster, m_targets.getCorpseTargetGUID());
+ Corpse *corpse = ObjectAccessor::GetCorpse(*m_caster, m_targets.GetCorpseTargetGUID());
if (!corpse)
return false;
@@ -6991,7 +7031,7 @@ void Spell::SelectTrajTargets()
if (!dist2d)
return;
- float dz = m_targets.m_dstPos.m_positionZ - m_targets.m_srcPos.m_positionZ;
+ float dz = m_targets.GetDst()->m_positionZ - m_targets.GetSrc()->m_positionZ;
UnitList unitList;
SearchAreaTarget(unitList, dist2d, PUSH_IN_THIN_LINE, SPELL_TARGETS_ANY);
@@ -7000,7 +7040,7 @@ void Spell::SelectTrajTargets()
unitList.sort(Trinity::ObjectDistanceOrderPred(m_caster));
- float b = tangent(m_targets.m_elevation);
+ float b = tangent(m_targets.GetElevation());
float a = (dz - dist2d * b) / (dist2d * dist2d);
if (a > -0.0001f) a = 0;
DEBUG_TRAJ(sLog->outError("Spell::SelectTrajTargets: a %f b %f", a, b);)
@@ -7015,8 +7055,8 @@ void Spell::SelectTrajTargets()
const float size = std::max((*itr)->GetObjectSize() * 0.7f, 1.0f); // 1/sqrt(3)
// TODO: all calculation should be based on src instead of m_caster
- const float objDist2d = m_targets.m_srcPos.GetExactDist2d(*itr) * cos(m_targets.m_srcPos.GetRelativeAngle(*itr));
- const float dz = (*itr)->GetPositionZ() - m_targets.m_srcPos.m_positionZ;
+ const float objDist2d = m_targets.GetSrc()->GetExactDist2d(*itr) * cos(m_targets.GetSrc()->GetRelativeAngle(*itr));
+ const float dz = (*itr)->GetPositionZ() - m_targets.GetSrc()->m_positionZ;
DEBUG_TRAJ(sLog->outError("Spell::SelectTrajTargets: check %u, dist between %f %f, height between %f %f.", (*itr)->GetEntry(), objDist2d - size, objDist2d + size, dz - size, dz + size);)
@@ -7076,11 +7116,11 @@ void Spell::SelectTrajTargets()
}
}
- if (m_targets.m_srcPos.GetExactDist2d(&m_targets.m_dstPos) > bestDist)
+ if (m_targets.GetSrc()->GetExactDist2d(m_targets.GetDst()) > bestDist)
{
- float x = m_targets.m_srcPos.m_positionX + cos(m_caster->GetOrientation()) * bestDist;
- float y = m_targets.m_srcPos.m_positionY + sin(m_caster->GetOrientation()) * bestDist;
- float z = m_targets.m_srcPos.m_positionZ + bestDist * (a * bestDist + b);
+ float x = m_targets.GetSrc()->m_positionX + cos(m_caster->GetOrientation()) * bestDist;
+ float y = m_targets.GetSrc()->m_positionY + sin(m_caster->GetOrientation()) * bestDist;
+ float z = m_targets.GetSrc()->m_positionZ + bestDist * (a * bestDist + b);
if (itr != unitList.end())
{
@@ -7102,7 +7142,7 @@ void Spell::SelectTrajTargets()
Position trajDst;
trajDst.Relocate(x, y, z, m_caster->GetOrientation());
- m_targets.modDst(trajDst);
+ m_targets.ModDst(trajDst);
}
}
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 8b40ffe575a..ddb700aa8ab 100755
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -34,6 +34,8 @@ class ByteBuffer;
struct SpellEntry;
+#define SPELL_CHANNEL_UPDATE_INTERVAL (1 * IN_MILLISECONDS)
+
enum SpellCastTargetFlags
{
TARGET_FLAG_SELF = 0x00000000,
@@ -117,117 +119,75 @@ enum SpellNotifyPushType
PUSH_CHAIN,
};
-bool IsQuestTameSpell(uint32 spellId);
-
-namespace Trinity
-{
- struct SpellNotifierCreatureAndPlayer;
-}
-
-typedef std::list<Unit*> UnitList;
-
class SpellCastTargets
{
public:
SpellCastTargets();
~SpellCastTargets();
- SpellCastTargets& operator=(const SpellCastTargets &target)
- {
- m_unitTarget = target.m_unitTarget;
- m_itemTarget = target.m_itemTarget;
- m_GOTarget = target.m_GOTarget;
+ SpellCastTargets& operator=(const SpellCastTargets &target);
- m_unitTargetGUID = target.m_unitTargetGUID;
- m_GOTargetGUID = target.m_GOTargetGUID;
- m_CorpseTargetGUID = target.m_CorpseTargetGUID;
- m_itemTargetGUID = target.m_itemTargetGUID;
+ void Read(ByteBuffer& data, Unit* caster);
+ void Write(ByteBuffer& data);
- m_itemTargetEntry = target.m_itemTargetEntry;
+ uint32 GetTargetMask() const { return m_targetMask; }
+ void SetTargetMask(uint32 newMask) { m_targetMask = newMask; }
- m_srcTransGUID = target.m_srcTransGUID;
- m_srcTransOffset = target.m_srcTransOffset;
- m_srcPos = target.m_srcPos;
+ uint64 GetUnitTargetGUID() const { return m_unitTargetGUID; }
+ Unit* GetUnitTarget() const { return m_unitTarget; }
+ void SetUnitTarget(Unit* target);
- m_dstTransGUID = target.m_dstTransGUID;
- m_dstTransOffset = target.m_dstTransOffset;
- m_dstPos = target.m_dstPos;
+ Position const* GetSrc() const;
+ void SetSrc(float x, float y, float z);
+ void SetSrc(Position const& pos);
+ void SetSrc(WorldObject const& wObj);
+ void ModSrc(Position const& pos);
- m_elevation = target.m_elevation;
- m_speed = target.m_speed;
+ WorldLocation const* GetDst() const;
+ void SetDst(float x, float y, float z, float orientation, uint32 mapId = MAPID_INVALID);
+ void SetDst(Position const& pos);
+ void SetDst(WorldObject const& wObj);
+ void SetDst(SpellCastTargets const& spellTargets);
+ void ModDst(Position const& pos);
- m_strTarget = target.m_strTarget;
+ uint64 GetGOTargetGUID() const { return m_GOTargetGUID; }
+ GameObject* GetGOTarget() const { return m_GOTarget; }
+ void SetGOTarget(GameObject* target);
- m_targetMask = target.m_targetMask;
+ uint64 GetCorpseTargetGUID() const { return m_CorpseTargetGUID; }
+ void SetCorpseTarget(Corpse* corpse);
- return *this;
- }
- void read (ByteBuffer & data, Unit* caster);
- void write (ByteBuffer & data);
-
- uint32 getTargetMask() const { return m_targetMask; }
- void setTargetMask(uint32 newMask) { m_targetMask = newMask; }
-
- uint64 getUnitTargetGUID() const { return m_unitTargetGUID; }
- Unit *getUnitTarget() const { return m_unitTarget; }
- void setUnitTarget(Unit* target);
- void setSrc(float x, float y, float z);
- void setSrc(Position &pos);
- void setSrc(WorldObject &wObj);
- void modSrc(Position &pos);
- void setDst(float x, float y, float z, float orientation, uint32 mapId = MAPID_INVALID);
- void setDst(Position &pos);
- void setDst(WorldObject &wObj);
- void setDst(SpellCastTargets &spellTargets);
- void modDst(Position &pos);
-
- uint64 getGOTargetGUID() const { return m_GOTargetGUID; }
- GameObject *getGOTarget() const { return m_GOTarget; }
- void setGOTarget(GameObject *target);
-
- uint64 getCorpseTargetGUID() const { return m_CorpseTargetGUID; }
- void setCorpseTarget(Corpse* corpse);
- uint64 getItemTargetGUID() const { return m_itemTargetGUID; }
- Item* getItemTarget() const { return m_itemTarget; }
- uint32 getItemTargetEntry() const { return m_itemTargetEntry; }
- void setItemTarget(Item* item);
- void setTradeItemTarget(Player* caster);
- void updateTradeSlotItem()
- {
- if (m_itemTarget && (m_targetMask & TARGET_FLAG_TRADE_ITEM))
- {
- m_itemTargetGUID = m_itemTarget->GetGUID();
- m_itemTargetEntry = m_itemTarget->GetEntry();
- }
- }
+ uint64 GetItemTargetGUID() const { return m_itemTargetGUID; }
+ Item* GetItemTarget() const { return m_itemTarget; }
+ uint32 GetItemTargetEntry() const { return m_itemTargetEntry; }
+ void SetItemTarget(Item* item);
+ void SetTradeItemTarget(Player* caster);
+ void UpdateTradeSlotItem();
bool IsEmpty() const { return m_GOTargetGUID == 0 && m_unitTargetGUID == 0 && m_itemTarget == 0 && m_CorpseTargetGUID == 0; }
- bool HasSrc() const { return getTargetMask() & TARGET_FLAG_SOURCE_LOCATION; }
- bool HasDst() const { return getTargetMask() & TARGET_FLAG_DEST_LOCATION; }
+ bool HasSrc() const { return GetTargetMask() & TARGET_FLAG_SOURCE_LOCATION; }
+ bool HasDst() const { return GetTargetMask() & TARGET_FLAG_DEST_LOCATION; }
bool HasTraj() const { return m_speed != 0; }
+ float GetElevation() const { return m_elevation; }
+ void SetElevation(float elevation) { m_elevation = elevation; }
+ float GetSpeed() const { return m_speed; }
+ void SetSpeed(float speed) { m_speed = speed; }
+
float GetDist2d() const { return m_srcPos.GetExactDist2d(&m_dstPos); }
float GetSpeedXY() const { return m_speed * cos(m_elevation); }
float GetSpeedZ() const { return m_speed * sin(m_elevation); }
void Update(Unit* caster);
- void OutDebug();
-
- uint64 m_srcTransGUID;
- Position m_srcTransOffset;
- Position m_srcPos;
- uint64 m_dstTransGUID;
- Position m_dstTransOffset;
- WorldLocation m_dstPos;
- float m_elevation, m_speed;
- std::string m_strTarget;
+ void OutDebug() const;
private:
uint32 m_targetMask;
+
// objects (can be used at spell creating and after Update at casting
- Unit *m_unitTarget;
- GameObject *m_GOTarget;
- Item *m_itemTarget;
+ Unit* m_unitTarget;
+ GameObject* m_GOTarget;
+ Item* m_itemTarget;
// object GUID/etc, can be used always
uint64 m_unitTargetGUID;
@@ -235,6 +195,17 @@ class SpellCastTargets
uint64 m_CorpseTargetGUID;
uint64 m_itemTargetGUID;
uint32 m_itemTargetEntry;
+
+ uint64 m_srcTransGUID;
+ Position m_srcTransOffset;
+ Position m_srcPos;
+
+ uint64 m_dstTransGUID;
+ Position m_dstTransOffset;
+ WorldLocation m_dstPos;
+
+ float m_elevation, m_speed;
+ std::string m_strTarget;
};
struct SpellValue
@@ -247,7 +218,7 @@ struct SpellValue
RadiusMod = 1.0f;
AuraStackAmount = 1;
}
- int32 EffectBasePoints[3];
+ int32 EffectBasePoints[MAX_SPELL_EFFECTS];
uint32 MaxAffectedTargets;
float RadiusMod;
uint8 AuraStackAmount;
@@ -263,14 +234,6 @@ enum SpellState
SPELL_STATE_DELAYED = 5
};
-enum ReplenishType
-{
- REPLENISH_UNDEFINED = 0,
- REPLENISH_HEALTH = 20,
- REPLENISH_MANA = 21,
- REPLENISH_RAGE = 22
-};
-
enum SpellTargets
{
SPELL_TARGETS_NONE = 0,
@@ -282,6 +245,11 @@ enum SpellTargets
SPELL_TARGETS_GO
};
+namespace Trinity
+{
+ struct SpellNotifierCreatureAndPlayer;
+}
+
class Spell
{
friend struct Trinity::SpellNotifierCreatureAndPlayer;
@@ -416,7 +384,7 @@ class Spell
void EffectCastButtons(SpellEffIndex effIndex);
void EffectRechargeManaGem(SpellEffIndex effIndex);
- typedef std::set<Aura *> UsedSpellMods;
+ typedef std::set<Aura*> UsedSpellMods;
Spell(Unit* Caster, SpellEntry const *info, bool triggered, uint64 originalCasterGUID = 0, bool skipCheck = false);
~Spell();
@@ -469,8 +437,8 @@ class Spell
bool CheckTarget(Unit* target, uint32 eff);
bool CanAutoCast(Unit* target);
- void CheckSrc() { if (!m_targets.HasSrc()) m_targets.setSrc(*m_caster); }
- void CheckDst() { if (!m_targets.HasDst()) m_targets.setDst(*m_caster); }
+ void CheckSrc() { if (!m_targets.HasSrc()) m_targets.SetSrc(*m_caster); }
+ void CheckDst() { if (!m_targets.HasDst()) m_targets.SetDst(*m_caster); }
static void SendCastResult(Player* caster, SpellEntry const* spellInfo, uint8 cast_count, SpellCastResult result, SpellCustomErrors customError = SPELL_CUSTOM_ERROR_NONE);
void SendCastResult(SpellCastResult result);
@@ -565,7 +533,7 @@ class Spell
//Spell data
SpellSchoolMask m_spellSchoolMask; // Spell school (can be overwrite for some spells (wand shoot for example)
WeaponAttackType m_attackType; // For weapon based attack
- int32 m_powerCost; // Calculated spell cost initialized only in Spell::prepare
+ int32 m_powerCost; // Calculated spell cost initialized only in Spell::prepare
int32 m_casttime; // Calculated spell cast time initialized only in Spell::prepare
bool m_canReflect; // can reflect this spell?
bool m_autoRepeat;
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 67771d90f1c..6d2a47bdce4 100755
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -1162,7 +1162,7 @@ void Spell::EffectDummy(SpellEffIndex effIndex)
if (Unit* device = seat->GetPassenger(2))
if (!device->GetCurrentSpell(CURRENT_CHANNELED_SPELL))
{
- float dist = (*itr)->GetExactDistSq(&m_targets.m_dstPos);
+ float dist = (*itr)->GetExactDistSq(m_targets.GetDst());
if (dist < minDist)
{
minDist = dist;
@@ -1170,13 +1170,13 @@ void Spell::EffectDummy(SpellEffIndex effIndex)
}
}
}
- if (target && target->IsWithinDist2d(&m_targets.m_dstPos, GetSpellRadius(m_spellInfo, effIndex, false) * 2)) // now we use *2 because the location of the seat is not correct
+ if (target && target->IsWithinDist2d(m_targets.GetDst(), GetSpellRadius(m_spellInfo, effIndex, false) * 2)) // now we use *2 because the location of the seat is not correct
passenger->EnterVehicle(target, 0);
else
{
passenger->ExitVehicle();
float x, y, z;
- m_targets.m_dstPos.GetPosition(x, y, z);
+ m_targets.GetDst()->GetPosition(x, y, z);
passenger->GetMotionMaster()->MoveJump(x, y, z, m_targets.GetSpeedXY(), m_targets.GetSpeedZ());
}
}
@@ -1499,10 +1499,10 @@ void Spell::EffectDummy(SpellEffIndex effIndex)
bp = 46585;
if (m_targets.HasDst())
- targets.setDst(m_targets.m_dstPos);
+ targets.SetDst(*m_targets.GetDst());
else
{
- targets.setDst(*m_caster);
+ targets.SetDst(*m_caster);
// Corpse not found - take reagents (only not triggered cast can take them)
triggered = false;
}
@@ -1513,7 +1513,7 @@ void Spell::EffectDummy(SpellEffIndex effIndex)
// Raise dead - take reagents and trigger summon spells
case 48289:
if (m_targets.HasDst())
- targets.setDst(m_targets.m_dstPos);
+ targets.SetDst(*m_targets.GetDst());
spell_id = CalculateDamage(0, NULL);
break;
@@ -1532,7 +1532,7 @@ void Spell::EffectDummy(SpellEffIndex effIndex)
return;
}
- targets.setUnitTarget(unitTarget);
+ targets.SetUnitTarget(unitTarget);
Spell* spell = new Spell(m_caster, spellInfo, triggered, m_originalCasterGUID, true);
if (bp) spell->SetSpellValue(SPELLVALUE_BASE_POINT0, bp);
spell->prepare(&targets);
@@ -1834,7 +1834,7 @@ void Spell::EffectTriggerMissileSpell(SpellEffIndex effIndex)
m_caster->ToPlayer()->RemoveSpellCooldown(spellInfo->Id);
float x, y, z;
- m_targets.m_dstPos.GetPosition(x, y, z);
+ m_targets.GetDst()->GetPosition(x, y, z);
m_caster->CastSpell(x, y, z, spellInfo->Id, true, m_CastItem, 0, m_originalCasterGUID);
}
@@ -1844,10 +1844,10 @@ void Spell::EffectJump(SpellEffIndex effIndex)
return;
float x, y, z;
- if (m_targets.getUnitTarget())
- m_targets.getUnitTarget()->GetContactPoint(m_caster, x, y, z, CONTACT_DISTANCE);
- else if (m_targets.getGOTarget())
- m_targets.getGOTarget()->GetContactPoint(m_caster, x, y, z, CONTACT_DISTANCE);
+ if (m_targets.GetUnitTarget())
+ m_targets.GetUnitTarget()->GetContactPoint(m_caster, x, y, z, CONTACT_DISTANCE);
+ else if (m_targets.GetGOTarget())
+ m_targets.GetGOTarget()->GetContactPoint(m_caster, x, y, z, CONTACT_DISTANCE);
else
{
sLog->outError("Spell::EffectJump - unsupported target mode for spell ID %u", m_spellInfo->Id);
@@ -1868,15 +1868,15 @@ void Spell::EffectJumpDest(SpellEffIndex effIndex)
float x, y, z;
if (m_targets.HasDst())
{
- m_targets.m_dstPos.GetPosition(x, y, z);
+ m_targets.GetDst()->GetPosition(x, y, z);
if (m_spellInfo->EffectImplicitTargetA[effIndex] == TARGET_DEST_TARGET_BACK)
{
// explicit cast data from client or server-side cast
// some spell at client send caster
Unit* pTarget = NULL;
- if (m_targets.getUnitTarget() && m_targets.getUnitTarget() != m_caster)
- pTarget = m_targets.getUnitTarget();
+ if (m_targets.GetUnitTarget() && m_targets.GetUnitTarget() != m_caster)
+ pTarget = m_targets.GetUnitTarget();
else if (m_caster->getVictim())
pTarget = m_caster->getVictim();
else if (m_caster->GetTypeId() == TYPEID_PLAYER)
@@ -1934,18 +1934,18 @@ void Spell::EffectTeleportUnits(SpellEffIndex /*effIndex*/)
if (Player* pTarget = unitTarget->ToPlayer())
{
if (pTarget->GetTeamId() == TEAM_ALLIANCE)
- m_targets.setDst(442.24f, -835.25f, 44.30f, 0.06f, 628);
+ m_targets.SetDst(442.24f, -835.25f, 44.30f, 0.06f, 628);
else
- m_targets.setDst(1120.43f, -762.11f, 47.92f, 2.94f, 628);
+ m_targets.SetDst(1120.43f, -762.11f, 47.92f, 2.94f, 628);
}
break;
case 66551: // teleports inside (Isle of Conquest)
if (Player* pTarget = unitTarget->ToPlayer())
{
if (pTarget->GetTeamId() == TEAM_ALLIANCE)
- m_targets.setDst(389.57f, -832.38f, 48.65f, 3.00f, 628);
+ m_targets.SetDst(389.57f, -832.38f, 48.65f, 3.00f, 628);
else
- m_targets.setDst(1174.85f, -763.24f, 48.72f, 6.26f, 628);
+ m_targets.SetDst(1174.85f, -763.24f, 48.72f, 6.26f, 628);
}
break;
}
@@ -1958,13 +1958,13 @@ void Spell::EffectTeleportUnits(SpellEffIndex /*effIndex*/)
}
// Init dest coordinates
- uint32 mapid = m_targets.m_dstPos.GetMapId();
+ uint32 mapid = m_targets.GetDst()->GetMapId();
if (mapid == MAPID_INVALID)
mapid = unitTarget->GetMapId();
float x, y, z, orientation;
- m_targets.m_dstPos.GetPosition(x, y, z, orientation);
- if (!orientation && m_targets.getUnitTarget())
- orientation = m_targets.getUnitTarget()->GetOrientation();
+ m_targets.GetDst()->GetPosition(x, y, z, orientation);
+ if (!orientation && m_targets.GetUnitTarget())
+ orientation = m_targets.GetUnitTarget()->GetOrientation();
sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell::EffectTeleportUnits - teleport unit to %u %f %f %f %f\n", mapid, x, y, z, orientation);
if (mapid == unitTarget->GetMapId())
@@ -2535,7 +2535,7 @@ void Spell::EffectPersistentAA(SpellEffIndex effIndex)
if (!caster->IsInWorld())
return;
DynamicObject* dynObj = new DynamicObject();
- if (!dynObj->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), caster, m_spellInfo->Id, m_targets.m_dstPos, radius, false, DYNAMIC_OBJECT_AREA_SPELL))
+ if (!dynObj->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), caster, m_spellInfo->Id, *m_targets.GetDst(), radius, false, DYNAMIC_OBJECT_AREA_SPELL))
{
delete dynObj;
return;
@@ -2896,8 +2896,8 @@ void Spell::EffectSummonChangeItem(SpellEffIndex effIndex)
player->DestroyItem(m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), true);
// prevent crash at access and unexpected charges counting with item update queue corrupt
- if (m_CastItem == m_targets.getItemTarget())
- m_targets.setItemTarget(NULL);
+ if (m_CastItem == m_targets.GetItemTarget())
+ m_targets.SetItemTarget(NULL);
m_CastItem = NULL;
@@ -2914,8 +2914,8 @@ void Spell::EffectSummonChangeItem(SpellEffIndex effIndex)
player->DestroyItem(m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), true);
// prevent crash at access and unexpected charges counting with item update queue corrupt
- if (m_CastItem == m_targets.getItemTarget())
- m_targets.setItemTarget(NULL);
+ if (m_CastItem == m_targets.GetItemTarget())
+ m_targets.SetItemTarget(NULL);
m_CastItem = NULL;
@@ -2936,8 +2936,8 @@ void Spell::EffectSummonChangeItem(SpellEffIndex effIndex)
if (msg == EQUIP_ERR_CANT_DO_RIGHT_NOW) dest = EQUIPMENT_SLOT_MAINHAND;
// prevent crash at access and unexpected charges counting with item update queue corrupt
- if (m_CastItem == m_targets.getItemTarget())
- m_targets.setItemTarget(NULL);
+ if (m_CastItem == m_targets.GetItemTarget())
+ m_targets.SetItemTarget(NULL);
m_CastItem = NULL;
@@ -3305,7 +3305,7 @@ void Spell::EffectDistract(SpellEffIndex /*effIndex*/)
if (unitTarget->HasUnitState(UNIT_STAT_CONFUSED | UNIT_STAT_STUNNED | UNIT_STAT_FLEEING))
return;
- float angle = unitTarget->GetAngle(&m_targets.m_dstPos);
+ float angle = unitTarget->GetAngle(m_targets.GetDst());
if (unitTarget->GetTypeId() == TYPEID_PLAYER)
{
@@ -3348,7 +3348,7 @@ void Spell::EffectAddFarsight(SpellEffIndex effIndex)
return;
DynamicObject* dynObj = new DynamicObject();
- if (!dynObj->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_caster, m_spellInfo->Id, m_targets.m_dstPos, radius, true, DYNAMIC_OBJECT_FARSIGHT_FOCUS))
+ if (!dynObj->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_caster, m_spellInfo->Id, *m_targets.GetDst(), radius, true, DYNAMIC_OBJECT_FARSIGHT_FOCUS))
{
delete dynObj;
return;
@@ -3455,7 +3455,7 @@ void Spell::EffectEnchantItemPerm(SpellEffIndex effIndex)
// and add a scroll
DoCreateItem(effIndex, m_spellInfo->EffectItemType[effIndex]);
itemTarget=NULL;
- m_targets.setItemTarget(NULL);
+ m_targets.SetItemTarget(NULL);
}
else
{
@@ -3608,7 +3608,7 @@ void Spell::EffectEnchantItemTmp(SpellEffIndex effIndex)
{
Spell* spell = new Spell(m_caster, spellInfo, true);
SpellCastTargets targets;
- targets.setItemTarget(item);
+ targets.SetItemTarget(item);
spell->prepare(&targets);
}
}
@@ -4248,7 +4248,7 @@ void Spell::EffectSummonObjectWild(SpellEffIndex effIndex)
float x, y, z;
if (m_targets.HasDst())
- m_targets.m_dstPos.GetPosition(x, y, z);
+ m_targets.GetDst()->GetPosition(x, y, z);
else
m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE);
@@ -4759,7 +4759,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex)
float radius = GetSpellRadius(m_spellInfo, effIndex, true);
for (uint8 i = 0; i < 15; ++i)
{
- m_caster->GetRandomPoint(m_targets.m_dstPos, radius, x, y, z);
+ m_caster->GetRandomPoint(*m_targets.GetDst(), radius, x, y, z);
m_caster->CastSpell(x, y, z, 54522, true);
}
break;
@@ -5309,15 +5309,15 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex)
if (m_spellInfo->SpellFamilyFlags[1]&0x10000)
{
// Get diseases on target of spell
- if (m_targets.getUnitTarget() && // Glyph of Disease - cast on unit target too to refresh aura
- (m_targets.getUnitTarget() != unitTarget || m_caster->GetAura(63334)))
+ if (m_targets.GetUnitTarget() && // Glyph of Disease - cast on unit target too to refresh aura
+ (m_targets.GetUnitTarget() != unitTarget || m_caster->GetAura(63334)))
{
// And spread them on target
// Blood Plague
- if (m_targets.getUnitTarget()->GetAura(55078))
+ if (m_targets.GetUnitTarget()->GetAura(55078))
m_caster->CastSpell(unitTarget, 55078, true);
// Frost Fever
- if (m_targets.getUnitTarget()->GetAura(55095))
+ if (m_targets.GetUnitTarget()->GetAura(55095))
m_caster->CastSpell(unitTarget, 55095, true);
}
}
@@ -5674,7 +5674,7 @@ void Spell::EffectFeedPet(SpellEffIndex effIndex)
Player* _player = m_caster->ToPlayer();
- Item* foodItem = m_targets.getItemTarget();
+ Item* foodItem = m_targets.GetItemTarget();
if (!foodItem)
return;
@@ -5749,7 +5749,7 @@ void Spell::EffectSummonObject(SpellEffIndex effIndex)
float x, y, z;
// If dest location if present
if (m_targets.HasDst())
- m_targets.m_dstPos.GetPosition(x, y, z);
+ m_targets.GetDst()->GetPosition(x, y, z);
// Summon in random point all other units if location present
else
m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE);
@@ -5863,7 +5863,7 @@ void Spell::EffectLeap(SpellEffIndex /*effIndex*/)
if (!m_targets.HasDst())
return;
- unitTarget->NearTeleportTo(m_targets.m_dstPos.GetPositionX(), m_targets.m_dstPos.GetPositionY(), m_targets.m_dstPos.GetPositionZ(), m_targets.m_dstPos.GetOrientation(), unitTarget == m_caster);
+ unitTarget->NearTeleportTo(m_targets.GetDst()->GetPositionX(), m_targets.GetDst()->GetPositionY(), m_targets.GetDst()->GetPositionZ(), m_targets.GetDst()->GetOrientation(), unitTarget == m_caster);
}
void Spell::EffectReputation(SpellEffIndex effIndex)
@@ -5984,7 +5984,7 @@ void Spell::EffectSkinning(SpellEffIndex /*effIndex*/)
void Spell::EffectCharge(SpellEffIndex /*effIndex*/)
{
- Unit* target = m_targets.getUnitTarget();
+ Unit* target = m_targets.GetUnitTarget();
if (!target)
return;
@@ -6002,7 +6002,7 @@ void Spell::EffectChargeDest(SpellEffIndex /*effIndex*/)
if (m_targets.HasDst())
{
float x, y, z;
- m_targets.m_dstPos.GetPosition(x, y, z);
+ m_targets.GetDst()->GetPosition(x, y, z);
m_caster->GetMotionMaster()->MoveCharge(x, y, z);
}
}
@@ -6050,7 +6050,7 @@ void Spell::EffectKnockBack(SpellEffIndex effIndex)
if (m_spellInfo->Effect[effIndex] == SPELL_EFFECT_KNOCK_BACK_DEST)
{
if (m_targets.HasDst())
- m_targets.m_dstPos.GetPosition(x, y);
+ m_targets.GetDst()->GetPosition(x, y);
else
return;
}
@@ -6068,8 +6068,8 @@ void Spell::EffectLeapBack(SpellEffIndex effIndex)
float speedz = float(damage/10);
if (!speedxy)
{
- if (m_targets.getUnitTarget())
- m_caster->JumpTo(m_targets.getUnitTarget(), speedz);
+ if (m_targets.GetUnitTarget())
+ m_caster->JumpTo(m_targets.GetUnitTarget(), speedz);
}
else
{
@@ -6136,7 +6136,7 @@ void Spell::EffectPullTowards(SpellEffIndex effIndex)
if (m_spellInfo->Effect[effIndex] == SPELL_EFFECT_PULL_TOWARDS_DEST)
{
if (m_targets.HasDst())
- pos.Relocate(m_targets.m_dstPos);
+ pos.Relocate(*m_targets.GetDst());
else
return;
}
@@ -6303,7 +6303,7 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex)
float fx, fy, fz;
if (m_targets.HasDst())
- m_targets.m_dstPos.GetPosition(fx, fy, fz);
+ m_targets.GetDst()->GetPosition(fx, fy, fz);
//FIXME: this can be better check for most objects but still hack
else if (m_spellInfo->EffectRadiusIndex[effIndex] && m_spellInfo->speed == 0)
{
@@ -6893,7 +6893,7 @@ void Spell::GetSummonPosition(uint32 i, Position &pos, float radius, uint32 coun
{
// Summon 1 unit in dest location
if (count == 0)
- pos.Relocate(m_targets.m_dstPos);
+ pos.Relocate(*m_targets.GetDst());
// Summon in random point all other units if location present
else
{
@@ -6906,10 +6906,10 @@ void Spell::GetSummonPosition(uint32 i, Position &pos, float radius, uint32 coun
break;
case TARGET_DEST_DEST_RANDOM:
case TARGET_DEST_TARGET_RANDOM:
- m_caster->GetRandomPoint(m_targets.m_dstPos, radius, pos);
+ m_caster->GetRandomPoint(*m_targets.GetDst(), radius, pos);
break;
default:
- pos.Relocate(m_targets.m_dstPos);
+ pos.Relocate(*m_targets.GetDst());
break;
}
}
diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h
index b5a43868de7..c824d6f2334 100755
--- a/src/server/game/Spells/SpellMgr.h
+++ b/src/server/game/Spells/SpellMgr.h
@@ -289,6 +289,11 @@ inline bool IsLootCraftingSpell(SpellEntry const *spellInfo)
(spellInfo->TotemCategory[0] != 0 || spellInfo->EffectItemType[0]==0)));
}
+inline bool IsQuestTameSpell(SpellEntry const* spellInfo)
+{
+ return spellInfo->Effect[0] == SPELL_EFFECT_THREAT && spellInfo->Effect[1] == SPELL_EFFECT_APPLY_AURA && spellInfo->EffectApplyAuraName[1] == SPELL_AURA_DUMMY;
+}
+
bool IsHigherHankOfSpell(uint32 spellId_1, uint32 spellId_2);
bool IsSingleFromSpellSpecificPerCaster(SpellSpecific spellSpec1, SpellSpecific spellSpec2);
bool IsSingleFromSpellSpecificPerTarget(SpellSpecific spellSpec1, SpellSpecific spellSpec2);
diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp
index 59be9c71963..0fe75da3da1 100755
--- a/src/server/game/Spells/SpellScript.cpp
+++ b/src/server/game/Spells/SpellScript.cpp
@@ -266,26 +266,31 @@ SpellEntry const* SpellScript::GetSpellInfo()
return m_spell->GetSpellInfo();
}
-WorldLocation* SpellScript::GetTargetDest()
+WorldLocation const* SpellScript::GetTargetDest()
{
if (m_spell->m_targets.HasDst())
- return &m_spell->m_targets.m_dstPos;
+ return m_spell->m_targets.GetDst();
return NULL;
}
+void SpellScript::SetTargetDest(WorldLocation& loc)
+{
+ m_spell->m_targets.SetDst(loc);
+}
+
Unit* SpellScript::GetTargetUnit()
{
- return m_spell->m_targets.getUnitTarget();
+ return m_spell->m_targets.GetUnitTarget();
}
GameObject* SpellScript::GetTargetGObj()
{
- return m_spell->m_targets.getGOTarget();
+ return m_spell->m_targets.GetGOTarget();
}
Item* SpellScript::GetTargetItem()
{
- return m_spell->m_targets.getItemTarget();
+ return m_spell->m_targets.GetItemTarget();
}
Unit* SpellScript::GetHitUnit()
diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h
index 4b0709b74e3..5c5050aef21 100755
--- a/src/server/game/Spells/SpellScript.h
+++ b/src/server/game/Spells/SpellScript.h
@@ -261,7 +261,9 @@ class SpellScript : public _SpellScript
// accessors to the "focus" targets of the spell
// note: do not confuse these with spell hit targets
// returns: WorldLocation which was selected as a spell destination or NULL
- WorldLocation* GetTargetDest();
+ WorldLocation const* GetTargetDest();
+
+ void SetTargetDest(WorldLocation& loc);
// returns: Unit which was selected as a spell target or NULL
Unit* GetTargetUnit();
diff --git a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp
index 9e8890b7064..896d27bd768 100644
--- a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp
+++ b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp
@@ -47,8 +47,7 @@ public:
}
if (pInstance->GetData(EVENT_STATE)!= CANNON_NOT_USED)
return false;
- if (targets.getGOTarget() && targets.getGOTarget()->GetTypeId() == TYPEID_GAMEOBJECT &&
- targets.getGOTarget()->GetEntry() == GO_DEFIAS_CANNON)
+ if (targets.GetGOTarget() && targets.GetGOTarget()->GetEntry() == GO_DEFIAS_CANNON)
{
pInstance->SetData(EVENT_STATE, CANNON_GUNPOWDER_USED);
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
index 3e66cf5ec8e..4a394cffe62 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
@@ -1478,9 +1478,10 @@ class spell_valanar_kinetic_bomb : public SpellScriptLoader
void ChangeSummonPos(SpellEffIndex /*effIndex*/)
{
- WorldLocation* summonPos = GetTargetDest();
+ WorldLocation summonPos = *GetTargetDest();
Position offset = {0.0f, 0.0f, 20.0f, 0.0f};
- summonPos->RelocateOffset(offset); // +20 in height
+ summonPos.RelocateOffset(offset);
+ SetTargetDest(summonPos);
}
void Register()
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index 2dbca8f4f8f..ffc0b7fb026 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
@@ -1260,7 +1260,7 @@ class spell_rimefang_icy_blast : public SpellScriptLoader
void HandleTriggerMissile(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
- if (Position* pos = GetTargetDest())
+ if (Position const* pos = GetTargetDest())
if (TempSummon* summon = GetCaster()->SummonCreature(NPC_ICY_BLAST, *pos, TEMPSUMMON_TIMED_DESPAWN, 40000))
summon->CastSpell(summon, SPELL_ICY_BLAST_AREA, true);
}
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp
index 789c17b1b1f..73baeae441f 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp
@@ -988,7 +988,7 @@ class spell_razorscale_devouring_flame : public SpellScriptLoader
PreventHitDefaultEffect(effIndex);
Unit* caster = GetCaster();
uint32 entry = uint32(GetSpellInfo()->EffectMiscValue[effIndex]);
- WorldLocation* summonLocation = GetTargetDest();
+ WorldLocation const* summonLocation = GetTargetDest();
if (!caster || !summonLocation)
return;
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
index 45b8b5d3590..93903e4f297 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
@@ -988,11 +988,11 @@ public:
Vashj = (Unit::GetCreature((*pPlayer), pInstance->GetData64(DATA_LADYVASHJ)));
if (Vashj && (CAST_AI(boss_lady_vashj::boss_lady_vashjAI, Vashj->AI())->Phase == 2))
{
- if (targets.getGOTarget() && targets.getGOTarget()->GetTypeId() == TYPEID_GAMEOBJECT)
+ if (GameObject* gObj = targets.GetGOTarget())
{
uint32 identifier;
uint8 channel_identifier;
- switch(targets.getGOTarget()->GetEntry())
+ switch(gObj->GetEntry())
{
case 185052:
identifier = DATA_SHIELDGENERATOR1;
@@ -1035,12 +1035,12 @@ public:
pPlayer->DestroyItemCount(31088, 1, true);
return true;
}
- else if (targets.getUnitTarget()->GetTypeId() == TYPEID_UNIT)
+ else if (targets.GetUnitTarget()->GetTypeId() == TYPEID_UNIT)
return false;
- else if (targets.getUnitTarget()->GetTypeId() == TYPEID_PLAYER)
+ else if (targets.GetUnitTarget()->GetTypeId() == TYPEID_PLAYER)
{
pPlayer->DestroyItemCount(31088, 1, true);
- pPlayer->CastSpell(targets.getUnitTarget(), 38134, true);
+ pPlayer->CastSpell(targets.GetUnitTarget(), 38134, true);
return true;
}
}