fix(Scripts/RuinsOfAhnQiraj): Implement Rajaxx waves (#12513)

This commit is contained in:
Skjalf
2022-07-25 12:12:08 -03:00
committed by GitHub
parent accb01f180
commit cd3151df40
8 changed files with 288 additions and 24 deletions

View File

@@ -0,0 +1,76 @@
-- Captain Qeez
DELETE FROM `creature_formations` WHERE `leaderGUID` = 144676;
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
(144676, 144676, 0, 0, 11, 0, 0),
(144676, 144611, 0, 0, 11, 0, 0),
(144676, 144656, 0, 0, 11, 0, 0),
(144676, 144653, 0, 0, 11, 0, 0),
(144676, 144655, 0, 0, 11, 0, 0),
(144676, 144610, 0, 0, 11, 0, 0),
(144676, 144654, 0, 0, 11, 0, 0);
-- Tubid
DELETE FROM `creature_formations` WHERE `leaderGUID` = 144677;
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
(144677, 144677, 0, 0, 11, 0, 0),
(144677, 144658, 0, 0, 11, 0, 0),
(144677, 144616, 0, 0, 11, 0, 0),
(144677, 144617, 0, 0, 11, 0, 0),
(144677, 144619, 0, 0, 11, 0, 0),
(144677, 144660, 0, 0, 11, 0, 0),
(144677, 144659, 0, 0, 11, 0, 0);
-- Drenn
DELETE FROM `creature_formations` WHERE `leaderGUID` = 144674;
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
(144674, 144674, 0, 0, 11, 0, 0),
(144674, 144618, 0, 0, 11, 0, 0),
(144674, 144657, 0, 0, 11, 0, 0),
(144674, 144614, 0, 0, 11, 0, 0),
(144674, 144613, 0, 0, 11, 0, 0),
(144674, 144612, 0, 0, 11, 0, 0),
(144674, 144615, 0, 0, 11, 0, 0);
-- Yeggeth
DELETE FROM `creature_formations` WHERE `leaderGUID` = 144652;
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
(144652, 144652, 0, 0, 11, 0, 0),
(144652, 144664, 0, 0, 11, 0, 0),
(144652, 144622, 0, 0, 11, 0, 0),
(144652, 144624, 0, 0, 11, 0, 0),
(144652, 144663, 0, 0, 11, 0, 0),
(144652, 144621, 0, 0, 11, 0, 0),
(144652, 144620, 0, 0, 11, 0, 0);
-- Xurrem
DELETE FROM `creature_formations` WHERE `leaderGUID` = 144675;
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
(144675, 144675, 0, 0, 11, 0, 0),
(144675, 144625, 0, 0, 11, 0, 0),
(144675, 144623, 0, 0, 11, 0, 0),
(144675, 144665, 0, 0, 11, 0, 0),
(144675, 144626, 0, 0, 11, 0, 0),
(144675, 144662, 0, 0, 11, 0, 0),
(144675, 144661, 0, 0, 11, 0, 0);
-- Pakkon
DELETE FROM `creature_formations` WHERE `leaderGUID` = 144673;
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
(144673, 144673, 0, 0, 11, 0, 0),
(144673, 144669, 0, 0, 11, 0, 0),
(144673, 144630, 0, 0, 11, 0, 0),
(144673, 144670, 0, 0, 11, 0, 0),
(144673, 144631, 0, 0, 11, 0, 0),
(144673, 144672, 0, 0, 11, 0, 0),
(144673, 144671, 0, 0, 11, 0, 0);
-- Zerram
DELETE FROM `creature_formations` WHERE `leaderGUID` = 144651;
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
(144651, 144651, 0, 0, 11, 0, 0),
(144651, 144668, 0, 0, 11, 0, 0),
(144651, 144629, 0, 0, 11, 0, 0),
(144651, 144667, 0, 0, 11, 0, 0),
(144651, 144628, 0, 0, 11, 0, 0),
(144651, 144666, 0, 0, 11, 0, 0),
(144651, 144627, 0, 0, 11, 0, 0);

View File

@@ -27,6 +27,7 @@
#include "Vehicle.h" #include "Vehicle.h"
#include "ScriptMgr.h" #include "ScriptMgr.h"
#include "Language.h" #include "Language.h"
#include "ZoneScript.h"
class PhasedRespawn : public BasicEvent class PhasedRespawn : public BasicEvent
{ {
@@ -308,6 +309,9 @@ bool CreatureAI::_EnterEvadeMode(EvadeReason /*why*/)
me->SetLastDamagedTime(0); me->SetLastDamagedTime(0);
me->SetCannotReachTarget(); me->SetCannotReachTarget();
if (ZoneScript* zoneScript = me->GetZoneScript() ? me->GetZoneScript() : (ZoneScript*)me->GetInstanceScript())
zoneScript->OnCreatureEvade(me);
if (me->IsInEvadeMode()) if (me->IsInEvadeMode())
{ {
return false; return false;

View File

@@ -381,3 +381,40 @@ void CreatureGroup::LeaderMoveTo(float x, float y, float z, bool run)
} }
} }
} }
void CreatureGroup::RespawnFormation(bool force)
{
for (auto const& itr : m_members)
{
if (itr.first && !itr.first->IsAlive())
{
itr.first->Respawn(force);
}
}
}
bool CreatureGroup::IsFormationInCombat()
{
for (auto const& itr : m_members)
{
if (itr.first && itr.first->IsInCombat())
{
return true;
}
}
return false;
}
bool CreatureGroup::IsAnyMemberAlive()
{
for (auto const& itr : m_members)
{
if (itr.first && itr.first->IsAlive())
{
return true;
}
}
return false;
}

