fix(Scripts/ZulAman): eagle gauntlet (#20719)

* sql

* add script handling

4b890a4096

Co-authored-by: MantisLord <sabinprosper@gmail.com>

* set Akilzon call for help

boss should pull trash

* style: remove blank lines

* add passiveAI header and sort

* Revert "set Akilzon call for help"

This reverts commit 99143339a9f00f048d9bc707d5b8d348e8f6bbd4.

line of sight blocks call for help

---------

Co-authored-by: MantisLord <sabinprosper@gmail.com>
This commit is contained in:
Jelle Meeus
2024-12-01 12:52:44 +01:00
committed by GitHub
parent ed008a8780
commit 81d1fcad65
4 changed files with 312 additions and 7 deletions

View File

@@ -0,0 +1,55 @@
--
-- lookout
-- spawn coords, hp 58682 from 75449
DELETE FROM `creature` WHERE (`id1` = 24175) AND (`guid` = 89281);
INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES
(89281, 24175, 0, 0, 568, 0, 0, 1, 1, 1, 206.92128, 1473.4196, 26.000067, 3.9619, 7200, 0, 0, 58682, 0, 0, 0, 0, 0, '', 0);
UPDATE `creature_template` SET `unit_flags` = `unit_flags` | (64 | 32768) WHERE (`entry` = 24175);
UPDATE `creature_template_model` SET `VerifiedBuild` = 53788 WHERE (`CreatureID` = 24175) AND `Idx` = 0;
DELETE FROM `waypoint_data` WHERE `id` = 2417500;
INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `move_type`) VALUES
(2417500, 1, 226.08507, 1461.7535, 25.916739, NULL, 1),
(2417500, 2, 228.17633, 1433.8473, 27.119087, NULL, 1),
(2417500, 3, 227.73102, 1412.5535, 34.49932, NULL, 1),
(2417500, 4, 228.17111, 1388.2885, 42.451878, NULL, 1),
(2417500, 5, 232.54265, 1374.3815, 47.329865, NULL, 1),
(2417500, 6, 263.18665, 1376.4918, 49.32171, NULL, 1),
(2417500, 7, 281.35666, 1378.9646, 49.32171, NULL, 1),
(2417500, 8, 312.53738, 1389.2349, 57.287518, NULL, 1),
(2417500, 9, 330.47836, 1394.2004, 71.362785, NULL, 1);
-- summon amani eagle at Akil'zon
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 1) AND (`SourceEntry` = 43487);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13, 1, 43487, 0, 0, 31, 0, 3, 23574, 0, 0, 0, 0, '', 'Summon Amani Eagle target Akil\'zon');
-- summon amani warrior at Eagle Troll Spawn Target
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 1) AND (`SourceEntry` = 43486);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13, 1, 43486, 0, 0, 31, 0, 3, 24325, 0, 0, 0, 0, '', 'Summon Amani Eagle target Eagle Troll Spawn Target');
DELETE FROM `creature_text` WHERE (`CreatureID` = 24175) AND (`GroupID` = 0);
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(24175, 0, 0, 'Akil\'zon, the invaders approach!', 14, 0, 100, 5, 0, 0, 22971, 0, 'Amani\'shi Lookout');
UPDATE `creature_template` SET `ScriptName` = 'npc_amanishi_lookout' WHERE (`entry` = 24175);
UPDATE `creature_template` SET `ScriptName` = 'npc_eagle_trash_aggro_trigger' WHERE (`entry` = 24223);
UPDATE `creature_template` SET `ScriptName` = 'npc_amanishi_tempest' WHERE (`entry` = 24549);
-- add missing wind walker and protector spawns
SET @GUID:= 93762;
SET @VERIFIED_BUILD:=0;
DELETE FROM `creature` WHERE (`id1` = 24179) AND (`guid` BETWEEN @GUID+0 AND @GUID+3);
DELETE FROM `creature` WHERE (`id1` = 24180) AND (`guid` BETWEEN @GUID+4 AND @GUID+7);
INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES
(@GUID+0, 24179, 0, 0, 568, 0, 0, 1, 1, 1, 284.0440, 1372.3200, 49.4050, 2.77507, 1800, 0, 0, @VERIFIED_BUILD, 0, 0, 0, 0, 0, '', 0),
(@GUID+1, 24179, 0, 0, 568, 0, 0, 1, 1, 1, 231.7970, 1393.4200, 40.5887, 1.69297, 1800, 0, 0, @VERIFIED_BUILD, 0, 0, 0, 0, 0, '', 0),
(@GUID+2, 24179, 0, 0, 568, 0, 0, 1, 1, 1, 244.8070, 1367.6600, 48.9498, 2.61799, 1800, 0, 0, @VERIFIED_BUILD, 0, 0, 0, 0, 0, '', 0),
(@GUID+3, 24179, 0, 0, 568, 0, 0, 1, 1, 1, 232.7490, 1428.7000, 28.8242, 1.83260, 1800, 0, 0, @VERIFIED_BUILD, 0, 0, 0, 0, 0, '', 0),
(@GUID+4, 24180, 0, 0, 568, 0, 0, 1, 1, 1, 274.3580, 1385.1600, 49.4050, 3.75246, 1800, 0, 0, @VERIFIED_BUILD, 0, 0, 0, 0, 0, '', 0),
(@GUID+5, 24180, 0, 0, 568, 0, 0, 1, 1, 1, 223.8010, 1424.9400, 29.4699, 1.16937, 1800, 0, 0, @VERIFIED_BUILD, 0, 0, 0, 0, 0, '', 0),
(@GUID+6, 24180, 0, 0, 568, 0, 0, 1, 1, 1, 224.0690, 1394.2600, 40.1985, 1.30900, 1800, 0, 0, @VERIFIED_BUILD, 0, 0, 0, 0, 0, '', 0),
(@GUID+7, 24180, 0, 0, 568, 0, 0, 1, 1, 1, 246.9080, 1375.1500, 49.4050, 2.89725, 1800, 0, 0, @VERIFIED_BUILD, 0, 0, 0, 0, 0, '', 0);

