aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Object/Object.cpp35
-rw-r--r--src/server/game/Entities/Object/Object.h4
-rw-r--r--src/server/game/Spells/Spell.cpp17
-rw-r--r--src/server/game/Spells/Spell.h113
-rw-r--r--src/server/game/Spells/SpellDefines.h180
-rw-r--r--src/server/game/Spells/SpellEffects.cpp10
-rw-r--r--src/server/game/Spells/SpellInfo.h37
-rw-r--r--src/server/scripts/Argus/AntorusTheBurningThrone/boss_garothi_worldbreaker.cpp2
-rw-r--r--src/server/scripts/Commands/cs_cast.cpp8
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp2
-rw-r--r--src/server/scripts/Kalimdor/zone_silithus.cpp4
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp4
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp2
-rw-r--r--src/server/scripts/Northrend/zone_sholazar_basin.cpp4
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp10
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp4
17 files changed, 224 insertions, 214 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 130f6ffd8d9..5eac3047a38 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -2629,7 +2629,7 @@ bool WorldObject::IsNeutralToAll() const
return my_faction->IsNeutralToAll();
}
-void WorldObject::CastSpell(SpellCastTargets const& targets, uint32 spellId, CastSpellExtraArgs const& args /*= { }*/)
+void WorldObject::CastSpell(CastSpellTargetArg const& targets, uint32 spellId, CastSpellExtraArgs const& args /*= { }*/)
{
SpellInfo const* info = sSpellMgr->GetSpellInfo(spellId, args.CastDifficulty != DIFFICULTY_NONE ? args.CastDifficulty : GetMap()->GetDifficultyID());
if (!info)
@@ -2638,37 +2638,18 @@ void WorldObject::CastSpell(SpellCastTargets const& targets, uint32 spellId, Cas
return;
}
+ if (!targets.Targets)
+ {
+ TC_LOG_ERROR("entities.unit", "CastSpell: Invalid target passed to spell cast %u by %s", spellId, GetGUID().ToString().c_str());
+ return;
+ }
+
Spell* spell = new Spell(this, info, args.TriggerFlags, args.OriginalCaster, args.OriginalCastId);
for (auto const& pair : args.SpellValueOverrides)
spell->SetSpellValue(pair.first, pair.second);
spell->m_CastItem = args.CastItem;
- spell->prepare(targets, args.TriggeringAura);
-}
-
-void WorldObject::CastSpell(WorldObject* target, uint32 spellId, CastSpellExtraArgs const& args /*= { }*/)
-{
- SpellCastTargets targets;
- if (target)
- {
- if (Unit* unitTarget = target->ToUnit())
- targets.SetUnitTarget(unitTarget);
- else if (GameObject* goTarget = target->ToGameObject())
- targets.SetGOTarget(goTarget);
- else
- {
- TC_LOG_ERROR("entities.unit", "CastSpell: Invalid target %s passed to spell cast by %s", target->GetGUID().ToString().c_str(), GetGUID().ToString().c_str());
- return;
- }
- }
- CastSpell(targets, spellId, args);
-}
-
-void WorldObject::CastSpell(Position const& dest, uint32 spellId, CastSpellExtraArgs const& args /*= { }*/)
-{
- SpellCastTargets targets;
- targets.SetDst(dest);
- CastSpell(targets, spellId, args);
+ spell->prepare(*targets.Targets, args.TriggeringAura);
}
// function based on function Unit::CanAttack from 13850 client
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 3a51700cc63..874d45ea7c5 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -596,9 +596,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
bool IsNeutralToAll() const;
// CastSpell's third arg can be a variety of things - check out CastSpellExtraArgs' constructors!
- void CastSpell(SpellCastTargets const& targets, uint32 spellId, CastSpellExtraArgs const& args = { });
- void CastSpell(WorldObject* target, uint32 spellId, CastSpellExtraArgs const& args = { });
- void CastSpell(Position const& dest, uint32 spellId, CastSpellExtraArgs const& args = { });
+ void CastSpell(CastSpellTargetArg const& targets, uint32 spellId, CastSpellExtraArgs const& args = { });
bool IsValidAttackTarget(WorldObject const* target, SpellInfo const* bySpell = nullptr) const;
bool IsValidAssistTarget(WorldObject const* target, SpellInfo const* bySpell = nullptr) const;
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 7e39f489e6d..233a0cdcddf 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -8370,6 +8370,23 @@ bool WorldObjectSpellLineTargetCheck::operator()(WorldObject* target) const
} //namespace Trinity
+CastSpellTargetArg::CastSpellTargetArg(WorldObject* target)
+{
+ if (target)
+ {
+ if (Unit* unitTarget = target->ToUnit())
+ {
+ Targets.emplace();
+ Targets->SetUnitTarget(unitTarget);
+ }
+ else if (GameObject* goTarget = target->ToGameObject())
+ {
+ Targets.emplace();
+ Targets->SetGOTarget(goTarget);
+ }
+ }
+}
+
CastSpellExtraArgs& CastSpellExtraArgs::SetTriggeringAura(AuraEffect const* triggeringAura)
{
TriggeringAura = triggeringAura;
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index da84d0e8a48..2817944ff8c 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -31,8 +31,6 @@ namespace WorldPackets
{
namespace Spells
{
- struct SpellCastRequest;
- struct SpellTargetData;
struct SpellAmmo;
struct SpellCastData;
}
@@ -62,7 +60,6 @@ struct SummonPropertiesEntry;
enum AuraType : uint32;
enum CurrentSpellTypes : uint8;
enum LootType : uint8;
-enum SpellCastTargetFlags : uint32;
enum SpellTargetCheckTypes : uint8;
enum SpellTargetObjectTypes : uint8;
enum SpellValueMod : uint8;
@@ -153,22 +150,6 @@ enum SpellRangeFlag
SPELL_RANGE_RANGED = 2 //hunter range and ranged weapon
};
-struct TC_GAME_API SpellDestination
-{
- SpellDestination();
- SpellDestination(float x, float y, float z, float orientation = 0.0f, uint32 mapId = MAPID_INVALID);
- SpellDestination(Position const& pos);
- SpellDestination(WorldObject const& wObj);
-
- void Relocate(Position const& pos);
- void RelocateOffset(Position const& offset);
-
- WorldLocation _position;
- ObjectGuid _transportGUID;
- Position _transportOffset;
-};
-
-
struct SpellLogEffectPowerDrainParams
{
ObjectGuid Victim;
@@ -217,100 +198,6 @@ struct SpellLogEffect
Optional<std::vector<SpellLogEffectFeedPetParams>> FeedPetTargets;
};
-class TC_GAME_API SpellCastTargets
-{
- public:
- SpellCastTargets();
- SpellCastTargets(Unit* caster, WorldPackets::Spells::SpellCastRequest const& spellCastRequest);
- ~SpellCastTargets();
-
- void Write(WorldPackets::Spells::SpellTargetData& data);
-
- uint32 GetTargetMask() const { return m_targetMask; }
- void SetTargetMask(uint32 newMask) { m_targetMask = newMask; }
-
- void SetTargetFlag(SpellCastTargetFlags flag) { m_targetMask |= flag; }
-
- ObjectGuid GetOrigUnitTargetGUID() const;
- void SetOrigUnitTarget(Unit* target);
-
- ObjectGuid GetUnitTargetGUID() const;
- Unit* GetUnitTarget() const;
- void SetUnitTarget(Unit* target);
-
- ObjectGuid GetGOTargetGUID() const;
- GameObject* GetGOTarget() const;
- void SetGOTarget(GameObject* target);
-
- ObjectGuid GetCorpseTargetGUID() const;
- Corpse* GetCorpseTarget() const;
-
- WorldObject* GetObjectTarget() const;
- ObjectGuid GetObjectTargetGUID() const;
- void RemoveObjectTarget();
-
- ObjectGuid 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();
-
- SpellDestination const* GetSrc() const;
- Position const* GetSrcPos() const;
- void SetSrc(float x, float y, float z);
- void SetSrc(Position const& pos);
- void SetSrc(WorldObject const& wObj);
- void ModSrc(Position const& pos);
- void RemoveSrc();
-
- SpellDestination const* GetDst() const;
- WorldLocation const* GetDstPos() 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(SpellDestination const& spellDest);
- void SetDst(SpellCastTargets const& spellTargets);
- void ModDst(Position const& pos);
- void ModDst(SpellDestination const& spellDest);
- void RemoveDst();
-
- bool HasSrc() const;
- bool HasDst() const;
- bool HasTraj() const { return m_speed != 0; }
-
- float GetPitch() const { return m_pitch; }
- void SetPitch(float pitch) { m_pitch = pitch; }
- float GetSpeed() const { return m_speed; }
- void SetSpeed(float speed) { m_speed = speed; }
-
- float GetDist2d() const { return m_src._position.GetExactDist2d(&m_dst._position); }
- float GetSpeedXY() const { return m_speed * std::cos(m_pitch); }
- float GetSpeedZ() const { return m_speed * std::sin(m_pitch); }
-
- void Update(WorldObject* caster);
- std::string GetTargetString() const { return m_strTarget; }
-
- private:
- uint32 m_targetMask;
-
- // objects (can be used at spell creating and after Update at casting)
- WorldObject* m_objectTarget;
- Item* m_itemTarget;
-
- // object GUID/etc, can be used always
- ObjectGuid m_origObjectTargetGUID;
- ObjectGuid m_objectTargetGUID;
- ObjectGuid m_itemTargetGUID;
- uint32 m_itemTargetEntry;
-
- SpellDestination m_src;
- SpellDestination m_dst;
-
- float m_pitch, m_speed;
- std::string m_strTarget;
-};
-
struct SpellValue
{
explicit SpellValue(SpellInfo const* proto, WorldObject const* caster);
diff --git a/src/server/game/Spells/SpellDefines.h b/src/server/game/Spells/SpellDefines.h
index 1c291da669e..337c039e3a1 100644
--- a/src/server/game/Spells/SpellDefines.h
+++ b/src/server/game/Spells/SpellDefines.h
@@ -21,10 +21,17 @@
#include "Define.h"
#include "EnumFlag.h"
#include "ObjectGuid.h"
+#include "Optional.h"
+#include "Position.h"
#include <vector>
-class Item;
class AuraEffect;
+class Corpse;
+class GameObject;
+class Item;
+class Player;
+class Unit;
+class WorldObject;
enum Difficulty : uint8;
namespace UF
@@ -36,7 +43,9 @@ namespace WorldPackets
{
namespace Spells
{
+ struct SpellCastRequest;
struct SpellCastVisual;
+ struct SpellTargetData;
}
}
@@ -251,6 +260,175 @@ enum TriggerCastFlags : uint32
TRIGGERED_FULL_DEBUG_MASK = 0xFFFFFFFF
};
+enum SpellCastTargetFlags : uint32
+{
+ TARGET_FLAG_NONE = 0x00000000,
+ TARGET_FLAG_UNUSED_1 = 0x00000001, // not used
+ TARGET_FLAG_UNIT = 0x00000002, // pguid
+ TARGET_FLAG_UNIT_RAID = 0x00000004, // not sent, used to validate target (if raid member)
+ TARGET_FLAG_UNIT_PARTY = 0x00000008, // not sent, used to validate target (if party member)
+ TARGET_FLAG_ITEM = 0x00000010, // pguid
+ TARGET_FLAG_SOURCE_LOCATION = 0x00000020, // pguid, 3 float
+ TARGET_FLAG_DEST_LOCATION = 0x00000040, // pguid, 3 float
+ TARGET_FLAG_UNIT_ENEMY = 0x00000080, // not sent, used to validate target (if enemy)
+ TARGET_FLAG_UNIT_ALLY = 0x00000100, // not sent, used to validate target (if ally)
+ TARGET_FLAG_CORPSE_ENEMY = 0x00000200, // pguid
+ TARGET_FLAG_UNIT_DEAD = 0x00000400, // not sent, used to validate target (if dead creature)
+ TARGET_FLAG_GAMEOBJECT = 0x00000800, // pguid, used with TARGET_GAMEOBJECT_TARGET
+ TARGET_FLAG_TRADE_ITEM = 0x00001000, // pguid
+ TARGET_FLAG_STRING = 0x00002000, // string
+ TARGET_FLAG_GAMEOBJECT_ITEM = 0x00004000, // not sent, used with TARGET_GAMEOBJECT_ITEM_TARGET
+ TARGET_FLAG_CORPSE_ALLY = 0x00008000, // pguid
+ TARGET_FLAG_UNIT_MINIPET = 0x00010000, // pguid, used to validate target (if non combat pet)
+ TARGET_FLAG_GLYPH_SLOT = 0x00020000, // used in glyph spells
+ TARGET_FLAG_DEST_TARGET = 0x00040000, // sometimes appears with DEST_TARGET spells (may appear or not for a given spell)
+ TARGET_FLAG_EXTRA_TARGETS = 0x00080000, // uint32 counter, loop { vec3 - screen position (?), guid }, not used so far
+ TARGET_FLAG_UNIT_PASSENGER = 0x00100000, // guessed, used to validate target (if vehicle passenger)
+ TARGET_FLAG_UNK400000 = 0X00400000,
+ TARGET_FLAG_UNK1000000 = 0X01000000,
+ TARGET_FLAG_UNK4000000 = 0X04000000,
+ TARGET_FLAG_UNK10000000 = 0X10000000,
+ TARGET_FLAG_UNK40000000 = 0X40000000,
+
+ TARGET_FLAG_UNIT_MASK = TARGET_FLAG_UNIT | TARGET_FLAG_UNIT_RAID | TARGET_FLAG_UNIT_PARTY
+ | TARGET_FLAG_UNIT_ENEMY | TARGET_FLAG_UNIT_ALLY | TARGET_FLAG_UNIT_DEAD | TARGET_FLAG_UNIT_MINIPET | TARGET_FLAG_UNIT_PASSENGER,
+ TARGET_FLAG_GAMEOBJECT_MASK = TARGET_FLAG_GAMEOBJECT | TARGET_FLAG_GAMEOBJECT_ITEM,
+ TARGET_FLAG_CORPSE_MASK = TARGET_FLAG_CORPSE_ALLY | TARGET_FLAG_CORPSE_ENEMY,
+ TARGET_FLAG_ITEM_MASK = TARGET_FLAG_TRADE_ITEM | TARGET_FLAG_ITEM | TARGET_FLAG_GAMEOBJECT_ITEM
+};
+
+struct TC_GAME_API SpellDestination
+{
+ SpellDestination();
+ SpellDestination(float x, float y, float z, float orientation = 0.0f, uint32 mapId = MAPID_INVALID);
+ SpellDestination(Position const& pos);
+ SpellDestination(WorldObject const& wObj);
+
+ void Relocate(Position const& pos);
+ void RelocateOffset(Position const& offset);
+
+ WorldLocation _position;
+ ObjectGuid _transportGUID;
+ Position _transportOffset;
+};
+
+class TC_GAME_API SpellCastTargets
+{
+public:
+ SpellCastTargets();
+ SpellCastTargets(Unit* caster, WorldPackets::Spells::SpellCastRequest const& spellCastRequest);
+ ~SpellCastTargets();
+
+ void Write(WorldPackets::Spells::SpellTargetData& data);
+
+ uint32 GetTargetMask() const { return m_targetMask; }
+ void SetTargetMask(uint32 newMask) { m_targetMask = newMask; }
+
+ void SetTargetFlag(SpellCastTargetFlags flag) { m_targetMask |= flag; }
+
+ ObjectGuid GetOrigUnitTargetGUID() const;
+ void SetOrigUnitTarget(Unit* target);
+
+ ObjectGuid GetUnitTargetGUID() const;
+ Unit* GetUnitTarget() const;
+ void SetUnitTarget(Unit* target);
+
+ ObjectGuid GetGOTargetGUID() const;
+ GameObject* GetGOTarget() const;
+ void SetGOTarget(GameObject* target);
+
+ ObjectGuid GetCorpseTargetGUID() const;
+ Corpse* GetCorpseTarget() const;
+
+ WorldObject* GetObjectTarget() const;
+ ObjectGuid GetObjectTargetGUID() const;
+ void RemoveObjectTarget();
+
+ ObjectGuid 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();
+
+ SpellDestination const* GetSrc() const;
+ Position const* GetSrcPos() const;
+ void SetSrc(float x, float y, float z);
+ void SetSrc(Position const& pos);
+ void SetSrc(WorldObject const& wObj);
+ void ModSrc(Position const& pos);
+ void RemoveSrc();
+
+ SpellDestination const* GetDst() const;
+ WorldLocation const* GetDstPos() 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(SpellDestination const& spellDest);
+ void SetDst(SpellCastTargets const& spellTargets);
+ void ModDst(Position const& pos);
+ void ModDst(SpellDestination const& spellDest);
+ void RemoveDst();
+
+ bool HasSrc() const;
+ bool HasDst() const;
+ bool HasTraj() const { return m_speed != 0; }
+
+ float GetPitch() const { return m_pitch; }
+ void SetPitch(float pitch) { m_pitch = pitch; }
+ float GetSpeed() const { return m_speed; }
+ void SetSpeed(float speed) { m_speed = speed; }
+
+ float GetDist2d() const { return m_src._position.GetExactDist2d(&m_dst._position); }
+ float GetSpeedXY() const { return m_speed * std::cos(m_pitch); }
+ float GetSpeedZ() const { return m_speed * std::sin(m_pitch); }
+
+ void Update(WorldObject* caster);
+ std::string GetTargetString() const { return m_strTarget; }
+
+private:
+ uint32 m_targetMask;
+
+ // objects (can be used at spell creating and after Update at casting)
+ WorldObject* m_objectTarget;
+ Item* m_itemTarget;
+
+ // object GUID/etc, can be used always
+ ObjectGuid m_origObjectTargetGUID;
+ ObjectGuid m_objectTargetGUID;
+ ObjectGuid m_itemTargetGUID;
+ uint32 m_itemTargetEntry;
+
+ SpellDestination m_src;
+ SpellDestination m_dst;
+
+ float m_pitch, m_speed;
+ std::string m_strTarget;
+};
+
+struct TC_GAME_API CastSpellTargetArg
+{
+ CastSpellTargetArg() { Targets.emplace(); }
+ CastSpellTargetArg(std::nullptr_t) { Targets.emplace(); }
+ CastSpellTargetArg(WorldObject* target);
+ CastSpellTargetArg(Item* itemTarget)
+ {
+ Targets.emplace();
+ Targets->SetItemTarget(itemTarget);
+ }
+ CastSpellTargetArg(Position const& dest)
+ {
+ Targets.emplace();
+ Targets->SetDst(dest);
+ }
+ CastSpellTargetArg(SpellCastTargets&& targets)
+ {
+ Targets.emplace(std::move(targets));
+ }
+
+ Optional<SpellCastTargets> Targets; // empty optional used to signal error state
+};
+
struct TC_GAME_API CastSpellExtraArgs
{
CastSpellExtraArgs() = default;
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index b0157c23d0b..0c12f8f8243 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -698,7 +698,7 @@ void Spell::EffectTriggerSpell()
args.AddSpellMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), damage);
// original caster guid only for GO cast
- m_caster->CastSpell(targets, spellInfo->Id, args);
+ m_caster->CastSpell(std::move(targets), spellInfo->Id, args);
}
void Spell::EffectTriggerMissileSpell()
@@ -747,7 +747,7 @@ void Spell::EffectTriggerMissileSpell()
args.AddSpellMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), damage);
// original caster guid only for GO cast
- m_caster->CastSpell(targets, spellInfo->Id, args);
+ m_caster->CastSpell(std::move(targets), spellInfo->Id, args);
}
void Spell::EffectForceCast()
@@ -3247,14 +3247,10 @@ void Spell::EffectScriptEffect()
if (!m_targets.HasDst())
return;
- float x, y, z;
float radius = effectInfo->CalcRadius();
for (uint8 i = 0; i < 15; ++i)
- {
- m_caster->GetRandomPoint(*destTarget, radius, x, y, z);
- m_caster->CastSpell({ x, y, z }, 54522, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ m_caster->CastSpell(m_caster->GetRandomPoint(*destTarget, radius), 54522, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
.SetOriginalCastId(m_castId));
- }
break;
}
case 52173: // Coyote Spirit Despawn
diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
index 11679e3f5d0..181b6c8ea87 100644
--- a/src/server/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
@@ -41,43 +41,6 @@ struct SpellModifier;
struct SpellTargetPosition;
enum WeaponAttackType : uint8;
-enum SpellCastTargetFlags : uint32
-{
- TARGET_FLAG_NONE = 0x00000000,
- TARGET_FLAG_UNUSED_1 = 0x00000001, // not used
- TARGET_FLAG_UNIT = 0x00000002, // pguid
- TARGET_FLAG_UNIT_RAID = 0x00000004, // not sent, used to validate target (if raid member)
- TARGET_FLAG_UNIT_PARTY = 0x00000008, // not sent, used to validate target (if party member)
- TARGET_FLAG_ITEM = 0x00000010, // pguid
- TARGET_FLAG_SOURCE_LOCATION = 0x00000020, // pguid, 3 float
- TARGET_FLAG_DEST_LOCATION = 0x00000040, // pguid, 3 float
- TARGET_FLAG_UNIT_ENEMY = 0x00000080, // not sent, used to validate target (if enemy)
- TARGET_FLAG_UNIT_ALLY = 0x00000100, // not sent, used to validate target (if ally)
- TARGET_FLAG_CORPSE_ENEMY = 0x00000200, // pguid
- TARGET_FLAG_UNIT_DEAD = 0x00000400, // not sent, used to validate target (if dead creature)
- TARGET_FLAG_GAMEOBJECT = 0x00000800, // pguid, used with TARGET_GAMEOBJECT_TARGET
- TARGET_FLAG_TRADE_ITEM = 0x00001000, // pguid
- TARGET_FLAG_STRING = 0x00002000, // string
- TARGET_FLAG_GAMEOBJECT_ITEM = 0x00004000, // not sent, used with TARGET_GAMEOBJECT_ITEM_TARGET
- TARGET_FLAG_CORPSE_ALLY = 0x00008000, // pguid
- TARGET_FLAG_UNIT_MINIPET = 0x00010000, // pguid, used to validate target (if non combat pet)
- TARGET_FLAG_GLYPH_SLOT = 0x00020000, // used in glyph spells
- TARGET_FLAG_DEST_TARGET = 0x00040000, // sometimes appears with DEST_TARGET spells (may appear or not for a given spell)
- TARGET_FLAG_EXTRA_TARGETS = 0x00080000, // uint32 counter, loop { vec3 - screen position (?), guid }, not used so far
- TARGET_FLAG_UNIT_PASSENGER = 0x00100000, // guessed, used to validate target (if vehicle passenger)
- TARGET_FLAG_UNK400000 = 0X00400000,
- TARGET_FLAG_UNK1000000 = 0X01000000,
- TARGET_FLAG_UNK4000000 = 0X04000000,
- TARGET_FLAG_UNK10000000 = 0X10000000,
- TARGET_FLAG_UNK40000000 = 0X40000000,
-
- TARGET_FLAG_UNIT_MASK = TARGET_FLAG_UNIT | TARGET_FLAG_UNIT_RAID | TARGET_FLAG_UNIT_PARTY
- | TARGET_FLAG_UNIT_ENEMY | TARGET_FLAG_UNIT_ALLY | TARGET_FLAG_UNIT_DEAD | TARGET_FLAG_UNIT_MINIPET | TARGET_FLAG_UNIT_PASSENGER,
- TARGET_FLAG_GAMEOBJECT_MASK = TARGET_FLAG_GAMEOBJECT | TARGET_FLAG_GAMEOBJECT_ITEM,
- TARGET_FLAG_CORPSE_MASK = TARGET_FLAG_CORPSE_ALLY | TARGET_FLAG_CORPSE_ENEMY,
- TARGET_FLAG_ITEM_MASK = TARGET_FLAG_TRADE_ITEM | TARGET_FLAG_ITEM | TARGET_FLAG_GAMEOBJECT_ITEM
-};
-
enum SpellTargetSelectionCategories
{
TARGET_SELECT_CATEGORY_NYI,
diff --git a/src/server/scripts/Argus/AntorusTheBurningThrone/boss_garothi_worldbreaker.cpp b/src/server/scripts/Argus/AntorusTheBurningThrone/boss_garothi_worldbreaker.cpp
index e0603d9880c..525879f6cc7 100644
--- a/src/server/scripts/Argus/AntorusTheBurningThrone/boss_garothi_worldbreaker.cpp
+++ b/src/server/scripts/Argus/AntorusTheBurningThrone/boss_garothi_worldbreaker.cpp
@@ -870,7 +870,7 @@ class spell_garothi_cannon_chooser : public SpellScript
float x = AnnihilationCenterReferencePos.GetPositionX() + cos(frand(0.0f, float(M_PI * 2))) * frand(15.0f, 30.0f);
float y = AnnihilationCenterReferencePos.GetPositionY() + sin(frand(0.0f, float(M_PI * 2))) * frand(15.0f, 30.0f);
float z = caster->GetMap()->GetHeight(caster->GetPhaseShift(), x, y, AnnihilationCenterReferencePos.GetPositionZ());
- annihilator->CastSpell({ x, y, z }, SPELL_ANNIHILATION_SUMMON, true);
+ annihilator->CastSpell(Position{ x, y, z }, SPELL_ANNIHILATION_SUMMON, true);
}
annihilator->CastSpell(annihilator, SPELL_ANNIHILATION_DUMMY);
diff --git a/src/server/scripts/Commands/cs_cast.cpp b/src/server/scripts/Commands/cs_cast.cpp
index e0f4708e945..a444d31f37a 100644
--- a/src/server/scripts/Commands/cs_cast.cpp
+++ b/src/server/scripts/Commands/cs_cast.cpp
@@ -171,7 +171,7 @@ public:
TriggerCastFlags triggered = (triggeredStr != nullptr) ? TRIGGERED_FULL_DEBUG_MASK : TRIGGERED_NONE;
float x, y, z;
handler->GetSession()->GetPlayer()->GetClosePoint(x, y, z, dist);
- handler->GetSession()->GetPlayer()->CastSpell({ x, y, z }, spellId, triggered);
+ handler->GetSession()->GetPlayer()->CastSpell(Position{ x, y, z }, spellId, triggered);
return true;
}
@@ -260,9 +260,7 @@ public:
if (!posX || !posY || !posZ)
return false;
- float x = float(atof(posX));
- float y = float(atof(posY));
- float z = float(atof(posZ));
+ Position dest(atof(posX), atof(posY), atof(posZ));
char* triggeredStr = strtok(nullptr, " ");
if (triggeredStr)
@@ -273,7 +271,7 @@ public:
}
TriggerCastFlags triggered = (triggeredStr != nullptr) ? TRIGGERED_FULL_DEBUG_MASK : TRIGGERED_NONE;
- caster->CastSpell({ x, y, z }, spellId, triggered);
+ caster->CastSpell(dest, spellId, triggered);
return true;
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
index 89b872eb9cf..d5eb92d90e4 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
@@ -608,7 +608,7 @@ class spell_mandokir_devastating_slam : public SpellScriptLoader
angle = float(rand_norm()) * static_cast<float>(M_PI * 35.0f / 180.0f) - static_cast<float>(M_PI * 17.5f / 180.0f);
caster->GetClosePoint(x, y, z, 4.0f, frand(-2.5f, 50.0f), angle);
- caster->CastSpell({ x, y, z }, SPELL_DEVASTATING_SLAM_DAMAGE, true);
+ caster->CastSpell(Position{ x, y, z }, SPELL_DEVASTATING_SLAM_DAMAGE, true);
}
}
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
index 72fa7dcf141..c7cd8ca05c9 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
@@ -1339,7 +1339,7 @@ public:
{
if (StrikeTimer <= diff)
{
- me->CastSpell({ DummyTarget[0], DummyTarget[1], DummyTarget[2] }, SPELL_GARGOYLE_STRIKE, false);
+ me->CastSpell(Position{ DummyTarget[0], DummyTarget[1], DummyTarget[2] }, SPELL_GARGOYLE_STRIKE, false);
StrikeTimer = 2000 + rand32() % 1000;
} else StrikeTimer -= diff;
}
diff --git a/src/server/scripts/Kalimdor/zone_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp
index 16398d42ee3..64d2180a601 100644
--- a/src/server/scripts/Kalimdor/zone_silithus.cpp
+++ b/src/server/scripts/Kalimdor/zone_silithus.cpp
@@ -503,7 +503,7 @@ public:
DoCast(player, SPELL_ARCANE_CHANNELING, true);//Arcane Channeling
break;
case 35:
- me->CastSpell({ -8088, 1520.43f, 2.67f }, SPELL_TIME_STOP, true);
+ me->CastSpell(Position{ -8088, 1520.43f, 2.67f }, SPELL_TIME_STOP, true);
break;
case 36:
DoCast(player, SPELL_CALL_PRISMATIC_BARRIER, true);
@@ -553,7 +553,7 @@ public:
break;
case 50:
Fandral->AI()->Talk(FANDRAL_EMOTE_2);
- Fandral->CastSpell({ -8127, 1525, 17.5f }, SPELL_THROW_HAMMER, true);
+ Fandral->CastSpell(Position{ -8127, 1525, 17.5f }, SPELL_THROW_HAMMER, true);
break;
case 51:
{
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
index a81c1c3e7e4..2018c5c68dc 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
@@ -784,12 +784,10 @@ class spell_rotface_unstable_ooze_explosion : public SpellScriptLoader
uint32 triggered_spell_id = GetEffectInfo().TriggerSpell;
- float x, y, z;
- GetExplTargetDest()->GetPosition(x, y, z);
// let Rotface handle the cast - caster dies before this executes
if (InstanceScript* script = GetCaster()->GetInstanceScript())
if (Creature* rotface = script->instance->GetCreature(script->GetGuidData(DATA_ROTFACE)))
- rotface->CastSpell({x, y, z}, triggered_spell_id, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
+ rotface->CastSpell(*GetExplTargetDest(), triggered_spell_id, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
.SetOriginalCaster(GetCaster()->GetGUID()));
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index a1844f131c5..a37248359ab 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
@@ -527,7 +527,7 @@ class boss_sindragosa : public CreatureScript
destY = float(rand_norm()) * 75.0f + 2450.0f;
destZ = 205.0f; // random number close to ground, get exact in next call
me->UpdateGroundPositionZ(destX, destY, destZ);
- me->CastSpell({ destX, destY, destZ }, SPELL_FROST_BOMB_TRIGGER, false);
+ me->CastSpell(Position{ destX, destY, destZ }, SPELL_FROST_BOMB_TRIGGER, false);
events.ScheduleEvent(EVENT_FROST_BOMB, urand(6000, 8000));
break;
}
diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
index f83c55b201c..5183eacd29d 100644
--- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp
+++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
@@ -97,7 +97,7 @@ public:
break;
case 1:
Talk(SAY_WP_3);
- me->CastSpell({ 5918.33f, 5372.91f, -98.770f }, SPELL_EXPLODE_CRYSTAL, true);
+ me->CastSpell(Position{ 5918.33f, 5372.91f, -98.770f }, SPELL_EXPLODE_CRYSTAL, true);
me->SummonGameObject(184743, 5918.33f, 5372.91f, -98.770f, 0, QuaternionData(), TEMPSUMMON_MANUAL_DESPAWN); //approx 3 to 4 seconds
me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH);
break;
@@ -108,7 +108,7 @@ public:
Talk(SAY_WP_5);
break;
case 8:
- me->CastSpell({ 5887.37f, 5379.39f, -91.289f }, SPELL_EXPLODE_CRYSTAL, true);
+ me->CastSpell(Position{ 5887.37f, 5379.39f, -91.289f }, SPELL_EXPLODE_CRYSTAL, true);
me->SummonGameObject(184743, 5887.37f, 5379.39f, -91.289f, 0, QuaternionData(), TEMPSUMMON_MANUAL_DESPAWN); //approx 3 to 4 seconds
me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH);
break;
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp
index 6828dc65933..6726636125f 100644
--- a/src/server/scripts/Spells/spell_priest.cpp
+++ b/src/server/scripts/Spells/spell_priest.cpp
@@ -497,7 +497,7 @@ class spell_pri_leap_of_faith_effect_trigger : public SpellScriptLoader
SpellCastTargets targets;
targets.SetDst(destPos);
targets.SetUnitTarget(GetCaster());
- GetHitUnit()->CastSpell(targets, GetEffectValue(), GetCastDifficulty());
+ GetHitUnit()->CastSpell(std::move(targets), GetEffectValue(), GetCastDifficulty());
}
void Register() override
@@ -856,9 +856,7 @@ class spell_pri_prayer_of_mending_aura : public AuraScript
int32 stackAmount = GetStackAmount();
if (stackAmount > 1)
{
- CastSpellExtraArgs args;
- args.TriggerFlags = TRIGGERED_FULL_MASK;
- args.TriggeringAura = aurEff;
+ CastSpellExtraArgs args(aurEff);
args.OriginalCaster = caster->GetGUID();
args.AddSpellMod(SPELLVALUE_BASE_POINT0, stackAmount - 1);
target->CastSpell(target, SPELL_PRIEST_PRAYER_OF_MENDING_JUMP, args);
@@ -1263,12 +1261,10 @@ class spell_pri_angelic_feather_trigger : public SpellScriptLoader
}
else
{
- SpellCastTargets targets;
- targets.SetDst(destPos);
CastSpellExtraArgs args;
args.TriggerFlags = TRIGGERED_FULL_MASK;
args.CastDifficulty = GetCastDifficulty();
- GetCaster()->CastSpell(targets, SPELL_PRIEST_ANGELIC_FEATHER_AREATRIGGER, args);
+ GetCaster()->CastSpell(destPos, SPELL_PRIEST_ANGELIC_FEATHER_AREATRIGGER, args);
}
}
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index a0cfba70da2..543b93187d8 100644
--- a/src/server/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
@@ -462,9 +462,7 @@ class spell_sha_flametongue_weapon : public SpellScript
if (!targetItem || !targetItem->GetTemplate()->IsWeapon())
return;
- SpellCastTargets targets;
- targets.SetItemTarget(targetItem);
- player->CastSpell(targets, SPELL_SHAMAN_FLAMETONGUE_WEAPON_ENCHANT, true);
+ player->CastSpell(targetItem, SPELL_SHAMAN_FLAMETONGUE_WEAPON_ENCHANT, true);
}
void Register() override