diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index c74c81c486..7e7ac43520 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -2951,8 +2951,8 @@ SpellCastResult WorldObject::CastSpell(SpellCastTargets const& targets, uint32 s } Spell* spell = new Spell(this, info, args.TriggerFlags, args.OriginalCaster); - for (auto const& pair : args.SpellValueOverrides) - spell->SetSpellValue(pair.first, pair.second); + for (CastSpellExtraArgsInit::SpellValueOverride const& value : args.SpellValueOverrides) + spell->SetSpellValue(value); spell->m_CastItem = args.CastItem; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 5fafdd527e..4084c99b39 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -8103,7 +8103,7 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 Spell* spell = new Spell(this, spellInfo, TRIGGERED_NONE); spell->m_CastItem = item; spell->m_cast_count = castId; - spell->SetSpellValue(SPELLVALUE_BASE_POINT0, learning_spell_id); + spell->SetSpellValue({ SPELLVALUE_BASE_POINT0, learning_spell_id }); spell->prepare(targets); return; } diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 448c646647..57ce087dcf 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -3156,7 +3156,7 @@ void AuraEffect::HandleAuraControlVehicle(AuraApplication const* aurApp, uint8 m // so this break such spells or most of them. // Current formula about m_amount: effect base points + dieside - 1 // TO DO: Reasearch more about 0/0 and fix it. - caster->_EnterVehicle(target->GetVehicleKit(), _amount - 1, aurApp); + caster->_EnterVehicle(target->GetVehicleKit(), GetAmount() - 1, aurApp); } else { diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index a1807e77e5..b57f99e03c 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -8274,33 +8274,28 @@ SpellCastResult Spell::CanOpenLock(uint32 effIndex, uint32 lockId, SkillType& sk return SPELL_CAST_OK; } -void Spell::SetSpellValue(SpellValueMod mod, int32 value) +void Spell::SetSpellValue(CastSpellExtraArgsInit::SpellValueOverride const& value) { - switch (mod) + if (value.Type >= SPELLVALUE_BASE_POINT0 && value.Type < SPELLVALUE_BASE_POINT_END) + { + m_spellValue->EffectBasePoints[value.Type - SPELLVALUE_BASE_POINT0] = value.Value.I; + m_spellValue->CustomBasePointsMask |= 1 << (value.Type - SPELLVALUE_BASE_POINT0); + return; + } + + switch (value.Type) { - case SPELLVALUE_BASE_POINT0: - m_spellValue->EffectBasePoints[0] = value; - m_spellValue->CustomBasePointsMask |= 1 << 0; - break; - case SPELLVALUE_BASE_POINT1: - m_spellValue->EffectBasePoints[1] = value; - m_spellValue->CustomBasePointsMask |= 1 << 1; - break; - case SPELLVALUE_BASE_POINT2: - m_spellValue->EffectBasePoints[2] = value; - m_spellValue->CustomBasePointsMask |= 1 << 2; - break; case SPELLVALUE_RADIUS_MOD: - m_spellValue->RadiusMod = (float)value / 10000; + m_spellValue->RadiusMod = (float)value.Value.I / 10000; break; case SPELLVALUE_MAX_TARGETS: - m_spellValue->MaxAffectedTargets = (uint32)value; + m_spellValue->MaxAffectedTargets = uint32(value.Value.I); break; case SPELLVALUE_AURA_STACK: - m_spellValue->AuraStackAmount = uint8(value); + m_spellValue->AuraStackAmount = uint8(value.Value.I); break; case SPELLVALUE_DURATION: - m_spellValue->Duration = value; + m_spellValue->Duration = value.Value.I; break; default: break; diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index a21eac1554..51504ae06a 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -25,6 +25,7 @@ #include "Optional.h" #include "Position.h" #include "SharedDefines.h" +#include "SpellDefines.h" #include #include @@ -69,7 +70,7 @@ enum LootType : uint8; enum SpellCastTargetFlags : uint32; enum SpellTargetCheckTypes : uint8; enum SpellTargetObjectTypes : uint8; -enum SpellValueMod : uint8; +enum SpellValueMod : int32; enum TriggerCastFlags : uint32; enum WeaponAttackType : uint8; @@ -584,7 +585,7 @@ class TC_GAME_API Spell void CleanupTargetList(); - void SetSpellValue(SpellValueMod mod, int32 value); + void SetSpellValue(CastSpellExtraArgsInit::SpellValueOverride const& 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 f74ce92e80..e3ecb0f3da 100644 --- a/src/server/game/Spells/SpellDefines.h +++ b/src/server/game/Spells/SpellDefines.h @@ -141,12 +141,15 @@ enum class SpellModOp : uint8 constexpr uint8 MAX_SPELLMOD = 32; -enum SpellValueMod : uint8 +enum SpellValueMod : int32 { SPELLVALUE_BASE_POINT0, SPELLVALUE_BASE_POINT1, SPELLVALUE_BASE_POINT2, - SPELLVALUE_RADIUS_MOD, + + SPELLVALUE_BASE_POINT_END, + + SPELLVALUE_RADIUS_MOD = SPELLVALUE_BASE_POINT_END, SPELLVALUE_MAX_TARGETS, SPELLVALUE_AURA_STACK, SPELLVALUE_DURATION @@ -204,20 +207,20 @@ struct CastSpellExtraArgsInit AuraEffect const* TriggeringAura = nullptr; ObjectGuid OriginalCaster = ObjectGuid::Empty; - struct + struct SpellValueOverride { - friend struct CastSpellExtraArgs; - friend class WorldObject; + SpellValueOverride(SpellValueMod mod, int32 val) : Type(mod) { Value.I = val; } + //SpellValueOverride(SpellValueModFloat mod, float val) : Type(mod) { Value.F = val; } - 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; + int32 Type; + union + { + float F; + int32 I; + } Value; + }; + std::vector SpellValueOverrides; std::any CustomArg; }; @@ -231,7 +234,7 @@ struct TC_GAME_API CastSpellExtraArgs : public CastSpellExtraArgsInit CastSpellExtraArgs(AuraEffect const* eff) { TriggerFlags = TRIGGERED_FULL_MASK; SetTriggeringAura(eff); } CastSpellExtraArgs(ObjectGuid const& origCaster) { TriggerFlags = TRIGGERED_FULL_MASK; SetOriginalCaster(origCaster); } CastSpellExtraArgs(AuraEffect const* eff, ObjectGuid const& origCaster) { TriggerFlags = TRIGGERED_FULL_MASK; SetTriggeringAura(eff); SetOriginalCaster(origCaster); } - CastSpellExtraArgs(SpellValueMod mod, int32 val) { SpellValueOverrides.AddMod(mod, val); } + CastSpellExtraArgs(SpellValueMod mod, int32 val) { SpellValueOverrides.emplace_back(mod, val); } CastSpellExtraArgs(CastSpellExtraArgsInit&& init) : CastSpellExtraArgsInit(std::move(init)) { SetTriggeringSpell(TriggeringSpell); } CastSpellExtraArgs(CastSpellExtraArgs const& other); @@ -247,7 +250,7 @@ struct TC_GAME_API CastSpellExtraArgs : public CastSpellExtraArgsInit CastSpellExtraArgs& SetTriggeringSpell(Spell const* triggeringSpell) { TriggeringSpell = triggeringSpell; return *this; } CastSpellExtraArgs& SetTriggeringAura(AuraEffect const* triggeringAura) { TriggeringAura = triggeringAura; return *this; } CastSpellExtraArgs& SetOriginalCaster(ObjectGuid const& guid) { OriginalCaster = guid; 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& 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; } }; 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 143f2d834a..4ee3b6f7a9 100644 --- a/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp +++ b/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp @@ -647,7 +647,7 @@ class spell_azil_gravity_well_damage_nearby : public SpellScript { void SetRadiusMod() { - GetSpell()->SetSpellValue(SPELLVALUE_RADIUS_MOD, int32(GetCaster()->GetObjectScale() * 10000 * 2 / 3)); + GetSpell()->SetSpellValue({ SPELLVALUE_RADIUS_MOD, int32(GetCaster()->GetObjectScale() * 10000 * 2 / 3) }); } void FilterTargets(std::list& unitList) @@ -694,7 +694,7 @@ class spell_azil_gravity_well_pull : public SpellScript { void SetRadiusMod() { - GetSpell()->SetSpellValue(SPELLVALUE_RADIUS_MOD, int32(GetCaster()->GetObjectScale() * 10000 * 2 / 3)); + GetSpell()->SetSpellValue({ SPELLVALUE_RADIUS_MOD, int32(GetCaster()->GetObjectScale() * 10000 * 2 / 3)} ); } void Register() override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp index cafc9a674f..86bce1af1e 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -2756,7 +2756,7 @@ class spell_yogg_saron_sanity : public SpellScriptLoader // 63050 void ModSanityStacks() { - GetSpell()->SetSpellValue(SPELLVALUE_AURA_STACK, 100); + GetSpell()->SetSpellValue({SPELLVALUE_AURA_STACK, 100 }); } void Register() override