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 | |
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)
138 files changed, 1232 insertions, 1020 deletions
diff --git a/src/server/game/AI/CoreAI/PassiveAI.cpp b/src/server/game/AI/CoreAI/PassiveAI.cpp index 2463f57f694..331267d1f19 100644 --- a/src/server/game/AI/CoreAI/PassiveAI.cpp +++ b/src/server/game/AI/CoreAI/PassiveAI.cpp @@ -98,7 +98,11 @@ int32 CritterAI::Permissible(Creature const* creature) void TriggerAI::IsSummonedBy(Unit* summoner) { if (me->m_spells[0]) - me->CastSpell(me, me->m_spells[0], false, nullptr, nullptr, summoner->GetGUID()); + { + CastSpellExtraArgs extra; + extra.OriginalCaster = summoner->GetGUID(); + me->CastSpell(me, me->m_spells[0], extra); + } } int32 TriggerAI::Permissible(Creature const* creature) diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index 25c43525da2..2a2b8c62bd3 100644 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -243,7 +243,7 @@ void PetAI::UpdateAI(uint32 diff) SpellCastTargets targets; targets.SetUnitTarget(target); - spell->prepare(&targets); + spell->prepare(targets); } // deleted cached Spell objects diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp index ccdb4097323..87277f7bfbf 100644 --- a/src/server/game/AI/CoreAI/UnitAI.cpp +++ b/src/server/game/AI/CoreAI/UnitAI.cpp @@ -96,7 +96,7 @@ bool UnitAI::DoSpellAttackIfReady(uint32 spellId) { if (me->IsWithinCombatRange(me->GetVictim(), spellInfo->GetMaxRange(false))) { - me->CastSpell(me->GetVictim(), spellInfo, TRIGGERED_NONE); + me->CastSpell(me->GetVictim(), spellId, me->GetMap()->GetDifficultyID()); me->resetAttackTimer(); return true; } @@ -167,28 +167,18 @@ void UnitAI::DoCast(uint32 spellId) me->CastSpell(target, spellId, false); } -void UnitAI::DoCast(Unit* victim, uint32 spellId, bool triggered) +void UnitAI::DoCast(Unit* victim, uint32 spellId, CastSpellExtraArgs const& args) { - if (!victim || (me->HasUnitState(UNIT_STATE_CASTING) && !triggered)) + if (me->HasUnitState(UNIT_STATE_CASTING) && !(args.TriggerFlags & TRIGGERED_IGNORE_CAST_IN_PROGRESS)) return; - me->CastSpell(victim, spellId, triggered); + me->CastSpell(victim, spellId, args); } -void UnitAI::DoCastVictim(uint32 spellId, bool triggered) +void UnitAI::DoCastVictim(uint32 spellId, CastSpellExtraArgs const& args) { - if (!me->GetVictim() || (me->HasUnitState(UNIT_STATE_CASTING) && !triggered)) - return; - - me->CastSpell(me->GetVictim(), spellId, triggered); -} - -void UnitAI::DoCastAOE(uint32 spellId, bool triggered) -{ - if (!triggered && me->HasUnitState(UNIT_STATE_CASTING)) - return; - - me->CastSpell(nullptr, spellId, triggered); + if (Unit* victim = me->GetVictim()) + DoCast(victim, spellId, args); } #define UPDATE_TARGET(a) {if (AIInfo->target<a) AIInfo->target=a;} diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h index 91f8a820189..a290c8ec402 100644 --- a/src/server/game/AI/CoreAI/UnitAI.h +++ b/src/server/game/AI/CoreAI/UnitAI.h @@ -298,10 +298,10 @@ class TC_GAME_API UnitAI void AttackStartCaster(Unit* victim, float dist); void DoCast(uint32 spellId); - void DoCast(Unit* victim, uint32 spellId, bool triggered = false); - void DoCastSelf(uint32 spellId, bool triggered = false) { DoCast(me, spellId, triggered); } - void DoCastVictim(uint32 spellId, bool triggered = false); - void DoCastAOE(uint32 spellId, bool triggered = false); + void DoCast(Unit* victim, uint32 spellId, CastSpellExtraArgs const& args = {}); + void DoCastSelf(uint32 spellId, CastSpellExtraArgs const& args = {}) { DoCast(me, spellId, args); } + void DoCastVictim(uint32 spellId, CastSpellExtraArgs const& args = {}); + void DoCastAOE(uint32 spellId, CastSpellExtraArgs const& args = {}) { DoCast(nullptr, spellId, args); } virtual bool ShouldSparWith(Unit const* /*target*/) const { return false; } diff --git a/src/server/game/AI/PlayerAI/PlayerAI.cpp b/src/server/game/AI/PlayerAI/PlayerAI.cpp index 695975fa177..be52282a482 100644 --- a/src/server/game/AI/PlayerAI/PlayerAI.cpp +++ b/src/server/game/AI/PlayerAI/PlayerAI.cpp @@ -575,7 +575,7 @@ void PlayerAI::DoCastAtTarget(TargetedSpell spell) { SpellCastTargets targets; targets.SetUnitTarget(spell.second); - spell.first->prepare(&targets); + spell.first->prepare(targets); } void PlayerAI::DoRangedAttackIfReady() diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index ae30dcca730..965fd290a1d 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -176,7 +176,7 @@ void ScriptedAI::DoCastSpell(Unit* target, SpellInfo const* spellInfo, bool trig return; me->StopMoving(); - me->CastSpell(target, spellInfo, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE); + me->CastSpell(target, spellInfo->Id, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE); } void ScriptedAI::DoPlaySoundToSet(WorldObject* source, uint32 soundId) diff --git a/src/server/game/Battlefield/Zones/BattlefieldTB.cpp b/src/server/game/Battlefield/Zones/BattlefieldTB.cpp index a5ddeb42526..81ac01277e9 100644 --- a/src/server/game/Battlefield/Zones/BattlefieldTB.cpp +++ b/src/server/game/Battlefield/Zones/BattlefieldTB.cpp @@ -212,7 +212,7 @@ void BattlefieldTB::OnPlayerJoinWar(Player* player) // Bonus damage buff for attackers if (player->GetTeamId() == GetAttackerTeam() && GetData(BATTLEFIELD_TB_DATA_TOWERS_DESTROYED) > 0) - player->CastCustomSpell(SPELL_TOWER_ATTACK_BONUS, SPELLVALUE_AURA_STACK, GetData(BATTLEFIELD_TB_DATA_TOWERS_DESTROYED), player, TRIGGERED_FULL_MASK); + player->CastSpell(player, SPELL_TOWER_ATTACK_BONUS, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_AURA_STACK, GetData(BATTLEFIELD_TB_DATA_TOWERS_DESTROYED))); } @@ -759,7 +759,7 @@ void BattlefieldTB::TowerDestroyed(TBTowerId tbTowerId) // Attack bonus buff for (ObjectGuid const& guid : m_PlayersInWar[GetAttackerTeam()]) if (Player* player = ObjectAccessor::FindPlayer(guid)) - player->CastCustomSpell(SPELL_TOWER_ATTACK_BONUS, SPELLVALUE_AURA_STACK, GetData(BATTLEFIELD_TB_DATA_TOWERS_DESTROYED), player, TRIGGERED_FULL_MASK); + player->CastSpell(player, SPELL_TOWER_ATTACK_BONUS, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_AURA_STACK, GetData(BATTLEFIELD_TB_DATA_TOWERS_DESTROYED))); // Honor reward TeamCastSpell(GetAttackerTeam(), SPELL_REWARD_TOWER_DESTROYED); diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 13ecb688257..e6f90796b89 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -2123,8 +2123,7 @@ void GameObject::Use(Unit* user) if (!spellId) return; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId, GetMap()->GetDifficultyID()); - if (!spellInfo) + if (!sSpellMgr->GetSpellInfo(spellId, GetMap()->GetDifficultyID())) { if (user->GetTypeId() != TYPEID_PLAYER || !sOutdoorPvPMgr->HandleCustomSpell(user->ToPlayer(), spellId, this)) TC_LOG_ERROR("misc", "WORLD: unknown spell id %u at use action for gameobject (Entry: %u GoType: %u)", spellId, GetEntry(), GetGoType()); @@ -2137,7 +2136,7 @@ void GameObject::Use(Unit* user) sOutdoorPvPMgr->HandleCustomSpell(player, spellId, this); if (spellCaster) - spellCaster->CastSpell(user, spellInfo, triggered); + spellCaster->CastSpell(user, spellId, triggered); else CastSpell(user, spellId); } @@ -2166,7 +2165,7 @@ void GameObject::CastSpell(Unit* target, uint32 spellId, TriggerCastFlags trigge if (self) { if (target) - target->CastSpell(target, spellInfo, triggered); + target->CastSpell(target, spellInfo->Id, triggered); return; } @@ -2179,6 +2178,8 @@ void GameObject::CastSpell(Unit* target, uint32 spellId, TriggerCastFlags trigge trigger->SetImmuneToAll(false); PhasingHandler::InheritPhaseShift(trigger, this); + CastSpellExtraArgs args; + args.TriggerFlags = triggered; if (Unit* owner = GetOwner()) { trigger->SetFaction(owner->GetFaction()); @@ -2188,14 +2189,17 @@ void GameObject::CastSpell(Unit* target, uint32 spellId, TriggerCastFlags trigge trigger->SetPvpFlags(owner->GetPvpFlags()); // needed for GO casts for proper target validation checks trigger->SetOwnerGUID(owner->GetGUID()); - trigger->CastSpell(target ? target : trigger, spellInfo, triggered, nullptr, nullptr, owner->GetGUID()); + + args.OriginalCaster = owner->GetGUID(); + trigger->CastSpell(target ? target : trigger, spellInfo->Id, args); } else { trigger->SetFaction(spellInfo->IsPositive() ? FACTION_FRIENDLY : FACTION_MONSTER); // Set owner guid for target if no owner available - needed by trigger auras // - trigger gets despawned and there's no caster avalible (see AuraEffect::TriggerSpell()) - trigger->CastSpell(target ? target : trigger, spellInfo, triggered, nullptr, nullptr, target ? target->GetGUID() : ObjectGuid::Empty); + args.OriginalCaster = target ? target->GetGUID() : ObjectGuid::Empty; + trigger->CastSpell(target ? target : trigger, spellInfo->Id, args); } } diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index d66e0b859e6..0e32be435b4 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -1702,13 +1702,13 @@ void Pet::CastPetAura(PetAura const* aura) if (!auraId) return; + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + if (auraId == 35696) // Demonic Knowledge - { - int32 basePoints = CalculatePct(aura->GetDamage(), GetStat(STAT_STAMINA) + GetStat(STAT_INTELLECT)); - CastCustomSpell(this, auraId, &basePoints, nullptr, nullptr, true); - } - else - CastSpell(this, auraId, true); + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT0, CalculatePct(aura->GetDamage(), GetStat(STAT_STAMINA) + GetStat(STAT_INTELLECT))); + + CastSpell(this, auraId, args); } bool Pet::IsPetAura(Aura const* aura) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 71005da4166..0cf360516ac 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -7862,7 +7862,7 @@ void Player::ApplyItemObtainSpells(Item* item, bool apply) if (apply) { if (!HasAura(spellId)) - CastSpell(this, spellId, true, item); + CastSpell(this, spellId, item); } else RemoveAurasDueToSpell(spellId); @@ -7994,7 +7994,7 @@ void Player::ApplyEquipSpell(SpellInfo const* spellInfo, Item* item, bool apply, TC_LOG_DEBUG("entities.player", "Player::ApplyEquipSpell: Player '%s' (%s) cast %s equip spell (ID: %i)", GetName().c_str(), GetGUID().ToString().c_str(), (item ? "item" : "itemset"), spellInfo->Id); - CastSpell(this, spellInfo, true, item); + CastSpell(this, spellInfo->Id, item); } else { @@ -8103,13 +8103,15 @@ void Player::ApplyArtifactPowerRank(Item* artifact, ArtifactPowerRankEntry const } else if (apply) { - CustomSpellValues csv; + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.CastItem = artifact; if (artifactPowerRank->AuraPointsOverride) for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) if (spellInfo->GetEffect(i)) - csv.AddSpellMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), artifactPowerRank->AuraPointsOverride); + args.AddSpellMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), artifactPowerRank->AuraPointsOverride); - CastCustomSpell(artifactPowerRank->SpellID, csv, this, TRIGGERED_FULL_MASK, artifact); + CastSpell(this, artifactPowerRank->SpellID, args); } } else @@ -8166,7 +8168,7 @@ void Player::ApplyAzeriteItemMilestonePower(AzeriteItem* item, AzeriteItemMilest if (AzeritePowerEntry const* azeritePower = sAzeritePowerStore.LookupEntry(azeriteItemMilestonePower->AzeritePowerID)) { if (apply) - CastSpell(this, azeritePower->SpellID, true, item); + CastSpell(this, azeritePower->SpellID, item); else RemoveAurasDueToItemSpell(azeritePower->SpellID, item->GetGUID()); } @@ -8183,7 +8185,7 @@ void Player::ApplyAzeriteEssence(AzeriteItem* item, uint32 azeriteEssenceId, uin if (major && currentRank == 1) { if (apply) - CastCustomSpell(SPELL_ID_HEART_ESSENCE_ACTION_BAR_OVERRIDE, SPELLVALUE_BASE_POINT0, azeriteEssencePower->MajorPowerDescription, this, TRIGGERED_FULL_MASK); + CastSpell(this, SPELL_ID_HEART_ESSENCE_ACTION_BAR_OVERRIDE, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellBP0(azeriteEssencePower->MajorPowerDescription)); else RemoveAurasDueToSpell(SPELL_ID_HEART_ESSENCE_ACTION_BAR_OVERRIDE); } @@ -8196,7 +8198,7 @@ void Player::ApplyAzeriteEssencePower(AzeriteItem* item, AzeriteEssencePowerEntr if (SpellInfo const* powerSpell = sSpellMgr->GetSpellInfo(azeriteEssencePower->MinorPowerDescription, DIFFICULTY_NONE)) { if (apply) - CastSpell(this, powerSpell, true, item); + CastSpell(this, powerSpell->Id, item); else RemoveAurasDueToItemSpell(powerSpell->Id, item->GetGUID()); } @@ -8208,7 +8210,7 @@ void Player::ApplyAzeriteEssencePower(AzeriteItem* item, AzeriteEssencePowerEntr if (powerSpell->IsPassive()) { if (apply) - CastSpell(this, powerSpell, true, item); + CastSpell(this, powerSpell->Id, item); else RemoveAurasDueToItemSpell(powerSpell->Id, item->GetGUID()); } @@ -8228,7 +8230,7 @@ void Player::ApplyAzeritePower(AzeriteEmpoweredItem* item, AzeritePowerEntry con if (apply) { if (!azeritePower->SpecSetID || sDB2Manager.IsSpecSetMember(azeritePower->SpecSetID, GetPrimarySpecialization())) - CastSpell(this, azeritePower->SpellID, true, item); + CastSpell(this, azeritePower->SpellID, item); } else RemoveAurasDueToItemSpell(azeritePower->SpellID, item->GetGUID()); @@ -8320,7 +8322,7 @@ void Player::CastItemCombatSpell(DamageInfo const& damageInfo, Item* item, ItemT chance = GetWeaponProcChance(); if (roll_chance_f(chance) && sScriptMgr->OnCastItemCombatSpell(this, damageInfo.GetVictim(), spellInfo, item)) - CastSpell(damageInfo.GetVictim(), spellInfo->Id, true, item); + CastSpell(damageInfo.GetVictim(), spellInfo->Id, item); } } @@ -8384,17 +8386,17 @@ void Player::CastItemCombatSpell(DamageInfo const& damageInfo, Item* item, ItemT if (roll_chance_f(chance)) { if (spellInfo->IsPositive()) - CastSpell(this, spellInfo, true, item); + CastSpell(this, spellInfo->Id, item); else - CastSpell(damageInfo.GetVictim(), spellInfo, true, item); + CastSpell(damageInfo.GetVictim(), spellInfo->Id, item); } if (roll_chance_f(chance)) { Unit* target = spellInfo->IsPositive() ? this : damageInfo.GetVictim(); + CastSpellExtraArgs args(item); // reduce effect values if enchant is limited - CustomSpellValues values; if (entry && (entry->AttributesMask & ENCHANT_PROC_ATTR_LIMIT_60) && target->GetLevelForTarget(this) > 60) { int32 const lvlDifference = target->GetLevelForTarget(this) - 60; @@ -8405,11 +8407,10 @@ void Player::CastItemCombatSpell(DamageInfo const& damageInfo, Item* item, ItemT for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (spellInfo->GetEffect(i)->IsEffect()) - values.AddSpellMod(static_cast<SpellValueMod>(SPELLVALUE_BASE_POINT0 + i), CalculatePct(spellInfo->GetEffect(i)->CalcValue(this), effectPct)); + args.SpellValueOverrides.AddMod(static_cast<SpellValueMod>(SPELLVALUE_BASE_POINT0 + i), CalculatePct(spellInfo->GetEffect(i)->CalcValue(this), effectPct)); } } - - CastCustomSpell(spellInfo->Id, values, target, TRIGGERED_FULL_MASK, item); + CastSpell(target, spellInfo->Id, args); } } } @@ -8443,7 +8444,7 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, Objec spell->m_fromClient = true; spell->m_CastItem = item; spell->SetSpellValue(SPELLVALUE_BASE_POINT0, learning_spell_id); - spell->prepare(&targets); + spell->prepare(targets); return; } } @@ -8473,7 +8474,7 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, Objec spell->m_CastItem = item; spell->m_misc.Raw.Data[0] = misc[0]; spell->m_misc.Raw.Data[1] = misc[1]; - spell->prepare(&targets); + spell->prepare(targets); return; } @@ -8507,7 +8508,7 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, Objec spell->m_CastItem = item; spell->m_misc.Raw.Data[0] = misc[0]; spell->m_misc.Raw.Data[1] = misc[1]; - spell->prepare(&targets); + spell->prepare(targets); return; } } @@ -14301,7 +14302,7 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool if (enchant_spell_id) { if (apply) - CastSpell(this, enchant_spell_id, true, item); + CastSpell(this, enchant_spell_id, item); else RemoveAurasDueToItemSpell(enchant_spell_id, item->GetGUID()); } @@ -14918,7 +14919,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 optionIndex, uint32 menu break; case GOSSIP_OPTION_SPIRITHEALER: if (isDead()) - source->ToCreature()->CastSpell(source->ToCreature(), 17251, true, nullptr, nullptr, GetGUID()); + source->ToCreature()->CastSpell(source->ToCreature(), 17251, GetGUID()); break; case GOSSIP_OPTION_QUESTGIVER: PrepareQuestMenu(guid); @@ -15604,7 +15605,7 @@ void Player::AddQuest(Quest const* quest, Object* questGiver) if (Unit* unit = questGiver->ToUnit()) caster = unit; - caster->CastSpell(this, spellInfo, true); + caster->CastSpell(this, spellInfo->Id, CastSpellExtraArgs(TRIGGERED_FULL_MASK).SetCastDifficulty(spellInfo->Difficulty)); } SetQuestSlot(log_slot, quest_id, qtime); @@ -15941,7 +15942,7 @@ void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rew if (Unit* unit = questGiver->ToUnit()) caster = unit; - caster->CastSpell(this, spellInfo, true); + caster->CastSpell(this, spellInfo->Id, CastSpellExtraArgs(TRIGGERED_FULL_MASK).SetCastDifficulty(spellInfo->Difficulty)); } else { @@ -15957,7 +15958,7 @@ void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rew if (Unit* unit = questGiver->ToUnit()) caster = unit; - caster->CastSpell(this, spellInfo, true); + caster->CastSpell(this, spellInfo->Id, CastSpellExtraArgs(TRIGGERED_FULL_MASK).SetCastDifficulty(spellInfo->Difficulty)); } } @@ -22449,7 +22450,7 @@ void Player::VehicleSpellInitialize() } if (spellInfo->IsPassive()) - vehicle->CastSpell(vehicle, spellInfo, true); + vehicle->CastSpell(vehicle, spellInfo->Id, true); petSpells.ActionButtons[i] = MAKE_UNIT_ACTION_BUTTON(spellId, i + 8); } @@ -25794,7 +25795,7 @@ bool Player::IsAtRecruitAFriendDistance(WorldObject const* pOther) const void Player::ResurrectUsingRequestData() { - /// Teleport before resurrecting by player, otherwise the player might get attacked from creatures near his corpse + // Teleport before resurrecting by player, otherwise the player might get attacked from creatures near his corpse TeleportTo(_resurrectionData->Location); if (IsBeingTeleported()) @@ -25825,7 +25826,7 @@ void Player::ResurrectUsingRequestDataImpl() SetPower(POWER_LUNAR_POWER, 0); if (uint32 aura = resurrectAura) - CastSpell(this, aura, true, nullptr, nullptr, resurrectGUID); + CastSpell(this, aura, resurrectGUID); SpawnCorpseBones(); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index d69a54935e9..0121c59f71d 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1001,147 +1001,46 @@ void Unit::CastStop(uint32 except_spellid) InterruptSpell(CurrentSpellTypes(i), false); } -void Unit::CastSpell(SpellCastTargets const& targets, SpellInfo const* spellInfo, CustomSpellValues const* value, TriggerCastFlags triggerFlags, Item* castItem, AuraEffect const* triggeredByAura, ObjectGuid originalCaster) +void Unit::CastSpell(SpellCastTargets const& targets, uint32 spellId, CastSpellExtraArgs const& args) { - if (!spellInfo) - { - TC_LOG_ERROR("entities.unit", "CastSpell: unknown spell by caster: %s", GetGUID().ToString().c_str()); - return; - } - - Spell* spell = new Spell(this, spellInfo, triggerFlags, originalCaster); - - if (value) - for (CustomSpellValues::const_iterator itr = value->begin(); itr != value->end(); ++itr) - spell->SetSpellValue(itr->first, itr->second); - - spell->m_CastItem = castItem; - spell->prepare(&targets, triggeredByAura); -} - -void Unit::CastSpell(Unit* victim, uint32 spellId, bool triggered, Item* castItem, AuraEffect const* triggeredByAura, ObjectGuid originalCaster) -{ - CastSpell(victim, spellId, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster); -} - -void Unit::CastSpell(Unit* victim, uint32 spellId, TriggerCastFlags triggerFlags /*= TRIGGER_NONE*/, Item* castItem /*= nullptr*/, AuraEffect const* triggeredByAura /*= nullptr*/, ObjectGuid originalCaster /*= ObjectGuid::Empty*/) -{ - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId, GetMap()->GetDifficultyID()); - if (!spellInfo) - { - TC_LOG_ERROR("entities.unit", "CastSpell: unknown spell id %u by caster: %s", spellId, GetGUID().ToString().c_str()); - return; - } - - CastSpell(victim, spellInfo, triggerFlags, castItem, triggeredByAura, originalCaster); -} - -void Unit::CastSpell(Unit* victim, SpellInfo const* spellInfo, bool triggered, Item* castItem/*= nullptr*/, AuraEffect const* triggeredByAura /*= nullptr*/, ObjectGuid originalCaster /*= ObjectGuid::Empty*/) -{ - CastSpell(victim, spellInfo, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster); -} - -void Unit::CastSpell(Unit* victim, SpellInfo const* spellInfo, TriggerCastFlags triggerFlags, Item* castItem, AuraEffect const* triggeredByAura, ObjectGuid originalCaster) -{ - SpellCastTargets targets; - targets.SetUnitTarget(victim); - CastSpell(targets, spellInfo, nullptr, triggerFlags, castItem, triggeredByAura, originalCaster); -} - -void Unit::CastCustomSpell(Unit* target, uint32 spellId, int32 const* bp0, int32 const* bp1, int32 const* bp2, bool triggered, Item* castItem, AuraEffect const* triggeredByAura, ObjectGuid originalCaster) -{ - CustomSpellValues values; - if (bp0) - values.AddSpellMod(SPELLVALUE_BASE_POINT0, *bp0); - if (bp1) - values.AddSpellMod(SPELLVALUE_BASE_POINT1, *bp1); - if (bp2) - values.AddSpellMod(SPELLVALUE_BASE_POINT2, *bp2); - CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster); -} - -void Unit::CastCustomSpell(uint32 spellId, SpellValueMod mod, int32 value, Unit* target, bool triggered, Item* castItem, AuraEffect const* triggeredByAura, ObjectGuid originalCaster) -{ - CustomSpellValues values; - values.AddSpellMod(mod, value); - CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster); -} - -void Unit::CastCustomSpell(uint32 spellId, SpellValueMod mod, int32 value, Unit* target, TriggerCastFlags triggerFlags, Item* castItem, AuraEffect const* triggeredByAura, ObjectGuid originalCaster) -{ - CustomSpellValues values; - values.AddSpellMod(mod, value); - CastCustomSpell(spellId, values, target, triggerFlags, castItem, triggeredByAura, originalCaster); -} - -void Unit::CastCustomSpell(uint32 spellId, CustomSpellValues const& value, Unit* victim, TriggerCastFlags triggerFlags, Item* castItem, AuraEffect const* triggeredByAura, ObjectGuid originalCaster) -{ - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId, GetMap()->GetDifficultyID()); - if (!spellInfo) + SpellInfo const* info = sSpellMgr->GetSpellInfo(spellId, args.CastDifficulty != DIFFICULTY_NONE ? args.CastDifficulty : GetMap()->GetDifficultyID()); + if (!info) { - TC_LOG_ERROR("entities.unit", "CastSpell: unknown spell id %u by caster: %s", spellId, GetGUID().ToString().c_str()); + TC_LOG_ERROR("entities.unit", "CastSpell: unknown spell %u by caster %s", spellId, GetGUID().ToString().c_str()); return; } - SpellCastTargets targets; - targets.SetUnitTarget(victim); - CastSpell(targets, spellInfo, &value, triggerFlags, castItem, triggeredByAura, originalCaster); -} + Spell* spell = new Spell(this, info, args.TriggerFlags, args.OriginalCaster); + for (auto const& pair : args.SpellValueOverrides) + spell->SetSpellValue(pair.first, pair.second); -void Unit::CastSpell(float x, float y, float z, uint32 spellId, bool triggered, Item* castItem, AuraEffect const* triggeredByAura, ObjectGuid originalCaster) -{ - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId, GetMap()->GetDifficultyID()); - if (!spellInfo) - { - TC_LOG_ERROR("entities.unit", "CastSpell: unknown spell id %u by caster: %s", spellId, GetGUID().ToString().c_str()); - return; - } - SpellCastTargets targets; - targets.SetDst(x, y, z, GetOrientation()); - - CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster); + spell->m_CastItem = args.CastItem; + spell->prepare(targets, args.TriggeringAura); } -void Unit::CastSpell(float x, float y, float z, uint32 spellId, TriggerCastFlags triggerFlags, Item* castItem, AuraEffect const* triggeredByAura, ObjectGuid originalCaster) +void Unit::CastSpell(WorldObject* target, uint32 spellId, CastSpellExtraArgs const& args) { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId, GetMap()->GetDifficultyID()); - if (!spellInfo) - { - TC_LOG_ERROR("entities.unit", "CastSpell: unknown spell id %u by caster: %s", spellId, GetGUID().ToString().c_str()); - return; - } SpellCastTargets targets; - targets.SetDst(x, y, z, GetOrientation()); - - CastSpell(targets, spellInfo, nullptr, triggerFlags, castItem, triggeredByAura, originalCaster); -} - -void Unit::CastSpell(GameObject* go, uint32 spellId, bool triggered, Item* castItem, AuraEffect const* triggeredByAura, ObjectGuid originalCaster) -{ - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId, GetMap()->GetDifficultyID()); - if (!spellInfo) + if (target) { - TC_LOG_ERROR("entities.unit", "CastSpell: unknown spell id %u by caster: %s", spellId, GetGUID().ToString().c_str()); - return; + if (Unit* unitTarget = target->ToUnit()) + targets.SetUnitTarget(unitTarget); + else if (GameObject* goTarget = target->ToGameObject()) + targets.SetGOTarget(goTarget); + else + { + TC_LOG_ERROR("entities.unit", "CastSpell: Invalid target %s passed to spell cast by %s", target->GetGUID().ToString().c_str(), GetGUID().ToString().c_str()); + return; + } } - SpellCastTargets targets; - targets.SetGOTarget(go); - - CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster); + CastSpell(targets, spellId, args); } -void Unit::CastSpell(Item* target, uint32 spellId, bool triggered, Item* castItem, AuraEffect const* triggeredByAura, ObjectGuid originalCaster) +void Unit::CastSpell(Position const& dest, uint32 spellId, CastSpellExtraArgs const& args) { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId, GetMap()->GetDifficultyID()); - if (!spellInfo) - { - TC_LOG_ERROR("entities.unit", "CastSpell: unknown spell id %u by caster: %s", spellId, GetGUID().ToString().c_str()); - return; - } SpellCastTargets targets; - targets.SetItemTarget(target); - - CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster); + targets.SetDst(dest); + CastSpell(targets, spellId, args); } void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 damage, SpellInfo const* spellInfo, WeaponAttackType attackType, bool crit) @@ -2125,7 +2024,10 @@ void Unit::AttackerStateUpdate(Unit* victim, WeaponAttackType attType, bool extr } else { - CastSpell(victim, meleeAttackSpellId, true, nullptr, meleeAttackAuraEffect); + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.TriggeringAura = meleeAttackAuraEffect; + CastSpell(victim, meleeAttackSpellId, args); uint32 hitInfo = HITINFO_AFFECTS_VICTIM | HITINFO_NO_ANIMATION; if (attType == OFF_ATTACK) @@ -2996,7 +2898,7 @@ void Unit::_UpdateAutoRepeatSpell() // we want to shoot Spell* spell = new Spell(this, autoRepeatSpellInfo, TRIGGERED_FULL_MASK); - spell->prepare(&(m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_targets)); + spell->prepare(m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_targets); // all went good, reset attack resetAttackTimer(RANGED_ATTACK); @@ -5991,7 +5893,7 @@ void Unit::ModifyAuraState(AuraStateType flag, bool apply) if (!spellInfo || !spellInfo->IsPassive()) continue; if (spellInfo->CasterAuraState == uint32(flag)) - CastSpell(this, itr->first, true, nullptr); + CastSpell(this, itr->first, true); } } else if (Pet* pet = ToCreature()->ToPet()) @@ -6004,7 +5906,7 @@ void Unit::ModifyAuraState(AuraStateType flag, bool apply) if (!spellInfo || !spellInfo->IsPassive()) continue; if (spellInfo->CasterAuraState == uint32(flag)) - CastSpell(this, itr->first, true, nullptr); + CastSpell(this, itr->first, true); } } } @@ -10181,7 +10083,10 @@ void Unit::TriggerOnPowerChangeAuras(Powers power, int32 oldVal, int32 newVal) break; } - CastSpell(this, triggerSpell, true, nullptr, effect); + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.TriggeringAura = effect; + CastSpell(this, triggerSpell, args); } } } @@ -10452,7 +10357,7 @@ void CharmInfo::InitPossessCreateSpells() if (spellInfo) { if (spellInfo->IsPassive()) - _unit->CastSpell(_unit, spellInfo, true); + _unit->CastSpell(_unit, spellInfo->Id, true); else AddSpellToActionBar(spellInfo, ACT_PASSIVE, i % MAX_UNIT_ACTION_BAR_INDEX); } @@ -10485,7 +10390,7 @@ void CharmInfo::InitCharmCreateSpells() if (spellInfo->IsPassive()) { - _unit->CastSpell(_unit, spellInfo, true); + _unit->CastSpell(_unit, spellInfo->Id, true); _charmspells[x].SetActionAndType(spellId, ACT_PASSIVE); } else @@ -13012,7 +12917,12 @@ bool Unit::HandleSpellClick(Unit* clicker, int8 seatId) } if (IsInMap(caster)) - caster->CastCustomSpell(itr->second.spellId, SpellValueMod(SPELLVALUE_BASE_POINT0 + i), seatId + 1, target, flags, nullptr, nullptr, origCasterGUID); + { + CastSpellExtraArgs args(flags); + args.OriginalCaster = origCasterGUID; + args.SpellValueOverrides.AddMod(SpellValueMod(SPELLVALUE_BASE_POINT0+i), seatId+1); + caster->CastSpell(target, itr->second.spellId, args); + } else // This can happen during Player::_LoadAuras { int32 bp0[MAX_SPELL_EFFECTS]; @@ -13027,7 +12937,7 @@ bool Unit::HandleSpellClick(Unit* clicker, int8 seatId) else { if (IsInMap(caster)) - caster->CastSpell(target, spellEntry, flags, nullptr, nullptr, origCasterGUID); + caster->CastSpell(target, spellEntry->Id, CastSpellExtraArgs().SetOriginalCaster(origCasterGUID)); else Aura::TryRefreshStackOrCreate(spellEntry, ObjectGuid::Create<HighGuid::Cast>(SPELL_CAST_SOURCE_NORMAL, GetMapId(), spellEntry->Id, GetMap()->GenerateLowGuid<HighGuid::Cast>()), MAX_EFFECT_MASK, this, clicker, GetMap()->GetDifficultyID(), nullptr, nullptr, origCasterGUID); } @@ -13044,7 +12954,9 @@ bool Unit::HandleSpellClick(Unit* clicker, int8 seatId) void Unit::EnterVehicle(Unit* base, int8 seatId) { - CastCustomSpell(VEHICLE_SPELL_RIDE_HARDCODED, SPELLVALUE_BASE_POINT0, seatId + 1, base, TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE); + CastSpellExtraArgs args(TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE); + args.SpellValueOverrides.AddBP0(seatId + 1); + CastSpell(base, VEHICLE_SPELL_RIDE_HARDCODED, args); } void Unit::_EnterVehicle(Vehicle* vehicle, int8 seatId, AuraApplication const* aurApp) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 0a1f3c72686..92da6ccbb20 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -39,125 +39,6 @@ #define SPELL_DH_DOUBLE_JUMP 196055 #define DISPLAYID_HIDDEN_MOUNT 73200 -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 -}; - -class CustomSpellValues -{ - typedef std::pair<SpellValueMod, int32> CustomSpellValueMod; - typedef std::vector<CustomSpellValueMod> StorageType; - -public: - typedef StorageType::const_iterator const_iterator; - -public: - void AddSpellMod(SpellValueMod mod, int32 value) - { - storage_.push_back(CustomSpellValueMod(mod, value)); - } - - const_iterator begin() const - { - return storage_.begin(); - } - - const_iterator end() const - { - return storage_.end(); - } - -private: - StorageType storage_; -}; - -enum SpellFacingFlags -{ - SPELL_FACING_FLAG_INFRONT = 0x0001 -}; - #define MAX_SPELL_CHARM 4 #define MAX_SPELL_VEHICLE 6 #define MAX_SPELL_POSSESS 8 @@ -284,36 +165,6 @@ enum WeaponDamageRange MAXDAMAGE }; -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 -}; - enum UnitMods { UNIT_MOD_STAT_STRENGTH, // UNIT_MOD_STAT_STRENGTH..UNIT_MOD_STAT_INTELLECT must be in existed order, it's accessed by index values of Stats enum. @@ -1326,21 +1177,10 @@ class TC_GAME_API Unit : public WorldObject void EnergizeBySpell(Unit* victim, uint32 spellId, int32 damage, Powers powerType); void EnergizeBySpell(Unit* victim, SpellInfo const* spellInfo, int32 damage, Powers powerType); - void CastSpell(SpellCastTargets const& targets, SpellInfo const* spellInfo, CustomSpellValues const* value, TriggerCastFlags triggerFlags = TRIGGERED_NONE, Item* castItem = nullptr, AuraEffect const* triggeredByAura = nullptr, ObjectGuid originalCaster = ObjectGuid::Empty); - void CastSpell(Unit* victim, uint32 spellId, bool triggered, Item* castItem = nullptr, AuraEffect const* triggeredByAura = nullptr, ObjectGuid originalCaster = ObjectGuid::Empty); - void CastSpell(std::nullptr_t, uint32 spellId, bool triggered, Item* castItem = nullptr, AuraEffect const* triggeredByAura = nullptr, ObjectGuid originalCaster = ObjectGuid::Empty) { CastSpell((Unit*)nullptr, spellId, triggered, castItem, triggeredByAura, originalCaster); } - void CastSpell(Unit* victim, uint32 spellId, TriggerCastFlags triggerFlags = TRIGGERED_NONE, Item* castItem = nullptr, AuraEffect const* triggeredByAura = nullptr, ObjectGuid originalCaster = ObjectGuid::Empty); - void CastSpell(std::nullptr_t, uint32 spellId, TriggerCastFlags triggerFlags = TRIGGERED_NONE, Item* castItem = nullptr, AuraEffect const* triggeredByAura = nullptr, ObjectGuid originalCaster = ObjectGuid::Empty) { CastSpell((Unit*)nullptr, spellId, triggerFlags, castItem, triggeredByAura, originalCaster); } - void CastSpell(Unit* victim, SpellInfo const* spellInfo, bool triggered, Item* castItem = nullptr, AuraEffect const* triggeredByAura = nullptr, ObjectGuid originalCaster = ObjectGuid::Empty); - void CastSpell(Unit* victim, SpellInfo const* spellInfo, TriggerCastFlags triggerFlags = TRIGGERED_NONE, Item* castItem = nullptr, AuraEffect const* triggeredByAura = nullptr, ObjectGuid originalCaster = ObjectGuid::Empty); - void CastSpell(float x, float y, float z, uint32 spellId, bool triggered, Item* castItem = nullptr, AuraEffect const* triggeredByAura = nullptr, ObjectGuid originalCaster = ObjectGuid::Empty); - void CastSpell(float x, float y, float z, uint32 spellId, TriggerCastFlags triggerFlags = TRIGGERED_NONE, Item* castItem = nullptr, AuraEffect const* triggeredByAura = nullptr, ObjectGuid originalCaster = ObjectGuid::Empty); - void CastSpell(GameObject* go, uint32 spellId, bool triggered, Item* castItem = nullptr, AuraEffect const* triggeredByAura = nullptr, ObjectGuid originalCaster = ObjectGuid::Empty); - void CastSpell(Item* target, uint32 spellId, bool triggered, Item* castItem = nullptr, AuraEffect const* triggeredByAura = nullptr, ObjectGuid originalCaster = ObjectGuid::Empty); - void CastCustomSpell(Unit* victim, uint32 spellId, int32 const* bp0, int32 const* bp1, int32 const* bp2, bool triggered, Item* castItem = nullptr, AuraEffect const* triggeredByAura = nullptr, ObjectGuid originalCaster = ObjectGuid::Empty); - void CastCustomSpell(uint32 spellId, SpellValueMod mod, int32 value, Unit* victim, bool triggered, Item* castItem = nullptr, AuraEffect const* triggeredByAura = nullptr, ObjectGuid originalCaster = ObjectGuid::Empty); - void CastCustomSpell(uint32 spellId, SpellValueMod mod, int32 value, Unit* victim = nullptr, TriggerCastFlags triggerFlags = TRIGGERED_NONE, Item* castItem = nullptr, AuraEffect const* triggeredByAura = nullptr, ObjectGuid originalCaster = ObjectGuid::Empty); - void CastCustomSpell(uint32 spellId, CustomSpellValues const& value, Unit* victim = nullptr, TriggerCastFlags triggerFlags = TRIGGERED_NONE, Item* castItem = nullptr, AuraEffect const* triggeredByAura = nullptr, ObjectGuid originalCaster = ObjectGuid::Empty); + // CastSpell's third arg can be a variety of things - check out CastSpellExtraArgs' constructors! + void CastSpell(SpellCastTargets const& targets, uint32 spellId, CastSpellExtraArgs const& args = {}); + void CastSpell(WorldObject* target, uint32 spellId, CastSpellExtraArgs const& args = {}); + void CastSpell(Position const& dest, uint32 spellId, CastSpellExtraArgs const& args = {}); Aura* AddAura(uint32 spellId, Unit* target); Aura* AddAura(SpellInfo const* spellInfo, uint32 effMask, Unit* target); void SetAuraStack(uint32 spellId, Unit* target, uint32 stack); diff --git a/src/server/game/Entities/Unit/UnitDefines.h b/src/server/game/Entities/Unit/UnitDefines.h index f12b41498d8..b0191780ae8 100644 --- a/src/server/game/Entities/Unit/UnitDefines.h +++ b/src/server/game/Entities/Unit/UnitDefines.h @@ -98,54 +98,6 @@ enum UnitPetFlag : uint8 UNIT_PET_FLAG_CAN_BE_ABANDONED = 0x02 }; -// high byte (3 from 0..3) of UNIT_FIELD_BYTES_2 -enum ShapeshiftForm -{ - FORM_NONE = 0, - FORM_CAT_FORM = 1, - FORM_TREE_OF_LIFE = 2, - FORM_TRAVEL_FORM = 3, - FORM_AQUATIC_FORM = 4, - FORM_BEAR_FORM = 5, - FORM_AMBIENT = 6, - FORM_GHOUL = 7, - FORM_DIRE_BEAR_FORM = 8, - FORM_CRANE_STANCE = 9, - FORM_THARONJA_SKELETON = 10, - FORM_DARKMOON_TEST_OF_STRENGTH = 11, - FORM_BLB_PLAYER = 12, - FORM_SHADOW_DANCE = 13, - FORM_CREATURE_BEAR = 14, - FORM_CREATURE_CAT = 15, - FORM_GHOST_WOLF = 16, - FORM_BATTLE_STANCE = 17, - FORM_DEFENSIVE_STANCE = 18, - FORM_BERSERKER_STANCE = 19, - FORM_SERPENT_STANCE = 20, - FORM_ZOMBIE = 21, - FORM_METAMORPHOSIS = 22, - FORM_OX_STANCE = 23, - FORM_TIGER_STANCE = 24, - FORM_UNDEAD = 25, - FORM_FRENZY = 26, - FORM_FLIGHT_FORM_EPIC = 27, - FORM_SHADOWFORM = 28, - FORM_FLIGHT_FORM = 29, - FORM_STEALTH = 30, - FORM_MOONKIN_FORM = 31, - FORM_SPIRIT_OF_REDEMPTION = 32, - FORM_GLADIATOR_STANCE = 33, - FORM_METAMORPHOSIS_2 = 34, - FORM_MOONKIN_FORM_RESTORATION = 35, - FORM_TREANT_FORM = 36, - FORM_SPIRIT_OWL_FORM = 37, - FORM_SPIRIT_OWL_FORM_2 = 38, - FORM_WISP_FORM = 39, - FORM_WISP_FORM_2 = 40, - FORM_SOULSHAPE = 41, - FORM_FORGEBORNE_REVERIES = 42 -}; - enum UnitMoveType { MOVE_WALK = 0, diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 66275e774bd..caae1003ccd 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1217,10 +1217,10 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) { // not blizz like, we must correctly save and load player instead... if (pCurrChar->getRace() == RACE_NIGHTELF && !pCurrChar->HasAura(20584)) - pCurrChar->CastSpell(pCurrChar, 20584, true, nullptr);// auras SPELL_AURA_INCREASE_SPEED(+speed in wisp form), SPELL_AURA_INCREASE_SWIM_SPEED(+swim speed in wisp form), SPELL_AURA_TRANSFORM (to wisp form) + pCurrChar->CastSpell(pCurrChar, 20584, true);// auras SPELL_AURA_INCREASE_SPEED(+speed in wisp form), SPELL_AURA_INCREASE_SWIM_SPEED(+swim speed in wisp form), SPELL_AURA_TRANSFORM (to wisp form) if (!pCurrChar->HasAura(8326)) - pCurrChar->CastSpell(pCurrChar, 8326, true, nullptr); // auras SPELL_AURA_GHOST, SPELL_AURA_INCREASE_SPEED(why?), SPELL_AURA_INCREASE_SWIM_SPEED(why?) + pCurrChar->CastSpell(pCurrChar, 8326, true); // auras SPELL_AURA_GHOST, SPELL_AURA_INCREASE_SPEED(why?), SPELL_AURA_INCREASE_SWIM_SPEED(why?) pCurrChar->SetWaterWalking(true); } diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index ee05f6918c2..9a2863ae12c 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -387,7 +387,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe } } - spell->prepare(&(spell->m_targets)); + spell->prepare(spell->m_targets); } else { @@ -713,7 +713,7 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPackets::Spells::PetCastSpell& spellPrepare.ServerCastID = spell->m_castId; SendPacket(spellPrepare.Write()); - spell->prepare(&targets); + spell->prepare(targets); } else { diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 11db09e1013..ad2a073a4a4 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -342,7 +342,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPackets::Spells::CastSpell& cast) spell->m_fromClient = true; spell->m_misc.Raw.Data[0] = cast.Cast.Misc[0]; spell->m_misc.Raw.Data[1] = cast.Cast.Misc[1]; - spell->prepare(&targets); + spell->prepare(targets); } void WorldSession::HandleCancelCastOpcode(WorldPackets::Spells::CancelCast& packet) @@ -489,14 +489,10 @@ void WorldSession::HandleSelfResOpcode(WorldPackets::Spells::SelfRes& selfRes) if (_player->HasAuraType(SPELL_AURA_PREVENT_RESURRECTION)) return; // silent return, client should display error by itself and not send this opcode - auto const& selfResSpells = _player->m_activePlayerData->SelfResSpells; - if (std::find(selfResSpells.begin(), selfResSpells.end(), selfRes.SpellID) == selfResSpells.end()) + if (_player->m_activePlayerData->SelfResSpells.FindIndex(selfRes.SpellID) < 0) return; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(selfRes.SpellID, _player->GetMap()->GetDifficultyID()); - if (spellInfo) - _player->CastSpell(_player, spellInfo, false, nullptr); - + _player->CastSpell(_player, selfRes.SpellID, _player->GetMap()->GetDifficultyID()); _player->RemoveSelfResSpell(selfRes.SpellID); } diff --git a/src/server/game/Handlers/ToyHandler.cpp b/src/server/game/Handlers/ToyHandler.cpp index 42a0408b6e3..7f310325047 100644 --- a/src/server/game/Handlers/ToyHandler.cpp +++ b/src/server/game/Handlers/ToyHandler.cpp @@ -93,7 +93,7 @@ void WorldSession::HandleUseToy(WorldPackets::Toy::UseToy& packet) spell->m_misc.Raw.Data[0] = packet.Cast.Misc[0]; spell->m_misc.Raw.Data[1] = packet.Cast.Misc[1]; spell->m_castFlagsEx |= CAST_FLAG_EX_USE_TOY_SPELL; - spell->prepare(&targets); + spell->prepare(targets); } void WorldSession::HandleToyClearFanfare(WorldPackets::Toy::ToyClearFanfare& toyClearFanfare) diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index c53c68ce681..69791345e3f 100644 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -509,10 +509,10 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPackets::Trade::AcceptTrade& acc trader->ModifyMoney(my_trade->GetMoney()); if (my_spell) - my_spell->prepare(&my_targets); + my_spell->prepare(my_targets); if (his_spell) - his_spell->prepare(&his_targets); + his_spell->prepare(his_targets); // cleanup clearAcceptTradeMode(my_trade, his_trade); diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index ec87dc3eb3e..7c9944a1929 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -591,4 +591,52 @@ enum AuraObjectType DYNOBJ_AURA_TYPE }; +// high byte (3 from 0..3) of UNIT_FIELD_BYTES_2 +enum ShapeshiftForm +{ + FORM_NONE = 0, + FORM_CAT_FORM = 1, + FORM_TREE_OF_LIFE = 2, + FORM_TRAVEL_FORM = 3, + FORM_AQUATIC_FORM = 4, + FORM_BEAR_FORM = 5, + FORM_AMBIENT = 6, + FORM_GHOUL = 7, + FORM_DIRE_BEAR_FORM = 8, + FORM_CRANE_STANCE = 9, + FORM_THARONJA_SKELETON = 10, + FORM_DARKMOON_TEST_OF_STRENGTH = 11, + FORM_BLB_PLAYER = 12, + FORM_SHADOW_DANCE = 13, + FORM_CREATURE_BEAR = 14, + FORM_CREATURE_CAT = 15, + FORM_GHOST_WOLF = 16, + FORM_BATTLE_STANCE = 17, + FORM_DEFENSIVE_STANCE = 18, + FORM_BERSERKER_STANCE = 19, + FORM_SERPENT_STANCE = 20, + FORM_ZOMBIE = 21, + FORM_METAMORPHOSIS = 22, + FORM_OX_STANCE = 23, + FORM_TIGER_STANCE = 24, + FORM_UNDEAD = 25, + FORM_FRENZY = 26, + FORM_FLIGHT_FORM_EPIC = 27, + FORM_SHADOWFORM = 28, + FORM_FLIGHT_FORM = 29, + FORM_STEALTH = 30, + FORM_MOONKIN_FORM = 31, + FORM_SPIRIT_OF_REDEMPTION = 32, + FORM_GLADIATOR_STANCE = 33, + FORM_METAMORPHOSIS_2 = 34, + FORM_MOONKIN_FORM_RESTORATION = 35, + FORM_TREANT_FORM = 36, + FORM_SPIRIT_OWL_FORM = 37, + FORM_SPIRIT_OWL_FORM_2 = 38, + FORM_WISP_FORM = 39, + FORM_WISP_FORM_2 = 40, + FORM_SOULSHAPE = 41, + FORM_FORGEBORNE_REVERIES = 42 +}; + #endif diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 515badef5aa..cf5ed8a765d 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -1234,16 +1234,16 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const if (apply) { if (spellId) - target->CastSpell(target, spellId, true, nullptr, this); + target->CastSpell(target, spellId, this); if (spellId2) - target->CastSpell(target, spellId2, true, nullptr, this); + target->CastSpell(target, spellId2, this); if (spellId3) - target->CastSpell(target, spellId3, true, nullptr, this); + target->CastSpell(target, spellId3, this); if (spellId4) - target->CastSpell(target, spellId4, true, nullptr, this); + target->CastSpell(target, spellId4, this); if (target->GetTypeId() == TYPEID_PLAYER) { @@ -1267,7 +1267,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const continue; if (spellInfo->Stances & (UI64LIT(1) << (GetMiscValue() - 1))) - target->CastSpell(target, itr->first, true, nullptr, this); + target->CastSpell(target, itr->first, this); } } } @@ -1703,12 +1703,12 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo case FORM_BEAR_FORM: case FORM_CAT_FORM: if (AuraEffect* dummy = target->GetAuraEffect(37315, 0)) - target->CastSpell(target, 37316, true, nullptr, dummy); + target->CastSpell(target, 37316, dummy); break; // Nordrassil Regalia - bonus case FORM_MOONKIN_FORM: if (AuraEffect* dummy = target->GetAuraEffect(37324, 0)) - target->CastSpell(target, 37325, true, nullptr, dummy); + target->CastSpell(target, 37325, dummy); break; default: break; @@ -4382,7 +4382,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool case 13139: // net-o-matic // root to self part of (root_target->charge->root_self sequence if (caster) - caster->CastSpell(caster, 13138, true, nullptr, this); + caster->CastSpell(caster, 13138, this); break; case 34026: // kill command { @@ -4390,7 +4390,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool if (!pet) break; - target->CastSpell(target, 34027, true, nullptr, this); + target->CastSpell(target, 34027, this); // set 3 stacks and 3 charges (to make all auras not disappear at once) Aura* owner_aura = target->GetAura(34027, GetCasterGUID()); @@ -4411,15 +4411,15 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool if (caster) { if (caster->getGender() == GENDER_FEMALE) - caster->CastSpell(target, 37095, true, nullptr, this); // Blood Elf Disguise + caster->CastSpell(target, 37095, this); // Blood Elf Disguise else - caster->CastSpell(target, 37093, true, nullptr, this); + caster->CastSpell(target, 37093, this); } break; } case 39850: // Rocket Blast if (roll_chance_i(20)) // backfire stun - target->CastSpell(target, 51581, true, nullptr, this); + target->CastSpell(target, 51581, this); break; case 43873: // Headless Horseman Laugh target->PlayDistanceSound(11965); @@ -4428,9 +4428,9 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool if (caster) { if (caster->getGender() == GENDER_FEMALE) - caster->CastSpell(target, 46356, true, nullptr, this); + caster->CastSpell(target, 46356, this); else - caster->CastSpell(target, 46355, true, nullptr, this); + caster->CastSpell(target, 46355, this); } break; case 46361: // Reinforced Net @@ -4468,7 +4468,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool } if (finalSpelId) - caster->CastSpell(target, finalSpelId, true, nullptr, this); + caster->CastSpell(target, finalSpelId, this); } switch (m_spellInfo->SpellFamilyName) @@ -4488,7 +4488,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool break; case 36730: // Flame Strike { - target->CastSpell(target, 36731, true, nullptr, this); + target->CastSpell(target, 36731, this); break; } case 44191: // Flame Strike @@ -4497,7 +4497,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool { uint32 spellId = target->GetMap()->IsHeroic() ? 46163 : 44190; - target->CastSpell(target, spellId, true, nullptr, this); + target->CastSpell(target, spellId, this); } break; } @@ -4511,14 +4511,14 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool break; } case 42783: // Wrath of the Astromancer - target->CastSpell(target, GetAmount(), true, nullptr, this); + target->CastSpell(target, GetAmount(), this); break; case 46308: // Burning Winds cast only at creatures at spawn - target->CastSpell(target, 47287, true, nullptr, this); + target->CastSpell(target, 47287, this); break; case 52172: // Coyote Spirit Despawn Aura case 60244: // Blood Parrot Despawn Aura - target->CastSpell(nullptr, GetAmount(), true, nullptr, this); + target->CastSpell(nullptr, GetAmount(), this); break; case 91604: // Restricted Flight Area if (aurApp->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) @@ -4558,9 +4558,13 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool if (apply && caster) { SpellInfo const* spell = sSpellMgr->AssertSpellInfo(spellId, GetBase()->GetCastDifficulty()); + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.OriginalCaster = GetCasterGUID(); + args.CastDifficulty = spell->Difficulty; for (uint32 i = 0; i < spell->StackAmount; ++i) - caster->CastSpell(target, spell, true, nullptr, nullptr, GetCasterGUID()); + caster->CastSpell(target, spell->Id, args); break; } target->RemoveAurasDueToSpell(spellId); @@ -4573,8 +4577,13 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool if (apply && caster) { SpellInfo const* spell = sSpellMgr->AssertSpellInfo(spellId, GetBase()->GetCastDifficulty()); + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.OriginalCaster = GetCasterGUID(); + args.CastDifficulty = spell->Difficulty; + for (uint32 i = 0; i < spell->StackAmount; ++i) - caster->CastSpell(target, spell, true, nullptr, nullptr, GetCasterGUID()); + caster->CastSpell(target, spell->Id, args); break; } target->RemoveAurasDueToSpell(spellId); @@ -4860,11 +4869,13 @@ void AuraEffect::HandleAuraLinked(AuraApplication const* aurApp, uint8 mode, boo { if (apply) { - // If amount avalible cast with basepoints (Crypt Fever for example) - if (GetAmount()) - caster->CastCustomSpell(target, triggeredSpellId, &m_amount, nullptr, nullptr, true, nullptr, this); - else - caster->CastSpell(target, triggeredSpellId, true, nullptr, this); + + CastSpellExtraArgs args(this); + + if (GetAmount()) // If amount avalible cast with basepoints (Crypt Fever for example) + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT0, GetAmount()); + + caster->CastSpell(target, triggeredSpellId, args); } else { @@ -5081,12 +5092,12 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster) { if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? caster : target) { - triggerCaster->CastSpell(target, triggeredSpellInfo, true, nullptr, this); + triggerCaster->CastSpell(target, triggerSpellId, this); TC_LOG_DEBUG("spells", "AuraEffect::HandlePeriodicTriggerSpellAuraTick: Spell %u Trigger %u", GetId(), triggeredSpellInfo->Id); } } else - TC_LOG_DEBUG("spells", "AuraEffect::HandlePeriodicTriggerSpellAuraTick: Spell %u has non-existent spell %u in EffectTriggered[%d] and is therefor not triggered.", GetId(), triggerSpellId, GetEffIndex()); + TC_LOG_WARN("spells", "AuraEffect::HandlePeriodicTriggerSpellAuraTick: Spell %u has non-existent spell %u in EffectTriggered[%d] and is therefore not triggered.", GetId(), triggerSpellId, GetEffIndex()); } void AuraEffect::HandlePeriodicTriggerSpellWithValueAuraTick(Unit* target, Unit* caster) const @@ -5096,13 +5107,15 @@ void AuraEffect::HandlePeriodicTriggerSpellWithValueAuraTick(Unit* target, Unit* { if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? caster : target) { - int32 basepoints = GetAmount(); - triggerCaster->CastCustomSpell(target, triggerSpellId, &basepoints, &basepoints, &basepoints, true, nullptr, this); + CastSpellExtraArgs args(this); + for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) + args.SpellValueOverrides.AddMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), GetAmount()); + triggerCaster->CastSpell(target, triggerSpellId, args); TC_LOG_DEBUG("spells", "AuraEffect::HandlePeriodicTriggerSpellWithValueAuraTick: Spell %u Trigger %u", GetId(), triggeredSpellInfo->Id); } } else - TC_LOG_DEBUG("spells","AuraEffect::HandlePeriodicTriggerSpellWithValueAuraTick: Spell %u has non-existent spell %u in EffectTriggered[%d] and is therefor not triggered.", GetId(), triggerSpellId, GetEffIndex()); + TC_LOG_WARN("spells","AuraEffect::HandlePeriodicTriggerSpellWithValueAuraTick: Spell %u has non-existent spell %u in EffectTriggered[%d] and is therefore not triggered.", GetId(), triggerSpellId, GetEffIndex()); } void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const @@ -5152,7 +5165,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_WARLOCK && (GetSpellInfo()->SpellFamilyFlags[0] & 0x00004000)) { if (caster->GetTypeId() == TYPEID_PLAYER && caster->ToPlayer()->isHonorOrXPTarget(target)) - caster->CastSpell(caster, 95810, true, nullptr, this); + caster->CastSpell(caster, 95810, this); } if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_GENERIC) { @@ -5515,7 +5528,10 @@ void AuraEffect::HandlePeriodicManaLeechAuraTick(Unit* target, Unit* caster) con if (manaFeedVal > 0) { int32 feedAmount = CalculatePct(gainedAmount, manaFeedVal); - caster->CastCustomSpell(caster, 32554, &feedAmount, nullptr, nullptr, true, nullptr, this); + + CastSpellExtraArgs args(this); + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT0, feedAmount); + caster->CastSpell(caster, 32554, args); } } @@ -5654,7 +5670,7 @@ void AuraEffect::HandleProcTriggerSpellAuraProc(AuraApplication* aurApp, ProcEve if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId, GetBase()->GetCastDifficulty())) { TC_LOG_DEBUG("spells", "AuraEffect::HandleProcTriggerSpellAuraProc: Triggering spell %u from aura %u proc", triggeredSpellInfo->Id, GetId()); - triggerCaster->CastSpell(triggerTarget, triggeredSpellInfo, true, nullptr, this); + triggerCaster->CastSpell(triggerTarget, triggeredSpellInfo->Id, this); } else if (triggerSpellId && GetAuraType() != SPELL_AURA_DUMMY) TC_LOG_ERROR("spells","AuraEffect::HandleProcTriggerSpellAuraProc: Could not trigger spell %u from aura %u proc, because the spell does not have an entry in Spell.dbc.", triggerSpellId, GetId()); @@ -5668,9 +5684,10 @@ void AuraEffect::HandleProcTriggerSpellWithValueAuraProc(AuraApplication* aurApp uint32 triggerSpellId = GetSpellEffectInfo()->TriggerSpell; if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId, GetBase()->GetCastDifficulty())) { - int32 basepoints0 = GetAmount(); - TC_LOG_DEBUG("spells", "AuraEffect::HandleProcTriggerSpellWithValueAuraProc: Triggering spell %u with value %d from aura %u proc", triggeredSpellInfo->Id, basepoints0, GetId()); - triggerCaster->CastCustomSpell(triggerTarget, triggerSpellId, &basepoints0, nullptr, nullptr, true, nullptr, this); + CastSpellExtraArgs args(this); + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT0, GetAmount()); + triggerCaster->CastSpell(triggerTarget, triggerSpellId, args); + TC_LOG_DEBUG("spells", "AuraEffect::HandleProcTriggerSpellWithValueAuraProc: Triggering spell %u with value %d from aura %u proc", triggeredSpellInfo->Id, GetAmount(), GetId()); } else TC_LOG_ERROR("spells","AuraEffect::HandleProcTriggerSpellWithValueAuraProc: Could not trigger spell %u from aura %u proc, because the spell does not have an entry in Spell.dbc.", triggerSpellId, GetId()); @@ -5853,7 +5870,13 @@ void AuraEffect::HandleLinkedSummon(AuraApplication const* aurApp, uint8 mode, b // on apply cast summon spell if (apply) - target->CastSpell(target, triggerSpellInfo, true, nullptr, this); + { + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.TriggeringAura = this; + args.CastDifficulty = triggerSpellInfo->Difficulty; + target->CastSpell(target, triggerSpellInfo->Id, args); + } // on unapply we need to search for and remove the summoned creature else { diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index dfe0ef6276a..8f9d716a304 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -1249,7 +1249,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b if (*itr < 0) target->RemoveAurasDueToSpell(-(*itr)); else if (removeMode != AURA_REMOVE_BY_DEATH) - target->CastSpell(target, *itr, true, nullptr, nullptr, GetCasterGUID()); + target->CastSpell(target, *itr, GetCasterGUID()); } } if (std::vector<int32> const* spellTriggered = sSpellMgr->GetSpellLinked(GetId() + SPELL_LINK_AURA)) @@ -1311,8 +1311,9 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b // Druid T8 Restoration 4P Bonus if (caster->HasAura(64760)) { - int32 heal = GetEffect(EFFECT_0)->GetAmount(); - caster->CastCustomSpell(target, 64801, &heal, nullptr, nullptr, true, nullptr, GetEffect(EFFECT_0)); + CastSpellExtraArgs args(GetEffect(EFFECT_0)); + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT0, GetEffect(EFFECT_0)->GetAmount()); + caster->CastSpell(target, 64801, args); } } break; @@ -1329,7 +1330,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b case 66: // Invisibility if (removeMode != AURA_REMOVE_BY_EXPIRE) break; - target->CastSpell(target, 32612, true, nullptr, GetEffect(1)); + target->CastSpell(target, 32612, GetEffect(1)); target->CombatStop(); break; default: @@ -1363,8 +1364,9 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b if (AuraEffect const* aurEff = aura->GetEffect(0)) { float multiplier = float(aurEff->GetAmount()); - int32 basepoints0 = int32(CalculatePct(caster->GetMaxPower(POWER_MANA), multiplier)); - caster->CastCustomSpell(caster, 47755, &basepoints0, nullptr, nullptr, true); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddBP0(CalculatePct(caster->GetMaxPower(POWER_MANA), multiplier)); + caster->CastSpell(caster, 47755, args); } } } @@ -1391,7 +1393,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b if (owner->HasAura(34692)) { if (apply) - owner->CastSpell(owner, 34471, true, nullptr, GetEffect(0)); + owner->CastSpell(owner, 34471, GetEffect(0)); else owner->RemoveAurasDueToSpell(34471); } diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 0e897c3b109..25e0e56bdf5 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2767,7 +2767,7 @@ void Spell::DoTriggersOnSpellHit(Unit* unit, uint32 effMask) { if (CanExecuteTriggersOnHit(effMask, i->triggeredByAura) && roll_chance_i(i->chance)) { - m_caster->CastSpell(unit, i->triggeredSpell, TRIGGERED_FULL_MASK); + m_caster->CastSpell(unit, i->triggeredSpell->Id, CastSpellExtraArgs(TRIGGERED_FULL_MASK).SetCastDifficulty(i->triggeredSpell->Difficulty)); TC_LOG_DEBUG("spells", "Spell %d triggered spell %d by SPELL_AURA_ADD_TARGET_TRIGGER aura", m_spellInfo->Id, i->triggeredSpell->Id); // SPELL_AURA_ADD_TARGET_TRIGGER auras shouldn't trigger auras without duration @@ -2798,7 +2798,7 @@ void Spell::DoTriggersOnSpellHit(Unit* unit, uint32 effMask) if (*i < 0) unit->RemoveAurasDueToSpell(-(*i)); else - unit->CastSpell(unit, *i, true, nullptr, nullptr, m_caster->GetGUID()); + unit->CastSpell(unit, *i, m_caster->GetGUID()); } } } @@ -2916,7 +2916,7 @@ bool Spell::UpdateChanneledTargetList() return channelTargetEffectMask == 0; } -void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggeredByAura) +void Spell::prepare(SpellCastTargets const& targets, AuraEffect const* triggeredByAura) { if (m_CastItem) { @@ -2935,7 +2935,7 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered } } - InitExplicitTargets(*targets); + InitExplicitTargets(targets); m_spellState = SPELL_STATE_PREPARING; @@ -5597,7 +5597,7 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint { if (strict) //starting cast, trigger pet stun (cast by pet so it doesn't attack player) if (Pet* pet = m_caster->ToPlayer()->GetPet()) - pet->CastSpell(pet, 32752, true, nullptr, nullptr, pet->GetGUID()); + pet->CastSpell(pet, 32752, pet->GetGUID()); } else if (!m_spellInfo->HasAttribute(SPELL_ATTR1_DISMISS_PET)) return SPELL_FAILED_ALREADY_HAVE_SUMMON; diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 811a3c55159..8253062a290 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -522,7 +522,7 @@ class TC_GAME_API Spell GameObject* SearchSpellFocus(); - void prepare(SpellCastTargets const* targets, AuraEffect const* triggeredByAura = nullptr); + void prepare(SpellCastTargets const& targets, AuraEffect const* triggeredByAura = nullptr); void cancel(); void update(uint32 difftime); void cast(bool skipCheck = false); 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; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index d39479ccd5a..d7cfda76147 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -714,17 +714,14 @@ void Spell::EffectTriggerSpell(SpellEffIndex /*effIndex*/) targets.SetUnitTarget(m_caster); } - CustomSpellValues values; + CastSpellExtraArgs args(m_originalCasterGUID); // set basepoints for trigger with value effect if (effectInfo->Effect == SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE) - { - values.AddSpellMod(SPELLVALUE_BASE_POINT0, damage); - values.AddSpellMod(SPELLVALUE_BASE_POINT1, damage); - values.AddSpellMod(SPELLVALUE_BASE_POINT2, damage); - } + for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) + args.SpellValueOverrides.AddMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), damage); // original caster guid only for GO cast - m_caster->CastSpell(targets, spellInfo, &values, TRIGGERED_FULL_MASK, nullptr, nullptr, m_originalCasterGUID); + m_caster->CastSpell(targets, spellInfo->Id, args); } void Spell::EffectTriggerMissileSpell(SpellEffIndex /*effIndex*/) @@ -761,18 +758,14 @@ void Spell::EffectTriggerMissileSpell(SpellEffIndex /*effIndex*/) targets.SetUnitTarget(m_caster); } - CustomSpellValues values; + CastSpellExtraArgs args(m_originalCasterGUID); // set basepoints for trigger with value effect if (effectInfo->Effect == SPELL_EFFECT_TRIGGER_MISSILE_SPELL_WITH_VALUE) - { - // maybe need to set value only when basepoints == 0? - values.AddSpellMod(SPELLVALUE_BASE_POINT0, damage); - values.AddSpellMod(SPELLVALUE_BASE_POINT1, damage); - values.AddSpellMod(SPELLVALUE_BASE_POINT2, damage); - } + for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) + args.SpellValueOverrides.AddMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), damage); // original caster guid only for GO cast - m_caster->CastSpell(targets, spellInfo, &values, TRIGGERED_FULL_MASK, nullptr, nullptr, m_originalCasterGUID); + m_caster->CastSpell(targets, spellInfo->Id, args); } void Spell::EffectForceCast(SpellEffIndex /*effIndex*/) @@ -804,32 +797,28 @@ void Spell::EffectForceCast(SpellEffIndex /*effIndex*/) break; case 52463: // Hide In Mine Car case 52349: // Overtake - unitTarget->CastCustomSpell(unitTarget, spellInfo->Id, &damage, nullptr, nullptr, true, nullptr, nullptr, m_originalCasterGUID); + { + CastSpellExtraArgs args(m_originalCasterGUID); + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT0, damage); + unitTarget->CastSpell(unitTarget, spellInfo->Id, args); return; + } } } switch (spellInfo->Id) { case 72298: // Malleable Goo Summon - unitTarget->CastSpell(unitTarget, spellInfo->Id, true, nullptr, nullptr, m_originalCasterGUID); + unitTarget->CastSpell(unitTarget, spellInfo->Id, m_originalCasterGUID); return; } - CustomSpellValues values; - // set basepoints for trigger with value effect + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); if (effectInfo->Effect == SPELL_EFFECT_FORCE_CAST_WITH_VALUE) - { - // maybe need to set value only when basepoints == 0? - values.AddSpellMod(SPELLVALUE_BASE_POINT0, damage); - values.AddSpellMod(SPELLVALUE_BASE_POINT1, damage); - values.AddSpellMod(SPELLVALUE_BASE_POINT2, damage); - } - - SpellCastTargets targets; - targets.SetUnitTarget(m_caster); + for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) + args.SpellValueOverrides.AddMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), damage); - unitTarget->CastSpell(targets, spellInfo, &values, TRIGGERED_FULL_MASK); + unitTarget->CastSpell(m_caster, spellInfo->Id, args); } void Spell::EffectTriggerRitualOfSummoning(SpellEffIndex /*effIndex*/) @@ -848,7 +837,7 @@ void Spell::EffectTriggerRitualOfSummoning(SpellEffIndex /*effIndex*/) finish(); - m_caster->CastSpell(nullptr, spellInfo, false); + m_caster->CastSpell(nullptr, spellInfo->Id, false); } void Spell::EffectJump(SpellEffIndex /*effIndex*/) @@ -2048,11 +2037,13 @@ void Spell::EffectSummonType(SpellEffIndex effIndex) spellId = spellInfo->Id; } + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + // if we have small value, it indicates seat position if (basePoints > 0 && basePoints < MAX_VEHICLE_SEATS) - m_originalCaster->CastCustomSpell(spellId, SPELLVALUE_BASE_POINT0, basePoints, summon, true); - else - m_originalCaster->CastSpell(summon, spellId, true); + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT0, basePoints); + + m_originalCaster->CastSpell(summon, spellId, args); uint32 faction = properties->Faction; if (!faction) @@ -2809,7 +2800,7 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex) // Skyshatter Harness item set bonus // Stormstrike if (AuraEffect* aurEff = m_caster->IsScriptOverriden(m_spellInfo, 5634)) - m_caster->CastSpell(m_caster, 38430, true, nullptr, aurEff); + m_caster->CastSpell(m_caster, 38430, aurEff); break; } case SPELLFAMILY_DRUID: @@ -3076,7 +3067,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) uint32 spell_id = roll_chance_i(20) ? 8854 : 8855; - m_caster->CastSpell(m_caster, spell_id, true, nullptr); + m_caster->CastSpell(m_caster, spell_id, true); return; } // Brittle Armor - need remove one 24575 Brittle Armor aura @@ -3281,7 +3272,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) for (uint8 i = 0; i < 15; ++i) { m_caster->GetRandomPoint(*destTarget, radius, x, y, z); - m_caster->CastSpell(x, y, z, 54522, true); + m_caster->CastSpell({x, y, z}, 54522, true); } break; } @@ -3386,7 +3377,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) // proc a spellcast if (Aura* chargesAura = m_caster->GetAura(59907)) { - m_caster->CastSpell(unitTarget, spell_heal, true, nullptr, nullptr, m_caster->ToTempSummon()->GetSummonerGUID()); + m_caster->CastSpell(unitTarget, spell_heal, m_caster->ToTempSummon()->GetSummonerGUID()); if (chargesAura->ModCharges(-1)) m_caster->ToTempSummon()->UnSummon(); } @@ -3405,7 +3396,6 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) case 58590: // Rank 9 case 58591: // Rank 10 { - int32 basepoints0 = damage; // Cast Absorb on totems for (uint8 slot = SUMMON_SLOT_TOTEM; slot < MAX_TOTEM_SLOT; ++slot) { @@ -3415,7 +3405,9 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) Creature* totem = unitTarget->GetMap()->GetCreature(unitTarget->m_SummonSlot[slot]); if (totem && totem->IsTotem()) { - m_caster->CastCustomSpell(totem, 55277, &basepoints0, nullptr, nullptr, true); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT0, damage); + m_caster->CastSpell(totem, 55277, args); } } break; @@ -3808,7 +3800,9 @@ void Spell::EffectFeedPet(SpellEffIndex effIndex) player->DestroyItemCount(foodItem, count, true); /// @todo fix crash when a spell has two effects, both pointed at the same item target - m_caster->CastCustomSpell(pet, effectInfo->TriggerSpell, &benefit, nullptr, nullptr, true); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT0, benefit); + m_caster->CastSpell(pet, effectInfo->TriggerSpell, args); } void Spell::EffectDismissPet(SpellEffIndex effIndex) @@ -4172,7 +4166,7 @@ void Spell::EffectCharge(SpellEffIndex /*effIndex*/) m_caster->Attack(unitTarget, true); if (effectInfo->TriggerSpell) - m_caster->CastSpell(unitTarget, effectInfo->TriggerSpell, true, nullptr, nullptr, m_originalCasterGUID); + m_caster->CastSpell(unitTarget, effectInfo->TriggerSpell, m_originalCasterGUID); } } @@ -4197,7 +4191,7 @@ void Spell::EffectChargeDest(SpellEffIndex /*effIndex*/) else if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT) { if (effectInfo->TriggerSpell) - m_caster->CastSpell(destTarget->GetPositionX(), destTarget->GetPositionY(), destTarget->GetPositionZ(), effectInfo->TriggerSpell, true, nullptr, nullptr, m_originalCasterGUID); + m_caster->CastSpell(*destTarget, effectInfo->TriggerSpell, m_originalCasterGUID); } } @@ -4485,7 +4479,11 @@ void Spell::EffectDestroyAllTotems(SpellEffIndex /*effIndex*/) ApplyPct(mana, damage); if (mana) - m_caster->CastCustomSpell(m_caster, 39104, &mana, nullptr, nullptr, true); + { + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT0, mana); + m_caster->CastSpell(m_caster, 39104, args); + } } void Spell::EffectDurabilityDamage(SpellEffIndex effIndex) @@ -5276,8 +5274,10 @@ void Spell::EffectCastButtons(SpellEffIndex /*effIndex*/) if (!spellInfo->HasAttribute(SPELL_ATTR9_SUMMON_PLAYER_TOTEM)) continue; - TriggerCastFlags triggerFlags = TriggerCastFlags(TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_CAST_DIRECTLY | TRIGGERED_DONT_REPORT_CAST_ERROR); - m_caster->CastSpell(m_caster, spellInfo, triggerFlags); + CastSpellExtraArgs args; + args.TriggerFlags = TriggerCastFlags(TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_CAST_DIRECTLY | TRIGGERED_DONT_REPORT_CAST_ERROR); + args.CastDifficulty = GetCastDifficulty(); + m_caster->CastSpell(m_caster, spellInfo->Id, args); } } diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 206e5a35cac..76b7aa34161 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3455,14 +3455,16 @@ void SpellMgr::LoadSpellInfoCorrections() 52438, // Summon Skittering Swarmer (Force Cast) 52449, // Summon Skittering Infector (Force Cast) 53609, // Summon Anub'ar Assassin (Force Cast) - 53457 // Summon Impale Trigger (AoE) + 53457, // Summon Impale Trigger (AoE) + 45907 // Torch Target Picker }, [](SpellInfo* spellInfo) { spellInfo->MaxAffectedTargets = 1; }); - // Skartax Purple Beam - ApplySpellFix({ 36384 }, [](SpellInfo* spellInfo) + ApplySpellFix({ + 36384 // Skartax Purple Beam + }, [](SpellInfo* spellInfo) { spellInfo->MaxAffectedTargets = 2; }); diff --git a/src/server/scripts/Argus/AntorusTheBurningThrone/boss_garothi_worldbreaker.cpp b/src/server/scripts/Argus/AntorusTheBurningThrone/boss_garothi_worldbreaker.cpp index 4e411bab59f..43047b45a87 100644 --- a/src/server/scripts/Argus/AntorusTheBurningThrone/boss_garothi_worldbreaker.cpp +++ b/src/server/scripts/Argus/AntorusTheBurningThrone/boss_garothi_worldbreaker.cpp @@ -526,7 +526,7 @@ class spell_garothi_apocalypse_drive : public AuraScript void HandlePeriodic(AuraEffect const* aurEff) { - GetTarget()->CastSpell(GetTarget(), SPELL_APOCALYPSE_DRIVE_PERIODIC_DAMAGE, true, nullptr, aurEff); + GetTarget()->CastSpell(GetTarget(), SPELL_APOCALYPSE_DRIVE_PERIODIC_DAMAGE, aurEff); } void Register() override @@ -630,7 +630,7 @@ class spell_garothi_searing_barrage_dummy : public SpellScript void HandleHit(SpellEffIndex /*effIndex*/) { - GetHitUnit()->CastCustomSpell(SPELL_SEARING_BARRAGE_SELECTOR, SPELLVALUE_BASE_POINT0, GetSpellInfo()->Id, GetHitUnit(), true); + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_SEARING_BARRAGE_SELECTOR, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, GetSpellInfo()->Id)); } void Register() override @@ -870,7 +870,7 @@ class spell_garothi_cannon_chooser : public SpellScript float x = AnnihilationCenterReferencePos.GetPositionX() + cos(frand(0.0f, float(M_PI * 2))) * frand(15.0f, 30.0f); float y = AnnihilationCenterReferencePos.GetPositionY() + sin(frand(0.0f, float(M_PI * 2))) * frand(15.0f, 30.0f); float z = caster->GetMap()->GetHeight(caster->GetPhaseShift(), x, y, AnnihilationCenterReferencePos.GetPositionZ()); - annihilator->CastSpell(x, y, z, SPELL_ANNIHILATION_SUMMON, true); + annihilator->CastSpell({ x, y, z }, SPELL_ANNIHILATION_SUMMON, true); } annihilator->CastSpell(annihilator, SPELL_ANNIHILATION_DUMMY); diff --git a/src/server/scripts/Commands/cs_cast.cpp b/src/server/scripts/Commands/cs_cast.cpp index 4bdf4ffdb0f..e0f4708e945 100644 --- a/src/server/scripts/Commands/cs_cast.cpp +++ b/src/server/scripts/Commands/cs_cast.cpp @@ -171,8 +171,7 @@ public: TriggerCastFlags triggered = (triggeredStr != nullptr) ? TRIGGERED_FULL_DEBUG_MASK : TRIGGERED_NONE; float x, y, z; handler->GetSession()->GetPlayer()->GetClosePoint(x, y, z, dist); - - handler->GetSession()->GetPlayer()->CastSpell(x, y, z, spellId, triggered); + handler->GetSession()->GetPlayer()->CastSpell({ x, y, z }, spellId, triggered); return true; } @@ -274,7 +273,7 @@ public: } TriggerCastFlags triggered = (triggeredStr != nullptr) ? TRIGGERED_FULL_DEBUG_MASK : TRIGGERED_NONE; - caster->CastSpell(x, y, z, spellId, triggered); + caster->CastSpell({ x, y, z }, spellId, triggered); return true; } diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp index c3c61a3490c..eecfbb08573 100644 --- a/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp +++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp @@ -364,7 +364,7 @@ class spell_occuthar_occuthars_destruction : public SpellScriptLoader if (Unit* caster = GetCaster()) { if (IsExpired()) - caster->CastSpell(nullptr, SPELL_OCCUTHARS_DESTUCTION, true, nullptr, aurEff); + caster->CastSpell(nullptr, SPELL_OCCUTHARS_DESTUCTION, aurEff); caster->ToCreature()->DespawnOrUnsummon(500); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp index fffc3981f5a..d01fb7f55d5 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp @@ -259,9 +259,14 @@ struct boss_coren_direbrew : public BossAI SummonSister(NPC_URSULA_DIREBREW); break; case EVENT_SUMMON_MOLE_MACHINE: - me->CastCustomSpell(SPELL_MOLE_MACHINE_TARGET_PICKER, SPELLVALUE_MAX_TARGETS, 1, nullptr, true); + { + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.SpellValueOverrides.AddMod(SPELLVALUE_MAX_TARGETS, 1); + me->CastSpell(nullptr, SPELL_MOLE_MACHINE_TARGET_PICKER, args); events.Repeat(Seconds(15)); break; + } case EVENT_DIREBREW_DISARM: DoCastSelf(SPELL_DIREBREW_DISARM_PRE_CAST, true); events.Repeat(Seconds(20)); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp index 52fe779f4c1..108fdeb605b 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp @@ -135,8 +135,12 @@ class spell_baron_geddon_inferno : public SpellScriptLoader void OnPeriodic(AuraEffect const* aurEff) { PreventDefaultAction(); - int32 damageForTick[8] = { 500, 500, 1000, 1000, 2000, 2000, 3000, 5000 }; - GetTarget()->CastCustomSpell(SPELL_INFERNO_DMG, SPELLVALUE_BASE_POINT0, damageForTick[aurEff->GetTickNumber() - 1], nullptr, TRIGGERED_FULL_MASK, nullptr, aurEff); + int32 const damageForTick[8] = { 500, 500, 1000, 1000, 2000, 2000, 3000, 5000 }; + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.TriggeringAura = aurEff; + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT0, damageForTick[aurEff->GetTickNumber() - 1]); + GetTarget()->CastSpell(nullptr, SPELL_INFERNO_DMG, args); } void Register() override diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp index c1feefc773c..5419d8c4c16 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp @@ -339,7 +339,10 @@ public: enfeeble_targets[i] = target->GetGUID(); enfeeble_health[i] = target->GetHealth(); - target->CastSpell(target, SPELL_ENFEEBLE, true, nullptr, nullptr, me->GetGUID()); + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.OriginalCaster = me->GetGUID(); + target->CastSpell(target, SPELL_ENFEEBLE, args); target->SetHealth(1); } } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp index a9eaa863f46..ce4bfdce6dd 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp @@ -479,7 +479,7 @@ public: Unit* unit = ObjectAccessor::GetUnit(*me, FlameWreathTarget[i]); if (unit && !unit->IsWithinDist2d(FWTargPosX[i], FWTargPosY[i], 3)) { - unit->CastSpell(unit, 20476, true, nullptr, nullptr, me->GetGUID()); + unit->CastSpell(unit, 20476, me->GetGUID()); unit->CastSpell(unit, 11027, true); FlameWreathTarget[i].Clear(); } diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp index 7c1f428e6e5..4f7e025c984 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp @@ -235,8 +235,13 @@ public: { Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()); if (unit && (unit->GetTypeId() == TYPEID_PLAYER)) + { // Knockback into the air - unit->CastSpell(unit, SPELL_GRAVITY_LAPSE_DOT, true, nullptr, nullptr, me->GetGUID()); + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.OriginalCaster = me->GetGUID(); + unit->CastSpell(unit, SPELL_GRAVITY_LAPSE_DOT, args); + } } } @@ -250,7 +255,10 @@ public: if (unit && (unit->GetTypeId() == TYPEID_PLAYER)) { // Also needs an exception in spell system. - unit->CastSpell(unit, SPELL_GRAVITY_LAPSE_FLY, true, nullptr, nullptr, me->GetGUID()); + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.OriginalCaster = me->GetGUID(); + unit->CastSpell(unit, SPELL_GRAVITY_LAPSE_FLY, args); unit->SetCanFly(true); } } diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp index c1038bd7d08..117043615bb 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp @@ -121,7 +121,7 @@ class spell_hexlord_unstable_affliction : public SpellScriptLoader void HandleDispel(DispelInfo* dispelInfo) { if (Unit* caster = GetCaster()) - caster->CastSpell(dispelInfo->GetDispeller(), SPELL_WL_UNSTABLE_AFFL_DISPEL, true, nullptr, GetEffect(EFFECT_0)); + caster->CastSpell(dispelInfo->GetDispeller(), SPELL_WL_UNSTABLE_AFFL_DISPEL, GetEffect(EFFECT_0)); } void Register() override diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index bf70c9d7da7..67b1d379158 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -500,10 +500,12 @@ class spell_mandokir_bloodletting : public SpellScriptLoader if (!caster) return; - int32 damage = std::max<int32>(7500, target->CountPctFromCurHealth(aurEff->GetAmount())); + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.AddSpellMod(SPELLVALUE_BASE_POINT0, std::max<int32>(7500, target->CountPctFromCurHealth(aurEff->GetAmount()))); - caster->CastCustomSpell(target, SPELL_BLOODLETTING_DAMAGE, &damage, nullptr, nullptr, true); - target->CastCustomSpell(caster, SPELL_BLOODLETTING_HEAL, &damage, nullptr, nullptr, true); + caster->CastSpell(target, SPELL_BLOODLETTING_DAMAGE, args); + target->CastSpell(caster, SPELL_BLOODLETTING_HEAL, args); } void Register() override @@ -606,7 +608,7 @@ class spell_mandokir_devastating_slam : public SpellScriptLoader angle = float(rand_norm()) * static_cast<float>(M_PI * 35.0f / 180.0f) - static_cast<float>(M_PI * 17.5f / 180.0f); caster->GetClosePoint(x, y, z, 4.0f, frand(-2.5f, 50.0f), angle); - caster->CastSpell(x, y, z, SPELL_DEVASTATING_SLAM_DAMAGE, true); + caster->CastSpell({ x, y, z }, SPELL_DEVASTATING_SLAM_DAMAGE, true); } } } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp index 92866ee6db0..3843e0f8bfd 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp @@ -284,8 +284,10 @@ class spell_anetheron_vampiric_aura : public SpellScriptLoader if (!damageInfo || !damageInfo->GetDamage()) return; - int32 bp = damageInfo->GetDamage() * 3; - eventInfo.GetActor()->CastCustomSpell(SPELL_VAMPIRIC_AURA_HEAL, SPELLVALUE_BASE_POINT0, bp, eventInfo.GetActor(), true, nullptr, aurEff); + Unit* actor = eventInfo.GetActor(); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT0, damageInfo->GetDamage() * 3); + actor->CastSpell(actor, SPELL_VAMPIRIC_AURA_HEAL, args); } void Register() override diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp index 92e648bcadf..76ceb2ff034 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp @@ -472,8 +472,10 @@ public: DoomfireSpiritGUID = summoned->GetGUID(); break; case NPC_DOOMFIRE: + { summoned->CastSpell(summoned, SPELL_DOOMFIRE_SPAWN, false); - summoned->CastSpell(summoned, SPELL_DOOMFIRE, true, nullptr, nullptr, me->GetGUID()); + + summoned->CastSpell(summoned, SPELL_DOOMFIRE, me->GetGUID()); if (Unit* DoomfireSpirit = ObjectAccessor::GetUnit(*me, DoomfireSpiritGUID)) { @@ -481,6 +483,7 @@ public: DoomfireSpiritGUID.Clear(); } break; + } default: break; } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp index ea4adb80dee..1e85927b478 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp @@ -216,7 +216,7 @@ class spell_mark_of_kazrogal : public SpellScriptLoader if (target->GetPower(POWER_MANA) == 0) { - target->CastSpell(target, SPELL_MARK_DAMAGE, true, nullptr, aurEff); + target->CastSpell(target, SPELL_MARK_DAMAGE, aurEff); // Remove aura SetDuration(0); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp index cbcb5e81713..4139b6d64ac 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp @@ -1339,7 +1339,7 @@ public: { if (StrikeTimer <= diff) { - me->CastSpell(DummyTarget[0], DummyTarget[1], DummyTarget[2], SPELL_GARGOYLE_STRIKE, false); + me->CastSpell({ DummyTarget[0], DummyTarget[1], DummyTarget[2] }, SPELL_GARGOYLE_STRIKE, false); StrikeTimer = 2000 + rand32() % 1000; } else StrikeTimer -= diff; } @@ -1452,8 +1452,9 @@ public: EnterEvadeMode(); return; } - int dmg = 500 + rand32() % 700; - me->CastCustomSpell(me->GetVictim(), SPELL_EXPLODING_SHOT, &dmg, nullptr, nullptr, false); + CastSpellExtraArgs args; + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT0, 500 + rand32() % 700); + me->CastSpell(me->GetVictim(), SPELL_EXPLODING_SHOT, args); ExplodeTimer = 5000 + rand32() % 5000; } else ExplodeTimer -= diff; DoMeleeAttackIfReady(); diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp index fcede66412e..4afebefd140 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp @@ -385,9 +385,9 @@ public: { if (Unit* caster = GetCaster()) { - CustomSpellValues values; - values.AddSpellMod(SPELLVALUE_BASE_POINT0, aurEff->GetAmount()); - caster->CastCustomSpell(aurEff->GetSpellEffectInfo()->TriggerSpell, values, GetTarget()); + CastSpellExtraArgs args; + args.AddSpellMod(SPELLVALUE_BASE_POINT0, aurEff->GetAmount()); + caster->CastSpell(GetTarget(), aurEff->GetSpellEffectInfo()->TriggerSpell, args); } } diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp index 387fa0b1323..882c6c3eb6e 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp @@ -261,8 +261,9 @@ class spell_egg_explosion : public SpellScriptLoader { if (Unit* target = GetHitUnit()) { - int32 damage = std::max<int32>(0, -16 * GetCaster()->GetDistance(target) + 500); - GetCaster()->CastCustomSpell(SPELL_EXPLOSION_DAMAGE, SPELLVALUE_BASE_POINT0, damage, target, true); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.AddSpellBP0(std::max<int32>(0, -16 * GetCaster()->GetDistance(target) + 500)); + GetCaster()->CastSpell(target, SPELL_EXPLOSION_DAMAGE, args); } } diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp index 667e36d2d79..0062c33465c 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp @@ -757,7 +757,7 @@ public: //Set target in stomach Stomach_Map[target->GetGUID()] = true; target->InterruptNonMeleeSpells(false); - target->CastSpell(target, SPELL_MOUTH_TENTACLE, true, nullptr, nullptr, me->GetGUID()); + target->CastSpell(target, SPELL_MOUTH_TENTACLE, me->GetGUID()); StomachEnterTarget = target->GetGUID(); StomachEnterVisTimer = 3800; } diff --git a/src/server/scripts/Kalimdor/zone_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp index 45c1f0dda2d..dce9b789281 100644 --- a/src/server/scripts/Kalimdor/zone_silithus.cpp +++ b/src/server/scripts/Kalimdor/zone_silithus.cpp @@ -503,7 +503,7 @@ public: DoCast(player, SPELL_ARCANE_CHANNELING, true);//Arcane Channeling break; case 35: - me->CastSpell(-8088, 1520.43f, 2.67f, SPELL_TIME_STOP, true); + me->CastSpell({ -8088, 1520.43f, 2.67f }, SPELL_TIME_STOP, true); break; case 36: DoCast(player, SPELL_CALL_PRISMATIC_BARRIER, true); @@ -553,7 +553,7 @@ public: break; case 50: Fandral->AI()->Talk(FANDRAL_EMOTE_2); - Fandral->CastSpell(-8127, 1525, 17.5f, SPELL_THROW_HAMMER, true); + Fandral->CastSpell({ -8127, 1525, 17.5f }, SPELL_THROW_HAMMER, true); break; case 51: { @@ -1419,7 +1419,7 @@ class spell_silithus_summon_cultist_periodic : public AuraScript // All these spells trigger a spell that requires reagents; if the // triggered spell is cast as "triggered", reagents are not consumed if (Unit* caster = GetCaster()) - caster->CastSpell(nullptr, GetSpellInfo()->GetEffect(aurEff->GetEffIndex())->TriggerSpell, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST), nullptr, aurEff); + caster->CastSpell(nullptr, GetSpellInfo()->GetEffect(aurEff->GetEffIndex())->TriggerSpell, CastSpellExtraArgs(TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST)).SetTriggeringAura(aurEff)); } void Register() override 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 7b4cc3a1f63..d162024e595 100644 --- a/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp +++ b/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp @@ -697,8 +697,8 @@ public: return; target->ExitVehicle(); - DynamicObject* dynamicObject = GetCaster()->GetDynObject(SPELL_SEISMIC_SHARD_TARGETING); - target->CastSpell(dynamicObject->GetPositionX(), dynamicObject->GetPositionY(), dynamicObject->GetPositionZ(), SPELL_SEISMIC_SHARD_MISSLE, true); + if (DynamicObject* dynamicObject = GetCaster()->GetDynObject(SPELL_SEISMIC_SHARD_TARGETING)) + target->CastSpell(dynamicObject->GetPosition(), SPELL_SEISMIC_SHARD_MISSLE, true); } void Register() override diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp index b69f630aa3f..e7847bfe9a0 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp @@ -258,7 +258,12 @@ class spell_ahn_kahet_swarm : public SpellScriptLoader aura->RefreshDuration(); } else - GetCaster()->CastCustomSpell(SPELL_SWARM_BUFF, SPELLVALUE_AURA_STACK, _targetCount, GetCaster(), TRIGGERED_FULL_MASK); + { + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.SpellValueOverrides.AddMod(SPELLVALUE_AURA_STACK, _targetCount); + GetCaster()->CastSpell(GetCaster(), SPELL_SWARM_BUFF, args); + } } else GetCaster()->RemoveAurasDueToSpell(SPELL_SWARM_BUFF); diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 68b0f93a226..b691a6e0080 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -349,7 +349,7 @@ class boss_halion : public CreatureScript if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, true, -SPELL_TWILIGHT_REALM)) { _meteorStrikePos = target->GetPosition(); - me->CastSpell(_meteorStrikePos.GetPositionX(), _meteorStrikePos.GetPositionY(), _meteorStrikePos.GetPositionZ(), SPELL_METEOR_STRIKE, true, nullptr, nullptr, me->GetGUID()); + me->CastSpell(_meteorStrikePos, SPELL_METEOR_STRIKE, me->GetGUID()); Talk(SAY_METEOR_STRIKE); } events.ScheduleEvent(EVENT_METEOR_STRIKE, Seconds(38)); @@ -1246,11 +1246,15 @@ class npc_combustion_consumption : public CreatureScript if (type != DATA_STACKS_DISPELLED || !_damageSpell || !_explosionSpell || !summoner) return; - me->CastCustomSpell(SPELL_SCALE_AURA, SPELLVALUE_AURA_STACK, stackAmount + 1, me); + CastSpellExtraArgs args; + args.SpellValueOverrides.AddMod(SPELLVALUE_AURA_STACK, stackAmount + 1); + me->CastSpell(me, SPELL_SCALE_AURA, args); DoCastSelf(_damageSpell); int32 damage = 1200 + (stackAmount * 1290); // Needs more research. - summoner->CastCustomSpell(_explosionSpell, SPELLVALUE_BASE_POINT0, damage, summoner); + CastSpellExtraArgs args2; + args2.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT0, damage); + summoner->CastSpell(summoner, _explosionSpell, args2); } void UpdateAI(uint32 /*diff*/) override { } @@ -1515,7 +1519,10 @@ class spell_halion_combustion_consumption_periodic : public SpellScriptLoader uint32 triggerSpell = aurEff->GetSpellEffectInfo()->TriggerSpell; int32 radius = caster->GetObjectScale() * M_PI * 10000 / 3; - caster->CastCustomSpell(triggerSpell, SPELLVALUE_RADIUS_MOD, radius, nullptr, TRIGGERED_FULL_MASK, nullptr, aurEff, caster->GetGUID()); + CastSpellExtraArgs args(aurEff); + args.OriginalCaster = caster->GetGUID(); + args.SpellValueOverrides.AddMod(SPELLVALUE_RADIUS_MOD, radius); + caster->CastSpell(nullptr, triggerSpell, args); } void Register() override @@ -1567,7 +1574,9 @@ class spell_halion_marks : public SpellScriptLoader return; // Stacks marker - GetTarget()->CastCustomSpell(_summonSpellId, SPELLVALUE_BASE_POINT1, aurEff->GetBase()->GetStackAmount(), GetTarget(), TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); + CastSpellExtraArgs args(GetCasterGUID()); + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT1, aurEff->GetBase()->GetStackAmount()); + GetTarget()->CastSpell(GetTarget(), _summonSpellId, args); } void Register() override @@ -1792,7 +1801,7 @@ class spell_halion_twilight_phasing : public SpellScriptLoader void Phase() { Unit* caster = GetCaster(); - caster->CastSpell(caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ(), SPELL_SUMMON_TWILIGHT_PORTAL, true); + caster->CastSpell(caster->GetPosition(), SPELL_SUMMON_TWILIGHT_PORTAL, true); caster->GetMap()->SummonCreature(NPC_TWILIGHT_HALION, HalionSpawnPos); } diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp index 0a33d804083..abf508a0cc8 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp @@ -196,7 +196,11 @@ class spell_ruby_sanctum_rallying_shout : public SpellScriptLoader void HandleDummy(SpellEffIndex /*effIndex*/) { if (_targetCount && !GetCaster()->HasAura(SPELL_RALLY)) - GetCaster()->CastCustomSpell(SPELL_RALLY, SPELLVALUE_AURA_STACK, _targetCount, GetCaster(), TRIGGERED_FULL_MASK); + { + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddMod(SPELLVALUE_AURA_STACK, _targetCount); + GetCaster()->CastSpell(GetCaster(), SPELL_RALLY, args); + } } void Register() override diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp index 668eddcb249..6eedb9eba0a 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp @@ -668,7 +668,7 @@ class spell_paletress_summon_memory : public SpellScriptLoader void HandleScript(SpellEffIndex /*effIndex*/) { - GetHitUnit()->CastSpell(GetHitUnit(), memorySpellId[urand(0, 24)], true, nullptr, nullptr, GetCaster()->GetGUID()); + GetHitUnit()->CastSpell(GetHitUnit(), memorySpellId[urand(0, 24)], GetCaster()->GetGUID()); } void Register() override diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp index 1ed17eda42e..9827475a67a 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp @@ -308,12 +308,20 @@ class boss_anubarak_trial : public CreatureScript events.ScheduleEvent(EVENT_FREEZE_SLASH, 15*IN_MILLISECONDS, 0, PHASE_MELEE); return; case EVENT_PENETRATING_COLD: - me->CastCustomSpell(SPELL_PENETRATING_COLD, SPELLVALUE_MAX_TARGETS, RAID_MODE(2, 5, 2, 5)); - events.ScheduleEvent(EVENT_PENETRATING_COLD, 20*IN_MILLISECONDS, 0, PHASE_MELEE); + { + CastSpellExtraArgs args; + args.SpellValueOverrides.AddMod(SPELLVALUE_MAX_TARGETS, RAID_MODE(2, 5, 2, 5)); + me->CastSpell(nullptr, SPELL_PENETRATING_COLD, args); + events.ScheduleEvent(EVENT_PENETRATING_COLD, 20 * IN_MILLISECONDS, 0, PHASE_MELEE); return; + } case EVENT_SUMMON_NERUBIAN: if (IsHeroic() || !_reachedPhase3) - me->CastCustomSpell(SPELL_SUMMON_BURROWER, SPELLVALUE_MAX_TARGETS, RAID_MODE(1, 2, 2, 4)); + { + CastSpellExtraArgs args; + args.SpellValueOverrides.AddMod(SPELLVALUE_MAX_TARGETS, RAID_MODE(1, 2, 2, 4)); + me->CastSpell(nullptr, SPELL_SUMMON_BURROWER, args); + } events.ScheduleEvent(EVENT_SUMMON_NERUBIAN, 45*IN_MILLISECONDS, 0, PHASE_MELEE); return; case EVENT_NERUBIAN_SHADOW_STRIKE: @@ -925,10 +933,12 @@ class spell_anubarak_leeching_swarm : public SpellScriptLoader int32 lifeLeeched = target->CountPctFromCurHealth(aurEff->GetAmount()); if (lifeLeeched < 250) lifeLeeched = 250; + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT0, lifeLeeched); // Damage - caster->CastCustomSpell(target, SPELL_LEECHING_SWARM_DMG, &lifeLeeched, nullptr, nullptr, true); + caster->CastSpell(target, SPELL_LEECHING_SWARM_DMG, args); // Heal - caster->CastCustomSpell(caster, SPELL_LEECHING_SWARM_HEAL, &lifeLeeched, nullptr, nullptr, true); + caster->CastSpell(caster, SPELL_LEECHING_SWARM_HEAL, args); } } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp index a3da5f57881..d79186c91a5 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp @@ -2264,7 +2264,7 @@ class spell_faction_champion_warl_unstable_affliction : public SpellScriptLoader void HandleDispel(DispelInfo* dispelInfo) { if (Unit* caster = GetCaster()) - caster->CastSpell(dispelInfo->GetDispeller(), SPELL_UNSTABLE_AFFLICTION_DISPEL, true, nullptr, GetEffect(EFFECT_0)); + caster->CastSpell(dispelInfo->GetDispeller(), SPELL_UNSTABLE_AFFLICTION_DISPEL, GetEffect(EFFECT_0)); } void Register() override diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp index dcb939e57f8..bd4cd93f6ce 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp @@ -219,9 +219,13 @@ class boss_jaraxxus : public CreatureScript events.ScheduleEvent(EVENT_INCINERATE_FLESH, urand(20*IN_MILLISECONDS, 25*IN_MILLISECONDS)); break; case EVENT_NETHER_POWER: - me->CastCustomSpell(SPELL_NETHER_POWER, SPELLVALUE_AURA_STACK, RAID_MODE<uint32>(5, 10, 5, 10), me, true); - events.ScheduleEvent(EVENT_NETHER_POWER, 40*IN_MILLISECONDS); + { + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddMod(SPELLVALUE_AURA_STACK, RAID_MODE(5, 10, 5, 10)); + me->CastSpell(me, SPELL_NETHER_POWER, args); + events.ScheduleEvent(EVENT_NETHER_POWER, 40 * IN_MILLISECONDS); break; + } case EVENT_LEGION_FLAME: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, true, -SPELL_LORD_HITTIN)) { 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 77ea3de389b..c8d2b29987f 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -1152,7 +1152,7 @@ class spell_jormungars_paralytic_toxin : public AuraScript slowEff->ChangeAmount(newAmount); if (newAmount == -100 && !GetTarget()->HasAura(SPELL_PARALYSIS)) - GetTarget()->CastSpell(GetTarget(), SPELL_PARALYSIS, true, nullptr, slowEff, GetCasterGUID()); + GetTarget()->CastSpell(GetTarget(), SPELL_PARALYSIS, CastSpellExtraArgs(slowEff).SetOriginalCaster(GetCasterGUID())); } } @@ -1197,7 +1197,9 @@ 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); - GetTarget()->CastCustomSpell(GetSpellInfo()->GetEffect(aurEff->GetEffIndex())->TriggerSpell, SPELLVALUE_RADIUS_MOD, radius, nullptr, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddMod(SPELLVALUE_RADIUS_MOD, radius); + GetTarget()->CastSpell(nullptr, GetSpellInfo()->GetEffect(aurEff->GetEffIndex())->TriggerSpell, args); } void Register() override diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp index 232c2bf8139..eddf870bb84 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -312,7 +312,11 @@ struct boss_twin_baseAI : public BossAI break; case EVENT_TOUCH: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true, true, OtherEssenceSpellId)) - me->CastCustomSpell(TouchSpellId, SPELLVALUE_MAX_TARGETS, 1, target, false); + { + CastSpellExtraArgs args; + args.SpellValueOverrides.AddMod(SPELLVALUE_MAX_TARGETS, 1); // @todo spellmgr correction instead? + me->CastSpell(target, TouchSpellId, args); + } events.ScheduleEvent(EVENT_TOUCH, urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS)); break; case EVENT_BERSERK: @@ -716,8 +720,11 @@ class spell_bullet_controller : public AuraScript if (!caster) return; - caster->CastCustomSpell(SPELL_SUMMON_PERIODIC_LIGHT, SPELLVALUE_MAX_TARGETS, urand(1, 6), GetTarget(), true); - caster->CastCustomSpell(SPELL_SUMMON_PERIODIC_DARK, SPELLVALUE_MAX_TARGETS, urand(1, 6), GetTarget(), true); + CastSpellExtraArgs args1(TRIGGERED_FULL_MASK), args2(TRIGGERED_FULL_MASK); + args1.SpellValueOverrides.AddMod(SPELLVALUE_MAX_TARGETS, urand(1, 6)); + args2.SpellValueOverrides.AddMod(SPELLVALUE_MAX_TARGETS, urand(1, 6)); + caster->CastSpell(GetTarget(), SPELL_SUMMON_PERIODIC_LIGHT, args1); + caster->CastSpell(GetTarget(), SPELL_SUMMON_PERIODIC_DARK, args2); } void Register() override diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp index 0aa09881f0a..8a6dc12233b 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp @@ -139,7 +139,7 @@ class boss_trollgore : public CreatureScript case EVENT_SPAWN: for (uint8 i = 0; i < 3; ++i) if (Creature* trigger = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_TROLLGORE_INVADER_SUMMONER_1 + i))) - trigger->CastSpell(trigger, RAND(SPELL_SUMMON_INVADER_A, SPELL_SUMMON_INVADER_B, SPELL_SUMMON_INVADER_C), true, nullptr, nullptr, me->GetGUID()); + trigger->CastSpell(trigger, RAND(SPELL_SUMMON_INVADER_A, SPELL_SUMMON_INVADER_B, SPELL_SUMMON_INVADER_C), me->GetGUID()); events.ScheduleEvent(EVENT_SPAWN, urand(30000, 40000)); break; @@ -277,7 +277,7 @@ class spell_trollgore_corpse_explode : public SpellScriptLoader { if (aurEff->GetTickNumber() == 2) if (Unit* caster = GetCaster()) - caster->CastSpell(GetTarget(), SPELL_CORPSE_EXPLODE_DAMAGE, true, nullptr, aurEff); + caster->CastSpell(GetTarget(), SPELL_CORPSE_EXPLODE_DAMAGE, aurEff); } void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp index bc6edfdc3a9..533a01b95bf 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp @@ -197,7 +197,7 @@ class boss_bronjahm : public CreatureScript me->CastSpell(me, SPELL_SOULSTORM, false); break; case EVENT_FEAR: - me->CastCustomSpell(SPELL_FEAR, SPELLVALUE_MAX_TARGETS, 1, nullptr, false); + me->CastSpell(nullptr, SPELL_FEAR, { SPELLVALUE_MAX_TARGETS, 1 }); events.ScheduleEvent(EVENT_FEAR, urand(8000, 12000), 0, PHASE_2); break; default: diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp index 6479b1aa9e1..55cd310239b 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp @@ -409,8 +409,9 @@ class spell_devourer_of_souls_mirrored_soul_proc : public SpellScriptLoader if (!damageInfo || !damageInfo->GetDamage()) return; - int32 damage = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), 45); - GetTarget()->CastCustomSpell(SPELL_MIRRORED_SOUL_DAMAGE, SPELLVALUE_BASE_POINT0, damage, GetCaster(), true); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddBP0(CalculatePct(damageInfo->GetDamage(), 45)); + GetTarget()->CastSpell(GetCaster(), SPELL_MIRRORED_SOUL_DAMAGE, args); } void Register() override diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp index 511c0e17893..676ab1727c7 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp @@ -151,7 +151,11 @@ class spell_marwyn_shared_suffering : public SpellScriptLoader { int32 remainingDamage = aurEff->GetAmount() * aurEff->GetRemainingTicks(); if (remainingDamage > 0) - caster->CastCustomSpell(SPELL_SHARED_SUFFERING_DISPEL, SPELLVALUE_BASE_POINT1, remainingDamage, GetTarget(), TRIGGERED_FULL_MASK); + { + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT1, remainingDamage); + caster->CastSpell(GetTarget(), SPELL_SHARED_SUFFERING_DISPEL, args); + } } } diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp index 6239f430494..b038e9ceb00 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp @@ -266,7 +266,7 @@ class boss_ick : public CreatureScript krick->AI()->Talk(SAY_KRICK_BARRAGE_1); krick->AI()->Talk(SAY_KRICK_BARRAGE_2); krick->CastSpell(krick, SPELL_EXPLOSIVE_BARRAGE_KRICK, true); - DoCast(me, SPELL_EXPLOSIVE_BARRAGE_ICK); + DoCastAOE(SPELL_EXPLOSIVE_BARRAGE_ICK); } events.DelayEvents(20000); break; @@ -275,12 +275,12 @@ class boss_ick : public CreatureScript krick->AI()->Talk(SAY_KRICK_POISON_NOVA); Talk(SAY_ICK_POISON_NOVA); - DoCast(me, SPELL_POISON_NOVA); + DoCastAOE(SPELL_POISON_NOVA); break; case EVENT_PURSUIT: if (Creature* krick = GetKrick()) krick->AI()->Talk(SAY_KRICK_CHASE); - me->CastCustomSpell(SPELL_PURSUIT, SPELLVALUE_MAX_TARGETS, 1, me); + DoCastSelf(SPELL_PURSUIT, { SPELLVALUE_MAX_TARGETS, 1 }); break; default: break; diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp index 4c8f7f3168f..5ccf9edf553 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp @@ -404,13 +404,21 @@ class player_overlord_brandAI : public PlayerAI { if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _tyrannusGUID)) if (Unit* victim = tyrannus->GetVictim()) - me->CastCustomSpell(SPELL_OVERLORD_BRAND_DAMAGE, SPELLVALUE_BASE_POINT0, damage, victim, true, nullptr, nullptr, tyrannus->GetGUID()); + { + CastSpellExtraArgs args(tyrannus->GetGUID()); + args.SpellValueOverrides.AddBP0(damage); + me->CastSpell(victim, SPELL_OVERLORD_BRAND_DAMAGE, args); + } } void HealDone(Unit* /*target*/, uint32& addHealth) override { if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _tyrannusGUID)) - me->CastCustomSpell(SPELL_OVERLORD_BRAND_HEAL, SPELLVALUE_BASE_POINT0, int32(addHealth * 5.5f), tyrannus, true, nullptr, nullptr, tyrannus->GetGUID()); + { + CastSpellExtraArgs args(tyrannus->GetGUID()); + args.SpellValueOverrides.AddBP0(addHealth * 5.5f); + me->CastSpell(tyrannus, SPELL_OVERLORD_BRAND_HEAL, args); + } } void UpdateAI(uint32 /*diff*/) override { } diff --git a/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp index 1bf89449dfd..c5225d3e5eb 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp @@ -235,7 +235,9 @@ class spell_moorabi_mojo_frenzy : public SpellScriptLoader Unit* owner = GetUnitOwner(); int32 castSpeedBonus = (100.0f - owner->GetHealthPct()) * 4; // between 0% and 400% cast speed bonus - owner->CastCustomSpell(SPELL_MOJO_FRENZY_CAST_SPEED, SPELLVALUE_BASE_POINT0, castSpeedBonus, owner, true); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddBP0(castSpeedBonus); + owner->CastSpell(owner, SPELL_MOJO_FRENZY_CAST_SPEED, args); } void Register() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index b5ac810ea7f..fff0e33838e 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -805,7 +805,7 @@ class boss_prince_valanar_icc : public CreatureScript { case NPC_KINETIC_BOMB_TARGET: summon->SetReactState(REACT_PASSIVE); - summon->CastSpell(summon, SPELL_KINETIC_BOMB, true, nullptr, nullptr, me->GetGUID()); + summon->CastSpell(summon, SPELL_KINETIC_BOMB, me->GetGUID()); break; case NPC_KINETIC_BOMB: { @@ -1472,7 +1472,7 @@ class spell_blood_council_shadow_prison : public SpellScriptLoader void HandleDummyTick(AuraEffect const* aurEff) { if (GetTarget()->isMoving()) - GetTarget()->CastSpell(GetTarget(), SPELL_SHADOW_PRISON_DAMAGE, true, nullptr, aurEff); + GetTarget()->CastSpell(GetTarget(), SPELL_SHADOW_PRISON_DAMAGE, aurEff); } void Register() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp index fe524c7015d..8c02a308440 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp @@ -726,8 +726,9 @@ class spell_blood_queen_essence_of_the_blood_queen : public SpellScriptLoader if (!damageInfo || !damageInfo->GetDamage()) return; - int32 heal = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), aurEff->GetAmount()); - GetTarget()->CastCustomSpell(SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_HEAL, SPELLVALUE_BASE_POINT0, heal, GetTarget(), TRIGGERED_FULL_MASK, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(CalculatePct(damageInfo->GetDamage(), aurEff->GetAmount())); + GetTarget()->CastSpell(GetTarget(), SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_HEAL, args); } void Register() override @@ -811,7 +812,10 @@ class spell_blood_queen_pact_of_the_darkfallen_dmg : public SpellScriptLoader int32 damage = damageSpell->GetEffect(EFFECT_0)->CalcValue(); float multiplier = 0.3375f + 0.1f * uint32(aurEff->GetTickNumber() / 10); // do not convert to 0.01f - we need tick number/10 as INT (damage increases every 10 ticks) damage = int32(damage * multiplier); - GetTarget()->CastCustomSpell(SPELL_PACT_OF_THE_DARKFALLEN_DAMAGE, SPELLVALUE_BASE_POINT0, damage, GetTarget(), true); + + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddBP0(damage); + GetTarget()->CastSpell(GetTarget(), SPELL_PACT_OF_THE_DARKFALLEN_DAMAGE, args); } void Register() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 332f0ba7ae4..3e1a16b14e9 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -433,7 +433,11 @@ class boss_deathbringer_saurfang : public CreatureScript case 72445: case 72446: if (me->GetPower(POWER_ENERGY) != me->GetMaxPower(POWER_ENERGY)) - target->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, 1, nullptr, true); + { + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddBP0(1); + target->CastSpell(nullptr, SPELL_BLOOD_LINK_DUMMY, args); + } break; default: break; @@ -1015,7 +1019,9 @@ class spell_deathbringer_blood_link : public SpellScriptLoader void HandleDummy(SpellEffIndex /*effIndex*/) { - GetHitUnit()->CastCustomSpell(SPELL_BLOOD_LINK_POWER, SPELLVALUE_BASE_POINT0, GetEffectValue(), GetHitUnit(), true); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddBP0(GetEffectValue()); + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_BLOOD_LINK_POWER, args); PreventHitDefaultEffect(EFFECT_0); } @@ -1131,7 +1137,7 @@ class spell_deathbringer_rune_of_blood : public SpellScriptLoader void HandleScript(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); // make this the default handler - GetHitUnit()->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, 1, nullptr, true); + GetHitUnit()->CastSpell(nullptr, SPELL_BLOOD_LINK_DUMMY, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellBP0(1)); } void Register() override @@ -1164,7 +1170,7 @@ class spell_deathbringer_blood_beast_blood_link : public SpellScriptLoader void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - eventInfo.GetProcTarget()->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, 3, nullptr, true, nullptr, aurEff); + eventInfo.GetProcTarget()->CastSpell(nullptr, SPELL_BLOOD_LINK_DUMMY, CastSpellExtraArgs(aurEff).AddSpellBP0(3)); } void Register() override @@ -1196,7 +1202,7 @@ class spell_deathbringer_blood_nova : public SpellScriptLoader void HandleScript(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); // make this the default handler - GetHitUnit()->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, 2, nullptr, true); + GetHitUnit()->CastSpell(nullptr, SPELL_BLOOD_LINK_DUMMY, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellBP0(2)); } void Register() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp index 167b4532408..7f1c8dd8892 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp @@ -199,7 +199,7 @@ class boss_festergut : public CreatureScript // just cast and dont bother with target, conditions will handle it ++_inhaleCounter; if (_inhaleCounter < 3) - me->CastSpell(me, gaseousBlight[_inhaleCounter], true, nullptr, nullptr, me->GetGUID()); + me->CastSpell(me, gaseousBlight[_inhaleCounter], me->GetGUID()); } events.ScheduleEvent(EVENT_INHALE_BLIGHT, urand(33500, 35000)); @@ -234,7 +234,7 @@ class boss_festergut : public CreatureScript case EVENT_GAS_SPORE: Talk(EMOTE_WARN_GAS_SPORE); Talk(EMOTE_GAS_SPORE); - me->CastCustomSpell(SPELL_GAS_SPORE, SPELLVALUE_MAX_TARGETS, RAID_MODE<int32>(2, 3, 2, 3), me); + me->CastSpell(me, SPELL_GAS_SPORE, CastSpellExtraArgs().AddSpellMod(SPELLVALUE_MAX_TARGETS, RAID_MODE<int32>(2, 3, 2, 3))); events.ScheduleEvent(EVENT_GAS_SPORE, urand(40000, 45000)); events.RescheduleEvent(EVENT_VILE_GAS, urand(28000, 35000)); break; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp index c59798a5300..62129734089 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp @@ -1841,7 +1841,10 @@ class spell_igb_rocket_pack : public SpellScriptLoader void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { SpellInfo const* damageInfo = sSpellMgr->AssertSpellInfo(SPELL_ROCKET_PACK_DAMAGE, GetCastDifficulty()); - GetTarget()->CastCustomSpell(SPELL_ROCKET_PACK_DAMAGE, SPELLVALUE_BASE_POINT0, 2 * (damageInfo->GetEffect(EFFECT_0)->CalcValue() + aurEff->GetTickNumber() * aurEff->GetPeriod()), nullptr, TRIGGERED_FULL_MASK); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.CastDifficulty = GetCastDifficulty(); + args.SpellValueOverrides.AddBP0(2 * (damageInfo->GetEffect(EFFECT_0)->CalcValue() + aurEff->GetTickNumber() * aurEff->GetPeriod())); + GetTarget()->CastSpell(nullptr, SPELL_ROCKET_PACK_DAMAGE, args); GetTarget()->CastSpell(nullptr, SPELL_ROCKET_BURST, TRIGGERED_FULL_MASK); } @@ -2250,7 +2253,9 @@ class spell_igb_burning_pitch : public SpellScriptLoader void HandleDummy(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); - GetCaster()->CastCustomSpell(uint32(GetEffectValue()), SPELLVALUE_BASE_POINT0, 8000, nullptr, TRIGGERED_FULL_MASK); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddBP0(8000); + GetCaster()->CastSpell(nullptr, GetEffectValue(), args); GetHitUnit()->CastSpell(GetHitUnit(), SPELL_BURNING_PITCH, TRIGGERED_FULL_MASK); } @@ -2316,7 +2321,11 @@ class spell_igb_rocket_artillery_explosion : public SpellScriptLoader void DamageGunship(SpellEffIndex /*effIndex*/) { if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - GetCaster()->CastCustomSpell(instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE ? SPELL_BURNING_PITCH_DAMAGE_A : SPELL_BURNING_PITCH_DAMAGE_H, SPELLVALUE_BASE_POINT0, 5000, nullptr, TRIGGERED_FULL_MASK); + { + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddBP0(5000); + GetCaster()->CastSpell(nullptr, instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE ? SPELL_BURNING_PITCH_DAMAGE_A : SPELL_BURNING_PITCH_DAMAGE_H, args); + } } void Register() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index 02d7197672e..6e47c2ff790 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -435,7 +435,9 @@ class boss_lady_deathwhisper : public CreatureScript }) .Schedule(Seconds(12), GROUP_TWO, [this](TaskContext summonShade) { - me->CastCustomSpell(SPELL_SUMMON_SPIRITS, SPELLVALUE_MAX_TARGETS, Is25ManRaid() ? 2 : 1); + CastSpellExtraArgs args; + args.SpellValueOverrides.AddMod(SPELLVALUE_MAX_TARGETS, Is25ManRaid() ? 2 : 1); + me->CastSpell(nullptr, SPELL_SUMMON_SPIRITS, args); summonShade.Repeat(); }); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index 92817d37c31..62cda3d2b8d 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -380,7 +380,7 @@ class boss_professor_putricide : public CreatureScript me->SetSpeedRate(MOVE_RUN, _baseSpeed); DoAction(ACTION_FESTERGUT_GAS); if (Creature* festergut = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_FESTERGUT))) - festergut->CastSpell(festergut, SPELL_GASEOUS_BLIGHT_LARGE, false, nullptr, nullptr, festergut->GetGUID()); + festergut->CastSpell(festergut, SPELL_GASEOUS_BLIGHT_LARGE, CastSpellExtraArgs().SetOriginalCaster(festergut->GetGUID())); break; case POINT_ROTFACE: instance->SetBossState(DATA_ROTFACE, IN_PROGRESS); // needed here for delayed gate close @@ -477,7 +477,7 @@ class boss_professor_putricide : public CreatureScript case ACTION_ROTFACE_OOZE: Talk(SAY_ROTFACE_OOZE_FLOOD); if (Creature* dummy = ObjectAccessor::GetCreature(*me, _oozeFloodDummyGUIDs[_oozeFloodStage])) - dummy->CastSpell(dummy, oozeFloodSpells[_oozeFloodStage], true, nullptr, nullptr, me->GetGUID()); // cast from self for LoS (with prof's GUID for logs) + dummy->CastSpell(dummy, oozeFloodSpells[_oozeFloodStage], me->GetGUID()); // cast from self for LoS (with prof's GUID for logs) if (++_oozeFloodStage == 4) _oozeFloodStage = 0; break; @@ -586,7 +586,7 @@ class boss_professor_putricide : public CreatureScript EnterEvadeMode(); break; case EVENT_FESTERGUT_GOO: - me->CastCustomSpell(SPELL_MALLEABLE_GOO_SUMMON, SPELLVALUE_MAX_TARGETS, 1, nullptr, true); + DoCastAOE(SPELL_MALLEABLE_GOO_SUMMON, CastSpellExtraArgs(true).AddSpellMod(SPELLVALUE_MAX_TARGETS, 1)); events.ScheduleEvent(EVENT_FESTERGUT_GOO, (Is25ManRaid() ? 10000 : 30000) + urand(0, 5000), 0, PHASE_FESTERGUT); break; case EVENT_ROTFACE_DIES: @@ -819,7 +819,9 @@ class npc_gas_cloud : public CreatureScript void CastMainSpell() override { - me->CastCustomSpell(SPELL_GASEOUS_BLOAT, SPELLVALUE_AURA_STACK, 10, me, false); + CastSpellExtraArgs args; + args.SpellValueOverrides.AddMod(SPELLVALUE_AURA_STACK, 10); + me->CastSpell(me, SPELL_GASEOUS_BLOAT, args); } private: @@ -848,7 +850,11 @@ class spell_putricide_gaseous_bloat : public SpellScriptLoader { target->RemoveAuraFromStack(GetSpellInfo()->Id, GetCasterGUID()); if (!target->HasAura(GetId())) - caster->CastCustomSpell(SPELL_GASEOUS_BLOAT, SPELLVALUE_AURA_STACK, 10, caster, false); + { + CastSpellExtraArgs args; + args.SpellValueOverrides.AddMod(SPELLVALUE_AURA_STACK, 10); + caster->CastSpell(caster, SPELL_GASEOUS_BLOAT, args); + } } } @@ -862,7 +868,9 @@ class spell_putricide_gaseous_bloat : public SpellScriptLoader for (uint8 i = 1; i <= stack; ++i) dmg += mod * i; - caster->CastCustomSpell(SPELL_EXPUNGED_GAS, SPELLVALUE_BASE_POINT0, dmg); + CastSpellExtraArgs args; + args.SpellValueOverrides.AddBP0(dmg); + caster->CastSpell(nullptr, SPELL_EXPUNGED_GAS, args); } void Register() override @@ -1116,7 +1124,7 @@ class spell_putricide_ooze_tank_protection : public SpellScriptLoader PreventDefaultAction(); Unit* actionTarget = eventInfo.GetActionTarget(); - actionTarget->CastSpell(nullptr, aurEff->GetSpellEffectInfo()->TriggerSpell, true, nullptr, aurEff); + actionTarget->CastSpell(nullptr, aurEff->GetSpellEffectInfo()->TriggerSpell, aurEff); } void Register() override @@ -1150,7 +1158,7 @@ class spell_putricide_choking_gas_bomb : public SpellScriptLoader continue; uint32 spellId = uint32(effect->CalcValue()); - GetCaster()->CastSpell(GetCaster(), spellId, true, nullptr, nullptr, GetCaster()->GetGUID()); + GetCaster()->CastSpell(GetCaster(), spellId, GetCaster()->GetGUID()); } } @@ -1317,7 +1325,10 @@ class spell_putricide_mutated_plague : public SpellScriptLoader damage *= int32(pow(multiplier, GetStackAmount())); damage = int32(damage * 1.5f); - GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_BASE_POINT0, damage, GetTarget(), true, nullptr, aurEff, GetCasterGUID()); + CastSpellExtraArgs args(aurEff); + args.OriginalCaster = GetCasterGUID(); + args.SpellValueOverrides.AddBP0(damage); + GetTarget()->CastSpell(GetTarget(), triggerSpell, args); } void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) @@ -1329,7 +1340,9 @@ class spell_putricide_mutated_plague : public SpellScriptLoader return; int32 heal = healSpellInfo->GetEffect(EFFECT_0)->CalcValue() * GetStackAmount(); - GetTarget()->CastCustomSpell(healSpell, SPELLVALUE_BASE_POINT0, heal, GetTarget(), true, nullptr, nullptr, GetCasterGUID()); + CastSpellExtraArgs args(GetCasterGUID()); + args.SpellValueOverrides.AddBP0(heal); + GetTarget()->CastSpell(GetTarget(), healSpell, args); } void Register() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp index 524bdd671e9..1895f82db86 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp @@ -472,7 +472,7 @@ class spell_rotface_ooze_flood : public SpellScriptLoader return; triggers.sort(Trinity::ObjectDistanceOrderPred(GetHitUnit())); - GetHitUnit()->CastSpell(triggers.back(), uint32(GetEffectValue()), false, nullptr, nullptr, GetOriginalCaster() ? GetOriginalCaster()->GetGUID() : ObjectGuid::Empty); + GetHitUnit()->CastSpell(triggers.back(), uint32(GetEffectValue()), GetOriginalCaster() ? GetOriginalCaster()->GetGUID() : ObjectGuid::Empty); } void FilterTargets(std::list<WorldObject*>& targets) @@ -550,7 +550,7 @@ class spell_rotface_mutated_infection : public SpellScriptLoader void HandleEffectRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); - target->CastSpell(target, uint32(GetSpellInfo()->GetEffect(EFFECT_2)->CalcValue()), true, nullptr, aurEff, GetCasterGUID()); + target->CastSpell(target, uint32(GetSpellInfo()->GetEffect(EFFECT_2)->CalcValue()), { aurEff, GetCasterGUID() }); } void Register() override @@ -678,7 +678,7 @@ class spell_rotface_large_ooze_buff_combine : public SpellScriptLoader if (Creature* cre = GetCaster()->ToCreature()) cre->AI()->DoAction(EVENT_STICKY_OOZE); - GetCaster()->CastSpell(GetCaster(), SPELL_UNSTABLE_OOZE_EXPLOSION, false, nullptr, nullptr, GetCaster()->GetGUID()); + GetCaster()->CastSpell(GetCaster(), SPELL_UNSTABLE_OOZE_EXPLOSION, CastSpellExtraArgs().SetOriginalCaster(GetCaster()->GetGUID())); if (InstanceScript* instance = GetCaster()->GetInstanceScript()) instance->SetData(DATA_OOZE_DANCE_ACHIEVEMENT, uint32(false)); } @@ -759,7 +759,7 @@ class spell_rotface_unstable_ooze_explosion : public SpellScriptLoader // let Rotface handle the cast - caster dies before this executes if (InstanceScript* script = GetCaster()->GetInstanceScript()) if (Creature* rotface = script->instance->GetCreature(script->GetGuidData(DATA_ROTFACE))) - rotface->CastSpell(x, y, z, triggered_spell_id, true, nullptr, nullptr, GetCaster()->GetGUID()); + rotface->CastSpell({x, y, z}, triggered_spell_id, GetCaster()->GetGUID()); } void Register() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index b0f575f3b6d..9bbb5767ca2 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -195,7 +195,7 @@ class FrostBombExplosion : public BasicEvent bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) override { - _owner->CastSpell(nullptr, SPELL_FROST_BOMB, false, nullptr, nullptr, _sindragosaGUID); + _owner->CastSpell(nullptr, SPELL_FROST_BOMB, CastSpellExtraArgs().SetOriginalCaster(_sindragosaGUID)); _owner->RemoveAurasDueToSpell(SPELL_FROST_BOMB_VISUAL); return true; } @@ -369,11 +369,15 @@ class boss_sindragosa : public CreatureScript events.ScheduleEvent(EVENT_AIR_MOVEMENT, 1); break; case POINT_AIR_PHASE: - me->CastCustomSpell(SPELL_ICE_TOMB_TARGET, SPELLVALUE_MAX_TARGETS, RAID_MODE<int32>(2, 5, 2, 6), nullptr, TRIGGERED_FULL_MASK); + { + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddMod(SPELLVALUE_MAX_TARGETS, RAID_MODE<int32>(2, 5, 2, 6)); + me->CastSpell(nullptr, SPELL_ICE_TOMB_TARGET, args); me->SetFacingTo(float(M_PI), true); events.ScheduleEvent(EVENT_AIR_MOVEMENT_FAR, 1); events.ScheduleEvent(EVENT_FROST_BOMB, 9000); break; + } case POINT_AIR_PHASE_FAR: me->SetFacingTo(float(M_PI), true); events.ScheduleEvent(EVENT_LAND, 30000); @@ -507,9 +511,13 @@ class boss_sindragosa : public CreatureScript me->GetMotionMaster()->MovePoint(POINT_AIR_PHASE_FAR, SindragosaAirPosFar); break; case EVENT_ICE_TOMB: - me->CastCustomSpell(SPELL_ICE_TOMB_TARGET, SPELLVALUE_MAX_TARGETS, 1, nullptr, TRIGGERED_FULL_MASK); + { + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddMod(SPELLVALUE_MAX_TARGETS, 1); + me->CastSpell(nullptr, SPELL_ICE_TOMB_TARGET, args); events.ScheduleEvent(EVENT_ICE_TOMB, urand(16000, 23000)); break; + } case EVENT_FROST_BOMB: { float destX, destY, destZ; @@ -517,7 +525,7 @@ class boss_sindragosa : public CreatureScript destY = float(rand_norm()) * 75.0f + 2450.0f; destZ = 205.0f; // random number close to ground, get exact in next call me->UpdateGroundPositionZ(destX, destY, destZ); - me->CastSpell(destX, destY, destZ, SPELL_FROST_BOMB_TRIGGER, false); + me->CastSpell({ destX, destY, destZ }, SPELL_FROST_BOMB_TRIGGER, false); events.ScheduleEvent(EVENT_FROST_BOMB, urand(6000, 8000)); break; } @@ -1242,7 +1250,12 @@ class spell_sindragosa_instability : public SpellScriptLoader void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) - GetTarget()->CastCustomSpell(SPELL_BACKLASH, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, nullptr, aurEff, GetCasterGUID()); + { + CastSpellExtraArgs args(aurEff); + args.OriginalCaster = GetCasterGUID(); + args.SpellValueOverrides.AddBP0(aurEff->GetAmount()); + GetTarget()->CastSpell(GetTarget(), SPELL_BACKLASH, args); + } } void Register() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index 1cf92ceef37..1644848cf0e 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -470,7 +470,7 @@ class TriggerWickedSpirit : public BasicEvent bool Execute(uint64 /*time*/, uint32 /*diff*/) override { - _owner->CastCustomSpell(SPELL_TRIGGER_VILE_SPIRIT_HEROIC, SPELLVALUE_MAX_TARGETS, 1, nullptr, true); + _owner->CastSpell(nullptr, SPELL_TRIGGER_VILE_SPIRIT_HEROIC, { SPELLVALUE_MAX_TARGETS, 1 }); if (--_counter) { @@ -2117,10 +2117,9 @@ class spell_the_lich_king_necrotic_plague : public SpellScriptLoader return; } - CustomSpellValues values; - //values.AddSpellMod(SPELLVALUE_AURA_STACK, 2); - values.AddSpellMod(SPELLVALUE_MAX_TARGETS, 1); - GetTarget()->CastCustomSpell(SPELL_NECROTIC_PLAGUE_JUMP, values, nullptr, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); + CastSpellExtraArgs args(GetCasterGUID()); + args.SpellValueOverrides.AddMod(SPELLVALUE_MAX_TARGETS, 1); + GetTarget()->CastSpell(nullptr, SPELL_NECROTIC_PLAGUE_JUMP, args); if (Unit* caster = GetCaster()) caster->CastSpell(caster, SPELL_PLAGUE_SIPHON, true); } @@ -2217,9 +2216,9 @@ class spell_the_lich_king_necrotic_plague_jump : public SpellScriptLoader return; } - CustomSpellValues values; - values.AddSpellMod(SPELLVALUE_AURA_STACK, GetStackAmount()); - GetTarget()->CastCustomSpell(SPELL_NECROTIC_PLAGUE_JUMP, values, nullptr, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); + CastSpellExtraArgs args(GetCasterGUID()); + args.SpellValueOverrides.AddMod(SPELLVALUE_AURA_STACK, GetStackAmount()); + GetTarget()->CastSpell(nullptr, SPELL_NECROTIC_PLAGUE_JUMP, args); if (Unit* caster = GetCaster()) caster->CastSpell(caster, SPELL_PLAGUE_SIPHON, true); } @@ -2235,10 +2234,10 @@ class spell_the_lich_king_necrotic_plague_jump : public SpellScriptLoader if (aurEff->GetAmount() > _lastAmount) return; - CustomSpellValues values; - values.AddSpellMod(SPELLVALUE_AURA_STACK, GetStackAmount()); - values.AddSpellMod(SPELLVALUE_BASE_POINT1, AURA_REMOVE_BY_ENEMY_SPELL); // add as marker (spell has no effect 1) - GetTarget()->CastCustomSpell(SPELL_NECROTIC_PLAGUE_JUMP, values, nullptr, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCasterGUID()); + CastSpellExtraArgs args(GetCasterGUID()); + args.SpellValueOverrides.AddMod(SPELLVALUE_AURA_STACK, GetStackAmount()); + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT1, AURA_REMOVE_BY_ENEMY_SPELL); // add as marker (spell has no effect 1) + GetTarget()->CastSpell(nullptr, SPELL_NECROTIC_PLAGUE_JUMP, args); if (Unit* caster = GetCaster()) caster->CastSpell(caster, SPELL_PLAGUE_SIPHON, true); @@ -2651,7 +2650,9 @@ class spell_the_lich_king_life_siphon : public SpellScriptLoader void TriggerHeal() { - GetHitUnit()->CastCustomSpell(SPELL_LIFE_SIPHON_HEAL, SPELLVALUE_BASE_POINT0, GetHitDamage() * 10, GetCaster(), true); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddBP0(GetHitDamage() * 10); + GetHitUnit()->CastSpell(GetCaster(), SPELL_LIFE_SIPHON_HEAL, args); } void Register() override @@ -2691,7 +2692,7 @@ class spell_the_lich_king_vile_spirits : public SpellScriptLoader void OnPeriodic(AuraEffect const* aurEff) { if (_is25Man || ((aurEff->GetTickNumber() - 1) % 5)) - GetTarget()->CastSpell(nullptr, aurEff->GetSpellEffectInfo()->TriggerSpell, true, nullptr, aurEff, GetCasterGUID()); + GetTarget()->CastSpell(nullptr, aurEff->GetSpellEffectInfo()->TriggerSpell, { aurEff, GetCasterGUID() }); } void Register() override @@ -2849,7 +2850,7 @@ class spell_the_lich_king_harvest_soul : public SpellScriptLoader { // m_originalCaster to allow stacking from different casters, meh if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH) - GetTarget()->CastSpell(nullptr, SPELL_HARVESTED_SOUL, true, nullptr, nullptr, GetTarget()->GetInstanceScript()->GetGuidData(DATA_THE_LICH_KING)); + GetTarget()->CastSpell(nullptr, SPELL_HARVESTED_SOUL, GetTarget()->GetInstanceScript()->GetGuidData(DATA_THE_LICH_KING)); } void Register() override @@ -2915,7 +2916,12 @@ class spell_the_lich_king_soul_rip : public SpellScriptLoader PreventDefaultAction(); // shouldn't be needed, this is channeled if (Unit* caster = GetCaster()) - caster->CastCustomSpell(SPELL_SOUL_RIP_DAMAGE, SPELLVALUE_BASE_POINT0, 5000 * aurEff->GetTickNumber(), GetTarget(), true, nullptr, aurEff, GetCasterGUID()); + { + CastSpellExtraArgs args(aurEff); + args.OriginalCaster = GetCasterGUID(); + args.SpellValueOverrides.AddBP0(5000 * aurEff->GetTickNumber()); + caster->CastSpell(GetTarget(), SPELL_SOUL_RIP_DAMAGE, args); + } } void Register() override @@ -3014,8 +3020,9 @@ class spell_the_lich_king_dark_hunger : public SpellScriptLoader if (!damageInfo || !damageInfo->GetDamage()) return; - int32 heal = static_cast<int32>(damageInfo->GetDamage()) / 2; - GetTarget()->CastCustomSpell(SPELL_DARK_HUNGER_HEAL, SPELLVALUE_BASE_POINT0, heal, GetTarget(), true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(damageInfo->GetDamage() / 2); + GetTarget()->CastSpell(GetTarget(), SPELL_DARK_HUNGER_HEAL, args); } void Register() override @@ -3048,7 +3055,7 @@ class spell_the_lich_king_in_frostmourne_room : public SpellScriptLoader { // m_originalCaster to allow stacking from different casters, meh if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH) - GetTarget()->CastSpell(nullptr, SPELL_HARVESTED_SOUL, true, nullptr, nullptr, GetTarget()->GetInstanceScript()->GetGuidData(DATA_THE_LICH_KING)); + GetTarget()->CastSpell(nullptr, SPELL_HARVESTED_SOUL, GetTarget()->GetInstanceScript()->GetGuidData(DATA_THE_LICH_KING)); } void Register() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index 826314e1b41..c3a26f54b25 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -183,7 +183,7 @@ class DelayedCastEvent : public BasicEvent bool Execute(uint64 /*time*/, uint32 /*diff*/) override { - _trigger->CastSpell(_trigger, _spellId, false, nullptr, nullptr, _originalCaster); + _trigger->CastSpell(_trigger, _spellId, _originalCaster); if (_despawnTime) _trigger->DespawnOrUnsummon(_despawnTime); return true; @@ -1111,7 +1111,7 @@ class npc_dream_cloud : public CreatureScript case EVENT_EXPLODE: me->GetMotionMaster()->MoveIdle(); // must use originalCaster the same for all clouds to allow stacking - me->CastSpell(me, EMERALD_VIGOR, false, nullptr, nullptr, _instance->GetGuidData(DATA_VALITHRIA_DREAMWALKER)); + me->CastSpell(me, EMERALD_VIGOR, _instance->GetGuidData(DATA_VALITHRIA_DREAMWALKER)); me->DespawnOrUnsummon(100); break; default: @@ -1239,7 +1239,7 @@ class spell_dreamwalker_summoner : public SpellScriptLoader if (!GetHitUnit()) return; - GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->GetEffect(effIndex)->TriggerSpell, true, nullptr, nullptr, GetCaster()->GetInstanceScript()->GetGuidData(DATA_VALITHRIA_LICH_KING)); + GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->GetEffect(effIndex)->TriggerSpell, GetCaster()->GetInstanceScript()->GetGuidData(DATA_VALITHRIA_LICH_KING)); } void Register() override @@ -1330,7 +1330,7 @@ class spell_dreamwalker_summon_suppresser_effect : public SpellScriptLoader if (!GetHitUnit()) return; - GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->GetEffect(effIndex)->TriggerSpell, true, nullptr, nullptr, GetCaster()->GetInstanceScript()->GetGuidData(DATA_VALITHRIA_LICH_KING)); + GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->GetEffect(effIndex)->TriggerSpell, GetCaster()->GetInstanceScript()->GetGuidData(DATA_VALITHRIA_LICH_KING)); } void Register() override @@ -1466,7 +1466,7 @@ class spell_dreamwalker_twisted_nightmares : public SpellScriptLoader // return; if (InstanceScript* instance = GetHitUnit()->GetInstanceScript()) - GetHitUnit()->CastSpell(nullptr, GetSpellInfo()->GetEffect(effIndex)->TriggerSpell, true, nullptr, nullptr, instance->GetGuidData(DATA_VALITHRIA_DREAMWALKER)); + GetHitUnit()->CastSpell(nullptr, GetSpellInfo()->GetEffect(effIndex)->TriggerSpell, instance->GetGuidData(DATA_VALITHRIA_DREAMWALKER)); } void Register() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index 67e7b2d1f2c..1fad25c79eb 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -832,7 +832,7 @@ class boss_sister_svalna : public CreatureScript switch (action) { case ACTION_KILL_CAPTAIN: - me->CastCustomSpell(SPELL_CARESS_OF_DEATH, SPELLVALUE_MAX_TARGETS, 1, me, true); + DoCastSelf(SPELL_CARESS_OF_DEATH, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_MAX_TARGETS, 1)); break; case ACTION_START_GAUNTLET: me->setActive(true); @@ -887,7 +887,9 @@ class boss_sister_svalna : public CreatureScript if (TempSummon* summon = target->SummonCreature(NPC_IMPALING_SPEAR, *target)) { Talk(EMOTE_SVALNA_IMPALE, target); - summon->CastCustomSpell(VEHICLE_SPELL_RIDE_HARDCODED, SPELLVALUE_BASE_POINT0, 1, target, false); + CastSpellExtraArgs args; + args.SpellValueOverrides.AddBP0(1); + summon->CastSpell(target, VEHICLE_SPELL_RIDE_HARDCODED, args); summon->AddUnitFlag2(UnitFlags2(UNIT_FLAG2_UNK1 | UNIT_FLAG2_ALLOW_ENEMY_INTERACT)); } break; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp index a8b928996a1..3f73afebd60 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp @@ -68,7 +68,7 @@ class icecrown_citadel_teleport : public GameObjectScript return true; } - player->CastSpell(player, spell, true); + player->CastSpell(player, spell->Id, true); return true; } }; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp index 12786c9e7f6..d2f992da8ed 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp @@ -143,7 +143,7 @@ public: void KilledUnit(Unit* victim) override { if (victim->GetTypeId() == TYPEID_PLAYER) - victim->CastSpell(victim, SPELL_SUMMON_CORPSE_SCARABS_PLR, true, nullptr, nullptr, me->GetGUID()); + victim->CastSpell(victim, SPELL_SUMMON_CORPSE_SCARABS_PLR, me->GetGUID()); Talk(SAY_SLAY); } @@ -198,7 +198,7 @@ public: { if (Creature* creatureTarget = ObjectAccessor::GetCreature(*me, Trinity::Containers::SelectRandomContainerElement(guardCorpses))) { - creatureTarget->CastSpell(creatureTarget, SPELL_SUMMON_CORPSE_SCARABS_MOB, true, nullptr, nullptr, me->GetGUID()); + creatureTarget->CastSpell(creatureTarget, SPELL_SUMMON_CORPSE_SCARABS_MOB, me->GetGUID()); creatureTarget->AI()->Talk(EMOTE_SCARAB); creatureTarget->DespawnOrUnsummon(); } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp index 2d1d1263978..b07fb10ff39 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp @@ -735,7 +735,11 @@ class spell_four_horsemen_mark : public SpellScriptLoader break; } if (damage) - caster->CastCustomSpell(SPELL_MARK_DAMAGE, SPELLVALUE_BASE_POINT0, damage, GetTarget()); + { + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddBP0(damage); + caster->CastSpell(GetTarget(), SPELL_MARK_DAMAGE, args); + } } } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp index 9ccf2bc33b6..42ff96345db 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp @@ -316,7 +316,11 @@ public: { int32 damage = int32(unit->GetHealth()) - int32(unit->CountPctFromMaxHealth(5)); if (damage > 0) - GetCaster()->CastCustomSpell(SPELL_DECIMATE_DMG, SPELLVALUE_BASE_POINT0, damage, unit); + { + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddBP0(damage); + GetCaster()->CastSpell(unit, SPELL_DECIMATE_DMG, args); + } } } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp index 73dcd478546..df225915ae0 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp @@ -165,7 +165,7 @@ class spell_grobbulus_mutating_injection : public SpellScriptLoader if (Unit* caster = GetCaster()) { caster->CastSpell(GetTarget(), SPELL_MUTATING_EXPLOSION, true); - GetTarget()->CastSpell(GetTarget(), SPELL_POISON_CLOUD, true, nullptr, aurEff, GetCasterGUID()); + GetTarget()->CastSpell(GetTarget(), SPELL_POISON_CLOUD, { aurEff, GetCasterGUID() }); } } @@ -205,7 +205,10 @@ class spell_grobbulus_poison_cloud : public SpellScriptLoader uint32 triggerSpell = aurEff->GetSpellEffectInfo()->TriggerSpell; int32 mod = int32(((float(aurEff->GetTickNumber()) / aurEff->GetTotalTicks()) * 0.9f + 0.1f) * 10000 * 2 / 3); - GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_RADIUS_MOD, mod, nullptr, TRIGGERED_FULL_MASK, nullptr, aurEff); + + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddMod(SPELLVALUE_RADIUS_MOD, mod); + GetTarget()->CastSpell(nullptr, triggerSpell, args); } void Register() override diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp index d6cfcf0a165..33bff540e2d 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp @@ -928,7 +928,9 @@ public: if (int32 mana = int32(target->GetMaxPower(POWER_MANA) / 10)) { mana = target->ModifyPower(POWER_MANA, -mana); - target->CastCustomSpell(SPELL_MANA_DETONATION_DAMAGE, SPELLVALUE_BASE_POINT0, -mana * 10, target, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(-mana * 10); + target->CastSpell(target, SPELL_MANA_DETONATION_DAMAGE, args); } } @@ -960,7 +962,11 @@ class spell_kelthuzad_frost_blast : public AuraScript // Stuns the target, dealing 26% of the target's maximum health in Frost damage every second for 4 sec. if (Unit* caster = GetCaster()) - caster->CastCustomSpell(SPELL_FROST_BLAST_DMG, SPELLVALUE_BASE_POINT0, int32(GetTarget()->CountPctFromMaxHealth(26)), GetTarget(), true, nullptr, aurEff); + { + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(GetTarget()->CountPctFromMaxHealth(26)); + caster->CastSpell(GetTarget(), SPELL_FROST_BLAST_DMG, args); + } } void Register() override diff --git a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp index e098294d78f..4b07cf6165c 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp @@ -181,7 +181,7 @@ class spell_loatheb_deathbloom : public SpellScriptLoader if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) return; - GetTarget()->CastSpell(nullptr, SPELL_DEATHBLOOM_FINAL_DAMAGE, true, nullptr, eff, GetCasterGUID()); + GetTarget()->CastSpell(nullptr, SPELL_DEATHBLOOM_FINAL_DAMAGE, CastSpellExtraArgs(eff).SetOriginalCaster(GetCasterGUID())); } void Register() override diff --git a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp index ab626aeccd3..a41c523d923 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp @@ -221,7 +221,7 @@ public: if (Unit* victim = ObjectAccessor::GetUnit(*me, victimGUID)) { visibleTimer = (me->GetDistance2d(victim)/WEB_WRAP_MOVE_SPEED + 0.5f) * IN_MILLISECONDS; - victim->CastSpell(victim, SPELL_WEB_WRAP, true, nullptr, nullptr, me->GetGUID()); + victim->CastSpell(victim, SPELL_WEB_WRAP, me->GetGUID()); } } diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index 04a64982fde..414a651e6ec 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -776,14 +776,12 @@ public: switch (eventId) { case EVENT_START_FIRST_RANDOM_PORTAL: - me->CastCustomSpell(SPELL_RANDOM_PORTAL, SPELLVALUE_MAX_TARGETS, 1); + case EVENT_RANDOM_PORTAL: + DoCastAOE(SPELL_RANDOM_PORTAL, { SPELLVALUE_MAX_TARGETS,1 }); break; case EVENT_STOP_PORTAL_BEAM: me->InterruptNonMeleeSpells(true); break; - case EVENT_RANDOM_PORTAL: - me->CastCustomSpell(SPELL_RANDOM_PORTAL, SPELLVALUE_MAX_TARGETS, 1); - break; case EVENT_LAND_START_ENCOUNTER: if (GameObject* iris = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_FOCUSING_IRIS_GUID))) { @@ -2029,7 +2027,7 @@ class spell_scion_of_eternity_arcane_barrage : public SpellScriptLoader void TriggerDamageSpellFromPlayer() { if (Player* hitTarget = GetHitPlayer()) - hitTarget->CastSpell(hitTarget, SPELL_ARCANE_BARRAGE_DAMAGE, true, nullptr, nullptr, GetCaster()->GetGUID()); + hitTarget->CastSpell(hitTarget, SPELL_ARCANE_BARRAGE_DAMAGE, GetCaster()->GetGUID()); } void Register() override diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp index 2ebe574753e..88a9bce7b78 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp @@ -200,7 +200,7 @@ public: summoned->GetMotionMaster()->MoveFollow(target, 0.0f, 0.0f); // Why healing when just summoned? - summoned->CastSpell(summoned, SPELL_HEAT, false, nullptr, nullptr, me->GetGUID()); + summoned->CastSpell(summoned, SPELL_HEAT, CastSpellExtraArgs().SetOriginalCaster(me->GetGUID())); } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp index 0a1f013f647..0df787fea3d 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp @@ -735,7 +735,7 @@ class spell_assembly_rune_of_summoning : public SpellScriptLoader void HandlePeriodic(AuraEffect const* aurEff) { PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_RUNE_OF_SUMMONING_SUMMON, true, nullptr, aurEff, GetTarget()->IsSummon() ? GetTarget()->ToTempSummon()->GetSummonerGUID() : ObjectGuid::Empty); + GetTarget()->CastSpell(GetTarget(), SPELL_RUNE_OF_SUMMONING_SUMMON, { aurEff, GetTarget()->IsSummon() ? GetTarget()->ToTempSummon()->GetSummonerGUID() : ObjectGuid::Empty }); } void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp index c3a141dee88..87be13e900c 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -1010,7 +1010,7 @@ public: { if (Creature* trigger = DoSummonFlyer(NPC_MIMIRON_TARGET_BEACON, me, 20, 0, 1000, TEMPSUMMON_TIMED_DESPAWN)) { - trigger->CastSpell(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), SPELL_MIMIRON_S_INFERNO, true); + trigger->CastSpell(me->GetPosition(), SPELL_MIMIRON_S_INFERNO, true); infernoTimer = 2000; } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp index cac88a9edb9..5282b4598ac 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp @@ -379,7 +379,9 @@ class boss_freya : public CreatureScript else Talk(SAY_AGGRO_WITH_ELDER); - me->CastCustomSpell(SPELL_ATTUNED_TO_NATURE, SPELLVALUE_AURA_STACK, 150, me, true); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddMod(SPELLVALUE_AURA_STACK, 150); + me->CastSpell(me, SPELL_ATTUNED_TO_NATURE, args); events.ScheduleEvent(EVENT_WAVE, 10000); events.ScheduleEvent(EVENT_EONAR_GIFT, 25000); @@ -754,7 +756,9 @@ class boss_elder_brightleaf : public CreatureScript uint8 stackAmount = 0; if (Aura* aura = me->GetAura(SPELL_FLUX_AURA)) stackAmount = aura->GetStackAmount(); - me->CastCustomSpell(SPELL_SOLAR_FLARE, SPELLVALUE_MAX_TARGETS, stackAmount, me, false); + CastSpellExtraArgs args; + args.SpellValueOverrides.AddMod(SPELLVALUE_MAX_TARGETS, stackAmount); + me->CastSpell(me, SPELL_SOLAR_FLARE, args); events.ScheduleEvent(EVENT_SOLAR_FLARE, urand(5000, 10000)); break; } @@ -839,8 +843,9 @@ class boss_elder_stonebark : public CreatureScript if (me->HasAura(SPELL_PETRIFIED_BARK)) { - int32 reflect = damage; - who->CastCustomSpell(who, SPELL_PETRIFIED_BARK_DMG, &reflect, nullptr, nullptr, true); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddBP0(damage); + who->CastSpell(who, SPELL_PETRIFIED_BARK_DMG, args); damage = 0; } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp index 09a4081c4f2..8e352cff3d3 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp @@ -465,7 +465,11 @@ class spell_general_vezax_mark_of_the_faceless : public SpellScriptLoader void HandleEffectPeriodic(AuraEffect const* aurEff) { if (Unit* caster = GetCaster()) - caster->CastCustomSpell(SPELL_MARK_OF_THE_FACELESS_DAMAGE, SPELLVALUE_BASE_POINT1, aurEff->GetAmount(), GetTarget(), true); + { + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT1, aurEff->GetAmount()); + caster->CastSpell(GetTarget(), SPELL_MARK_OF_THE_FACELESS_DAMAGE, args); + } } void Register() override @@ -528,9 +532,11 @@ class spell_general_vezax_saronite_vapors : public SpellScriptLoader if (Unit* caster = GetCaster()) { int32 mana = int32(aurEff->GetAmount() * std::pow(2.0f, GetStackAmount())); // mana restore - bp * 2^stackamount - int32 damage = mana * 2; - caster->CastCustomSpell(GetTarget(), SPELL_SARONITE_VAPORS_ENERGIZE, &mana, nullptr, nullptr, true); - caster->CastCustomSpell(GetTarget(), SPELL_SARONITE_VAPORS_DAMAGE, &damage, nullptr, nullptr, true); + CastSpellExtraArgs args1(TRIGGERED_FULL_MASK), args2(TRIGGERED_FULL_MASK); + args1.SpellValueOverrides.AddBP0(mana); + args2.SpellValueOverrides.AddBP0(mana * 2); + caster->CastSpell(GetTarget(), SPELL_SARONITE_VAPORS_ENERGIZE, args1); + caster->CastSpell(GetTarget(), SPELL_SARONITE_VAPORS_DAMAGE, args2); } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp index 0069920827a..8262a82012a 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp @@ -1051,7 +1051,9 @@ public: return; int32 damage = int32(200 * std::pow(2.0f, GetStackAmount())); - caster->CastCustomSpell(caster, SPELL_BITING_COLD_DAMAGE, &damage, nullptr, nullptr, true); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddBP0(damage); + caster->CastSpell(caster, SPELL_BITING_COLD_DAMAGE, args); if (caster->isMoving()) caster->RemoveAuraFromStack(SPELL_BITING_COLD_TRIGGERED); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp index 4e499f414b0..c1e521a4899 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp @@ -343,7 +343,7 @@ class spell_ulduar_rubble_summon : public SpellScriptLoader ObjectGuid originalCaster = caster->GetInstanceScript() ? caster->GetInstanceScript()->GetGuidData(BOSS_KOLOGARN) : ObjectGuid::Empty; uint32 spellId = GetEffectValue(); for (uint8 i = 0; i < 5; ++i) - caster->CastSpell(caster, spellId, true, nullptr, nullptr, originalCaster); + caster->CastSpell(caster, spellId, originalCaster); } void Register() override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp index 91e028c4873..331bd13be06 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp @@ -495,7 +495,7 @@ class boss_mimiron : public CreatureScript { case EVENT_SUMMON_FLAMES: if (Creature* worldtrigger = instance->GetCreature(DATA_MIMIRON_WORLD_TRIGGER)) - worldtrigger->CastCustomSpell(SPELL_SCRIPT_EFFECT_SUMMON_FLAMES_INITIAL, SPELLVALUE_MAX_TARGETS, 3, nullptr, true, nullptr, nullptr, me->GetGUID()); + worldtrigger->CastSpell(nullptr, SPELL_SCRIPT_EFFECT_SUMMON_FLAMES_INITIAL, CastSpellExtraArgs(me->GetGUID()).AddSpellMod(SPELLVALUE_MAX_TARGETS, 3)); events.RescheduleEvent(EVENT_SUMMON_FLAMES, 28000); break; case EVENT_INTRO_1: @@ -1234,15 +1234,15 @@ class boss_aerial_command_unit : public CreatureScript switch (eventId) { case EVENT_SUMMON_FIRE_BOTS: - me->CastCustomSpell(SPELL_SUMMON_FIRE_BOT_TRIGGER, SPELLVALUE_MAX_TARGETS, 3, nullptr, true); + DoCastAOE(SPELL_SUMMON_FIRE_BOT_TRIGGER, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_MAX_TARGETS, 3)); events.RescheduleEvent(EVENT_SUMMON_FIRE_BOTS, 45000, 0, PHASE_AERIAL_COMMAND_UNIT); break; case EVENT_SUMMON_JUNK_BOT: - me->CastCustomSpell(SPELL_SUMMON_JUNK_BOT_TRIGGER, SPELLVALUE_MAX_TARGETS, 1, nullptr, true); + DoCastAOE(SPELL_SUMMON_JUNK_BOT_TRIGGER, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_MAX_TARGETS, 1)); events.RescheduleEvent(EVENT_SUMMON_JUNK_BOT, urand(11000, 12000), 0, PHASE_AERIAL_COMMAND_UNIT); break; case EVENT_SUMMON_ASSAULT_BOT: - me->CastCustomSpell(SPELL_SUMMON_ASSAULT_BOT_TRIGGER, SPELLVALUE_MAX_TARGETS, 1, nullptr, true); + DoCastAOE(SPELL_SUMMON_ASSAULT_BOT_TRIGGER, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_MAX_TARGETS, 1)); events.RescheduleEvent(EVENT_SUMMON_ASSAULT_BOT, 30000, 0, PHASE_AERIAL_COMMAND_UNIT); break; case EVENT_SUMMON_BOMB_BOT: @@ -2143,7 +2143,7 @@ class spell_mimiron_rapid_burst : public SpellScriptLoader void HandleDummyTick(AuraEffect const* aurEff) { if (GetCaster()) - GetCaster()->CastSpell(GetTarget(), aurEff->GetTickNumber() % 2 == 0 ? SPELL_RAPID_BURST_RIGHT : SPELL_RAPID_BURST_LEFT, true, nullptr, aurEff); + GetCaster()->CastSpell(GetTarget(), aurEff->GetTickNumber() % 2 == 0 ? SPELL_RAPID_BURST_RIGHT : SPELL_RAPID_BURST_LEFT, aurEff); } void Register() override @@ -2191,7 +2191,7 @@ class spell_mimiron_rocket_strike : public SpellScriptLoader void HandleDummy(SpellEffIndex /*effIndex*/) { - GetHitUnit()->CastSpell(nullptr, SPELL_SCRIPT_EFFECT_ROCKET_STRIKE, true, nullptr, nullptr, GetCaster()->GetGUID()); + GetHitUnit()->CastSpell(nullptr, SPELL_SCRIPT_EFFECT_ROCKET_STRIKE, GetCaster()->GetGUID()); } void Register() override @@ -2289,7 +2289,7 @@ class spell_mimiron_rocket_strike_target_select : public SpellScriptLoader void HandleScript(SpellEffIndex /*effIndex*/) { if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - GetCaster()->CastSpell(GetHitUnit(), SPELL_SUMMON_ROCKET_STRIKE, true, nullptr, nullptr, instance->GetGuidData(DATA_VX_001)); + GetCaster()->CastSpell(GetHitUnit(), SPELL_SUMMON_ROCKET_STRIKE, instance->GetGuidData(DATA_VX_001)); GetCaster()->SetDisplayId(11686); } @@ -2354,7 +2354,7 @@ class spell_mimiron_summon_assault_bot : public SpellScriptLoader if (Unit* caster = GetCaster()) if (InstanceScript* instance = caster->GetInstanceScript()) if (instance->GetBossState(BOSS_MIMIRON) == IN_PROGRESS) - caster->CastSpell(caster, SPELL_SUMMON_ASSAULT_BOT, false, nullptr, aurEff, instance->GetGuidData(DATA_AERIAL_COMMAND_UNIT)); + caster->CastSpell(caster, SPELL_SUMMON_ASSAULT_BOT, { aurEff, instance->GetGuidData(DATA_AERIAL_COMMAND_UNIT) }); } void Register() override @@ -2421,7 +2421,7 @@ class spell_mimiron_summon_fire_bot : public SpellScriptLoader if (Unit* caster = GetCaster()) if (InstanceScript* instance = caster->GetInstanceScript()) if (instance->GetBossState(BOSS_MIMIRON) == IN_PROGRESS) - caster->CastSpell(caster, SPELL_SUMMON_FIRE_BOT, false, nullptr, aurEff, instance->GetGuidData(DATA_AERIAL_COMMAND_UNIT)); + caster->CastSpell(caster, SPELL_SUMMON_FIRE_BOT, { aurEff, instance->GetGuidData(DATA_AERIAL_COMMAND_UNIT) }); } void Register() override @@ -2609,7 +2609,7 @@ class spell_mimiron_summon_junk_bot : public SpellScriptLoader if (Unit* caster = GetCaster()) if (InstanceScript* instance = caster->GetInstanceScript()) if (instance->GetBossState(BOSS_MIMIRON) == IN_PROGRESS) - caster->CastSpell(caster, SPELL_SUMMON_JUNK_BOT, false, nullptr, aurEff, instance->GetGuidData(DATA_AERIAL_COMMAND_UNIT)); + caster->CastSpell(caster, SPELL_SUMMON_JUNK_BOT, { aurEff, instance->GetGuidData(DATA_AERIAL_COMMAND_UNIT) }); } void Register() override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp index 758b9cf2b6f..b973e63159b 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp @@ -961,7 +961,7 @@ class spell_xt002_heart_overload_periodic : public SpellScriptLoader { uint8 a = urand(0, 4); uint32 spellId = spells[a]; - toyPile->CastSpell(toyPile, spellId, true, nullptr, nullptr, instance->GetGuidData(BOSS_XT002)); + toyPile->CastSpell(toyPile, spellId, instance->GetGuidData(BOSS_XT002)); } } } 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 244683d8994..7d7ededb054 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -518,7 +518,7 @@ class boss_voice_of_yogg_saron : public CreatureScript instance->DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); - me->CastCustomSpell(SPELL_SUMMON_GUARDIAN_2, SPELLVALUE_MAX_TARGETS, 1); + DoCastAOE(SPELL_SUMMON_GUARDIAN_2, { SPELLVALUE_MAX_TARGETS, 1 }); DoCast(me, SPELL_SANITY_PERIODIC); events.ScheduleEvent(EVENT_LOCK_DOOR, 15000); @@ -562,7 +562,7 @@ class boss_voice_of_yogg_saron : public CreatureScript events.ScheduleEvent(EVENT_EXTINGUISH_ALL_LIFE, 10000); // cast it again after a short while, players can survive break; case EVENT_SUMMON_GUARDIAN_OF_YOGG_SARON: - me->CastCustomSpell(SPELL_SUMMON_GUARDIAN_2, SPELLVALUE_MAX_TARGETS, 1); + DoCastAOE(SPELL_SUMMON_GUARDIAN_2, { SPELLVALUE_MAX_TARGETS, 1 }); ++_guardiansCount; if (_guardiansCount <= 6 && _guardiansCount % 3 == 0) _guardianTimer -= 5000; @@ -573,7 +573,7 @@ class boss_voice_of_yogg_saron : public CreatureScript events.ScheduleEvent(EVENT_SUMMON_CORRUPTOR_TENTACLE, 30000, EVENT_GROUP_SUMMON_TENTACLES, PHASE_TWO); break; case EVENT_SUMMON_CONSTRICTOR_TENTACLE: - me->CastCustomSpell(SPELL_CONSTRICTOR_TENTACLE, SPELLVALUE_MAX_TARGETS, 1); + DoCastAOE(SPELL_CONSTRICTOR_TENTACLE, { SPELLVALUE_MAX_TARGETS, 1 }); events.ScheduleEvent(EVENT_SUMMON_CONSTRICTOR_TENTACLE, 25000, EVENT_GROUP_SUMMON_TENTACLES, PHASE_TWO); break; case EVENT_SUMMON_CRUSHER_TENTACLE: @@ -795,15 +795,15 @@ class boss_sara : public CreatureScript switch (eventId) { case EVENT_SARAS_FERVOR: - me->CastCustomSpell(SPELL_SARAS_FERVOR_TARGET_SELECTOR, SPELLVALUE_MAX_TARGETS, 1); + DoCastAOE(SPELL_SARAS_FERVOR_TARGET_SELECTOR, { SPELLVALUE_MAX_TARGETS, 1 }); _events.ScheduleEvent(EVENT_SARAS_FERVOR, 6000, 0, PHASE_ONE); break; case EVENT_SARAS_ANGER: - me->CastCustomSpell(SPELL_SARAS_ANGER_TARGET_SELECTOR, SPELLVALUE_MAX_TARGETS, 1); + DoCastAOE(SPELL_SARAS_ANGER_TARGET_SELECTOR, { SPELLVALUE_MAX_TARGETS, 1 }); _events.ScheduleEvent(EVENT_SARAS_ANGER, urand(6000, 8000), 0, PHASE_ONE); break; case EVENT_SARAS_BLESSING: - me->CastCustomSpell(SPELL_SARAS_BLESSING_TARGET_SELECTOR, SPELLVALUE_MAX_TARGETS, 1); + DoCastAOE(SPELL_SARAS_BLESSING_TARGET_SELECTOR, { SPELLVALUE_MAX_TARGETS, 1 }); _events.ScheduleEvent(EVENT_SARAS_BLESSING, urand(6000, 30000), 0, PHASE_ONE); break; case EVENT_TRANSFORM_1: @@ -837,15 +837,15 @@ class boss_sara : public CreatureScript _events.ScheduleEvent(EVENT_DEATH_RAY, 21000, 0, PHASE_TWO); break; case EVENT_MALADY_OF_THE_MIND: - me->CastCustomSpell(SPELL_MALADY_OF_THE_MIND, SPELLVALUE_MAX_TARGETS, 1); + DoCastAOE(SPELL_MALADY_OF_THE_MIND, { SPELLVALUE_MAX_TARGETS, 1 }); _events.ScheduleEvent(EVENT_MALADY_OF_THE_MIND, urand(18000, 25000), 0, PHASE_TWO); break; case EVENT_PSYCHOSIS: - me->CastCustomSpell(SPELL_PSYCHOSIS, SPELLVALUE_MAX_TARGETS, 1); + DoCastAOE(SPELL_PSYCHOSIS, { SPELLVALUE_MAX_TARGETS, 1 }); _events.ScheduleEvent(EVENT_PSYCHOSIS, 4000, 0, PHASE_TWO); break; case EVENT_BRAIN_LINK: - me->CastCustomSpell(SPELL_BRAIN_LINK, SPELLVALUE_MAX_TARGETS, 2); + DoCastAOE(SPELL_BRAIN_LINK, { SPELLVALUE_MAX_TARGETS, 2 }); _events.ScheduleEvent(EVENT_BRAIN_LINK, urand(23000, 26000), 0, PHASE_TWO); break; default: @@ -1641,7 +1641,7 @@ class npc_yogg_saron_keeper : public CreatureScript switch (eventId) { case EVENT_DESTABILIZATION_MATRIX: - me->CastCustomSpell(SPELL_DESTABILIZATION_MATRIX, SPELLVALUE_MAX_TARGETS, 1); + DoCastAOE(SPELL_DESTABILIZATION_MATRIX, { SPELLVALUE_MAX_TARGETS, 1 }); _events.ScheduleEvent(EVENT_DESTABILIZATION_MATRIX, urand(15000, 25000), 0, PHASE_TWO); break; case EVENT_HODIRS_PROTECTIVE_GAZE: @@ -2495,7 +2495,9 @@ class spell_yogg_saron_empowered : public SpellScriptLoader // 64161 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - GetTarget()->CastCustomSpell(SPELL_EMPOWERED_BUFF, SPELLVALUE_AURA_STACK, 9, GetTarget(), TRIGGERED_FULL_MASK); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddMod(SPELLVALUE_AURA_STACK, 9); + GetTarget()->CastSpell(GetTarget(), SPELL_EMPOWERED_BUFF, args); } void OnPeriodic(AuraEffect const* /*aurEff*/) @@ -2507,7 +2509,9 @@ class spell_yogg_saron_empowered : public SpellScriptLoader // 64161 if (stack) { target->RemoveAurasDueToSpell(SPELL_WEAKENED); - target->CastCustomSpell(SPELL_EMPOWERED_BUFF, SPELLVALUE_AURA_STACK, stack, target, TRIGGERED_FULL_MASK); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddMod(SPELLVALUE_AURA_STACK, stack); + target->CastSpell(target, SPELL_EMPOWERED_BUFF, args); } else if (!target->HealthAbovePct(1) && !target->HasAura(SPELL_WEAKENED)) target->CastSpell(target, SPELL_WEAKENED, true); @@ -2735,8 +2739,9 @@ class spell_yogg_saron_grim_reprisal : public SpellScriptLoader // 63305 if (!damageInfo || !damageInfo->GetDamage()) return; - int32 damage = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), 60); - GetTarget()->CastCustomSpell(SPELL_GRIM_REPRISAL_DAMAGE, SPELLVALUE_BASE_POINT0, damage, damageInfo->GetAttacker(), true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(CalculatePct(damageInfo->GetDamage(), 60)); + GetTarget()->CastSpell(damageInfo->GetAttacker(), SPELL_GRIM_REPRISAL_DAMAGE, args); } void Register() override diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp index 3252ca42baf..329a793e76a 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp @@ -470,7 +470,7 @@ class spell_ingvar_woe_strike : public SpellScriptLoader void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetActor(), SPELL_WOE_STRIKE_EFFECT, true, nullptr, aurEff); + GetTarget()->CastSpell(eventInfo.GetActor(), SPELL_WOE_STRIKE_EFFECT, aurEff); } void Register() override diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp index cbd69caf365..4dcba5d18ba 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp @@ -223,7 +223,7 @@ class spell_uk_second_wind : public SpellScriptLoader { PreventDefaultAction(); Unit* caster = eventInfo.GetActionTarget(); - caster->CastSpell(caster, SPELL_SECOND_WIND_TRIGGER, true, nullptr, aurEff); + caster->CastSpell(caster, SPELL_SECOND_WIND_TRIGGER, aurEff); } void Register() override diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp index f23e8fe27dc..1600591844d 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp @@ -132,7 +132,7 @@ public: bool Execute(uint64 /*eventTime*/, uint32 /*diff*/) override { - _owner->CastCustomSpell(SPELL_AWAKEN_SUBBOSS, SPELLVALUE_MAX_TARGETS, 1, _owner); + _owner->CastSpell(_owner, SPELL_AWAKEN_SUBBOSS, { SPELLVALUE_MAX_TARGETS, 1 }); return true; } @@ -287,7 +287,7 @@ public: if (_encountersCount == _dungeonMode) orb->CastSpell(orb, SPELL_AWAKEN_GORTOK, true); else - orb->CastCustomSpell(SPELL_AWAKEN_SUBBOSS, SPELLVALUE_MAX_TARGETS, 1, orb, true); + orb->CastSpell(orb, SPELL_AWAKEN_SUBBOSS, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_MAX_TARGETS, 1)); break; } case ACTION_START_FIGHT: diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp index ec904c0cf11..625ae8dffdf 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp @@ -201,7 +201,7 @@ class spell_koralon_meteor_fists : public SpellScriptLoader void TriggerFists(AuraEffect* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_METEOR_FISTS_DAMAGE, true, nullptr, aurEff); + GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_METEOR_FISTS_DAMAGE, aurEff); } void Register() override @@ -276,7 +276,7 @@ class spell_flame_warder_meteor_fists : public SpellScriptLoader void TriggerFists(AuraEffect* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_FW_METEOR_FISTS_DAMAGE, true, nullptr, aurEff); + GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_FW_METEOR_FISTS_DAMAGE, aurEff); } void Register() override diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp index acd2e3bd604..2004e9b0574 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp @@ -78,9 +78,11 @@ struct boss_toravon : public BossAI switch (eventId) { case EVENT_FROZEN_ORB: - me->CastCustomSpell(SPELL_FROZEN_ORB, SPELLVALUE_MAX_TARGETS, RAID_MODE(1, 3), me); + { + me->CastSpell(me, SPELL_FROZEN_ORB, CastSpellExtraArgs().AddSpellMod(SPELLVALUE_MAX_TARGETS, RAID_MODE(1, 3))); events.Repeat(Seconds(32)); break; + } case EVENT_WHITEOUT: DoCastSelf(SPELL_WHITEOUT); events.Repeat(Seconds(38)); diff --git a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp index 5046342118e..db2946ce825 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp @@ -109,7 +109,7 @@ class spell_moragg_ray : public SpellScriptLoader if (Unit* target = GetTarget()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true)) { uint32 triggerSpell = aurEff->GetSpellEffectInfo()->TriggerSpell; - GetTarget()->CastSpell(target, triggerSpell, TRIGGERED_FULL_MASK, nullptr, aurEff); + GetTarget()->CastSpell(target, triggerSpell, aurEff); } } @@ -149,12 +149,12 @@ public: if (Unit* caster = GetCaster()) { if (aurEff->GetTickNumber() >= 8) - caster->CastSpell(GetTarget(), SPELL_OPTIC_LINK_LEVEL_3, TRIGGERED_FULL_MASK, nullptr, aurEff); + caster->CastSpell(GetTarget(), SPELL_OPTIC_LINK_LEVEL_3, aurEff); if (aurEff->GetTickNumber() >= 4) - caster->CastSpell(GetTarget(), SPELL_OPTIC_LINK_LEVEL_2, TRIGGERED_FULL_MASK, nullptr, aurEff); + caster->CastSpell(GetTarget(), SPELL_OPTIC_LINK_LEVEL_2, aurEff); - caster->CastSpell(GetTarget(), SPELL_OPTIC_LINK_LEVEL_1, TRIGGERED_FULL_MASK, nullptr, aurEff); + caster->CastSpell(GetTarget(), SPELL_OPTIC_LINK_LEVEL_1, aurEff); } } diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp index efe6943e3c3..1e8a13dbc33 100644 --- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp +++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp @@ -97,7 +97,7 @@ public: break; case 1: Talk(SAY_WP_3); - me->CastSpell(5918.33f, 5372.91f, -98.770f, SPELL_EXPLODE_CRYSTAL, true); + me->CastSpell({ 5918.33f, 5372.91f, -98.770f }, SPELL_EXPLODE_CRYSTAL, true); me->SummonGameObject(184743, 5918.33f, 5372.91f, -98.770f, 0, QuaternionData(), TEMPSUMMON_MANUAL_DESPAWN); //approx 3 to 4 seconds me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH); break; @@ -108,7 +108,7 @@ public: Talk(SAY_WP_5); break; case 8: - me->CastSpell(5887.37f, 5379.39f, -91.289f, SPELL_EXPLODE_CRYSTAL, true); + me->CastSpell({ 5887.37f, 5379.39f, -91.289f }, SPELL_EXPLODE_CRYSTAL, true); me->SummonGameObject(184743, 5887.37f, 5379.39f, -91.289f, 0, QuaternionData(), TEMPSUMMON_MANUAL_DESPAWN); //approx 3 to 4 seconds me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH); break; diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp index e84d65c9349..3232b66fb76 100644 --- a/src/server/scripts/Northrend/zone_storm_peaks.cpp +++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp @@ -829,7 +829,7 @@ public: if (seatId != SEAT_INITIAL) return; - me->CastCustomSpell(SPELL_GRIP, SPELLVALUE_AURA_STACK, 50); + me->CastSpell(nullptr, SPELL_GRIP, CastSpellExtraArgs().AddSpellMod(SPELLVALUE_AURA_STACK, 50)); DoCastAOE(SPELL_CLAW_SWIPE_PERIODIC); _scheduler.Async([this] diff --git a/src/server/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp index c5340b4e5e7..7c95c8d17b2 100644 --- a/src/server/scripts/Northrend/zone_zuldrak.cpp +++ b/src/server/scripts/Northrend/zone_zuldrak.cpp @@ -746,7 +746,7 @@ class spell_random_ingredient : public SpellScriptLoader if (Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f)) { - finklestein->CastSpell(player, FetchIngredients[ingredient][0], true, nullptr); + finklestein->CastSpell(player, FetchIngredients[ingredient][0], true); finklestein->AI()->Talk(FetchIngredients[ingredient][3], player); } } diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.cpp index 127d97bd007..a6fab624db4 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.cpp @@ -45,7 +45,7 @@ class spell_mark_of_malice : public SpellScriptLoader if (GetCharges() > 1) return; - GetTarget()->CastSpell(GetTarget(), SPELL_MARK_OF_MALICE_TRIGGERED, true, nullptr, aurEff); + GetTarget()->CastSpell(GetTarget(), SPELL_MARK_OF_MALICE_TRIGGERED, aurEff); } void Register() override diff --git a/src/server/scripts/Outland/BlackTemple/black_temple.cpp b/src/server/scripts/Outland/BlackTemple/black_temple.cpp index 14e83d45ffe..e75a8448f2a 100644 --- a/src/server/scripts/Outland/BlackTemple/black_temple.cpp +++ b/src/server/scripts/Outland/BlackTemple/black_temple.cpp @@ -264,7 +264,7 @@ class spell_illidari_nightlord_shadow_inferno : public AuraScript { PreventDefaultAction(); int32 bp = aurEffect->GetTickNumber() * aurEffect->GetAmount(); - GetUnitOwner()->CastCustomSpell(SPELL_SHADOW_INFERNO_DAMAGE, SPELLVALUE_BASE_POINT0, bp, GetUnitOwner(), true); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SHADOW_INFERNO_DAMAGE, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellBP0(bp)); } void Register() override diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp index 4e9d325d9b0..cf1068c8464 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp @@ -460,8 +460,7 @@ struct boss_lady_malande : public IllidariCouncilBossAI void HealReceived(Unit* /*who*/, uint32& addhealth) override { // Need be negative to heal trigger - int32 bp = addhealth * (-1); - me->CastCustomSpell(SPELL_SHARED_RULE, SPELLVALUE_BASE_POINT0, bp, nullptr, true); + me->CastSpell(nullptr, SPELL_SHARED_RULE, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellBP0(-int32(addhealth))); } void ExecuteEvent(uint32 eventId) override @@ -607,8 +606,7 @@ class spell_illidari_council_balance_of_power : public AuraScript void Absorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& /*absorbAmount*/) { PreventDefaultAction(); - int32 bp = dmgInfo.GetDamage(); - GetTarget()->CastCustomSpell(SPELL_SHARED_RULE, SPELLVALUE_BASE_POINT0, bp, nullptr, true, nullptr, aurEff); + GetTarget()->CastSpell(nullptr, SPELL_SHARED_RULE, CastSpellExtraArgs(aurEff).AddSpellBP0(dmgInfo.GetDamage())); } void Register() override @@ -632,7 +630,7 @@ class spell_illidari_council_deadly_strike : public AuraScript PreventDefaultAction(); if (Unit* victim = GetTarget()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0)) - GetTarget()->CastSpell(victim, SPELL_DEADLY_POISON, true, nullptr, aurEff); + GetTarget()->CastSpell(victim, SPELL_DEADLY_POISON, aurEff); } void Register() override @@ -679,8 +677,7 @@ class spell_illidari_council_reflective_shield : public AuraScript if (dmgInfo.GetAttacker() == target) return; - int32 bp = absorbAmount / 2; - target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_REFLECTIVE_SHIELD_DAMAGE, &bp, nullptr, nullptr, true, nullptr, aurEff); + target->CastSpell(dmgInfo.GetAttacker(), SPELL_REFLECTIVE_SHIELD_DAMAGE, CastSpellExtraArgs(aurEff).AddSpellBP0(absorbAmount/2)); } void Register() override diff --git a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp index 9425a218cbd..655506ad2bf 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp @@ -42,7 +42,7 @@ enum Spells SPELL_FATAL_ATTRACTION_DAMAGE = 40871, SPELL_SILENCING_SHRIEK = 40823, SPELL_SABER_LASH_IMMUNITY = 43690, - SPELL_FATAL_ATTACTION_TELEPORT = 40869, + SPELL_FATAL_ATTRACTION_TELEPORT = 40869, SPELL_BERSERK = 45078, SPELL_FATAL_ATTRACTION = 41001, SPELL_SINISTER_PERIODIC = 40863, @@ -173,7 +173,7 @@ struct boss_mother_shahraz : public BossAI break; case EVENT_FATAL_ATTRACTION: Talk(SAY_SPELL); - me->CastCustomSpell(SPELL_FATAL_ATTACTION_TELEPORT, SPELLVALUE_MAX_TARGETS, 3, me); + DoCastSelf(SPELL_FATAL_ATTRACTION_TELEPORT, { SPELLVALUE_MAX_TARGETS, 3 }); events.Repeat(Seconds(30)); break; case EVENT_SILENCING_SHRIEK: diff --git a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp index 21d240728d9..98f8e278990 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp @@ -379,7 +379,7 @@ struct boss_essence_of_suffering : public BossAI switch (eventId) { case EVENT_SOUL_DRAIN: - me->CastCustomSpell(SPELL_SOUL_DRAIN, SPELLVALUE_MAX_TARGETS, 5, me); + DoCastSelf(SPELL_SOUL_DRAIN, { SPELLVALUE_MAX_TARGETS, 5 }); events.Repeat(Seconds(30), Seconds(35)); break; case EVENT_FRENZY: @@ -583,7 +583,7 @@ struct boss_essence_of_anger : public BossAI break; case EVENT_SPITE: Talk(ANGER_SAY_SPITE); - me->CastCustomSpell(SPELL_SPITE, SPELLVALUE_MAX_TARGETS, 3, me); + DoCastSelf(SPELL_SPITE, { SPELLVALUE_MAX_TARGETS, 3 }); events.Repeat(Seconds(20)); break; case EVENT_START_CHECK_TANKER: @@ -682,8 +682,7 @@ class spell_reliquary_of_souls_aura_of_desire : public AuraScript return; Unit* caster = eventInfo.GetActor(); - int32 bp = damageInfo->GetDamage() / 2; - caster->CastCustomSpell(SPELL_AURA_OF_DESIRE_DAMAGE, SPELLVALUE_BASE_POINT0, bp, caster, true, nullptr, aurEff); + caster->CastSpell(caster, SPELL_AURA_OF_DESIRE_DAMAGE, CastSpellExtraArgs(aurEff).AddSpellBP0(damageInfo->GetDamage() / 2)); } void UpdateAmount(AuraEffect* /*aurEff*/) diff --git a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp index aeb35728456..3f48e84c54a 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp @@ -199,7 +199,7 @@ struct boss_teron_gorefiend : public BossAI events.Repeat(Seconds(30), Seconds(35)); break; case EVENT_CRUSHING_SHADOWS: - me->CastCustomSpell(SPELL_CRUSHING_SHADOWS, SPELLVALUE_MAX_TARGETS, 5, me); + DoCastSelf(SPELL_CRUSHING_SHADOWS, { SPELLVALUE_MAX_TARGETS, 5 }); Talk(SAY_CRUSHING); events.Repeat(Seconds(18), Seconds(30)); break; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp index 8888ed12707..2351119626d 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp @@ -514,8 +514,7 @@ public: if (me->IsWithinDist(me->GetVictim(), 30)) { //DoCastVictim(SPELL_CHAOS_BLAST, true); - int damage = 100; - me->CastCustomSpell(me->GetVictim(), SPELL_CHAOS_BLAST, &damage, nullptr, nullptr, false, nullptr, nullptr, me->GetGUID()); + me->CastSpell(me->GetVictim(), SPELL_CHAOS_BLAST, CastSpellExtraArgs().SetOriginalCaster(me->GetGUID()).AddSpellBP0(100)); } ChaosBlast_Timer = 3000; } else ChaosBlast_Timer -= diff; @@ -671,8 +670,7 @@ public: if (me->IsWithinDist(me->GetVictim(), 30)) { //DoCastVictim(SPELL_CHAOS_BLAST, true); - int damage = 100; - me->CastCustomSpell(me->GetVictim(), SPELL_CHAOS_BLAST, &damage, nullptr, nullptr, false, nullptr, nullptr, me->GetGUID()); + me->CastSpell(me->GetVictim(), SPELL_CHAOS_BLAST, CastSpellExtraArgs().SetOriginalCaster(me->GetGUID()).AddSpellBP0(100)); ChaosBlast_Timer = 3000; } } else ChaosBlast_Timer -= diff; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp index 44fbabf16e1..20d1b186949 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp @@ -436,9 +436,8 @@ public: if (ShootBowTimer <= diff) { - int bp0 = 1100; if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->CastCustomSpell(target, SPELL_SHOOT, &bp0, nullptr, nullptr, true); + me->CastSpell(target, SPELL_SHOOT, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellBP0(1100)); ShootBowTimer = 4000 + rand32() % 5000; MultiShotTimer += 1500; // add global cooldown } else ShootBowTimer -= diff; diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp index 46bf1018822..10087f0b1bf 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp @@ -1015,7 +1015,7 @@ public: void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - GetCaster()->CastSpell(GetHitDest()->GetPositionX(), GetHitDest()->GetPositionY(), GetHitDest()->GetPositionZ(), SPELL_ICE_BOMBARDMENT, true); + GetCaster()->CastSpell(GetHitDest()->GetPosition(), SPELL_ICE_BOMBARDMENT, true); } void Register() override diff --git a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp index 038dc187265..2ac442674ce 100644 --- a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp +++ b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp @@ -133,11 +133,11 @@ class boss_gruul : public CreatureScript switch (urand(0, 1)) { case 0: - target->CastSpell(target, SPELL_MAGNETIC_PULL, true, nullptr, nullptr, me->GetGUID()); + target->CastSpell(target, SPELL_MAGNETIC_PULL, me->GetGUID()); break; case 1: - target->CastSpell(target, SPELL_KNOCK_BACK, true, nullptr, nullptr, me->GetGUID()); + target->CastSpell(target, SPELL_KNOCK_BACK, me->GetGUID()); break; } } diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp index f8ae540f12e..a82ba283d18 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp @@ -183,7 +183,7 @@ class spell_broggok_poison_cloud : public SpellScriptLoader uint32 triggerSpell = aurEff->GetSpellEffectInfo()->TriggerSpell; int32 mod = int32(((float(aurEff->GetTickNumber()) / aurEff->GetTotalTicks()) * 0.9f + 0.1f) * 10000 * 2 / 3); - GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_RADIUS_MOD, mod, nullptr, TRIGGERED_FULL_MASK, nullptr, aurEff); + GetTarget()->CastSpell(nullptr, triggerSpell, CastSpellExtraArgs(aurEff).AddSpellMod(SPELLVALUE_RADIUS_MOD, mod)); } void Register() override diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp index 2e7cf22c93c..9daac72a439 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp @@ -237,11 +237,11 @@ class boss_magtheridon : public CreatureScript events.Repeat(Seconds(10)); break; case EVENT_BLAZE: - me->CastCustomSpell(SPELL_BLAZE_TARGET, SPELLVALUE_MAX_TARGETS, 1); + DoCastAOE(SPELL_BLAZE_TARGET, { SPELLVALUE_MAX_TARGETS, 1 }); events.Repeat(Seconds(20)); break; case EVENT_QUAKE: - me->CastCustomSpell(SPELL_QUAKE, SPELLVALUE_MAX_TARGETS, 5); + DoCastAOE(SPELL_QUAKE, { SPELLVALUE_MAX_TARGETS, 5 }); events.Repeat(Seconds(60)); break; case EVENT_START_FIGHT: diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp index d01ebea8b89..e44dfd8c9c1 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp @@ -213,7 +213,7 @@ class boss_grand_warlock_nethekurse : public CreatureScript //triggered spell of consumption does not properly show it's SpellVisual, wrong spellid? summoned->CastSpell(summoned, SPELL_TEMPORARY_VISUAL, true); - summoned->CastSpell(summoned, SPELL_CONSUMPTION, false, nullptr, nullptr, me->GetGUID()); + summoned->CastSpell(summoned, SPELL_CONSUMPTION, CastSpellExtraArgs().SetOriginalCaster(me->GetGUID())); } void KilledUnit(Unit* /*victim*/) override diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp index e77c250ecff..185247c7225 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp @@ -608,7 +608,7 @@ class spell_alar_flame_quills : public AuraScript // cast 24 spells 34269-34289, 34314-34316 for (uint32 spellId : flameQuillsSpells) - GetTarget()->CastSpell(nullptr, spellId, true, nullptr, aurEff); + GetTarget()->CastSpell(nullptr, spellId, aurEff); } void Register() override diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp index 480080dbca5..2a1592b6a6c 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp @@ -126,7 +126,7 @@ class boss_void_reaver : public CreatureScript target = me->GetVictim(); if (target) - me->CastSpell(target, SPELL_ARCANE_ORB, false, nullptr, nullptr); + me->CastSpell(target, SPELL_ARCANE_ORB); events.ScheduleEvent(EVENT_ARCANE_ORB, 3000); break; diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp index 64ab74754ec..9820ba7d654 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp @@ -244,7 +244,7 @@ class spell_capacitus_polarity_shift : public SpellScriptLoader Unit* target = GetHitUnit(); Unit* caster = GetCaster(); - target->CastSpell(target, roll_chance_i(50) ? SPELL_POSITIVE_POLARITY : SPELL_NEGATIVE_POLARITY, true, nullptr, nullptr, caster->GetGUID()); + target->CastSpell(target, roll_chance_i(50) ? SPELL_POSITIVE_POLARITY : SPELL_NEGATIVE_POLARITY, caster->GetGUID()); } void Register() override diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp index 0665d3f3fb7..f09f2007262 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp @@ -107,7 +107,7 @@ class npc_warp_splinter_treant : public CreatureScript if (me->IsWithinMeleeRange(Warp)) { int32 CurrentHP_Treant = (int32)me->GetHealth(); - Warp->CastCustomSpell(Warp, SPELL_HEAL_FATHER, &CurrentHP_Treant, nullptr, nullptr, true, nullptr, nullptr, me->GetGUID()); + Warp->CastSpell(Warp, SPELL_HEAL_FATHER, CastSpellExtraArgs(me->GetGUID()).AddSpellBP0(CurrentHP_Treant)); me->DealDamage(me, me->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false); return; } diff --git a/src/server/scripts/Outland/boss_doomlord_kazzak.cpp b/src/server/scripts/Outland/boss_doomlord_kazzak.cpp index 188b7544753..ee0d90b12f0 100644 --- a/src/server/scripts/Outland/boss_doomlord_kazzak.cpp +++ b/src/server/scripts/Outland/boss_doomlord_kazzak.cpp @@ -200,7 +200,7 @@ class spell_mark_of_kazzak : public SpellScriptLoader if (target->GetPower(POWER_MANA) == 0) { - target->CastSpell(target, SPELL_MARK_OF_KAZZAK_DAMAGE, true, nullptr, aurEff); + target->CastSpell(target, SPELL_MARK_OF_KAZZAK_DAMAGE, aurEff); // Remove aura SetDuration(0); } @@ -240,7 +240,7 @@ class spell_twisted_reflection : public SpellScriptLoader if (!damageInfo || !damageInfo->GetDamage()) return; - eventInfo.GetActionTarget()->CastSpell(eventInfo.GetActor(), SPELL_TWISTED_REFLECTION_HEAL, true, nullptr, aurEff); + eventInfo.GetActionTarget()->CastSpell(eventInfo.GetActor(), SPELL_TWISTED_REFLECTION_HEAL, aurEff); } void Register() override diff --git a/src/server/scripts/Outland/boss_doomwalker.cpp b/src/server/scripts/Outland/boss_doomwalker.cpp index e3014776f5c..a73159c4a78 100644 --- a/src/server/scripts/Outland/boss_doomwalker.cpp +++ b/src/server/scripts/Outland/boss_doomwalker.cpp @@ -77,7 +77,7 @@ class boss_doomwalker : public CreatureScript void KilledUnit(Unit* victim) override { - victim->CastSpell(victim, SPELL_MARK_DEATH, 0); + victim->CastSpell(victim, SPELL_MARK_DEATH, true); if (urand(0, 4)) return; diff --git a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp index 78791aa4faf..a3fc4d1bfc9 100644 --- a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp +++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp @@ -849,7 +849,7 @@ class npc_simon_bunny : public CreatureScript if (spell->Id == SPELL_BAD_PRESS_TRIGGER) { int32 bp = (int32)((float)(fails)*0.33f*target->GetMaxHealth()); - target->CastCustomSpell(target, SPELL_BAD_PRESS_DAMAGE, &bp, nullptr, nullptr, true); + target->CastSpell(target, SPELL_BAD_PRESS_DAMAGE, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellBP0(bp)); } } diff --git a/src/server/scripts/Spells/spell_dh.cpp b/src/server/scripts/Spells/spell_dh.cpp index b143cc23e97..ea4a389834a 100644 --- a/src/server/scripts/Spells/spell_dh.cpp +++ b/src/server/scripts/Spells/spell_dh.cpp @@ -44,7 +44,7 @@ class spell_dh_chaos_strike : public AuraScript void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/) { PreventDefaultAction(); - GetTarget()->CastCustomSpell(SPELL_CHAOS_STRIKE_ENERGIZE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, nullptr, aurEff); + GetTarget()->CastSpell(GetTarget(), SPELL_CHAOS_STRIKE_ENERGIZE, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellBP0(aurEff->GetAmount()).SetTriggeringAura(aurEff)); } void Register() override diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 8519a42b06a..0f59df198c1 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -144,8 +144,9 @@ public: if (!GetTarget()->HasAura(SPELL_DK_VOLATILE_SHIELDING)) { - int32 bp = 2 * absorbAmount * 100 / maxHealth; - GetTarget()->CastCustomSpell(SPELL_DK_RUNIC_POWER_ENERGIZE, SPELLVALUE_BASE_POINT0, bp, GetTarget(), true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(CalculatePct(absorbAmount, 2 * absorbAmount * 100 / maxHealth)); + GetTarget()->CastSpell(GetTarget(), SPELL_DK_RUNIC_POWER_ENERGIZE, args); } } @@ -153,8 +154,9 @@ public: { if (AuraEffect const* volatileShielding = GetTarget()->GetAuraEffect(SPELL_DK_VOLATILE_SHIELDING, EFFECT_1)) { - int32 damage = CalculatePct(absorbedAmount, volatileShielding->GetAmount()); - GetTarget()->CastCustomSpell(SPELL_DK_VOLATILE_SHIELDING_DAMAGE, SPELLVALUE_BASE_POINT0, damage, nullptr, TRIGGERED_FULL_MASK, nullptr, volatileShielding); + CastSpellExtraArgs args(volatileShielding); + args.AddSpellMod(SPELLVALUE_BASE_POINT0, CalculatePct(absorbedAmount, volatileShielding->GetAmount())); + GetTarget()->CastSpell(nullptr, SPELL_DK_VOLATILE_SHIELDING_DAMAGE, args); } } @@ -308,7 +310,7 @@ class spell_dk_death_and_decay : public SpellScript { if (GetCaster()->HasAura(SPELL_DK_TIGHTENING_GRASP)) if (WorldLocation const* pos = GetExplTargetDest()) - GetCaster()->CastSpell(pos->GetPositionX(), pos->GetPositionY(), pos->GetPositionZ(), SPELL_DK_TIGHTENING_GRASP_SLOW, true); + GetCaster()->CastSpell(*pos, SPELL_DK_TIGHTENING_GRASP_SLOW, true); } void Register() override @@ -325,7 +327,7 @@ class spell_dk_death_and_decay_AuraScript : public AuraScript void HandleDummyTick(AuraEffect const* aurEff) { if (Unit* caster = GetCaster()) - caster->CastSpell(GetTarget(), SPELL_DK_DEATH_AND_DECAY_DAMAGE, true, nullptr, aurEff); + caster->CastSpell(GetTarget(), SPELL_DK_DEATH_AND_DECAY_DAMAGE, aurEff); } void Register() override @@ -349,7 +351,7 @@ class spell_dk_death_coil : public SpellScript Unit* caster = GetCaster(); caster->CastSpell(GetHitUnit(), SPELL_DK_DEATH_COIL_DAMAGE, true); if (AuraEffect const* unholyAura = caster->GetAuraEffect(SPELL_DK_UNHOLY, EFFECT_6)) // can be any effect, just here to send SPELL_FAILED_DONT_REPORT on failure - caster->CastSpell(caster, SPELL_DK_UNHOLY_VIGOR, true, nullptr, unholyAura); + caster->CastSpell(caster, SPELL_DK_UNHOLY_VIGOR, unholyAura); } void Register() override @@ -481,10 +483,10 @@ class spell_dk_death_strike : public SpellScript int32 pctOfMaxHealth = CalculatePct(spellInfo->GetEffect(EFFECT_2)->CalcValue(GetCaster()), caster->GetMaxHealth()); heal = std::max(heal, pctOfMaxHealth); - caster->CastCustomSpell(SPELL_DK_DEATH_STRIKE_HEAL, SPELLVALUE_BASE_POINT0, heal, caster, true); + caster->CastSpell(caster, SPELL_DK_DEATH_STRIKE_HEAL, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, heal)); if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_DK_BLOOD_SHIELD_MASTERY, EFFECT_0)) - caster->CastCustomSpell(SPELL_DK_BLOOD_SHIELD_ABSORB, SPELLVALUE_BASE_POINT0, CalculatePct(heal, aurEff->GetAmount()), caster); + caster->CastSpell(caster, SPELL_DK_BLOOD_SHIELD_ABSORB, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, CalculatePct(heal, aurEff->GetAmount()))); if (caster->HasAura(SPELL_DK_FROST)) caster->CastSpell(GetHitUnit(), SPELL_DK_DEATH_STRIKE_OFFHAND, true); @@ -558,7 +560,7 @@ class spell_dk_festering_strike : public SpellScript void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - GetCaster()->CastCustomSpell(SPELL_DK_FESTERING_WOUND, SPELLVALUE_AURA_STACK, GetEffectValue(), GetHitUnit(), TRIGGERED_FULL_MASK); + GetCaster()->CastSpell(GetHitUnit(), SPELL_DK_FESTERING_WOUND, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_AURA_STACK, GetEffectValue())); } void Register() override diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index f2e581b99b7..bede40f705b 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -193,7 +193,7 @@ class spell_dru_brambles : public AuraScript // reflect back damage to the attacker Unit* target = GetTarget(); if (Unit* attacker = dmgInfo.GetAttacker()) - target->CastCustomSpell(SPELL_DRUID_BRAMBLES_REFLECT, SPELLVALUE_BASE_POINT0, absorbAmount, attacker, TRIGGERED_FULL_MASK); + target->CastSpell(attacker, SPELL_DRUID_BRAMBLES_REFLECT, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, absorbAmount)); } void Register() override @@ -221,7 +221,7 @@ class spell_dru_bristling_fur : public AuraScript Unit* target = GetTarget(); uint32 rage = target->GetMaxPower(POWER_RAGE) * (float)damageInfo->GetDamage() / (float)target->GetMaxHealth(); if (rage > 0) - target->CastCustomSpell(SPELL_DRUID_BRISTLING_FUR_GAIN_RAGE, SPELLVALUE_BASE_POINT0, rage, target, TRIGGERED_FULL_MASK); + target->CastSpell(target, SPELL_DRUID_BRISTLING_FUR_GAIN_RAGE, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, rage)); } } @@ -288,7 +288,7 @@ public: { Aura* aura = unitOwner->GetAura(spellId); if (!aura) - unitOwner->CastCustomSpell(spellId, SPELLVALUE_AURA_STACK, amount, nullptr, TRIGGERED_FULL_MASK); + unitOwner->CastSpell(unitOwner, spellId, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_AURA_STACK, amount)); else aura->SetStackAmount(amount); } @@ -615,7 +615,7 @@ public: return; } - target->CastSpell(target, triggerspell, true, nullptr, aurEff); + target->CastSpell(target, triggerspell, aurEff); } void Register() override @@ -820,7 +820,7 @@ public: return; if (roll_chance_i(chance)) - eventInfo.GetActor()->CastSpell(nullptr, spellId, true, nullptr, aurEff); + eventInfo.GetActor()->CastSpell(nullptr, spellId, aurEff); } void Register() override @@ -850,64 +850,47 @@ public: return ValidateSpellInfo({ SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, SPELL_DRUID_LIFEBLOOM_ENERGIZE }); } - void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + void OnRemoveEffect(Unit* target, AuraEffect const* aurEff, uint32 stack) { - // Final heal only on duration end - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) - return; - - // final heal - int32 stack = GetStackAmount(); int32 healAmount = aurEff->GetAmount(); if (Unit* caster = GetCaster()) { healAmount = caster->SpellHealingBonusDone(GetTarget(), GetSpellInfo(), healAmount, HEAL, aurEff->GetSpellEffectInfo(), stack); healAmount = GetTarget()->SpellHealingBonusTaken(caster, GetSpellInfo(), healAmount, HEAL, aurEff->GetSpellEffectInfo(), stack); - GetTarget()->CastCustomSpell(GetTarget(), SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, nullptr, nullptr, true, nullptr, aurEff, GetCasterGUID()); - // restore mana std::vector<SpellPowerCost> costs = GetSpellInfo()->CalcPowerCost(caster, GetSpellInfo()->GetSchoolMask()); auto m = std::find_if(costs.begin(), costs.end(), [](SpellPowerCost const& cost) { return cost.Power == POWER_MANA; }); if (m != costs.end()) { - int32 returnMana = m->Amount * stack / 2; - caster->CastCustomSpell(caster, SPELL_DRUID_LIFEBLOOM_ENERGIZE, &returnMana, nullptr, nullptr, true, nullptr, aurEff, GetCasterGUID()); + CastSpellExtraArgs args(aurEff); + args.OriginalCaster = GetCasterGUID(); + args.AddSpellBP0(m->Amount * stack / 2); + caster->CastSpell(caster, SPELL_DRUID_LIFEBLOOM_ENERGIZE, args); } - return; } - GetTarget()->CastCustomSpell(GetTarget(), SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, nullptr, nullptr, true, nullptr, aurEff, GetCasterGUID()); + CastSpellExtraArgs args(aurEff); + args.OriginalCaster = GetCasterGUID(); + args.AddSpellBP0(healAmount); + target->CastSpell(target, SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, args); + } + + void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + // Final heal only on duration end + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; + + // final heal + OnRemoveEffect(GetTarget(), aurEff, GetStackAmount()); } void HandleDispel(DispelInfo* dispelInfo) { if (Unit* target = GetUnitOwner()) - { if (AuraEffect const* aurEff = GetEffect(EFFECT_1)) - { - // final heal - int32 healAmount = aurEff->GetAmount(); - if (Unit* caster = GetCaster()) - { - healAmount = caster->SpellHealingBonusDone(target, GetSpellInfo(), healAmount, HEAL, aurEff->GetSpellEffectInfo(), dispelInfo->GetRemovedCharges()); - healAmount = target->SpellHealingBonusTaken(caster, GetSpellInfo(), healAmount, HEAL, aurEff->GetSpellEffectInfo(), dispelInfo->GetRemovedCharges()); - target->CastCustomSpell(target, SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, nullptr, nullptr, true, nullptr, nullptr, GetCasterGUID()); - - // restore mana - std::vector<SpellPowerCost> costs = GetSpellInfo()->CalcPowerCost(caster, GetSpellInfo()->GetSchoolMask()); - auto m = std::find_if(costs.begin(), costs.end(), [](SpellPowerCost const& cost) { return cost.Power == POWER_MANA; }); - if (m != costs.end()) - { - int32 returnMana = m->Amount * dispelInfo->GetRemovedCharges() / 2; - caster->CastCustomSpell(caster, SPELL_DRUID_LIFEBLOOM_ENERGIZE, &returnMana, nullptr, nullptr, true, nullptr, nullptr, GetCasterGUID()); - } - return; - } - - target->CastCustomSpell(target, SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, nullptr, nullptr, true, nullptr, nullptr, GetCasterGUID()); - } - } + OnRemoveEffect(target, aurEff, dispelInfo->GetRemovedCharges()); // final heal } void Register() override @@ -941,8 +924,14 @@ public: void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - int32 amount = CalculatePct(eventInfo.GetHealInfo()->GetHeal(), aurEff->GetAmount()); - GetTarget()->CastCustomSpell(SPELL_DRUID_LIVING_SEED_PROC, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, nullptr, aurEff); + + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return; + + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(CalculatePct(healInfo->GetHeal(), aurEff->GetAmount())); + GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_LIVING_SEED_PROC, args); } void Register() override @@ -975,7 +964,9 @@ public: void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/) { PreventDefaultAction(); - GetTarget()->CastCustomSpell(SPELL_DRUID_LIVING_SEED_HEAL, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(aurEff->GetAmount()); + GetTarget()->CastSpell(GetTarget(), SPELL_DRUID_LIVING_SEED_HEAL, args); } void Register() override @@ -1041,7 +1032,7 @@ public: { Unit* target = GetTarget(); if (target->HasAura(SPELL_DRUID_BALANCE_T10_BONUS)) - target->CastSpell(nullptr, SPELL_DRUID_BALANCE_T10_BONUS_PROC, true, nullptr); + target->CastSpell(nullptr, SPELL_DRUID_BALANCE_T10_BONUS_PROC, true); } void Register() override @@ -1177,7 +1168,7 @@ public: void AfterApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); - target->CastSpell(target, SPELL_DRUID_SAVAGE_ROAR, true, nullptr, aurEff, GetCasterGUID()); + target->CastSpell(target, SPELL_DRUID_SAVAGE_ROAR, { aurEff, GetCasterGUID() }); } void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) @@ -1253,8 +1244,8 @@ public: if (GetTarget()->GetShapeshiftForm() != FORM_CAT_FORM || eventInfo.GetDamageInfo()->GetSpellInfo()->Id != SPELL_DRUID_FERAL_CHARGE_CAT) return; - GetTarget()->CastSpell(GetTarget(), sSpellMgr->GetSpellWithRank(SPELL_DRUID_STAMPEDE_CAT_RANK_1, GetSpellInfo()->GetRank()), true, nullptr, aurEff); - GetTarget()->CastSpell(GetTarget(), SPELL_DRUID_STAMPEDE_CAT_STATE, true, nullptr, aurEff); + GetTarget()->CastSpell(GetTarget(), sSpellMgr->GetSpellWithRank(SPELL_DRUID_STAMPEDE_CAT_RANK_1, GetSpellInfo()->GetRank()), aurEff); + GetTarget()->CastSpell(GetTarget(), SPELL_DRUID_STAMPEDE_CAT_STATE, aurEff); } void HandleEffectBearProc(AuraEffect* aurEff, ProcEventInfo& eventInfo) @@ -1263,7 +1254,7 @@ public: if (GetTarget()->GetShapeshiftForm() != FORM_BEAR_FORM || eventInfo.GetDamageInfo()->GetSpellInfo()->Id != SPELL_DRUID_FERAL_CHARGE_BEAR) return; - GetTarget()->CastSpell(GetTarget(), sSpellMgr->GetSpellWithRank(SPELL_DRUID_STAMPEDE_BAER_RANK_1, GetSpellInfo()->GetRank()), true, nullptr, aurEff); + GetTarget()->CastSpell(GetTarget(), sSpellMgr->GetSpellWithRank(SPELL_DRUID_STAMPEDE_BAER_RANK_1, GetSpellInfo()->GetRank()), aurEff); } void Register() override @@ -1378,8 +1369,9 @@ public: void AfterApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); - int32 bp0 = target->CountPctFromMaxHealth(aurEff->GetAmount()); - target->CastCustomSpell(target, SPELL_DRUID_SURVIVAL_INSTINCTS, &bp0, nullptr, nullptr, true); + CastSpellExtraArgs args(aurEff); + args.AddSpellMod(SPELLVALUE_BASE_POINT0, target->CountPctFromMaxHealth(aurEff->GetAmount())); + target->CastSpell(target, SPELL_DRUID_SURVIVAL_INSTINCTS, args); } void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) @@ -1452,7 +1444,7 @@ class spell_dru_t3_6p_bonus : public SpellScriptLoader void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_BLESSING_OF_THE_CLAW, true, nullptr, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_BLESSING_OF_THE_CLAW, aurEff); } void Register() override @@ -1496,7 +1488,9 @@ class spell_dru_t3_8p_bonus : public SpellScriptLoader return; int32 amount = CalculatePct(m->Amount, aurEff->GetAmount()); - caster->CastCustomSpell(SPELL_DRUID_EXHILARATE, SPELLVALUE_BASE_POINT0, amount, nullptr, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(amount); + caster->CastSpell(nullptr, SPELL_DRUID_EXHILARATE, args); } void Register() override @@ -1530,7 +1524,7 @@ class spell_dru_t4_2p_bonus : public SpellScriptLoader void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(nullptr, SPELL_DRUID_INFUSION, true, nullptr, aurEff); + eventInfo.GetActor()->CastSpell(nullptr, SPELL_DRUID_INFUSION, aurEff); } void Register() override @@ -1579,7 +1573,9 @@ public: // Add remaining ticks to damage done amount += target->GetRemainingPeriodicAmount(caster->GetGUID(), SPELL_DRUID_LANGUISH, SPELL_AURA_PERIODIC_DAMAGE); - caster->CastCustomSpell(SPELL_DRUID_LANGUISH, SPELLVALUE_BASE_POINT0, amount, target, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(amount); + caster->CastSpell(target, SPELL_DRUID_LANGUISH, args); } void Register() override @@ -1685,8 +1681,9 @@ public: { PreventDefaultAction(); - int32 amount = static_cast<int32>(eventInfo.GetHealInfo()->GetHeal()); - eventInfo.GetActor()->CastCustomSpell(SPELL_DRUID_REJUVENATION_T10_PROC, SPELLVALUE_BASE_POINT0, amount, nullptr, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(eventInfo.GetHealInfo()->GetHeal()); + eventInfo.GetActor()->CastSpell(nullptr, SPELL_DRUID_REJUVENATION_T10_PROC, args); } void Register() override @@ -1799,7 +1796,7 @@ public: Player* player = GetTarget()->ToPlayer(); if (triggeredSpellId) // Apply new form - player->CastSpell(player, triggeredSpellId, true, nullptr, aurEff); + player->CastSpell(player, triggeredSpellId, aurEff); else // If not set, simply remove Travel Form dummy player->RemoveAura(SPELL_DRUID_TRAVEL_FORM); } @@ -1900,7 +1897,7 @@ public: // Outdoor check already passed - Travel Form (dummy) has SPELL_ATTR0_OUTDOORS_ONLY attribute. uint32 triggeredSpellId = spell_dru_travel_form::GetFormSpellId(player, GetCastDifficulty(), false); - player->CastSpell(player, triggeredSpellId, true, nullptr, aurEff); + player->CastSpell(player, triggeredSpellId, aurEff); } void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 6c9e8cd80ac..eeed540a725 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -138,7 +138,7 @@ class spell_gen_adaptive_warding : public AuraScript default: return; } - GetTarget()->CastSpell(GetTarget(), spellId, true, nullptr, aurEff); + GetTarget()->CastSpell(GetTarget(), spellId, aurEff); } void Register() override @@ -492,7 +492,9 @@ class spell_gen_blood_reserve : public AuraScript PreventDefaultAction(); Unit* caster = eventInfo.GetActionTarget(); - caster->CastCustomSpell(SPELL_GEN_BLOOD_RESERVE_HEAL, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), caster, TRIGGERED_FULL_MASK, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(aurEff->GetAmount()); + caster->CastSpell(caster, SPELL_GEN_BLOOD_RESERVE_HEAL, args); caster->RemoveAura(SPELL_GEN_BLOOD_RESERVE_AURA); } @@ -778,7 +780,11 @@ class spell_gen_chaos_blast : public SpellScript int32 basepoints0 = 100; Unit* caster = GetCaster(); if (Unit* target = GetHitUnit()) - caster->CastCustomSpell(target, SPELL_CHAOS_BLAST, &basepoints0, nullptr, nullptr, true); + { + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddBP0(basepoints0); + caster->CastSpell(target, SPELL_CHAOS_BLAST, args); + } } void Register() override @@ -1164,7 +1170,7 @@ class spell_gen_defend : public AuraScript for (uint8 i = 0; i < GetSpellInfo()->StackAmount; ++i) target->RemoveAurasDueToSpell(SPELL_VISUAL_SHIELD_1 + i); - target->CastSpell(target, SPELL_VISUAL_SHIELD_1 + GetAura()->GetStackAmount() - 1, true, nullptr, aurEff); + target->CastSpell(target, SPELL_VISUAL_SHIELD_1 + GetAura()->GetStackAmount() - 1, aurEff); } else GetTarget()->RemoveAurasDueToSpell(GetId()); @@ -1373,7 +1379,7 @@ class spell_gen_elune_candle : public SpellScript else spellId = SPELL_ELUNE_CANDLE_NORMAL; - GetCaster()->CastSpell(GetHitUnit(), spellId, true, nullptr); + GetCaster()->CastSpell(GetHitUnit(), spellId, true); } void Register() override @@ -1542,7 +1548,7 @@ class spell_gen_interrupt : public AuraScript void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_GEN_THROW_INTERRUPT, true, nullptr, aurEff); + GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_GEN_THROW_INTERRUPT, aurEff); } void Register() override @@ -1614,7 +1620,7 @@ class spell_gen_lifebloom : public SpellScriptLoader return; // final heal - GetTarget()->CastSpell(GetTarget(), _spellId, true, nullptr, aurEff, GetCasterGUID()); + GetTarget()->CastSpell(GetTarget(), _spellId, { aurEff, GetCasterGUID() }); } void Register() override @@ -1809,7 +1815,7 @@ class spell_gen_moss_covered_feet : public AuraScript void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - eventInfo.GetActionTarget()->CastSpell(nullptr, SPELL_FALL_DOWN, true, nullptr, aurEff); + eventInfo.GetActionTarget()->CastSpell(nullptr, SPELL_FALL_DOWN, aurEff); } void Register() override @@ -1832,7 +1838,9 @@ class spell_gen_negative_energy_periodic : public AuraScript { PreventDefaultAction(); - GetTarget()->CastCustomSpell(GetSpellInfo()->GetEffect(aurEff->GetEffIndex())->TriggerSpell, SPELLVALUE_MAX_TARGETS, aurEff->GetTickNumber() / 10 + 1, nullptr, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddMod(SPELLVALUE_MAX_TARGETS, aurEff->GetTickNumber() / 10 + 1); + GetTarget()->CastSpell(nullptr, GetSpellInfo()->GetEffect(aurEff->GetEffIndex())->TriggerSpell, args); } void Register() override @@ -2010,7 +2018,7 @@ class spell_gen_obsidian_armor : public AuraScript default: return; } - GetTarget()->CastSpell(GetTarget(), spellId, true, nullptr, aurEff); + GetTarget()->CastSpell(GetTarget(), spellId, aurEff); } void Register() override @@ -2113,7 +2121,7 @@ class spell_gen_paralytic_poison : public AuraScript if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) return; - GetTarget()->CastSpell(nullptr, SPELL_PARALYSIS, true, nullptr, aurEff); + GetTarget()->CastSpell(nullptr, SPELL_PARALYSIS, aurEff); } void Register() override @@ -2626,7 +2634,7 @@ class spell_gen_two_forms : public SpellScript if (target->HasAuraType(SPELL_AURA_WORGEN_ALTERED_FORM)) target->RemoveAurasByType(SPELL_AURA_WORGEN_ALTERED_FORM); else // Basepoints 1 for this aura control whether to trigger transform transition animation or not. - target->CastCustomSpell(SPELL_ALTERED_FORM, SPELLVALUE_BASE_POINT0, 1, target, TRIGGERED_FULL_MASK); + target->CastSpell(target, SPELL_ALTERED_FORM, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, 1)); } void Register() override @@ -3028,7 +3036,7 @@ class spell_gen_turkey_marker : public AuraScript // on stack 15 cast the achievement crediting spell if (GetStackAmount() >= 15) - target->CastSpell(target, SPELL_TURKEY_VENGEANCE, true, nullptr, aurEff, GetCasterGUID()); + target->CastSpell(target, SPELL_TURKEY_VENGEANCE, { aurEff, GetCasterGUID() }); } void OnPeriodic(AuraEffect const* /*aurEff*/) @@ -3109,8 +3117,9 @@ class spell_gen_vampiric_touch : public AuraScript return; Unit* caster = eventInfo.GetActor(); - int32 bp = damageInfo->GetDamage() / 2; - caster->CastCustomSpell(SPELL_VAMPIRIC_TOUCH_HEAL, SPELLVALUE_BASE_POINT0, bp, caster, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(damageInfo->GetDamage() / 2); + caster->CastSpell(caster, SPELL_VAMPIRIC_TOUCH_HEAL, args); } void Register() override @@ -3811,7 +3820,7 @@ class spell_gen_mark_of_kazrogal_hellfire_aura : public AuraScript if (target->GetPower(POWER_MANA) == 0) { - target->CastSpell(target, SPELL_MARK_OF_KAZROGAL_DAMAGE_HELLFIRE, true, nullptr, aurEff); + target->CastSpell(target, SPELL_MARK_OF_KAZROGAL_DAMAGE_HELLFIRE, aurEff); // Remove aura SetDuration(0); } diff --git a/src/server/scripts/Spells/spell_holiday.cpp b/src/server/scripts/Spells/spell_holiday.cpp index dd90fb3d616..8bbae3ec773 100644 --- a/src/server/scripts/Spells/spell_holiday.cpp +++ b/src/server/scripts/Spells/spell_holiday.cpp @@ -570,7 +570,7 @@ class spell_pilgrims_bounty_feast_on : public SpellScriptLoader if (Player* player = target->ToPlayer()) { player->CastSpell(player, SPELL_ON_PLATE_EAT_VISUAL, true); - caster->CastSpell(player, _spellId, true, nullptr, nullptr, player->GetGUID()); + caster->CastSpell(player, _spellId, player->GetGUID()); } if (Aura* aura = caster->GetAura(GetEffectValue())) @@ -1185,15 +1185,23 @@ class spell_brewfest_ram : public SpellScriptLoader target->CastSpell(target, SPELL_BREWFEST_QUEST_SPEED_BUNNY_GREEN, true); break; case SPELL_RAM_CANTER: - target->CastCustomSpell(SPELL_RAM_FATIGUE, SPELLVALUE_AURA_STACK, 1, target, TRIGGERED_FULL_MASK); + { + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddMod(SPELLVALUE_AURA_STACK, 1); + target->CastSpell(target, SPELL_RAM_FATIGUE, args); if (aurEff->GetTickNumber() == 8) target->CastSpell(target, SPELL_BREWFEST_QUEST_SPEED_BUNNY_YELLOW, true); break; + } case SPELL_RAM_GALLOP: - target->CastCustomSpell(SPELL_RAM_FATIGUE, SPELLVALUE_AURA_STACK, target->HasAura(SPELL_RAM_FATIGUE) ? 4 : 5 /*Hack*/, target, TRIGGERED_FULL_MASK); + { + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddMod(SPELLVALUE_AURA_STACK, target->HasAura(SPELL_RAM_FATIGUE) ? 4 : 5 /*Hack*/); + target->CastSpell(target, SPELL_RAM_FATIGUE, args); if (aurEff->GetTickNumber() == 8) target->CastSpell(target, SPELL_BREWFEST_QUEST_SPEED_BUNNY_RED, true); break; + } default: break; } diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index 4dae0593f83..45a8e390b9c 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -181,8 +181,9 @@ class spell_hun_last_stand_pet : public SpellScriptLoader void HandleDummy(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); - int32 healthModSpellBasePoints0 = int32(caster->CountPctFromMaxHealth(30)); - caster->CastCustomSpell(caster, SPELL_HUNTER_PET_LAST_STAND_TRIGGERED, &healthModSpellBasePoints0, nullptr, nullptr, true, nullptr); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddBP0(caster->CountPctFromMaxHealth(30)); + caster->CastSpell(caster, SPELL_HUNTER_PET_LAST_STAND_TRIGGERED, args); } void Register() override @@ -307,7 +308,7 @@ class spell_hun_misdirection : public SpellScriptLoader void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/) { PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_MISDIRECTION_PROC, true, nullptr, aurEff); + GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_MISDIRECTION_PROC, aurEff); } void Register() override @@ -419,7 +420,9 @@ class spell_hun_pet_heart_of_the_phoenix : public SpellScriptLoader { if (!caster->HasAura(SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF)) { - owner->CastCustomSpell(SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED, SPELLVALUE_BASE_POINT0, 100, caster, true); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddBP0(100); + owner->CastSpell(caster, SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED, args); caster->CastSpell(caster, SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF, true); } } @@ -468,8 +471,9 @@ class spell_hun_roar_of_sacrifice : public SpellScriptLoader { PreventDefaultAction(); - uint32 damage = CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()); - eventInfo.GetActor()->CastCustomSpell(SPELL_ROAR_OF_SACRIFICE_TRIGGERED, SPELLVALUE_BASE_POINT0, damage, GetCaster(), TRIGGERED_FULL_MASK, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount())); + eventInfo.GetActor()->CastSpell(GetCaster(), SPELL_ROAR_OF_SACRIFICE_TRIGGERED, args); } void Register() override @@ -637,7 +641,7 @@ public: PreventDefaultAction(); Unit* caster = eventInfo.GetActor(); - caster->CastSpell(caster->ToPlayer()->GetPet(), SPELL_HUNTER_T9_4P_GREATNESS, true, nullptr, aurEff); + caster->CastSpell(caster->ToPlayer()->GetPet(), SPELL_HUNTER_T9_4P_GREATNESS, aurEff); } void Register() override diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index 58897220708..654667762af 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -68,7 +68,7 @@ class spell_item_trigger_spell : public SpellScriptLoader { Unit* caster = GetCaster(); if (Item* item = GetCastItem()) - caster->CastSpell(caster, _triggeredSpellId, true, item); + caster->CastSpell(caster, _triggeredSpellId, item); } void Register() override @@ -101,7 +101,7 @@ class spell_item_aegis_of_preservation : public AuraScript void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/) { PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_AEGIS_HEAL, true, nullptr, aurEff); + GetTarget()->CastSpell(GetTarget(), SPELL_AEGIS_HEAL, aurEff); } void Register() override @@ -132,7 +132,7 @@ class spell_item_absorb_eye_of_grillok : public AuraScript if (!GetCaster() || GetTarget()->GetTypeId() != TYPEID_UNIT) return; - GetCaster()->CastSpell(GetCaster(), SPELL_EYE_OF_GRILLOK, true, nullptr, aurEff); + GetCaster()->CastSpell(GetCaster(), SPELL_EYE_OF_GRILLOK, aurEff); GetTarget()->ToCreature()->DespawnOrUnsummon(); } @@ -191,7 +191,10 @@ class spell_item_alchemist_stone : public AuraScript if (!spellId) return; - GetTarget()->CastCustomSpell(spellId, SPELLVALUE_BASE_POINT0, amount, GetTarget(), true, nullptr, aurEff); + Unit* caster = eventInfo.GetActionTarget(); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(amount); + caster->CastSpell(nullptr, spellId, args); } void Register() override @@ -251,7 +254,7 @@ class spell_item_anger_capacitor : public SpellScriptLoader if (player->GetWeaponForAttack(OFF_ATTACK, true) && roll_chance_i(50)) spellId = SPELL_MANIFEST_ANGER_OFF_HAND; - caster->CastSpell(target, spellId, true, nullptr, aurEff); + caster->CastSpell(target, spellId, aurEff); } void Register() override @@ -357,7 +360,7 @@ class spell_item_aura_of_madness : public AuraScript PreventDefaultAction(); Unit* caster = eventInfo.GetActor(); uint32 spellId = Trinity::Containers::SelectRandomContainerElement(triggeredSpells[caster->getClass()]); - caster->CastSpell(caster, spellId, true, nullptr, aurEff); + caster->CastSpell(caster, spellId, aurEff); if (roll_chance_i(10)) caster->Unit::Say(SAY_MADNESS); @@ -386,7 +389,7 @@ class spell_item_dementia : public AuraScript void HandlePeriodicDummy(AuraEffect const* aurEff) { PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), RAND(SPELL_DEMENTIA_POS, SPELL_DEMENTIA_NEG), true, nullptr, aurEff); + GetTarget()->CastSpell(GetTarget(), RAND(SPELL_DEMENTIA_POS, SPELL_DEMENTIA_NEG), aurEff); } void Register() override @@ -433,7 +436,11 @@ class spell_item_blessing_of_ancient_kings : public AuraScript protEff->GetBase()->RefreshDuration(); } else - GetTarget()->CastCustomSpell(SPELL_PROTECTION_OF_ANCIENT_KINGS, SPELLVALUE_BASE_POINT0, absorb, eventInfo.GetProcTarget(), true, nullptr, aurEff); + { + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(absorb); + GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_PROTECTION_OF_ANCIENT_KINGS, args); + } } void Register() override @@ -494,7 +501,9 @@ class spell_item_deadly_precision_dummy : public SpellScript void HandleDummy(SpellEffIndex /*effIndex*/) { SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_DEADLY_PRECISION, GetCastDifficulty()); - GetCaster()->CastCustomSpell(spellInfo->Id, SPELLVALUE_AURA_STACK, spellInfo->StackAmount, GetCaster(), true); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddMod(SPELLVALUE_AURA_STACK, spellInfo->StackAmount); + GetCaster()->CastSpell(GetCaster(), spellInfo->Id, args); } void Register() override @@ -583,7 +592,7 @@ class spell_item_deathbringers_will : public SpellScriptLoader return; uint32 spellId = Trinity::Containers::SelectRandomContainerElement(randomSpells); - caster->CastSpell(caster, spellId, true, nullptr, aurEff); + caster->CastSpell(caster, spellId, aurEff); } void Register() override @@ -669,7 +678,7 @@ class spell_item_defibrillate : public SpellScriptLoader { PreventHitDefaultEffect(effIndex); if (_failSpell) - GetCaster()->CastSpell(GetCaster(), _failSpell, true, GetCastItem()); + GetCaster()->CastSpell(GetCaster(), _failSpell, GetCastItem()); } } @@ -710,7 +719,7 @@ class spell_item_desperate_defense : public AuraScript void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/) { PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_DESPERATE_RAGE, true, nullptr, aurEff); + GetTarget()->CastSpell(GetTarget(), SPELL_DESPERATE_RAGE, aurEff); } void Register() override @@ -748,7 +757,7 @@ class spell_item_deviate_fish : public SpellScript { Unit* caster = GetCaster(); uint32 spellId = urand(SPELL_SLEEPY, SPELL_HEALTHY_SPIRIT); - caster->CastSpell(caster, spellId, true, nullptr); + caster->CastSpell(caster, spellId, true); } void Register() override @@ -775,7 +784,7 @@ class spell_item_discerning_eye_beast_dummy : public AuraScript void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(nullptr, SPELL_DISCERNING_EYE_BEAST, true, nullptr, aurEff); + eventInfo.GetActor()->CastSpell(nullptr, SPELL_DISCERNING_EYE_BEAST, aurEff); } void Register() override @@ -951,9 +960,10 @@ class spell_item_frozen_shadoweave : public AuraScript if (!damageInfo || !damageInfo->GetDamage()) return; - int32 amount = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), aurEff->GetAmount()); Unit* caster = eventInfo.GetActor(); - caster->CastCustomSpell(SPELL_SHADOWMEND, SPELLVALUE_BASE_POINT0, amount, nullptr, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(CalculatePct(damageInfo->GetDamage(), aurEff->GetAmount())); + caster->CastSpell(nullptr, SPELL_SHADOWMEND, args); } void Register() override @@ -1089,7 +1099,7 @@ class spell_item_heartpierce : public SpellScriptLoader return; } - caster->CastSpell(nullptr, spellId, true, nullptr, aurEff); + caster->CastSpell(nullptr, spellId, aurEff); } void Register() override @@ -1174,7 +1184,7 @@ class spell_item_make_a_wish : public SpellScript case 3: spellId = SPELL_SUMMON_FURIOUS_MR_PINCHY; break; case 4: spellId = SPELL_TINY_MAGICAL_CRAWDAD; break; } - caster->CastSpell(caster, spellId, true, nullptr); + caster->CastSpell(caster, spellId, true); } void Register() override @@ -1207,7 +1217,7 @@ class spell_item_mark_of_conquest : public AuraScript // in that case, do not cast heal spell PreventDefaultAction(); // but mana instead - eventInfo.GetActor()->CastSpell(nullptr, SPELL_MARK_OF_CONQUEST_ENERGIZE, true, nullptr, aurEff); + eventInfo.GetActor()->CastSpell(nullptr, SPELL_MARK_OF_CONQUEST_ENERGIZE, aurEff); } } @@ -1289,8 +1299,9 @@ class spell_item_necrotic_touch : public AuraScript if (!damageInfo || !damageInfo->GetDamage()) return; - int32 bp = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), aurEff->GetAmount()); - GetTarget()->CastCustomSpell(SPELL_ITEM_NECROTIC_TOUCH_PROC, SPELLVALUE_BASE_POINT0, bp, eventInfo.GetProcTarget(), true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(CalculatePct(damageInfo->GetDamage(), aurEff->GetAmount())); + GetTarget()->CastSpell(nullptr, SPELL_ITEM_NECROTIC_TOUCH_PROC, args); } void Register() override @@ -1334,7 +1345,7 @@ class spell_item_net_o_matic : public SpellScript else if (roll < 4) // 2% for 20 sec root, charge to target (off-like chance unknown) spellId = SPELL_NET_O_MATIC_TRIGGERED2; - GetCaster()->CastSpell(target, spellId, true, nullptr); + GetCaster()->CastSpell(target, spellId, true); } } @@ -1382,7 +1393,7 @@ class spell_item_noggenfogger_elixir : public SpellScript case 2: spellId = SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED2; break; } - caster->CastSpell(caster, spellId, true, nullptr); + caster->CastSpell(caster, spellId, true); } void Register() override @@ -1446,7 +1457,9 @@ class spell_item_persistent_shield : public AuraScript if (shield->GetAmount() > bp0) return; - caster->CastCustomSpell(SPELL_PERSISTENT_SHIELD_TRIGGERED, SPELLVALUE_BASE_POINT0, bp0, target, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(bp0); + caster->CastSpell(target, SPELL_PERSISTENT_SHIELD_TRIGGERED, args); } void Register() override @@ -1480,9 +1493,9 @@ class spell_item_pet_healing : public AuraScript if (!damageInfo || !damageInfo->GetDamage()) return; - int32 bp = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), aurEff->GetAmount()); - Unit* caster = eventInfo.GetActor(); - caster->CastCustomSpell(SPELL_HEALTH_LINK, SPELLVALUE_BASE_POINT0, bp, nullptr, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(CalculatePct(damageInfo->GetDamage(), aurEff->GetAmount())); + eventInfo.GetActor()->CastSpell(nullptr, SPELL_HEALTH_LINK, args); } void Register() override @@ -1550,7 +1563,7 @@ class spell_item_savory_deviate_delight : public SpellScript // Yaaarrrr - pirate case 2: spellId = (caster->getGender() == GENDER_MALE ? SPELL_YAAARRRR_MALE : SPELL_YAAARRRR_FEMALE); break; } - caster->CastSpell(caster, spellId, true, nullptr); + caster->CastSpell(caster, spellId, true); } void Register() override @@ -1707,14 +1720,14 @@ class spell_item_shadowmourne : public AuraScript void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_SHADOWMOURNE_SOUL_FRAGMENT, true, nullptr, aurEff); + GetTarget()->CastSpell(GetTarget(), SPELL_SHADOWMOURNE_SOUL_FRAGMENT, aurEff); // this can't be handled in AuraScript of SoulFragments because we need to know victim if (Aura* soulFragments = GetTarget()->GetAura(SPELL_SHADOWMOURNE_SOUL_FRAGMENT)) { if (soulFragments->GetStackAmount() >= 10) { - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE, true, nullptr, aurEff); + GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE, aurEff); soulFragments->Remove(); } } @@ -1833,7 +1846,7 @@ class spell_item_six_demon_bag : public SpellScript target = caster; } - caster->CastSpell(target, spellId, true, GetCastItem()); + caster->CastSpell(target, spellId, GetCastItem()); } } @@ -1863,8 +1876,9 @@ class spell_item_swift_hand_justice_dummy : public AuraScript PreventDefaultAction(); Unit* caster = eventInfo.GetActor(); - int32 amount = caster->CountPctFromMaxHealth(aurEff->GetAmount()); - caster->CastCustomSpell(SPELL_SWIFT_HAND_OF_JUSTICE_HEAL, SPELLVALUE_BASE_POINT0, amount, nullptr, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(caster->CountPctFromMaxHealth(aurEff->GetAmount())); + caster->CastSpell(nullptr, SPELL_SWIFT_HAND_OF_JUSTICE_HEAL, args); } void Register() override @@ -1927,7 +1941,7 @@ class spell_item_underbelly_elixir : public SpellScript case 1: spellId = SPELL_UNDERBELLY_ELIXIR_TRIGGERED1; break; case 2: spellId = SPELL_UNDERBELLY_ELIXIR_TRIGGERED2; break; } - caster->CastSpell(caster, spellId, true, nullptr); + caster->CastSpell(caster, spellId, true); } void Register() override @@ -2372,7 +2386,7 @@ class spell_item_purify_helboar_meat : public SpellScript void HandleDummy(SpellEffIndex /* effIndex */) { Unit* caster = GetCaster(); - caster->CastSpell(caster, roll_chance_i(50) ? SPELL_SUMMON_PURIFIED_HELBOAR_MEAT : SPELL_SUMMON_TOXIC_HELBOAR_MEAT, true, nullptr); + caster->CastSpell(caster, roll_chance_i(50) ? SPELL_SUMMON_PURIFIED_HELBOAR_MEAT : SPELL_SUMMON_TOXIC_HELBOAR_MEAT, true); } void Register() override @@ -2495,9 +2509,9 @@ class spell_item_nigh_invulnerability : public SpellScript if (Item* castItem = GetCastItem()) { if (roll_chance_i(86)) // Nigh-Invulnerability - success - caster->CastSpell(caster, SPELL_NIGH_INVULNERABILITY, true, castItem); + caster->CastSpell(caster, SPELL_NIGH_INVULNERABILITY, castItem); else // Complete Vulnerability - backfire in 14% casts - caster->CastSpell(caster, SPELL_COMPLETE_VULNERABILITY, true, castItem); + caster->CastSpell(caster, SPELL_COMPLETE_VULNERABILITY, castItem); } } @@ -2525,7 +2539,7 @@ class spell_item_poultryizer : public SpellScript void HandleDummy(SpellEffIndex /* effIndex */) { if (GetCastItem() && GetHitUnit()) - GetCaster()->CastSpell(GetHitUnit(), roll_chance_i(80) ? SPELL_POULTRYIZER_SUCCESS : SPELL_POULTRYIZER_BACKFIRE, true, GetCastItem()); + GetCaster()->CastSpell(GetHitUnit(), roll_chance_i(80) ? SPELL_POULTRYIZER_SUCCESS : SPELL_POULTRYIZER_BACKFIRE, GetCastItem()); } void Register() override @@ -2645,7 +2659,7 @@ class spell_item_complete_raptor_capture : public SpellScript GetHitCreature()->DespawnOrUnsummon(); //cast spell Raptor Capture Credit - caster->CastSpell(caster, SPELL_RAPTOR_CAPTURE_CREDIT, true, nullptr); + caster->CastSpell(caster, SPELL_RAPTOR_CAPTURE_CREDIT, true); } } @@ -2778,7 +2792,7 @@ class spell_item_nitro_boosts : public SpellScript bool success = true; if (areaEntry && areaEntry->IsFlyable() && !caster->GetMap()->IsDungeon()) success = roll_chance_i(95); // nitro boosts can only fail in flying-enabled locations on 3.3.5 - caster->CastSpell(caster, success ? SPELL_NITRO_BOOSTS_SUCCESS : SPELL_NITRO_BOOSTS_BACKFIRE, true, GetCastItem()); + caster->CastSpell(caster, success ? SPELL_NITRO_BOOSTS_SUCCESS : SPELL_NITRO_BOOSTS_BACKFIRE, GetCastItem()); } void Register() override @@ -2808,7 +2822,7 @@ class spell_item_nitro_boosts_backfire : public AuraScript if (curZ < lastZ) { if (roll_chance_i(80)) // we don't have enough sniffs to verify this, guesstimate - GetTarget()->CastSpell(GetTarget(), SPELL_NITRO_BOOSTS_PARACHUTE, true, nullptr, effect); + GetTarget()->CastSpell(GetTarget(), SPELL_NITRO_BOOSTS_PARACHUTE, effect); GetAura()->Remove(); } else @@ -2884,7 +2898,7 @@ class spell_item_rocket_boots : public SpellScript bg->EventPlayerDroppedFlag(caster); caster->GetSpellHistory()->ResetCooldown(SPELL_ROCKET_BOOTS_PROC); - caster->CastSpell(caster, SPELL_ROCKET_BOOTS_PROC, true, nullptr); + caster->CastSpell(caster, SPELL_ROCKET_BOOTS_PROC, true); } SpellCastResult CheckCast() @@ -3077,10 +3091,10 @@ class spell_item_shard_of_the_scale : public SpellScriptLoader Unit* target = eventInfo.GetProcTarget(); if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) - caster->CastSpell(target, HealProc, true, nullptr, aurEff); + caster->CastSpell(target, HealProc, aurEff); if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG) - caster->CastSpell(target, DamageProc, true, nullptr, aurEff); + caster->CastSpell(target, DamageProc, aurEff); } void Register() override @@ -3127,16 +3141,16 @@ class spell_item_soul_preserver : public AuraScript switch (caster->getClass()) { case CLASS_DRUID: - caster->CastSpell(caster, SPELL_SOUL_PRESERVER_DRUID, true, nullptr, aurEff); + caster->CastSpell(caster, SPELL_SOUL_PRESERVER_DRUID, aurEff); break; case CLASS_PALADIN: - caster->CastSpell(caster, SPELL_SOUL_PRESERVER_PALADIN, true, nullptr, aurEff); + caster->CastSpell(caster, SPELL_SOUL_PRESERVER_PALADIN, aurEff); break; case CLASS_PRIEST: - caster->CastSpell(caster, SPELL_SOUL_PRESERVER_PRIEST, true, nullptr, aurEff); + caster->CastSpell(caster, SPELL_SOUL_PRESERVER_PRIEST, aurEff); break; case CLASS_SHAMAN: - caster->CastSpell(caster, SPELL_SOUL_PRESERVER_SHAMAN, true, nullptr, aurEff); + caster->CastSpell(caster, SPELL_SOUL_PRESERVER_SHAMAN, aurEff); break; default: break; @@ -3211,10 +3225,10 @@ class spell_item_sunwell_neck : public SpellScriptLoader // Aggression checks are in the spell system... just cast and forget if (player->GetReputationRank(FACTION_ALDOR) == REP_EXALTED) - player->CastSpell(target, Aldors, true, nullptr, aurEff); + player->CastSpell(target, Aldors, aurEff); if (player->GetReputationRank(FACTION_SCRYERS) == REP_EXALTED) - player->CastSpell(target, Scryers, true, nullptr, aurEff); + player->CastSpell(target, Scryers, aurEff); } void Register() override @@ -3294,17 +3308,17 @@ class spell_item_death_choice : public AuraScript case SPELL_DEATH_CHOICE_NORMAL_AURA: { if (str > agi) - caster->CastSpell(caster, SPELL_DEATH_CHOICE_NORMAL_STRENGTH, true, nullptr, aurEff); + caster->CastSpell(caster, SPELL_DEATH_CHOICE_NORMAL_STRENGTH, aurEff); else - caster->CastSpell(caster, SPELL_DEATH_CHOICE_NORMAL_AGILITY, true, nullptr, aurEff); + caster->CastSpell(caster, SPELL_DEATH_CHOICE_NORMAL_AGILITY, aurEff); break; } case SPELL_DEATH_CHOICE_HEROIC_AURA: { if (str > agi) - caster->CastSpell(caster, SPELL_DEATH_CHOICE_HEROIC_STRENGTH, true, nullptr, aurEff); + caster->CastSpell(caster, SPELL_DEATH_CHOICE_HEROIC_STRENGTH, aurEff); else - caster->CastSpell(caster, SPELL_DEATH_CHOICE_HEROIC_AGILITY, true, nullptr, aurEff); + caster->CastSpell(caster, SPELL_DEATH_CHOICE_HEROIC_AGILITY, aurEff); break; } default: @@ -3363,7 +3377,7 @@ public: Unit* caster = eventInfo.GetActor(); - caster->CastSpell(caster, _stackSpell, true, nullptr, aurEff); // cast the stack + caster->CastSpell(caster, _stackSpell, aurEff); // cast the stack Aura* dummy = caster->GetAura(_stackSpell); // retrieve aura @@ -3374,7 +3388,7 @@ public: // if right amount, remove the aura and cast real trigger caster->RemoveAurasDueToSpell(_stackSpell); if (Unit* target = eventInfo.GetActionTarget()) - caster->CastSpell(target, _triggerSpell, true, nullptr, aurEff); + caster->CastSpell(target, _triggerSpell, aurEff); } void Register() override @@ -3457,7 +3471,7 @@ class spell_item_darkmoon_card_greatness : public AuraScript stat = vers; } - caster->CastSpell(caster, spellTrigger, true, nullptr, aurEff); + caster->CastSpell(caster, spellTrigger, aurEff); } void Register() override @@ -3494,10 +3508,10 @@ class spell_item_mana_drain : public AuraScript Unit* target = eventInfo.GetActionTarget(); if (caster->IsAlive()) - caster->CastSpell(caster, SPELL_MANA_DRAIN_ENERGIZE, true, nullptr, aurEff); + caster->CastSpell(caster, SPELL_MANA_DRAIN_ENERGIZE, aurEff); if (target && target->IsAlive()) - caster->CastSpell(target, SPELL_MANA_DRAIN_LEECH, true, nullptr, aurEff); + caster->CastSpell(target, SPELL_MANA_DRAIN_LEECH, aurEff); } void Register() override @@ -3587,7 +3601,7 @@ class spell_item_mind_control_cap : public SpellScript if (Unit* target = GetHitUnit()) { if (roll_chance_i(ROLL_CHANCE_NO_BACKFIRE)) - caster->CastSpell(target, roll_chance_i(ROLL_CHANCE_DULLARD) ? SPELL_DULLARD : SPELL_GNOMISH_MIND_CONTROL_CAP, true, GetCastItem()); + caster->CastSpell(target, roll_chance_i(ROLL_CHANCE_DULLARD) ? SPELL_DULLARD : SPELL_GNOMISH_MIND_CONTROL_CAP, GetCastItem()); else target->CastSpell(caster, SPELL_GNOMISH_MIND_CONTROL_CAP, true); // backfire - 5% chance } @@ -3629,11 +3643,11 @@ class spell_item_universal_remote : public SpellScript { uint8 chance = urand(0, 99); if (chance < 15) - GetCaster()->CastSpell(target, SPELL_TARGET_LOCK, true, GetCastItem()); + GetCaster()->CastSpell(target, SPELL_TARGET_LOCK, GetCastItem()); else if (chance < 25) - GetCaster()->CastSpell(target, SPELL_MOBILITY_MALFUNCTION, true, GetCastItem()); + GetCaster()->CastSpell(target, SPELL_MOBILITY_MALFUNCTION, GetCastItem()); else - GetCaster()->CastSpell(target, SPELL_CONTROL_MACHINE, true, GetCastItem()); + GetCaster()->CastSpell(target, SPELL_CONTROL_MACHINE, GetCastItem()); } } @@ -3971,7 +3985,7 @@ class spell_item_mad_alchemists_potion : public SpellScript } if (useElixir) - target->CastSpell(target, chosenElixir, true, GetCastItem()); + target->CastSpell(target, chosenElixir, GetCastItem()); } void Register() override @@ -4011,7 +4025,7 @@ class spell_item_crazy_alchemists_potion : public SpellScript uint32 chosenElixir = Trinity::Containers::SelectRandomContainerElement(availableElixirs); - target->CastSpell(target, chosenElixir, true, GetCastItem()); + target->CastSpell(target, chosenElixir, GetCastItem()); } void Register() override diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index c30f9b22643..5a2f88df076 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -302,7 +302,7 @@ class spell_mage_fingers_of_frost : public AuraScript void Trigger(AuraEffect* aurEff, ProcEventInfo& eventInfo) { - eventInfo.GetActor()->CastSpell(GetTarget(), SPELL_MAGE_FINGERS_OF_FROST, true, nullptr, aurEff); + eventInfo.GetActor()->CastSpell(GetTarget(), SPELL_MAGE_FINGERS_OF_FROST, aurEff); } void Register() override @@ -395,7 +395,10 @@ class spell_mage_ice_lance : public SpellScript } // put target index for chain value multiplier into EFFECT_1 base points, otherwise triggered spell doesn't know which damage multiplier to apply - caster->CastCustomSpell(SPELL_MAGE_ICE_LANCE_TRIGGER, SPELLVALUE_BASE_POINT1, index, target, true); + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.AddSpellMod(SPELLVALUE_BASE_POINT1, index); + caster->CastSpell(target, SPELL_MAGE_ICE_LANCE_TRIGGER, args); } void Register() override @@ -455,7 +458,10 @@ class spell_mage_ignite : public AuraScript ASSERT(igniteDot->GetMaxTicks() > 0); int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), pct) / igniteDot->GetMaxTicks()); amount += eventInfo.GetProcTarget()->GetRemainingPeriodicAmount(eventInfo.GetActor()->GetGUID(), SPELL_MAGE_IGNITE, SPELL_AURA_PERIODIC_DAMAGE); - GetTarget()->CastCustomSpell(SPELL_MAGE_IGNITE, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, nullptr, aurEff); + + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(amount); + GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_MAGE_IGNITE, args); } void Register() override @@ -501,7 +507,7 @@ class spell_mage_living_bomb : public SpellScript void HandleDummy(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); - GetCaster()->CastCustomSpell(SPELL_MAGE_LIVING_BOMB_PERIODIC, SPELLVALUE_BASE_POINT2, 1, GetHitUnit(), TRIGGERED_FULL_MASK); + GetCaster()->CastSpell(GetHitUnit(), SPELL_MAGE_LIVING_BOMB_PERIODIC, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT2, 1)); } void Register() override @@ -528,7 +534,7 @@ class spell_mage_living_bomb_explosion : public SpellScript void HandleSpread(SpellEffIndex /*effIndex*/) { if (GetSpellValue()->EffectBasePoints[EFFECT_0] > 0) - GetCaster()->CastCustomSpell(SPELL_MAGE_LIVING_BOMB_PERIODIC, SPELLVALUE_BASE_POINT2, 0, GetHitUnit(), TRIGGERED_FULL_MASK); + GetCaster()->CastSpell(GetHitUnit(), SPELL_MAGE_LIVING_BOMB_PERIODIC, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT2, 0)); } void Register() override @@ -554,7 +560,7 @@ class spell_mage_living_bomb_periodic : public AuraScript return; if (Unit* caster = GetCaster()) - caster->CastCustomSpell(SPELL_MAGE_LIVING_BOMB_EXPLOSION, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), TRIGGERED_FULL_MASK); + caster->CastSpell(GetTarget(), SPELL_MAGE_LIVING_BOMB_EXPLOSION, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, aurEff->GetAmount())); } void Register() override @@ -636,7 +642,7 @@ class spell_mage_ring_of_frost : public AuraScript void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { if (TempSummon* ringOfFrost = GetRingOfFrostMinion()) - GetTarget()->CastSpell(ringOfFrost->GetPositionX(), ringOfFrost->GetPositionY(), ringOfFrost->GetPositionZ(), SPELL_MAGE_RING_OF_FROST_FREEZE, true); + GetTarget()->CastSpell(ringOfFrost->GetPosition(), SPELL_MAGE_RING_OF_FROST_FREEZE, true); } void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) @@ -801,7 +807,7 @@ class spell_mage_touch_of_the_magi_aura : public AuraScript return; if (Unit* caster = GetCaster()) - caster->CastCustomSpell(SPELL_MAGE_TOUCH_OF_THE_MAGI_EXPLODE, SPELLVALUE_BASE_POINT0, amount, GetTarget(), TRIGGERED_FULL_MASK); + caster->CastSpell(GetTarget(), SPELL_MAGE_TOUCH_OF_THE_MAGI_EXPLODE, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, amount)); } void Register() override diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index c69226f2587..3aba1eff8ae 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -676,7 +676,7 @@ class spell_pal_item_healing_discount : public AuraScript void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/) { PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_PALADIN_ITEM_HEALING_TRANCE, true, nullptr, aurEff); + GetTarget()->CastSpell(GetTarget(), SPELL_PALADIN_ITEM_HEALING_TRANCE, aurEff); } void Register() override @@ -725,7 +725,7 @@ class spell_pal_item_t6_trinket : public AuraScript return; if (roll_chance_i(chance)) - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), spellId, true, nullptr, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), spellId, aurEff); } void Register() override @@ -816,7 +816,11 @@ class spell_pal_light_s_beacon : public SpellScriptLoader std::list<AuraApplication*> applications; (*itr)->GetApplicationList(applications); if (!applications.empty()) - eventInfo.GetActor()->CastCustomSpell(SPELL_PALADIN_BEACON_OF_LIGHT_HEAL, SPELLVALUE_BASE_POINT0, heal, applications.front()->GetTarget(), true); + { + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(heal); + eventInfo.GetActor()->CastSpell(applications.front()->GetTarget(), SPELL_PALADIN_BEACON_OF_LIGHT_HEAL, args); + } return; } } @@ -985,7 +989,7 @@ class spell_pal_t3_6p_bonus : public SpellScriptLoader return; } - caster->CastSpell(target, spellId, true, nullptr, aurEff); + caster->CastSpell(target, spellId, aurEff); } void Register() override @@ -1034,7 +1038,9 @@ class spell_pal_t8_2p_bonus : public SpellScriptLoader // Add remaining ticks to damage done amount += target->GetRemainingPeriodicAmount(caster->GetGUID(), SPELL_PALADIN_HOLY_MENDING, SPELL_AURA_PERIODIC_HEAL); - caster->CastCustomSpell(SPELL_PALADIN_HOLY_MENDING, SPELLVALUE_BASE_POINT0, amount, target, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(amount); + caster->CastSpell(target, SPELL_PALADIN_HOLY_MENDING, args); } void Register() override @@ -1062,7 +1068,7 @@ class spell_pal_zeal : public AuraScript void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& /*procInfo*/) { Unit* target = GetTarget(); - target->CastCustomSpell(SPELL_PALADIN_ZEAL_AURA, SPELLVALUE_AURA_STACK, aurEff->GetAmount(), target, true); + target->CastSpell(target, SPELL_PALADIN_ZEAL_AURA, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_AURA_STACK, aurEff->GetAmount())); PreventDefaultAction(); } diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 6e452167e00..7e377f496a8 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -133,8 +133,9 @@ class spell_pri_aq_3p_bonus : public SpellScriptLoader if (!healInfo || !healInfo->GetHeal()) return; - int32 amount = CalculatePct(static_cast<int32>(healInfo->GetHeal()), 10); - caster->CastCustomSpell(SPELL_PRIEST_ORACULAR_HEAL, SPELLVALUE_BASE_POINT0, amount, caster, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(CalculatePct(static_cast<int32>(healInfo->GetHeal()), 10)); + caster->CastSpell(caster, SPELL_PRIEST_ORACULAR_HEAL, args); } void Register() override @@ -174,13 +175,14 @@ public: void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo) { DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - int32 heal = CalculatePct(damageInfo->GetDamage(), aurEff->GetAmount()); - _appliedAtonements.erase(std::remove_if(_appliedAtonements.begin(), _appliedAtonements.end(), [this, heal](ObjectGuid const& targetGuid) + CastSpellExtraArgs args(aurEff); + args.AddSpellMod(SPELLVALUE_BASE_POINT0, CalculatePct(damageInfo->GetDamage(), aurEff->GetAmount())); + _appliedAtonements.erase(std::remove_if(_appliedAtonements.begin(), _appliedAtonements.end(), [this, &args](ObjectGuid const& targetGuid) { if (Unit* target = ObjectAccessor::GetUnit(*GetTarget(), targetGuid)) { if (target->GetExactDist(GetTarget()) < GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue()) - GetTarget()->CastCustomSpell(SPELL_PRIEST_ATONEMENT_HEAL, SPELLVALUE_BASE_POINT0, heal, target, true); + GetTarget()->CastSpell(target, SPELL_PRIEST_ATONEMENT_HEAL, args); return false; } @@ -337,7 +339,9 @@ class spell_pri_guardian_spirit : public SpellScriptLoader int32 healAmount = int32(target->CountPctFromMaxHealth(healPct)); // remove the aura now, we don't want 40% healing bonus Remove(AURA_REMOVE_BY_ENEMY_SPELL); - target->CastCustomSpell(target, SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL, &healAmount, nullptr, nullptr, true); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddBP0(healAmount); + target->CastSpell(target, SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL, args); absorbAmount = dmgInfo.GetDamage(); } @@ -414,7 +418,7 @@ class spell_pri_leap_of_faith_effect_trigger : public SpellScriptLoader SpellCastTargets targets; targets.SetDst(destPos); targets.SetUnitTarget(GetCaster()); - GetHitUnit()->CastSpell(targets, sSpellMgr->GetSpellInfo(GetEffectValue(), GetCastDifficulty()), nullptr); + GetHitUnit()->CastSpell(targets, GetEffectValue(), GetCastDifficulty()); } void Register() override @@ -629,10 +633,11 @@ public: void CastPrayerOfMendingAura(Unit* caster, Unit* target, uint8 stack) { uint32 basePoints = caster->SpellHealingBonusDone(target, _spellInfoHeal, _healEffectDummy->CalcValue(caster), HEAL, _healEffectDummy); - CustomSpellValues values; - values.AddSpellMod(SPELLVALUE_AURA_STACK, stack); - values.AddSpellMod(SPELLVALUE_BASE_POINT0, basePoints); - caster->CastCustomSpell(SPELL_PRIEST_PRAYER_OF_MENDING_AURA, values, target, TRIGGERED_FULL_MASK); + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.AddSpellMod(SPELLVALUE_AURA_STACK, stack); + args.AddSpellMod(SPELLVALUE_BASE_POINT0, basePoints); + caster->CastSpell(target, SPELL_PRIEST_PRAYER_OF_MENDING_AURA, args); } protected: @@ -674,12 +679,19 @@ class spell_pri_prayer_of_mending_aura : public AuraScript if (Unit* caster = GetCaster()) { // Cast the spell to heal the owner - caster->CastSpell(target, SPELL_PRIEST_PRAYER_OF_MENDING_HEAL, true, nullptr, aurEff); + caster->CastSpell(target, SPELL_PRIEST_PRAYER_OF_MENDING_HEAL, aurEff); // Only cast jump if stack is higher than 0 int32 stackAmount = GetStackAmount(); if (stackAmount > 1) - target->CastCustomSpell(SPELL_PRIEST_PRAYER_OF_MENDING_JUMP, SPELLVALUE_BASE_POINT0, stackAmount - 1, target, true, nullptr, aurEff, caster->GetGUID()); + { + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.TriggeringAura = aurEff; + args.OriginalCaster = caster->GetGUID(); + args.AddSpellMod(SPELLVALUE_BASE_POINT0, stackAmount - 1); + target->CastSpell(target, SPELL_PRIEST_PRAYER_OF_MENDING_JUMP, args); + } Remove(); } @@ -752,7 +764,7 @@ class spell_priest_spirit_of_redemption : public AuraScript Unit* target = GetTarget(); if (dmgInfo.GetDamage() >= target->GetHealth()) { - target->CastSpell(target, SPELL_PRIEST_SPIRIT_OF_REDEMPTION, TRIGGERED_FULL_MASK, nullptr, aurEff); + target->CastSpell(target, SPELL_PRIEST_SPIRIT_OF_REDEMPTION, aurEff); target->SetFullHealth(); return; } @@ -784,7 +796,7 @@ class spell_pri_t3_4p_bonus : public SpellScriptLoader void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_PRIEST_ARMOR_OF_FAITH, true, nullptr, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_PRIEST_ARMOR_OF_FAITH, aurEff); } void Register() override @@ -828,7 +840,7 @@ class spell_pri_t5_heal_2p_bonus : public SpellScriptLoader void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/) { PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_PRIEST_ITEM_EFFICIENCY, true, nullptr, aurEff); + GetTarget()->CastSpell(GetTarget(), SPELL_PRIEST_ITEM_EFFICIENCY, aurEff); } void Register() override @@ -878,7 +890,9 @@ class spell_pri_t10_heal_2p_bonus : public SpellScriptLoader Unit* target = eventInfo.GetProcTarget(); amount += target->GetRemainingPeriodicAmount(caster->GetGUID(), SPELL_PRIEST_BLESSED_HEALING, SPELL_AURA_PERIODIC_HEAL); - caster->CastCustomSpell(SPELL_PRIEST_BLESSED_HEALING, SPELLVALUE_BASE_POINT0, amount, target, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(amount); + caster->CastSpell(target, SPELL_PRIEST_BLESSED_HEALING, args); } void Register() override @@ -924,7 +938,10 @@ class spell_pri_vampiric_embrace : public SpellScriptLoader int32 selfHeal = int32(CalculatePct(damageInfo->GetDamage(), aurEff->GetAmount())); int32 teamHeal = selfHeal / 2; - GetTarget()->CastCustomSpell(nullptr, SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL, &teamHeal, &selfHeal, nullptr, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT0, teamHeal); + args.SpellValueOverrides.AddMod(SPELLVALUE_BASE_POINT1, selfHeal); + GetTarget()->CastSpell(nullptr, SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL, args); } void Register() override @@ -990,9 +1007,10 @@ class spell_pri_vampiric_touch : public SpellScriptLoader { if (AuraEffect const* aurEff = GetEffect(EFFECT_1)) { - int32 damage = aurEff->GetAmount() * 8; // backfire damage - caster->CastCustomSpell(target, SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL, &damage, nullptr, nullptr, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(aurEff->GetAmount() * 8); + caster->CastSpell(target, SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL, args); } } } @@ -1006,7 +1024,7 @@ class spell_pri_vampiric_touch : public SpellScriptLoader void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - eventInfo.GetProcTarget()->CastSpell(nullptr, SPELL_GEN_REPLENISHMENT, true, nullptr, aurEff); + eventInfo.GetProcTarget()->CastSpell(nullptr, SPELL_GEN_REPLENISHMENT, aurEff); } void Register() override @@ -1052,7 +1070,10 @@ class spell_pri_angelic_feather_trigger : public SpellScriptLoader { SpellCastTargets targets; targets.SetDst(destPos); - GetCaster()->CastSpell(targets, sSpellMgr->GetSpellInfo(SPELL_PRIEST_ANGELIC_FEATHER_AREATRIGGER, GetCastDifficulty()), nullptr); + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.CastDifficulty = GetCastDifficulty(); + GetCaster()->CastSpell(targets, SPELL_PRIEST_ANGELIC_FEATHER_AREATRIGGER, args); } } diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp index 47293321ad5..6c3e8d9cd6a 100644 --- a/src/server/scripts/Spells/spell_quest.cpp +++ b/src/server/scripts/Spells/spell_quest.cpp @@ -157,7 +157,7 @@ class spell_q5206_test_fetid_skull : public SpellScriptLoader { Unit* caster = GetCaster(); uint32 spellId = roll_chance_i(50) ? SPELL_CREATE_RESONATING_SKULL : SPELL_CREATE_BONE_DUST; - caster->CastSpell(caster, spellId, true, nullptr); + caster->CastSpell(caster, spellId, true); } void Register() override @@ -321,7 +321,7 @@ class spell_q11396_11399_scourging_crystal_controller : public SpellScriptLoader if (target->GetTypeId() == TYPEID_UNIT && target->HasAura(SPELL_FORCE_SHIELD_ARCANE_PURPLE_X3)) // Make sure nobody else is channeling the same target if (!target->HasAura(SPELL_SCOURGING_CRYSTAL_CONTROLLER)) - GetCaster()->CastSpell(target, SPELL_SCOURGING_CRYSTAL_CONTROLLER, true, GetCastItem()); + GetCaster()->CastSpell(target, SPELL_SCOURGING_CRYSTAL_CONTROLLER, GetCastItem()); } void Register() override @@ -498,7 +498,7 @@ class spell_q11730_ultrasonic_screwdriver : public SpellScriptLoader default: return; } - caster->CastSpell(caster, spellId, true, castItem); + caster->CastSpell(caster, spellId, castItem); caster->CastSpell(caster, SPELL_ROBOT_KILL_CREDIT, true); target->DespawnOrUnsummon(); } @@ -608,7 +608,7 @@ class spell_q12634_despawn_fruit_tosser : public SpellScriptLoader // sometimes, if you're lucky, you get a dwarf if (roll_chance_i(5)) spellId = SPELL_SUMMON_ADVENTUROUS_DWARF; - GetCaster()->CastSpell(GetCaster(), spellId, true, nullptr); + GetCaster()->CastSpell(GetCaster(), spellId, true); } void Register() override @@ -642,7 +642,7 @@ class spell_q12683_take_sputum_sample : public SpellScriptLoader if (caster->HasAuraEffect(reqAuraId, 0)) { uint32 spellId = GetSpellInfo()->GetEffect(EFFECT_0)->CalcValue(); - caster->CastSpell(caster, spellId, true, nullptr); + caster->CastSpell(caster, spellId, true); } } @@ -752,7 +752,7 @@ class spell_q12937_relief_for_the_fallen : public SpellScriptLoader Player* caster = GetCaster()->ToPlayer(); if (Creature* target = GetHitCreature()) { - caster->CastSpell(caster, SPELL_TRIGGER_AID_OF_THE_EARTHEN, true, nullptr); + caster->CastSpell(caster, SPELL_TRIGGER_AID_OF_THE_EARTHEN, true); caster->KilledMonsterCredit(NPC_FALLEN_EARTHEN_DEFENDER); target->DespawnOrUnsummon(); } @@ -1922,7 +1922,7 @@ class spell_q13086_cannons_target : public SpellScriptLoader void HandleEffectDummy(SpellEffIndex /*effIndex*/) { if (WorldLocation const* pos = GetExplTargetDest()) - GetCaster()->CastSpell(pos->GetPositionX(), pos->GetPositionY(), pos->GetPositionZ(), GetEffectValue(), true); + GetCaster()->CastSpell(pos->GetPosition(), GetEffectValue(), true); } void Register() override @@ -2215,7 +2215,7 @@ class spell_q12619_emblazon_runeblade : public SpellScriptLoader { PreventDefaultAction(); if (Unit* caster = GetCaster()) - caster->CastSpell(caster, aurEff->GetSpellEffectInfo()->TriggerSpell, true, nullptr, aurEff); + caster->CastSpell(caster, aurEff->GetSpellEffectInfo()->TriggerSpell, aurEff); } void Register() override @@ -2279,10 +2279,11 @@ class spell_q12919_gymers_grab : public SpellScriptLoader void HandleScript(SpellEffIndex /*effIndex*/) { - int8 seatId = 2; if (!GetHitCreature()) return; - GetHitCreature()->CastCustomSpell(SPELL_RIDE_GYMER, SPELLVALUE_BASE_POINT0, seatId, GetCaster(), true); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddBP0(2); + GetHitCreature()->CastSpell(GetCaster(), SPELL_RIDE_GYMER, args); GetHitCreature()->CastSpell(GetHitCreature(), SPELL_GRABBED, true); } diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index 577c08c96b4..003b55c260e 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -83,8 +83,9 @@ class spell_rog_blade_flurry : public SpellScriptLoader if (DamageInfo* damageInfo = eventInfo.GetDamageInfo()) { - int32 damage = damageInfo->GetDamage(); - GetTarget()->CastCustomSpell(SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK, SPELLVALUE_BASE_POINT0, damage, _procTarget, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(damageInfo->GetDamage()); + GetTarget()->CastSpell(_procTarget, SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK, args); } } @@ -179,9 +180,9 @@ class spell_rog_deadly_poison : public SpellScriptLoader continue; if (spellInfo->IsPositive()) - player->CastSpell(player, enchant->EffectArg[s], true, item); + player->CastSpell(player, enchant->EffectArg[s], item); else - player->CastSpell(target, enchant->EffectArg[s], true, item); + player->CastSpell(target, enchant->EffectArg[s], item); } } } @@ -605,7 +606,7 @@ public: PreventDefaultAction(); Unit* target = GetTarget(); - target->CastSpell(target, SPELL_ROGUE_HONOR_AMONG_THIEVES_ENERGIZE, TRIGGERED_FULL_MASK, nullptr, aurEff); + target->CastSpell(target, SPELL_ROGUE_HONOR_AMONG_THIEVES_ENERGIZE, aurEff); } void Register() override diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 09b3e0b40ad..618cb45e30f 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -117,7 +117,11 @@ public: PreventDefaultAction(); int32 bp0 = CalculatePct(int32(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount()); if (bp0) - eventInfo.GetActor()->CastCustomSpell(SPELL_SHAMAN_ANCESTRAL_GUIDANCE_HEAL, SPELLVALUE_BASE_POINT0, bp0, eventInfo.GetActor(), true, nullptr, aurEff); + { + CastSpellExtraArgs args(aurEff); + args.AddSpellMod(SPELLVALUE_BASE_POINT0, bp0); + eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_SHAMAN_ANCESTRAL_GUIDANCE_HEAL, args); + } } void Register() override @@ -237,8 +241,13 @@ public: { if (_targetsHit >= 2) GetCaster()->CastSpell(GetCaster(), SPELL_SHAMAN_CRASH_LIGHTNING_CLEAVE, true); + if (AuraEffect const* gatheringStorms = GetCaster()->GetAuraEffect(SPELL_SHAMAN_GATHERING_STORMS, EFFECT_0)) - GetCaster()->CastCustomSpell(SPELL_SHAMAN_GATHERING_STORMS_BUFF, SPELLVALUE_BASE_POINT0, int32(gatheringStorms->GetAmount() * _targetsHit), GetCaster(), true); + { + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.AddSpellMod(SPELLVALUE_BASE_POINT0, int32(gatheringStorms->GetAmount() * _targetsHit)); + GetCaster()->CastSpell(GetCaster(), SPELL_SHAMAN_GATHERING_STORMS_BUFF, args); + } } void Register() override @@ -282,7 +291,7 @@ class spell_sha_earth_shield : public SpellScriptLoader { PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_EARTH_SHIELD_HEAL, true, nullptr, aurEff, GetCasterGUID()); + GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_EARTH_SHIELD_HEAL, { aurEff, GetCasterGUID() }); } void Register() override @@ -452,7 +461,9 @@ class spell_sha_flametongue_weapon : public SpellScript if (!targetItem || !targetItem->GetTemplate()->IsWeapon()) return; - player->CastSpell(targetItem, SPELL_SHAMAN_FLAMETONGUE_WEAPON_ENCHANT, true); + SpellCastTargets targets; + targets.SetItemTarget(targetItem); + player->CastSpell(targets, SPELL_SHAMAN_FLAMETONGUE_WEAPON_ENCHANT, true); } void Register() override @@ -476,8 +487,9 @@ class spell_sha_flametongue_weapon_aura : public AuraScript PreventDefaultAction(); Unit* attacker = eventInfo.GetActor(); - int32 damage = std::max(1, int32(attacker->GetTotalAttackPowerValue(BASE_ATTACK) * 0.0264f)); - attacker->CastCustomSpell(SPELL_SHAMAN_FLAMETONGUE_ATTACK, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetActionTarget(), TRIGGERED_FULL_MASK, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.AddSpellMod(SPELLVALUE_BASE_POINT0, std::max(1, int32(attacker->GetTotalAttackPowerValue(BASE_ATTACK) * 0.0264f))); + attacker->CastSpell(eventInfo.GetActionTarget(), SPELL_SHAMAN_FLAMETONGUE_ATTACK, args); } void Register() override @@ -495,7 +507,7 @@ public: void SetVisualDummy(TempSummon* summon) { _visualDummy = summon->GetGUID(); - summon->GetPosition(_x, _y, _z); + _dest = summon->GetPosition(); } private: @@ -503,7 +515,7 @@ private: void HandleEffectPeriodic(AuraEffect const* aurEff) { - GetTarget()->CastSpell(_x, _y, _z, SPELL_SHAMAN_HEALING_RAIN_HEAL, true, nullptr, aurEff); + GetTarget()->CastSpell(_dest, SPELL_SHAMAN_HEALING_RAIN_HEAL, aurEff); } void HandleEffecRemoved(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) @@ -519,7 +531,7 @@ private: } ObjectGuid _visualDummy; - float _x = 0.0f, _y = 0.0f, _z = 0.0f; + Position _dest; }; constexpr char const spell_sha_healing_rain_aura::ScriptName[]; @@ -654,7 +666,7 @@ class spell_sha_item_lightning_shield : public SpellScriptLoader void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD, true, nullptr, aurEff); + GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD, aurEff); } void Register() override @@ -687,7 +699,7 @@ class spell_sha_item_lightning_shield_trigger : public SpellScriptLoader void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/) { PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE, true, nullptr, aurEff); + GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE, aurEff); } void Register() override @@ -732,7 +744,11 @@ class spell_sha_item_mana_surge : public SpellScriptLoader { int32 mana = CalculatePct(m->Amount, 35); if (mana > 0) - GetTarget()->CastCustomSpell(SPELL_SHAMAN_ITEM_MANA_SURGE, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, nullptr, aurEff); + { + CastSpellExtraArgs args(aurEff); + args.AddSpellMod(SPELLVALUE_BASE_POINT0, mana); + GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_ITEM_MANA_SURGE, args); + } } } @@ -1087,10 +1103,11 @@ class spell_sha_tidal_waves : public SpellScriptLoader void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/) { PreventDefaultAction(); - int32 basePoints0 = -aurEff->GetAmount(); - int32 basePoints1 = aurEff->GetAmount(); + CastSpellExtraArgs args(aurEff); + args.AddSpellMod(SPELLVALUE_BASE_POINT0, -aurEff->GetAmount()); + args.AddSpellMod(SPELLVALUE_BASE_POINT1, aurEff->GetAmount()); - GetTarget()->CastCustomSpell(GetTarget(), SPELL_SHAMAN_TIDAL_WAVES, &basePoints0, &basePoints1, nullptr, true, nullptr, aurEff); + GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_TIDAL_WAVES, args); } void Register() override @@ -1157,7 +1174,7 @@ class spell_sha_t3_6p_bonus : public SpellScriptLoader return; } - caster->CastSpell(target, spellId, true, nullptr, aurEff); + caster->CastSpell(target, spellId, aurEff); } void Register() override @@ -1226,7 +1243,9 @@ class spell_sha_t8_elemental_4p_bonus : public SpellScriptLoader Unit* target = eventInfo.GetProcTarget(); amount += target->GetRemainingPeriodicAmount(caster->GetGUID(), SPELL_SHAMAN_ELECTRIFIED, SPELL_AURA_PERIODIC_DAMAGE); - caster->CastCustomSpell(SPELL_SHAMAN_ELECTRIFIED, SPELLVALUE_BASE_POINT0, amount, target, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(amount); + caster->CastSpell(target, SPELL_SHAMAN_ELECTRIFIED, args); } void Register() override @@ -1275,7 +1294,9 @@ class spell_sha_t9_elemental_4p_bonus : public SpellScriptLoader Unit* target = eventInfo.GetProcTarget(); amount += target->GetRemainingPeriodicAmount(caster->GetGUID(), SPELL_SHAMAN_LAVA_BURST_BONUS_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE); - caster->CastCustomSpell(SPELL_SHAMAN_LAVA_BURST_BONUS_DAMAGE, SPELLVALUE_BASE_POINT0, amount, target, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(amount); + caster->CastSpell(target, SPELL_SHAMAN_LAVA_BURST_BONUS_DAMAGE, args); } void Register() override @@ -1369,7 +1390,9 @@ class spell_sha_t10_restoration_4p_bonus : public SpellScriptLoader Unit* target = eventInfo.GetProcTarget(); amount += target->GetRemainingPeriodicAmount(caster->GetGUID(), SPELL_SHAMAN_CHAINED_HEAL, SPELL_AURA_PERIODIC_HEAL); - caster->CastCustomSpell(SPELL_SHAMAN_CHAINED_HEAL, SPELLVALUE_BASE_POINT0, amount, target, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.SpellValueOverrides.AddBP0(amount); + caster->CastSpell(target, SPELL_SHAMAN_CHAINED_HEAL, args); } void Register() override @@ -1404,7 +1427,7 @@ public: PreventDefaultAction(); for (uint32 i = 0; i < 2; ++i) - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHAMAN_WINDFURY_ATTACK, true, nullptr, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHAMAN_WINDFURY_ATTACK, aurEff); } void Register() override diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 5ff9aa3145b..163c867d71d 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -280,14 +280,16 @@ class spell_warl_devour_magic : public SpellScriptLoader if (SpellEffectInfo const* effect = GetSpellInfo()->GetEffect(EFFECT_1)) { Unit* caster = GetCaster(); - int32 heal_amount = effect->CalcValue(caster); + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.AddSpellBP0(effect->CalcValue(caster)); - caster->CastCustomSpell(caster, SPELL_WARLOCK_DEVOUR_MAGIC_HEAL, &heal_amount, nullptr, nullptr, true); + caster->CastSpell(caster, SPELL_WARLOCK_DEVOUR_MAGIC_HEAL, args); // Glyph of Felhunter if (Unit* owner = caster->GetOwner()) if (owner->GetAura(SPELL_WARLOCK_GLYPH_OF_DEMON_TRAINING)) - owner->CastCustomSpell(owner, SPELL_WARLOCK_DEVOUR_MAGIC_HEAL, &heal_amount, nullptr, nullptr, true); + owner->CastSpell(owner, SPELL_WARLOCK_DEVOUR_MAGIC_HEAL, args); } } @@ -530,7 +532,7 @@ class spell_warl_seed_of_corruption_dummy : public SpellScriptLoader if (!caster) return; - caster->CastSpell(eventInfo.GetActionTarget(), SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE, true); + caster->CastSpell(eventInfo.GetActionTarget(), SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE, aurEff); } void Register() override @@ -586,7 +588,7 @@ class spell_warl_seed_of_corruption_generic : public SpellScriptLoader if (!caster) return; - caster->CastSpell(eventInfo.GetActionTarget(), SPELL_WARLOCK_SEED_OF_CORRUPTION_GENERIC, true, nullptr, aurEff); + caster->CastSpell(eventInfo.GetActionTarget(), SPELL_WARLOCK_SEED_OF_CORRUPTION_GENERIC, aurEff); } void Register() override @@ -858,7 +860,7 @@ class spell_warl_t4_2p_bonus : public SpellScriptLoader { PreventDefaultAction(); Unit* caster = eventInfo.GetActor(); - caster->CastSpell(caster, Trigger, true, nullptr, aurEff); + caster->CastSpell(caster, Trigger, aurEff); } void Register() override @@ -894,9 +896,10 @@ class spell_warl_unstable_affliction : public SpellScriptLoader if (Unit* caster = GetCaster()) if (AuraEffect const* aurEff = GetEffect(EFFECT_1)) { - int32 damage = aurEff->GetAmount() * 9; // backfire damage and silence - caster->CastCustomSpell(dispelInfo->GetDispeller(), SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL, &damage, nullptr, nullptr, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.AddSpellBP0(aurEff->GetAmount() * 9); + caster->CastSpell(dispelInfo->GetDispeller(), SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL, args); } } diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index 18ebf6a1263..3e9d168ed12 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -204,7 +204,7 @@ class spell_warr_charge_effect : public SpellScriptLoader { Unit* caster = GetCaster(); Unit* target = GetHitUnit(); - caster->CastCustomSpell(SPELL_WARRIOR_CHARGE_PAUSE_RAGE_DECAY, SPELLVALUE_BASE_POINT0, 0, caster, true); + caster->CastSpell(caster, SPELL_WARRIOR_CHARGE_PAUSE_RAGE_DECAY, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, 0)); caster->CastSpell(target, SPELL_WARRIOR_CHARGE_ROOT_EFFECT, true); caster->CastSpell(target, SPELL_WARRIOR_CHARGE_SLOW_EFFECT, true); } @@ -307,7 +307,7 @@ public: void HandleDummy(SpellEffIndex /*effIndex*/) { if (WorldLocation* dest = GetHitDest()) - GetCaster()->CastSpell(dest->GetPositionX(), dest->GetPositionY(), dest->GetPositionZ(), SPELL_WARRIOR_HEROIC_LEAP_JUMP, true); + GetCaster()->CastSpell(*dest, SPELL_WARRIOR_HEROIC_LEAP_JUMP, true); } void Register() override @@ -448,7 +448,9 @@ class spell_warr_item_t10_prot_4p_bonus : public SpellScriptLoader Unit* target = eventInfo.GetActionTarget(); int32 bp0 = CalculatePct(target->GetMaxHealth(), GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue()); - target->CastCustomSpell(SPELL_WARRIOR_STOICISM, SPELLVALUE_BASE_POINT0, bp0, nullptr, true); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SpellValueOverrides.AddBP0(bp0); + target->CastSpell(nullptr, SPELL_WARRIOR_STOICISM, args); } void Register() override @@ -518,9 +520,10 @@ class spell_warr_rallying_cry : public SpellScriptLoader void HandleScript(SpellEffIndex /*effIndex*/) { - int32 basePoints0 = int32(GetHitUnit()->CountPctFromMaxHealth(GetEffectValue())); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.AddSpellMod(SPELLVALUE_BASE_POINT0, int32(GetHitUnit()->CountPctFromMaxHealth(GetEffectValue()))); - GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_WARRIOR_RALLYING_CRY, &basePoints0, nullptr, nullptr, true); + GetCaster()->CastSpell(GetHitUnit(), SPELL_WARRIOR_RALLYING_CRY, args); } void Register() override @@ -685,12 +688,13 @@ class spell_warr_sweeping_strikes : public SpellScriptLoader if (spellInfo && (spellInfo->Id == SPELL_WARRIOR_BLADESTORM_PERIODIC_WHIRLWIND || (spellInfo->Id == SPELL_WARRIOR_EXECUTE && !_procTarget->HasAuraState(AURA_STATE_WOUNDED_20_PERCENT)))) { // If triggered by Execute (while target is not under 20% hp) or Bladestorm deals normalized weapon damage - GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_2, true, nullptr, aurEff); + GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_2, aurEff); } else { - int32 damage = damageInfo->GetDamage(); - GetTarget()->CastCustomSpell(SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_1, SPELLVALUE_BASE_POINT0, damage, _procTarget, true, nullptr, aurEff); + CastSpellExtraArgs args(aurEff); + args.AddSpellMod(SPELLVALUE_BASE_POINT0, damageInfo->GetDamage()); + GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_1, args); } } } @@ -732,7 +736,9 @@ public: int32 remainingDamage = target->GetRemainingPeriodicAmount(target->GetGUID(), SPELL_WARRIOR_TRAUMA_EFFECT, SPELL_AURA_PERIODIC_DAMAGE); //Get 25% of damage from the spell casted (Slam & Whirlwind) plus Remaining Damage from Aura int32 damage = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()) / sSpellMgr->AssertSpellInfo(SPELL_WARRIOR_TRAUMA_EFFECT, GetCastDifficulty())->GetMaxTicks()) + remainingDamage; - GetCaster()->CastCustomSpell(SPELL_WARRIOR_TRAUMA_EFFECT, SPELLVALUE_BASE_POINT0, damage, target, true); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.AddSpellMod(SPELLVALUE_BASE_POINT0, damage); + GetCaster()->CastSpell(target, SPELL_WARRIOR_TRAUMA_EFFECT, args); } void Register() override diff --git a/src/server/scripts/World/mob_generic_creature.cpp b/src/server/scripts/World/mob_generic_creature.cpp index ca3b27140e4..e7a0aeb1770 100644 --- a/src/server/scripts/World/mob_generic_creature.cpp +++ b/src/server/scripts/World/mob_generic_creature.cpp @@ -19,6 +19,7 @@ #include "Map.h" #include "PassiveAI.h" #include "ScriptedCreature.h" +#include "SpellInfo.h" #include "SpellMgr.h" class trigger_periodic : public CreatureScript @@ -43,7 +44,7 @@ public: if (timer <= diff) { if (spell) - me->CastSpell(me, spell, true); + me->CastSpell(me, spell->Id, CastSpellExtraArgs(TRIGGERED_FULL_MASK).SetCastDifficulty(spell->Difficulty)); timer = interval; } else diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index cf4be0e3e3e..601f0d23421 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -468,10 +468,10 @@ public: { _scheduler.Schedule(Seconds(2), [this](TaskContext context) { - me->CastCustomSpell(SPELL_TORCH_TARGET_PICKER, SPELLVALUE_MAX_TARGETS, 1); + me->CastSpell(nullptr, SPELL_TORCH_TARGET_PICKER); _scheduler.Schedule(Seconds(3), [this](TaskContext /*context*/) { - me->CastCustomSpell(SPELL_TORCH_TARGET_PICKER, SPELLVALUE_MAX_TARGETS, 1); + me->CastSpell(nullptr, SPELL_TORCH_TARGET_PICKER); }); context.Repeat(Seconds(5)); }); @@ -2284,7 +2284,7 @@ public: } else //me->CastSpell(me, GetFireworkSpell(me->GetEntry()), true); - me->CastSpell(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), GetFireworkSpell(me->GetEntry()), true); + me->CastSpell(me->GetPosition(), GetFireworkSpell(me->GetEntry()), true); } }; |