Scripts/SFK: converted achievements to world state handling

This commit is contained in:
Ovahlord
2021-06-14 11:11:10 +02:00
parent c80c23e5c2
commit edb4df4ffc
4 changed files with 38 additions and 94 deletions

View File

@@ -0,0 +1,8 @@
DELETE FROM `achievement_criteria_data` WHERE `ScriptName` IN (
'achievement_pardon_denied',
'achievement_to_the_ground');
DELETE FROM `world_states` WHERE `ID` IN (5670, 5672);
INSERT INTO `world_states` (`ID`, `DefaultValue`, `MapID`, `Comment`) VALUES
(5670, 0, 33, 'Shadowfang Keep - Baron Ashbury - Pardon Denied'),
(5672, 0, 33, 'Shadowfang Keep - Commander Srpingvale - To the Ground!');

View File

@@ -35,7 +35,8 @@ enum Spells
SPELL_PAIN_AND_SUFFERING_DUMMY = 93605,
SPELL_WRACKING_PAIN = 93720,
SPELL_DARK_ARCHANGEL_FORM = 93757,
SPELL_CALAMITY = 93812
SPELL_CALAMITY = 93812,
SPELL_STAY_OF_EXECUTION_HEAL = 93706
};
#define SPELL_STAY_OF_EXECUTION RAID_MODE<uint32>(93468, 93705)
@@ -62,11 +63,6 @@ enum Events
EVENT_DARK_ARCHANGEL_FORM
};
enum AchievementData
{
DATA_PARDON_DENIED = 1
};
struct boss_baron_ashbury : public BossAI
{
boss_baron_ashbury(Creature* creature) : BossAI(creature, DATA_BARON_ASHBURY)
@@ -77,7 +73,6 @@ struct boss_baron_ashbury : public BossAI
void Initialize()
{
_phaseTwoTriggered = false;
_pardonDenied = true;
me->MakeInterruptable(false);
}
@@ -91,7 +86,8 @@ struct boss_baron_ashbury : public BossAI
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
instance->instance->SetWorldState(WORLD_STATE_ID_PARDON_DENIED, 0);
events.ScheduleEvent(EVENT_ASPHYXIATE, IsHeroic() ? 20s + 500ms : 15s + 500ms);
events.ScheduleEvent(EVENT_PAIN_AND_SUFFERING, 6s);
@@ -114,6 +110,15 @@ struct boss_baron_ashbury : public BossAI
_DespawnAtEvade();
}
void HealReceived(Unit* healer, uint32& /*heal*/) override
{
if (healer != me)
return;
if (!instance->instance->GetWorldStateValue(WORLD_STATE_ID_PARDON_DENIED))
instance->instance->SetWorldState(WORLD_STATE_ID_PARDON_DENIED, 1);
}
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
{
if (me->HealthBelowPctDamaged(25, damage) && !_phaseTwoTriggered && IsHeroic())
@@ -139,28 +144,12 @@ struct boss_baron_ashbury : public BossAI
if (spell->Id == SPELL_STAY_OF_EXECUTION)
{
// Failing achievement when Baron Ashbury finished channeling Stay of Execution
if (reason == SPELL_FINISHED_CHANNELING_COMPLETE && IsHeroic())
_pardonDenied = false;
me->SetReactState(REACT_AGGRESSIVE);
me->resetAttackTimer();
events.ScheduleEvent(EVENT_PAIN_AND_SUFFERING, 500ms);
}
}
uint32 GetData(uint32 type) const override
{
switch (type)
{
case DATA_PARDON_DENIED:
return _pardonDenied;
default:
break;
}
return 0;
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
@@ -218,7 +207,6 @@ struct boss_baron_ashbury : public BossAI
}
private:
bool _phaseTwoTriggered;
bool _pardonDenied;
};
class spell_ashbury_asphyxiate : public AuraScript
@@ -300,28 +288,10 @@ class spell_ashbury_dark_archangel_form : public AuraScript
}
};
class achievement_pardon_denied : public AchievementCriteriaScript
{
public:
achievement_pardon_denied() : AchievementCriteriaScript("achievement_pardon_denied") { }
bool OnCheck(Player* /*source*/, Unit* target)
{
if (!target)
return false;
if (target->GetMap()->IsHeroic())
return target->GetAI()->GetData(DATA_PARDON_DENIED);
return false;
}
};
void AddSC_boss_baron_ashbury()
{
RegisterShadowfangKeepCreatureAI(boss_baron_ashbury);
RegisterSpellScript(spell_ashbury_asphyxiate);
RegisterSpellScript(spell_ashbury_pain_and_suffering);
RegisterSpellScript(spell_ashbury_dark_archangel_form);
new achievement_pardon_denied();
}

