fix(DB/Script): Eastvale Logging Camp, Elywnn Forest (#10036)

* fix(DB/Script): Eastvale Logging Camp, Elywnn Forest

* Update rev_1641426458023302944.sql

* Update zone_elwynn_forest.cpp
This commit is contained in:
Malcrom
2022-01-06 13:58:28 -04:00
committed by GitHub
parent ea8404f981
commit 73d5772cf6
2 changed files with 378 additions and 0 deletions

View File

@@ -256,8 +256,265 @@ private:
GuidVector _childrenGUIDs;
};
/*######
## npc_supervisor_raelen
######*/
enum SupervisorRaelen
{
EVENT_FIND_PEASENTS = 8,
EVENT_NEXT_PEASENT = 9,
NPC_EASTVALE_PEASENT = 11328
};
struct npc_supervisor_raelen : public ScriptedAI
{
npc_supervisor_raelen(Creature* creature) : ScriptedAI(creature) {}
void Reset() override
{
_PeasentId = 0;
peasentGUIDs.clear();
_events.ScheduleEvent(EVENT_FIND_PEASENTS, 4000);
}
void SetData(uint32 /*type*/, uint32 data) override
{
if (data == 1)
{
++_PeasentId;
if (_PeasentId == 5) _PeasentId = 0;
_events.ScheduleEvent(EVENT_NEXT_PEASENT, urand(2000, 6000));
}
}
void CallPeasent()
{
if (Creature* peasent = ObjectAccessor::GetCreature(*me, peasentGUIDs[_PeasentId]))
peasent->AI()->SetData(1, 1);
}
void UpdateAI(uint32 diff) override
{
_events.Update(diff);
if (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_FIND_PEASENTS:
{
GuidVector tempGUIDs;
std::list<Creature*> peasents;
GetCreatureListWithEntryInGrid(peasents, me, NPC_EASTVALE_PEASENT, 100.f);
for (Creature* peasent : peasents)
{
tempGUIDs.push_back(peasent->GetGUID());
}
peasentGUIDs.push_back(tempGUIDs[2]);
peasentGUIDs.push_back(tempGUIDs[3]);
peasentGUIDs.push_back(tempGUIDs[0]);
peasentGUIDs.push_back(tempGUIDs[1]);
peasentGUIDs.push_back(tempGUIDs[4]);
_events.ScheduleEvent(EVENT_NEXT_PEASENT, 1000);
break;
}
case EVENT_NEXT_PEASENT:
CallPeasent();
break;
}
}
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
}
private:
EventMap _events;
uint8 _PeasentId;
GuidVector peasentGUIDs;
};
/*######
## npc_eastvale_peasent
######*/
enum EastvalePeasent
{
EVENT_MOVETORAELEN = 10,
EVENT_TALKTORAELEN1 = 11,
EVENT_TALKTORAELEN2 = 12,
EVENT_RAELENTALK = 13,
EVENT_TALKTORAELEN3 = 14,
EVENT_TALKTORAELEN4 = 15,
EVENT_PATHBACK = 16,
NPC_SUPERVISOR_RAELEN = 10616,
PATH_PEASENT_0 = 813490,
PATH_PEASENT_1 = 813480,
PATH_PEASENT_2 = 812520,
PATH_PEASENT_3 = 812490,
PATH_PEASENT_4 = 812500,
SAY_RAELEN = 0,
SOUND_PEASENT_GREETING_1 = 6289,
SOUND_PEASENT_GREETING_2 = 6288,
SOUND_PEASENT_GREETING_3 = 6290,
SOUND_PEASENT_LEAVING_1 = 6242,
SOUND_PEASENT_LEAVING_2 = 6282,
SOUND_PEASENT_LEAVING_3 = 6284,
SOUND_PEASENT_LEAVING_4 = 6285,
SOUND_PEASENT_LEAVING_5 = 6286,
SPELL_TRANSFORM_PEASENT_WITH_WOOD = 9127
};
struct npc_eastvale_peasent : public ScriptedAI
{
npc_eastvale_peasent(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
_path = me->GetSpawnId() * 10;
}
void Reset() override {}
void SetData(uint32 /*type*/, uint32 data) override
{
if (data == 1)
{
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
me->CastSpell(me, SPELL_TRANSFORM_PEASENT_WITH_WOOD);
me->SetSpeed(MOVE_WALK, 1.0f);
me->GetMotionMaster()->MovePath(_path, false);
}
}
void PathEndReached(uint32 pathId) override
{
if (pathId == _path)
{
CreatureTemplate const* cinfo = sObjectMgr->GetCreatureTemplate(me->GetEntry());
me->SetSpeed(MOVE_WALK, cinfo->speed_walk);
me->RemoveAura(SPELL_TRANSFORM_PEASENT_WITH_WOOD);
_events.ScheduleEvent(EVENT_MOVETORAELEN, 3000);
}
else if (pathId == _path + 1)
{
_events.ScheduleEvent(EVENT_TALKTORAELEN1, 1000);
}
else if (pathId == _path + 2)
{
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_WORK_CHOPWOOD);
}
}
void UpdateAI(uint32 diff) override
{
_events.Update(diff);
if (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_MOVETORAELEN:
me->GetMotionMaster()->MovePath(_path + 1, false);
break;
case EVENT_TALKTORAELEN1:
if (Creature* realen = me->FindNearestCreature(NPC_SUPERVISOR_RAELEN, 2.0f, true))
{
_realenGUID = realen->GetGUID();
me->SetFacingToObject(realen);
switch (_path)
{
case PATH_PEASENT_0:
me->PlayDirectSound(SOUND_PEASENT_GREETING_1);
_events.ScheduleEvent(EVENT_TALKTORAELEN2, 2000);
break;
case PATH_PEASENT_1:
case PATH_PEASENT_3:
me->PlayDirectSound(SOUND_PEASENT_GREETING_3);
_events.ScheduleEvent(EVENT_RAELENTALK, 2000);
break;
case PATH_PEASENT_2:
case PATH_PEASENT_4:
me->PlayDirectSound(SOUND_PEASENT_GREETING_2);
_events.ScheduleEvent(EVENT_RAELENTALK, 2000);
break;
}
}
else
{
// Path back if realen cannot be found alive
_events.ScheduleEvent(EVENT_PATHBACK, 2000);
}
break;
case EVENT_TALKTORAELEN2:
me->PlayDirectSound(SOUND_PEASENT_GREETING_2);
_events.ScheduleEvent(EVENT_RAELENTALK, 2000);
break;
case EVENT_RAELENTALK:
if (Creature* realen = ObjectAccessor::GetCreature(*me, _realenGUID))
{
realen->AI()->Talk(SAY_RAELEN);
_events.ScheduleEvent(EVENT_TALKTORAELEN3, 5000);
}
break;
case EVENT_TALKTORAELEN3:
{
switch (_path)
{
case PATH_PEASENT_0:
me->PlayDirectSound(SOUND_PEASENT_LEAVING_1);
_events.ScheduleEvent(EVENT_PATHBACK, 2000);
break;
case PATH_PEASENT_1:
case PATH_PEASENT_3:
me->PlayDirectSound(SOUND_PEASENT_LEAVING_4);
_events.ScheduleEvent(EVENT_TALKTORAELEN4, 2000);
break;
case PATH_PEASENT_2:
me->PlayDirectSound(SOUND_PEASENT_LEAVING_3);
_events.ScheduleEvent(EVENT_PATHBACK, 2000);
break;
case PATH_PEASENT_4:
me->PlayDirectSound(SOUND_PEASENT_LEAVING_2);
_events.ScheduleEvent(EVENT_PATHBACK, 2000);
break;
}
}
break;
case EVENT_TALKTORAELEN4:
me->PlayDirectSound(SOUND_PEASENT_LEAVING_5);
_events.ScheduleEvent(EVENT_PATHBACK, 2000);
break;
case EVENT_PATHBACK:
if (Creature* realen = ObjectAccessor::GetCreature(*me, _realenGUID))
realen->AI()->SetData(1, 1);
me->GetMotionMaster()->MovePath(_path + 2, false);
break;
}
}
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
}
private:
EventMap _events;
ObjectGuid _realenGUID;
uint32 _path;
};
void AddSC_elwynn_forest()
{
RegisterCreatureAI(npc_cameron);
RegisterCreatureAI(npc_supervisor_raelen);
RegisterCreatureAI(npc_eastvale_peasent);
}