fix(DB/Creature): Engineer "Spark" and Geezle (#4089)

This commit is contained in:
WiZZy
2021-01-02 19:45:04 +02:00
committed by GitHub
parent 91f9d611d1
commit 469d5a8bca
2 changed files with 99 additions and 273 deletions

View File

@@ -13,7 +13,6 @@ EndScriptData */
/* ContentData
npc_draenei_survivor
npc_engineer_spark_overgrind
npc_injured_draenei
npc_magwin
npc_geezle
@@ -157,104 +156,6 @@ public:
}
};
/*######
## npc_engineer_spark_overgrind
######*/
enum Overgrind
{
SAY_TEXT = 0,
SAY_EMOTE = 1,
ATTACK_YELL = 2,
AREA_COVE = 3579,
AREA_ISLE = 3639,
QUEST_GNOMERCY = 9537,
FACTION_HOSTILE = 14,
SPELL_DYNAMITE = 7978
};
class npc_engineer_spark_overgrind : public CreatureScript
{
public:
npc_engineer_spark_overgrind() : CreatureScript("npc_engineer_spark_overgrind") { }
struct npc_engineer_spark_overgrindAI : public ScriptedAI
{
npc_engineer_spark_overgrindAI(Creature* creature) : ScriptedAI(creature)
{
NormFaction = creature->getFaction();
NpcFlags = creature->GetUInt32Value(UNIT_NPC_FLAGS);
if (creature->GetAreaId() == AREA_COVE || creature->GetAreaId() == AREA_ISLE)
IsTreeEvent = true;
}
void Reset() override
{
DynamiteTimer = 8000;
EmoteTimer = urand(120000, 150000);
me->setFaction(NormFaction);
me->SetUInt32Value(UNIT_NPC_FLAGS, NpcFlags);
IsTreeEvent = false;
}
void EnterCombat(Unit* who) override
{
Talk(ATTACK_YELL, who);
}
void sGossipSelect(Player* player, uint32 /*sender*/, uint32 /*action*/) override
{
CloseGossipMenuFor(player);
me->setFaction(FACTION_HOSTILE);
me->Attack(player, true);
}
void UpdateAI(uint32 diff) override
{
if (!me->IsInCombat() && !IsTreeEvent)
{
if (EmoteTimer <= diff)
{
Talk(SAY_TEXT);
Talk(SAY_EMOTE);
EmoteTimer = urand(120000, 150000);
}
else EmoteTimer -= diff;
}
else if (IsTreeEvent)
return;
if (!UpdateVictim())
return;
if (DynamiteTimer <= diff)
{
DoCastVictim(SPELL_DYNAMITE);
DynamiteTimer = 8000;
}
else DynamiteTimer -= diff;
DoMeleeAttackIfReady();
}
private:
uint32 NormFaction;
uint32 NpcFlags;
uint32 DynamiteTimer;
uint32 EmoteTimer;
bool IsTreeEvent;
};
CreatureAI* GetAI(Creature* creature) const override
{
return new npc_engineer_spark_overgrindAI(creature);
}
};
/*######
## npc_injured_draenei
######*/
@@ -369,178 +270,6 @@ public:
}
};
/*######
## npc_geezle
######*/
enum Geezle
{
QUEST_TREES_COMPANY = 9531,
SPELL_TREE_DISGUISE = 30298,
GEEZLE_SAY_1 = 0,
SPARK_SAY_2 = 3,
SPARK_SAY_3 = 4,
GEEZLE_SAY_4 = 1,
SPARK_SAY_5 = 5,
SPARK_SAY_6 = 6,
GEEZLE_SAY_7 = 2,
EMOTE_SPARK = 7,
NPC_SPARK = 17243,
GO_NAGA_FLAG = 181694
};
Position const SparkPos = {-5029.91f, -11291.79f, 8.096f, 0.0f};
class npc_geezle : public CreatureScript
{
public:
npc_geezle() : CreatureScript("npc_geezle") { }
struct npc_geezleAI : public ScriptedAI
{
npc_geezleAI(Creature* creature) : ScriptedAI(creature) { }
uint64 SparkGUID;
uint8 Step;
uint32 SayTimer;
bool EventStarted;
void Reset() override
{
SparkGUID = 0;
Step = 0;
StartEvent();
}
void EnterCombat(Unit* /*who*/) override { }
void StartEvent()
{
Step = 0;
EventStarted = true;
if (Creature* Spark = me->SummonCreature(NPC_SPARK, SparkPos, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 150000))
{
SparkGUID = Spark->GetGUID();
Spark->setActive(true);
Spark->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
}
SayTimer = 8000;
}
uint32 NextStep(uint8 Step)
{
Creature* Spark = ObjectAccessor::GetCreature(*me, SparkGUID);
if (!Spark)
{
me->DespawnOrUnsummon(1);
return 5000;
}
switch (Step)
{
case 0:
Spark->GetMotionMaster()->MovePoint(0, -5080.70f, -11253.61f, 0.56f);
me->GetMotionMaster()->MovePoint(0, -5092.26f, -11252, 0.71f);
return 9000;
case 1:
DespawnNagaFlag(true);
Spark->AI()->Talk(EMOTE_SPARK);
return 1000;
case 2:
Talk(GEEZLE_SAY_1, Spark);
Spark->SetInFront(me);
me->SetInFront(Spark);
return 5000;
case 3:
Spark->AI()->Talk(SPARK_SAY_2);
return 7000;
case 4:
Spark->AI()->Talk(SPARK_SAY_3);
return 8000;
case 5:
Talk(GEEZLE_SAY_4, Spark);
return 8000;
case 6:
Spark->AI()->Talk(SPARK_SAY_5);
return 9000;
case 7:
Spark->AI()->Talk(SPARK_SAY_6);
return 8000;
case 8:
Talk(GEEZLE_SAY_7, Spark);
return 2000;
case 9:
me->GetMotionMaster()->MoveTargetedHome();
Spark->GetMotionMaster()->MovePoint(0, SparkPos);
CompleteQuest();
return 9000;
case 10:
Spark->DespawnOrUnsummon(1);
DespawnNagaFlag(false);
me->DespawnOrUnsummon(1);
return 5000;
default:
return 99999999;
}
}
// will complete Tree's company quest for all nearby players that are disguised as trees
void CompleteQuest()
{
float radius = 50.0f;
std::list<Player*> players;
acore::AnyPlayerInObjectRangeCheck checker(me, radius);
acore::PlayerListSearcher<acore::AnyPlayerInObjectRangeCheck> searcher(me, players, checker);
me->VisitNearbyWorldObject(radius, searcher);
for (std::list<Player*>::const_iterator itr = players.begin(); itr != players.end(); ++itr)
if ((*itr)->GetQuestStatus(QUEST_TREES_COMPANY) == QUEST_STATUS_INCOMPLETE && (*itr)->HasAura(SPELL_TREE_DISGUISE))
(*itr)->KilledMonsterCredit(NPC_SPARK, 0);
}
void DespawnNagaFlag(bool despawn)
{
std::list<GameObject*> FlagList;
me->GetGameObjectListWithEntryInGrid(FlagList, GO_NAGA_FLAG, 100.0f);
if (!FlagList.empty())
{
for (std::list<GameObject*>::const_iterator itr = FlagList.begin(); itr != FlagList.end(); ++itr)
{
if (despawn)
(*itr)->SetLootState(GO_JUST_DEACTIVATED);
else
(*itr)->Respawn();
}
}
//else
// TC_LOG_ERROR("scripts", "SD2 ERROR: FlagList is empty!");
}
void UpdateAI(uint32 diff) override
{
if (SayTimer <= diff)
{
if (EventStarted)
SayTimer = NextStep(Step++);
}
else
SayTimer -= diff;
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return new npc_geezleAI(creature);
}
};
enum RavegerCage
{
NPC_DEATH_RAVAGER = 17556,
@@ -730,10 +459,8 @@ public:
void AddSC_azuremyst_isle()
{
new npc_draenei_survivor();
new npc_engineer_spark_overgrind();
new npc_injured_draenei();
new npc_magwin();
new npc_geezle();
new npc_death_ravager();
new go_ravager_cage();
new npc_stillpine_capitive();