View File

@@ -109,6 +109,9 @@ public:
void LeaderMoveTo(float x, float y, float z, bool run); void LeaderMoveTo(float x, float y, float z, bool run);
void MemberEngagingTarget(Creature* member, Unit* target); void MemberEngagingTarget(Creature* member, Unit* target);
void MemberEvaded(Creature* member); void MemberEvaded(Creature* member);
void RespawnFormation(bool force = false);
[[nodiscard]] bool IsFormationInCombat();
[[nodiscard]] bool IsAnyMemberAlive();
private: private:
Creature* m_leader; //Important do not forget sometimes to work with pointers instead synonims :D:D Creature* m_leader; //Important do not forget sometimes to work with pointers instead synonims :D:D

View File

@@ -39,6 +39,7 @@ public:
virtual void OnGameObjectRemove(GameObject*) { } virtual void OnGameObjectRemove(GameObject*) { }
virtual void OnUnitDeath(Unit*) { } virtual void OnUnitDeath(Unit*) { }
virtual void OnCreatureEvade(Creature*) { }
//All-purpose data storage 64 bit //All-purpose data storage 64 bit
virtual ObjectGuid GetGuidData(uint32 /*DataId*/) const { return ObjectGuid::Empty; } virtual ObjectGuid GetGuidData(uint32 /*DataId*/) const { return ObjectGuid::Empty; }

View File

