diff options
-rw-r--r-- | sql/FULL/world_script_texts.sql | 35 | ||||
-rw-r--r-- | sql/FULL/world_scripts_full.sql | 2 | ||||
-rw-r--r-- | sql/updates/5216_world_scripts.sql | 38 | ||||
-rw-r--r-- | src/bindings/scripts/base/follower_ai.cpp | 40 | ||||
-rw-r--r-- | src/bindings/scripts/base/follower_ai.h | 4 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/eastern_kingdoms/wetlands.cpp | 7 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/kalimdor/darkshore.cpp | 206 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/kalimdor/tanaris.cpp | 165 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/kalimdor/teldrassil.cpp | 13 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/kalimdor/ungoro_crater.cpp | 167 |
10 files changed, 405 insertions, 272 deletions
diff --git a/sql/FULL/world_script_texts.sql b/sql/FULL/world_script_texts.sql index b82e98d7b97..c7b8b9e6728 100644 --- a/sql/FULL/world_script_texts.sql +++ b/sql/FULL/world_script_texts.sql @@ -1,4 +1,4 @@ --- Up to TC2 4748 +-- Up to TC2 4748 -- -- trinityscript_script_texts.sql Contains data for table `script_texts` mainly used in C++ parts. -- valid entries for table are between -1000000 and -1999999 @@ -358,10 +358,35 @@ INSERT INTO `script_texts` (`entry`, `content_default`, `content_loc1`, `content (-1000413,'I apologize for taking so long to get here. I wanted Lady Proudmoore to be present also.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 7, 0,'hendel SAY_PROGRESS_3_TER'), (-1000414,'We can only stay a few moments before returning to the tower. If you wish to speak to us more you may find us there.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 7, 0,'hendel SAY_PROGRESS_4_TER'), (-1000415,'%s, too injured, gives up the chase.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2, 0, 0,'hendel EMOTE_SURRENDER'), -(-1000416,'REUSE', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'REUSE'), -(-1000417,'REUSE', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'REUSE'), -(-1000418,'REUSE', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'REUSE'), -(-1000419,'REUSE', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'REUSE'); +(-1000416,'Well, I\'m not sure how far I\'ll make it in this state... I\'m feeling kind of faint...', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'ringo SAY_RIN_START_1'), +(-1000417,'Remember, if I faint again, the water that Spraggle gave you will revive me.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'ringo SAY_RIN_START_2'), +(-1000418,'The heat... I can\'t take it...', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'ringo SAY_FAINT_1'), +(-1000419,'Maybe... you could carry me?', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'ringo SAY_FAINT_2'), +(-1000420,'Uuuuuuggggghhhhh....', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'ringo SAY_FAINT_3'), +(-1000421,'I\'m not feeling so well...', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'ringo SAY_FAINT_4'), +(-1000422,'Where... Where am I?', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'ringo SAY_WAKE_1'), +(-1000423,'I am feeling a little better now, thank you.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'ringo SAY_WAKE_2'), +(-1000424,'Yes, I must go on.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'ringo SAY_WAKE_3'), +(-1000425,'How am I feeling? Quite soaked, thank you.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'ringo SAY_WAKE_4'), +(-1000426,'Spraggle! I didn\'t think I\'d make it back!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'ringo SAY_RIN_END_1'), +(-1000427,'Ringo! You\'re okay!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'ringo SAY_SPR_END_2'), +(-1000428,'Oh... I\'m feeling faint...', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'ringo SAY_RIN_END_3'), +(-1000429,'%s collapses onto the ground.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,2,0,0,'ringo EMOTE_RIN_END_4'), +(-1000430,'%s stands up after a short pause.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,2,0,0,'ringo EMOTE_RIN_END_5'), +(-1000431,'Ugh.',0,0,0,0,'ringo SAY_RIN_END_6'), +(-1000432,'Ringo? Wake up! Don\'t worry, I\'ll take care of you.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'ringo SAY_SPR_END_7'), +(-1000433,'%s fades away after a long pause.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,2,0,0,'ringo EMOTE_RIN_END_8'), +(-1000434,'Liladris has been waiting for me at Maestra\'s Post, so we should make haste, $N.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'kerlonian SAY_KER_START'), +(-1000435,'%s looks very sleepy...', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,2,0,0,'kerlonian EMOTE_KER_SLEEP_1'), +(-1000436,'%s suddenly falls asleep', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,2,0,0,'kerlonian EMOTE_KER_SLEEP_2'), +(-1000437,'%s begins to drift off...', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,2,0,0,'kerlonian EMOTE_KER_SLEEP_3'), +(-1000438,'This looks like the perfect place for a nap...', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'kerlonian SAY_KER_SLEEP_1'), +(-1000439,'Yaaaaawwwwwnnnn...', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'kerlonian SAY_KER_SLEEP_2'), +(-1000440,'Oh, I am so tired...', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'kerlonian SAY_KER_SLEEP_3'), +(-1000441,'You don\'t mind if I stop here for a moment, do you?', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'kerlonian SAY_KER_SLEEP_4'), +(-1000442,'Be on the alert! The Blackwood furbolgs are numerous in the area...', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'kerlonian SAY_KER_ALERT_1'), +(-1000443,'It\'s quiet... Too quiet...', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'kerlonian SAY_KER_ALERT_2'), +(-1000444,'Oh, I can see Liladris from here... Tell her I\'m here, won\'t you?', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,0,0,0,0,'kerlonian SAY_KER_END'); -- -1 033 000 SHADOWFANG KEEP INSERT INTO `script_texts` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`, `sound`, `type`, `language`, `emote`, `comment`) VALUES diff --git a/sql/FULL/world_scripts_full.sql b/sql/FULL/world_scripts_full.sql index 3e0197e4888..be0e1a597c0 100644 --- a/sql/FULL/world_scripts_full.sql +++ b/sql/FULL/world_scripts_full.sql @@ -417,6 +417,7 @@ UPDATE `creature_template` SET `ScriptName`='mob_toxic_sporebat' WHERE `entry`=2 UPDATE `creature_template` SET `ScriptName`='mob_shield_generator_channel' WHERE `entry`=19870; /* DARKSHORE */ +UPDATE `creature_template` SET `ScriptName`='npc_kerlonian' WHERE `entry`=11218; UPDATE `creature_template` SET `ScriptName`='npc_threshwackonator' WHERE `entry`=6669; UPDATE `creature_template` SET `ScriptName`='npc_prospector_remtravel' WHERE `entry`=2917; @@ -1058,6 +1059,7 @@ UPDATE `creature_template` SET `ScriptName` = 'boss_xt002' WHERE `entry` = 33293 /* UN'GORO CRATER */ UPDATE `creature_template` SET `ScriptName`='npc_ame' WHERE `entry`=9623; +UPDATE `creature_template` SET `ScriptName`='npc_ringo' WHERE `entry`=9999; /* UNDERCITY */ UPDATE `creature_template` SET `ScriptName`='npc_lady_sylvanas_windrunner' WHERE `entry`=10181; diff --git a/sql/updates/5216_world_scripts.sql b/sql/updates/5216_world_scripts.sql new file mode 100644 index 00000000000..2fb3f58491c --- /dev/null +++ b/sql/updates/5216_world_scripts.sql @@ -0,0 +1,38 @@ +UPDATE creature_template SET ScriptName='npc_ringo' WHERE entry=9999; +UPDATE creature_template SET ScriptName='npc_kerlonian' WHERE entry=11218; + +UPDATE script_texts SET content_default='Well, I\'m not sure how far I\'ll make it in this state... I\'m feeling kind of faint...', comment='ringo SAY_RIN_START_1' WHERE entry=-1000416; +UPDATE script_texts SET content_default='Remember, if I faint again, the water that Spraggle gave you will revive me.', comment='ringo SAY_RIN_START_2' WHERE entry=-1000417; +UPDATE script_texts SET content_default='The heat... I can\'t take it...', comment='ringo SAY_FAINT_1' WHERE entry=-1000418; +UPDATE script_texts SET content_default='Maybe... you could carry me?', comment='ringo SAY_FAINT_2' WHERE entry=-1000419; + +DELETE FROM script_texts WHERE entry BETWEEN -1000433 AND -1000420; +INSERT INTO script_texts (entry,content_default,sound,type,language,emote,comment) VALUES +(-1000420,'Uuuuuuggggghhhhh....',0,0,0,0,'ringo SAY_FAINT_3'), +(-1000421,'I\'m not feeling so well...',0,0,0,0,'ringo SAY_FAINT_4'), +(-1000422,'Where... Where am I?',0,0,0,0,'ringo SAY_WAKE_1'), +(-1000423,'I am feeling a little better now, thank you.',0,0,0,0,'ringo SAY_WAKE_2'), +(-1000424,'Yes, I must go on.',0,0,0,0,'ringo SAY_WAKE_3'), +(-1000425,'How am I feeling? Quite soaked, thank you.',0,0,0,0,'ringo SAY_WAKE_4'), +(-1000426,'Spraggle! I didn\'t think I\'d make it back!',0,0,0,0,'ringo SAY_RIN_END_1'), +(-1000427,'Ringo! You\'re okay!',0,0,0,0,'ringo SAY_SPR_END_2'), +(-1000428,'Oh... I\'m feeling faint...',0,0,0,0,'ringo SAY_RIN_END_3'), +(-1000429,'%s collapses onto the ground.',0,2,0,0,'ringo EMOTE_RIN_END_4'), +(-1000430,'%s stands up after a short pause.',0,2,0,0,'ringo EMOTE_RIN_END_5'), +(-1000431,'Ugh.',0,0,0,0,'ringo SAY_RIN_END_6'), +(-1000432,'Ringo? Wake up! Don\'t worry, I\'ll take care of you.',0,0,0,0,'ringo SAY_SPR_END_7'), +(-1000433,'%s fades away after a long pause.',0,2,0,0,'ringo EMOTE_RIN_END_8'); + +DELETE FROM script_texts WHERE entry BETWEEN -1000444 AND -1000434; +INSERT INTO script_texts (entry,content_default,sound,type,language,emote,comment) VALUES +(-1000434,'Liladris has been waiting for me at Maestra\'s Post, so we should make haste, $N.',0,0,0,0,'kerlonian SAY_KER_START'), +(-1000435,'%s looks very sleepy...',0,2,0,0,'kerlonian EMOTE_KER_SLEEP_1'), +(-1000436,'%s suddenly falls asleep',0,2,0,0,'kerlonian EMOTE_KER_SLEEP_2'), +(-1000437,'%s begins to drift off...',0,2,0,0,'kerlonian EMOTE_KER_SLEEP_3'), +(-1000438,'This looks like the perfect place for a nap...',0,0,0,0,'kerlonian SAY_KER_SLEEP_1'), +(-1000439,'Yaaaaawwwwwnnnn...',0,0,0,0,'kerlonian SAY_KER_SLEEP_2'), +(-1000440,'Oh, I am so tired...',0,0,0,0,'kerlonian SAY_KER_SLEEP_3'), +(-1000441,'You don\'t mind if I stop here for a moment, do you?',0,0,0,0,'kerlonian SAY_KER_SLEEP_4'), +(-1000442,'Be on the alert! The Blackwood furbolgs are numerous in the area...',0,0,0,0,'kerlonian SAY_KER_ALERT_1'), +(-1000443,'It\'s quiet... Too quiet...',0,0,0,0,'kerlonian SAY_KER_ALERT_2'), +(-1000444,'Oh, I can see Liladris from here... Tell her I\'m here, won\'t you?',0,0,0,0,'kerlonian SAY_KER_END'); diff --git a/src/bindings/scripts/base/follower_ai.cpp b/src/bindings/scripts/base/follower_ai.cpp index a7248d10636..b44b22a31be 100644 --- a/src/bindings/scripts/base/follower_ai.cpp +++ b/src/bindings/scripts/base/follower_ai.cpp @@ -25,7 +25,8 @@ FollowerAI::FollowerAI(Creature* pCreature) : ScriptedAI(pCreature), m_uiUpdateFollowTimer(2500), m_bIsFollowing(false), m_bIsReturnToLeader(false), - m_bIsFollowComplete(false) + m_bIsFollowComplete(false), + m_bIsEndEvent(false) {} void FollowerAI::AttackStart(Unit* pWho) @@ -120,6 +121,7 @@ void FollowerAI::JustRespawned() m_bIsFollowing = false; m_bIsReturnToLeader = false; m_bIsFollowComplete = false; + m_bIsEndEvent = false; if (!IsCombatMovement()) SetCombatMovement(true); @@ -139,7 +141,7 @@ void FollowerAI::EnterEvadeMode() if (m_bIsFollowing) { - debug_log("SD2: FollowerAI left combat, returning to CombatStartPosition."); + debug_log("TSCR: FollowerAI left combat, returning to CombatStartPosition."); if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == TARGETED_MOTION_TYPE) { @@ -163,9 +165,9 @@ void FollowerAI::UpdateAI(const uint32 uiDiff) { if (m_uiUpdateFollowTimer < uiDiff) { - if (m_bIsFollowComplete) + if (m_bIsFollowComplete && !m_bIsEndEvent) { - debug_log("SD2: FollowerAI is set completed, despawns."); + debug_log("TSCR: FollowerAI is set completed, despawns."); m_creature->ForcedDespawn(); return; } @@ -176,7 +178,7 @@ void FollowerAI::UpdateAI(const uint32 uiDiff) { if (m_bIsReturnToLeader) { - debug_log("SD2: FollowerAI is returning to leader."); + debug_log("TSCR: FollowerAI is returning to leader."); m_creature->GetMotionMaster()->MoveFollow(pPlayer, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); m_bIsReturnToLeader = false; return; @@ -204,7 +206,7 @@ void FollowerAI::UpdateAI(const uint32 uiDiff) if (bIsMaxRangeExceeded) { - debug_log("SD2: FollowerAI failed because player/group was to far away or not found"); + debug_log("TSCR: FollowerAI failed because player/group was to far away or not found"); m_creature->ForcedDespawn(); return; } @@ -244,13 +246,13 @@ void FollowerAI::StartFollow(Player* pLeader, uint32 uiFactionForFollower, const { if (m_creature->getVictim()) { - debug_log("SD2: FollowerAI attempt to StartFollow while in combat."); + debug_log("TSCR: FollowerAI attempt to StartFollow while in combat."); return; } if (m_bIsFollowing) { - error_log("SD2: FollowerAI attempt to StartFollow while already following."); + error_log("TSCR: FollowerAI attempt to StartFollow while already following."); return; } @@ -266,7 +268,7 @@ void FollowerAI::StartFollow(Player* pLeader, uint32 uiFactionForFollower, const { m_creature->GetMotionMaster()->Clear(); m_creature->GetMotionMaster()->MoveIdle(); - debug_log("SD2: FollowerAI start with WAYPOINT_MOTION_TYPE, set to MoveIdle."); + debug_log("TSCR: FollowerAI start with WAYPOINT_MOTION_TYPE, set to MoveIdle."); } m_creature->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); @@ -275,7 +277,7 @@ void FollowerAI::StartFollow(Player* pLeader, uint32 uiFactionForFollower, const m_bIsFollowing = true; - debug_log("SD2: FollowerAI start follow %s (GUID %u)", pLeader->GetName(), m_uiLeaderGUID); + debug_log("TSCR: FollowerAI start follow %s (GUID %u)", pLeader->GetName(), m_uiLeaderGUID); } Player* FollowerAI::GetLeaderForFollower() @@ -294,7 +296,7 @@ Player* FollowerAI::GetLeaderForFollower() if (pMember && pMember->isAlive() && m_creature->IsWithinDistInMap(pMember, MAX_PLAYER_DISTANCE)) { - debug_log("SD2: FollowerAI GetLeader changed and returned new leader."); + debug_log("TSCR: FollowerAI GetLeader changed and returned new leader."); m_uiLeaderGUID = pMember->GetGUID(); return pMember; break; @@ -304,6 +306,20 @@ Player* FollowerAI::GetLeaderForFollower() } } - debug_log("SD2: FollowerAI GetLeader can not find suitable leader."); + debug_log("TSCR: FollowerAI GetLeader can not find suitable leader."); return NULL; } + +void FollowerAI::SetFollowComplete(bool bWithEndEvent) +{ + if (m_creature->hasUnitState(UNIT_STAT_FOLLOW)) + { + m_creature->clearUnitState(UNIT_STAT_FOLLOW); + + m_creature->GetMotionMaster()->MovementExpired(); + m_creature->GetMotionMaster()->MoveIdle(); + } + + m_bIsEndEvent = bWithEndEvent; + m_bIsFollowComplete = true; +} diff --git a/src/bindings/scripts/base/follower_ai.h b/src/bindings/scripts/base/follower_ai.h index d62980d4951..10ec5c9061e 100644 --- a/src/bindings/scripts/base/follower_ai.h +++ b/src/bindings/scripts/base/follower_ai.h @@ -31,8 +31,9 @@ class TRINITY_DLL_DECL FollowerAI : public ScriptedAI void StartFollow(Player* pPlayer, uint32 uiFactionForFollower = 0, const Quest* pQuest = NULL); protected: - void SetFollowComplete() { m_bIsFollowComplete = true; } + void SetFollowComplete(bool bWithEndEvent = false); bool IsFollowComplete() { return m_bIsFollowComplete; } + bool IsEndEventInProgress() { return m_bIsEndEvent; } Player* GetLeaderForFollower(); @@ -43,6 +44,7 @@ class TRINITY_DLL_DECL FollowerAI : public ScriptedAI bool m_bIsFollowing; bool m_bIsReturnToLeader; bool m_bIsFollowComplete; + bool m_bIsEndEvent; const Quest* m_pQuestForFollow; //normally we have a quest }; diff --git a/src/bindings/scripts/scripts/eastern_kingdoms/wetlands.cpp b/src/bindings/scripts/scripts/eastern_kingdoms/wetlands.cpp index 3568c7e555b..94cf73bebeb 100644 --- a/src/bindings/scripts/scripts/eastern_kingdoms/wetlands.cpp +++ b/src/bindings/scripts/scripts/eastern_kingdoms/wetlands.cpp @@ -38,6 +38,7 @@ enum QUEST_MISSING_DIPLO_PT11 = 1249, FACTION_ENEMY = 168, SPELL_STEALTH = 1785, + SPELL_CALL_FRIENDS = 16457, //summons 1x friend NPC_SLIMS_FRIEND = 4971, NPC_TAPOKE_SLIM_JAHN = 4962 }; @@ -74,9 +75,9 @@ struct TRINITY_DLL_DECL npc_tapoke_slim_jahnAI : public npc_escortAI if (IsBeingEscorted && !m_bFriendSummoned && pPlayer) { - m_creature->SummonCreature(NPC_SLIMS_FRIEND, 0.0f, 0.0f, 0.0f, 3.10f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - m_creature->SummonCreature(NPC_SLIMS_FRIEND, 0.0f, 0.0f, 0.0f, 2.35f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - m_creature->SummonCreature(NPC_SLIMS_FRIEND, 0.0f, 0.0f, 0.0f, 2.02f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + for(uint8 i = 0; i < 3; ++i) + m_creature->CastSpell(m_creature, SPELL_CALL_FRIENDS, true); + m_bFriendSummoned = true; } } diff --git a/src/bindings/scripts/scripts/kalimdor/darkshore.cpp b/src/bindings/scripts/scripts/kalimdor/darkshore.cpp index 8ff16a53832..a283d2160f0 100644 --- a/src/bindings/scripts/scripts/kalimdor/darkshore.cpp +++ b/src/bindings/scripts/scripts/kalimdor/darkshore.cpp @@ -17,17 +17,98 @@ /* ScriptData SDName: Darkshore SD%Complete: 100 -SDComment: Quest support: 731, 2078 +SDComment: Quest support: 731, 2078, 5321 SDCategory: Darkshore EndScriptData */ /* ContentData +npc_kerlonian npc_prospector_remtravel npc_threshwackonator EndContentData */ #include "precompiled.h" #include "escort_ai.h" +#include "follower_ai.h" + +/*#### +# npc_kerlonian +####*/ + +enum +{ + SAY_KER_START = -1000434, + + EMOTE_KER_SLEEP_1 = -1000435, + EMOTE_KER_SLEEP_2 = -1000436, + EMOTE_KER_SLEEP_3 = -1000437, + + SAY_KER_SLEEP_1 = -1000438, + SAY_KER_SLEEP_2 = -1000439, + SAY_KER_SLEEP_3 = -1000440, + SAY_KER_SLEEP_4 = -1000441, + + SAY_KER_ALERT_1 = -1000442, + SAY_KER_ALERT_2 = -1000443, + + SAY_KER_END = -1000444, + + SPELL_AWAKEN = 17536, + QUEST_SLEEPER_AWAKENED = 5321, + NPC_LILADRIS = 11219, //attackers entries unknown + FACTION_KER_ESCORTEE = 113 +}; + +//TODO: make concept similar as "ringo" -escort. Find a way to run the scripted attacks, _if_ player are choosing road. +struct TRINITY_DLL_DECL npc_kerlonianAI : public FollowerAI +{ + npc_kerlonianAI(Creature* pCreature) : FollowerAI(pCreature) { } + + void Reset() + { + } + + void MoveInLineOfSight(Unit *pWho) + { + FollowerAI::MoveInLineOfSight(pWho); + + if (!m_creature->getVictim() && !IsFollowComplete() && pWho->GetEntry() == NPC_LILADRIS) + { + if (m_creature->IsWithinDistInMap(pWho, INTERACTION_DISTANCE*2)) + { + if (Player* pPlayer = GetLeaderForFollower()) + { + if (pPlayer->GetQuestStatus(QUEST_SLEEPER_AWAKENED) == QUEST_STATUS_INCOMPLETE) + pPlayer->GroupEventHappens(QUEST_SLEEPER_AWAKENED, m_creature); + + DoScriptText(SAY_KER_END, m_creature); + } + + SetFollowComplete(); + } + } + } +}; + +CreatureAI* GetAI_npc_kerlonian(Creature* pCreature) +{ + return new npc_kerlonianAI(pCreature); +} + +bool QuestAccept_npc_kerlonian(Player* pPlayer, Creature* pCreature, const Quest* pQuest) +{ + if (pQuest->GetQuestId() == QUEST_SLEEPER_AWAKENED) + { + if (npc_kerlonianAI* pKerlonianAI = CAST_AI(npc_kerlonianAI, pCreature->AI())) + { + pCreature->SetStandState(UNIT_STAND_STATE_STAND); + DoScriptText(SAY_KER_START, pCreature); + pKerlonianAI->StartFollow(pPlayer, FACTION_KER_ESCORTEE, pQuest); + } + } + + return true; +} /*#### # npc_prospector_remtravel @@ -171,124 +252,34 @@ enum #define GOSSIP_ITEM_INSERT_KEY "[PH] Insert key" -struct TRINITY_DLL_DECL npc_threshwackonatorAI : public ScriptedAI +struct TRINITY_DLL_DECL npc_threshwackonatorAI : public FollowerAI { - npc_threshwackonatorAI(Creature* pCreature) : ScriptedAI(pCreature) - { - Faction = pCreature->getFaction(); - NpcFlags = pCreature->GetUInt32Value(UNIT_NPC_FLAGS); - PlayerGUID = 0; - } + npc_threshwackonatorAI(Creature* pCreature) : FollowerAI(pCreature) { } - uint64 PlayerGUID; - uint32 Faction; - uint32 NpcFlags; - uint32 CheckPlayerTimer; + void Reset() { } - void Reset() + void MoveInLineOfSight(Unit* pWho) { - CheckPlayerTimer = 2500; + FollowerAI::MoveInLineOfSight(pWho); - if (!PlayerGUID) + if (!m_creature->getVictim() && !IsFollowComplete() && pWho->GetEntry() == NPC_GELKAK) { - me->setFaction(Faction); - me->SetUInt32Value(UNIT_NPC_FLAGS, NpcFlags); - } - } - - void MoveInLineOfSight(Unit* who) - { - if (who->GetEntry() == NPC_GELKAK) - { - if (PlayerGUID && me->IsWithinDistInMap(who, 10.0f)) + if (m_creature->IsWithinDistInMap(pWho, 10.0f)) { - DoScriptText(SAY_AT_CLOSE, who); + DoScriptText(SAY_AT_CLOSE, pWho); DoAtEnd(); } } - - ScriptedAI::MoveInLineOfSight(who); - } - - void EnterEvadeMode() - { - me->RemoveAllAuras(); - me->DeleteThreatList(); - me->CombatStop(true); - me->LoadCreaturesAddon(); - - if (me->isAlive()) - { - if (Player* pPlayer = Unit::GetPlayer(PlayerGUID)) - me->GetMotionMaster()->MoveFollow(pPlayer, PET_FOLLOW_DIST, m_creature->GetFollowAngle()); - else - { - me->GetMotionMaster()->MovementExpired(); - me->GetMotionMaster()->MoveTargetedHome(); - } - } - - me->SetLootRecipient(NULL); - - Reset(); - } - - void DoStart(uint64 Starter) - { - PlayerGUID = Starter; - me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); - - if (Player* pPlayer = Unit::GetPlayer(PlayerGUID)) - me->GetMotionMaster()->MoveFollow(pPlayer, PET_FOLLOW_DIST, m_creature->GetFollowAngle()); - - DoScriptText(EMOTE_START, me); } void DoAtEnd() { me->setFaction(FACTION_HOSTILE); - if (Player* pHolder = Unit::GetPlayer(PlayerGUID)) + if (Player* pHolder = GetLeaderForFollower()) me->AI()->AttackStart(pHolder); - PlayerGUID = 0; - } - - void JustDied(Unit* pKiller) - { - if (PlayerGUID) - { - PlayerGUID = 0; - me->GetMotionMaster()->MovementExpired(); - } - } - - void UpdateAI(const uint32 diff) - { - if (PlayerGUID) - { - if (!me->isInCombat()) - { - if (CheckPlayerTimer < diff) - { - CheckPlayerTimer = 5000; - - Player* pPlayer = Unit::GetPlayer(PlayerGUID); - - if (pPlayer && !pPlayer->isAlive()) - { - PlayerGUID = 0; - EnterEvadeMode(); - return; - } - }else CheckPlayerTimer -= diff; - } - } - - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); + SetFollowComplete(); } }; @@ -310,8 +301,13 @@ bool GossipSelect_npc_threshwackonator(Player* pPlayer, Creature* pCreature, uin { if (uiAction == GOSSIP_ACTION_INFO_DEF+1) { - CAST_AI(npc_threshwackonatorAI, pCreature->AI())->DoStart(pPlayer->GetGUID()); pPlayer->CLOSE_GOSSIP_MENU(); + + if (npc_threshwackonatorAI* pThreshAI = CAST_AI(npc_threshwackonatorAI, pCreature->AI())) + { + DoScriptText(EMOTE_START, pCreature); + pThreshAI->StartFollow(pPlayer); + } } return true; @@ -322,6 +318,12 @@ void AddSC_darkshore() Script *newscript; newscript = new Script; + newscript->Name = "npc_kerlonian"; + newscript->GetAI = &GetAI_npc_kerlonian; + newscript->pQuestAccept = &QuestAccept_npc_kerlonian; + newscript->RegisterSelf(); + + newscript = new Script; newscript->Name = "npc_prospector_remtravel"; newscript->GetAI = &GetAI_npc_prospector_remtravel; newscript->pQuestAccept = &QuestAccept_npc_prospector_remtravel; diff --git a/src/bindings/scripts/scripts/kalimdor/tanaris.cpp b/src/bindings/scripts/scripts/kalimdor/tanaris.cpp index de2baf10607..bfc56c96cb3 100644 --- a/src/bindings/scripts/scripts/kalimdor/tanaris.cpp +++ b/src/bindings/scripts/scripts/kalimdor/tanaris.cpp @@ -33,6 +33,7 @@ EndContentData */ #include "precompiled.h" #include "escort_ai.h" +#include "follower_ai.h" /*###### ## mob_aquementas @@ -455,18 +456,11 @@ enum const float m_afToWaterLoc[] = {-7032.664551, -4906.199219, -1.606446}; -//Script not fully complete, need to change faction. -struct MANGOS_DLL_DECL npc_toogaAI : public ScriptedAI +struct TRINITY_DLL_DECL npc_toogaAI : public FollowerAI { - npc_toogaAI(Creature* pCreature) : ScriptedAI(pCreature) - { - m_uiNpcFlags = pCreature->GetUInt32Value(UNIT_NPC_FLAGS); - m_uiPlayerGUID = 0; - } + npc_toogaAI(Creature* pCreature) : FollowerAI(pCreature) { } - uint64 m_uiPlayerGUID; - uint32 m_uiNpcFlags; - uint32 m_uiCheckPlayerTimer; + uint32 m_uiCheckSpeechTimer; uint32 m_uiPostEventTimer; uint32 m_uiPhasePostEvent; @@ -474,8 +468,8 @@ struct MANGOS_DLL_DECL npc_toogaAI : public ScriptedAI void Reset() { - m_uiCheckPlayerTimer = 2500; - m_uiPostEventTimer = 5000; + m_uiCheckSpeechTimer = 2500; + m_uiPostEventTimer = 1000; m_uiPhasePostEvent = 0; pTorta = NULL; @@ -483,135 +477,41 @@ struct MANGOS_DLL_DECL npc_toogaAI : public ScriptedAI void MoveInLineOfSight(Unit *pWho) { - if (pWho->GetEntry() == NPC_TORTA) + FollowerAI::MoveInLineOfSight(pWho); + + if (!m_creature->getVictim() && !IsFollowComplete() && !IsEndEventInProgress() && pWho->GetEntry() == NPC_TORTA) { if (m_creature->IsWithinDistInMap(pWho, INTERACTION_DISTANCE)) { - if (!pTorta && CanDoComplete()) + if (Player* pPlayer = GetLeaderForFollower()) { - pTorta = pWho; - m_uiPhasePostEvent = 1; + if (pPlayer->GetQuestStatus(QUEST_TOOGA) == QUEST_STATUS_INCOMPLETE) + pPlayer->GroupEventHappens(QUEST_TOOGA, m_creature); } - } - } - } - void AttackStart(Unit* pWho) - { - if (!pWho) - return; - - if (m_creature->Attack(pWho, true)) - { - m_creature->AddThreat(pWho, 0.0f); - m_creature->SetInCombatWith(pWho); - pWho->SetInCombatWith(m_creature); - - if (m_creature->hasUnitState(UNIT_STAT_FOLLOW)) - m_creature->clearUnitState(UNIT_STAT_FOLLOW); - - if (IsCombatMovement()) - m_creature->GetMotionMaster()->MoveChase(pWho); - } - } - - void EnterEvadeMode() - { - m_creature->RemoveAllAuras(); - m_creature->DeleteThreatList(); - m_creature->CombatStop(true); - m_creature->LoadCreaturesAddon(); - - if (m_creature->isAlive()) - { - if (Unit* pUnit = Unit::GetUnit(*m_creature, m_uiPlayerGUID)) - { - //for later development, it appear this kind return to combatStart, then resume to MoveFollow - m_creature->GetMotionMaster()->MoveFollow(pUnit, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - } - else - { - if (m_creature->hasUnitState(UNIT_STAT_FOLLOW)) - m_creature->clearUnitState(UNIT_STAT_FOLLOW); - - m_creature->GetMotionMaster()->MoveTargetedHome(); + pTorta = pWho; + SetFollowComplete(true); } } - - m_creature->SetLootRecipient(NULL); - - Reset(); - } - - void JustRespawned() - { - me->RestoreFaction(); - - m_creature->SetUInt32Value(UNIT_NPC_FLAGS, m_creature->GetCreatureInfo()->npcflag); - - Reset(); - } - - void DoStart(Player* pPlayer) - { - m_uiPlayerGUID = pPlayer->GetGUID(); - m_creature->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); - - m_creature->setFaction(FACTION_TOOG_ESCORTEE); - - m_creature->GetMotionMaster()->MoveFollow(pPlayer, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); } - bool CanDoComplete() + void MovementInform(uint32 uiMotionType, uint32 uiPointId) { - if (Player* pPlayer = (Player*)Unit::GetUnit(*m_creature, m_uiPlayerGUID)) - { - if (pPlayer->GetQuestStatus(QUEST_TOOGA) == QUEST_STATUS_INCOMPLETE) - { - uint16 uiQuestLogSlot = pPlayer->FindQuestSlot(QUEST_TOOGA); + FollowerAI::MovementInform(uiMotionType, uiPointId); - if (uiQuestLogSlot < MAX_QUEST_LOG_SIZE) - { - if (pPlayer->GetQuestSlotState(uiQuestLogSlot) != QUEST_STATE_FAIL) - { - pPlayer->GroupEventHappens(QUEST_TOOGA, m_creature); - m_creature->GetMotionMaster()->MovementExpired(); - return true; - } - } - } - } - - return false; - } - - void MovementInform(uint32 uiMoveType, uint32 uiPointId) - { - if (uiMoveType != POINT_MOTION_TYPE || !m_uiPlayerGUID) + if (uiMotionType != POINT_MOTION_TYPE) return; if (uiPointId == POINT_ID_TO_WATER) - m_creature->ForcedDespawn(); - } - - void JustDied(Unit* pKiller) - { - if (Player* pPlayer = Unit::GetPlayer(m_uiPlayerGUID)) - { - if (pPlayer->GetQuestStatus(QUEST_TOOGA) == QUEST_STATUS_INCOMPLETE) - pPlayer->FailQuest(QUEST_TOOGA); - } - - m_uiPlayerGUID = 0; - m_creature->GetMotionMaster()->MovementExpired(); + SetFollowComplete(); } - void UpdateAI(const uint32 uiDiff) + void UpdateFollowerAI(const uint32 uiDiff) { if (!UpdateVictim()) { //we are doing the post-event, or... - if (m_uiPhasePostEvent) + if (IsEndEventInProgress()) { if (m_uiPostEventTimer < uiDiff) { @@ -619,8 +519,8 @@ struct MANGOS_DLL_DECL npc_toogaAI : public ScriptedAI if (!pTorta || !pTorta->isAlive()) { - //something happened, so just despawn (what can go wrong?) - m_creature->ForcedDespawn(); + //something happened, so just complete + SetFollowComplete(); return; } @@ -643,7 +543,6 @@ struct MANGOS_DLL_DECL npc_toogaAI : public ScriptedAI break; case 6: DoScriptText(SAY_TORT_POST_6, pTorta); - m_creature->GetMotionMaster()->MovementExpired(); m_creature->GetMotionMaster()->MovePoint(POINT_ID_TO_WATER, m_afToWaterLoc[0], m_afToWaterLoc[1], m_afToWaterLoc[2]); break; } @@ -653,29 +552,21 @@ struct MANGOS_DLL_DECL npc_toogaAI : public ScriptedAI else m_uiPostEventTimer -= uiDiff; } - //...we are doing regular player check - else if (m_uiPlayerGUID) + //...we are doing regular speech check + else if (!IsFollowComplete()) { - if (m_uiCheckPlayerTimer < uiDiff) + if (m_uiCheckSpeechTimer < uiDiff) { - m_uiCheckPlayerTimer = 5000; + m_uiCheckSpeechTimer = 5000; switch(rand()%50) { case 10: DoScriptText(SAY_TOOG_THIRST, m_creature); break; case 25: DoScriptText(SAY_TOOG_WORRIED, m_creature); break; } - - Unit* pUnit = Unit::GetUnit(*m_creature, m_uiPlayerGUID); - - if (pUnit && !pUnit->isAlive()) - { - m_uiPlayerGUID = 0; - m_creature->ForcedDespawn(); - } } else - m_uiCheckPlayerTimer -= uiDiff; + m_uiCheckSpeechTimer -= uiDiff; } return; @@ -695,7 +586,7 @@ bool QuestAccept_npc_tooga(Player* pPlayer, Creature* pCreature, const Quest* pQ if (pQuest->GetQuestId() == QUEST_TOOGA) { if (npc_toogaAI* pToogaAI = CAST_AI(npc_toogaAI, pCreature->AI())) - pToogaAI->DoStart(pPlayer); + pToogaAI->StartFollow(pPlayer, FACTION_TOOG_ESCORTEE, pQuest); } return true; diff --git a/src/bindings/scripts/scripts/kalimdor/teldrassil.cpp b/src/bindings/scripts/scripts/kalimdor/teldrassil.cpp index 40e849fbbe6..cdd45826b4f 100644 --- a/src/bindings/scripts/scripts/kalimdor/teldrassil.cpp +++ b/src/bindings/scripts/scripts/kalimdor/teldrassil.cpp @@ -68,19 +68,10 @@ struct TRINITY_DLL_DECL npc_mistAI : public FollowerAI if (Player* pPlayer = GetLeaderForFollower()) { if (pPlayer->GetQuestStatus(QUEST_MIST) == QUEST_STATUS_INCOMPLETE) - { - uint16 uiQuestLogSlot = pPlayer->FindQuestSlot(QUEST_MIST); - - if (uiQuestLogSlot < MAX_QUEST_LOG_SIZE) - { - //This will be wrong, need to check all group members (if any) for state before event - if (pPlayer->GetQuestSlotState(uiQuestLogSlot) != QUEST_STATE_FAIL) - pPlayer->AreaExploredOrEventHappens(QUEST_MIST); - } - } + pPlayer->GroupEventHappens(QUEST_MIST, m_creature); } - //The follow is over (and for later development to indicate a post event can now run) + //The follow is over (and for later development, run off to the woods before really end) SetFollowComplete(); } diff --git a/src/bindings/scripts/scripts/kalimdor/ungoro_crater.cpp b/src/bindings/scripts/scripts/kalimdor/ungoro_crater.cpp index 81f122d61db..957835bc9aa 100644 --- a/src/bindings/scripts/scripts/kalimdor/ungoro_crater.cpp +++ b/src/bindings/scripts/scripts/kalimdor/ungoro_crater.cpp @@ -17,16 +17,18 @@ /* ScriptData SDName: Ungoro Crater SD%Complete: 100 -SDComment: Support for Quest: 4245 +SDComment: Support for Quest: 4245, 4491 SDCategory: Ungoro Crater EndScriptData */ /* ContentData npc_a-me +npc_ringo EndContentData */ #include "precompiled.h" #include "escort_ai.h" +#include "follower_ai.h" #define SAY_READY -1000200 #define SAY_AGGRO1 -1000201 @@ -132,6 +134,163 @@ CreatureAI* GetAI_npc_ame(Creature* pCreature) return new npc_ameAI(pCreature); } +/*#### +# npc_ringo +####*/ + +enum +{ + SAY_RIN_START_1 = -1000416, + SAY_RIN_START_2 = -1000417, + + SAY_FAINT_1 = -1000418, + SAY_FAINT_2 = -1000419, + SAY_FAINT_3 = -1000420, + SAY_FAINT_4 = -1000421, + + SAY_WAKE_1 = -1000422, + SAY_WAKE_2 = -1000423, + SAY_WAKE_3 = -1000424, + SAY_WAKE_4 = -1000425, + + SAY_RIN_END_1 = -1000426, + SAY_SPR_END_2 = -1000427, + SAY_RIN_END_3 = -1000428, + EMOTE_RIN_END_4 = -1000429, + EMOTE_RIN_END_5 = -1000430, + SAY_RIN_END_6 = -1000431, + SAY_SPR_END_7 = -1000432, + EMOTE_RIN_END_8 = -1000433, + + SPELL_REVIVE_RINGO = 15591, + QUEST_A_LITTLE_HELP = 4491, + NPC_SPRAGGLE = 9997, + FACTION_ESCORTEE = 113 +}; + +//Script not fully complete. Need more development of followerAI to accomplish misc tasks. +struct TRINITY_DLL_DECL npc_ringoAI : public FollowerAI +{ + npc_ringoAI(Creature* pCreature) : FollowerAI(pCreature) { } + + uint32 m_uiEndEventProgress; + uint32 m_uiEndEventTimer; + + Unit* pSpraggle; + + void Reset() + { + m_uiEndEventProgress = 0; + m_uiEndEventTimer = 1000; + pSpraggle = NULL; + } + + void MoveInLineOfSight(Unit *pWho) + { + FollowerAI::MoveInLineOfSight(pWho); + + if (!m_creature->getVictim() && !IsFollowComplete() && pWho->GetEntry() == NPC_SPRAGGLE) + { + if (m_creature->IsWithinDistInMap(pWho, INTERACTION_DISTANCE)) + { + if (Player* pPlayer = GetLeaderForFollower()) + { + if (pPlayer->GetQuestStatus(QUEST_A_LITTLE_HELP) == QUEST_STATUS_INCOMPLETE) + pPlayer->GroupEventHappens(QUEST_A_LITTLE_HELP, m_creature); + } + + pSpraggle = pWho; + SetFollowComplete(true); + } + } + } + + void UpdateFollowerAI(const uint32 uiDiff) + { + if (!UpdateVictim()) + { + if (IsEndEventInProgress()) + { + if (m_uiEndEventTimer < uiDiff) + { + if (!pSpraggle || !pSpraggle->isAlive()) + { + m_uiEndEventTimer = 1000; + SetFollowComplete(); + return; + } + + switch(m_uiEndEventProgress) + { + case 1: + DoScriptText(SAY_RIN_END_1, m_creature); + m_uiEndEventTimer = 3000; + break; + case 2: + DoScriptText(SAY_SPR_END_2, pSpraggle); + m_uiEndEventTimer = 5000; + break; + case 3: + DoScriptText(SAY_RIN_END_3, m_creature); + m_uiEndEventTimer = 1000; + break; + case 4: + DoScriptText(EMOTE_RIN_END_4, m_creature); + m_uiEndEventTimer = 9000; + break; + case 5: + DoScriptText(EMOTE_RIN_END_5, m_creature); + m_uiEndEventTimer = 1000; + break; + case 6: + DoScriptText(SAY_RIN_END_6, m_creature); + m_uiEndEventTimer = 3000; + break; + case 7: + DoScriptText(SAY_SPR_END_7, pSpraggle); + m_uiEndEventTimer = 10000; + break; + case 8: + DoScriptText(EMOTE_RIN_END_8, m_creature); + m_uiEndEventTimer = 5000; + break; + case 9: + SetFollowComplete(); + break; + } + + ++m_uiEndEventProgress; + } + else + m_uiEndEventTimer -= uiDiff; + } + + return; + } + + DoMeleeAttackIfReady(); + } +}; + +CreatureAI* GetAI_npc_ringo(Creature* pCreature) +{ + return new npc_ringoAI(pCreature); +} + +bool QuestAccept_npc_ringo(Player* pPlayer, Creature* pCreature, const Quest* pQuest) +{ + if (pQuest->GetQuestId() == QUEST_A_LITTLE_HELP) + { + if (npc_ringoAI* pRingoAI = CAST_AI(npc_ringoAI, pCreature->AI())) + { + pCreature->SetStandState(UNIT_STAND_STATE_STAND); + pRingoAI->StartFollow(pPlayer, FACTION_ESCORTEE, pQuest); + } + } + + return true; +} + void AddSC_ungoro_crater() { Script *newscript; @@ -141,5 +300,11 @@ void AddSC_ungoro_crater() newscript->GetAI = &GetAI_npc_ame; newscript->pQuestAccept = &QuestAccept_npc_ame; newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "npc_ringo"; + newscript->GetAI = &GetAI_npc_ringo; + newscript->pQuestAccept = &QuestAccept_npc_ringo; + newscript->RegisterSelf(); } |