refactor(Script/Dalaran): Minigob Manabonk (#19244)

* refactor(Script/Dalaran): Minigob Manabonk

* closes https://github.com/azerothcore/azerothcore-wotlk/issues/16841

* Update src/server/scripts/Northrend/zone_dalaran.cpp
This commit is contained in:
Kitzunu
2024-07-04 19:28:10 +02:00
committed by GitHub
parent 6031ae2eb9
commit e8f7d70ee0

View File

@@ -20,6 +20,7 @@
#include "Player.h" #include "Player.h"
#include "ScriptedCreature.h" #include "ScriptedCreature.h"
#include "ScriptedGossip.h" #include "ScriptedGossip.h"
#include "TaskScheduler.h"
#include "World.h" #include "World.h"
// Ours // Ours
@@ -506,108 +507,113 @@ enum MinigobData
SPELL_IMPROVED_BLINK = 61995, SPELL_IMPROVED_BLINK = 61995,
EVENT_SELECT_TARGET = 1, EVENT_SELECT_TARGET = 1,
EVENT_BLINK = 2, EVENT_POLYMORPH = 2,
EVENT_DESPAWN_VISUAL = 3, EVENT_LAUGH = 3,
EVENT_DESPAWN = 4, EVENT_MOVE = 4,
EVENT_DESPAWN_VISUAL = 5,
EVENT_DESPAWN = 6,
MAIL_MINIGOB_ENTRY = 264, MAIL_MINIGOB_ENTRY = 264,
MAIL_DELIVER_DELAY_MIN = 5 * MINUTE, MAIL_DELIVER_DELAY_MIN = 5 * MINUTE,
MAIL_DELIVER_DELAY_MAX = 15 * MINUTE MAIL_DELIVER_DELAY_MAX = 15 * MINUTE
}; };
class npc_minigob_manabonk : public CreatureScript struct npc_minigob_manabonk : public ScriptedAI
{ {
public: npc_minigob_manabonk(Creature* creature) : ScriptedAI(creature)
npc_minigob_manabonk() : CreatureScript("npc_minigob_manabonk") {}
struct npc_minigob_manabonkAI : public ScriptedAI
{ {
npc_minigob_manabonkAI(Creature* creature) : ScriptedAI(creature) me->setActive(true);
{ }
me->setActive(true);
}
void Reset() override void Reset() override
{ {
me->SetVisible(false); me->SetVisible(false);
events.ScheduleEvent(EVENT_SELECT_TARGET, IN_MILLISECONDS); events.ScheduleEvent(EVENT_SELECT_TARGET, 1s);
} }
Player* SelectTargetInDalaran() Player* SelectTargetInDalaran()
{ {
std::list<Player*> PlayerInDalaranList; std::list<Player*> playerInDalaranList;
PlayerInDalaranList.clear(); playerInDalaranList.clear();
Map::PlayerList const& players = me->GetMap()->GetPlayers(); me->GetMap()->DoForAllPlayers([&](Player* player)
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())
PlayerInDalaranList.push_back(player);
if (PlayerInDalaranList.empty())
return nullptr;
return Acore::Containers::SelectRandomContainerElement(PlayerInDalaranList);
}
void SendMailToPlayer(Player* player)
{
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, me->GetEntry()), MAIL_CHECK_MASK_NONE, deliverDelay);
CharacterDatabase.CommitTransaction(trans);
}
void UpdateAI(uint32 diff) override
{
if (!sWorld->getBoolConfig(CONFIG_MINIGOB_MANABONK))
return;
events.Update(diff);
while (uint32 eventId = events.ExecuteEvent())
{ {
switch (eventId) if (player->GetZoneId() == ZONE_DALARAN && !player->IsFlying() && !player->IsMounted() && !player->IsGameMaster())
{ playerInDalaranList.push_back(player);
case EVENT_SELECT_TARGET: });
me->SetVisible(true);
DoCast(me, SPELL_TELEPORT_VISUAL); if (playerInDalaranList.empty())
if (Player* player = SelectTargetInDalaran()) return nullptr;
{ return Acore::Containers::SelectRandomContainerElement(playerInDalaranList);
me->NearTeleportTo(player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f); }
DoCast(player, SPELL_MANABONKED);
SendMailToPlayer(player); void SendMailToPlayer(Player* player)
} {
events.ScheduleEvent(EVENT_BLINK, 3ms); CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
break; int16 deliverDelay = irand(MAIL_DELIVER_DELAY_MIN, MAIL_DELIVER_DELAY_MAX);
case EVENT_BLINK: MailDraft(MAIL_MINIGOB_ENTRY, true).SendMailTo(trans, MailReceiver(player), MailSender(MAIL_CREATURE, me->GetEntry()), MAIL_CHECK_MASK_NONE, deliverDelay);
{ CharacterDatabase.CommitTransaction(trans);
DoCast(me, SPELL_IMPROVED_BLINK); }
Position pos = me->GetRandomNearPosition((urand(15, 40)));
me->GetMotionMaster()->MovePoint(0, pos.m_positionX, pos.m_positionY, pos.m_positionZ); void UpdateAI(uint32 diff) override
events.ScheduleEvent(EVENT_DESPAWN, 3ms); {
events.ScheduleEvent(EVENT_DESPAWN_VISUAL, 3ms); if (!sWorld->getBoolConfig(CONFIG_MINIGOB_MANABONK))
break; return;
}
case EVENT_DESPAWN_VISUAL: events.Update(diff);
DoCast(me, SPELL_TELEPORT_VISUAL);
break; while (uint32 eventId = events.ExecuteEvent())
case EVENT_DESPAWN: {
switch (eventId)
{
case EVENT_SELECT_TARGET:
me->SetVisible(true);
DoCastSelf(SPELL_TELEPORT_VISUAL);
if (Player* player = SelectTargetInDalaran())
{
playerGUID = player->GetGUID();
Position pos = player->GetPosition();
me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation());
me->GetMotionMaster()->MoveRandom(10);
}
events.ScheduleEvent(EVENT_POLYMORPH, 30s);
break;
case EVENT_POLYMORPH:
if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID))
{
DoCast(player, SPELL_MANABONKED);
SendMailToPlayer(player);
}
else
me->DespawnOrUnsummon(); me->DespawnOrUnsummon();
break; events.ScheduleEvent(EVENT_LAUGH, 2s);
default: break;
break; case EVENT_LAUGH:
} me->GetMotionMaster()->MoveIdle();
me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH_NO_SHEATHE);
events.ScheduleEvent(EVENT_MOVE, 4s);
break;
case EVENT_MOVE:
{
Position pos = me->GetRandomNearPosition((urand(15, 40)));
me->GetMotionMaster()->MovePoint(0, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), true);
}
events.ScheduleEvent(EVENT_DESPAWN_VISUAL, 3s);
events.ScheduleEvent(EVENT_DESPAWN, 4s);
break;
case EVENT_DESPAWN_VISUAL:
DoCastSelf(SPELL_IMPROVED_BLINK);
break;
case EVENT_DESPAWN:
me->DespawnOrUnsummon();
break;
default:
break;
} }
} }
private:
EventMap events;
};
CreatureAI* GetAI(Creature* creature) const override
{
return new npc_minigob_manabonkAI(creature);
} }
private:
ObjectGuid playerGUID;
}; };
class npc_dalaran_mage : public CreatureScript class npc_dalaran_mage : public CreatureScript
@@ -861,8 +867,6 @@ void AddSC_dalaran()
new npc_dalaran_mage(); new npc_dalaran_mage();
new npc_dalaran_warrior(); new npc_dalaran_warrior();
RegisterCreatureAI(npc_cosmetic_toy_plane); RegisterCreatureAI(npc_cosmetic_toy_plane);
// theirs
new npc_mageguard_dalaran(); new npc_mageguard_dalaran();
new npc_minigob_manabonk(); RegisterCreatureAI(npc_minigob_manabonk);
} }