aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/Spells
diff options
context:
space:
mode:
authorJeremy <Golrag@users.noreply.github.com>2024-09-14 13:01:54 +0200
committerGitHub <noreply@github.com>2024-09-14 13:01:54 +0200
commitc499110a0d09364fa62a1f67db17032aea9c77e6 (patch)
tree25dbe1cd4312e64e6f455ff9d05bec363f30ab3e /src/server/scripts/Spells
parent4a574c0ce1149825c0fba77b0bea60608cbc470f (diff)
Scripts/Battlegrounds: Implement Silvershard mines (#30120)
Diffstat (limited to 'src/server/scripts/Spells')
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index bcd57762c3d..851836d472b 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -5379,6 +5379,78 @@ private:
uint64 _health;
};
+// 128648 - Defending Cart Aura
+class spell_bg_defending_cart_aura final : public SpellScript
+{
+ void FilterTargets(std::list<WorldObject*>& targets) const
+ {
+ if (targets.empty())
+ return;
+
+ if (GameObject const* controlZone = GetControlZone())
+ {
+ targets.remove_if([&](WorldObject* obj)
+ {
+ if (Player const* player = obj->ToPlayer())
+ return GetTeamIdForTeam(player->GetBGTeam()) != controlZone->GetControllingTeam();
+
+ return true;
+ });
+ }
+ }
+
+ GameObject const* GetControlZone() const
+ {
+ if (Unit const* caster = GetCaster())
+ {
+ Unit::AuraEffectList const& auraEffects = caster->GetAuraEffectsByType(SPELL_AURA_ACT_AS_CONTROL_ZONE);
+ for (AuraEffect const* auraEffect : auraEffects)
+ if (GameObject const* gameobject = caster->GetGameObject(auraEffect->GetSpellInfo()->Id))
+ return gameobject;
+ }
+
+ return nullptr;
+ }
+
+ void Register() override
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_bg_defending_cart_aura::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
+ }
+};
+
+// 128648 - Defending Cart Aura
+class spell_bg_defending_cart_aura_AuraScript final : public AuraScript
+{
+ void OnPeriodic(AuraEffect const* /*aurEff*/) const
+ {
+ Unit const* caster = GetCaster();
+ if (!caster)
+ return;
+
+ if (GameObject const* controlZone = GetControlZone())
+ if (!controlZone->GetInsidePlayers()->contains(GetTarget()->GetGUID()))
+ GetTarget()->RemoveAurasDueToSpell(GetSpellInfo()->Id, caster->GetGUID());
+ }
+
+ GameObject const* GetControlZone() const
+ {
+ if (Unit const* caster = GetCaster())
+ {
+ Unit::AuraEffectList const& auraEffects = caster->GetAuraEffectsByType(SPELL_AURA_ACT_AS_CONTROL_ZONE);
+ for (AuraEffect const* auraEffect : auraEffects)
+ if (GameObject const* gameobject = caster->GetGameObject(auraEffect->GetSpellInfo()->Id))
+ return gameobject;
+ }
+
+ return nullptr;
+ }
+
+ void Register() override
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_bg_defending_cart_aura_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
+};
+
void AddSC_generic_spell_scripts()
{
RegisterSpellScript(spell_gen_absorb0_hitlimit1);
@@ -5559,4 +5631,5 @@ void AddSC_generic_spell_scripts()
RegisterSpellScriptWithArgs(spell_gen_set_health, "spell_gen_set_health_1", 1);
RegisterSpellScriptWithArgs(spell_gen_set_health, "spell_gen_set_health_100", 100);
RegisterSpellScriptWithArgs(spell_gen_set_health, "spell_gen_set_health_500", 500);
+ RegisterSpellAndAuraScriptPair(spell_bg_defending_cart_aura, spell_bg_defending_cart_aura_AuraScript);
}