Scripts/Northrend: Update zone scripts to new register model (#27906)
(cherry picked from commit 2d39f22697af7f644b556b07eec292697459655d)
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -54,76 +54,65 @@ enum NPCs // All outdoor guards are within 35.0f of these NPCs
|
||||
NPC_SUNREAVER_GUARDIAN_MAGE = 29255,
|
||||
};
|
||||
|
||||
class npc_mageguard_dalaran : public CreatureScript
|
||||
struct npc_mageguard_dalaran : public ScriptedAI
|
||||
{
|
||||
public:
|
||||
npc_mageguard_dalaran() : CreatureScript("npc_mageguard_dalaran") { }
|
||||
npc_mageguard_dalaran(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
struct npc_mageguard_dalaranAI : public ScriptedAI
|
||||
void Reset() override { }
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override { }
|
||||
|
||||
void AttackStart(Unit* /*who*/) override { }
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
npc_mageguard_dalaranAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void Reset() override { }
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override { }
|
||||
|
||||
void AttackStart(Unit* /*who*/) override { }
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
if (!who || !who->IsInWorld() || who->GetZoneId() != 4395)
|
||||
return;
|
||||
|
||||
if (!me->IsWithinDist(who, 65.0f, false))
|
||||
return;
|
||||
|
||||
Player* player = who->GetCharmerOrOwnerPlayerOrPlayerItself();
|
||||
|
||||
if (!player || player->IsGameMaster() || player->IsBeingTeleported() ||
|
||||
// If player has Disguise aura for quest A Meeting With The Magister or An Audience With The Arcanist, do not teleport it away but let it pass
|
||||
player->HasAura(SPELL_SUNREAVER_DISGUISE_FEMALE) || player->HasAura(SPELL_SUNREAVER_DISGUISE_MALE) ||
|
||||
player->HasAura(SPELL_SILVER_COVENANT_DISGUISE_FEMALE) || player->HasAura(SPELL_SILVER_COVENANT_DISGUISE_MALE) ||
|
||||
// If player has already been teleported, don't try to teleport again
|
||||
player->HasAura(SPELL_TRESPASSER_A) || player->HasAura(SPELL_TRESPASSER_H))
|
||||
return;
|
||||
|
||||
switch (me->GetEntry())
|
||||
{
|
||||
case NPC_SILVER_COVENANT_GUARDIAN_MAGE:
|
||||
if (player->GetTeam() == HORDE) // Horde unit found in Alliance area
|
||||
{
|
||||
if (GetClosestCreatureWithEntry(me, NPC_APPLEBOUGH_A, 32.0f))
|
||||
{
|
||||
if (me->isInBackInMap(who, 12.0f)) // In my line of sight, "outdoors", and behind me
|
||||
DoCast(who, SPELL_TRESPASSER_A); // Teleport the Horde unit out
|
||||
}
|
||||
else // In my line of sight, and "indoors"
|
||||
DoCast(who, SPELL_TRESPASSER_A); // Teleport the Horde unit out
|
||||
}
|
||||
break;
|
||||
case NPC_SUNREAVER_GUARDIAN_MAGE:
|
||||
if (player->GetTeam() == ALLIANCE) // Alliance unit found in Horde area
|
||||
{
|
||||
if (GetClosestCreatureWithEntry(me, NPC_SWEETBERRY_H, 32.0f))
|
||||
{
|
||||
if (me->isInBackInMap(who, 12.0f)) // In my line of sight, "outdoors", and behind me
|
||||
DoCast(who, SPELL_TRESPASSER_H); // Teleport the Alliance unit out
|
||||
}
|
||||
else // In my line of sight, and "indoors"
|
||||
DoCast(who, SPELL_TRESPASSER_H); // Teleport the Alliance unit out
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (!who || !who->IsInWorld() || who->GetZoneId() != 4395)
|
||||
return;
|
||||
|
||||
if (!me->IsWithinDist(who, 65.0f, false))
|
||||
return;
|
||||
|
||||
Player* player = who->GetCharmerOrOwnerPlayerOrPlayerItself();
|
||||
|
||||
if (!player || player->IsGameMaster() || player->IsBeingTeleported() ||
|
||||
// If player has Disguise aura for quest A Meeting With The Magister or An Audience With The Arcanist, do not teleport it away but let it pass
|
||||
player->HasAura(SPELL_SUNREAVER_DISGUISE_FEMALE) || player->HasAura(SPELL_SUNREAVER_DISGUISE_MALE) ||
|
||||
player->HasAura(SPELL_SILVER_COVENANT_DISGUISE_FEMALE) || player->HasAura(SPELL_SILVER_COVENANT_DISGUISE_MALE) ||
|
||||
// If player has already been teleported, don't try to teleport again
|
||||
player->HasAura(SPELL_TRESPASSER_A) || player->HasAura(SPELL_TRESPASSER_H))
|
||||
return;
|
||||
|
||||
switch (me->GetEntry())
|
||||
{
|
||||
case NPC_SILVER_COVENANT_GUARDIAN_MAGE:
|
||||
if (player->GetTeam() == HORDE) // Horde unit found in Alliance area
|
||||
{
|
||||
if (GetClosestCreatureWithEntry(me, NPC_APPLEBOUGH_A, 32.0f))
|
||||
{
|
||||
if (me->isInBackInMap(who, 12.0f)) // In my line of sight, "outdoors", and behind me
|
||||
DoCast(who, SPELL_TRESPASSER_A); // Teleport the Horde unit out
|
||||
}
|
||||
else // In my line of sight, and "indoors"
|
||||
DoCast(who, SPELL_TRESPASSER_A); // Teleport the Horde unit out
|
||||
}
|
||||
break;
|
||||
case NPC_SUNREAVER_GUARDIAN_MAGE:
|
||||
if (player->GetTeam() == ALLIANCE) // Alliance unit found in Horde area
|
||||
{
|
||||
if (GetClosestCreatureWithEntry(me, NPC_SWEETBERRY_H, 32.0f))
|
||||
{
|
||||
if (me->isInBackInMap(who, 12.0f)) // In my line of sight, "outdoors", and behind me
|
||||
DoCast(who, SPELL_TRESPASSER_H); // Teleport the Alliance unit out
|
||||
}
|
||||
else // In my line of sight, and "indoors"
|
||||
DoCast(who, SPELL_TRESPASSER_H); // Teleport the Alliance unit out
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 /*diff*/) override { }
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new npc_mageguard_dalaranAI(creature);
|
||||
return;
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 /*diff*/) override { }
|
||||
};
|
||||
|
||||
enum MinigobData
|
||||
@@ -148,135 +137,123 @@ enum MinigobData
|
||||
MAIL_DELIVER_DELAY_MAX = 15*MINUTE
|
||||
};
|
||||
|
||||
class npc_minigob_manabonk : public CreatureScript
|
||||
struct npc_minigob_manabonk : public ScriptedAI
|
||||
{
|
||||
public:
|
||||
npc_minigob_manabonk() : CreatureScript("npc_minigob_manabonk") {}
|
||||
|
||||
struct npc_minigob_manabonkAI : public ScriptedAI
|
||||
{
|
||||
npc_minigob_manabonkAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
me->setActive(true);
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
playerGuid = ObjectGuid();
|
||||
me->SetVisible(false);
|
||||
events.ScheduleEvent(EVENT_SELECT_TARGET, 1s);
|
||||
}
|
||||
|
||||
void GetPlayersInDalaran(std::vector<Player*>& playerList) const
|
||||
{
|
||||
Map::PlayerList const& players = me->GetMap()->GetPlayers();
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
if (Player* player = itr->GetSource()->ToPlayer())
|
||||
if (player->GetZoneId() == ZONE_DALARAN && !player->IsFlying() && !player->IsMounted() && !player->IsGameMaster())
|
||||
playerList.push_back(player);
|
||||
}
|
||||
|
||||
static Player* SelectTargetInDalaran(std::vector<Player*>& PlayerInDalaranList)
|
||||
{
|
||||
if (PlayerInDalaranList.empty())
|
||||
return nullptr;
|
||||
|
||||
return Trinity::Containers::SelectRandomContainerElement(PlayerInDalaranList);
|
||||
}
|
||||
|
||||
void SendMailToPlayer(Player* player) const
|
||||
{
|
||||
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
|
||||
int16 deliverDelay = irand(MAIL_DELIVER_DELAY_MIN, MAIL_DELIVER_DELAY_MAX);
|
||||
MailDraft(MAIL_MINIGOB_ENTRY, true).SendMailTo(trans, MailReceiver(player), MailSender(MAIL_CREATURE, uint64(me->GetEntry())), MAIL_CHECK_MASK_NONE, deliverDelay);
|
||||
CharacterDatabase.CommitTransaction(trans);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SELECT_TARGET:
|
||||
{
|
||||
std::vector<Player*> PlayerInDalaranList;
|
||||
GetPlayersInDalaran(PlayerInDalaranList);
|
||||
|
||||
// Increases chance of event based on player count in Dalaran (100 players or more = 100% else player count%)
|
||||
if (PlayerInDalaranList.empty() || urand(1, 100) > PlayerInDalaranList.size())
|
||||
me->AddObjectToRemoveList();
|
||||
|
||||
me->SetVisible(true);
|
||||
DoCastSelf(SPELL_TELEPORT_VISUAL);
|
||||
if (Player* player = SelectTargetInDalaran(PlayerInDalaranList))
|
||||
{
|
||||
playerGuid = player->GetGUID();
|
||||
Position pos = player->GetPosition();
|
||||
float dist = frand(10.0f, 30.0f);
|
||||
float angle = frand(0.0f, 1.0f) * M_PI * 2.0f;
|
||||
player->MovePositionToFirstCollision(pos, dist, angle);
|
||||
me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation());
|
||||
}
|
||||
events.ScheduleEvent(EVENT_LAUGH_1, Seconds(2));
|
||||
break;
|
||||
}
|
||||
case EVENT_LAUGH_1:
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH_NO_SHEATHE);
|
||||
events.ScheduleEvent(EVENT_WANDER, 3s);
|
||||
break;
|
||||
case EVENT_WANDER:
|
||||
me->GetMotionMaster()->MoveRandom(8);
|
||||
events.ScheduleEvent(EVENT_PAUSE, 1min);
|
||||
break;
|
||||
case EVENT_PAUSE:
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
events.ScheduleEvent(EVENT_CAST, 2s);
|
||||
break;
|
||||
case EVENT_CAST:
|
||||
if (Player* player = me->GetMap()->GetPlayer(playerGuid))
|
||||
{
|
||||
DoCast(player, SPELL_MANABONKED);
|
||||
SendMailToPlayer(player);
|
||||
}
|
||||
else
|
||||
me->AddObjectToRemoveList();
|
||||
|
||||
events.ScheduleEvent(EVENT_LAUGH_2, Seconds(8));
|
||||
break;
|
||||
case EVENT_LAUGH_2:
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH_NO_SHEATHE);
|
||||
events.ScheduleEvent(EVENT_BLINK, 3s);
|
||||
break;
|
||||
case EVENT_BLINK:
|
||||
DoCastSelf(SPELL_IMPROVED_BLINK);
|
||||
events.ScheduleEvent(EVENT_DESPAWN, 4s);
|
||||
break;
|
||||
case EVENT_DESPAWN:
|
||||
me->AddObjectToRemoveList();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
ObjectGuid playerGuid;
|
||||
EventMap events;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
npc_minigob_manabonk(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
return new npc_minigob_manabonkAI(creature);
|
||||
me->setActive(true);
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
playerGuid = ObjectGuid();
|
||||
me->SetVisible(false);
|
||||
events.ScheduleEvent(EVENT_SELECT_TARGET, 1s);
|
||||
}
|
||||
|
||||
void GetPlayersInDalaran(std::vector<Player*>& playerList) const
|
||||
{
|
||||
Map::PlayerList const& players = me->GetMap()->GetPlayers();
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
if (Player* player = itr->GetSource()->ToPlayer())
|
||||
if (player->GetZoneId() == ZONE_DALARAN && !player->IsFlying() && !player->IsMounted() && !player->IsGameMaster())
|
||||
playerList.push_back(player);
|
||||
}
|
||||
|
||||
static Player* SelectTargetInDalaran(std::vector<Player*>& PlayerInDalaranList)
|
||||
{
|
||||
if (PlayerInDalaranList.empty())
|
||||
return nullptr;
|
||||
|
||||
return Trinity::Containers::SelectRandomContainerElement(PlayerInDalaranList);
|
||||
}
|
||||
|
||||
void SendMailToPlayer(Player* player) const
|
||||
{
|
||||
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
|
||||
int16 deliverDelay = irand(MAIL_DELIVER_DELAY_MIN, MAIL_DELIVER_DELAY_MAX);
|
||||
MailDraft(MAIL_MINIGOB_ENTRY, true).SendMailTo(trans, MailReceiver(player), MailSender(MAIL_CREATURE, uint64(me->GetEntry())), MAIL_CHECK_MASK_NONE, deliverDelay);
|
||||
CharacterDatabase.CommitTransaction(trans);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SELECT_TARGET:
|
||||
{
|
||||
std::vector<Player*> PlayerInDalaranList;
|
||||
GetPlayersInDalaran(PlayerInDalaranList);
|
||||
|
||||
// Increases chance of event based on player count in Dalaran (100 players or more = 100% else player count%)
|
||||
if (PlayerInDalaranList.empty() || urand(1, 100) > PlayerInDalaranList.size())
|
||||
me->AddObjectToRemoveList();
|
||||
|
||||
me->SetVisible(true);
|
||||
DoCastSelf(SPELL_TELEPORT_VISUAL);
|
||||
if (Player* player = SelectTargetInDalaran(PlayerInDalaranList))
|
||||
{
|
||||
playerGuid = player->GetGUID();
|
||||
Position pos = player->GetPosition();
|
||||
float dist = frand(10.0f, 30.0f);
|
||||
float angle = frand(0.0f, 1.0f) * M_PI * 2.0f;
|
||||
player->MovePositionToFirstCollision(pos, dist, angle);
|
||||
me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation());
|
||||
}
|
||||
events.ScheduleEvent(EVENT_LAUGH_1, Seconds(2));
|
||||
break;
|
||||
}
|
||||
case EVENT_LAUGH_1:
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH_NO_SHEATHE);
|
||||
events.ScheduleEvent(EVENT_WANDER, 3s);
|
||||
break;
|
||||
case EVENT_WANDER:
|
||||
me->GetMotionMaster()->MoveRandom(8);
|
||||
events.ScheduleEvent(EVENT_PAUSE, 1min);
|
||||
break;
|
||||
case EVENT_PAUSE:
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
events.ScheduleEvent(EVENT_CAST, 2s);
|
||||
break;
|
||||
case EVENT_CAST:
|
||||
if (Player* player = me->GetMap()->GetPlayer(playerGuid))
|
||||
{
|
||||
DoCast(player, SPELL_MANABONKED);
|
||||
SendMailToPlayer(player);
|
||||
}
|
||||
else
|
||||
me->AddObjectToRemoveList();
|
||||
|
||||
events.ScheduleEvent(EVENT_LAUGH_2, Seconds(8));
|
||||
break;
|
||||
case EVENT_LAUGH_2:
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH_NO_SHEATHE);
|
||||
events.ScheduleEvent(EVENT_BLINK, 3s);
|
||||
break;
|
||||
case EVENT_BLINK:
|
||||
DoCastSelf(SPELL_IMPROVED_BLINK);
|
||||
events.ScheduleEvent(EVENT_DESPAWN, 4s);
|
||||
break;
|
||||
case EVENT_DESPAWN:
|
||||
me->AddObjectToRemoveList();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
ObjectGuid playerGuid;
|
||||
EventMap events;
|
||||
};
|
||||
|
||||
void AddSC_dalaran()
|
||||
{
|
||||
new npc_mageguard_dalaran();
|
||||
new npc_minigob_manabonk();
|
||||
RegisterCreatureAI(npc_mageguard_dalaran);
|
||||
RegisterCreatureAI(npc_minigob_manabonk);
|
||||
}
|
||||
|
||||
@@ -137,216 +137,216 @@ Position const PosTalkLocations[6] =
|
||||
{ 3798.05f, -680.611f, 222.9825f, 6.038839f }, // Home
|
||||
};
|
||||
|
||||
class npc_commander_eligor_dawnbringer : public CreatureScript
|
||||
struct npc_commander_eligor_dawnbringer : public ScriptedAI
|
||||
{
|
||||
public: npc_commander_eligor_dawnbringer() : CreatureScript("npc_commander_eligor_dawnbringer") {}
|
||||
npc_commander_eligor_dawnbringer(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
talkWing = 0;
|
||||
}
|
||||
|
||||
struct npc_commander_eligor_dawnbringerAI : public ScriptedAI
|
||||
void Reset() override
|
||||
{
|
||||
talkWing = 0;
|
||||
for (ObjectGuid& guid : audienceList)
|
||||
guid.Clear();
|
||||
|
||||
for (ObjectGuid& guid : imageList)
|
||||
guid.Clear();
|
||||
|
||||
_events.ScheduleEvent(EVENT_GET_TARGETS, 5s);
|
||||
_events.ScheduleEvent(EVENT_START_RANDOM, 20s);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id) override
|
||||
{
|
||||
if (type == POINT_MOTION_TYPE)
|
||||
{
|
||||
npc_commander_eligor_dawnbringerAI(Creature* creature) : ScriptedAI(creature)
|
||||
if (id == 1)
|
||||
{
|
||||
talkWing = 0;
|
||||
}
|
||||
me->SetFacingTo(PosTalkLocations[talkWing].GetOrientation());
|
||||
TurnAudience();
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
talkWing = 0;
|
||||
for (ObjectGuid& guid : audienceList)
|
||||
guid.Clear();
|
||||
|
||||
for (ObjectGuid& guid : imageList)
|
||||
guid.Clear();
|
||||
|
||||
_events.ScheduleEvent(EVENT_GET_TARGETS, 5s);
|
||||
_events.ScheduleEvent(EVENT_START_RANDOM, 20s);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id) override
|
||||
{
|
||||
if (type == POINT_MOTION_TYPE)
|
||||
switch (talkWing)
|
||||
{
|
||||
if (id == 1)
|
||||
case 0: // Pinnacle of Naxxramas
|
||||
{
|
||||
me->SetFacingTo(PosTalkLocations[talkWing].GetOrientation());
|
||||
TurnAudience();
|
||||
|
||||
switch (talkWing)
|
||||
switch (urand (0, 1))
|
||||
{
|
||||
case 0: // Pinnacle of Naxxramas
|
||||
switch (urand(0, 1))
|
||||
{
|
||||
case 0: ChangeImage(NPC_IMAGE_OF_KELTHUZAD, MODEL_IMAGE_OF_KELTHUZAD, SAY_KELTHUZAD_1);
|
||||
_events.ScheduleEvent(EVENT_KELTHUZAD_2, 8s); break;
|
||||
case 1: ChangeImage(NPC_IMAGE_OF_SAPPHIRON, MODEL_IMAGE_OF_SAPPHIRON, SAY_SAPPHIRON); break;
|
||||
}
|
||||
break;
|
||||
case 1: // Death knight wing of Naxxramas
|
||||
switch (urand(0, 2))
|
||||
{
|
||||
case 0: ChangeImage(NPC_IMAGE_OF_RAZUVIOUS, MODEL_IMAGE_OF_RAZUVIOUS, SAY_RAZUVIOUS); break;
|
||||
case 1: ChangeImage(NPC_IMAGE_OF_GOTHIK, MODEL_IMAGE_OF_GOTHIK, SAY_GOTHIK); break;
|
||||
case 2: ChangeImage(NPC_IMAGE_OF_THANE, MODEL_IMAGE_OF_THANE, SAY_DEATH_KNIGHTS_1);
|
||||
_events.ScheduleEvent(EVENT_DEATH_KNIGHTS_2, 10s); break;
|
||||
}
|
||||
break;
|
||||
case 2: // Blighted abomination wing of Naxxramas
|
||||
switch (urand (0, 3))
|
||||
{
|
||||
case 0: ChangeImage(NPC_IMAGE_OF_PATCHWERK, MODEL_IMAGE_OF_PATCHWERK, SAY_PATCHWERK); break;
|
||||
case 1: ChangeImage(NPC_IMAGE_OF_GROBBULUS, MODEL_IMAGE_OF_GROBBULUS, SAY_GROBBULUS); break;
|
||||
case 2: ChangeImage(NPC_IMAGE_OF_THADDIUS, MODEL_IMAGE_OF_THADDIUS, SAY_THADDIUS); break;
|
||||
case 3: ChangeImage(NPC_IMAGE_OF_GLUTH, MODEL_IMAGE_OF_GLUTH, SAY_GLUTH); break;
|
||||
}
|
||||
break;
|
||||
case 3: // Accursed spider wing of Naxxramas
|
||||
switch (urand (0, 2))
|
||||
{
|
||||
case 0: ChangeImage(NPC_IMAGE_OF_ANUBREKHAN, MODEL_IMAGE_OF_ANUBREKHAN, SAY_ANUBREKHAN); break;
|
||||
case 1: ChangeImage(NPC_IMAGE_OF_FAERLINA, MODEL_IMAGE_OF_FAERLINA, SAY_FAERLINA); break;
|
||||
case 2: ChangeImage(NPC_IMAGE_OF_MAEXXNA, MODEL_IMAGE_OF_MAEXXNA, SAY_MAEXXNA); break;
|
||||
}
|
||||
break;
|
||||
case 4: // Dread plague wing of Naxxramas
|
||||
switch (urand (0, 2))
|
||||
{
|
||||
case 0: ChangeImage(NPC_IMAGE_OF_NOTH, MODEL_IMAGE_OF_NOTH, SAY_NOTH); break;
|
||||
case 1: ChangeImage(NPC_IMAGE_OF_HEIGAN, MODEL_IMAGE_OF_HEIGAN, SAY_HEIGAN_1);
|
||||
_events.ScheduleEvent(EVENT_HEIGAN_2, 8s); break;
|
||||
case 2: ChangeImage(NPC_IMAGE_OF_LOATHEB, MODEL_IMAGE_OF_LOATHEB, SAY_LOATHEB); break;
|
||||
}
|
||||
break;
|
||||
case 5: // Home
|
||||
_events.ScheduleEvent(EVENT_START_RANDOM, 30s);
|
||||
break;
|
||||
case 0: ChangeImage(NPC_IMAGE_OF_KELTHUZAD, MODEL_IMAGE_OF_KELTHUZAD, SAY_KELTHUZAD_1);
|
||||
_events.ScheduleEvent(EVENT_KELTHUZAD_2, 8s); break;
|
||||
case 1: ChangeImage(NPC_IMAGE_OF_SAPPHIRON, MODEL_IMAGE_OF_SAPPHIRON, SAY_SAPPHIRON); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void StoreTargets()
|
||||
{
|
||||
uint8 creaturecount;
|
||||
|
||||
creaturecount = 0;
|
||||
|
||||
for (uint8 ii = 0; ii < 3; ++ii)
|
||||
{
|
||||
std::list<Creature*> creatureList;
|
||||
GetCreatureListWithEntryInGrid(creatureList, me, AudienceMobs[ii], 15.0f);
|
||||
for (Creature* creature : creatureList)
|
||||
break;
|
||||
case 1: // Death knight wing of Naxxramas
|
||||
{
|
||||
audienceList[creaturecount] = creature->GetGUID();
|
||||
++creaturecount;
|
||||
switch (urand (0, 2))
|
||||
{
|
||||
case 0: ChangeImage(NPC_IMAGE_OF_RAZUVIOUS, MODEL_IMAGE_OF_RAZUVIOUS, SAY_RAZUVIOUS); break;
|
||||
case 1: ChangeImage(NPC_IMAGE_OF_GOTHIK, MODEL_IMAGE_OF_GOTHIK, SAY_GOTHIK); break;
|
||||
case 2: ChangeImage(NPC_IMAGE_OF_THANE, MODEL_IMAGE_OF_THANE, SAY_DEATH_KNIGHTS_1);
|
||||
_events.ScheduleEvent(EVENT_DEATH_KNIGHTS_2, 10s); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_KELTHUZAD, 20.0f, true))
|
||||
imageList[0] = creature->GetGUID();
|
||||
if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_RAZUVIOUS, 20.0f, true))
|
||||
imageList[1] = creature->GetGUID();
|
||||
if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_PATCHWERK, 20.0f, true))
|
||||
imageList[2] = creature->GetGUID();
|
||||
if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_ANUBREKHAN, 20.0f, true))
|
||||
imageList[3] = creature->GetGUID();
|
||||
if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_NOTH, 20.0f, true))
|
||||
imageList[4] = creature->GetGUID();
|
||||
}
|
||||
|
||||
void ChangeImage(uint32 entry, uint32 model, uint8 text)
|
||||
{
|
||||
if (Creature* creature = ObjectAccessor::GetCreature(*me, imageList[talkWing]))
|
||||
{
|
||||
Talk(text);
|
||||
creature->SetEntry(entry);
|
||||
creature->SetDisplayId(model);
|
||||
creature->CastSpell(creature, SPELL_HEROIC_IMAGE_CHANNEL);
|
||||
_events.ScheduleEvent(EVENT_TALK_COMPLETE, 40s);
|
||||
}
|
||||
}
|
||||
|
||||
void TurnAudience()
|
||||
{
|
||||
for (uint8 i = 0; i < 10; ++i)
|
||||
{
|
||||
if (Creature* creature = ObjectAccessor::GetCreature(*me, audienceList[i]))
|
||||
creature->SetFacingToObject(me);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
_events.Update(diff);
|
||||
|
||||
while (uint32 eventId = _events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
break;
|
||||
case 2: // Blighted abomination wing of Naxxramas
|
||||
{
|
||||
case EVENT_START_RANDOM:
|
||||
talkWing = urand (0, 4);
|
||||
Talk(talkWing);
|
||||
_events.ScheduleEvent(EVENT_MOVE_TO_POINT, 8s);
|
||||
break;
|
||||
case EVENT_MOVE_TO_POINT:
|
||||
me->SetWalk(true);
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->GetMotionMaster()->MovePoint(1, PosTalkLocations[talkWing].m_positionX, PosTalkLocations[talkWing].m_positionY, PosTalkLocations[talkWing].m_positionZ);
|
||||
break;
|
||||
case EVENT_TALK_COMPLETE:
|
||||
talkWing = 5;
|
||||
Talk(talkWing);
|
||||
_events.ScheduleEvent(EVENT_MOVE_TO_POINT, 5s);
|
||||
break;
|
||||
case EVENT_GET_TARGETS:
|
||||
StoreTargets();
|
||||
break;
|
||||
case EVENT_KELTHUZAD_2:
|
||||
Talk(SAY_KELTHUZAD_2);
|
||||
_events.ScheduleEvent(EVENT_KELTHUZAD_3, 8s);
|
||||
break;
|
||||
case EVENT_KELTHUZAD_3:
|
||||
Talk(SAY_KELTHUZAD_3);
|
||||
break;
|
||||
case EVENT_DEATH_KNIGHTS_2:
|
||||
Talk(SAY_DEATH_KNIGHTS_2);
|
||||
if (Creature* creature = ObjectAccessor::GetCreature(*me, imageList[talkWing]))
|
||||
{
|
||||
creature->SetEntry(NPC_IMAGE_OF_BLAUMEUX);
|
||||
creature->SetDisplayId(MODEL_IMAGE_OF_BLAUMEUX);
|
||||
}
|
||||
_events.ScheduleEvent(EVENT_DEATH_KNIGHTS_3, 10s);
|
||||
break;
|
||||
case EVENT_DEATH_KNIGHTS_3:
|
||||
Talk(SAY_DEATH_KNIGHTS_3);
|
||||
if (Creature* creature = ObjectAccessor::GetCreature(*me, imageList[talkWing]))
|
||||
{
|
||||
creature->SetEntry(NPC_IMAGE_OF_ZELIEK);
|
||||
creature->SetDisplayId(MODEL_IMAGE_OF_ZELIEK);
|
||||
}
|
||||
_events.ScheduleEvent(EVENT_DEATH_KNIGHTS_4, 10s);
|
||||
break;
|
||||
case EVENT_DEATH_KNIGHTS_4:
|
||||
Talk(SAY_DEATH_KNIGHTS_4);
|
||||
break;
|
||||
case EVENT_HEIGAN_2:
|
||||
Talk(SAY_HEIGAN_2);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
switch (urand (0, 3))
|
||||
{
|
||||
case 0: ChangeImage(NPC_IMAGE_OF_PATCHWERK, MODEL_IMAGE_OF_PATCHWERK, SAY_PATCHWERK); break;
|
||||
case 1: ChangeImage(NPC_IMAGE_OF_GROBBULUS, MODEL_IMAGE_OF_GROBBULUS, SAY_GROBBULUS); break;
|
||||
case 2: ChangeImage(NPC_IMAGE_OF_THADDIUS, MODEL_IMAGE_OF_THADDIUS, SAY_THADDIUS); break;
|
||||
case 3: ChangeImage(NPC_IMAGE_OF_GLUTH, MODEL_IMAGE_OF_GLUTH, SAY_GLUTH); break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3: // Accursed spider wing of Naxxramas
|
||||
{
|
||||
switch (urand (0, 2))
|
||||
{
|
||||
case 0: ChangeImage(NPC_IMAGE_OF_ANUBREKHAN, MODEL_IMAGE_OF_ANUBREKHAN, SAY_ANUBREKHAN); break;
|
||||
case 1: ChangeImage(NPC_IMAGE_OF_FAERLINA, MODEL_IMAGE_OF_FAERLINA, SAY_FAERLINA); break;
|
||||
case 2: ChangeImage(NPC_IMAGE_OF_MAEXXNA, MODEL_IMAGE_OF_MAEXXNA, SAY_MAEXXNA); break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4: // Dread plague wing of Naxxramas
|
||||
{
|
||||
switch (urand (0, 2))
|
||||
{
|
||||
case 0: ChangeImage(NPC_IMAGE_OF_NOTH, MODEL_IMAGE_OF_NOTH, SAY_NOTH); break;
|
||||
case 1: ChangeImage(NPC_IMAGE_OF_HEIGAN, MODEL_IMAGE_OF_HEIGAN, SAY_HEIGAN_1);
|
||||
_events.ScheduleEvent(EVENT_HEIGAN_2, 8s); break;
|
||||
case 2: ChangeImage(NPC_IMAGE_OF_LOATHEB, MODEL_IMAGE_OF_LOATHEB, SAY_LOATHEB); break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 5: // Home
|
||||
_events.ScheduleEvent(EVENT_START_RANDOM, 30s);
|
||||
break;
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
private:
|
||||
EventMap _events;
|
||||
ObjectGuid audienceList[10];
|
||||
ObjectGuid imageList[5];
|
||||
uint8 talkWing;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new npc_commander_eligor_dawnbringerAI(creature);
|
||||
}
|
||||
}
|
||||
|
||||
void StoreTargets()
|
||||
{
|
||||
uint8 creaturecount;
|
||||
|
||||
creaturecount = 0;
|
||||
|
||||
for (uint8 ii = 0; ii < 3; ++ii)
|
||||
{
|
||||
std::list<Creature*> creatureList;
|
||||
GetCreatureListWithEntryInGrid(creatureList, me, AudienceMobs[ii], 15.0f);
|
||||
for (Creature* creature : creatureList)
|
||||
{
|
||||
audienceList[creaturecount] = creature->GetGUID();
|
||||
++creaturecount;
|
||||
}
|
||||
}
|
||||
|
||||
if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_KELTHUZAD, 20.0f, true))
|
||||
imageList[0] = creature->GetGUID();
|
||||
if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_RAZUVIOUS, 20.0f, true))
|
||||
imageList[1] = creature->GetGUID();
|
||||
if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_PATCHWERK, 20.0f, true))
|
||||
imageList[2] = creature->GetGUID();
|
||||
if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_ANUBREKHAN, 20.0f, true))
|
||||
imageList[3] = creature->GetGUID();
|
||||
if (Creature* creature = me->FindNearestCreature(NPC_IMAGE_OF_NOTH, 20.0f, true))
|
||||
imageList[4] = creature->GetGUID();
|
||||
}
|
||||
|
||||
void ChangeImage(uint32 entry, uint32 model, uint8 text)
|
||||
{
|
||||
if (Creature* creature = ObjectAccessor::GetCreature(*me, imageList[talkWing]))
|
||||
{
|
||||
Talk(text);
|
||||
creature->SetEntry(entry);
|
||||
creature->SetDisplayId(model);
|
||||
creature->CastSpell(creature, SPELL_HEROIC_IMAGE_CHANNEL);
|
||||
_events.ScheduleEvent(EVENT_TALK_COMPLETE, 40s);
|
||||
}
|
||||
}
|
||||
|
||||
void TurnAudience()
|
||||
{
|
||||
for (uint8 i = 0; i < 10; ++i)
|
||||
{
|
||||
if (Creature* creature = ObjectAccessor::GetCreature(*me, audienceList[i]))
|
||||
creature->SetFacingToObject(me);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
_events.Update(diff);
|
||||
|
||||
while (uint32 eventId = _events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_START_RANDOM:
|
||||
talkWing = urand (0, 4);
|
||||
Talk(talkWing);
|
||||
_events.ScheduleEvent(EVENT_MOVE_TO_POINT, 8s);
|
||||
break;
|
||||
case EVENT_MOVE_TO_POINT:
|
||||
me->SetWalk(true);
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->GetMotionMaster()->MovePoint(1, PosTalkLocations[talkWing].m_positionX, PosTalkLocations[talkWing].m_positionY, PosTalkLocations[talkWing].m_positionZ);
|
||||
break;
|
||||
case EVENT_TALK_COMPLETE:
|
||||
talkWing = 5;
|
||||
Talk(talkWing);
|
||||
_events.ScheduleEvent(EVENT_MOVE_TO_POINT, 5s);
|
||||
break;
|
||||
case EVENT_GET_TARGETS:
|
||||
StoreTargets();
|
||||
break;
|
||||
case EVENT_KELTHUZAD_2:
|
||||
Talk(SAY_KELTHUZAD_2);
|
||||
_events.ScheduleEvent(EVENT_KELTHUZAD_3, 8s);
|
||||
break;
|
||||
case EVENT_KELTHUZAD_3:
|
||||
Talk(SAY_KELTHUZAD_3);
|
||||
break;
|
||||
case EVENT_DEATH_KNIGHTS_2:
|
||||
Talk(SAY_DEATH_KNIGHTS_2);
|
||||
if (Creature* creature = ObjectAccessor::GetCreature(*me, imageList[talkWing]))
|
||||
{
|
||||
creature->SetEntry(NPC_IMAGE_OF_BLAUMEUX);
|
||||
creature->SetDisplayId(MODEL_IMAGE_OF_BLAUMEUX);
|
||||
}
|
||||
_events.ScheduleEvent(EVENT_DEATH_KNIGHTS_3, 10s);
|
||||
break;
|
||||
case EVENT_DEATH_KNIGHTS_3:
|
||||
Talk(SAY_DEATH_KNIGHTS_3);
|
||||
if (Creature* creature = ObjectAccessor::GetCreature(*me, imageList[talkWing]))
|
||||
{
|
||||
creature->SetEntry(NPC_IMAGE_OF_ZELIEK);
|
||||
creature->SetDisplayId(MODEL_IMAGE_OF_ZELIEK);
|
||||
}
|
||||
_events.ScheduleEvent(EVENT_DEATH_KNIGHTS_4, 10s);
|
||||
break;
|
||||
case EVENT_DEATH_KNIGHTS_4:
|
||||
Talk(SAY_DEATH_KNIGHTS_4);
|
||||
break;
|
||||
case EVENT_HEIGAN_2:
|
||||
Talk(SAY_HEIGAN_2);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
private:
|
||||
EventMap _events;
|
||||
ObjectGuid audienceList[10];
|
||||
ObjectGuid imageList[5];
|
||||
uint8 talkWing;
|
||||
};
|
||||
|
||||
enum AlexstraszaWrGate
|
||||
@@ -376,83 +376,61 @@ enum StrengthenAncientsMisc
|
||||
};
|
||||
|
||||
// 47575 - Strengthen the Ancients: On Interact Dummy to Woodlands Walker
|
||||
class spell_q12096_q12092_dummy : public SpellScriptLoader // Strengthen the Ancients: On Interact Dummy to Woodlands Walker
|
||||
class spell_q12096_q12092_dummy : public SpellScript
|
||||
{
|
||||
public:
|
||||
spell_q12096_q12092_dummy() : SpellScriptLoader("spell_q12096_q12092_dummy") { }
|
||||
PrepareSpellScript(spell_q12096_q12092_dummy);
|
||||
|
||||
class spell_q12096_q12092_dummy_SpellScript : public SpellScript
|
||||
void HandleDummy(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_q12096_q12092_dummy_SpellScript);
|
||||
uint32 roll = rand32() % 2;
|
||||
|
||||
void HandleDummy(SpellEffIndex /*effIndex*/)
|
||||
Creature* tree = GetHitCreature();
|
||||
Player* player = GetCaster()->ToPlayer();
|
||||
|
||||
if (!tree || !player)
|
||||
return;
|
||||
|
||||
tree->RemoveNpcFlag(UNIT_NPC_FLAG_SPELLCLICK);
|
||||
|
||||
if (roll == 1) // friendly version
|
||||
{
|
||||
uint32 roll = rand32() % 2;
|
||||
|
||||
Creature* tree = GetHitCreature();
|
||||
Player* player = GetCaster()->ToPlayer();
|
||||
|
||||
if (!tree || !player)
|
||||
return;
|
||||
|
||||
tree->RemoveNpcFlag(UNIT_NPC_FLAG_SPELLCLICK);
|
||||
|
||||
if (roll == 1) // friendly version
|
||||
{
|
||||
tree->CastSpell(player, SPELL_CREATE_ITEM_BARK);
|
||||
tree->AI()->Talk(SAY_WALKER_FRIENDLY, player);
|
||||
tree->DespawnOrUnsummon(1s);
|
||||
}
|
||||
else // enemy version
|
||||
{
|
||||
tree->AI()->Talk(SAY_WALKER_ENEMY, player);
|
||||
tree->SetFaction(FACTION_MONSTER);
|
||||
tree->Attack(player, true);
|
||||
}
|
||||
tree->CastSpell(player, SPELL_CREATE_ITEM_BARK);
|
||||
tree->AI()->Talk(SAY_WALKER_FRIENDLY, player);
|
||||
tree->DespawnOrUnsummon(1s);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
else // enemy version
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_q12096_q12092_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
tree->AI()->Talk(SAY_WALKER_ENEMY, player);
|
||||
tree->SetFaction(FACTION_MONSTER);
|
||||
tree->Attack(player, true);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
SpellScript* GetSpellScript() const override
|
||||
void Register() override
|
||||
{
|
||||
return new spell_q12096_q12092_dummy_SpellScript();
|
||||
OnEffectHitTarget += SpellEffectFn(spell_q12096_q12092_dummy::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
// 47530 - Bark of the Walkers
|
||||
class spell_q12096_q12092_bark : public SpellScriptLoader
|
||||
class spell_q12096_q12092_bark : public SpellScript
|
||||
{
|
||||
public:
|
||||
spell_q12096_q12092_bark() : SpellScriptLoader("spell_q12096_q12092_bark") { }
|
||||
PrepareSpellScript(spell_q12096_q12092_bark);
|
||||
|
||||
class spell_q12096_q12092_bark_SpellScript : public SpellScript
|
||||
void HandleDummy(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_q12096_q12092_bark_SpellScript);
|
||||
Creature* lothalor = GetHitCreature();
|
||||
if (!lothalor || lothalor->GetEntry() != NPC_LOTHALOR)
|
||||
return;
|
||||
|
||||
void HandleDummy(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
Creature* lothalor = GetHitCreature();
|
||||
if (!lothalor || lothalor->GetEntry() != NPC_LOTHALOR)
|
||||
return;
|
||||
lothalor->AI()->Talk(SAY_LOTHALOR);
|
||||
lothalor->RemoveAura(SPELL_CONFUSED);
|
||||
lothalor->DespawnOrUnsummon(4s);
|
||||
}
|
||||
|
||||
lothalor->AI()->Talk(SAY_LOTHALOR);
|
||||
lothalor->RemoveAura(SPELL_CONFUSED);
|
||||
lothalor->DespawnOrUnsummon(4s);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_q12096_q12092_bark_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const override
|
||||
void Register() override
|
||||
{
|
||||
return new spell_q12096_q12092_bark_SpellScript();
|
||||
OnEffectHitTarget += SpellEffectFn(spell_q12096_q12092_bark::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -478,104 +456,93 @@ enum WyrmDefenderEnum
|
||||
BOSS_EMOTE_ON_LOW_HEALTH = 2
|
||||
};
|
||||
|
||||
class npc_wyrmrest_defender : public CreatureScript
|
||||
struct npc_wyrmrest_defender : public VehicleAI
|
||||
{
|
||||
public:
|
||||
npc_wyrmrest_defender() : CreatureScript("npc_wyrmrest_defender") { }
|
||||
npc_wyrmrest_defender(Creature* creature) : VehicleAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
struct npc_wyrmrest_defenderAI : public VehicleAI
|
||||
void Initialize()
|
||||
{
|
||||
hpWarningReady = true;
|
||||
renewRecoveryCanCheck = false;
|
||||
|
||||
RenewRecoveryChecker = 0;
|
||||
}
|
||||
|
||||
bool hpWarningReady;
|
||||
bool renewRecoveryCanCheck;
|
||||
|
||||
uint32 RenewRecoveryChecker;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
VehicleAI::UpdateAI(diff);
|
||||
|
||||
// Check system for Health Warning should happen first time whenever get under 30%,
|
||||
// after it should be able to happen only after recovery of last renew is fully done (20 sec),
|
||||
// next one used won't interfere
|
||||
if (hpWarningReady && me->GetHealthPct() <= 30.0f)
|
||||
{
|
||||
npc_wyrmrest_defenderAI(Creature* creature) : VehicleAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
hpWarningReady = true;
|
||||
renewRecoveryCanCheck = false;
|
||||
|
||||
RenewRecoveryChecker = 0;
|
||||
}
|
||||
|
||||
bool hpWarningReady;
|
||||
bool renewRecoveryCanCheck;
|
||||
|
||||
uint32 RenewRecoveryChecker;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
VehicleAI::UpdateAI(diff);
|
||||
|
||||
// Check system for Health Warning should happen first time whenever get under 30%,
|
||||
// after it should be able to happen only after recovery of last renew is fully done (20 sec),
|
||||
// next one used won't interfere
|
||||
if (hpWarningReady && me->GetHealthPct() <= 30.0f)
|
||||
{
|
||||
me->CastSpell(me, SPELL_DEFENDER_ON_LOW_HEALTH_EMOTE);
|
||||
hpWarningReady = false;
|
||||
}
|
||||
|
||||
if (renewRecoveryCanCheck)
|
||||
{
|
||||
if (RenewRecoveryChecker <= diff)
|
||||
{
|
||||
renewRecoveryCanCheck = false;
|
||||
hpWarningReady = true;
|
||||
}
|
||||
else
|
||||
RenewRecoveryChecker -= diff;
|
||||
}
|
||||
}
|
||||
|
||||
void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
|
||||
{
|
||||
switch (spellInfo->Id)
|
||||
{
|
||||
case SPELL_WYRMREST_DEFENDER_MOUNT:
|
||||
Talk(WHISPER_MOUNTED, me->GetCharmerOrOwner());
|
||||
me->SetImmuneToAll(false);
|
||||
me->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
|
||||
break;
|
||||
// Both below are for checking low hp warning
|
||||
case SPELL_DEFENDER_ON_LOW_HEALTH_EMOTE:
|
||||
Talk(BOSS_EMOTE_ON_LOW_HEALTH, me->GetCharmerOrOwner());
|
||||
break;
|
||||
case SPELL_RENEW:
|
||||
if (!hpWarningReady && RenewRecoveryChecker <= 100)
|
||||
RenewRecoveryChecker = 20000;
|
||||
|
||||
renewRecoveryCanCheck = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
|
||||
{
|
||||
if (menuId == MENU_ID && gossipListId == GOSSIP_OPTION_ID)
|
||||
{
|
||||
// Makes player cast trigger spell for 49207 on self
|
||||
player->CastSpell(player, SPELL_CHARACTER_SCRIPT, true);
|
||||
CloseGossipMenuFor(player);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void OnCharmed(bool /*apply*/) override
|
||||
{
|
||||
me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new npc_wyrmrest_defenderAI(creature);
|
||||
me->CastSpell(me, SPELL_DEFENDER_ON_LOW_HEALTH_EMOTE);
|
||||
hpWarningReady = false;
|
||||
}
|
||||
|
||||
if (renewRecoveryCanCheck)
|
||||
{
|
||||
if (RenewRecoveryChecker <= diff)
|
||||
{
|
||||
renewRecoveryCanCheck = false;
|
||||
hpWarningReady = true;
|
||||
}
|
||||
else
|
||||
RenewRecoveryChecker -= diff;
|
||||
}
|
||||
}
|
||||
|
||||
void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
|
||||
{
|
||||
switch (spellInfo->Id)
|
||||
{
|
||||
case SPELL_WYRMREST_DEFENDER_MOUNT:
|
||||
Talk(WHISPER_MOUNTED, me->GetCharmerOrOwner());
|
||||
me->SetImmuneToAll(false);
|
||||
me->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
|
||||
break;
|
||||
// Both below are for checking low hp warning
|
||||
case SPELL_DEFENDER_ON_LOW_HEALTH_EMOTE:
|
||||
Talk(BOSS_EMOTE_ON_LOW_HEALTH, me->GetCharmerOrOwner());
|
||||
break;
|
||||
case SPELL_RENEW:
|
||||
if (!hpWarningReady && RenewRecoveryChecker <= 100)
|
||||
RenewRecoveryChecker = 20000;
|
||||
|
||||
renewRecoveryCanCheck = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
|
||||
{
|
||||
if (menuId == MENU_ID && gossipListId == GOSSIP_OPTION_ID)
|
||||
{
|
||||
// Makes player cast trigger spell for 49207 on self
|
||||
player->CastSpell(player, SPELL_CHARACTER_SCRIPT, true);
|
||||
CloseGossipMenuFor(player);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void OnCharmed(bool /*apply*/) override
|
||||
{
|
||||
me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
|
||||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
@@ -781,10 +748,10 @@ class spell_high_executor_branding_iron : public SpellScript
|
||||
|
||||
void AddSC_dragonblight()
|
||||
{
|
||||
new npc_commander_eligor_dawnbringer();
|
||||
new spell_q12096_q12092_dummy();
|
||||
new spell_q12096_q12092_bark();
|
||||
new npc_wyrmrest_defender();
|
||||
RegisterCreatureAI(npc_commander_eligor_dawnbringer);
|
||||
RegisterSpellScript(spell_q12096_q12092_dummy);
|
||||
RegisterSpellScript(spell_q12096_q12092_bark);
|
||||
RegisterCreatureAI(npc_wyrmrest_defender);
|
||||
RegisterSpellScript(spell_warsong_battle_standard);
|
||||
RegisterSpellScript(spell_moti_mirror_image_script_effect);
|
||||
RegisterSpellScript(spell_moti_hourglass_cast_see_invis_on_master);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -217,162 +217,151 @@ enum NesingwaryChildrensWeek
|
||||
TEXT_WOLVAR_ORPHAN_9 = 9
|
||||
};
|
||||
|
||||
class npc_jungle_punch_target : public CreatureScript
|
||||
struct npc_jungle_punch_target : public ScriptedAI
|
||||
{
|
||||
public:
|
||||
npc_jungle_punch_target() : CreatureScript("npc_jungle_punch_target") { }
|
||||
|
||||
struct npc_jungle_punch_targetAI : public ScriptedAI
|
||||
npc_jungle_punch_target(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
npc_jungle_punch_targetAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
sayTimer = 3500;
|
||||
sayStep = 0;
|
||||
timer = 0;
|
||||
phase = 0;
|
||||
playerGUID.Clear();
|
||||
orphanGUID.Clear();
|
||||
}
|
||||
void Initialize()
|
||||
{
|
||||
sayTimer = 3500;
|
||||
sayStep = 0;
|
||||
timer = 0;
|
||||
phase = 0;
|
||||
playerGUID.Clear();
|
||||
orphanGUID.Clear();
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
if (!phase && who && who->GetDistance2d(me) < 10.0f)
|
||||
if (Player* player = who->ToPlayer())
|
||||
if (player->GetQuestStatus(QUEST_THE_MIGHTY_HEMET_NESINGWARY) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
playerGUID = player->GetGUID();
|
||||
if (Aura* orphanOut = player->GetAura(SPELL_ORPHAN_OUT))
|
||||
if (orphanOut->GetCaster() && orphanOut->GetCaster()->GetEntry() == ORPHAN_WOLVAR)
|
||||
{
|
||||
orphanGUID = orphanOut->GetCaster()->GetGUID();
|
||||
phase = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void proceedCwEvent(const uint32 diff)
|
||||
{
|
||||
if (timer <= diff)
|
||||
{
|
||||
Player* player = ObjectAccessor::GetPlayer(*me, playerGUID);
|
||||
Creature* orphan = ObjectAccessor::GetCreature(*me, orphanGUID);
|
||||
|
||||
if (!orphan || !player)
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
if (!phase && who && who->GetDistance2d(me) < 10.0f)
|
||||
if (Player* player = who->ToPlayer())
|
||||
if (player->GetQuestStatus(QUEST_THE_MIGHTY_HEMET_NESINGWARY) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
playerGUID = player->GetGUID();
|
||||
if (Aura* orphanOut = player->GetAura(SPELL_ORPHAN_OUT))
|
||||
if (orphanOut->GetCaster() && orphanOut->GetCaster()->GetEntry() == ORPHAN_WOLVAR)
|
||||
{
|
||||
orphanGUID = orphanOut->GetCaster()->GetGUID();
|
||||
phase = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void proceedCwEvent(const uint32 diff)
|
||||
{
|
||||
if (timer <= diff)
|
||||
{
|
||||
Player* player = ObjectAccessor::GetPlayer(*me, playerGUID);
|
||||
Creature* orphan = ObjectAccessor::GetCreature(*me, orphanGUID);
|
||||
|
||||
if (!orphan || !player)
|
||||
{
|
||||
Reset();
|
||||
return;
|
||||
}
|
||||
|
||||
switch (phase)
|
||||
{
|
||||
case 1:
|
||||
orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + std::cos(me->GetOrientation()) * 5, me->GetPositionY() + std::sin(me->GetOrientation()) * 5, me->GetPositionZ());
|
||||
orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_6);
|
||||
timer = 5000;
|
||||
break;
|
||||
case 2:
|
||||
orphan->SetFacingToObject(me);
|
||||
orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_7);
|
||||
timer = 5000;
|
||||
break;
|
||||
case 3:
|
||||
Talk(TEXT_NESINGWARY_1);
|
||||
timer = 5000;
|
||||
break;
|
||||
case 4:
|
||||
orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_8);
|
||||
timer = 5000;
|
||||
break;
|
||||
case 5:
|
||||
orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_9);
|
||||
timer = 5000;
|
||||
break;
|
||||
case 6:
|
||||
orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
|
||||
player->GroupEventHappens(QUEST_THE_MIGHTY_HEMET_NESINGWARY, me);
|
||||
Reset();
|
||||
return;
|
||||
}
|
||||
|
||||
switch (phase)
|
||||
{
|
||||
case 1:
|
||||
orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + std::cos(me->GetOrientation()) * 5, me->GetPositionY() + std::sin(me->GetOrientation()) * 5, me->GetPositionZ());
|
||||
orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_6);
|
||||
timer = 5000;
|
||||
break;
|
||||
case 2:
|
||||
orphan->SetFacingToObject(me);
|
||||
orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_7);
|
||||
timer = 5000;
|
||||
break;
|
||||
case 3:
|
||||
Talk(TEXT_NESINGWARY_1);
|
||||
timer = 5000;
|
||||
break;
|
||||
case 4:
|
||||
orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_8);
|
||||
timer = 5000;
|
||||
break;
|
||||
case 5:
|
||||
orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_9);
|
||||
timer = 5000;
|
||||
break;
|
||||
case 6:
|
||||
orphan->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
|
||||
player->GroupEventHappens(QUEST_THE_MIGHTY_HEMET_NESINGWARY, me);
|
||||
Reset();
|
||||
return;
|
||||
}
|
||||
++phase;
|
||||
}
|
||||
else
|
||||
timer -= diff;
|
||||
++phase;
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (phase)
|
||||
proceedCwEvent(diff);
|
||||
|
||||
if (!sayStep)
|
||||
return;
|
||||
|
||||
if (sayTimer < diff)
|
||||
{
|
||||
Talk(SAY_HEMET_HADRIUS_TAMARA_1 + sayStep - 1);
|
||||
sayTimer = 3000;
|
||||
sayStep++;
|
||||
|
||||
if (sayStep > 3) // end
|
||||
sayStep = 0;
|
||||
}
|
||||
else
|
||||
sayTimer -= diff;
|
||||
}
|
||||
|
||||
void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
|
||||
{
|
||||
if (spellInfo->Id != SPELL_OFFER)
|
||||
return;
|
||||
|
||||
Player* player = caster->ToPlayer();
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
Quest const* quest = sObjectMgr->GetQuestTemplate(QUEST_TASTE_TEST);
|
||||
if (!quest)
|
||||
return;
|
||||
|
||||
if (player->GetQuestStatus(QUEST_TASTE_TEST) != QUEST_STATUS_INCOMPLETE)
|
||||
return;
|
||||
|
||||
for (uint32 i = 0; i < quest->Objectives.size(); ++i)
|
||||
{
|
||||
if (uint32(quest->Objectives[i].ObjectID) != me->GetEntry())
|
||||
continue;
|
||||
|
||||
if (player->GetQuestObjectiveData(quest->Objectives[i]) != 0)
|
||||
continue;
|
||||
|
||||
player->KilledMonsterCredit(me->GetEntry());
|
||||
sayStep = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
uint16 sayTimer;
|
||||
uint8 sayStep;
|
||||
uint32 timer;
|
||||
int8 phase;
|
||||
ObjectGuid playerGUID;
|
||||
ObjectGuid orphanGUID;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new npc_jungle_punch_targetAI(creature);
|
||||
else
|
||||
timer -= diff;
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (phase)
|
||||
proceedCwEvent(diff);
|
||||
|
||||
if (!sayStep)
|
||||
return;
|
||||
|
||||
if (sayTimer < diff)
|
||||
{
|
||||
Talk(SAY_HEMET_HADRIUS_TAMARA_1 + sayStep - 1);
|
||||
sayTimer = 3000;
|
||||
sayStep++;
|
||||
|
||||
if (sayStep > 3) // end
|
||||
sayStep = 0;
|
||||
}
|
||||
else
|
||||
sayTimer -= diff;
|
||||
}
|
||||
|
||||
void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
|
||||
{
|
||||
if (spellInfo->Id != SPELL_OFFER)
|
||||
return;
|
||||
|
||||
Player* player = caster->ToPlayer();
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
Quest const* quest = sObjectMgr->GetQuestTemplate(QUEST_TASTE_TEST);
|
||||
if (!quest)
|
||||
return;
|
||||
|
||||
if (player->GetQuestStatus(QUEST_TASTE_TEST) != QUEST_STATUS_INCOMPLETE)
|
||||
return;
|
||||
|
||||
for (uint32 i = 0; i < quest->Objectives.size(); ++i)
|
||||
{
|
||||
if (uint32(quest->Objectives[i].ObjectID) != me->GetEntry())
|
||||
continue;
|
||||
|
||||
if (player->GetQuestObjectiveData(quest->Objectives[i]) != 0)
|
||||
continue;
|
||||
|
||||
player->KilledMonsterCredit(me->GetEntry());
|
||||
sayStep = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
uint16 sayTimer;
|
||||
uint8 sayStep;
|
||||
uint32 timer;
|
||||
int8 phase;
|
||||
ObjectGuid playerGUID;
|
||||
ObjectGuid orphanGUID;
|
||||
};
|
||||
|
||||
/*######
|
||||
@@ -395,64 +384,53 @@ enum MiscLifewarden
|
||||
};
|
||||
|
||||
// 51957 - Call of the Lifewarden
|
||||
class spell_q12620_the_lifewarden_wrath : public SpellScriptLoader
|
||||
class spell_q12620_the_lifewarden_wrath : public SpellScript
|
||||
{
|
||||
public:
|
||||
spell_q12620_the_lifewarden_wrath() : SpellScriptLoader("spell_q12620_the_lifewarden_wrath") { }
|
||||
PrepareSpellScript(spell_q12620_the_lifewarden_wrath);
|
||||
|
||||
class spell_q12620_the_lifewarden_wrath_SpellScript : public SpellScript
|
||||
void HandleSendEvent(SpellEffIndex effIndex)
|
||||
{
|
||||
PrepareSpellScript(spell_q12620_the_lifewarden_wrath_SpellScript);
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
|
||||
void HandleSendEvent(SpellEffIndex effIndex)
|
||||
if (Unit* caster = GetCaster())
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
|
||||
if (Unit* caster = GetCaster())
|
||||
if (Creature* presence = caster->FindNearestCreature(NPC_PRESENCE, 50.0f))
|
||||
{
|
||||
if (Creature* presence = caster->FindNearestCreature(NPC_PRESENCE, 50.0f))
|
||||
presence->AI()->Talk(WHISPER_ACTIVATE, caster);
|
||||
presence->CastSpell(presence, SPELL_FREYA_DUMMY, true); // will target plants
|
||||
// Freya Dummy could be scripted with the following code
|
||||
|
||||
// Revive plants
|
||||
std::list<Creature*> servants;
|
||||
GetCaster()->GetCreatureListWithEntryInGrid(servants, NPC_SERVANT, 200.0f);
|
||||
for (std::list<Creature*>::iterator itr = servants.begin(); itr != servants.end(); ++itr)
|
||||
{
|
||||
presence->AI()->Talk(WHISPER_ACTIVATE, caster);
|
||||
presence->CastSpell(presence, SPELL_FREYA_DUMMY, true); // will target plants
|
||||
// Freya Dummy could be scripted with the following code
|
||||
// Couldn't find a spell that does this
|
||||
if ((*itr)->isDead())
|
||||
(*itr)->Respawn(true);
|
||||
|
||||
// Revive plants
|
||||
std::list<Creature*> servants;
|
||||
GetCaster()->GetCreatureListWithEntryInGrid(servants, NPC_SERVANT, 200.0f);
|
||||
for (std::list<Creature*>::iterator itr = servants.begin(); itr != servants.end(); ++itr)
|
||||
{
|
||||
// Couldn't find a spell that does this
|
||||
if ((*itr)->isDead())
|
||||
(*itr)->Respawn(true);
|
||||
(*itr)->CastSpell(*itr, SPELL_FREYA_DUMMY_TRIGGER, true);
|
||||
(*itr)->CastSpell(*itr, SPELL_LASHER_EMERGE, false);
|
||||
(*itr)->CastSpell(*itr, SPELL_WILD_GROWTH, false);
|
||||
|
||||
(*itr)->CastSpell(*itr, SPELL_FREYA_DUMMY_TRIGGER, true);
|
||||
(*itr)->CastSpell(*itr, SPELL_LASHER_EMERGE, false);
|
||||
(*itr)->CastSpell(*itr, SPELL_WILD_GROWTH, false);
|
||||
|
||||
if (Unit* target = (*itr)->SelectNearestTarget(150.0f))
|
||||
(*itr)->AI()->AttackStart(target);
|
||||
}
|
||||
|
||||
// Kill nearby enemies
|
||||
std::list<Creature*> saboteurs;
|
||||
caster->GetCreatureListWithEntryInGrid(saboteurs, NPC_SABOTEUR, 200.0f);
|
||||
for (std::list<Creature*>::iterator itr = saboteurs.begin(); itr != saboteurs.end(); ++itr)
|
||||
if ((*itr)->IsAlive())
|
||||
// Lifeforce has a cast duration, it should be cast at all saboteurs one by one
|
||||
presence->CastSpell((*itr), SPELL_LIFEFORCE, false);
|
||||
if (Unit* target = (*itr)->SelectNearestTarget(150.0f))
|
||||
(*itr)->AI()->AttackStart(target);
|
||||
}
|
||||
|
||||
// Kill nearby enemies
|
||||
std::list<Creature*> saboteurs;
|
||||
caster->GetCreatureListWithEntryInGrid(saboteurs, NPC_SABOTEUR, 200.0f);
|
||||
for (std::list<Creature*>::iterator itr = saboteurs.begin(); itr != saboteurs.end(); ++itr)
|
||||
if ((*itr)->IsAlive())
|
||||
// Lifeforce has a cast duration, it should be cast at all saboteurs one by one
|
||||
presence->CastSpell((*itr), SPELL_LIFEFORCE, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHit += SpellEffectFn(spell_q12620_the_lifewarden_wrath_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const override
|
||||
void Register() override
|
||||
{
|
||||
return new spell_q12620_the_lifewarden_wrath_SpellScript();
|
||||
OnEffectHit += SpellEffectFn(spell_q12620_the_lifewarden_wrath::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -484,96 +462,85 @@ enum KickWhatKick
|
||||
};
|
||||
|
||||
// 51330 - Shoot RJR
|
||||
class spell_q12589_shoot_rjr : public SpellScriptLoader
|
||||
class spell_q12589_shoot_rjr : public SpellScript
|
||||
{
|
||||
public:
|
||||
spell_q12589_shoot_rjr() : SpellScriptLoader("spell_q12589_shoot_rjr") { }
|
||||
PrepareSpellScript(spell_q12589_shoot_rjr);
|
||||
|
||||
class spell_q12589_shoot_rjr_SpellScript : public SpellScript
|
||||
SpellCastResult CheckCast()
|
||||
{
|
||||
PrepareSpellScript(spell_q12589_shoot_rjr_SpellScript);
|
||||
if (Unit* target = GetExplTargetUnit())
|
||||
if (target->GetEntry() == NPC_LUCKY_WILHELM)
|
||||
return SPELL_CAST_OK;
|
||||
|
||||
SpellCastResult CheckCast()
|
||||
SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_TARGET_WILHELM);
|
||||
return SPELL_FAILED_CUSTOM_ERROR;
|
||||
}
|
||||
|
||||
void HandleDummy(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
uint32 roll = urand(1, 100);
|
||||
|
||||
uint8 ev;
|
||||
if (roll <= 50)
|
||||
ev = EVENT_MISS;
|
||||
else if (roll <= 83)
|
||||
ev = EVENT_HIT;
|
||||
else
|
||||
ev = EVENT_MISS_BIRD;
|
||||
|
||||
Unit* shooter = GetCaster();
|
||||
Creature* wilhelm = GetHitUnit()->ToCreature();
|
||||
Creature* apple = shooter->FindNearestCreature(NPC_APPLE, 30);
|
||||
Creature* drostan = shooter->FindNearestCreature(NPC_DROSTAN, 30);
|
||||
|
||||
if (!wilhelm || !apple || !drostan)
|
||||
return;
|
||||
|
||||
switch (ev)
|
||||
{
|
||||
if (Unit* target = GetExplTargetUnit())
|
||||
if (target->GetEntry() == NPC_LUCKY_WILHELM)
|
||||
return SPELL_CAST_OK;
|
||||
|
||||
SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_TARGET_WILHELM);
|
||||
return SPELL_FAILED_CUSTOM_ERROR;
|
||||
}
|
||||
|
||||
void HandleDummy(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
uint32 roll = urand(1, 100);
|
||||
|
||||
uint8 ev;
|
||||
if (roll <= 50)
|
||||
ev = EVENT_MISS;
|
||||
else if (roll <= 83)
|
||||
ev = EVENT_HIT;
|
||||
else
|
||||
ev = EVENT_MISS_BIRD;
|
||||
|
||||
Unit* shooter = GetCaster();
|
||||
Creature* wilhelm = GetHitUnit()->ToCreature();
|
||||
Creature* apple = shooter->FindNearestCreature(NPC_APPLE, 30);
|
||||
Creature* drostan = shooter->FindNearestCreature(NPC_DROSTAN, 30);
|
||||
|
||||
if (!wilhelm || !apple || !drostan)
|
||||
return;
|
||||
|
||||
switch (ev)
|
||||
case EVENT_MISS_BIRD:
|
||||
{
|
||||
case EVENT_MISS_BIRD:
|
||||
{
|
||||
Creature* crunchy = shooter->FindNearestCreature(NPC_CRUNCHY, 30);
|
||||
Creature* bird = shooter->FindNearestCreature(NPC_THICKBIRD, 30);
|
||||
Creature* crunchy = shooter->FindNearestCreature(NPC_CRUNCHY, 30);
|
||||
Creature* bird = shooter->FindNearestCreature(NPC_THICKBIRD, 30);
|
||||
|
||||
if (bird && crunchy)
|
||||
{
|
||||
shooter->CastSpell(bird, SPELL_MISS_BIRD_APPLE);
|
||||
bird->CastSpell(bird, SPELL_BIRD_FALL);
|
||||
wilhelm->AI()->Talk(SAY_WILHELM_MISS);
|
||||
drostan->AI()->Talk(SAY_DROSTAN_REPLY_MISS);
|
||||
|
||||
bird->KillSelf();
|
||||
crunchy->GetMotionMaster()->MovePoint(0, bird->GetPositionX(), bird->GetPositionY(),
|
||||
bird->GetMap()->GetWaterOrGroundLevel(bird->GetPhaseShift(), bird->GetPositionX(), bird->GetPositionY(), bird->GetPositionZ()));
|
||||
/// @todo Make crunchy perform emote eat when he reaches the bird
|
||||
break;
|
||||
}
|
||||
[[fallthrough]];
|
||||
}
|
||||
case EVENT_MISS:
|
||||
if (bird && crunchy)
|
||||
{
|
||||
shooter->CastSpell(wilhelm, SPELL_MISS_APPLE);
|
||||
shooter->CastSpell(bird, SPELL_MISS_BIRD_APPLE);
|
||||
bird->CastSpell(bird, SPELL_BIRD_FALL);
|
||||
wilhelm->AI()->Talk(SAY_WILHELM_MISS);
|
||||
drostan->AI()->Talk(SAY_DROSTAN_REPLY_MISS);
|
||||
|
||||
bird->KillSelf();
|
||||
crunchy->GetMotionMaster()->MovePoint(0, bird->GetPositionX(), bird->GetPositionY(),
|
||||
bird->GetMap()->GetWaterOrGroundLevel(bird->GetPhaseShift(), bird->GetPositionX(), bird->GetPositionY(), bird->GetPositionZ()));
|
||||
/// @todo Make crunchy perform emote eat when he reaches the bird
|
||||
break;
|
||||
}
|
||||
case EVENT_HIT:
|
||||
{
|
||||
shooter->CastSpell(apple, SPELL_HIT_APPLE);
|
||||
apple->CastSpell(apple, SPELL_APPLE_FALL);
|
||||
wilhelm->AI()->Talk(SAY_WILHELM_HIT);
|
||||
if (Player* player = shooter->ToPlayer())
|
||||
player->KilledMonsterCredit(NPC_APPLE);
|
||||
break;
|
||||
}
|
||||
[[fallthrough]];
|
||||
}
|
||||
case EVENT_MISS:
|
||||
{
|
||||
shooter->CastSpell(wilhelm, SPELL_MISS_APPLE);
|
||||
wilhelm->AI()->Talk(SAY_WILHELM_MISS);
|
||||
drostan->AI()->Talk(SAY_DROSTAN_REPLY_MISS);
|
||||
break;
|
||||
}
|
||||
case EVENT_HIT:
|
||||
{
|
||||
shooter->CastSpell(apple, SPELL_HIT_APPLE);
|
||||
apple->CastSpell(apple, SPELL_APPLE_FALL);
|
||||
wilhelm->AI()->Talk(SAY_WILHELM_HIT);
|
||||
if (Player* player = shooter->ToPlayer())
|
||||
player->KilledMonsterCredit(NPC_APPLE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnCheckCast += SpellCheckCastFn(spell_q12589_shoot_rjr_SpellScript::CheckCast);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_q12589_shoot_rjr_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const override
|
||||
void Register() override
|
||||
{
|
||||
return new spell_q12589_shoot_rjr_SpellScript();
|
||||
OnCheckCast += SpellCheckCastFn(spell_q12589_shoot_rjr::CheckCast);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_q12589_shoot_rjr::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -592,34 +559,23 @@ enum SongOfWindAndWater
|
||||
NPC_HAIPHOON_AIR = 28985
|
||||
};
|
||||
|
||||
class npc_haiphoon : public CreatureScript
|
||||
struct npc_haiphoon : public VehicleAI
|
||||
{
|
||||
public:
|
||||
npc_haiphoon() : CreatureScript("npc_haiphoon") { }
|
||||
npc_haiphoon(Creature* creature) : VehicleAI(creature) { }
|
||||
|
||||
struct npc_haiphoonAI : public VehicleAI
|
||||
void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
|
||||
{
|
||||
npc_haiphoonAI(Creature* creature) : VehicleAI(creature) { }
|
||||
if (target == me)
|
||||
return;
|
||||
|
||||
void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
|
||||
if (spellInfo->Id == SPELL_DEVOUR_WIND && me->GetCharmerOrOwnerPlayerOrPlayerItself())
|
||||
{
|
||||
if (target == me)
|
||||
return;
|
||||
|
||||
if (spellInfo->Id == SPELL_DEVOUR_WIND && me->GetCharmerOrOwnerPlayerOrPlayerItself())
|
||||
{
|
||||
me->UpdateEntry(NPC_HAIPHOON_AIR);
|
||||
}
|
||||
else if (spellInfo->Id == SPELL_DEVOUR_WATER && me->GetCharmerOrOwnerPlayerOrPlayerItself())
|
||||
{
|
||||
me->UpdateEntry(NPC_HAIPHOON_WATER);
|
||||
}
|
||||
me->UpdateEntry(NPC_HAIPHOON_AIR);
|
||||
}
|
||||
else if (spellInfo->Id == SPELL_DEVOUR_WATER && me->GetCharmerOrOwnerPlayerOrPlayerItself())
|
||||
{
|
||||
me->UpdateEntry(NPC_HAIPHOON_WATER);
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new npc_haiphoonAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -786,10 +742,10 @@ void AddSC_sholazar_basin()
|
||||
RegisterCreatureAI(npc_engineer_helice);
|
||||
RegisterSpellScript(spell_q12688_detonate_1);
|
||||
RegisterSpellScript(spell_q12688_detonate_2);
|
||||
new npc_jungle_punch_target();
|
||||
new spell_q12620_the_lifewarden_wrath();
|
||||
new spell_q12589_shoot_rjr();
|
||||
new npc_haiphoon();
|
||||
RegisterCreatureAI(npc_jungle_punch_target);
|
||||
RegisterSpellScript(spell_q12620_the_lifewarden_wrath);
|
||||
RegisterSpellScript(spell_q12589_shoot_rjr);
|
||||
RegisterCreatureAI(npc_haiphoon);
|
||||
RegisterSpellScript(spell_q12611_deathbolt);
|
||||
RegisterSpellScript(spell_sholazar_take_sputum_sample);
|
||||
RegisterSpellScript(spell_sholazar_sputum_collected);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -117,143 +117,121 @@ uint32 const vehiclesList[MAX_WINTERGRASP_VEHICLES] =
|
||||
NPC_WINTERGRASP_SIEGE_ENGINE_HORDE
|
||||
};
|
||||
|
||||
class npc_wg_demolisher_engineer : public CreatureScript
|
||||
struct npc_wg_demolisher_engineer : public ScriptedAI
|
||||
{
|
||||
public:
|
||||
npc_wg_demolisher_engineer() : CreatureScript("npc_wg_demolisher_engineer") { }
|
||||
npc_wg_demolisher_engineer(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
struct npc_wg_demolisher_engineerAI : public ScriptedAI
|
||||
bool OnGossipHello(Player* player) override
|
||||
{
|
||||
if (me->IsQuestGiver())
|
||||
player->PrepareQuestMenu(me->GetGUID());
|
||||
|
||||
if (CanBuild())
|
||||
{
|
||||
npc_wg_demolisher_engineerAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
bool OnGossipHello(Player* player) override
|
||||
if (player->HasAura(SPELL_CORPORAL))
|
||||
AddGossipItemFor(player, GossipOptionIcon::None, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
|
||||
else if (player->HasAura(SPELL_LIEUTENANT))
|
||||
{
|
||||
if (me->IsQuestGiver())
|
||||
player->PrepareQuestMenu(me->GetGUID());
|
||||
|
||||
if (CanBuild())
|
||||
{
|
||||
if (player->HasAura(SPELL_CORPORAL))
|
||||
AddGossipItemFor(player, GossipOptionIcon::None, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
|
||||
else if (player->HasAura(SPELL_LIEUTENANT))
|
||||
{
|
||||
AddGossipItemFor(player, GossipOptionIcon::None, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
|
||||
AddGossipItemFor(player, GossipOptionIcon::None, GOSSIP_HELLO_DEMO2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
AddGossipItemFor(player, GossipOptionIcon::None, GOSSIP_HELLO_DEMO3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
|
||||
}
|
||||
}
|
||||
else
|
||||
AddGossipItemFor(player, GossipOptionIcon::None, GOSSIP_HELLO_DEMO4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9);
|
||||
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
|
||||
return true;
|
||||
AddGossipItemFor(player, GossipOptionIcon::None, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
|
||||
AddGossipItemFor(player, GossipOptionIcon::None, GOSSIP_HELLO_DEMO2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
AddGossipItemFor(player, GossipOptionIcon::None, GOSSIP_HELLO_DEMO3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
|
||||
}
|
||||
|
||||
bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
|
||||
{
|
||||
uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
|
||||
CloseGossipMenuFor(player);
|
||||
|
||||
if (CanBuild())
|
||||
{
|
||||
switch (action - GOSSIP_ACTION_INFO_DEF)
|
||||
{
|
||||
case 0:
|
||||
DoCast(player, SPELL_BUILD_CATAPULT_FORCE, true);
|
||||
break;
|
||||
case 1:
|
||||
DoCast(player, SPELL_BUILD_DEMOLISHER_FORCE, true);
|
||||
break;
|
||||
case 2:
|
||||
DoCast(player, player->GetTeamId() == TEAM_ALLIANCE ? SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE : SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, true);
|
||||
break;
|
||||
}
|
||||
if (Creature* controlArms = me->FindNearestCreature(NPC_WINTERGRASP_CONTROL_ARMS, 30.0f, true))
|
||||
DoCast(controlArms, SPELL_ACTIVATE_CONTROL_ARMS, true);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
bool CanBuild() const
|
||||
{
|
||||
Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
|
||||
if (!wintergrasp)
|
||||
return false;
|
||||
|
||||
switch (me->GetEntry())
|
||||
{
|
||||
case NPC_GOBLIN_MECHANIC:
|
||||
return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_H));
|
||||
case NPC_GNOMISH_ENGINEER:
|
||||
return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_A));
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new npc_wg_demolisher_engineerAI(creature);
|
||||
}
|
||||
else
|
||||
AddGossipItemFor(player, GossipOptionIcon::None, GOSSIP_HELLO_DEMO4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9);
|
||||
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
|
||||
{
|
||||
uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
|
||||
CloseGossipMenuFor(player);
|
||||
|
||||
if (CanBuild())
|
||||
{
|
||||
switch (action - GOSSIP_ACTION_INFO_DEF)
|
||||
{
|
||||
case 0:
|
||||
DoCast(player, SPELL_BUILD_CATAPULT_FORCE, true);
|
||||
break;
|
||||
case 1:
|
||||
DoCast(player, SPELL_BUILD_DEMOLISHER_FORCE, true);
|
||||
break;
|
||||
case 2:
|
||||
DoCast(player, player->GetTeamId() == TEAM_ALLIANCE ? SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE : SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, true);
|
||||
break;
|
||||
}
|
||||
if (Creature* controlArms = me->FindNearestCreature(NPC_WINTERGRASP_CONTROL_ARMS, 30.0f, true))
|
||||
DoCast(controlArms, SPELL_ACTIVATE_CONTROL_ARMS, true);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
bool CanBuild() const
|
||||
{
|
||||
Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
|
||||
if (!wintergrasp)
|
||||
return false;
|
||||
|
||||
switch (me->GetEntry())
|
||||
{
|
||||
case NPC_GOBLIN_MECHANIC:
|
||||
return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_H));
|
||||
case NPC_GNOMISH_ENGINEER:
|
||||
return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_A));
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class npc_wg_spirit_guide : public CreatureScript
|
||||
struct npc_wg_spirit_guide : public ScriptedAI
|
||||
{
|
||||
public:
|
||||
npc_wg_spirit_guide() : CreatureScript("npc_wg_spirit_guide") { }
|
||||
npc_wg_spirit_guide(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
struct npc_wg_spirit_guideAI : public ScriptedAI
|
||||
void UpdateAI(uint32 /*diff*/) override
|
||||
{
|
||||
if (!me->HasUnitState(UNIT_STATE_CASTING))
|
||||
DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL);
|
||||
}
|
||||
|
||||
bool OnGossipHello(Player* player) override
|
||||
{
|
||||
if (me->IsQuestGiver())
|
||||
player->PrepareQuestMenu(me->GetGUID());
|
||||
|
||||
Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
|
||||
if (!wintergrasp)
|
||||
return true;
|
||||
|
||||
GraveyardVect graveyard = wintergrasp->GetGraveyardVector();
|
||||
for (uint8 i = 0; i < graveyard.size(); i++)
|
||||
if (graveyard[i]->GetControlTeamId() == player->GetTeamId())
|
||||
AddGossipItemFor(player, GossipOptionIcon::None, player->GetSession()->GetTrinityString(((BfGraveyardWG*)graveyard[i])->GetTextId()), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + i);
|
||||
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
|
||||
{
|
||||
uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
|
||||
CloseGossipMenuFor(player);
|
||||
|
||||
Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
|
||||
if (wintergrasp)
|
||||
{
|
||||
npc_wg_spirit_guideAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void UpdateAI(uint32 /*diff*/) override
|
||||
{
|
||||
if (!me->HasUnitState(UNIT_STATE_CASTING))
|
||||
DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL);
|
||||
}
|
||||
|
||||
bool OnGossipHello(Player* player) override
|
||||
{
|
||||
if (me->IsQuestGiver())
|
||||
player->PrepareQuestMenu(me->GetGUID());
|
||||
|
||||
Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
|
||||
if (!wintergrasp)
|
||||
return true;
|
||||
|
||||
GraveyardVect graveyard = wintergrasp->GetGraveyardVector();
|
||||
for (uint8 i = 0; i < graveyard.size(); i++)
|
||||
if (graveyard[i]->GetControlTeamId() == player->GetTeamId())
|
||||
AddGossipItemFor(player, GossipOptionIcon::None, player->GetSession()->GetTrinityString(((BfGraveyardWG*)graveyard[i])->GetTextId()), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + i);
|
||||
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
|
||||
{
|
||||
uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
|
||||
CloseGossipMenuFor(player);
|
||||
|
||||
Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
|
||||
if (wintergrasp)
|
||||
{
|
||||
GraveyardVect gy = wintergrasp->GetGraveyardVector();
|
||||
for (uint8 i = 0; i < gy.size(); i++)
|
||||
if (action - GOSSIP_ACTION_INFO_DEF == i && gy[i]->GetControlTeamId() == player->GetTeamId())
|
||||
if (WorldSafeLocsEntry const* safeLoc = sObjectMgr->GetWorldSafeLoc(gy[i]->GetGraveyardId()))
|
||||
player->TeleportTo(safeLoc->Loc);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new npc_wg_spirit_guideAI(creature);
|
||||
GraveyardVect gy = wintergrasp->GetGraveyardVector();
|
||||
for (uint8 i = 0; i < gy.size(); i++)
|
||||
if (action - GOSSIP_ACTION_INFO_DEF == i && gy[i]->GetControlTeamId() == player->GetTeamId())
|
||||
if (WorldSafeLocsEntry const* safeLoc = sObjectMgr->GetWorldSafeLoc(gy[i]->GetGraveyardId()))
|
||||
player->TeleportTo(safeLoc->Loc);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
enum WGQueue
|
||||
@@ -261,142 +239,121 @@ enum WGQueue
|
||||
SPELL_FROST_ARMOR = 12544
|
||||
};
|
||||
|
||||
class npc_wg_queue : public CreatureScript
|
||||
struct npc_wg_queue : public ScriptedAI
|
||||
{
|
||||
public:
|
||||
npc_wg_queue() : CreatureScript("npc_wg_queue") { }
|
||||
|
||||
struct npc_wg_queueAI : public ScriptedAI
|
||||
npc_wg_queue(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
npc_wg_queueAI(Creature* creature) : ScriptedAI(creature)
|
||||
FrostArmor_Timer = 0;
|
||||
}
|
||||
|
||||
uint32 FrostArmor_Timer;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
FrostArmor_Timer = 0;
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override { }
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (FrostArmor_Timer <= diff)
|
||||
{
|
||||
FrostArmor_Timer = 0;
|
||||
DoCast(me, SPELL_FROST_ARMOR);
|
||||
FrostArmor_Timer = 180000;
|
||||
}
|
||||
else FrostArmor_Timer -= diff;
|
||||
|
||||
uint32 FrostArmor_Timer;
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
bool OnGossipHello(Player* player) override
|
||||
{
|
||||
if (me->IsQuestGiver())
|
||||
player->PrepareQuestMenu(me->GetGUID());
|
||||
|
||||
Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
|
||||
if (!wintergrasp)
|
||||
return true;
|
||||
|
||||
if (wintergrasp->IsWarTime())
|
||||
{
|
||||
FrostArmor_Timer = 0;
|
||||
AddGossipItemFor(player, GossipOptionIcon::None, player->GetSession()->GetTrinityString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
|
||||
SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, me->GetGUID());
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override { }
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
else
|
||||
{
|
||||
if (FrostArmor_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_FROST_ARMOR);
|
||||
FrostArmor_Timer = 180000;
|
||||
}
|
||||
else FrostArmor_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
bool OnGossipHello(Player* player) override
|
||||
{
|
||||
if (me->IsQuestGiver())
|
||||
player->PrepareQuestMenu(me->GetGUID());
|
||||
|
||||
Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
|
||||
if (!wintergrasp)
|
||||
return true;
|
||||
|
||||
if (wintergrasp->IsWarTime())
|
||||
uint32 timer = wintergrasp->GetTimer() / 1000;
|
||||
player->SendUpdateWorldState(4354, GameTime::GetGameTime() + timer);
|
||||
if (timer < 15 * MINUTE)
|
||||
{
|
||||
AddGossipItemFor(player, GossipOptionIcon::None, player->GetSession()->GetTrinityString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
|
||||
SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, me->GetGUID());
|
||||
SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_QUEUE : WG_NPCQUEUE_TEXT_A_QUEUE, me->GetGUID());
|
||||
}
|
||||
else
|
||||
{
|
||||
uint32 timer = wintergrasp->GetTimer() / 1000;
|
||||
player->SendUpdateWorldState(WS_BATTLEFIELD_WG_TIME_NEXT_BATTLE, GameTime::GetGameTime() + timer);
|
||||
if (timer < 15 * MINUTE)
|
||||
{
|
||||
AddGossipItemFor(player, GossipOptionIcon::None, player->GetSession()->GetTrinityString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
|
||||
SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_QUEUE : WG_NPCQUEUE_TEXT_A_QUEUE, me->GetGUID());
|
||||
}
|
||||
else
|
||||
SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, me->GetGUID());
|
||||
}
|
||||
return true;
|
||||
SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, me->GetGUID());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
|
||||
{
|
||||
CloseGossipMenuFor(player);
|
||||
|
||||
Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
|
||||
if (!wintergrasp)
|
||||
return true;
|
||||
|
||||
if (wintergrasp->IsWarTime())
|
||||
wintergrasp->InvitePlayerToWar(player);
|
||||
else
|
||||
{
|
||||
uint32 timer = wintergrasp->GetTimer() / 1000;
|
||||
if (timer < 15 * MINUTE)
|
||||
wintergrasp->InvitePlayerToQueue(player);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
|
||||
{
|
||||
return new npc_wg_queueAI(creature);
|
||||
CloseGossipMenuFor(player);
|
||||
|
||||
Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
|
||||
if (!wintergrasp)
|
||||
return true;
|
||||
|
||||
if (wintergrasp->IsWarTime())
|
||||
wintergrasp->InvitePlayerToWar(player);
|
||||
else
|
||||
{
|
||||
uint32 timer = wintergrasp->GetTimer() / 1000;
|
||||
if (timer < 15 * MINUTE)
|
||||
wintergrasp->InvitePlayerToQueue(player);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class go_wg_vehicle_teleporter : public GameObjectScript
|
||||
struct go_wg_vehicle_teleporter : public GameObjectAI
|
||||
{
|
||||
public:
|
||||
go_wg_vehicle_teleporter() : GameObjectScript("go_wg_vehicle_teleporter") { }
|
||||
go_wg_vehicle_teleporter(GameObject* gameObject) : GameObjectAI(gameObject), _checkTimer(0) { }
|
||||
|
||||
struct go_wg_vehicle_teleporterAI : public GameObjectAI
|
||||
bool IsFriendly(Unit* passenger)
|
||||
{
|
||||
return ((me->GetFaction() == FACTION_HORDE_GENERIC_WG && passenger->GetFaction() == HORDE) ||
|
||||
(me->GetFaction() == FACTION_ALLIANCE_GENERIC_WG && passenger->GetFaction() == ALLIANCE));
|
||||
}
|
||||
|
||||
Creature* GetValidVehicle(Creature* cVeh)
|
||||
{
|
||||
if (!cVeh->HasAura(SPELL_VEHICLE_TELEPORT))
|
||||
if (Vehicle* vehicle = cVeh->GetVehicleKit())
|
||||
if (Unit* passenger = vehicle->GetPassenger(0))
|
||||
if (IsFriendly(passenger))
|
||||
if (Creature* teleportTrigger = passenger->SummonTrigger(me->GetPositionX()-60.0f, me->GetPositionY(), me->GetPositionZ()+1.0f, cVeh->GetOrientation(), 1s))
|
||||
return teleportTrigger;
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
_checkTimer += diff;
|
||||
if (_checkTimer >= 1000)
|
||||
{
|
||||
go_wg_vehicle_teleporterAI(GameObject* gameObject) : GameObjectAI(gameObject), _checkTimer(0) { }
|
||||
for (uint8 i = 0; i < MAX_WINTERGRASP_VEHICLES; i++)
|
||||
if (Creature* vehicleCreature = me->FindNearestCreature(vehiclesList[i], 3.0f, true))
|
||||
if (Creature* teleportTrigger = GetValidVehicle(vehicleCreature))
|
||||
teleportTrigger->CastSpell(vehicleCreature, SPELL_VEHICLE_TELEPORT, true);
|
||||
|
||||
bool IsFriendly(Unit* passenger)
|
||||
{
|
||||
return ((me->GetFaction() == FACTION_HORDE_GENERIC_WG && passenger->GetFaction() == HORDE) ||
|
||||
(me->GetFaction() == FACTION_ALLIANCE_GENERIC_WG && passenger->GetFaction() == ALLIANCE));
|
||||
}
|
||||
|
||||
Creature* GetValidVehicle(Creature* cVeh)
|
||||
{
|
||||
if (!cVeh->HasAura(SPELL_VEHICLE_TELEPORT))
|
||||
if (Vehicle* vehicle = cVeh->GetVehicleKit())
|
||||
if (Unit* passenger = vehicle->GetPassenger(0))
|
||||
if (IsFriendly(passenger))
|
||||
if (Creature* teleportTrigger = passenger->SummonTrigger(me->GetPositionX()-60.0f, me->GetPositionY(), me->GetPositionZ()+1.0f, cVeh->GetOrientation(), 1s))
|
||||
return teleportTrigger;
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
_checkTimer += diff;
|
||||
if (_checkTimer >= 1000)
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_WINTERGRASP_VEHICLES; i++)
|
||||
if (Creature* vehicleCreature = me->FindNearestCreature(vehiclesList[i], 3.0f, true))
|
||||
if (Creature* teleportTrigger = GetValidVehicle(vehicleCreature))
|
||||
teleportTrigger->CastSpell(vehicleCreature, SPELL_VEHICLE_TELEPORT, true);
|
||||
|
||||
_checkTimer = 0;
|
||||
}
|
||||
}
|
||||
private:
|
||||
uint32 _checkTimer;
|
||||
};
|
||||
|
||||
GameObjectAI* GetAI(GameObject* go) const override
|
||||
{
|
||||
return new go_wg_vehicle_teleporterAI(go);
|
||||
_checkTimer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 _checkTimer;
|
||||
};
|
||||
|
||||
/* 49899 - Activate Robotic Arms
|
||||
@@ -404,70 +361,48 @@ class go_wg_vehicle_teleporter : public GameObjectScript
|
||||
56662 - Build Siege Vehicle (Force)
|
||||
56664 - Build Catapult (Force)
|
||||
61409 - Build Siege Vehicle (Force) */
|
||||
class spell_wintergrasp_force_building : public SpellScriptLoader
|
||||
class spell_wintergrasp_force_building : public SpellScript
|
||||
{
|
||||
public:
|
||||
spell_wintergrasp_force_building() : SpellScriptLoader("spell_wintergrasp_force_building") { }
|
||||
PrepareSpellScript(spell_wintergrasp_force_building);
|
||||
|
||||
class spell_wintergrasp_force_building_SpellScript : public SpellScript
|
||||
bool Validate(SpellInfo const* /*spell*/) override
|
||||
{
|
||||
return ValidateSpellInfo(
|
||||
{
|
||||
PrepareSpellScript(spell_wintergrasp_force_building_SpellScript);
|
||||
SPELL_BUILD_CATAPULT_FORCE,
|
||||
SPELL_BUILD_DEMOLISHER_FORCE,
|
||||
SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE,
|
||||
SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE
|
||||
});
|
||||
}
|
||||
|
||||
bool Validate(SpellInfo const* /*spell*/) override
|
||||
{
|
||||
return ValidateSpellInfo(
|
||||
{
|
||||
SPELL_BUILD_CATAPULT_FORCE,
|
||||
SPELL_BUILD_DEMOLISHER_FORCE,
|
||||
SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE,
|
||||
SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE
|
||||
});
|
||||
}
|
||||
void HandleScript(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
GetHitUnit()->CastSpell(GetHitUnit(), GetEffectValue(), false);
|
||||
}
|
||||
|
||||
void HandleScript(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
GetHitUnit()->CastSpell(GetHitUnit(), GetEffectValue(), false);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_force_building_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const override
|
||||
{
|
||||
return new spell_wintergrasp_force_building_SpellScript();
|
||||
}
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_force_building::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
// 61178 - Grab Passenger
|
||||
class spell_wintergrasp_grab_passenger : public SpellScriptLoader
|
||||
class spell_wintergrasp_grab_passenger : public SpellScript
|
||||
{
|
||||
public:
|
||||
spell_wintergrasp_grab_passenger() : SpellScriptLoader("spell_wintergrasp_grab_passenger") { }
|
||||
PrepareSpellScript(spell_wintergrasp_grab_passenger);
|
||||
|
||||
class spell_wintergrasp_grab_passenger_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_wintergrasp_grab_passenger_SpellScript);
|
||||
void HandleScript(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Player* target = GetHitPlayer())
|
||||
target->CastSpell(GetCaster(), SPELL_RIDE_WG_VEHICLE, false);
|
||||
}
|
||||
|
||||
void HandleScript(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Player* target = GetHitPlayer())
|
||||
target->CastSpell(GetCaster(), SPELL_RIDE_WG_VEHICLE, false);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_grab_passenger_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const override
|
||||
{
|
||||
return new spell_wintergrasp_grab_passenger_SpellScript();
|
||||
}
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_grab_passenger::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
class achievement_wg_didnt_stand_a_chance : public AchievementCriteriaScript
|
||||
@@ -500,66 +435,45 @@ enum WgTeleport
|
||||
};
|
||||
|
||||
// 54640 - Teleport
|
||||
class spell_wintergrasp_defender_teleport : public SpellScriptLoader
|
||||
class spell_wintergrasp_defender_teleport : public SpellScript
|
||||
{
|
||||
public:
|
||||
spell_wintergrasp_defender_teleport() : SpellScriptLoader("spell_wintergrasp_defender_teleport") { }
|
||||
PrepareSpellScript(spell_wintergrasp_defender_teleport);
|
||||
|
||||
class spell_wintergrasp_defender_teleport_SpellScript : public SpellScript
|
||||
SpellCastResult CheckCast()
|
||||
{
|
||||
PrepareSpellScript(spell_wintergrasp_defender_teleport_SpellScript);
|
||||
if (Battlefield* wg = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG))
|
||||
if (Player* target = GetExplTargetUnit()->ToPlayer())
|
||||
// check if we are in Wintergrasp at all, SotA uses same teleport spells
|
||||
if ((target->GetZoneId() == AREA_WINTERGRASP && target->GetTeamId() != wg->GetDefenderTeam()) || target->HasAura(SPELL_WINTERGRASP_TELEPORT_TRIGGER))
|
||||
return SPELL_FAILED_BAD_TARGETS;
|
||||
return SPELL_CAST_OK;
|
||||
}
|
||||
|
||||
SpellCastResult CheckCast()
|
||||
{
|
||||
if (Battlefield* wg = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG))
|
||||
if (Player* target = GetExplTargetUnit()->ToPlayer())
|
||||
// check if we are in Wintergrasp at all, SotA uses same teleport spells
|
||||
if ((target->GetZoneId() == 4197 && target->GetTeamId() != wg->GetDefenderTeam()) || target->HasAura(SPELL_WINTERGRASP_TELEPORT_TRIGGER))
|
||||
return SPELL_FAILED_BAD_TARGETS;
|
||||
return SPELL_CAST_OK;
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnCheckCast += SpellCheckCastFn(spell_wintergrasp_defender_teleport_SpellScript::CheckCast);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const override
|
||||
void Register() override
|
||||
{
|
||||
return new spell_wintergrasp_defender_teleport_SpellScript();
|
||||
OnCheckCast += SpellCheckCastFn(spell_wintergrasp_defender_teleport::CheckCast);
|
||||
}
|
||||
};
|
||||
|
||||
// 54643 - Teleport
|
||||
class spell_wintergrasp_defender_teleport_trigger : public SpellScriptLoader
|
||||
class spell_wintergrasp_defender_teleport_trigger : public SpellScript
|
||||
{
|
||||
public:
|
||||
spell_wintergrasp_defender_teleport_trigger() : SpellScriptLoader("spell_wintergrasp_defender_teleport_trigger") { }
|
||||
PrepareSpellScript(spell_wintergrasp_defender_teleport_trigger);
|
||||
|
||||
class spell_wintergrasp_defender_teleport_trigger_SpellScript : public SpellScript
|
||||
void HandleDummy(SpellEffIndex /*effindex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_wintergrasp_defender_teleport_trigger_SpellScript);
|
||||
|
||||
void HandleDummy(SpellEffIndex /*effindex*/)
|
||||
if (Unit* target = GetHitUnit())
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
{
|
||||
WorldLocation loc = target->GetWorldLocation();
|
||||
SetExplTargetDest(loc);
|
||||
}
|
||||
WorldLocation loc = target->GetWorldLocation();
|
||||
SetExplTargetDest(loc);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_defender_teleport_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const override
|
||||
{
|
||||
return new spell_wintergrasp_defender_teleport_trigger_SpellScript();
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_defender_teleport_trigger::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
// 58549 - Tenacity
|
||||
@@ -639,15 +553,15 @@ public:
|
||||
|
||||
void AddSC_wintergrasp()
|
||||
{
|
||||
new npc_wg_queue();
|
||||
new npc_wg_spirit_guide();
|
||||
new npc_wg_demolisher_engineer();
|
||||
new go_wg_vehicle_teleporter();
|
||||
new spell_wintergrasp_force_building();
|
||||
new spell_wintergrasp_grab_passenger();
|
||||
RegisterCreatureAI(npc_wg_queue);
|
||||
RegisterCreatureAI(npc_wg_spirit_guide);
|
||||
RegisterCreatureAI(npc_wg_demolisher_engineer);
|
||||
RegisterGameObjectAI(go_wg_vehicle_teleporter);
|
||||
RegisterSpellScript(spell_wintergrasp_force_building);
|
||||
RegisterSpellScript(spell_wintergrasp_grab_passenger);
|
||||
new achievement_wg_didnt_stand_a_chance();
|
||||
new spell_wintergrasp_defender_teleport();
|
||||
new spell_wintergrasp_defender_teleport_trigger();
|
||||
RegisterSpellScript(spell_wintergrasp_defender_teleport);
|
||||
RegisterSpellScript(spell_wintergrasp_defender_teleport_trigger);
|
||||
RegisterSpellScript(spell_wintergrasp_tenacity_refresh);
|
||||
new condition_is_wintergrasp_horde();
|
||||
new condition_is_wintergrasp_alliance();
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user