*Merge SD2.

*r1202: Added support for quest 12739(and 12742 to 12750). Patch by ckegg

*And merge a grid searcher from SD2.

--HG--
branch : trunk
This commit is contained in:
Anubisss
2009-07-12 01:17:04 +02:00
parent 692c927e75
commit 87213301e7
6 changed files with 604 additions and 2 deletions
@@ -742,3 +742,24 @@ void LoadOverridenDBCData()
}
}
}
Creature* GetClosestCreatureWithEntry(WorldObject* pSource, uint32 Entry, float MaxSearchRange)
{
Creature* pCreature = NULL;
CellPair pair(Trinity::ComputeCellPair(pSource->GetPositionX(), pSource->GetPositionY()));
Cell cell(pair);
cell.data.Part.reserved = ALL_DISTRICT;
cell.SetNoCreate();
Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck creature_check(*pSource, Entry, true, MaxSearchRange);
Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(pSource, pCreature, creature_check);
TypeContainerVisitor<Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck>, GridTypeMapContainer> creature_searcher(searcher);
CellLock<GridReadGuard> cell_lock(cell, pair);
cell_lock->Visit(cell_lock, creature_searcher,*(pSource->GetMap()));
return pCreature;
}
@@ -243,5 +243,11 @@ struct TRINITY_DLL_DECL BossAI : public ScriptedAI
void TeleportCheaters();
};
// SD2's grid searchers
//return closest creature alive in grid, with range from pSource
Creature* GetClosestCreatureWithEntry(WorldObject* pSource, uint32 Entry, float MaxSearchRange);
#endif
@@ -21,6 +21,463 @@
#define GCD_CAST 1
/*######
## npc_a_special_surprise
######*/
enum SpecialSurprise
{
SAY_EXEC_START_1 = -1609025, // speech for all
SAY_EXEC_START_2 = -1609026,
SAY_EXEC_START_3 = -1609027,
SAY_EXEC_PROG_1 = -1609028,
SAY_EXEC_PROG_2 = -1609029,
SAY_EXEC_PROG_3 = -1609030,
SAY_EXEC_PROG_4 = -1609031,
SAY_EXEC_PROG_5 = -1609032,
SAY_EXEC_PROG_6 = -1609033,
SAY_EXEC_PROG_7 = -1609034,
SAY_EXEC_NAME_1 = -1609035,
SAY_EXEC_NAME_2 = -1609036,
SAY_EXEC_RECOG_1 = -1609037,
SAY_EXEC_RECOG_2 = -1609038,
SAY_EXEC_RECOG_3 = -1609039,
SAY_EXEC_RECOG_4 = -1609040,
SAY_EXEC_RECOG_5 = -1609041,
SAY_EXEC_RECOG_6 = -1609042,
SAY_EXEC_NOREM_1 = -1609043,
SAY_EXEC_NOREM_2 = -1609044,
SAY_EXEC_NOREM_3 = -1609045,
SAY_EXEC_NOREM_4 = -1609046,
SAY_EXEC_NOREM_5 = -1609047,
SAY_EXEC_NOREM_6 = -1609048,
SAY_EXEC_NOREM_7 = -1609049,
SAY_EXEC_NOREM_8 = -1609050,
SAY_EXEC_NOREM_9 = -1609051,
SAY_EXEC_THINK_1 = -1609052,
SAY_EXEC_THINK_2 = -1609053,
SAY_EXEC_THINK_3 = -1609054,
SAY_EXEC_THINK_4 = -1609055,
SAY_EXEC_THINK_5 = -1609056,
SAY_EXEC_THINK_6 = -1609057,
SAY_EXEC_THINK_7 = -1609058,
SAY_EXEC_THINK_8 = -1609059,
SAY_EXEC_THINK_9 = -1609060,
SAY_EXEC_THINK_10 = -1609061,
SAY_EXEC_LISTEN_1 = -1609062,
SAY_EXEC_LISTEN_2 = -1609063,
SAY_EXEC_LISTEN_3 = -1609064,
SAY_EXEC_LISTEN_4 = -1609065,
SAY_PLAGUEFIST = -1609066,
SAY_EXEC_TIME_1 = -1609067,
SAY_EXEC_TIME_2 = -1609068,
SAY_EXEC_TIME_3 = -1609069,
SAY_EXEC_TIME_4 = -1609070,
SAY_EXEC_TIME_5 = -1609071,
SAY_EXEC_TIME_6 = -1609072,
SAY_EXEC_TIME_7 = -1609073,
SAY_EXEC_TIME_8 = -1609074,
SAY_EXEC_TIME_9 = -1609075,
SAY_EXEC_TIME_10 = -1609076,
SAY_EXEC_WAITING = -1609077,
EMOTE_DIES = -1609078,
NPC_PLAGUEFIST = 29053
};
struct TRINITY_DLL_DECL npc_a_special_surpriseAI : public ScriptedAI
{
npc_a_special_surpriseAI(Creature *pCreature) : ScriptedAI(pCreature) {}
uint32 ExecuteSpeech_Timer;
uint32 ExecuteSpeech_Counter;
uint64 PlayerGUID;
void Reset()
{
ExecuteSpeech_Timer = 0;
ExecuteSpeech_Counter = 0;
PlayerGUID = 0;
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
}
bool MeetQuestCondition(Unit* pPlayer)
{
switch(me->GetEntry())
{
case 29061: // Ellen Stanbridge
if (CAST_PLR(pPlayer)->GetQuestStatus(12742) == QUEST_STATUS_INCOMPLETE)
return true;
break;
case 29072: // Kug Ironjaw
if (CAST_PLR(pPlayer)->GetQuestStatus(12748) == QUEST_STATUS_INCOMPLETE)
return true;
break;
case 29067: // Donovan Pulfrost
if (CAST_PLR(pPlayer)->GetQuestStatus(12744) == QUEST_STATUS_INCOMPLETE)
return true;
break;
case 29065: // Yazmina Oakenthorn
if (CAST_PLR(pPlayer)->GetQuestStatus(12743) == QUEST_STATUS_INCOMPLETE)
return true;
break;
case 29071: // Antoine Brack
if (CAST_PLR(pPlayer)->GetQuestStatus(12750) == QUEST_STATUS_INCOMPLETE)
return true;
break;
case 29032: // Malar Bravehorn
if (CAST_PLR(pPlayer)->GetQuestStatus(12739) == QUEST_STATUS_INCOMPLETE)
return true;
break;
case 29068: // Goby Blastenheimer
if (CAST_PLR(pPlayer)->GetQuestStatus(12745) == QUEST_STATUS_INCOMPLETE)
return true;
break;
case 29073: // Iggy Darktusk
if (CAST_PLR(pPlayer)->GetQuestStatus(12749) == QUEST_STATUS_INCOMPLETE)
return true;
break;
case 29074: // Lady Eonys
if (CAST_PLR(pPlayer)->GetQuestStatus(12747) == QUEST_STATUS_INCOMPLETE)
return true;
break;
case 29070: // Valok the Righteous
if (CAST_PLR(pPlayer)->GetQuestStatus(12746) == QUEST_STATUS_INCOMPLETE)
return true;
break;
}
return false;
}
void MoveInLineOfSight(Unit* pWho)
{
if (PlayerGUID || pWho->GetTypeId() != TYPEID_PLAYER || !pWho->IsWithinDist(me, INTERACTION_DISTANCE))
return;
if (MeetQuestCondition(pWho))
PlayerGUID = pWho->GetGUID();
}
void UpdateAI(const uint32 diff)
{
if (PlayerGUID && !me->getVictim() && me->isAlive())
{
if (ExecuteSpeech_Timer < diff)
{
Player* pPlayer = Unit::GetPlayer(PlayerGUID);
if (!pPlayer)
{
Reset();
return;
}
//TODO: simplify text's selection
switch(pPlayer->getRace())
{
case RACE_HUMAN:
switch(ExecuteSpeech_Counter)
{
case 0: DoScriptText(SAY_EXEC_START_1, me, pPlayer); break;
case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break;
case 2: DoScriptText(SAY_EXEC_PROG_5, me, pPlayer); break;
case 3: DoScriptText(SAY_EXEC_NAME_1, me, pPlayer); break;
case 4: DoScriptText(SAY_EXEC_RECOG_1, me, pPlayer); break;
case 5: DoScriptText(SAY_EXEC_NOREM_5, me, pPlayer); break;
case 6: DoScriptText(SAY_EXEC_THINK_7, me, pPlayer); break;
case 7: DoScriptText(SAY_EXEC_LISTEN_1, me, pPlayer); break;
case 8:
if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f))
DoScriptText(SAY_PLAGUEFIST, Plaguefist, pPlayer);
break;
case 9:
DoScriptText(SAY_EXEC_TIME_6, me, pPlayer);
me->SetStandState(UNIT_STAND_STATE_KNEEL);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
break;
case 10: DoScriptText(SAY_EXEC_WAITING, me, pPlayer); break;
case 11:
DoScriptText(EMOTE_DIES, me);
me->setDeathState(JUST_DIED);
me->SetHealth(0);
return;
}
break;
case RACE_ORC:
switch(ExecuteSpeech_Counter)
{
case 0: DoScriptText(SAY_EXEC_START_1, me, pPlayer); break;
case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break;
case 2: DoScriptText(SAY_EXEC_PROG_6, me, pPlayer); break;
case 3: DoScriptText(SAY_EXEC_NAME_1, me, pPlayer); break;
case 4: DoScriptText(SAY_EXEC_RECOG_1, me, pPlayer); break;
case 5: DoScriptText(SAY_EXEC_NOREM_7, me, pPlayer); break;
case 6: DoScriptText(SAY_EXEC_THINK_8, me, pPlayer); break;
case 7: DoScriptText(SAY_EXEC_LISTEN_1, me, pPlayer); break;
case 8:
if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f))
DoScriptText(SAY_PLAGUEFIST, Plaguefist, pPlayer);
break;
case 9:
DoScriptText(SAY_EXEC_TIME_8, me, pPlayer);
me->SetStandState(UNIT_STAND_STATE_KNEEL);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
break;
case 10: DoScriptText(SAY_EXEC_WAITING, me, pPlayer); break;
case 11:
DoScriptText(EMOTE_DIES, me);
me->setDeathState(JUST_DIED);
me->SetHealth(0);
return;
}
break;
case RACE_DWARF:
switch(ExecuteSpeech_Counter)
{
case 0: DoScriptText(SAY_EXEC_START_2, me, pPlayer); break;
case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break;
case 2: DoScriptText(SAY_EXEC_PROG_2, me, pPlayer); break;
case 3: DoScriptText(SAY_EXEC_NAME_1, me, pPlayer); break;
case 4: DoScriptText(SAY_EXEC_RECOG_3, me, pPlayer); break;
case 5: DoScriptText(SAY_EXEC_NOREM_2, me, pPlayer); break;
case 6: DoScriptText(SAY_EXEC_THINK_5, me, pPlayer); break;
case 7: DoScriptText(SAY_EXEC_LISTEN_2, me, pPlayer); break;
case 8:
if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f))
DoScriptText(SAY_PLAGUEFIST, Plaguefist, pPlayer);
break;
case 9:
DoScriptText(SAY_EXEC_TIME_3, me, pPlayer);
me->SetStandState(UNIT_STAND_STATE_KNEEL);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
break;
case 10: DoScriptText(SAY_EXEC_WAITING, me, pPlayer); break;
case 11:
DoScriptText(EMOTE_DIES, me);
me->setDeathState(JUST_DIED);
me->SetHealth(0);
return;
}
break;
case RACE_NIGHTELF:
switch(ExecuteSpeech_Counter)
{
case 0: DoScriptText(SAY_EXEC_START_1, me, pPlayer); break;
case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break;
case 2: DoScriptText(SAY_EXEC_PROG_5, me, pPlayer); break;
case 3: DoScriptText(SAY_EXEC_NAME_1, me, pPlayer); break;
case 4: DoScriptText(SAY_EXEC_RECOG_1, me, pPlayer); break;
case 5: DoScriptText(SAY_EXEC_NOREM_6, me, pPlayer); break;
case 6: DoScriptText(SAY_EXEC_THINK_2, me, pPlayer); break;
case 7: DoScriptText(SAY_EXEC_LISTEN_1, me, pPlayer); break;
case 8:
if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f))
DoScriptText(SAY_PLAGUEFIST, Plaguefist, pPlayer);
break;
case 9:
DoScriptText(SAY_EXEC_TIME_7, me, pPlayer);
me->SetStandState(UNIT_STAND_STATE_KNEEL);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
break;
case 10: DoScriptText(SAY_EXEC_WAITING, me, pPlayer); break;
case 11:
DoScriptText(EMOTE_DIES, me);
me->setDeathState(JUST_DIED);
me->SetHealth(0);
return;
}
break;
case RACE_UNDEAD_PLAYER:
switch(ExecuteSpeech_Counter)
{
case 0: DoScriptText(SAY_EXEC_START_1, me, pPlayer); break;
case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break;
case 2: DoScriptText(SAY_EXEC_PROG_3, me, pPlayer); break;
case 3: DoScriptText(SAY_EXEC_NAME_1, me, pPlayer); break;
case 4: DoScriptText(SAY_EXEC_RECOG_4, me, pPlayer); break;
case 5: DoScriptText(SAY_EXEC_NOREM_3, me, pPlayer); break;
case 6: DoScriptText(SAY_EXEC_THINK_1, me, pPlayer); break;
case 7: DoScriptText(SAY_EXEC_LISTEN_3, me, pPlayer); break;
case 8:
if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f))
DoScriptText(SAY_PLAGUEFIST, Plaguefist, pPlayer);
break;
case 9:
DoScriptText(SAY_EXEC_TIME_4, me, pPlayer);
me->SetStandState(UNIT_STAND_STATE_KNEEL);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
break;
case 10: DoScriptText(SAY_EXEC_WAITING, me, pPlayer); break;
case 11:
DoScriptText(EMOTE_DIES, me);
me->setDeathState(JUST_DIED);
me->SetHealth(0);
return;
}
break;
case RACE_TAUREN:
switch(ExecuteSpeech_Counter)
{
case 0: DoScriptText(SAY_EXEC_START_1, me, pPlayer); break;
case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break;
case 2: DoScriptText(SAY_EXEC_PROG_1, me, pPlayer); break;
case 3: DoScriptText(SAY_EXEC_NAME_1, me, pPlayer); break;
case 4: DoScriptText(SAY_EXEC_RECOG_5, me, pPlayer); break;
case 5: DoScriptText(SAY_EXEC_NOREM_8, me, pPlayer); break;
case 6: DoScriptText(SAY_EXEC_THINK_9, me, pPlayer); break;
case 7: DoScriptText(SAY_EXEC_LISTEN_1, me, pPlayer); break;
case 8:
if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f))
DoScriptText(SAY_PLAGUEFIST, Plaguefist, pPlayer);
break;
case 9:
DoScriptText(SAY_EXEC_TIME_9, me, pPlayer);
me->SetStandState(UNIT_STAND_STATE_KNEEL);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
break;
case 10: DoScriptText(SAY_EXEC_WAITING, me, pPlayer); break;
case 11:
DoScriptText(EMOTE_DIES, me);
me->setDeathState(JUST_DIED);
me->SetHealth(0);
return;
}
break;
case RACE_GNOME:
switch(ExecuteSpeech_Counter)
{
case 0: DoScriptText(SAY_EXEC_START_1, me, pPlayer); break;
case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break;
case 2: DoScriptText(SAY_EXEC_PROG_4, me, pPlayer); break;
case 3: DoScriptText(SAY_EXEC_NAME_1, me, pPlayer); break;
case 4: DoScriptText(SAY_EXEC_RECOG_1, me, pPlayer); break;
case 5: DoScriptText(SAY_EXEC_NOREM_4, me, pPlayer); break;
case 6: DoScriptText(SAY_EXEC_THINK_6, me, pPlayer); break;
case 7: DoScriptText(SAY_EXEC_LISTEN_1, me, pPlayer); break;
case 8:
if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f))
DoScriptText(SAY_PLAGUEFIST, Plaguefist, pPlayer);
break;
case 9:
DoScriptText(SAY_EXEC_TIME_5, me, pPlayer);
me->SetStandState(UNIT_STAND_STATE_KNEEL);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
break;
case 10: DoScriptText(SAY_EXEC_WAITING, me, pPlayer); break;
case 11:
DoScriptText(EMOTE_DIES, me);
me->setDeathState(JUST_DIED);
me->SetHealth(0);
return;
}
break;
case RACE_TROLL:
switch(ExecuteSpeech_Counter)
{
case 0: DoScriptText(SAY_EXEC_START_3, me, pPlayer); break;
case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break;
case 2: DoScriptText(SAY_EXEC_PROG_7, me, pPlayer); break;
case 3: DoScriptText(SAY_EXEC_NAME_2, me, pPlayer); break;
case 4: DoScriptText(SAY_EXEC_RECOG_6, me, pPlayer); break;
case 5: DoScriptText(SAY_EXEC_NOREM_9, me, pPlayer); break;
case 6: DoScriptText(SAY_EXEC_THINK_10, me, pPlayer); break;
case 7: DoScriptText(SAY_EXEC_LISTEN_4, me, pPlayer); break;
case 8:
if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f))
DoScriptText(SAY_PLAGUEFIST, Plaguefist, pPlayer);
break;
case 9:
DoScriptText(SAY_EXEC_TIME_10, me, pPlayer);
me->SetStandState(UNIT_STAND_STATE_KNEEL);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
break;
case 10: DoScriptText(SAY_EXEC_WAITING, me, pPlayer); break;
case 11:
DoScriptText(EMOTE_DIES, me);
me->setDeathState(JUST_DIED);
me->SetHealth(0);
return;
}
break;
case RACE_BLOODELF:
switch(ExecuteSpeech_Counter)
{
case 0: DoScriptText(SAY_EXEC_START_1, me, pPlayer); break;
case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break;
case 2: DoScriptText(SAY_EXEC_PROG_1, me, pPlayer); break;
case 3: DoScriptText(SAY_EXEC_NAME_1, me, pPlayer); break;
case 4: DoScriptText(SAY_EXEC_RECOG_1, me, pPlayer); break;
//case 5: //unknown
case 6: DoScriptText(SAY_EXEC_THINK_3, me, pPlayer); break;
case 7: DoScriptText(SAY_EXEC_LISTEN_1, me, pPlayer); break;
case 8:
if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f))
DoScriptText(SAY_PLAGUEFIST, Plaguefist, pPlayer);
break;
case 9:
DoScriptText(SAY_EXEC_TIME_1, me, pPlayer);
me->SetStandState(UNIT_STAND_STATE_KNEEL);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
break;
case 10: DoScriptText(SAY_EXEC_WAITING, me, pPlayer); break;
case 11:
DoScriptText(EMOTE_DIES, me);
me->setDeathState(JUST_DIED);
me->SetHealth(0);
return;
}
break;
case RACE_DRAENEI:
switch(ExecuteSpeech_Counter)
{
case 0: DoScriptText(SAY_EXEC_START_1, me, pPlayer); break;
case 1: me->SetStandState(UNIT_STAND_STATE_STAND); break;
case 2: DoScriptText(SAY_EXEC_PROG_1, me, pPlayer); break;
case 3: DoScriptText(SAY_EXEC_NAME_1, me, pPlayer); break;
case 4: DoScriptText(SAY_EXEC_RECOG_2, me, pPlayer); break;
case 5: DoScriptText(SAY_EXEC_NOREM_1, me, pPlayer); break;
case 6: DoScriptText(SAY_EXEC_THINK_4, me, pPlayer); break;
case 7: DoScriptText(SAY_EXEC_LISTEN_1, me, pPlayer); break;
case 8:
if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f))
DoScriptText(SAY_PLAGUEFIST, Plaguefist, pPlayer);
break;
case 9:
DoScriptText(SAY_EXEC_TIME_2, me, pPlayer);
me->SetStandState(UNIT_STAND_STATE_KNEEL);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
break;
case 10: DoScriptText(SAY_EXEC_WAITING, me, pPlayer); break;
case 11:
DoScriptText(EMOTE_DIES, me);
me->setDeathState(JUST_DIED);
me->SetHealth(0);
return;
}
break;
}
if (ExecuteSpeech_Counter >= 9)
ExecuteSpeech_Timer = 15000;
else
ExecuteSpeech_Timer = 7000;
++ExecuteSpeech_Counter;
}
else
ExecuteSpeech_Timer -= diff;
}
}
};
CreatureAI* GetAI_npc_a_special_surprise(Creature* pCreature)
{
return new npc_a_special_surpriseAI(pCreature);
}
/*######
##Quest 12848
######*/
@@ -771,4 +1228,9 @@ void AddSC_the_scarlet_enclave()
newscript->Name="npc_dkc1_gothik";
newscript->GetAI = &GetAI_npc_dkc1_gothik;
newscript->RegisterSelf();
}
newscript = new Script;
newscript->Name = "npc_a_special_surprise";
newscript->GetAI = &GetAI_npc_a_special_surprise;
newscript->RegisterSelf();
}