aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Object/Object.cpp9
-rw-r--r--src/server/game/Spells/Spell.cpp33
-rw-r--r--src/server/game/Spells/Spell.h4
-rw-r--r--src/server/game/Spells/SpellDefines.h95
-rw-r--r--src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp4
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp2
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp2
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp2
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp2
9 files changed, 92 insertions, 61 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index b0f098e5975..1672c286b2b 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -2970,8 +2970,13 @@ SpellCastResult WorldObject::CastSpell(CastSpellTargetArg const& targets, uint32
}
Spell* spell = new Spell(this, info, args.TriggerFlags, args.OriginalCaster, args.OriginalCastId);
- for (auto const& pair : args.SpellValueOverrides)
- spell->SetSpellValue(pair.first, pair.second);
+ for (auto const& [Type, Value] : args.SpellValueOverrides)
+ {
+ if (Type < SPELLVALUE_INT_END)
+ spell->SetSpellValue(SpellValueMod(Type), Value.I);
+ else
+ spell->SetSpellValue(SpellValueModFloat(Type), Value.F);
+ }
spell->m_CastItem = args.CastItem;
if (args.OriginalCastItemLevel)
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index c960f38bc48..b9c1beb464c 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -8538,21 +8538,12 @@ void Spell::SetSpellValue(SpellValueMod mod, int32 value)
switch (mod)
{
- case SPELLVALUE_RADIUS_MOD:
- m_spellValue->RadiusMod = (float)value / 10000;
- break;
case SPELLVALUE_MAX_TARGETS:
m_spellValue->MaxAffectedTargets = (uint32)value;
break;
case SPELLVALUE_AURA_STACK:
m_spellValue->AuraStackAmount = uint8(value);
break;
- case SPELLVALUE_CRIT_CHANCE:
- m_spellValue->CriticalChance = value / 100.0f; // @todo ugly /100 remove when basepoints are double
- break;
- case SPELLVALUE_DURATION_PCT:
- m_spellValue->DurationMul = float(value) / 100.0f;
- break;
case SPELLVALUE_DURATION:
m_spellValue->Duration = value;
break;
@@ -8567,6 +8558,24 @@ void Spell::SetSpellValue(SpellValueMod mod, int32 value)
}
}
+void Spell::SetSpellValue(SpellValueModFloat mod, float value)
+{
+ switch (mod)
+ {
+ case SPELLVALUE_RADIUS_MOD:
+ m_spellValue->RadiusMod = value;
+ break;
+ case SPELLVALUE_CRIT_CHANCE:
+ m_spellValue->CriticalChance = value;
+ break;
+ case SPELLVALUE_DURATION_PCT:
+ m_spellValue->DurationMul = value / 100.0f;
+ break;
+ default:
+ break;
+ }
+}
+
void Spell::PrepareTargetProcessing()
{
}
@@ -9383,8 +9392,10 @@ CastSpellExtraArgs& CastSpellExtraArgs::SetTriggeringSpell(Spell const* triggeri
TriggeringSpell = triggeringSpell;
if (triggeringSpell)
{
- OriginalCastItemLevel = triggeringSpell->m_castItemLevel;
- OriginalCastId = triggeringSpell->m_castId;
+ if (!OriginalCastItemLevel)
+ OriginalCastItemLevel = triggeringSpell->m_castItemLevel;
+ if (!OriginalCastItemLevel)
+ OriginalCastId = triggeringSpell->m_castId;
}
return *this;
}
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index ba900f703aa..55394d0354a 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -64,7 +64,8 @@ enum ProcFlagsHit : uint32;
enum ProcFlagsSpellType : uint32;
enum SpellTargetCheckTypes : uint8;
enum SpellTargetObjectTypes : uint8;
-enum SpellValueMod : uint8;
+enum SpellValueMod : int32;
+enum SpellValueModFloat : int32;
enum TriggerCastFlags : uint32;
enum WeaponAttackType : uint8;
@@ -658,6 +659,7 @@ class TC_GAME_API Spell
void CleanupTargetList();
void SetSpellValue(SpellValueMod mod, int32 value);
+ void SetSpellValue(SpellValueModFloat mod, float value);
Spell** m_selfContainer; // pointer to our spell container (if applicable)
diff --git a/src/server/game/Spells/SpellDefines.h b/src/server/game/Spells/SpellDefines.h
index 761208de2a3..809e0407df8 100644
--- a/src/server/game/Spells/SpellDefines.h
+++ b/src/server/game/Spells/SpellDefines.h
@@ -193,7 +193,7 @@ enum class SpellModOp : uint8
#define MAX_SPELLMOD 40
-enum SpellValueMod : uint8
+enum SpellValueMod : int32
{
SPELLVALUE_BASE_POINT0,
SPELLVALUE_BASE_POINT1,
@@ -227,15 +227,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
@@ -447,16 +455,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;
@@ -473,37 +511,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
diff --git a/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp b/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp
index 17289d91586..6420e9ad6f4 100644
--- a/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp
+++ b/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp
@@ -555,7 +555,7 @@ public:
{
void SetRadiusMod()
{
- GetSpell()->SetSpellValue(SPELLVALUE_RADIUS_MOD, int32(GetCaster()->GetObjectScale() * 10000 * 2 / 3));
+ GetSpell()->SetSpellValue(SPELLVALUE_RADIUS_MOD, GetCaster()->GetObjectScale() * 2 / 3);
}
void FilterTargets(std::list<WorldObject*>& unitList)
@@ -626,7 +626,7 @@ public:
{
void SetRadiusMod()
{
- GetSpell()->SetSpellValue(SPELLVALUE_RADIUS_MOD, int32(GetCaster()->GetObjectScale() * 10000 * 2 / 3));
+ GetSpell()->SetSpellValue(SPELLVALUE_RADIUS_MOD, GetCaster()->GetObjectScale() * 2 / 3);
}
void Register() override
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
index 1ce245d07f6..0d9673d354b 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
@@ -1506,7 +1506,7 @@ class spell_halion_combustion_consumption_periodic : public SpellScriptLoader
return;
uint32 triggerSpell = aurEff->GetSpellEffectInfo().TriggerSpell;
- int32 radius = caster->GetObjectScale() * M_PI * 10000 / 3;
+ float radius = caster->GetObjectScale() * M_PI / 3;
CastSpellExtraArgs args(aurEff);
args.OriginalCaster = caster->GetGUID();
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
index 4ebdd7270ac..ebdd583d4f7 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
@@ -1208,7 +1208,7 @@ class spell_jormungars_slime_pool : public AuraScript
{
PreventDefaultAction();
- int32 const radius = static_cast<int32>(((aurEff->GetTickNumber() / 60.f) * 0.9f + 0.1f) * 10000.f * 2.f / 3.f);
+ float const radius = ((aurEff->GetTickNumber() / 60.f) * 0.9f + 0.1f) * 2.f / 3.f;
CastSpellExtraArgs args(aurEff);
args.AddSpellMod(SPELLVALUE_RADIUS_MOD, radius);
GetTarget()->CastSpell(nullptr, aurEff->GetSpellEffectInfo().TriggerSpell, args);
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp
index d40c0033d28..1b9304fa4a7 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp
@@ -226,7 +226,7 @@ class spell_grobbulus_poison_cloud : public AuraScript
return;
uint32 triggerSpell = aurEff->GetSpellEffectInfo().TriggerSpell;
- int32 mod = int32(((float(aurEff->GetTickNumber()) / aurEff->GetTotalTicks()) * 0.9f + 0.1f) * 10000 * 2 / 3);
+ float mod = ((float(aurEff->GetTickNumber()) / aurEff->GetTotalTicks()) * 0.9f + 0.1f) * 2 / 3;
CastSpellExtraArgs args(aurEff);
args.AddSpellMod(SPELLVALUE_RADIUS_MOD, mod);
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
index c656675f034..421fb5673fb 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
@@ -292,7 +292,7 @@ class spell_broggok_poison_cloud : public SpellScriptLoader
return;
uint32 triggerSpell = aurEff->GetSpellEffectInfo().TriggerSpell;
- int32 mod = int32(((float(aurEff->GetTickNumber()) / aurEff->GetTotalTicks()) * 0.9f + 0.1f) * 10000 * 2 / 3);
+ float mod = ((float(aurEff->GetTickNumber()) / aurEff->GetTotalTicks()) * 0.9f + 0.1f) * 10000 * 2 / 3;
GetTarget()->CastSpell(nullptr, triggerSpell, CastSpellExtraArgs(aurEff).AddSpellMod(SPELLVALUE_RADIUS_MOD, mod));
}