@@ -22,16 +22,6 @@
enum Yells enum Yells
{ {
// The time of our retribution is at hand! Let darkness reign in the hearts of our enemies! Sound: 8645 Emote: 35
SAY_ANDOROV_INTRO = 0, // Before for the first wave
SAY_ANDOROV_ATTACK = 1, // Beginning the event
SAY_WAVE3 = 0,
SAY_WAVE4 = 1,
SAY_WAVE5 = 2,
SAY_WAVE6 = 3,
SAY_WAVE7 = 4,
SAY_INTRO = 5,
SAY_UNK1 = 6, SAY_UNK1 = 6,
SAY_UNK2 = 7, SAY_UNK2 = 7,
SAY_UNK3 = 8, SAY_UNK3 = 8,
@@ -63,27 +53,25 @@ public:
struct boss_rajaxxAI : public BossAI struct boss_rajaxxAI : public BossAI
{ {
boss_rajaxxAI(Creature* creature) : BossAI(creature, DATA_RAJAXX) boss_rajaxxAI(Creature* creature) : BossAI(creature, DATA_RAJAXX) { }
{
}
void Reset() override void Reset() override
{ {
_Reset(); _Reset();
enraged = false; enraged = false;
events.ScheduleEvent(EVENT_DISARM, 10000);
events.ScheduleEvent(EVENT_THUNDERCRASH, 12000);
} }
void JustDied(Unit* /*killer*/) override void JustDied(Unit* /*killer*/) override
{ {
//SAY_DEATH Talk(SAY_DEATH);
_JustDied(); _JustDied();
} }
void EnterCombat(Unit* /*victim*/) override void EnterCombat(Unit* /*victim*/) override
{ {
_EnterCombat(); _EnterCombat();
events.ScheduleEvent(EVENT_DISARM, 10000);
events.ScheduleEvent(EVENT_THUNDERCRASH, 12000);
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override

View File

@@ -15,14 +15,46 @@
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "CreatureGroups.h"
#include "InstanceScript.h" #include "InstanceScript.h"
#include "ScriptMgr.h" #include "ScriptMgr.h"
#include "TaskScheduler.h"
#include "ruins_of_ahnqiraj.h" #include "ruins_of_ahnqiraj.h"
ObjectData const creatureData[] = ObjectData const creatureData[] =
{ {
{ NPC_OSSIRIAN, DATA_OSSIRIAN }, { NPC_KURINNAXX, DATA_KURINNAXX },
{ NPC_KURINNAXX, DATA_KURINNAXX } { NPC_RAJAXX, DATA_RAJAXX },
{ NPC_OSSIRIAN, DATA_OSSIRIAN },
{ NPC_QUUEZ, DATA_QUUEZ },
{ NPC_TUUBID, DATA_TUUBID },
{ NPC_DRENN, DATA_DRENN },
{ NPC_XURREM, DATA_XURREM },
{ NPC_YEGGETH, DATA_YEGGETH },
{ NPC_PAKKON, DATA_PAKKON },
{ NPC_ZERRAN, DATA_ZERRAN },
};
enum RajaxxText
{
SAY_WAVE3 = 0,
SAY_WAVE4 = 1,
SAY_WAVE5 = 2,
SAY_WAVE6 = 3,
SAY_WAVE7 = 4,
SAY_ENGAGE = 5
};
std::array<uint32, 8> RajaxxWavesData[] =
{
{ DATA_QUUEZ, 0 },
{ DATA_TUUBID, 0 },
{ DATA_DRENN, SAY_WAVE3 },
{ DATA_XURREM, SAY_WAVE4 },
{ DATA_YEGGETH, SAY_WAVE5 },
{ DATA_PAKKON, SAY_WAVE6 },
{ DATA_ZERRAN, SAY_WAVE7 },
{ DATA_RAJAXX, SAY_ENGAGE }
}; };
class instance_ruins_of_ahnqiraj : public InstanceMapScript class instance_ruins_of_ahnqiraj : public InstanceMapScript
@@ -36,6 +68,7 @@ public:
{ {
SetBossNumber(NUM_ENCOUNTER); SetBossNumber(NUM_ENCOUNTER);
LoadObjectData(creatureData, nullptr); LoadObjectData(creatureData, nullptr);
_rajaxWaveCounter = 0;
} }
void OnCreatureCreate(Creature* creature) override void OnCreatureCreate(Creature* creature) override
@@ -65,12 +98,73 @@ public:
} }
} }
bool SetBossState(uint32 bossId, EncounterState state) override void OnCreatureEvade(Creature* creature) override
{ {
if (!InstanceScript::SetBossState(bossId, state)) if (CreatureGroup* formation = creature->GetFormation())
return false; {
if (Creature* leader = formation->GetLeader())
{
switch (leader->GetEntry())
{
case NPC_QUUEZ:
case NPC_TUUBID:
case NPC_DRENN:
case NPC_XURREM:
case NPC_YEGGETH:
case NPC_PAKKON:
case NPC_ZERRAN:
if (!formation->IsFormationInCombat())
{
ResetRajaxxWaves();
}
break;
default:
break;
}
}
}
else if (creature->GetEntry() == NPC_RAJAXX)
{
ResetRajaxxWaves();
}
}
return true; void OnUnitDeath(Unit* unit) override
{
if (Creature* creature = unit->ToCreature())
{
if (CreatureGroup* formation = creature->GetFormation())
{
if (Creature* leader = formation->GetLeader())
{
switch (leader->GetEntry())
{
case NPC_QUUEZ:
case NPC_TUUBID:
case NPC_DRENN:
case NPC_XURREM:
case NPC_YEGGETH:
case NPC_PAKKON:
case NPC_ZERRAN:
_scheduler.CancelAll();
_scheduler.Schedule(1s, [this, formation](TaskContext /*context*/) {
if (!formation->IsAnyMemberAlive())
{
CallNextRajaxxLeader();
}
});
break;
default:
break;
}
}
}
}
}
void Update(uint32 diff) override
{
_scheduler.Update(diff);
} }
void SetGuidData(uint32 type, ObjectGuid data) override void SetGuidData(uint32 type, ObjectGuid data) override
@@ -145,6 +239,46 @@ public:
OUT_LOAD_INST_DATA_COMPLETE; OUT_LOAD_INST_DATA_COMPLETE;
} }
void CallNextRajaxxLeader()
{
++_rajaxWaveCounter;
if (Creature* nextLeader = GetCreature(RajaxxWavesData[_rajaxWaveCounter].at(0)))
{
if (_rajaxWaveCounter >= 2)
{
if (Creature* rajaxx = GetCreature(DATA_RAJAXX))
{
rajaxx->AI()->Talk(RajaxxWavesData[_rajaxWaveCounter].at(1));
}
}
if (nextLeader->IsAlive())
{
nextLeader->SetInCombatWithZone();
}
else
{
CallNextRajaxxLeader();
}
}
}
void ResetRajaxxWaves()
{
_rajaxWaveCounter = 0;
for (auto const& data : RajaxxWavesData)
{
if (Creature* creature = GetCreature(data.at(0)))
{
if (CreatureGroup* group = creature->GetFormation())
{
group->RespawnFormation(true);
}
}
}
}
private: private:
ObjectGuid _kurinnaxxGUID; ObjectGuid _kurinnaxxGUID;
ObjectGuid _rajaxxGUID; ObjectGuid _rajaxxGUID;
@@ -153,6 +287,8 @@ public:
ObjectGuid _ayamissGUID; ObjectGuid _ayamissGUID;
ObjectGuid _ossirianGUID; ObjectGuid _ossirianGUID;
ObjectGuid _paralyzedGUID; ObjectGuid _paralyzedGUID;
uint32 _rajaxWaveCounter;
TaskScheduler _scheduler;
}; };
InstanceScript* GetInstanceScript(InstanceMap* map) const override InstanceScript* GetInstanceScript(InstanceMap* map) const override