View File

@@ -59,10 +59,11 @@ DoorData const doorData[] =
ObjectData const creatureData[] =
{
{ NPC_JANALAI, DATA_JANALAI },
{ NPC_SPIRIT_LYNX, DATA_SPIRIT_LYNX },
{ NPC_HARRISON_JONES, DATA_HARRISON_JONES },
{ 0, 0 }
{ NPC_JANALAI, DATA_JANALAI },
{ NPC_SPIRIT_LYNX, DATA_SPIRIT_LYNX },
{ NPC_HARRISON_JONES, DATA_HARRISON_JONES },
{ NPC_AMINISHI_LOOKOUT, DATA_LOOKOUT },
{ 0, 0 }
};
ObjectData const gameObjectData[] =
@@ -113,6 +114,29 @@ public:
DoAction(ACTION_START_TIMED_RUN);
}
void OnCreatureCreate(Creature* creature) override
{
switch (creature->GetEntry())
{
// Akil'zon gauntlet
case NPC_AMINISHI_TEMPEST:
if (creature->GetPositionZ() >= 50.0f) // excludes Tempest in Hexlord Malacrass' trash
AkilzonTrash.insert(creature->GetGUID());
break;
case NPC_AMINISHI_LOOKOUT:
case NPC_AMINISHI_PROTECTOR:
case NPC_EAGLE_TRASH_AGGRO_TRIGGER:
AkilzonTrash.insert(creature->GetGUID());
break;
case NPC_AMANISHI_WIND_WALKER:
if (creature->GetPositionZ() >= 26.0f) // excludes Wind Walker in first patrol
AkilzonTrash.insert(creature->GetGUID());
break;
}
InstanceScript::OnCreatureCreate(creature);
}
void OnGameObjectCreate(GameObject* go) override
{
if (go->GetEntry() == GO_GATE_HEXLORD)
@@ -167,6 +191,61 @@ public:
RandVendor[0] = data;
else if (type == TYPE_RAND_VENDOR_2)
RandVendor[1] = data;
else if (type == TYPE_AKILZON_GAUNTLET)
{
if (data == IN_PROGRESS)
StartAkilzonGauntlet();
else if (data == NOT_STARTED)
ResetAkilzonGauntlet();
else if (data == DONE)
_akilzonGauntlet = DONE;
}
}
void StartAkilzonGauntlet()
{
_akilzonGauntlet = IN_PROGRESS;
for (ObjectGuid const& guid : AkilzonTrash)
if (Creature* creature = instance->GetCreature(guid))
switch (creature->GetEntry())
{
case NPC_EAGLE_TRASH_AGGRO_TRIGGER:
creature->DisappearAndDie();
break;
case NPC_AMINISHI_LOOKOUT:
case NPC_AMINISHI_TEMPEST:
creature->AI()->DoAction(ACTION_START_AKILZON_GAUNTLET);
break;
default:
break;
}
}
void ResetAkilzonGauntlet()
{
_akilzonGauntlet = NOT_STARTED;
for (ObjectGuid guid : AkilzonTrash)
if (Creature* creature = instance->GetCreature(guid))
if (!creature->IsAlive())
creature->Respawn();
if (Creature* creature = GetCreature(DATA_LOOKOUT))
if (creature->isMoving())
creature->Respawn(true);
}
void OnCreatureEvade(Creature* creature) override
{
switch (creature->GetEntry())
{
case NPC_AMINISHI_TEMPEST:
case NPC_AMINISHI_PROTECTOR:
case NPC_AMANISHI_WIND_WALKER:
if (AkilzonTrash.contains(creature->GetGUID()))
ResetAkilzonGauntlet();
break;
default:
break;
}
}
bool SetBossState(uint32 type, EncounterState state) override
@@ -234,6 +313,8 @@ public:
return RandVendor[0];
else if (type == TYPE_RAND_VENDOR_2)
return RandVendor[1];
else if (type == TYPE_AKILZON_GAUNTLET)
return _akilzonGauntlet;
return 0;
}
@@ -245,6 +326,8 @@ public:
private:
uint32 RandVendor[RAND_VENDOR];
GuidSet AkilzonTrash;
EncounterState _akilzonGauntlet = NOT_STARTED;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override

