fix(Scripts/SSC): Rewrite Coilfang Water Handling (#24559)

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Gultask
2026-02-06 19:19:23 -03:00
committed by GitHub
parent fe71aca415
commit 57090a5302
3 changed files with 174 additions and 39 deletions

View File

@@ -89,6 +89,7 @@ public:
LoadSummonData(summonData);
_aliveKeepersCount = 0;
_frenzyCount = 0;
}
bool SetBossState(uint32 type, EncounterState state) override
@@ -129,11 +130,6 @@ public:
{
switch (creature->GetEntry())
{
case NPC_COILFANG_SHATTERER:
case NPC_COILFANG_PRIESTESS:
if (creature->GetPositionX() > 190.0f)
--_aliveKeepersCount;
break;
case NPC_CYCLONE_KARATHRESS:
creature->GetMotionMaster()->MoveRandom(50.0f);
break;
@@ -141,12 +137,27 @@ public:
creature->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
creature->RemoveNpcFlag(UNIT_NPC_FLAG_QUESTGIVER);
break;
case NPC_COILFANG_FRENZY:
if (!creature->IsInWater() || _frenzyCount >= MAX_FRENZY_COUNT)
creature->DespawnOrUnsummon();
else
++_frenzyCount;
break;
default:
break;
}
InstanceScript::OnCreatureCreate(creature);
}
void OnCreatureRemove(Creature* creature) override
{
if (creature->GetEntry() == NPC_COILFANG_FRENZY)
if (_frenzyCount > 0)
--_frenzyCount;
InstanceScript::OnCreatureRemove(creature);
}
void SetData(uint32 type, uint32 /*data*/) override
{
switch (type)
@@ -185,7 +196,8 @@ public:
private:
ObjectGuid _shieldGeneratorGUID[4];
int32 _aliveKeepersCount;
uint32 _aliveKeepersCount;
uint32 _frenzyCount;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
@@ -269,53 +281,46 @@ class spell_serpentshrine_cavern_coilfang_water : public AuraScript
{
PrepareAuraScript(spell_serpentshrine_cavern_coilfang_water);
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (InstanceScript* instance = GetUnitOwner()->GetInstanceScript())
if (instance->GetBossState(DATA_THE_LURKER_BELOW) != DONE)
if (instance->GetData(DATA_ALIVE_KEEPERS) == 0)
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SCALDING_WATER, true);
}
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
GetUnitOwner()->RemoveAurasDueToSpell(SPELL_SCALDING_WATER);
}
void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude)
{
InstanceScript* instance = GetUnitOwner()->GetInstanceScript();
if (!instance || instance->GetBossState(DATA_THE_LURKER_BELOW) == DONE)
return;
isPeriodic = true;
amplitude = 8 * IN_MILLISECONDS;
}
void HandlePeriodic(AuraEffect const* /*aurEff*/)
void HandlePeriodic(AuraEffect const* /*aurEff*/)
{
PreventDefaultAction();
InstanceScript* instance = GetUnitOwner()->GetInstanceScript();
if (!instance || GetUnitOwner()->GetMapId() != MAP_COILFANG_SERPENTSHRINE_CAVERN)
{
SetDuration(0);
GetAura()->SetDuration(1);
return;
}
if (instance->GetBossState(DATA_THE_LURKER_BELOW) == DONE || instance->GetData(DATA_ALIVE_KEEPERS) == 0 || GetUnitOwner()->GetPositionZ() > -20.5f || !GetUnitOwner()->IsInWater())
return;
if (instance->GetBossState(DATA_THE_LURKER_BELOW) != DONE && GetUnitOwner()->IsInWater())
{
if (instance->GetData(DATA_ALIVE_KEEPERS) > 0)
for (uint8 i = 0; i < urand(2, 3); ++i)
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SERVERSIDE_SUMMON_FRENZY, true);
for (uint8 i = 0; i < 3; ++i)
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FRENZY_WATER, true);
if (instance->GetData(DATA_ALIVE_KEEPERS) <= 0 && !GetUnitOwner()->HasAura(SPELL_SCALDING_WATER))
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SCALDING_WATER, true);
return;
}
else if (instance->GetBossState(DATA_THE_LURKER_BELOW) == DONE)
{
GetAura()->SetDuration(1);
return;
}
GetUnitOwner()->RemoveAurasDueToSpell(SPELL_SCALDING_WATER);
}
void Register() override
{
AfterEffectApply += AuraEffectApplyFn(spell_serpentshrine_cavern_coilfang_water::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
AfterEffectRemove += AuraEffectRemoveFn(spell_serpentshrine_cavern_coilfang_water::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_serpentshrine_cavern_coilfang_water::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY);
OnEffectPeriodic += AuraEffectPeriodicFn(spell_serpentshrine_cavern_coilfang_water::HandlePeriodic, EFFECT_0, SPELL_AURA_DUMMY);
AfterEffectRemove += AuraEffectRemoveFn(spell_serpentshrine_cavern_coilfang_water::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
OnEffectPeriodic += AuraEffectPeriodicFn(spell_serpentshrine_cavern_coilfang_water::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};

View File

@@ -69,6 +69,7 @@ enum SSNPCs
NPC_COILFANG_STRIDER = 22056,
NPC_TAINTED_ELEMENTAL = 22009,
NPC_TOXIC_SPOREBAT = 22140,
NPC_COILFANG_FRENZY = 21508,
GO_LADY_VASHJ_BRIDGE_CONSOLE = 184568,
GO_COILFANG_BRIDGE1 = 184203,
@@ -88,13 +89,18 @@ enum SSSpells
SPELL_SUMMON_SERPENTSHRINE_PARASITE = 39045,
SPELL_RAMPART_INFECTION = 39042,
SPELL_SCALDING_WATER = 37284,
SPELL_FRENZY_WATER = 37026
// SPELL_SERVERSIDE_COILFANG_WATER = 37025, // Dummy Aura, unused
SPELL_SERVERSIDE_SUMMON_FRENZY = 37026,
SPELL_SERVERSIDE_FRENZY_WATER_PERIODIC = 37280
};
enum KeeperCount
enum SSNPCCount
{
MIN_KEEPER_COUNT = 0,
MAX_KEEPER_COUNT = 24
MAX_KEEPER_COUNT = 54,
MAX_FRENZY_COUNT = 50
};
template <class AI, class T>