View File

@@ -32,7 +32,17 @@ enum DataTypes
DATA_OSSIRIAN = 5, DATA_OSSIRIAN = 5,
NUM_ENCOUNTER = 6, NUM_ENCOUNTER = 6,
DATA_PARALYZED = 7 DATA_PARALYZED = 7,
DATA_QUUEZ = 8,
DATA_TUUBID = 9,
DATA_DRENN = 10,
DATA_XURREM = 11,
DATA_YEGGETH = 12,
DATA_PAKKON = 13,
DATA_ZERRAN = 14,
DATA_ENGAGED_FORMATION = 1
}; };
enum Creatures enum Creatures
@@ -52,7 +62,16 @@ enum Creatures
NPC_BURU_EGG = 15514, NPC_BURU_EGG = 15514,
NPC_LARVA = 15555, NPC_LARVA = 15555,
NPC_SWARMER = 15546, NPC_SWARMER = 15546,
NPC_HORNET = 15934 NPC_HORNET = 15934,
// Rajaxx
NPC_QUUEZ = 15391,
NPC_TUUBID = 15392,
NPC_DRENN = 15389,
NPC_XURREM = 15390,
NPC_YEGGETH = 15386,
NPC_PAKKON = 15388,
NPC_ZERRAN = 15385
}; };
enum GameObjects enum GameObjects