View File

@@ -15,14 +15,15 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "zulaman.h"
#include "CreatureScript.h"
#include "PassiveAI.h"
#include "Player.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "SpellInfo.h"
#include "SpellScript.h"
#include "SpellScriptLoader.h"
#include "zulaman.h"
/*######
## npc_forest_frog
@@ -530,10 +531,167 @@ class spell_ritual_of_power : public SpellScript
}
};
enum AmanishiLookout
{
PATH_LOOKOUT = 2417500,
SAY_INVADERS = 0,
};
struct npc_amanishi_lookout : public NullCreatureAI
{
npc_amanishi_lookout(Creature* creature) : NullCreatureAI(creature), _instance(creature->GetInstanceScript()) {}
void Reset() override
{
me->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC);
me->RemoveUnitFlag(UNIT_FLAG_RENAME);
}
void MoveInLineOfSight(Unit* who) override
{
if (!me->IsWithinDist(who, 25.0f, false)) // distance not confirmed
return;
Player* player = who->GetCharmerOrOwnerPlayerOrPlayerItself();
if (!player || player->IsGameMaster())
return;
if (!who->IsWithinLOSInMap(me))
return;
if (_instance->GetData(TYPE_AKILZON_GAUNTLET) == NOT_STARTED)
_instance->SetData(TYPE_AKILZON_GAUNTLET, IN_PROGRESS);
}
void DoAction(int32 action) override
{
if (action == ACTION_START_AKILZON_GAUNTLET)
{
Talk(SAY_INVADERS);
me->SetUnitFlag(UNIT_FLAG_IMMUNE_TO_PC);
me->SetUnitFlag(UNIT_FLAG_RENAME);
me->GetMotionMaster()->MovePath(PATH_LOOKOUT, false);
}
}
void MovementInform(uint32 type, uint32 id) override
{
// at boss
if (type == WAYPOINT_MOTION_TYPE && id == 8) // should despawn with waypoint script
me->DespawnOrUnsummon(0s, 0s);
}
private:
InstanceScript* _instance;
};
enum AmanishiTempest
{
ACTION_START_GAUNTLET = 1,
GROUP_AKILZON_GAUNTLET = 1,
SPELL_SUMMON_EAGLE = 43487,
SPELL_SUMMON_WARRIOR = 43486,
SPELL_THUNDERCLAP = 44033,
};
struct npc_amanishi_tempest : public ScriptedAI
{
npc_amanishi_tempest(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _summons(creature) { }
void Reset() override
{
_summons.DespawnAll();
scheduler.CancelAll();
scheduler.Schedule(9s, 11s, [this](TaskContext context)
{
DoCastVictim(SPELL_THUNDERCLAP);
context.Repeat();
});
}
void JustSummoned(Creature* summon) override
{
_summons.Summon(summon);
summon->SetNoCallAssistance(true); // prevent eagles from pulling boss
summon->SetInCombatWithZone();
}
void JustDied(Unit* killer) override
{
ScriptedAI::JustDied(killer);
_instance->SetData(TYPE_AKILZON_GAUNTLET, DONE);
}
void DoAction(int32 action) override
{
if (action == ACTION_START_GAUNTLET)
ScheduleEvents();
}
void EnterEvadeMode(EvadeReason why) override
{
ScriptedAI::EnterEvadeMode(why);
scheduler.CancelAll();
}
void ScheduleEvents()
{
me->SetInCombatWithZone();
scheduler.Schedule(29s, 53s, GROUP_AKILZON_GAUNTLET, [this](TaskContext context)
{
for (uint8 i = 0; i < 5; ++i)
DoCastAOE(SPELL_SUMMON_EAGLE, true);
context.Repeat();
}).Schedule(40s, GROUP_AKILZON_GAUNTLET, [this](TaskContext context)
{
for (uint8 i = 0; i < 2; ++i)
DoCastAOE(SPELL_SUMMON_WARRIOR, true);
context.Repeat();
});
}
void UpdateAI(uint32 diff) override
{
scheduler.Update(diff);
if (!me->IsEngaged())
return;
Unit* victim = me->SelectVictim();
if (!victim || me->GetExactDist(victim) > me->GetAggroRange(victim))
return;
ScriptedAI::UpdateAI(diff);
}
private:
InstanceScript* _instance;
SummonList _summons;
};
struct npc_eagle_trash_aggro_trigger : public ScriptedAI
{
npc_eagle_trash_aggro_trigger(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) {}
void MoveInLineOfSight(Unit* who) override
{
if (!me->IsWithinDist(who, 10.0f, false)) // distance not confirmed
return;
Player* player = who->GetCharmerOrOwnerPlayerOrPlayerItself();
if (!player || player->IsGameMaster())
return;
if (_instance->GetData(TYPE_AKILZON_GAUNTLET) == NOT_STARTED)
_instance->SetData(TYPE_AKILZON_GAUNTLET, IN_PROGRESS);
}
private:
InstanceScript* _instance;
};
void AddSC_zulaman()
{
RegisterZulAmanCreatureAI(npc_forest_frog);
new npc_zulaman_hostage();
RegisterZulAmanCreatureAI(npc_harrison_jones);
RegisterSpellScript(spell_ritual_of_power);
RegisterZulAmanCreatureAI(npc_amanishi_lookout);
RegisterZulAmanCreatureAI(npc_amanishi_tempest);
RegisterZulAmanCreatureAI(npc_eagle_trash_aggro_trigger);
}

View File

@@ -38,7 +38,9 @@ enum DataTypes
DATA_STRANGE_GONG = 10,
DATA_MASSIVE_GATE = 11,
DATA_HEXLORD_GATE = 12,
DATA_HARRISON_JONES = 13
DATA_HARRISON_JONES = 13,
TYPE_AKILZON_GAUNTLET = 14,
DATA_LOOKOUT = 15,
};
enum CreatureIds
@@ -54,7 +56,13 @@ enum CreatureIds
NPC_AMANISHI_TRIBESMAN = 23582,
NPC_AMANISHI_MEDICINE_MAN = 23581,
NPC_AMANISHI_AXE_THROWER = 23542,
NPC_AMANI_HATCHLING = 23598 // 42493
NPC_AMANI_HATCHLING = 23598, // 42493
// Akil'zon gauntlet
NPC_AMANISHI_WIND_WALKER = 24179,
NPC_AMINISHI_LOOKOUT = 24175,
NPC_AMINISHI_PROTECTOR = 24180,
NPC_AMINISHI_TEMPEST = 24549,
NPC_EAGLE_TRASH_AGGRO_TRIGGER = 24223
};
enum GameobjectIds
@@ -77,6 +85,7 @@ enum MiscIds
{
DATA_TIMED_RUN = 0,
ACTION_START_TIMED_RUN = 0,
ACTION_START_AKILZON_GAUNTLET = 1,
GROUP_TIMED_RUN = 1
};