mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-30 00:53:46 +00:00
fix(DB/Creature): Engineer "Spark" and Geezle (#4089)
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user