aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/SpellDefines.h
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-09-12 21:57:16 +0200
committerShauren <shauren.trinity@gmail.com>2024-09-12 21:57:16 +0200
commit975e7cc0723d3136822f6190de8742eef17a2539 (patch)
tree110a684b9989f1b62eb0af7680049fa26d083a30 /src/server/game/Spells/SpellDefines.h
parentd3b05c591cae95557af552cebc97fe71d109a474 (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.h95
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