diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-09-12 21:57:16 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-09-12 21:57:16 +0200 |
commit | 975e7cc0723d3136822f6190de8742eef17a2539 (patch) | |
tree | 110a684b9989f1b62eb0af7680049fa26d083a30 /src/server/game/Spells/SpellDefines.h | |
parent | d3b05c591cae95557af552cebc97fe71d109a474 (diff) |
Core/Spells: Refactor CastSpellExtraArgs
* Allow C++20 designated initializers
* Allow precise float values for SPELLVALUE_RADIUS_MOD, SPELLVALUE_CRIT_CHANCE and SPELLVALUE_DURATION_PCT
Diffstat (limited to 'src/server/game/Spells/SpellDefines.h')
-rw-r--r-- | src/server/game/Spells/SpellDefines.h | 95 |
1 files changed, 54 insertions, 41 deletions
diff --git a/src/server/game/Spells/SpellDefines.h b/src/server/game/Spells/SpellDefines.h index f66eff79058..81ab33b50c6 100644 --- a/src/server/game/Spells/SpellDefines.h +++ b/src/server/game/Spells/SpellDefines.h @@ -194,7 +194,7 @@ enum class SpellModOp : uint8 #define MAX_SPELLMOD 40 -enum SpellValueMod : uint8 +enum SpellValueMod : int32 { SPELLVALUE_BASE_POINT0, SPELLVALUE_BASE_POINT1, @@ -228,15 +228,23 @@ enum SpellValueMod : uint8 SPELLVALUE_BASE_POINT29, SPELLVALUE_BASE_POINT30, SPELLVALUE_BASE_POINT31, + SPELLVALUE_BASE_POINT_END, - SPELLVALUE_RADIUS_MOD, - SPELLVALUE_MAX_TARGETS, + + SPELLVALUE_MAX_TARGETS = SPELLVALUE_BASE_POINT_END, SPELLVALUE_AURA_STACK, - SPELLVALUE_CRIT_CHANCE, - SPELLVALUE_DURATION_PCT, SPELLVALUE_DURATION, SPELLVALUE_PARENT_SPELL_TARGET_COUNT, - SPELLVALUE_PARENT_SPELL_TARGET_INDEX + SPELLVALUE_PARENT_SPELL_TARGET_INDEX, + + SPELLVALUE_INT_END +}; + +enum SpellValueModFloat : int32 +{ + SPELLVALUE_RADIUS_MOD = uint8(SPELLVALUE_INT_END), + SPELLVALUE_CRIT_CHANCE, + SPELLVALUE_DURATION_PCT, }; enum SpellFacingFlags @@ -448,16 +456,46 @@ struct TC_GAME_API CastSpellTargetArg Optional<SpellCastTargets> Targets; // empty optional used to signal error state }; -struct TC_GAME_API CastSpellExtraArgs +struct CastSpellExtraArgsInit +{ + TriggerCastFlags TriggerFlags = TRIGGERED_NONE; + Item* CastItem = nullptr; + Spell const* TriggeringSpell = nullptr; + AuraEffect const* TriggeringAura = nullptr; + ObjectGuid OriginalCaster = ObjectGuid::Empty; + Difficulty CastDifficulty = Difficulty(0); + ObjectGuid OriginalCastId = ObjectGuid::Empty; + Optional<int32> OriginalCastItemLevel; + struct SpellValueOverride + { + SpellValueOverride(SpellValueMod mod, int32 val) : Type(mod) { Value.I = val; } + SpellValueOverride(SpellValueModFloat mod, float val) : Type(mod) { Value.F = val; } + + int32 Type; + union + { + float F; + int32 I; + } Value; + }; + std::vector<SpellValueOverride> SpellValueOverrides; + std::any CustomArg; + Optional<Scripting::v2::ActionResultSetter<SpellCastResult>> ScriptResult; + bool ScriptWaitsForSpellHit = false; +}; + +struct TC_GAME_API CastSpellExtraArgs : public CastSpellExtraArgsInit { CastSpellExtraArgs(); - 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(Spell const* triggeringSpell) : TriggerFlags(TRIGGERED_FULL_MASK) { SetTriggeringSpell(triggeringSpell); } - CastSpellExtraArgs(AuraEffect const* eff) : TriggerFlags(TRIGGERED_FULL_MASK) { SetTriggeringAura(eff); } - CastSpellExtraArgs(Difficulty castDifficulty) : CastDifficulty(castDifficulty) {} - CastSpellExtraArgs(SpellValueMod mod, int32 val) { SpellValueOverrides.AddMod(mod, val); } + 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(Spell const* triggeringSpell) { TriggerFlags = TRIGGERED_FULL_MASK; SetTriggeringSpell(triggeringSpell); } + CastSpellExtraArgs(AuraEffect const* eff) { TriggerFlags = TRIGGERED_FULL_MASK; SetTriggeringAura(eff); } + CastSpellExtraArgs(Difficulty castDifficulty) { CastDifficulty = castDifficulty; } + CastSpellExtraArgs(SpellValueMod mod, int32 val) { SpellValueOverrides.emplace_back(mod, val); } + CastSpellExtraArgs(SpellValueModFloat mod, float val) { SpellValueOverrides.emplace_back(mod, val); } + CastSpellExtraArgs(CastSpellExtraArgsInit&& init) : CastSpellExtraArgsInit(std::move(init)) { SetTriggeringSpell(TriggeringSpell); } CastSpellExtraArgs(CastSpellExtraArgs const& other); CastSpellExtraArgs(CastSpellExtraArgs&& other) noexcept; @@ -474,37 +512,12 @@ struct TC_GAME_API CastSpellExtraArgs CastSpellExtraArgs& SetOriginalCaster(ObjectGuid const& guid) { OriginalCaster = guid; return *this; } CastSpellExtraArgs& SetCastDifficulty(Difficulty castDifficulty) { CastDifficulty = castDifficulty; return *this; } CastSpellExtraArgs& SetOriginalCastId(ObjectGuid const& castId) { OriginalCastId = castId; return *this; } - CastSpellExtraArgs& AddSpellMod(SpellValueMod mod, int32 val) { SpellValueOverrides.AddMod(mod, val); return *this; } + CastSpellExtraArgs& AddSpellMod(SpellValueMod mod, int32 val) { SpellValueOverrides.emplace_back(mod, val); return *this; } + CastSpellExtraArgs& AddSpellMod(SpellValueModFloat mod, float val) { SpellValueOverrides.emplace_back(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 CastSpellExtraArgs& SetCustomArg(std::any customArg) { CustomArg = std::move(customArg); return *this; } CastSpellExtraArgs& SetScriptResult(Scripting::v2::ActionResultSetter<SpellCastResult> scriptResult) { ScriptResult.emplace(std::move(scriptResult)); return *this; } CastSpellExtraArgs& SetScriptWaitsForSpellHit(bool scriptWaitsForSpellHit) { ScriptWaitsForSpellHit = scriptWaitsForSpellHit; return *this; } - - TriggerCastFlags TriggerFlags = TRIGGERED_NONE; - Item* CastItem = nullptr; - Spell const* TriggeringSpell = nullptr; - AuraEffect const* TriggeringAura = nullptr; - ObjectGuid OriginalCaster = ObjectGuid::Empty; - Difficulty CastDifficulty = Difficulty(0); - ObjectGuid OriginalCastId = ObjectGuid::Empty; - Optional<int32> OriginalCastItemLevel; - struct - { - friend struct CastSpellExtraArgs; - friend class WorldObject; - - 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<std::pair<SpellValueMod, int32>> data; - } SpellValueOverrides; - std::any CustomArg; - - Optional<Scripting::v2::ActionResultSetter<SpellCastResult>> ScriptResult; - bool ScriptWaitsForSpellHit = false; }; struct SpellCastVisual |