TrinityCore
Loading...
Searching...
No Matches
SpellDefines.h
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef TRINITY_SPELLDEFINES_H
19#define TRINITY_SPELLDEFINES_H
20
21#include "Define.h"
22#include "ObjectGuid.h"
23#include "Optional.h"
24#include "Position.h"
25#include <vector>
26
27class AuraEffect;
28class Corpse;
29class GameObject;
30class Item;
31class Player;
32class Unit;
33class WorldObject;
34
35namespace WorldPackets
36{
37 namespace Spells
38 {
39 struct SpellTargetData;
40 }
41}
42
44{
45 SPELL_INTERRUPT_FLAG_MOVEMENT = 0x01, // why need this for instant?
46 SPELL_INTERRUPT_FLAG_PUSH_BACK = 0x02, // push back
47 SPELL_INTERRUPT_FLAG_UNK3 = 0x04, // any info?
48 SPELL_INTERRUPT_FLAG_INTERRUPT = 0x08, // interrupt
49 SPELL_INTERRUPT_FLAG_ABORT_ON_DMG = 0x10 // _complete_ interrupt on direct damage
50 //SPELL_INTERRUPT_UNK = 0x20 // unk, 564 of 727 spells having this spell start with "Glyph"
51};
52
53// See SpellAuraInterruptFlags for other values definitions
59
61{
62 AURA_INTERRUPT_FLAG_HITBYSPELL = 0x00000001, // 0 removed when getting hit by a negative spell?
63 AURA_INTERRUPT_FLAG_TAKE_DAMAGE = 0x00000002, // 1 removed by any damage
64 AURA_INTERRUPT_FLAG_CAST = 0x00000004, // 2 cast any spells
65 AURA_INTERRUPT_FLAG_MOVE = 0x00000008, // 3 removed by any movement
66 AURA_INTERRUPT_FLAG_TURNING = 0x00000010, // 4 removed by any turning
67 AURA_INTERRUPT_FLAG_JUMP = 0x00000020, // 5 removed by entering combat
68 AURA_INTERRUPT_FLAG_NOT_MOUNTED = 0x00000040, // 6 removed by dismounting
69 AURA_INTERRUPT_FLAG_NOT_ABOVEWATER = 0x00000080, // 7 removed by entering water
70 AURA_INTERRUPT_FLAG_NOT_UNDERWATER = 0x00000100, // 8 removed by leaving water
71 AURA_INTERRUPT_FLAG_NOT_SHEATHED = 0x00000200, // 9 removed by unsheathing
72 AURA_INTERRUPT_FLAG_TALK = 0x00000400, // 10 talk to npc / interact?
73 AURA_INTERRUPT_FLAG_LOOTING = 0x00000800, // 11 mine/use/open action on gameobject / loot
74 AURA_INTERRUPT_FLAG_MELEE_ATTACK = 0x00001000, // 12 removed by attacking
75 AURA_INTERRUPT_FLAG_SPELL_ATTACK = 0x00002000, // 13 ???
76 AURA_INTERRUPT_FLAG_UNK14 = 0x00004000, // 14
77 AURA_INTERRUPT_FLAG_TRANSFORM = 0x00008000, // 15 removed by transform?
78 AURA_INTERRUPT_FLAG_UNK16 = 0x00010000, // 16
79 AURA_INTERRUPT_FLAG_MOUNT = 0x00020000, // 17 misdirect, aspect, swim speed
80 AURA_INTERRUPT_FLAG_NOT_SEATED = 0x00040000, // 18 removed by standing up (used by food and drink mostly and sleep/Fake Death like)
81 AURA_INTERRUPT_FLAG_CHANGE_MAP = 0x00080000, // 19 leaving map/getting teleported
82 AURA_INTERRUPT_FLAG_IMMUNE_OR_LOST_SELECTION = 0x00100000, // 20 removed by auras that make you invulnerable, or make other to lose selection on you
83 AURA_INTERRUPT_FLAG_UNK21 = 0x00200000, // 21
85 AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT = 0x00800000, // 23 removed by entering pvp combat
86 AURA_INTERRUPT_FLAG_DIRECT_DAMAGE = 0x01000000, // 24 removed by any direct damage
87 AURA_INTERRUPT_FLAG_LANDING = 0x02000000, // 25 removed by hitting the ground
88 AURA_INTERRUPT_FLAG_LEAVE_COMBAT = 0x80000000, // 31 removed by leaving combat
89
91};
92
129
140
145
175
177
179{
180 TARGET_FLAG_NONE = 0x00000000,
181 TARGET_FLAG_UNUSED_1 = 0x00000001, // not used
182 TARGET_FLAG_UNIT = 0x00000002, // pguid
183 TARGET_FLAG_UNIT_RAID = 0x00000004, // not sent, used to validate target (if raid member)
184 TARGET_FLAG_UNIT_PARTY = 0x00000008, // not sent, used to validate target (if party member)
185 TARGET_FLAG_ITEM = 0x00000010, // pguid
186 TARGET_FLAG_SOURCE_LOCATION = 0x00000020, // pguid, 3 float
187 TARGET_FLAG_DEST_LOCATION = 0x00000040, // pguid, 3 float
188 TARGET_FLAG_UNIT_ENEMY = 0x00000080, // not sent, used to validate target (if enemy)
189 TARGET_FLAG_UNIT_ALLY = 0x00000100, // not sent, used to validate target (if ally)
190 TARGET_FLAG_CORPSE_ENEMY = 0x00000200, // pguid
191 TARGET_FLAG_UNIT_DEAD = 0x00000400, // not sent, used to validate target (if dead creature)
192 TARGET_FLAG_GAMEOBJECT = 0x00000800, // pguid, used with TARGET_GAMEOBJECT_TARGET
193 TARGET_FLAG_TRADE_ITEM = 0x00001000, // pguid
194 TARGET_FLAG_STRING = 0x00002000, // string
195 TARGET_FLAG_GAMEOBJECT_ITEM = 0x00004000, // not sent, used with TARGET_GAMEOBJECT_ITEM_TARGET
196 TARGET_FLAG_CORPSE_ALLY = 0x00008000, // pguid
197 TARGET_FLAG_UNIT_MINIPET = 0x00010000, // pguid, used to validate target (if non combat pet)
198 TARGET_FLAG_GLYPH_SLOT = 0x00020000, // used in glyph spells
199 TARGET_FLAG_DEST_TARGET = 0x00040000, // sometimes appears with DEST_TARGET spells (may appear or not for a given spell)
200 TARGET_FLAG_UNUSED20 = 0x00080000, // uint32 counter, loop { vec3 - screen position (?), guid }, not used so far
201 TARGET_FLAG_UNIT_PASSENGER = 0x00100000, // guessed, used to validate target (if vehicle passenger)
202
209
211{
213 SpellDestination(float x, float y, float z, float orientation = 0.0f, uint32 mapId = MAPID_INVALID);
214 SpellDestination(Position const& pos);
215 SpellDestination(WorldObject const& wObj);
216
217 void Relocate(Position const& pos);
218 void RelocateOffset(Position const& offset);
219
223};
224
226{
227public:
230
231 void Read(ByteBuffer& data, Unit* caster);
233
234 uint32 GetTargetMask() const { return m_targetMask; }
235 void SetTargetMask(uint32 newMask) { m_targetMask = newMask; }
236
237 void SetTargetFlag(SpellCastTargetFlags flag) { m_targetMask |= flag; }
238
239 ObjectGuid GetUnitTargetGUID() const;
240 Unit* GetUnitTarget() const;
241 void SetUnitTarget(Unit* target);
242
243 ObjectGuid GetGOTargetGUID() const;
244 GameObject* GetGOTarget() const;
245 void SetGOTarget(GameObject* target);
246
247 ObjectGuid GetCorpseTargetGUID() const;
248 Corpse* GetCorpseTarget() const;
249
250 WorldObject* GetObjectTarget() const;
251 ObjectGuid GetObjectTargetGUID() const;
252 void RemoveObjectTarget();
253
254 ObjectGuid GetItemTargetGUID() const { return m_itemTargetGUID; }
255 Item* GetItemTarget() const { return m_itemTarget; }
256 uint32 GetItemTargetEntry() const { return m_itemTargetEntry; }
257 void SetItemTarget(Item* item);
258 void SetTradeItemTarget(Player* caster);
259 void UpdateTradeSlotItem();
260
261 SpellDestination const* GetSrc() const;
262 Position const* GetSrcPos() const;
263 void SetSrc(float x, float y, float z);
264 void SetSrc(Position const& pos);
265 void SetSrc(WorldObject const& wObj);
266 void ModSrc(Position const& pos);
267 void RemoveSrc();
268
269 SpellDestination const* GetDst() const;
270 WorldLocation const* GetDstPos() const;
271 void SetDst(float x, float y, float z, float orientation, uint32 mapId = MAPID_INVALID);
272 void SetDst(Position const& pos);
273 void SetDst(WorldObject const& wObj);
274 void SetDst(SpellDestination const& spellDest);
275 void SetDst(SpellCastTargets const& spellTargets);
276 void ModDst(Position const& pos);
277 void ModDst(SpellDestination const& spellDest);
278 void RemoveDst();
279
280 bool HasSrc() const;
281 bool HasDst() const;
282 bool HasTraj() const { return m_speed != 0; }
283
284 float GetElevation() const { return m_elevation; }
285 void SetElevation(float elevation) { m_elevation = elevation; }
286 float GetSpeed() const { return m_speed; }
287 void SetSpeed(float speed) { m_speed = speed; }
288
289 float GetDist2d() const { return m_src._position.GetExactDist2d(&m_dst._position); }
290 float GetSpeedXY() const { return m_speed * std::cos(m_elevation); }
291 float GetSpeedZ() const { return m_speed * std::sin(m_elevation); }
292
293 void Update(WorldObject* caster);
294
295private:
297
298 // objects (can be used at spell creating and after Update at casting)
301
302 // object GUID/etc, can be used always
306
309
310 float m_elevation, m_speed;
311 std::string m_strTarget;
312};
313
315{
317 CastSpellTargetArg(std::nullptr_t) { Targets.emplace(); }
320 {
321 Targets.emplace();
322 Targets->SetItemTarget(itemTarget);
323 }
325 {
326 Targets.emplace();
327 Targets->SetDst(dest);
328 }
330 {
331 Targets.emplace(std::move(targets));
332 }
333
334 Optional<SpellCastTargets> Targets; // empty optional used to signal error state
335};
336
338{
340 CastSpellExtraArgs(bool triggered) : TriggerFlags(triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE) {}
341 CastSpellExtraArgs(TriggerCastFlags trigger) : TriggerFlags(trigger) {}
342 CastSpellExtraArgs(Item* item) : TriggerFlags(TRIGGERED_FULL_MASK), CastItem(item) {}
343 CastSpellExtraArgs(AuraEffect const* eff) : TriggerFlags(TRIGGERED_FULL_MASK), TriggeringAura(eff) {}
344 CastSpellExtraArgs(ObjectGuid const& origCaster) : TriggerFlags(TRIGGERED_FULL_MASK), OriginalCaster(origCaster) {}
345 CastSpellExtraArgs(AuraEffect const* eff, ObjectGuid const& origCaster) : TriggerFlags(TRIGGERED_FULL_MASK), TriggeringAura(eff), OriginalCaster(origCaster) {}
346 CastSpellExtraArgs(SpellValueMod mod, int32 val) { SpellValueOverrides.AddMod(mod, val); }
347
348 CastSpellExtraArgs& SetTriggerFlags(TriggerCastFlags flag) { TriggerFlags = flag; return *this; }
349 CastSpellExtraArgs& SetCastItem(Item* item) { CastItem = item; return *this; }
350 CastSpellExtraArgs& SetTriggeringAura(AuraEffect const* triggeringAura) { TriggeringAura = triggeringAura; return *this; }
351 CastSpellExtraArgs& SetOriginalCaster(ObjectGuid const& guid) { OriginalCaster = guid; return *this; }
352 CastSpellExtraArgs& AddSpellMod(SpellValueMod mod, int32 val) { SpellValueOverrides.AddMod(mod, val); return *this; }
353 CastSpellExtraArgs& AddSpellBP0(int32 val) { return AddSpellMod(SPELLVALUE_BASE_POINT0, val); } // because i don't want to type SPELLVALUE_BASE_POINT0 300 times
354
356 Item* CastItem = nullptr;
357 AuraEffect const* TriggeringAura = nullptr;
359 struct
360 {
361 friend struct CastSpellExtraArgs;
362 friend class WorldObject;
363
364 private:
365 void AddMod(SpellValueMod mod, int32 val) { data.push_back({ mod, val }); }
366
367 auto begin() const { return data.cbegin(); }
368 auto end() const { return data.cend(); }
369
370 std::vector<std::pair<SpellValueMod, int32>> data;
371 } SpellValueOverrides;
372};
373
374#endif
#define TC_GAME_API
Definition Define.h:114
uint8_t uint8
Definition Define.h:135
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
#define DEFINE_ENUM_FLAG(enumType)
Definition EnumFlag.h:26
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition Optional.h:25
Spells
Definition PlayerAI.cpp:32
#define MAPID_INVALID
Definition Position.h:165
Targets
SpellInterruptFlags
@ SPELL_INTERRUPT_FLAG_UNK3
@ SPELL_INTERRUPT_FLAG_ABORT_ON_DMG
@ SPELL_INTERRUPT_FLAG_PUSH_BACK
@ SPELL_INTERRUPT_FLAG_INTERRUPT
@ SPELL_INTERRUPT_FLAG_MOVEMENT
SpellChannelInterruptFlags
@ CHANNEL_FLAG_DELAY
@ CHANNEL_INTERRUPT_FLAG_INTERRUPT
SpellModOp
@ SPELLMOD_RANGE
@ SPELLMOD_EFFECT2
@ SPELLMOD_DAMAGE
@ SPELLMOD_CHANCE_OF_SUCCESS
@ SPELLMOD_CRIT_DAMAGE_BONUS
@ SPELLMOD_DOT
@ SPELLMOD_NOT_LOSE_CASTING_TIME
@ SPELLMOD_ALL_EFFECTS
@ SPELLMOD_CRITICAL_CHANCE
@ SPELLMOD_CRIT_DAMAGE_BONUS_2
@ SPELLMOD_BONUS_MULTIPLIER
@ MAX_SPELLMOD
@ SPELLMOD_EFFECT3
@ SPELLMOD_SPELL_COST_REFUND_ON_FAIL
@ SPELLMOD_VALUE_MULTIPLIER
@ SPELLMOD_DAMAGE_MULTIPLIER
@ SPELLMOD_GLOBAL_COOLDOWN
@ SPELLMOD_PROC_PER_MINUTE
@ SPELLMOD_THREAT
@ SPELLMOD_IGNORE_ARMOR
@ SPELLMOD_ACTIVATION_TIME
@ SPELLMOD_COOLDOWN
@ SPELLMOD_EFFECT1
@ SPELLMOD_DURATION
@ SPELLMOD_JUMP_TARGETS
@ SPELLMOD_CASTING_TIME
@ SPELLMOD_CHARGES
@ SPELLMOD_RADIUS
@ SPELLMOD_COST
@ SPELLMOD_RESIST_MISS_CHANCE
@ SPELLMOD_RESIST_DISPEL_CHANCE
SpellCastTargetFlags
@ TARGET_FLAG_TRADE_ITEM
@ TARGET_FLAG_GAMEOBJECT
@ TARGET_FLAG_STRING
@ TARGET_FLAG_NONE
@ TARGET_FLAG_UNIT_RAID
@ TARGET_FLAG_UNIT_ENEMY
@ TARGET_FLAG_GLYPH_SLOT
@ TARGET_FLAG_CORPSE_ALLY
@ TARGET_FLAG_ITEM
@ TARGET_FLAG_UNIT_MINIPET
@ TARGET_FLAG_UNIT_PASSENGER
@ TARGET_FLAG_GAMEOBJECT_ITEM
@ TARGET_FLAG_DEST_LOCATION
@ TARGET_FLAG_UNUSED20
@ TARGET_FLAG_UNIT_ALLY
@ TARGET_FLAG_SOURCE_LOCATION
@ TARGET_FLAG_ITEM_MASK
@ TARGET_FLAG_UNUSED_1
@ TARGET_FLAG_UNIT
@ TARGET_FLAG_DEST_TARGET
@ TARGET_FLAG_UNIT_MASK
@ TARGET_FLAG_UNIT_DEAD
@ TARGET_FLAG_CORPSE_ENEMY
@ TARGET_FLAG_CORPSE_MASK
@ TARGET_FLAG_GAMEOBJECT_MASK
@ TARGET_FLAG_UNIT_PARTY
TriggerCastFlags
@ TRIGGERED_IGNORE_EQUIPPED_ITEM_REQUIREMENT
Used when doing CastSpell with triggered == true.
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
@ TRIGGERED_IGNORE_POWER_AND_REAGENT_COST
Will ignore Spell and Category cooldowns.
@ TRIGGERED_DONT_RESET_PERIODIC_TIMER
Will ignore caster aura restrictions or requirements.
@ TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD
Will ignore GCD.
@ TRIGGERED_CAST_DIRECTLY
Will ignore combo point requirement.
@ TRIGGERED_IGNORE_TARGET_CHECK
Will ignore equipped item requirements.
@ TRIGGERED_IGNORE_CASTER_AURASTATE
Will ignore shapeshift checks.
@ TRIGGERED_IGNORE_AURA_SCALING
Will not take away cast item or update related achievement criteria.
@ TRIGGERED_IGNORE_CAST_IN_PROGRESS
Will ignore aura scaling.
@ TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE
Disallows proc events from triggered spell (default)
@ TRIGGERED_IGNORE_SHAPESHIFT
Will not adjust facing to target (if any)
@ TRIGGERED_IGNORE_AURA_INTERRUPT_FLAGS
In Spell::prepare, will be cast directly without setting containers for executed spell.
@ TRIGGERED_IGNORE_CAST_ITEM
Will ignore power and reagent cost.
@ TRIGGERED_IGNORE_COMBO_POINTS
Will not check if a current cast is in progress.
@ TRIGGERED_IGNORE_GCD
Not triggered.
@ TRIGGERED_DISALLOW_PROC_EVENTS
Will ignore caster aura states including combat requirements and death state.
@ TRIGGERED_IGNORE_CASTER_AURAS
Will ignore mounted/on vehicle restrictions.
@ TRIGGERED_DONT_REPORT_CAST_ERROR
Will allow periodic aura timers to keep ticking (instead of resetting)
@ TRIGGERED_NONE
@ TRIGGERED_FULL_DEBUG_MASK
Will ignore most target checks (mostly DBC target checks)
@ TRIGGERED_IGNORE_SET_FACING
Will ignore interruptible aura's at cast.
SpellValueMod
@ SPELLVALUE_AURA_STACK
@ SPELLVALUE_BASE_POINT1
@ SPELLVALUE_RADIUS_MOD
@ SPELLVALUE_MAX_TARGETS
@ SPELLVALUE_BASE_POINT2
@ SPELLVALUE_BASE_POINT0
@ SPELLVALUE_CRIT_CHANCE
SpellFacingFlags
@ SPELL_FACING_FLAG_INFRONT
SpellAuraInterruptFlags
@ AURA_INTERRUPT_FLAG_TAKE_DAMAGE
@ AURA_INTERRUPT_FLAG_SPELL_ATTACK
@ AURA_INTERRUPT_FLAG_TELEPORTED
@ AURA_INTERRUPT_FLAG_CAST
@ AURA_INTERRUPT_FLAG_NOT_SHEATHED
@ AURA_INTERRUPT_FLAG_UNK21
@ AURA_INTERRUPT_FLAG_NOT_VICTIM
@ AURA_INTERRUPT_FLAG_DIRECT_DAMAGE
@ AURA_INTERRUPT_FLAG_UNK14
@ AURA_INTERRUPT_FLAG_IMMUNE_OR_LOST_SELECTION
@ AURA_INTERRUPT_FLAG_TALK
@ AURA_INTERRUPT_FLAG_HITBYSPELL
@ AURA_INTERRUPT_FLAG_MOVE
@ AURA_INTERRUPT_FLAG_TURNING
@ AURA_INTERRUPT_FLAG_JUMP
@ AURA_INTERRUPT_FLAG_NOT_ABOVEWATER
@ AURA_INTERRUPT_FLAG_NOT_SEATED
@ AURA_INTERRUPT_FLAG_NOT_UNDERWATER
@ AURA_INTERRUPT_FLAG_MELEE_ATTACK
@ AURA_INTERRUPT_FLAG_LEAVE_COMBAT
@ AURA_INTERRUPT_FLAG_TRANSFORM
@ AURA_INTERRUPT_FLAG_UNK16
@ AURA_INTERRUPT_FLAG_LOOTING
@ AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT
@ AURA_INTERRUPT_FLAG_CHANGE_MAP
@ AURA_INTERRUPT_FLAG_MOUNT
@ AURA_INTERRUPT_FLAG_LANDING
@ AURA_INTERRUPT_FLAG_NOT_MOUNTED
Definition Item.h:62
static ObjectGuid const Empty
Definition ObjectGuid.h:140
ObjectGuid m_objectTargetGUID
SpellDestination m_dst
bool HasTraj() const
void SetSpeed(float speed)
void SetTargetFlag(SpellCastTargetFlags flag)
float GetElevation() const
void SetTargetMask(uint32 newMask)
std::string m_strTarget
SpellDestination m_src
float GetSpeedZ() const
float GetSpeed() const
ObjectGuid GetItemTargetGUID() const
WorldObject * m_objectTarget
Item * GetItemTarget() const
uint32 GetTargetMask() const
void SetElevation(float elevation)
uint32 GetItemTargetEntry() const
ObjectGuid m_itemTargetGUID
float GetSpeedXY() const
float GetDist2d() const
Definition Unit.h:769
CastSpellExtraArgs(AuraEffect const *eff)
CastSpellExtraArgs(TriggerCastFlags trigger)
CastSpellExtraArgs(Item *item)
CastSpellExtraArgs & SetOriginalCaster(ObjectGuid const &guid)
CastSpellExtraArgs & SetTriggerFlags(TriggerCastFlags flag)
CastSpellExtraArgs & AddSpellBP0(int32 val)
CastSpellExtraArgs(ObjectGuid const &origCaster)
CastSpellExtraArgs & AddSpellMod(SpellValueMod mod, int32 val)
CastSpellExtraArgs(AuraEffect const *eff, ObjectGuid const &origCaster)
CastSpellExtraArgs(bool triggered)
CastSpellExtraArgs & SetCastItem(Item *item)
CastSpellExtraArgs(SpellValueMod mod, int32 val)
CastSpellExtraArgs & SetTriggeringAura(AuraEffect const *triggeringAura)
std::vector< std::pair< SpellValueMod, int32 > > data
CastSpellTargetArg(Item *itemTarget)
CastSpellTargetArg(std::nullptr_t)
Optional< SpellCastTargets > Targets
CastSpellTargetArg(Position const &dest)
CastSpellTargetArg(SpellCastTargets &&targets)
Position _transportOffset
WorldLocation _position
ObjectGuid _transportGUID