fix(Scripts/ZulGurub): Thekal improvements (#12238)
* fix(Scripts/ZulGurub): Thekal improvements * Update boss_thekal.cpp
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user