mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-03-09 18:50:33 +00:00
fix(Scripts/SSC): Rewrite Coilfang Water Handling (#24559)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user