fix(Scripts/ZulGurub): Thekal improvements (#12238)

* fix(Scripts/ZulGurub): Thekal improvements

* Update boss_thekal.cpp
This commit is contained in:
Skjalf
2022-07-02 13:37:56 -03:00
committed by GitHub
parent 8de594e000
commit 16f2983307
4 changed files with 38 additions and 63 deletions
@@ -0,0 +1,5 @@
--
DELETE FROM `creature_formations` WHERE `memberGUID` IN (49313, 49314);
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
(49310, 49313, 0, 0, 27, 0, 0),
(49310, 49314, 0, 0, 27, 0, 0);
@@ -384,8 +384,6 @@ public:
void ModifyThreatPercentTemp(Unit* victim, int32 percent, Milliseconds duration); void ModifyThreatPercentTemp(Unit* victim, int32 percent, Milliseconds duration);
void ResetFaction() { SetFaction(GetCreatureTemplate()->faction); }
protected: protected:
bool CreateFromProto(ObjectGuid::LowType guidlow, uint32 Entry, uint32 vehId, const CreatureData* data = nullptr); bool CreateFromProto(ObjectGuid::LowType guidlow, uint32 Entry, uint32 vehId, const CreatureData* data = nullptr);
bool InitEntry(uint32 entry, const CreatureData* data = nullptr); bool InitEntry(uint32 entry, const CreatureData* data = nullptr);
@@ -71,9 +71,6 @@ public:
Initialize(); Initialize();
} }
bool Enraged;
bool WasDead;
void Initialize() void Initialize()
{ {
Enraged = false; Enraged = false;
@@ -90,17 +87,16 @@ public:
me->SetStandState(UNIT_STAND_STATE_STAND); me->SetStandState(UNIT_STAND_STATE_STAND);
me->SetReactState(REACT_AGGRESSIVE); me->SetReactState(REACT_AGGRESSIVE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->LoadEquipment(1, true);
if (Creature* zealot = instance->GetCreature(DATA_LORKHAN)) if (Creature* zealot = instance->GetCreature(DATA_LORKHAN))
{ {
zealot->AI()->Reset(); zealot->AI()->Reset();
zealot->ResetFaction();
} }
if (Creature* zealot = instance->GetCreature(DATA_ZATH)) if (Creature* zealot = instance->GetCreature(DATA_ZATH))
{ {
zealot->AI()->Reset(); zealot->AI()->Reset();
zealot->ResetFaction();
} }
_scheduler.SetValidator([this] _scheduler.SetValidator([this]
@@ -157,16 +153,21 @@ public:
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType, SpellSchoolMask) override void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType, SpellSchoolMask) override
{ {
if (!WasDead && damage >= me->GetHealth()) if (me->GetEntry() == NPC_HIGH_PRIEST_THEKAL && damage >= me->GetHealth())
{ {
damage = me->GetHealth() - 1; damage = me->GetHealth() - 1;
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_PASSIVE); if (!WasDead)
me->SetStandState(UNIT_STAND_STATE_SLEEP); {
me->AttackStop(); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
WasDead = true; me->SetReactState(REACT_PASSIVE);
CheckPhaseTransition(); me->SetStandState(UNIT_STAND_STATE_SLEEP);
Talk(EMOTE_THEKAL_DIES); me->AttackStop();
DoResetThreat();
WasDead = true;
CheckPhaseTransition();
Talk(EMOTE_THEKAL_DIES);
}
} }
if (!Enraged && me->HealthBelowPctDamaged(20, damage) && me->GetEntry() != NPC_HIGH_PRIEST_THEKAL) if (!Enraged && me->HealthBelowPctDamaged(20, damage) && me->GetEntry() != NPC_HIGH_PRIEST_THEKAL)
@@ -182,7 +183,7 @@ public:
{ {
me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
me->ResetFaction(); me->RestoreFaction();
me->SetReactState(REACT_AGGRESSIVE); me->SetReactState(REACT_AGGRESSIVE);
me->SetFullHealth(); me->SetFullHealth();
WasDead = false; WasDead = false;
@@ -202,11 +203,7 @@ public:
{ {
if (Creature* zealot = instance->GetCreature(zealotData)) if (Creature* zealot = instance->GetCreature(zealotData))
{ {
zealot->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); zealot->Respawn(true);
zealot->ResetFaction();
zealot->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
zealot->SetReactState(REACT_AGGRESSIVE);
zealot->SetFullHealth();
UpdateZealotStatus(zealotData, false); UpdateZealotStatus(zealotData, false);
} }
} }
@@ -231,10 +228,10 @@ public:
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
me->SetStandState(UNIT_STAND_STATE_STAND); me->SetStandState(UNIT_STAND_STATE_STAND);
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
DoResetThreat();
_scheduler.Schedule(6s, [this](TaskContext /*context*/) { _scheduler.Schedule(6s, [this](TaskContext /*context*/) {
DoCastSelf(SPELL_TIGER_FORM); DoCastSelf(SPELL_TIGER_FORM);
me->LoadEquipment(0, true);
me->SetReactState(REACT_AGGRESSIVE); me->SetReactState(REACT_AGGRESSIVE);
_scheduler.Schedule(30s, [this](TaskContext context) { _scheduler.Schedule(30s, [this](TaskContext context) {
@@ -261,7 +258,10 @@ public:
else else
{ {
_scheduler.Schedule(10s, [this](TaskContext /*context*/) { _scheduler.Schedule(10s, [this](TaskContext /*context*/) {
DoAction(ACTION_RESSURRECT); if (!(WasDead && _lorkhanDied && _zathDied))
{
DoAction(ACTION_RESSURRECT);
}
}); });
} }
} }
@@ -271,6 +271,8 @@ public:
GuidVector _catGuids; GuidVector _catGuids;
bool _lorkhanDied; bool _lorkhanDied;
bool _zathDied; bool _zathDied;
bool Enraged;
bool WasDead;
}; };
CreatureAI* GetAI(Creature* creature) const override CreatureAI* GetAI(Creature* creature) const override
@@ -295,10 +297,6 @@ public:
void Reset() override void Reset() override
{ {
me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_AGGRESSIVE);
_scheduler.CancelAll(); _scheduler.CancelAll();
_scheduler.SetValidator([this] _scheduler.SetValidator([this]
@@ -339,24 +337,13 @@ public:
}); });
} }
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType, SpellSchoolMask) override void JustDied(Unit* /*killer*/) override
{ {
if (damage >= me->GetHealth() && me->HasReactState(REACT_AGGRESSIVE)) Talk(EMOTE_ZEALOT_DIES);
if (Creature* thekal = instance->GetCreature(DATA_THEKAL))
{ {
Talk(EMOTE_ZEALOT_DIES); thekal->AI()->SetData(ACTION_RESSURRECT, DATA_LORKHAN);
me->RemoveAllAuras();
me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
me->SetStandState(UNIT_STAND_STATE_SLEEP);
me->SetReactState(REACT_PASSIVE);
me->InterruptNonMeleeSpells(false);
me->AttackStop();
damage = 0;
if (Creature* thekal = instance->GetCreature(DATA_THEKAL))
{
thekal->AI()->SetData(ACTION_RESSURRECT, DATA_LORKHAN);
}
} }
} }
@@ -395,10 +382,6 @@ public:
void Reset() override void Reset() override
{ {
me->SetStandState(UNIT_STAND_STATE_STAND);
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_AGGRESSIVE);
_scheduler.CancelAll(); _scheduler.CancelAll();
_scheduler.SetValidator([this] _scheduler.SetValidator([this]
@@ -436,23 +419,13 @@ public:
}); });
} }
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType, SpellSchoolMask) override void JustDied(Unit* /*killer*/) override
{ {
if (damage >= me->GetHealth() && me->HasReactState(REACT_AGGRESSIVE)) Talk(EMOTE_ZEALOT_DIES);
if (Creature* thekal = instance->GetCreature(DATA_THEKAL))
{ {
Talk(EMOTE_ZEALOT_DIES); thekal->AI()->SetData(ACTION_RESSURRECT, DATA_ZATH);
me->RemoveAllAuras();
me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
me->SetStandState(UNIT_STAND_STATE_SLEEP);
me->SetReactState(REACT_PASSIVE);
me->AttackStop();
damage = 0;
if (Creature* thekal = instance->GetCreature(DATA_THEKAL))
{
thekal->AI()->SetData(ACTION_RESSURRECT, DATA_ZATH);
}
} }
} }
@@ -51,7 +51,6 @@ public:
instance_zulgurub_InstanceMapScript(Map* map) : InstanceScript(map) instance_zulgurub_InstanceMapScript(Map* map) : InstanceScript(map)
{ {
SetBossNumber(EncounterCount); SetBossNumber(EncounterCount);
LoadObjectData(creatureData, nullptr);
LoadDoorData(doorData); LoadDoorData(doorData);
LoadObjectData(creatureData, nullptr); LoadObjectData(creatureData, nullptr);
} }