diff options
author | Treeston <treeston.mmoc@gmail.com> | 2017-12-30 20:28:41 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-04-16 15:22:42 +0200 |
commit | 9b141207d170e4b2b4e6d9290d5f921f76cbcea0 (patch) | |
tree | 47d65d966a66699f6de7e308047e408bdb255bff /src/server/game/Spells/SpellDefines.h | |
parent | 2ea8f5e6fced094f28c45ac84123c85477122567 (diff) |
[3.3.5] CastSpell unclusterfucking (that's a word now) (#21123)
Core/Spell: The giant CastSpell unclusterfucking (that's a word now) of this generation.
- CastSpell now always takes three arguments - target, spellId, and a struct containing extra arguments
- This struct (CastSpellExtraArgs, see SpellDefines.h) serves as a conglomerate of every previous combination of the 20 billion different CastSpell overloads, all merged into one
- It has some great utility constructors - check them out! All of these can be used to implicitly construct the ExtraArgs object.
- A gajillion refactors to make everything behave the way it always has
(cherry picked from commit d507a7e3388382960108b24143da48e5f912b4a7)
Diffstat (limited to 'src/server/game/Spells/SpellDefines.h')
-rw-r--r-- | src/server/game/Spells/SpellDefines.h | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/src/server/game/Spells/SpellDefines.h b/src/server/game/Spells/SpellDefines.h index c330b2b1aa8..0b81f9ced5c 100644 --- a/src/server/game/Spells/SpellDefines.h +++ b/src/server/game/Spells/SpellDefines.h @@ -20,6 +20,12 @@ #include "Define.h" #include "EnumFlag.h" +#include "ObjectGuid.h" +#include <vector> + +class Item; +class AuraEffect; +enum Difficulty : uint8; namespace UF { @@ -122,6 +128,168 @@ enum class SpellAuraInterruptFlags2 : uint32 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 +}; + +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) { SpellValueOverrides.AddBP0(val); return *this; } + + TriggerCastFlags TriggerFlags = TRIGGERED_NONE; + Item* CastItem = nullptr; + AuraEffect const* TriggeringAura = nullptr; + ObjectGuid OriginalCaster = ObjectGuid::Empty; + Difficulty CastDifficulty = Difficulty(0); + struct + { + public: + void AddMod(SpellValueMod mod, int32 val) { data.emplace_back(mod, val); } + void AddBP0(int32 bp0) { AddMod(SPELLVALUE_BASE_POINT0, bp0); } // because i don't want to type SPELLVALUE_BASE_POINT0 300 times + + private: + auto begin() const { return data.cbegin(); } + auto end() const { return data.cend(); } + + std::vector<std::pair<SpellValueMod, int32>> data; + + friend class Unit; + } SpellValueOverrides; +}; + struct SpellCastVisual { uint32 SpellXSpellVisualID = 0; |