2010-07-06 03:27:41 +02:00
/*
2011-01-01 15:01:13 +01:00
* Copyright (C) 2008-2011 TrinityCore <http://www.trinitycore.org/>
2010-07-06 03:27:41 +02:00
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
2008-10-21 13:19:26 -05:00
*
2010-07-06 03:27:41 +02:00
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
2008-10-21 13:19:26 -05:00
*
2010-07-06 03:27:41 +02:00
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
2008-10-21 13:19:26 -05:00
*/
2009-10-17 15:51:44 -07:00
2008-10-21 13:19:26 -05:00
/* ScriptData
SDName: Nagrand
SD%Complete: 90
2009-09-17 01:45:36 -07:00
SDComment: Quest support: 9849, 9868, 9918, 9874, 9991, 10107, 10108, 10044, 10172, 10646, 10085, 10987. TextId's unknown for altruis_the_sufferer and greatmother_geyah (npc_text)
2008-10-21 13:19:26 -05:00
SDCategory: Nagrand
EndScriptData */
2009-10-17 15:51:44 -07:00
2008-10-21 13:19:26 -05:00
/* ContentData
mob_shattered_rumbler
mob_lump
mob_sunspring_villager
npc_altruis_the_sufferer
npc_greatmother_geyah
npc_lantresor_of_the_blade
2009-09-17 01:45:36 -07:00
npc_maghar_captive
2008-10-21 13:19:26 -05:00
npc_creditmarker_visit_with_ancestors
2008-11-09 15:17:38 -06:00
mob_sparrowhawk
2008-10-21 13:19:26 -05:00
EndContentData */
2009-10-17 15:51:44 -07:00
2010-06-08 23:44:55 +02:00
#include "ScriptPCH.h"
2010-01-19 11:36:05 +01:00
#include "ScriptedEscortAI.h"
2009-10-17 15:51:44 -07:00
2008-10-21 13:19:26 -05:00
/*######
## mob_shattered_rumbler - this should be done with ACID
######*/
2010-08-09 00:56:10 +06:00
class mob_shattered_rumbler : public CreatureScript
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
public :
mob_shattered_rumbler () : CreatureScript ( "mob_shattered_rumbler" ) { }
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
CreatureAI * GetAI ( Creature * pCreature ) const
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
return new mob_shattered_rumblerAI ( pCreature );
2008-10-21 13:19:26 -05:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
struct mob_shattered_rumblerAI : public ScriptedAI
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
bool Spawn ;
mob_shattered_rumblerAI ( Creature * c ) : ScriptedAI ( c ) {}
void Reset ()
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
Spawn = false ;
2008-10-21 13:19:26 -05:00
}
2010-08-08 22:54:58 +06:00
void EnterCombat ( Unit * /*who*/ ) {}
void SpellHit ( Unit * Hitter , const SpellEntry * Spellkind )
{
if ( Spellkind -> Id == 32001 && ! Spawn )
{
float x = me -> GetPositionX ();
float y = me -> GetPositionY ();
float z = me -> GetPositionZ ();
2011-04-29 20:47:02 +02:00
Hitter -> SummonCreature ( 18181 , x + ( 0.7f * ( rand () % 30 )), y + ( rand () % 5 ), z , 0 , TEMPSUMMON_CORPSE_TIMED_DESPAWN , 60000 );
Hitter -> SummonCreature ( 18181 , x + ( rand () % 5 ), y - ( rand () % 5 ), z , 0 , TEMPSUMMON_CORPSE_TIMED_DESPAWN , 60000 );
Hitter -> SummonCreature ( 18181 , x - ( rand () % 5 ), y + ( 0.5f * ( rand () % 60 )), z , 0 , TEMPSUMMON_CORPSE_TIMED_DESPAWN , 60000 );
2010-08-08 22:54:58 +06:00
me -> setDeathState ( CORPSE );
Spawn = true ;
}
return ;
}
};
2008-10-21 13:19:26 -05:00
};
2009-10-17 15:51:44 -07:00
2008-10-21 13:19:26 -05:00
/*######
## mob_lump
######*/
2009-10-17 15:51:44 -07:00
2008-10-21 13:19:26 -05:00
#define SPELL_VISUAL_SLEEP 16093
#define SPELL_SPEAR_THROW 32248
2009-10-17 15:51:44 -07:00
2010-04-10 18:38:07 +02:00
#define LUMP_SAY0 -1000190
#define LUMP_SAY1 -1000191
2009-10-17 15:51:44 -07:00
2010-04-10 18:38:07 +02:00
#define LUMP_DEFEAT -1000192
2009-10-17 15:51:44 -07:00
2009-01-23 16:38:09 +01:00
#define GOSSIP_HL "I need answers, ogre!"
#define GOSSIP_SL1 "Why are Boulderfist out this far? You know that this is Kurenai territory."
#define GOSSIP_SL2 "And you think you can just eat anything you want? You're obviously trying to eat the Broken of Telaar."
#define GOSSIP_SL3 "This means war, Lump! War I say!"
2010-08-09 00:56:10 +06:00
class mob_lump : public CreatureScript
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
public :
mob_lump () : CreatureScript ( "mob_lump" ) { }
bool OnGossipSelect ( Player * pPlayer , Creature * pCreature , uint32 /*uiSender*/ , uint32 uiAction )
2008-10-21 13:19:26 -05:00
{
2010-08-29 00:57:51 +02:00
pPlayer -> PlayerTalkClass -> ClearMenus ();
2010-08-08 22:54:58 +06:00
switch ( uiAction )
{
case GOSSIP_ACTION_INFO_DEF :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SL1 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 1 );
pPlayer -> SEND_GOSSIP_MENU ( 9353 , pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 1 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SL2 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 2 );
pPlayer -> SEND_GOSSIP_MENU ( 9354 , pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 2 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SL3 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 3 );
pPlayer -> SEND_GOSSIP_MENU ( 9355 , pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 3 :
pPlayer -> SEND_GOSSIP_MENU ( 9356 , pCreature -> GetGUID ());
pPlayer -> TalkedToCreature ( 18354 , pCreature -> GetGUID ());
break ;
}
return true ;
2008-10-21 13:19:26 -05:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
bool OnGossipHello ( Player * pPlayer , Creature * pCreature )
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
if ( pPlayer -> GetQuestStatus ( 9918 ) == QUEST_STATUS_INCOMPLETE )
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_HL , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF );
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
pPlayer -> SEND_GOSSIP_MENU ( 9352 , pCreature -> GetGUID ());
return true ;
2008-10-21 13:19:26 -05:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
CreatureAI * GetAI ( Creature * pCreature ) const
2009-06-17 03:35:23 +02:00
{
2010-08-08 22:54:58 +06:00
return new mob_lumpAI ( pCreature );
2009-06-17 03:35:23 +02:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
struct mob_lumpAI : public ScriptedAI
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
mob_lumpAI ( Creature * c ) : ScriptedAI ( c )
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
bReset = false ;
2008-10-21 13:19:26 -05:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
uint32 Reset_Timer ;
uint32 Spear_Throw_Timer ;
bool bReset ;
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
void Reset ()
{
Reset_Timer = 60000 ;
Spear_Throw_Timer = 2000 ;
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
me -> RemoveFlag ( UNIT_FIELD_FLAGS , UNIT_FLAG_NON_ATTACKABLE );
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
void AttackedBy ( Unit * pAttacker )
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
if ( me -> getVictim ())
2009-05-01 01:07:09 +02:00
return ;
2010-08-08 22:54:58 +06:00
if ( me -> IsFriendlyTo ( pAttacker ))
return ;
AttackStart ( pAttacker );
}
void DamageTaken ( Unit * done_by , uint32 & damage )
{
2010-08-26 01:20:57 +06:00
if ( done_by -> GetTypeId () == TYPEID_PLAYER && me -> HealthBelowPctDamaged ( 30 , damage ))
2010-08-08 22:54:58 +06:00
{
if ( ! bReset && CAST_PLR ( done_by ) -> GetQuestStatus ( 9918 ) == QUEST_STATUS_INCOMPLETE )
{
//Take 0 damage
damage = 0 ;
CAST_PLR ( done_by ) -> AttackStop ();
me -> SetFlag ( UNIT_FIELD_FLAGS , UNIT_FLAG_NON_ATTACKABLE );
me -> RemoveAllAuras ();
me -> DeleteThreatList ();
me -> CombatStop ( true );
me -> setFaction ( 1080 ); //friendly
me -> SetStandState ( UNIT_STAND_STATE_SIT );
DoScriptText ( LUMP_DEFEAT , me );
bReset = true ;
}
2008-10-21 13:19:26 -05:00
}
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
void EnterCombat ( Unit * /*who*/ )
{
if ( me -> HasAura ( SPELL_VISUAL_SLEEP ))
me -> RemoveAura ( SPELL_VISUAL_SLEEP );
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
if ( ! me -> IsStandState ())
me -> SetStandState ( UNIT_STAND_STATE_STAND );
2011-04-29 20:47:02 +02:00
DoScriptText ( RAND ( LUMP_SAY0 , LUMP_SAY1 ), me );
2010-08-08 22:54:58 +06:00
}
void UpdateAI ( const uint32 diff )
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
//check if we waiting for a reset
if ( bReset )
{
if ( Reset_Timer <= diff )
{
EnterEvadeMode ();
bReset = false ;
me -> setFaction ( 1711 ); //hostile
return ;
}
else Reset_Timer -= diff ;
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
//Return since we have no target
if ( ! UpdateVictim ())
return ;
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
//Spear_Throw_Timer
if ( Spear_Throw_Timer <= diff )
{
DoCast ( me -> getVictim (), SPELL_SPEAR_THROW );
Spear_Throw_Timer = 20000 ;
} else Spear_Throw_Timer -= diff ;
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
DoMeleeAttackIfReady ();
}
};
};
2009-10-17 15:51:44 -07:00
2008-10-21 13:19:26 -05:00
/*####
# mob_sunspring_villager - should be done with ACID
####*/
2010-08-09 00:56:10 +06:00
class mob_sunspring_villager : public CreatureScript
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
public :
mob_sunspring_villager () : CreatureScript ( "mob_sunspring_villager" ) { }
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
CreatureAI * GetAI ( Creature * pCreature ) const
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
return new mob_sunspring_villagerAI ( pCreature );
2008-10-21 13:19:26 -05:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
struct mob_sunspring_villagerAI : public ScriptedAI
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
mob_sunspring_villagerAI ( Creature * c ) : ScriptedAI ( c ) {}
void Reset ()
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
me -> SetUInt32Value ( UNIT_DYNAMIC_FLAGS , UNIT_DYNFLAG_DEAD );
me -> SetStandState ( UNIT_STAND_STATE_DEAD );
2008-10-21 13:19:26 -05:00
}
2010-08-08 22:54:58 +06:00
void EnterCombat ( Unit * /*who*/ ) {}
void SpellHit ( Unit * /*caster*/ , const SpellEntry * spell )
{
if ( spell -> Id == 32146 )
{
me -> DealDamage ( me , me -> GetHealth (), NULL , DIRECT_DAMAGE , SPELL_SCHOOL_MASK_NORMAL , NULL , false );
me -> RemoveCorpse ();
}
}
};
2008-10-21 13:19:26 -05:00
};
2009-10-17 15:51:44 -07:00
2008-10-21 13:19:26 -05:00
/*######
## npc_altruis_the_sufferer
######*/
2009-10-17 15:51:44 -07:00
2009-01-23 16:38:09 +01:00
#define GOSSIP_HATS1 "I see twisted steel and smell sundered earth."
#define GOSSIP_HATS2 "Well...?"
#define GOSSIP_HATS3 "[PH] Story about Illidan's Pupil"
2009-10-17 15:51:44 -07:00
2009-01-23 16:38:09 +01:00
#define GOSSIP_SATS1 "Legion?"
#define GOSSIP_SATS2 "And now?"
#define GOSSIP_SATS3 "How do you see them now?"
#define GOSSIP_SATS4 "Forge camps?"
#define GOSSIP_SATS5 "Ok."
#define GOSSIP_SATS6 "[PH] Story done"
2010-08-09 00:56:10 +06:00
class npc_altruis_the_sufferer : public CreatureScript
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
public :
npc_altruis_the_sufferer () : CreatureScript ( "npc_altruis_the_sufferer" ) { }
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
bool OnQuestAccept ( Player * pPlayer , Creature * /*pCreature*/ , Quest const * /*quest*/ )
{
if ( ! pPlayer -> GetQuestRewardStatus ( 9991 )) //Survey the Land, q-id 9991
{
pPlayer -> CLOSE_GOSSIP_MENU ();
pPlayer -> ActivateTaxiPathTo ( 532 ); //TaxiPath 532
}
return true ;
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
bool OnGossipSelect ( Player * pPlayer , Creature * pCreature , uint32 /*uiSender*/ , uint32 uiAction )
{
2010-08-29 00:57:51 +02:00
pPlayer -> PlayerTalkClass -> ClearMenus ();
2010-08-08 22:54:58 +06:00
switch ( uiAction )
{
case GOSSIP_ACTION_INFO_DEF + 10 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SATS1 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 11 );
pPlayer -> SEND_GOSSIP_MENU ( 9420 , pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 11 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SATS2 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 12 );
pPlayer -> SEND_GOSSIP_MENU ( 9421 , pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 12 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SATS3 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 13 );
pPlayer -> SEND_GOSSIP_MENU ( 9422 , pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 13 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SATS4 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 14 );
pPlayer -> SEND_GOSSIP_MENU ( 9423 , pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 14 :
pPlayer -> SEND_GOSSIP_MENU ( 9424 , pCreature -> GetGUID ());
break ;
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
case GOSSIP_ACTION_INFO_DEF + 20 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SATS5 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 21 );
pPlayer -> SEND_GOSSIP_MENU ( 9427 , pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 21 :
pPlayer -> CLOSE_GOSSIP_MENU ();
pPlayer -> AreaExploredOrEventHappens ( 9991 );
break ;
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
case GOSSIP_ACTION_INFO_DEF + 30 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SATS6 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 31 );
pPlayer -> SEND_GOSSIP_MENU ( 384 , pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 31 :
pPlayer -> CLOSE_GOSSIP_MENU ();
pPlayer -> AreaExploredOrEventHappens ( 10646 );
break ;
}
return true ;
2008-10-21 13:19:26 -05:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
bool OnGossipHello ( Player * pPlayer , Creature * pCreature )
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
if ( pCreature -> isQuestGiver ())
pPlayer -> PrepareQuestMenu ( pCreature -> GetGUID ());
//gossip before obtaining Survey the Land
if ( pPlayer -> GetQuestStatus ( 9991 ) == QUEST_STATUS_NONE )
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_HATS1 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 10 );
//gossip when Survey the Land is incomplete (technically, after the flight)
if ( pPlayer -> GetQuestStatus ( 9991 ) == QUEST_STATUS_INCOMPLETE )
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_HATS2 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 20 );
//wowwiki.com/Varedis
if ( pPlayer -> GetQuestStatus ( 10646 ) == QUEST_STATUS_INCOMPLETE )
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_HATS3 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 30 );
pPlayer -> SEND_GOSSIP_MENU ( 9419 , pCreature -> GetGUID ());
return true ;
2008-10-21 13:19:26 -05:00
}
2010-08-08 22:54:58 +06:00
};
2008-10-21 13:19:26 -05:00
/*######
## npc_greatmother_geyah
######*/
2009-10-17 15:51:44 -07:00
2009-01-23 16:38:09 +01:00
#define GOSSIP_HGG1 "Hello, Greatmother. Garrosh told me that you wanted to speak with me."
#define GOSSIP_HGG2 "Garrosh is beyond redemption, Greatmother. I fear that in helping the Mag'har, I have convinced Garrosh that he is unfit to lead."
2009-10-17 15:51:44 -07:00
2009-01-23 16:38:09 +01:00
#define GOSSIP_SGG1 "You raised all of the orcs here, Greatmother?"
#define GOSSIP_SGG2 "Do you believe that?"
#define GOSSIP_SGG3 "What can be done? I have tried many different things. I have done my best to help the people of Nagrand. Each time I have approached Garrosh, he has dismissed me."
#define GOSSIP_SGG4 "Left? How can you choose to leave?"
#define GOSSIP_SGG5 "What is this duty?"
#define GOSSIP_SGG6 "Is there anything I can do for you, Greatmother?"
#define GOSSIP_SGG7 "I have done all that I could, Greatmother. I thank you for your kind words."
#define GOSSIP_SGG8 "Greatmother, you are the mother of Durotan?"
#define GOSSIP_SGG9 "Greatmother, I never had the honor. Durotan died long before my time, but his heroics are known to all on my world. The orcs of Azeroth reside in a place known as Durotar, named after your son. And ... (You take a moment to breathe and think through what you are about to tell the Greatmother.)"
#define GOSSIP_SGG10 "It is my Warchief, Greatmother. The leader of my people. From my world. He ... He is the son of Durotan. He is your grandchild."
#define GOSSIP_SGG11 "I will return to Azeroth at once, Greatmother."
2009-10-17 15:51:44 -07:00
2010-08-09 00:56:10 +06:00
//all the textId's for the below is unknown, but i do believe the gossip item texts are proper.
class npc_greatmother_geyah : public CreatureScript
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
public :
npc_greatmother_geyah () : CreatureScript ( "npc_greatmother_geyah" ) { }
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
bool OnGossipSelect ( Player * pPlayer , Creature * pCreature , uint32 /*uiSender*/ , uint32 uiAction )
2008-10-21 13:19:26 -05:00
{
2010-08-29 00:57:51 +02:00
pPlayer -> PlayerTalkClass -> ClearMenus ();
2010-08-08 22:54:58 +06:00
switch ( uiAction )
{
case GOSSIP_ACTION_INFO_DEF + 1 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SGG1 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 2 );
pPlayer -> SEND_GOSSIP_MENU ( pPlayer -> GetGossipTextId ( pCreature ), pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 2 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SGG2 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 3 );
pPlayer -> SEND_GOSSIP_MENU ( pPlayer -> GetGossipTextId ( pCreature ), pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 3 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SGG3 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 4 );
pPlayer -> SEND_GOSSIP_MENU ( pPlayer -> GetGossipTextId ( pCreature ), pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 4 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SGG4 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 5 );
pPlayer -> SEND_GOSSIP_MENU ( pPlayer -> GetGossipTextId ( pCreature ), pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 5 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SGG5 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 6 );
pPlayer -> SEND_GOSSIP_MENU ( pPlayer -> GetGossipTextId ( pCreature ), pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 6 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SGG6 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 7 );
pPlayer -> SEND_GOSSIP_MENU ( pPlayer -> GetGossipTextId ( pCreature ), pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 7 :
pPlayer -> AreaExploredOrEventHappens ( 10044 );
pPlayer -> CLOSE_GOSSIP_MENU ();
break ;
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
case GOSSIP_ACTION_INFO_DEF + 10 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SGG7 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 11 );
pPlayer -> SEND_GOSSIP_MENU ( pPlayer -> GetGossipTextId ( pCreature ), pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 11 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SGG8 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 12 );
pPlayer -> SEND_GOSSIP_MENU ( pPlayer -> GetGossipTextId ( pCreature ), pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 12 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SGG9 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 13 );
pPlayer -> SEND_GOSSIP_MENU ( pPlayer -> GetGossipTextId ( pCreature ), pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 13 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SGG10 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 14 );
pPlayer -> SEND_GOSSIP_MENU ( pPlayer -> GetGossipTextId ( pCreature ), pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 14 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SGG11 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 15 );
pPlayer -> SEND_GOSSIP_MENU ( pPlayer -> GetGossipTextId ( pCreature ), pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 15 :
pPlayer -> AreaExploredOrEventHappens ( 10172 );
pPlayer -> CLOSE_GOSSIP_MENU ();
break ;
}
return true ;
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
bool OnGossipHello ( Player * pPlayer , Creature * pCreature )
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
if ( pCreature -> isQuestGiver ())
pPlayer -> PrepareQuestMenu ( pCreature -> GetGUID ());
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
if ( pPlayer -> GetQuestStatus ( 10044 ) == QUEST_STATUS_INCOMPLETE )
{
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_HGG1 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 1 );
2009-12-20 13:35:08 +02:00
pPlayer -> SEND_GOSSIP_MENU ( pPlayer -> GetGossipTextId ( pCreature ), pCreature -> GetGUID ());
2010-08-08 22:54:58 +06:00
}
else if ( pPlayer -> GetQuestStatus ( 10172 ) == QUEST_STATUS_INCOMPLETE )
{
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_HGG2 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 10 );
2009-12-20 13:35:08 +02:00
pPlayer -> SEND_GOSSIP_MENU ( pPlayer -> GetGossipTextId ( pCreature ), pCreature -> GetGUID ());
2010-08-08 22:54:58 +06:00
}
else
2009-12-20 13:35:08 +02:00
pPlayer -> SEND_GOSSIP_MENU ( pPlayer -> GetGossipTextId ( pCreature ), pCreature -> GetGUID ());
2010-08-08 22:54:58 +06:00
return true ;
2008-10-21 13:19:26 -05:00
}
2010-08-08 22:54:58 +06:00
};
2008-10-21 13:19:26 -05:00
/*######
## npc_lantresor_of_the_blade
######*/
2009-10-17 15:51:44 -07:00
2009-01-23 16:38:09 +01:00
#define GOSSIP_HLB "I have killed many of your ogres, Lantresor. I have no fear."
#define GOSSIP_SLB1 "Should I know? You look like an orc to me."
#define GOSSIP_SLB2 "And the other half?"
#define GOSSIP_SLB3 "I have heard of your kind, but I never thought to see the day when I would meet a half-breed."
#define GOSSIP_SLB4 "My apologies. I did not mean to offend. I am here on behalf of my people."
#define GOSSIP_SLB5 "My people ask that you pull back your Boulderfist ogres and cease all attacks on our territories. In return, we will also pull back our forces."
#define GOSSIP_SLB6 "We will fight you until the end, then, Lantresor. We will not stand idly by as you pillage our towns and kill our people."
#define GOSSIP_SLB7 "What do I need to do?"
2010-08-09 00:56:10 +06:00
class npc_lantresor_of_the_blade : public CreatureScript
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
public :
npc_lantresor_of_the_blade () : CreatureScript ( "npc_lantresor_of_the_blade" ) { }
bool OnGossipSelect ( Player * pPlayer , Creature * pCreature , uint32 /*uiSender*/ , uint32 uiAction )
{
2010-08-29 00:57:51 +02:00
pPlayer -> PlayerTalkClass -> ClearMenus ();
2010-08-08 22:54:58 +06:00
switch ( uiAction )
{
case GOSSIP_ACTION_INFO_DEF :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SLB1 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 1 );
pPlayer -> SEND_GOSSIP_MENU ( 9362 , pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 1 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SLB2 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 2 );
pPlayer -> SEND_GOSSIP_MENU ( 9363 , pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 2 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SLB3 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 3 );
pPlayer -> SEND_GOSSIP_MENU ( 9364 , pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 3 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SLB4 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 4 );
pPlayer -> SEND_GOSSIP_MENU ( 9365 , pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 4 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SLB5 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 5 );
pPlayer -> SEND_GOSSIP_MENU ( 9366 , pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 5 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SLB6 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 6 );
pPlayer -> SEND_GOSSIP_MENU ( 9367 , pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 6 :
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_SLB7 , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF + 7 );
pPlayer -> SEND_GOSSIP_MENU ( 9368 , pCreature -> GetGUID ());
break ;
case GOSSIP_ACTION_INFO_DEF + 7 :
pPlayer -> SEND_GOSSIP_MENU ( 9369 , pCreature -> GetGUID ());
if ( pPlayer -> GetQuestStatus ( 10107 ) == QUEST_STATUS_INCOMPLETE )
pPlayer -> AreaExploredOrEventHappens ( 10107 );
if ( pPlayer -> GetQuestStatus ( 10108 ) == QUEST_STATUS_INCOMPLETE )
pPlayer -> AreaExploredOrEventHappens ( 10108 );
break ;
}
return true ;
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
bool OnGossipHello ( Player * pPlayer , Creature * pCreature )
{
if ( pCreature -> isQuestGiver ())
pPlayer -> PrepareQuestMenu ( pCreature -> GetGUID ());
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
if ( pPlayer -> GetQuestStatus ( 10107 ) == QUEST_STATUS_INCOMPLETE || pPlayer -> GetQuestStatus ( 10108 ) == QUEST_STATUS_INCOMPLETE )
pPlayer -> ADD_GOSSIP_ITEM ( GOSSIP_ICON_CHAT , GOSSIP_HLB , GOSSIP_SENDER_MAIN , GOSSIP_ACTION_INFO_DEF );
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
pPlayer -> SEND_GOSSIP_MENU ( 9361 , pCreature -> GetGUID ());
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
return true ;
2008-10-21 13:19:26 -05:00
}
2010-08-08 22:54:58 +06:00
};
2009-09-17 01:45:36 -07:00
/*#####
## npc_maghar_captive
#####*/
2009-10-17 15:51:44 -07:00
2009-10-17 07:42:48 -07:00
enum eMagharCaptive
2009-09-17 01:45:36 -07:00
{
SAY_MAG_START = - 1000482 ,
SAY_MAG_NO_ESCAPE = - 1000483 ,
SAY_MAG_MORE = - 1000484 ,
SAY_MAG_MORE_REPLY = - 1000485 ,
SAY_MAG_LIGHTNING = - 1000486 ,
SAY_MAG_SHOCK = - 1000487 ,
SAY_MAG_COMPLETE = - 1000488 ,
2009-10-17 15:51:44 -07:00
2009-09-17 01:45:36 -07:00
SPELL_CHAIN_LIGHTNING = 16006 ,
SPELL_EARTHBIND_TOTEM = 15786 ,
SPELL_FROST_SHOCK = 12548 ,
SPELL_HEALING_WAVE = 12491 ,
2009-10-17 15:51:44 -07:00
2009-09-17 01:45:36 -07:00
QUEST_TOTEM_KARDASH_H = 9868 ,
2009-10-17 15:51:44 -07:00
2009-09-17 01:45:36 -07:00
NPC_MURK_RAIDER = 18203 ,
NPC_MURK_BRUTE = 18211 ,
NPC_MURK_SCAVENGER = 18207 ,
NPC_MURK_PUTRIFIER = 18202
};
2009-10-17 15:51:44 -07:00
2010-08-22 23:46:40 +06:00
static float m_afAmbushA [] = { - 1568.805786f , 8533.873047f , 1.958f };
static float m_afAmbushB [] = { - 1491.554321f , 8506.483398f , 1.248f };
2010-08-09 00:56:10 +06:00
class npc_maghar_captive : public CreatureScript
2009-09-17 01:45:36 -07:00
{
2010-08-08 22:54:58 +06:00
public :
npc_maghar_captive () : CreatureScript ( "npc_maghar_captive" ) { }
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
bool OnQuestAccept ( Player * pPlayer , Creature * pCreature , const Quest * pQuest )
2009-09-17 01:45:36 -07:00
{
2010-08-08 22:54:58 +06:00
if ( pQuest -> GetQuestId () == QUEST_TOTEM_KARDASH_H )
{
if ( npc_maghar_captiveAI * pEscortAI = dynamic_cast < npc_maghar_captiveAI *> ( pCreature -> AI ()))
{
pCreature -> SetStandState ( UNIT_STAND_STATE_STAND );
pCreature -> setFaction ( 232 );
pEscortAI -> Start ( true , false , pPlayer -> GetGUID (), pQuest );
DoScriptText ( SAY_MAG_START , pCreature );
pCreature -> SummonCreature ( NPC_MURK_RAIDER , m_afAmbushA [ 0 ] + 2.5f , m_afAmbushA [ 1 ] - 2.5f , m_afAmbushA [ 2 ], 0.0f , TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT , 25000 );
pCreature -> SummonCreature ( NPC_MURK_PUTRIFIER , m_afAmbushA [ 0 ] - 2.5f , m_afAmbushA [ 1 ] + 2.5f , m_afAmbushA [ 2 ], 0.0f , TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT , 25000 );
pCreature -> SummonCreature ( NPC_MURK_BRUTE , m_afAmbushA [ 0 ], m_afAmbushA [ 1 ], m_afAmbushA [ 2 ], 0.0f , TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT , 25000 );
}
}
return true ;
2009-09-17 01:45:36 -07:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
CreatureAI * GetAI ( Creature * pCreature ) const
2009-09-17 01:45:36 -07:00
{
2010-08-08 22:54:58 +06:00
return new npc_maghar_captiveAI ( pCreature );
2009-09-17 01:45:36 -07:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
struct npc_maghar_captiveAI : public npc_escortAI
2009-09-17 01:45:36 -07:00
{
2010-08-08 22:54:58 +06:00
npc_maghar_captiveAI ( Creature * pCreature ) : npc_escortAI ( pCreature ) { Reset (); }
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
uint32 m_uiChainLightningTimer ;
uint32 m_uiHealTimer ;
uint32 m_uiFrostShockTimer ;
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
void Reset ()
{
m_uiChainLightningTimer = 1000 ;
m_uiHealTimer = 0 ;
m_uiFrostShockTimer = 6000 ;
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
void EnterCombat ( Unit * /*pWho*/ )
{
DoCast ( me , SPELL_EARTHBIND_TOTEM , false );
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
void WaypointReached ( uint32 uiPointId )
{
switch ( uiPointId )
{
case 7 :
DoScriptText ( SAY_MAG_MORE , me );
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
if ( Creature * pTemp = me -> SummonCreature ( NPC_MURK_PUTRIFIER , m_afAmbushB [ 0 ], m_afAmbushB [ 1 ], m_afAmbushB [ 2 ], 0.0f , TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT , 25000 ))
DoScriptText ( SAY_MAG_MORE_REPLY , pTemp );
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
me -> SummonCreature ( NPC_MURK_PUTRIFIER , m_afAmbushB [ 0 ] - 2.5f , m_afAmbushB [ 1 ] - 2.5f , m_afAmbushB [ 2 ], 0.0f , TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT , 25000 );
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
me -> SummonCreature ( NPC_MURK_SCAVENGER , m_afAmbushB [ 0 ] + 2.5f , m_afAmbushB [ 1 ] + 2.5f , m_afAmbushB [ 2 ], 0.0f , TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT , 25000 );
me -> SummonCreature ( NPC_MURK_SCAVENGER , m_afAmbushB [ 0 ] + 2.5f , m_afAmbushB [ 1 ] - 2.5f , m_afAmbushB [ 2 ], 0.0f , TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT , 25000 );
break ;
case 16 :
DoScriptText ( SAY_MAG_COMPLETE , me );
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
if ( Player * pPlayer = GetPlayerForEscort ())
pPlayer -> GroupEventHappens ( QUEST_TOTEM_KARDASH_H , me );
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
SetRun ();
break ;
}
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
void JustSummoned ( Creature * pSummoned )
2009-09-17 01:45:36 -07:00
{
2010-08-08 22:54:58 +06:00
if ( pSummoned -> GetEntry () == NPC_MURK_BRUTE )
DoScriptText ( SAY_MAG_NO_ESCAPE , pSummoned );
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
if ( pSummoned -> isTotem ())
return ;
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
pSummoned -> RemoveUnitMovementFlag ( MOVEMENTFLAG_WALKING );
pSummoned -> GetMotionMaster () -> MovePoint ( 0 , me -> GetPositionX (), me -> GetPositionY (), me -> GetPositionZ ());
pSummoned -> AI () -> AttackStart ( me );
2009-10-17 15:51:44 -07:00
2009-09-17 01:45:36 -07:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
void SpellHitTarget ( Unit * /*pTarget*/ , const SpellEntry * pSpell )
2009-09-17 01:45:36 -07:00
{
2010-08-08 22:54:58 +06:00
if ( pSpell -> Id == SPELL_CHAIN_LIGHTNING )
2009-09-17 01:45:36 -07:00
{
2010-08-08 22:54:58 +06:00
if ( rand () % 10 )
return ;
DoScriptText ( SAY_MAG_LIGHTNING , me );
2009-09-17 01:45:36 -07:00
}
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
void UpdateAI ( const uint32 uiDiff )
2009-09-17 01:45:36 -07:00
{
2010-08-08 22:54:58 +06:00
npc_escortAI :: UpdateAI ( uiDiff );
if ( ! me -> getVictim ())
return ;
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
if ( m_uiChainLightningTimer <= uiDiff )
{
DoCast ( me -> getVictim (), SPELL_CHAIN_LIGHTNING );
m_uiChainLightningTimer = urand ( 7000 , 14000 );
}
else
m_uiChainLightningTimer -= uiDiff ;
2009-10-17 15:51:44 -07:00
2010-08-26 01:20:57 +06:00
if ( HealthBelowPct ( 30 ))
2010-08-08 22:54:58 +06:00
{
if ( m_uiHealTimer <= uiDiff )
{
DoCast ( me , SPELL_HEALING_WAVE );
m_uiHealTimer = 5000 ;
}
else
m_uiHealTimer -= uiDiff ;
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
if ( m_uiFrostShockTimer <= uiDiff )
{
DoCast ( me -> getVictim (), SPELL_FROST_SHOCK );
m_uiFrostShockTimer = urand ( 7500 , 15000 );
}
else
m_uiFrostShockTimer -= uiDiff ;
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
DoMeleeAttackIfReady ();
2009-09-17 01:45:36 -07:00
}
2010-08-08 22:54:58 +06:00
};
};
2008-10-21 13:19:26 -05:00
/*######
2009-01-23 16:38:09 +01:00
## npc_creditmarker_visist_with_ancestors
2008-10-21 13:19:26 -05:00
######*/
2010-08-09 00:56:10 +06:00
class npc_creditmarker_visit_with_ancestors : public CreatureScript
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
public :
npc_creditmarker_visit_with_ancestors () : CreatureScript ( "npc_creditmarker_visit_with_ancestors" ) { }
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
CreatureAI * GetAI ( Creature * pCreature ) const
{
return new npc_creditmarker_visit_with_ancestorsAI ( pCreature );
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
struct npc_creditmarker_visit_with_ancestorsAI : public ScriptedAI
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
npc_creditmarker_visit_with_ancestorsAI ( Creature * c ) : ScriptedAI ( c ) {}
void Reset () {}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
void EnterCombat ( Unit * /*who*/ ) {}
void MoveInLineOfSight ( Unit * who )
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
if ( ! who )
return ;
if ( who -> GetTypeId () == TYPEID_PLAYER )
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
if ( CAST_PLR ( who ) -> GetQuestStatus ( 10085 ) == QUEST_STATUS_INCOMPLETE )
2008-10-21 13:19:26 -05:00
{
2010-08-08 22:54:58 +06:00
uint32 creditMarkerId = me -> GetEntry ();
if (( creditMarkerId >= 18840 ) && ( creditMarkerId <= 18843 ))
{
// 18840: Sunspring, 18841: Laughing, 18842: Garadar, 18843: Bleeding
if ( ! CAST_PLR ( who ) -> GetReqKillOrCastCurrentCount ( 10085 , creditMarkerId ))
CAST_PLR ( who ) -> KilledMonsterCredit ( creditMarkerId , me -> GetGUID ());
}
2008-10-21 13:19:26 -05:00
}
}
}
2010-08-08 22:54:58 +06:00
};
2008-10-21 13:19:26 -05:00
};
2009-10-17 15:51:44 -07:00
2008-10-21 13:19:26 -05:00
/*######
2008-11-09 15:17:38 -06:00
## mob_sparrowhawk
2008-10-21 13:19:26 -05:00
######*/
2009-10-17 15:51:44 -07:00
2008-11-09 15:17:38 -06:00
#define SPELL_SPARROWHAWK_NET 39810
#define SPELL_ITEM_CAPTIVE_SPARROWHAWK 39812
2010-08-09 00:56:10 +06:00
class mob_sparrowhawk : public CreatureScript
2008-11-09 15:17:38 -06:00
{
2010-08-08 22:54:58 +06:00
public :
mob_sparrowhawk () : CreatureScript ( "mob_sparrowhawk" ) { }
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
CreatureAI * GetAI ( Creature * pCreature ) const
2008-11-09 15:17:38 -06:00
{
2010-08-08 22:54:58 +06:00
return new mob_sparrowhawkAI ( pCreature );
2008-11-09 15:17:38 -06:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
struct mob_sparrowhawkAI : public ScriptedAI
{
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
mob_sparrowhawkAI ( Creature * c ) : ScriptedAI ( c ) {}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
uint32 Check_Timer ;
uint64 PlayerGUID ;
bool fleeing ;
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
void Reset ()
2008-11-09 15:17:38 -06:00
{
2010-08-08 22:54:58 +06:00
me -> RemoveAurasDueToSpell ( SPELL_SPARROWHAWK_NET );
Check_Timer = 1000 ;
PlayerGUID = 0 ;
fleeing = false ;
2008-11-09 15:17:38 -06:00
}
2010-08-08 22:54:58 +06:00
void AttackStart ( Unit * who )
{
if ( PlayerGUID )
return ;
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
ScriptedAI :: AttackStart ( who );
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
void EnterCombat ( Unit * /*who*/ ) {}
void MoveInLineOfSight ( Unit * who )
2008-11-09 15:17:38 -06:00
{
2010-08-08 22:54:58 +06:00
if ( ! who || PlayerGUID )
return ;
if ( ! PlayerGUID && who -> GetTypeId () == TYPEID_PLAYER && me -> IsWithinDistInMap ( who , 30 ) && CAST_PLR ( who ) -> GetQuestStatus ( 10987 ) == QUEST_STATUS_INCOMPLETE )
2008-11-09 15:17:38 -06:00
{
2010-08-08 22:54:58 +06:00
PlayerGUID = who -> GetGUID ();
return ;
}
ScriptedAI :: MoveInLineOfSight ( who );
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
void UpdateAI ( const uint32 diff )
{
if ( Check_Timer <= diff )
{
if ( PlayerGUID )
2008-11-09 15:17:38 -06:00
{
2010-08-08 22:54:58 +06:00
if ( fleeing && me -> GetMotionMaster () -> GetCurrentMovementGeneratorType () != FLEEING_MOTION_TYPE )
fleeing = false ;
Player * pPlayer = Unit :: GetPlayer ( * me , PlayerGUID );
if ( pPlayer && me -> IsWithinDistInMap ( pPlayer , 30 ))
2008-11-09 15:17:38 -06:00
{
2010-08-08 22:54:58 +06:00
if ( ! fleeing )
{
me -> DeleteThreatList ();
me -> GetMotionMaster () -> MoveFleeing ( pPlayer );
fleeing = true ;
}
}
else if ( fleeing )
{
me -> GetMotionMaster () -> MovementExpired ( false );
PlayerGUID = 0 ;
fleeing = false ;
2008-11-09 15:17:38 -06:00
}
}
2010-08-08 22:54:58 +06:00
Check_Timer = 1000 ;
} else Check_Timer -= diff ;
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
if ( PlayerGUID )
return ;
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
ScriptedAI :: UpdateAI ( diff );
}
2009-10-17 15:51:44 -07:00
2010-08-08 22:54:58 +06:00
void SpellHit ( Unit * caster , const SpellEntry * spell )
2008-11-09 15:17:38 -06:00
{
2010-08-08 22:54:58 +06:00
if ( caster -> GetTypeId () == TYPEID_PLAYER )
2008-11-09 15:17:38 -06:00
{
2010-08-08 22:54:58 +06:00
if ( spell -> Id == SPELL_SPARROWHAWK_NET && CAST_PLR ( caster ) -> GetQuestStatus ( 10987 ) == QUEST_STATUS_INCOMPLETE )
{
DoCast ( caster , SPELL_ITEM_CAPTIVE_SPARROWHAWK , true );
me -> DealDamage ( me , me -> GetHealth (), NULL , DIRECT_DAMAGE , SPELL_SCHOOL_MASK_NORMAL , NULL , false );
me -> RemoveFlag ( UNIT_DYNAMIC_FLAGS , UNIT_DYNFLAG_LOOTABLE );
}
2008-11-09 15:17:38 -06:00
}
2010-08-08 22:54:58 +06:00
return ;
2008-11-09 15:17:38 -06:00
}
2010-08-08 22:54:58 +06:00
};
2011-04-05 15:15:15 +02:00
};
2010-08-08 22:54:58 +06:00
2011-05-07 20:09:45 +02:00
enum CorkiData
2011-04-05 15:15:15 +02:00
{
// first quest
QUEST_HELP = 9923 ,
NPC_CORKI = 18445 ,
2011-05-19 15:03:58 +02:00
NPC_CORKI_CREDIT_1 = 18369 ,
2011-04-05 15:15:15 +02:00
GO_CORKIS_PRISON = 182349 ,
CORKI_SAY_THANKS = - 1800071 ,
// 2nd quest
QUEST_CORKIS_GONE_MISSING_AGAIN = 9924 ,
NPC_CORKI_2 = 20812 ,
GO_CORKIS_PRISON_2 = 182350 ,
CORKI_SAY_PROMISE = - 1800072 ,
// 3rd quest
QUEST_CHOWAR_THE_PILLAGER = 9955 ,
NPC_CORKI_3 = 18369 ,
2011-05-19 15:03:58 +02:00
NPC_CORKI_CREDIT_3 = 18444 ,
2011-04-05 15:15:15 +02:00
GO_CORKIS_PRISON_3 = 182521 ,
CORKI_SAY_LAST = - 1800073
2008-11-09 15:17:38 -06:00
};
2009-10-17 15:51:44 -07:00
2011-04-05 15:15:15 +02:00
class go_corkis_prison : public GameObjectScript
{
public :
go_corkis_prison () : GameObjectScript ( "go_corkis_prison" ) { }
bool OnGossipHello ( Player * player , GameObject * go )
{
if ( go -> GetEntry () == GO_CORKIS_PRISON )
{
if ( Creature * corki = go -> FindNearestCreature ( NPC_CORKI , 25 , true ))
{
go -> SetGoState ( GO_STATE_READY );
corki -> GetMotionMaster () -> MovePoint ( 1 , go -> GetPositionX () + 5 , go -> GetPositionY (), go -> GetPositionZ ());
if ( player )
2011-05-19 15:03:58 +02:00
player -> KilledMonsterCredit ( NPC_CORKI_CREDIT_1 , 0 );
2011-04-05 15:15:15 +02:00
}
}
if ( go -> GetEntry () == GO_CORKIS_PRISON_2 )
{
if ( Creature * corki = go -> FindNearestCreature ( NPC_CORKI_2 , 25 , true ))
{
go -> SetGoState ( GO_STATE_READY );
corki -> GetMotionMaster () -> MovePoint ( 1 , go -> GetPositionX () - 5 , go -> GetPositionY (), go -> GetPositionZ ());
if ( player )
player -> KilledMonsterCredit ( NPC_CORKI_2 , 0 );
}
}
if ( go -> GetEntry () == GO_CORKIS_PRISON_3 )
{
if ( Creature * corki = go -> FindNearestCreature ( NPC_CORKI_3 , 25 , true ))
{
go -> SetGoState ( GO_STATE_READY );
corki -> GetMotionMaster () -> MovePoint ( 1 , go -> GetPositionX () + 4 , go -> GetPositionY (), go -> GetPositionZ ());
if ( player )
2011-05-19 15:03:58 +02:00
player -> KilledMonsterCredit ( NPC_CORKI_CREDIT_3 , 0 );
2011-04-05 15:15:15 +02:00
}
}
return true ;
}
};
/*######
## npc_corki
######*/
class npc_corki : public CreatureScript
{
public :
npc_corki () : CreatureScript ( "npc_corki" ) { }
CreatureAI * GetAI ( Creature * creature ) const
{
return new npc_corkiAI ( creature );
}
struct npc_corkiAI : public ScriptedAI
{
npc_corkiAI ( Creature * creature ) : ScriptedAI ( creature ) {}
uint32 Say_Timer ;
bool ReleasedFromCage ;
void Reset ()
{
ReleasedFromCage = false ;
}
void UpdateAI ( uint32 const diff )
{
if ( Say_Timer <= diff && ReleasedFromCage )
{
me -> ForcedDespawn ();
ReleasedFromCage = false ;
}
else
Say_Timer -= diff ;
}
2011-05-07 20:09:45 +02:00
2011-04-05 15:15:15 +02:00
void MovementInform ( uint32 type , uint32 id )
{
2011-05-07 20:09:45 +02:00
if ( type == POINT_MOTION_TYPE && id == 1 )
2011-04-05 15:15:15 +02:00
{
Say_Timer = 5000 ;
ReleasedFromCage = true ;
if ( me -> GetEntry () == NPC_CORKI )
DoScriptText ( CORKI_SAY_THANKS , me );
if ( me -> GetEntry () == NPC_CORKI_2 )
DoScriptText ( CORKI_SAY_PROMISE , me );
if ( me -> GetEntry () == NPC_CORKI_3 )
DoScriptText ( CORKI_SAY_LAST , me );
}
};
};
};
2009-10-17 15:51:44 -07:00
2008-10-21 13:19:26 -05:00
void AddSC_nagrand ()
{
2010-08-08 22:54:58 +06:00
new mob_shattered_rumbler ();
new mob_lump ();
new mob_sunspring_villager ();
new npc_altruis_the_sufferer ();
new npc_greatmother_geyah ();
new npc_lantresor_of_the_blade ();
new npc_maghar_captive ();
new npc_creditmarker_visit_with_ancestors ();
new mob_sparrowhawk ();
2011-04-05 15:15:15 +02:00
new npc_corki ();
new go_corkis_prison ();
2008-10-21 13:19:26 -05:00
}