mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-02-17 01:04:34 +00:00
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:
@@ -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);
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user