diff options
author | Shauren <shauren.trinity@gmail.com> | 2021-10-03 19:58:03 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-10-03 19:58:03 +0200 |
commit | cbf1f2883ad1bc611f08af4838d892bf13057490 (patch) | |
tree | 98bf2a96df0e362b798986166d5625d5d979154b /src | |
parent | 555b2d40ecc22eb0ea4bf913b534ffa7197fa6fe (diff) |
Core/Spells: Reduce number of CastSpell overloads to 1
Diffstat (limited to 'src')
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 |