View File

@@ -84,13 +84,7 @@ enum Events
enum Actions
{
ACTION_UNHOLY_POWER = 1,
ACTION_TO_THE_GROUND
};
enum AchievementData
{
DATA_TO_THE_GROUND = 1
ACTION_UNHOLY_POWER = 1
};
// Heroic additional adds
@@ -116,7 +110,6 @@ public:
void Reset() override
{
_Reset();
_toTheGround = true;
if (IsHeroic())
{
DoSummon(NPC_WAILING_GUARDSMAN, GuardsmanPos, 4000, TEMPSUMMON_CORPSE_TIMED_DESPAWN);
@@ -185,18 +178,6 @@ public:
}
}
uint32 GetData(uint32 type) const override
{
switch (type)
{
case DATA_TO_THE_GROUND:
return _toTheGround;
default:
break;
}
return 0;
}
void DoAction(int32 action) override
{
switch (action)
@@ -219,9 +200,6 @@ public:
else
events.ScheduleEvent(EVENT_SHIELD_OF_THE_PERFIDIOUS, Seconds(1));
break;
case ACTION_TO_THE_GROUND:
_toTheGround = false;
break;
default:
break;
}
@@ -276,10 +254,8 @@ public:
}
DoMeleeAttackIfReady();
}
private:
bool _toTheGround;
};
CreatureAI* GetAI(Creature *creature) const override
{
return GetShadowfangKeepAI<boss_commander_springvaleAI>(creature);
@@ -522,20 +498,19 @@ public:
void HandleStacks()
{
if (Unit* target = GetHitUnit())
if (Creature* target = GetHitCreature())
{
Aura* aura = nullptr;
aura = target->GetAura(SPELL_UNHOLY_POWER_HC);
if (!aura)
target->GetAura(SPELL_UNHOLY_POWER);
if (aura)
if (aura->GetStackAmount() == 3)
if (target->GetTypeId() == TYPEID_UNIT && target->IsAIEnabled)
target->ToCreature()->AI()->DoAction(ACTION_UNHOLY_POWER);
if (aura && aura->GetStackAmount() == 3 && target->IsAIEnabled)
target->ToCreature()->AI()->DoAction(ACTION_UNHOLY_POWER);
if (target->GetTypeId() == TYPEID_UNIT && target->IsAIEnabled)
target->ToCreature()->AI()->DoAction(ACTION_TO_THE_GROUND);
if (InstanceScript* instance = target->GetInstanceScript())
if (!instance->instance->GetWorldStateValue(WORLD_STATE_ID_TO_THE_GROUND))
instance->instance->SetWorldState(WORLD_STATE_ID_TO_THE_GROUND, 1);
}
}
@@ -551,23 +526,6 @@ public:
}
};
class achievement_to_the_ground : public AchievementCriteriaScript
{
public:
achievement_to_the_ground() : AchievementCriteriaScript("achievement_to_the_ground") { }
bool OnCheck(Player* /*source*/, Unit* target)
{
if (!target)
return false;
if (target->GetMap()->IsHeroic())
return target->GetAI()->GetData(DATA_TO_THE_GROUND);
return false;
}
};
void AddSC_boss_commander_springvale()
{
new boss_commander_springvale();
@@ -576,5 +534,4 @@ void AddSC_boss_commander_springvale()
new spell_sfk_forsaken_ability();
new spell_sfk_unholy_power();
new spell_sfk_unholy_empowerment();
new achievement_to_the_ground();
}

View File

@@ -94,6 +94,15 @@ enum SKGameObjectIds
GO_ARUGALS_LAIR = 18971
};
enum SKWorldStates
{
// Baron Ashbury
WORLD_STATE_ID_PARDON_DENIED = 5670,
// Commander Springvale
WORLD_STATE_ID_TO_THE_GROUND = 5672
};
template<class AI>
AI* GetShadowfangKeepAI(Creature* creature)
{