From 5854d17783fa33eb33f4cd476869e7ff1c99f68b Mon Sep 17 00:00:00 2001 From: Anubisss Date: Tue, 19 May 2009 23:48:48 +0200 Subject: *Merge SD2. *r973: Added support for quest 2767 *r974: Start MoveChase when boss reach phase 3. *r975: Added support for quest 863 - Skip this patch because its already scripted. Just use enum instead of #define *r976: Added support for quest 435 - Skip this patch because its already scripted. Just use enum instead of #define *977: Remove one needless grid search and use new functions for SetRun in one script. - Skip this patch because TrinityCore2 has use another way for it. --HG-- branch : trunk --- src/bindings/scripts/scripts/npc/npc_escortAI.cpp | 42 ++++-- .../scripts/scripts/zone/barrens/the_barrens.cpp | 47 ++++--- .../scripts/scripts/zone/feralas/feralas.cpp | 151 ++++++++++++++++++++- .../scripts/zone/onyxias_lair/boss_onyxia.cpp | 1 + .../zone/silverpine_forest/silverpine_forest.cpp | 42 +++--- 5 files changed, 232 insertions(+), 51 deletions(-) (limited to 'src') diff --git a/src/bindings/scripts/scripts/npc/npc_escortAI.cpp b/src/bindings/scripts/scripts/npc/npc_escortAI.cpp index 78f5ea850c1..ea2f641a9d4 100644 --- a/src/bindings/scripts/scripts/npc/npc_escortAI.cpp +++ b/src/bindings/scripts/scripts/npc/npc_escortAI.cpp @@ -31,9 +31,17 @@ void npc_escortAI::AttackStart(Unit *who) if (IsBeingEscorted && !Defend) return; - if ( m_creature->Attack(who, true) ) + if(m_creature->Attack(who, true) ) { - m_creature->GetMotionMaster()->MoveChase(who); + m_creature->AddThreat(who, 0.0f); + m_creature->SetInCombatWith(who); + who->SetInCombatWith(m_creature); + + if(CombatMovement) + { + m_creature->GetMotionMaster()->MovementExpired(); + m_creature->GetMotionMaster()->MoveChase(who); + } } } @@ -63,6 +71,7 @@ void npc_escortAI::JustRespawned() { IsBeingEscorted = false; IsOnHold = false; + CombatMovement = true; //Re-Enable questgiver flag m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); @@ -82,8 +91,12 @@ void npc_escortAI::EnterEvadeMode() debug_log("TSCR: EscortAI has left combat and is now returning to last point."); Returning = true; m_creature->GetMotionMaster()->MovementExpired(); - m_creature->GetMotionMaster()->MovePoint(WP_LAST_POINT, LastPos.x, LastPos.y, LastPos.z); + //if default is WAYPOINT_MOTION_TYPE, must MoveIdle to prevent from using + if(m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) + m_creature->GetMotionMaster()->MoveIdle(); + + m_creature->GetMotionMaster()->MovePoint(WP_LAST_POINT, LastPos.x, LastPos.y, LastPos.z); } else { @@ -224,15 +237,16 @@ void npc_escortAI::MovementInform(uint32 type, uint32 id) debug_log("TSCR: EscortAI has returned to original position before combat"); ReconnectWP = true; Returning = false; - WaitTimer = 1; + if(!WaitTimer) + WaitTimer = 1; } else { //Make sure that we are still on the right waypoint if (CurrentWP->id != id) { - debug_log("SD2 ERROR: EscortAI reached waypoint out of order %d, expected %d", id, CurrentWP->id); + debug_log("TSCR ERROR: EscortAI reached waypoint out of order %d, expected %d", id, CurrentWP->id); return; } @@ -294,30 +308,25 @@ void npc_escortAI::SetRun(bool bRun) if (bRun) { if (!bIsRunning) - { m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); - bIsRunning = true; - } else debug_log("TSCR: EscortAI attempt to set run mode, but is already running."); } else { if (bIsRunning) - { m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); - bIsRunning = false; - } else debug_log("TSCR: EscortAI attempt to set walk mode, but is already walking."); } + bIsRunning = bRun; } void npc_escortAI::Start(bool bAttack, bool bDefend, bool bRun, uint64 pGUID) { if (m_creature->isInCombat()) { - debug_log("SD2 ERROR: EscortAI attempt to Start while in combat"); + debug_log("TSCR ERROR: EscortAI attempt to Start while in combat"); return; } @@ -333,6 +342,13 @@ void npc_escortAI::Start(bool bAttack, bool bDefend, bool bRun, uint64 pGUID) return; } + if(m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) + { + m_creature->GetMotionMaster()->MovementExpired(); + m_creature->GetMotionMaster()->MoveIdle(); + debug_log("TSCR: EscortAI start with WAYPOINT_MOTION_TYPE, changed to MoveIdle."); + } + Attack = bAttack; Defend = bDefend; bIsRunning = bRun; @@ -362,6 +378,6 @@ void npc_escortAI::Start(bool bAttack, bool bDefend, bool bRun, uint64 pGUID) ReconnectWP = false; Returning = false; IsOnHold = false; - + CombatMovement = true; } diff --git a/src/bindings/scripts/scripts/zone/barrens/the_barrens.cpp b/src/bindings/scripts/scripts/zone/barrens/the_barrens.cpp index 53aa07d8d26..68b0c32600f 100644 --- a/src/bindings/scripts/scripts/zone/barrens/the_barrens.cpp +++ b/src/bindings/scripts/scripts/zone/barrens/the_barrens.cpp @@ -398,24 +398,33 @@ CreatureAI* GetAI_npc_twiggy_flathead(Creature *_Creature) ## npc_wizzlecrank_shredder #####*/ -#define SAY_PROGRESS_1 -1000272 -#define SAY_PROGRESS_2 -1000273 -#define SAY_PROGRESS_3 -1000274 +enum +{ + SAY_PROGRESS_1 = -1000272, + SAY_PROGRESS_2 = -1000273, + SAY_PROGRESS_3 = -1000274, -#define SAY_MERCENARY_4 -1000275 + SAY_MERCENARY_4 = -1000275, -#define SAY_PROGRESS_5 -1000276 -#define SAY_PROGRESS_6 -1000277 -#define SAY_PROGRESS_7 -1000278 -#define SAY_PROGRESS_8 -1000279 + SAY_PROGRESS_5 = -1000276, + SAY_PROGRESS_6 = -1000277, + SAY_PROGRESS_7 = -1000278, + SAY_PROGRESS_8 = -1000279, -#define QUEST_ESCAPE 863 -#define NPC_PILOT 3451 -#define MOB_MERCENARY 3282 + QUEST_ESCAPE = 863, + FACTION_RATCHET = 637, + NPC_PILOT = 3451, + MOB_MERCENARY = 3282, +}; struct TRINITY_DLL_DECL npc_wizzlecrank_shredderAI : public npc_escortAI { - npc_wizzlecrank_shredderAI(Creature* c) : npc_escortAI(c) {} + npc_wizzlecrank_shredderAI(Creature* c) : npc_escortAI(c) + { + uiNormFaction = c->getFaction(); + } + + uint32 uiNormFaction; bool Completed; @@ -450,8 +459,7 @@ struct TRINITY_DLL_DECL npc_wizzlecrank_shredderAI : public npc_escortAI case 31: m_creature->SummonCreature(NPC_PILOT, 1088.77, -2985.39, 91.84, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 300000); m_creature->setDeathState(JUST_DIED); Completed = true; - if (player && player->GetTypeId() == TYPEID_PLAYER) - ((Player*)player)->GroupEventHappens(QUEST_ESCAPE, m_creature); + player->GroupEventHappens(QUEST_ESCAPE, m_creature); break; } } @@ -460,7 +468,12 @@ struct TRINITY_DLL_DECL npc_wizzlecrank_shredderAI : public npc_escortAI { m_creature->setDeathState(ALIVE); Completed = false; - m_creature->setFaction(69); + if(!IsBeingEscorted) + { + m_creature->setFaction(uiNormFaction); + if (m_creature->getStandState() == UNIT_STAND_STATE_DEAD) + m_creature->SetStandState(UNIT_STAND_STATE_STAND); + } } void EnterCombat(Unit* who){} @@ -471,7 +484,7 @@ struct TRINITY_DLL_DECL npc_wizzlecrank_shredderAI : public npc_escortAI { Player* player = Unit::GetPlayer(PlayerGUID); if (player) - ((Player*)player)->FailQuest(QUEST_ESCAPE); + player->FailQuest(QUEST_ESCAPE); } } @@ -485,8 +498,8 @@ bool QuestAccept_npc_wizzlecrank_shredder(Player* player, Creature* creature, Qu { if (quest->GetQuestId() == QUEST_ESCAPE) { + creature->setFaction(FACTION_RATCHET); ((npc_escortAI*)(creature->AI()))->Start(true, true, false, player->GetGUID()); - creature->setFaction(113); } return true; } diff --git a/src/bindings/scripts/scripts/zone/feralas/feralas.cpp b/src/bindings/scripts/scripts/zone/feralas/feralas.cpp index ff30fc3f90c..e3b56c97051 100644 --- a/src/bindings/scripts/scripts/zone/feralas/feralas.cpp +++ b/src/bindings/scripts/scripts/zone/feralas/feralas.cpp @@ -17,11 +17,12 @@ /* ScriptData SDName: Feralas SD%Complete: 100 -SDComment: Quest support: 3520. Special vendor Gregan Brewspewer +SDComment: Quest support: 3520, 2767, Special vendor Gregan Brewspewer SDCategory: Feralas EndScriptData */ #include "precompiled.h" +#include "../../npc/npc_escortAI.h" /*###### ## npc_gregan_brewspewer @@ -53,6 +54,148 @@ bool GossipSelect_npc_gregan_brewspewer(Player *player, Creature *_Creature, uin return true; } +/*###### +## npc_oox22fe +######*/ + +enum +{ + SAY_START = -1060000, + SAY_AGGRO = -1060001, + SAY_AGGRO2 = -1060002, + SAY_AMBUSH = -1060003, + SAY_END = -1060005, + + NPC_YETI = 7848, + NPC_GORILLA = 5260, + NPC_WOODPAW_REAVER = 5255, + NPC_WOODPAW_BRUTE = 5253, + NPC_WOODPAW_ALPHA = 5258, + NPC_WOODPAW_MYSTIC = 5254, + + QUEST_RESCUE_OOX22FE = 2767, + FACTION_ESCORTEE_A = 774, + FACTION_ESCORTEE_H = 775 +}; + +struct TRINITY_DLL_DECL npc_oox22feAI : public npc_escortAI +{ + npc_oox22feAI(Creature* pCreature) : npc_escortAI(pCreature) + { + normFaction = pCreature->getFaction(); + } + + uint32 normFaction; + + void WaypointReached(uint32 i) + { + switch (i) + { + // First Ambush(3 Yetis) + case 11: + DoScriptText(SAY_AMBUSH,m_creature); + m_creature->SummonCreature(NPC_YETI, -4841.01, 1593.91, 73.42, 3.98, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); + m_creature->SummonCreature(NPC_YETI, -4837.61, 1568.58, 78.21, 3.13, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); + m_creature->SummonCreature(NPC_YETI, -4841.89, 1569.95, 76.53, 0.68, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); + break; + //Second Ambush(3 Gorillas) + case 21: + DoScriptText(SAY_AMBUSH,m_creature); + m_creature->SummonCreature(NPC_GORILLA, -4595.81, 2005.99, 53.08, 3.74, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); + m_creature->SummonCreature(NPC_GORILLA, -4597.53, 2008.31, 52.70, 3.78, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); + m_creature->SummonCreature(NPC_GORILLA, -4599.37, 2010.59, 52.77, 3.84, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); + break; + //Third Ambush(4 Gnolls) + case 30: + DoScriptText(SAY_AMBUSH,m_creature); + m_creature->SummonCreature(NPC_WOODPAW_REAVER, -4425.14, 2075.87, 47.77, 3.77, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); + m_creature->SummonCreature(NPC_WOODPAW_BRUTE , -4426.68, 2077.98, 47.57, 3.77, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); + m_creature->SummonCreature(NPC_WOODPAW_MYSTIC, -4428.33, 2080.24, 47.43, 3.87, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); + m_creature->SummonCreature(NPC_WOODPAW_ALPHA , -4430.04, 2075.54, 46.83, 3.81, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); + break; + case 37: + DoScriptText(SAY_END,m_creature); + // Award quest credit + if(Player* pPlayer = Unit::GetPlayer( PlayerGUID)) + { + pPlayer->GroupEventHappens(QUEST_RESCUE_OOX22FE, m_creature); + } + break; + } + } + + void Reset() + { + if (!IsBeingEscorted) + { + m_creature->setFaction(normFaction); + m_creature->SetStandState(UNIT_STAND_STATE_DEAD); + } + } + + void Aggro(Unit* who) + { + //For an small probability the npc says something when he get aggro + switch(rand()%10) + { + case 0: DoScriptText(SAY_AGGRO,m_creature); break; + case 1: DoScriptText(SAY_AGGRO2,m_creature); break; + } + } + + void JustSummoned(Creature* summoned) + { + summoned->AI()->AttackStart(m_creature); + } + + void JustDied(Unit* killer) + { + if (!IsBeingEscorted) + return; + + if(Player* pPlayer = Unit::GetPlayer(PlayerGUID)) + { + // If NPC dies, player fails the quest + if(pPlayer->GetQuestStatus(QUEST_RESCUE_OOX22FE) != QUEST_STATUS_COMPLETE) + pPlayer->FailQuest(QUEST_RESCUE_OOX22FE); + } + } + + void UpdateAI(const uint32 diff) + { + npc_escortAI::UpdateAI(diff); + } +}; + +CreatureAI* GetAI_npc_oox22fe(Creature* pCreature) +{ + npc_oox22feAI* oox22AI = new npc_oox22feAI(pCreature); + + oox22AI->FillPointMovementListForCreature(); + + return (CreatureAI*)oox22AI; +} + +bool QuestAccept_npc_oox22fe(Player* pPlayer, Creature* pCreature, const Quest* pQuest) +{ + if (pQuest->GetQuestId() == QUEST_RESCUE_OOX22FE) + { + DoScriptText(SAY_START, pCreature); + //change that the npc is not lying dead on the ground + pCreature->SetStandState(UNIT_STAND_STATE_STAND); + + if (pPlayer->GetTeam() == ALLIANCE) + pCreature->setFaction(FACTION_ESCORTEE_A); + + if (pPlayer->GetTeam() == HORDE) + pCreature->setFaction(FACTION_ESCORTEE_H); + + ((npc_escortAI*)(pCreature->AI()))->Start(true, true, false, pPlayer->GetGUID()); + + } + return true; +} + /*###### ## npc_screecher_spirit ######*/ @@ -80,6 +223,12 @@ void AddSC_feralas() newscript->pGossipSelect = &GossipSelect_npc_gregan_brewspewer; newscript->RegisterSelf(); + newscript = new Script; + newscript->Name = "npc_oox22fe"; + newscript->GetAI = &GetAI_npc_oox22fe; + newscript->pQuestAccept = &QuestAccept_npc_oox22fe; + newscript->RegisterSelf(); + newscript = new Script; newscript->Name="npc_screecher_spirit"; newscript->pGossipHello = &GossipHello_npc_screecher_spirit; diff --git a/src/bindings/scripts/scripts/zone/onyxias_lair/boss_onyxia.cpp b/src/bindings/scripts/scripts/zone/onyxias_lair/boss_onyxia.cpp index a969c85f38c..96885e7e672 100644 --- a/src/bindings/scripts/scripts/zone/onyxias_lair/boss_onyxia.cpp +++ b/src/bindings/scripts/scripts/zone/onyxias_lair/boss_onyxia.cpp @@ -141,6 +141,7 @@ struct TRINITY_DLL_DECL boss_onyxiaAI : public ScriptedAI DoStartMovement(m_creature->getVictim()); m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); DoScriptText(SAY_PHASE_3_TRANS, m_creature); + m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); } if(Phase == 1 || Phase == 3) diff --git a/src/bindings/scripts/scripts/zone/silverpine_forest/silverpine_forest.cpp b/src/bindings/scripts/scripts/zone/silverpine_forest/silverpine_forest.cpp index 3d61a6b0e87..55a65ac5d9b 100644 --- a/src/bindings/scripts/scripts/zone/silverpine_forest/silverpine_forest.cpp +++ b/src/bindings/scripts/scripts/zone/silverpine_forest/silverpine_forest.cpp @@ -91,24 +91,27 @@ bool GossipSelect_npc_astor_hadren(Player *player, Creature *_Creature, uint32 s ## npc_deathstalker_erland ######*/ -#define SAY_QUESTACCEPT -1000335 -#define SAY_START -1000336 -#define SAY_AGGRO_1 -1000337 -#define SAY_AGGRO_2 -1000338 -#define SAY_LAST -1000339 - -#define SAY_THANKS -1000340 -#define SAY_RANE -1000341 -#define SAY_ANSWER -1000342 -#define SAY_MOVE_QUINN -1000343 - -#define SAY_GREETINGS -1000344 -#define SAY_QUINN -1000345 -#define SAY_ON_BYE -1000346 - -#define QUEST_ESCORTING 435 -#define NPC_RANE 1950 -#define NPC_QUINN 1951 +enum +{ + SAY_QUESTACCEPT = -1000335, + SAY_START = -1000336, + SAY_AGGRO_1 = -1000337, + SAY_AGGRO_2 = -1000338, + SAY_LAST = -1000339, + + SAY_THANKS = -1000340, + SAY_RANE = -1000341, + SAY_ANSWER = -1000342, + SAY_MOVE_QUINN = -1000343, + + SAY_GREETINGS = -1000344, + SAY_QUINN = -1000345, + SAY_ON_BYE = -1000346, + + QUEST_ESCORTING = 435, + NPC_RANE = 1950, + NPC_QUINN = 1951 +}; struct TRINITY_DLL_DECL npc_deathstalker_erlandAI : public npc_escortAI { @@ -126,8 +129,7 @@ struct TRINITY_DLL_DECL npc_deathstalker_erlandAI : public npc_escortAI case 1: DoScriptText(SAY_START, m_creature, player);break; case 13: DoScriptText(SAY_LAST, m_creature, player); - if(player) - ((Player*)player)->GroupEventHappens(QUEST_ESCORTING, m_creature);break; + player->GroupEventHappens(QUEST_ESCORTING, m_creature);break; case 14: DoScriptText(SAY_THANKS, m_creature, player);break; case 15: { Unit* Rane = FindCreature(NPC_RANE, 20, m_creature); -- cgit v1.2.3