fix(Scripts/ShatteredHalls): fixes to Warbring O'mrogg combat scripts and timers (#16091)
* initial attempt at combat fix with modernising * fixes to scheduler first Draft PR commit. Scheduler now works with boolean in capture list of lambda function. * whitespaces * debug * debug2 * debug3 * debug4 * add omrogg equip query and debug5 * remove tabs * Update data/sql/updates/pending_db_world/omroggequip.sql Co-authored-by: Gultask <100873791+Gultask@users.noreply.github.com> * grouped taskscheduler * added more groups * adjust timer * better handling * v2 (too many commits) * fixed melee * clean up debug info removal of yells * more debug * attempt at fix * some changes to scheduling * final * whitespaces and extra lines * better formatting * final whitespace fix * context fix * dumb fix --------- Co-authored-by: Gultask <100873791+Gultask@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,5 @@
|
|||||||
|
--
|
||||||
|
DELETE FROM `creature_equip_template` WHERE `CreatureID` = 16809 AND `ID` IN (1, 2);
|
||||||
|
INSERT INTO `creature_equip_template` (`CreatureID`, `ID`, `ItemID1`, `ItemID2`, `ItemID3`, `VerifiedBuild`) VALUES
|
||||||
|
(16809, 1, 29484, 0, 0, 48999),
|
||||||
|
(16809, 2, 29479, 0, 0, 48999);
|
||||||
+86
-46
@@ -24,8 +24,11 @@ enum Spells
|
|||||||
SPELL_BLAST_WAVE = 30600,
|
SPELL_BLAST_WAVE = 30600,
|
||||||
SPELL_FEAR = 30584,
|
SPELL_FEAR = 30584,
|
||||||
SPELL_THUNDERCLAP = 30633,
|
SPELL_THUNDERCLAP = 30633,
|
||||||
|
SPELL_BEATDOWN = 30618,
|
||||||
SPELL_BURNING_MAUL_N = 30598,
|
SPELL_BURNING_MAUL_N = 30598,
|
||||||
SPELL_BURNING_MAUL_H = 36056,
|
SPELL_BURNING_MAUL_H = 36056,
|
||||||
|
EQUIP_STANDARD = 1,
|
||||||
|
EQUIP_BURNING_MAUL = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Creatures
|
enum Creatures
|
||||||
@@ -57,12 +60,13 @@ enum Events
|
|||||||
EVENT_KILL_YELL_LEFT = 8,
|
EVENT_KILL_YELL_LEFT = 8,
|
||||||
EVENT_KILL_YELL_RIGHT = 9,
|
EVENT_KILL_YELL_RIGHT = 9,
|
||||||
EVENT_DEATH_YELL = 10,
|
EVENT_DEATH_YELL = 10,
|
||||||
|
};
|
||||||
|
|
||||||
EVENT_SPELL_FEAR = 20,
|
enum Phase
|
||||||
EVENT_SPELL_BURNING_MAUL = 21,
|
{
|
||||||
EVENT_SPELL_THUNDER_CLAP = 22,
|
GROUP_NON_BURNING_PHASE = 0,
|
||||||
EVENT_RESET_THREAT = 23,
|
GROUP_BURNING_PHASE = 1,
|
||||||
EVENT_SPELL_BLAST_WAVE = 24
|
GROUP_FULL_PHASE = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
// ########################################################
|
// ########################################################
|
||||||
@@ -78,6 +82,10 @@ public:
|
|||||||
{
|
{
|
||||||
boss_warbringer_omroggAI(Creature* creature) : BossAI(creature, DATA_OMROGG)
|
boss_warbringer_omroggAI(Creature* creature) : BossAI(creature, DATA_OMROGG)
|
||||||
{
|
{
|
||||||
|
scheduler.SetValidator([this]
|
||||||
|
{
|
||||||
|
return !me->HasUnitState(UNIT_STATE_CASTING);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
EventMap events2;
|
EventMap events2;
|
||||||
@@ -105,11 +113,79 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
_JustEngagedWith();
|
_JustEngagedWith();
|
||||||
|
scheduler.Schedule(500ms, GROUP_FULL_PHASE, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
scheduler.Schedule(12100ms, 17300ms, GROUP_NON_BURNING_PHASE, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
DoCastAOE(SPELL_THUNDERCLAP);
|
||||||
|
context.Repeat(17200ms, 24200ms);
|
||||||
|
}).Schedule(20s, 30s, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/)
|
||||||
|
{
|
||||||
|
DoCastSelf(SPELL_BEATDOWN, false);
|
||||||
|
me->SetUnitFlag(UNIT_FLAG_PACIFIED);
|
||||||
|
me->SetReactState(REACT_PASSIVE);
|
||||||
|
scheduler.Schedule(200ms, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/)
|
||||||
|
{
|
||||||
|
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||||
|
{
|
||||||
|
uint8 threatYell = urand(EVENT_THREAT_YELL_L_1, EVENT_THREAT_YELL_R_1);
|
||||||
|
if (Creature* head = threatYell == EVENT_THREAT_YELL_R_1 ? GetRightHead() : GetLeftHead())
|
||||||
|
head->AI()->Talk(threatYell - 1);
|
||||||
|
events.ScheduleEvent(threatYell, 3000);
|
||||||
|
DoResetThreatList();
|
||||||
|
me->AddThreat(target, 2250.0f);
|
||||||
|
scheduler.Schedule(1200ms, GROUP_BURNING_PHASE, [this](TaskContext /*context*/)
|
||||||
|
{
|
||||||
|
me->SetReactState(REACT_AGGRESSIVE);
|
||||||
|
me->RemoveUnitFlag(UNIT_FLAG_PACIFIED);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}).Schedule(40s, 60s, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/)
|
||||||
|
{
|
||||||
|
me->SetUnitFlag(UNIT_FLAG_PACIFIED);
|
||||||
|
me->SetReactState(REACT_PASSIVE);
|
||||||
|
scheduler.Schedule(1200ms, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/)
|
||||||
|
{
|
||||||
|
DoCastSelf(SPELL_FEAR, false);
|
||||||
|
DoCastSelf(DUNGEON_MODE(SPELL_BURNING_MAUL_N, SPELL_BURNING_MAUL_H), false);
|
||||||
|
me->LoadEquipment(EQUIP_BURNING_MAUL);
|
||||||
|
scheduler.CancelGroup(GROUP_NON_BURNING_PHASE);
|
||||||
|
scheduler.Schedule(200ms, GROUP_BURNING_PHASE, [this](TaskContext /*context*/)
|
||||||
|
{
|
||||||
|
me->Yell("%s roars!", LANG_UNIVERSAL);
|
||||||
|
scheduler.Schedule(2200ms, GROUP_BURNING_PHASE, [this](TaskContext /*context*/)
|
||||||
|
{
|
||||||
|
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||||
|
{
|
||||||
|
uint8 threatYell = urand(EVENT_THREAT_YELL_L_1, EVENT_THREAT_YELL_R_1);
|
||||||
|
if (Creature* head = threatYell == EVENT_THREAT_YELL_R_1 ? GetRightHead() : GetLeftHead())
|
||||||
|
head->AI()->Talk(threatYell - 1);
|
||||||
|
events.ScheduleEvent(threatYell, 3000);
|
||||||
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_FEAR, 8000);
|
DoResetThreatList();
|
||||||
events.ScheduleEvent(EVENT_SPELL_BURNING_MAUL, 25000);
|
me->AddThreat(target, 2250.0f);
|
||||||
events.ScheduleEvent(EVENT_SPELL_THUNDER_CLAP, 15000);
|
me->SetReactState(REACT_AGGRESSIVE);
|
||||||
events.ScheduleEvent(EVENT_RESET_THREAT, 30000);
|
me->RemoveUnitFlag(UNIT_FLAG_PACIFIED);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
scheduler.Schedule(4850ms, 8500ms, GROUP_BURNING_PHASE, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
DoCastAOE(SPELL_BLAST_WAVE, false);
|
||||||
|
context.Repeat(4850ms, 8500ms);
|
||||||
|
}).Schedule(45s, 60s, GROUP_BURNING_PHASE, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
me->LoadEquipment(EQUIP_STANDARD);
|
||||||
|
context.CancelGroup(GROUP_BURNING_PHASE);
|
||||||
|
scheduler.RescheduleGroup(GROUP_NON_BURNING_PHASE, 5ms);
|
||||||
|
context.RescheduleGroup(GROUP_NON_BURNING_PHASE, 5ms);
|
||||||
|
context.RescheduleGroup(GROUP_FULL_PHASE, 1050ms);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
context.Repeat(130s, 150s);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void JustSummoned(Creature* summoned) override
|
void JustSummoned(Creature* summoned) override
|
||||||
@@ -157,6 +233,7 @@ public:
|
|||||||
void UpdateAI(uint32 diff) override
|
void UpdateAI(uint32 diff) override
|
||||||
{
|
{
|
||||||
events2.Update(diff);
|
events2.Update(diff);
|
||||||
|
scheduler.Update(diff);
|
||||||
switch (uint32 eventId = events2.ExecuteEvent())
|
switch (uint32 eventId = events2.ExecuteEvent())
|
||||||
{
|
{
|
||||||
case EVENT_AGGRO_YELL_1:
|
case EVENT_AGGRO_YELL_1:
|
||||||
@@ -179,45 +256,9 @@ public:
|
|||||||
if (!UpdateVictim())
|
if (!UpdateVictim())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
events.Update(diff);
|
|
||||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
switch (events.ExecuteEvent())
|
|
||||||
{
|
|
||||||
case EVENT_SPELL_FEAR:
|
|
||||||
me->CastSpell(me, SPELL_FEAR, false);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_FEAR, 22000);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_THUNDER_CLAP:
|
|
||||||
me->CastSpell(me, SPELL_THUNDERCLAP, false);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_THUNDER_CLAP, 25000);
|
|
||||||
break;
|
|
||||||
case EVENT_RESET_THREAT:
|
|
||||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
|
||||||
{
|
|
||||||
uint8 threatYell = urand(EVENT_THREAT_YELL_L_1, EVENT_THREAT_YELL_R_1);
|
|
||||||
if (Creature* head = threatYell == EVENT_THREAT_YELL_R_1 ? GetRightHead() : GetLeftHead())
|
|
||||||
head->AI()->Talk(threatYell - 1);
|
|
||||||
events.ScheduleEvent(threatYell, 3000);
|
|
||||||
|
|
||||||
DoResetThreatList();
|
|
||||||
me->AddThreat(target, 10.0f);
|
|
||||||
}
|
|
||||||
events.ScheduleEvent(EVENT_RESET_THREAT, 30000);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_BURNING_MAUL:
|
|
||||||
Talk(EMOTE_ENRAGE);
|
|
||||||
me->CastSpell(me, DUNGEON_MODE(SPELL_BURNING_MAUL_N, SPELL_BURNING_MAUL_H), false);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_BURNING_MAUL, 40000);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_BLAST_WAVE, 15000);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_BLAST_WAVE, 20000);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_BLAST_WAVE:
|
|
||||||
me->CastSpell(me, SPELL_BLAST_WAVE, false);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
DoMeleeAttackIfReady();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -255,7 +296,6 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 timer;
|
uint32 timer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user