/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* 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 .
*/
#ifndef TRINITY_SPELLDEFINES_H
#define TRINITY_SPELLDEFINES_H
#include "Define.h"
#include "EnumFlag.h"
#include "ObjectGuid.h"
#include
class Item;
class AuraEffect;
enum Difficulty : uint8;
namespace UF
{
struct SpellCastVisual;
}
namespace WorldPackets
{
namespace Spells
{
struct SpellCastVisual;
}
}
enum class SpellInterruptFlags : uint32
{
None = 0,
Movement = 0x00000001,
DamagePushbackPlayerOnly = 0x00000002,
Stun = 0x00000004, // useless, even spells without it get interrupted
Combat = 0x00000008,
DamageCancelsPlayerOnly = 0x00000010,
MeleeCombat = 0x00000020, // NYI
Immunity = 0x00000040, // NYI
DamageAbsorb = 0x00000080,
ZeroDamageCancels = 0x00000100,
DamagePushback = 0x00000200,
DamageCancels = 0x00000400
};
DEFINE_ENUM_FLAG(SpellInterruptFlags);
enum class SpellAuraInterruptFlags : uint32
{
None = 0,
HostileActionReceived = 0x00000001,
Damage = 0x00000002,
Action = 0x00000004,
Moving = 0x00000008,
Turning = 0x00000010,
Anim = 0x00000020,
Dismount = 0x00000040,
UnderWater = 0x00000080, // TODO: disallow casting when swimming (SPELL_FAILED_ONLY_ABOVEWATER)
AboveWater = 0x00000100, // TODO: disallow casting when not swimming (SPELL_FAILED_ONLY_UNDERWATER)
Sheathing = 0x00000200,
Interacting = 0x00000400, // TODO: more than gossip, replace all the feign death removals by aura type
Looting = 0x00000800,
Attacking = 0x00001000,
ItemUse = 0x00002000,
DamageChannelDuration = 0x00004000,
Shapeshifting = 0x00008000,
ActionDelayed = 0x00010000,
Mount = 0x00020000,
Standing = 0x00040000,
LeaveWorld = 0x00080000,
StealthOrInvis = 0x00100000,
InvulnerabilityBuff = 0x00200000,
EnterWorld = 0x00400000,
PvPActive = 0x00800000,
NonPeriodicDamage = 0x01000000,
LandingOrFlight = 0x02000000,
Release = 0x04000000,
DamageCancelsScript = 0x08000000, // NYI dedicated aura script hook
EnteringCombat = 0x10000000,
Login = 0x20000000,
Summon = 0x40000000,
LeavingCombat = 0x80000000,
NOT_VICTIM = (HostileActionReceived | Damage | NonPeriodicDamage)
};
DEFINE_ENUM_FLAG(SpellAuraInterruptFlags);
enum class SpellAuraInterruptFlags2 : uint32
{
None = 0,
Falling = 0x00000001, // NYI
Swimming = 0x00000002, // NYI
NotMoving = 0x00000004, // NYI
Ground = 0x00000008, // NYI
Transform = 0x00000010, // NYI
Jump = 0x00000020,
ChangeSpec = 0x00000040, // NYI
AbandonVehicle = 0x00000080, // NYI
StartOfEncounter = 0x00000100, // NYI
EndOfEncounter = 0x00000200, // NYI
Disconnect = 0x00000400, // NYI
EnteringInstance = 0x00000800, // NYI
DuelEnd = 0x00001000, // NYI
LeaveArenaOrBattleground = 0x00002000, // NYI
ChangeTalent = 0x00004000, // NYI
ChangeGlyph = 0x00008000, // NYI
SeamlessTransfer = 0x00010000, // NYI
WarModeLeave = 0x00020000, // NYI
TouchingGround = 0x00040000, // NYI
ChromieTime = 0x00080000, // NYI
SplineFlightOrFreeFlight = 0x00100000, // NYI
ProcOrPeriodicAttacking = 0x00200000 // NYI
};
DEFINE_ENUM_FLAG(SpellAuraInterruptFlags2);
enum class SpellModOp : uint8
{
HealingAndDamage = 0,
Duration = 1,
Hate = 2,
PointsIndex0 = 3,
ProcCharges = 4,
Range = 5,
Radius = 6,
CritChance = 7,
Points = 8,
ResistPushback = 9,
ChangeCastTime = 10,
Cooldown = 11,
PointsIndex1 = 12,
TargetResistance = 13,
PowerCost0 = 14, // Used when SpellPowerEntry::PowerIndex == 0
CritDamageAndHealing = 15,
HitChance = 16,
ChainTargets = 17,
ProcChance = 18,
Period = 19,
ChainAmplitude = 20,
StartCooldown = 21,
PeriodicHealingAndDamage = 22,
PointsIndex2 = 23,
BonusCoefficient = 24,
TriggerDamage = 25, // NYI
ProcFrequency = 26,
Amplitude = 27,
DispelResistance = 28,
CrowdDamage = 29, // NYI
PowerCostOnMiss = 30,
Doses = 31,
PointsIndex3 = 32,
PointsIndex4 = 33,
PowerCost1 = 34, // Used when SpellPowerEntry::PowerIndex == 1
ChainJumpDistance = 35,
AreaTriggerMaxSummons = 36, // NYI
MaxAuraStacks = 37,
ProcCooldown = 38,
PowerCost2 = 39, // Used when SpellPowerEntry::PowerIndex == 2
};
#define MAX_SPELLMOD 40
enum SpellValueMod : uint8
{
SPELLVALUE_BASE_POINT0,
SPELLVALUE_BASE_POINT1,
SPELLVALUE_BASE_POINT2,
SPELLVALUE_BASE_POINT3,
SPELLVALUE_BASE_POINT4,
SPELLVALUE_BASE_POINT5,
SPELLVALUE_BASE_POINT6,
SPELLVALUE_BASE_POINT7,
SPELLVALUE_BASE_POINT8,
SPELLVALUE_BASE_POINT9,
SPELLVALUE_BASE_POINT10,
SPELLVALUE_BASE_POINT11,
SPELLVALUE_BASE_POINT12,
SPELLVALUE_BASE_POINT13,
SPELLVALUE_BASE_POINT14,
SPELLVALUE_BASE_POINT15,
SPELLVALUE_BASE_POINT16,
SPELLVALUE_BASE_POINT17,
SPELLVALUE_BASE_POINT18,
SPELLVALUE_BASE_POINT19,
SPELLVALUE_BASE_POINT20,
SPELLVALUE_BASE_POINT21,
SPELLVALUE_BASE_POINT22,
SPELLVALUE_BASE_POINT23,
SPELLVALUE_BASE_POINT24,
SPELLVALUE_BASE_POINT25,
SPELLVALUE_BASE_POINT26,
SPELLVALUE_BASE_POINT27,
SPELLVALUE_BASE_POINT28,
SPELLVALUE_BASE_POINT29,
SPELLVALUE_BASE_POINT30,
SPELLVALUE_BASE_POINT31,
SPELLVALUE_BASE_POINT_END,
SPELLVALUE_RADIUS_MOD,
SPELLVALUE_MAX_TARGETS,
SPELLVALUE_AURA_STACK,
SPELLVALUE_CRIT_CHANCE,
SPELLVALUE_DURATION_PCT
};
enum SpellFacingFlags
{
SPELL_FACING_FLAG_INFRONT = 0x0001
};
enum TriggerCastFlags : uint32
{
TRIGGERED_NONE = 0x00000000, //! Not triggered
TRIGGERED_IGNORE_GCD = 0x00000001, //! Will ignore GCD
TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD = 0x00000002, //! Will ignore Spell and Category cooldowns
TRIGGERED_IGNORE_POWER_AND_REAGENT_COST = 0x00000004, //! Will ignore power and reagent cost
TRIGGERED_IGNORE_CAST_ITEM = 0x00000008, //! Will not take away cast item or update related achievement criteria
TRIGGERED_IGNORE_AURA_SCALING = 0x00000010, //! Will ignore aura scaling
TRIGGERED_IGNORE_CAST_IN_PROGRESS = 0x00000020, //! Will not check if a current cast is in progress
TRIGGERED_IGNORE_COMBO_POINTS = 0x00000040, //! Will ignore combo point requirement
TRIGGERED_CAST_DIRECTLY = 0x00000080, //! In Spell::prepare, will be cast directly without setting containers for executed spell
TRIGGERED_IGNORE_AURA_INTERRUPT_FLAGS = 0x00000100, //! Will ignore interruptible aura's at cast
TRIGGERED_IGNORE_SET_FACING = 0x00000200, //! Will not adjust facing to target (if any)
TRIGGERED_IGNORE_SHAPESHIFT = 0x00000400, //! Will ignore shapeshift checks
TRIGGERED_IGNORE_CASTER_AURASTATE = 0x00000800, //! Will ignore caster aura states including combat requirements and death state
TRIGGERED_DISALLOW_PROC_EVENTS = 0x00001000, //! Disallows proc events from triggered spell (default)
TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE = 0x00002000, //! Will ignore mounted/on vehicle restrictions
// reuse = 0x00004000,
// reuse = 0x00008000,
TRIGGERED_IGNORE_CASTER_AURAS = 0x00010000, //! Will ignore caster aura restrictions or requirements
TRIGGERED_DONT_RESET_PERIODIC_TIMER = 0x00020000, //! Will allow periodic aura timers to keep ticking (instead of resetting)
TRIGGERED_DONT_REPORT_CAST_ERROR = 0x00040000, //! Will return SPELL_FAILED_DONT_REPORT in CheckCast functions
TRIGGERED_FULL_MASK = 0x0007FFFF, //! Used when doing CastSpell with triggered == true
// debug flags (used with .cast triggered commands)
TRIGGERED_IGNORE_EQUIPPED_ITEM_REQUIREMENT = 0x00080000, //! Will ignore equipped item requirements
TRIGGERED_IGNORE_TARGET_CHECK = 0x00100000, //! Will ignore most target checks (mostly DBC target checks)
TRIGGERED_FULL_DEBUG_MASK = 0xFFFFFFFF
};
struct TC_GAME_API CastSpellExtraArgs
{
CastSpellExtraArgs() = default;
CastSpellExtraArgs(bool triggered) : TriggerFlags(triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE) {}
CastSpellExtraArgs(TriggerCastFlags trigger) : TriggerFlags(trigger) {}
CastSpellExtraArgs(Item* item) : TriggerFlags(TRIGGERED_FULL_MASK), CastItem(item) {}
CastSpellExtraArgs(AuraEffect const* eff) : TriggerFlags(TRIGGERED_FULL_MASK), TriggeringAura(eff) {}
CastSpellExtraArgs(ObjectGuid const& origCaster) : TriggerFlags(TRIGGERED_FULL_MASK), OriginalCaster(origCaster) {}
CastSpellExtraArgs(AuraEffect const* eff, ObjectGuid const& origCaster) : TriggerFlags(TRIGGERED_FULL_MASK), TriggeringAura(eff), OriginalCaster(origCaster) {}
CastSpellExtraArgs(Difficulty castDifficulty) : CastDifficulty(castDifficulty) {}
CastSpellExtraArgs(SpellValueMod mod, int32 val) { SpellValueOverrides.AddMod(mod, val); }
CastSpellExtraArgs& SetTriggerFlags(TriggerCastFlags flag) { TriggerFlags = flag; return *this; }
CastSpellExtraArgs& SetCastItem(Item* item) { CastItem = item; return *this; }
CastSpellExtraArgs& SetTriggeringAura(AuraEffect const* triggeringAura) { TriggeringAura = triggeringAura; return *this; }
CastSpellExtraArgs& SetOriginalCaster(ObjectGuid const& guid) { OriginalCaster = guid; return *this; }
CastSpellExtraArgs& SetCastDifficulty(Difficulty castDifficulty) { CastDifficulty = castDifficulty; return *this; }
CastSpellExtraArgs& AddSpellMod(SpellValueMod mod, int32 val) { SpellValueOverrides.AddMod(mod, val); return *this; }
CastSpellExtraArgs& AddSpellBP0(int32 val) { return AddSpellMod(SPELLVALUE_BASE_POINT0, val); } // because i don't want to type SPELLVALUE_BASE_POINT0 300 times
TriggerCastFlags TriggerFlags = TRIGGERED_NONE;
Item* CastItem = nullptr;
AuraEffect const* TriggeringAura = nullptr;
ObjectGuid OriginalCaster = ObjectGuid::Empty;
Difficulty CastDifficulty = Difficulty(0);
struct
{
friend struct CastSpellExtraArgs;
friend class Unit;
private:
void AddMod(SpellValueMod mod, int32 val) { data.push_back({ mod, val }); }
auto begin() const { return data.cbegin(); }
auto end() const { return data.cend(); }
std::vector> data;
} SpellValueOverrides;
};
struct SpellCastVisual
{
uint32 SpellXSpellVisualID = 0;
uint32 ScriptVisualID = 0;
operator UF::SpellCastVisual() const;
operator WorldPackets::Spells::SpellCastVisual() const;
};
#endif