Merge [SD2]

r1221 Restore compile after changes to KilledMonster().
      Remove no longer needed code where creature_template are expected to have definitions for KillCredit.
      Replace one creature script with areatrigger script and some related code cleanup.
      Requires Mangos 8190+
r1222 Move waypoints for Barnes to database. Also adjust code and simplify parts of pre-event. Some additional code cleanup
r1223 Clean up labels for Kara instance.
r1224 Replace use of MANGOS_DLL_SPEC with MANGOS_DLL_DECL as expected in script. Thanks Zor for notice. - skip
r1225 Add new options for escortAI.
      For normal escorts, InstantRespawn can be set true (normal will despawn creature and use database spawntimesecs)
      For non-escorting scripts, option to loop path can be set. Creature will return to respawn coords and after, start path from beginning.
r1226 Remove escortAI option to defend self. Creature must be able to enter combat with any attacking and then defend self by attacking back.
      If custom cases exist where creature must not be set in combat with attacking, then custom script is expected.
r1227 Using _SECURE_SCL=0 to speedup iterators in Windows (release build, ref Mangos rev 8194). Patch by Vladimir - skip
r1228 Clean up gruul instance + scripts, add instance save and apply sd2 code style.
      Some adjustment to hurtful strike. Minor adjustments to other spell abilities.
      Create own AI for adds, and avoid repetitive code being common for all adds.
      Patch by Abim - skip
r1229 Move door code to instance script and simplify Set/GetData() code and aggro check. - skip
r1230 Remove no longer needed call to Reset() in Council_Base_AI and correct typo. - skip

--HG--
branch : trunk
This commit is contained in:
Kudlaty
2009-08-13 05:47:23 +02:00
parent 32e960d5bc
commit f6ec531d4d
56 changed files with 625 additions and 567 deletions
+13
View File
@@ -13,6 +13,19 @@ CREATE TABLE script_waypoint (
PRIMARY KEY (entry, pointid)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Script Creature waypoints';
DELETE FROM script_waypoint WHERE entry=16812;
INSERT INTO script_waypoint VALUES
(16812, 0, -10868.260, -1779.836, 90.476, 2500, 'Open door, begin walking'),
(16812, 1, -10875.585, -1779.581, 90.478, 0, ''),
(16812, 2, -10887.447, -1779.258, 90.476, 0, ''),
(16812, 3, -10894.592, -1780.668, 90.476, 0, ''),
(16812, 4, -10895.015, -1782.036, 90.476, 2500, 'Begin Speech after this'),
(16812, 5, -10894.592, -1780.668, 90.476, 0, 'Resume walking (back to spawn point now) after speech'),
(16812, 6, -10887.447, -1779.258, 90.476, 0, ''),
(16812, 7, -10875.585, -1779.581, 90.478, 0, ''),
(16812, 8, -10868.260, -1779.836, 90.476, 5000, 'close door'),
(16812, 9, -10866.799, -1780.958, 90.470, 2000, 'Summon mobs, open curtains');
DELETE FROM script_waypoint WHERE entry=28912;
INSERT INTO script_waypoint VALUES
(28912, 0, 1653.518, -6038.374, 127.585, 0, 'Jump off'),
+3 -1
View File
@@ -115,7 +115,6 @@ UPDATE `creature_template` SET `ScriptName`='npc_lightwell' WHERE `entry` IN (31
/* */
/* ALTERAC MOUNTAINS */
UPDATE `creature_template` SET `ScriptName`='npc_ravenholdt' WHERE `entry`=13936;
/* ALTERAC VALLEY */
@@ -1198,3 +1197,6 @@ UPDATE `creature_template` SET `ScriptName` = 'npc_skywing' WHERE entry=22424;
DELETE FROM areatrigger_scripts WHERE entry = 4156;
INSERT INTO areatrigger_scripts VALUES (4156, 'at_naxxramas_frostwyrm_wing');
DELETE FROM areatrigger_scripts WHERE entry=3066;
INSERT INTO areatrigger_scripts VALUES (3066,'at_ravenholdt');
+17
View File
@@ -0,0 +1,17 @@
UPDATE creature_template SET ScriptName='' WHERE entry=13936;
DELETE FROM areatrigger_scripts WHERE entry=3066;
INSERT INTO areatrigger_scripts VALUES (3066,'at_ravenholdt');
DELETE FROM script_waypoint WHERE entry=16812;
INSERT INTO script_waypoint VALUES
(16812, 0, -10868.260, -1779.836, 90.476, 2500, 'Open door, begin walking'),
(16812, 1, -10875.585, -1779.581, 90.478, 0, ''),
(16812, 2, -10887.447, -1779.258, 90.476, 0, ''),
(16812, 3, -10894.592, -1780.668, 90.476, 0, ''),
(16812, 4, -10895.015, -1782.036, 90.476, 2500, 'Begin Speech after this'),
(16812, 5, -10894.592, -1780.668, 90.476, 0, 'Resume walking (back to spawn point now) after speech'),
(16812, 6, -10887.447, -1779.258, 90.476, 0, ''),
(16812, 7, -10875.585, -1779.581, 90.478, 0, ''),
(16812, 8, -10868.260, -1779.836, 90.476, 5000, 'close door'),
(16812, 9, -10866.799, -1780.958, 90.470, 2000, 'Summon mobs, open curtains');
+2 -2
View File
@@ -85,7 +85,7 @@ extern void AddSC_npc_taxi();
//------ ZONE --------
//Alterac Mountains
extern void AddSC_alterac_mountains();
//extern void AddSC_alterac_mountains();
//Arathi Highlands
extern void AddSC_arathi_highlands();
@@ -1012,7 +1012,7 @@ void ScriptsInit(char const* cfg_file = "trinitycore.conf")
//------ ZONE --------
//Alterac Mountains
AddSC_alterac_mountains();
//AddSC_alterac_mountains();
//Arathi Highlands
AddSC_arathi_highlands();
@@ -31,22 +31,28 @@ EndContentData */
## at_legion_teleporter
#####*/
#define SPELL_TELE_A_TO 37387
#define SPELL_TELE_H_TO 37389
bool AreaTrigger_at_legion_teleporter(Player *player, AreaTriggerEntry *at)
enum
{
if (player->isAlive() && !player->isInCombat())
SPELL_TELE_A_TO = 37387,
QUEST_GAINING_ACCESS_A = 10589,
SPELL_TELE_H_TO = 37389,
QUEST_GAINING_ACCESS_H = 10604
};
bool AreaTrigger_at_legion_teleporter(Player* pPlayer, AreaTriggerEntry* pAt)
{
if (pPlayer->isAlive() && !pPlayer->isInCombat())
{
if (player->GetTeam()== ALLIANCE && player->GetQuestRewardStatus(10589))
if (pPlayer->GetTeam()== ALLIANCE && pPlayer->GetQuestRewardStatus(QUEST_GAINING_ACCESS_A))
{
player->CastSpell(player,SPELL_TELE_A_TO,false);
pPlayer->CastSpell(pPlayer,SPELL_TELE_A_TO,false);
return true;
}
if (player->GetTeam()== HORDE && player->GetQuestRewardStatus(10604))
if (pPlayer->GetTeam()== HORDE && pPlayer->GetQuestRewardStatus(QUEST_GAINING_ACCESS_H))
{
player->CastSpell(player,SPELL_TELE_H_TO,false);
pPlayer->CastSpell(pPlayer,SPELL_TELE_H_TO,false);
return true;
}
@@ -55,6 +61,20 @@ bool AreaTrigger_at_legion_teleporter(Player *player, AreaTriggerEntry *at)
return false;
}
enum
{
QUEST_MANOR_RAVENHOLDT = 6681,
NPC_RAVENHOLDT = 13936
};
bool AreaTrigger_at_ravenholdt(Player* pPlayer, AreaTriggerEntry* pAt)
{
if (pPlayer->GetQuestStatus(QUEST_MANOR_RAVENHOLDT) == QUEST_STATUS_INCOMPLETE)
pPlayer->KilledMonsterCredit(NPC_RAVENHOLDT, 0);
return false;
}
void AddSC_areatrigger_scripts()
{
Script *newscript;
@@ -63,5 +83,10 @@ void AddSC_areatrigger_scripts()
newscript->Name = "at_legion_teleporter";
newscript->pAreaTrigger = &AreaTrigger_at_legion_teleporter;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "at_ravenholdt";
newscript->pAreaTrigger = &AreaTrigger_at_ravenholdt;
newscript->RegisterSelf();
}
+3 -3
View File
@@ -165,7 +165,7 @@ bool GossipSelect_npc_test(Player *player, Creature *_Creature, uint32 sender, u
if (action == GOSSIP_ACTION_INFO_DEF+1)
{
player->CLOSE_GOSSIP_MENU();
((npc_escortAI*)(_Creature->AI()))->Start(true, true, true, player->GetGUID());
((npc_escortAI*)(_Creature->AI()))->Start(true, true, player->GetGUID());
return true; // prevent Trinity core handling
}
@@ -173,7 +173,7 @@ bool GossipSelect_npc_test(Player *player, Creature *_Creature, uint32 sender, u
if (action == GOSSIP_ACTION_INFO_DEF+2)
{
player->CLOSE_GOSSIP_MENU();
((npc_escortAI*)(_Creature->AI()))->Start(false, false, false, player->GetGUID());
((npc_escortAI*)(_Creature->AI()))->Start(false, false, player->GetGUID());
return true; // prevent Trinity core handling
}
@@ -181,7 +181,7 @@ bool GossipSelect_npc_test(Player *player, Creature *_Creature, uint32 sender, u
if (action == GOSSIP_ACTION_INFO_DEF+3)
{
player->CLOSE_GOSSIP_MENU();
((npc_escortAI*)(_Creature->AI()))->Start(false, true, false, player->GetGUID());
((npc_escortAI*)(_Creature->AI()))->Start(false, false, player->GetGUID());
return true; // prevent Trinity core handling
}
@@ -37,9 +37,9 @@ EndScriptData */
#define SAY_RAND_1 -1999920
#define SAY_RAND_2 -1999921
#define GOSSIP_ITEM_1 "Click to Test Escort(Attack, Defend, Run)"
#define GOSSIP_ITEM_2 "Click to Test Escort(NoAttack, NoDefend, Walk)"
#define GOSSIP_ITEM_3 "Click to Test Escort(NoAttack, Defend, Walk)"
#define GOSSIP_ITEM_1 "Click to Test Escort(Attack, Run)"
#define GOSSIP_ITEM_2 "Click to Test Escort(NoAttack, Walk)"
#define GOSSIP_ITEM_3 "Click to Test Escort(NoAttack, Run)"
struct TRINITY_DLL_DECL example_escortAI : public npc_escortAI
{
@@ -186,7 +186,7 @@ bool GossipSelect_example_escort(Player *player, Creature *_Creature, uint32 sen
if (action == GOSSIP_ACTION_INFO_DEF+1)
{
player->CLOSE_GOSSIP_MENU();
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(true, true, true, player->GetGUID());
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(true, true, player->GetGUID());
return true; // prevent mangos core handling
}
@@ -194,7 +194,7 @@ bool GossipSelect_example_escort(Player *player, Creature *_Creature, uint32 sen
if (action == GOSSIP_ACTION_INFO_DEF+2)
{
player->CLOSE_GOSSIP_MENU();
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(false, false, false, player->GetGUID());
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(false, false, player->GetGUID());
return true; // prevent mangos core handling
}
@@ -202,7 +202,7 @@ bool GossipSelect_example_escort(Player *player, Creature *_Creature, uint32 sen
if (action == GOSSIP_ACTION_INFO_DEF+3)
{
player->CLOSE_GOSSIP_MENU();
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(false, true, false, player->GetGUID());
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(false, true, player->GetGUID());
return true; // prevent mangos core handling
}
@@ -12,7 +12,12 @@ EndScriptData */
#include "precompiled.h"
#include "npc_escortAI.h"
#define WP_LAST_POINT -1
enum
{
POINT_LAST_POINT = 0xFFFFFF,
POINT_HOME = 0xFFFFFE
};
extern std::list<PointMovement> PointMovementList;
void npc_escortAI::AttackStart(Unit *who)
@@ -20,9 +25,6 @@ void npc_escortAI::AttackStart(Unit *who)
if (!who)
return;
if (IsBeingEscorted && !m_bCanDefendSelf)
return;
if(m_creature->Attack(who, true) )
{
if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE)
@@ -58,7 +60,7 @@ void npc_escortAI::ReturnToLastPoint()
{
float x, y, z, o;
m_creature->GetHomePosition(x, y, z, o);
m_creature->GetMotionMaster()->MovePoint(WP_LAST_POINT, x, y, z);
m_creature->GetMotionMaster()->MovePoint(POINT_LAST_POINT, x, y, z);
}
void npc_escortAI::EnterEvadeMode()
@@ -87,17 +89,33 @@ void npc_escortAI::UpdateAI(const uint32 diff)
{
if (m_uiWPWaitTimer <= diff)
{
//End of the line, Despawn self then immediatly respawn
//End of the line
if (CurrentWP == WaypointList.end())
{
if(DespawnAtEnd)
{
debug_log("TSCR: EscortAI reached end of waypoints");
m_creature->setDeathState(JUST_DIED);
if (m_bCanReturnToStart)
{
float fRetX, fRetY, fRetZ;
m_creature->GetRespawnCoord(fRetX, fRetY, fRetZ);
//TODO: add option to set instant respawn? Then use db respawn value as default
m_creature->Respawn();
m_creature->GetMotionMaster()->MovePoint(POINT_HOME, fRetX, fRetY, fRetZ);
m_uiWPWaitTimer = 0;
debug_log("TSCR: EscortAI are returning home to spawn location: %u, %f, %f, %f", POINT_HOME, fRetX, fRetY, fRetZ);
return;
}
if (m_bCanInstantRespawn)
{
m_creature->setDeathState(JUST_DIED);
m_creature->Respawn();
}
else
m_creature->ForcedDespawn();
return;
}
@@ -152,10 +170,14 @@ void npc_escortAI::UpdateAI(const uint32 diff)
debug_log("TSCR: EscortAI Evaded back to spawn point because player/group was to far away or not found");
JustDied(m_creature);
m_creature->setDeathState(JUST_DIED);
//TODO: add option to set instant respawn? Then use db respawn value as default
m_creature->Respawn();
if (m_bCanInstantRespawn)
{
m_creature->setDeathState(JUST_DIED);
m_creature->Respawn();
}
else
m_creature->ForcedDespawn();
return;
}
@@ -174,7 +196,7 @@ void npc_escortAI::MovementInform(uint32 type, uint32 id)
return;
//Combat start position reached, continue waypoint movement
if (id == WP_LAST_POINT)
if (id == POINT_LAST_POINT)
{
debug_log("TSCR: EscortAI has returned to original position before combat");
@@ -188,6 +210,13 @@ void npc_escortAI::MovementInform(uint32 type, uint32 id)
if (!m_uiWPWaitTimer)
m_uiWPWaitTimer = 1;
}
else if (id == POINT_HOME)
{
debug_log("TSCR: EscortAI has returned to original home location and will continue from beginning of waypoint list.");
CurrentWP = WaypointList.begin();
m_uiWPWaitTimer = 1;
}
else
{
//Make sure that we are still on the right waypoint
@@ -269,7 +298,8 @@ void npc_escortAI::SetRun(bool bRun)
m_bIsRunning = bRun;
}
void npc_escortAI::Start(bool bIsActiveAttacker, bool bCanDefendSelf, bool bRun, uint64 uiPlayerGUID)
//TODO: get rid of this many variables passed in function.
void npc_escortAI::Start(bool bIsActiveAttacker, bool bRun, uint64 uiPlayerGUID, const Quest* pQuest, bool bInstantRespawn, bool bCanLoopPath)
{
if (m_creature->getVictim())
{
@@ -289,6 +319,19 @@ void npc_escortAI::Start(bool bIsActiveAttacker, bool bCanDefendSelf, bool bRun,
return;
}
//set variables
m_bIsActiveAttacker = bIsActiveAttacker;
m_bIsRunning = bRun;
PlayerGUID = uiPlayerGUID;
m_pQuestForEscort = pQuest;
m_bCanInstantRespawn = bInstantRespawn;
m_bCanReturnToStart = bCanLoopPath;
if (m_bCanReturnToStart && m_bCanInstantRespawn)
debug_log("TSCR: EscortAI is set to return home after waypoint end and instant respawn at waypoint end. Creature will never despawn.");
if(m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE)
{
m_creature->GetMotionMaster()->MovementExpired();
@@ -296,15 +339,10 @@ void npc_escortAI::Start(bool bIsActiveAttacker, bool bCanDefendSelf, bool bRun,
debug_log("TSCR: EscortAI start with WAYPOINT_MOTION_TYPE, changed to MoveIdle.");
}
m_bIsActiveAttacker = bIsActiveAttacker;
m_bCanDefendSelf = bCanDefendSelf;
m_bIsRunning = bRun;
PlayerGUID = uiPlayerGUID;
//disable npcflags
m_creature->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
debug_log("TSCR: EscortAI started with %d waypoints. ActiveAttacker = %d, Defend = %d, Run = %d, PlayerGUID = %d", WaypointList.size(), m_bIsActiveAttacker, m_bCanDefendSelf, m_bIsRunning, PlayerGUID);
debug_log("TSCR: EscortAI started with %d waypoints. ActiveAttacker = %d, Run = %d, PlayerGUID = %d", WaypointList.size(), m_bIsActiveAttacker, m_bIsRunning, PlayerGUID);
CurrentWP = WaypointList.begin();
@@ -31,8 +31,7 @@ struct TRINITY_DLL_DECL npc_escortAI : public ScriptedAI
{
public:
explicit npc_escortAI(Creature* pCreature) : ScriptedAI(pCreature),
IsBeingEscorted(false), IsOnHold(false), PlayerGUID(0), MaxPlayerDistance(DEFAULT_MAX_PLAYER_DISTANCE), CanMelee(true), m_uiPlayerCheckTimer(1000), m_uiWPWaitTimer(0),
m_bIsReturning(false), m_bIsActiveAttacker(true), m_bCanDefendSelf(true), m_bIsRunning(false), DespawnAtEnd(true), DespawnAtFar(true) {}
IsBeingEscorted(false), IsOnHold(false), PlayerGUID(0), MaxPlayerDistance(DEFAULT_MAX_PLAYER_DISTANCE), CanMelee(true), m_uiPlayerCheckTimer(1000), m_uiWPWaitTimer(0), m_bIsReturning(false), m_bIsActiveAttacker(true), m_bIsRunning(false), DespawnAtEnd(true), DespawnAtFar(true), m_pQuestForEscort(NULL), m_bCanInstantRespawn(false), m_bCanReturnToStart(false) {}
~npc_escortAI() {}
// Pure Virtual Functions
@@ -58,7 +57,8 @@ struct TRINITY_DLL_DECL npc_escortAI : public ScriptedAI
void FillPointMovementListForCreature();
void Start(bool bIsActiveAttacker = true, bool bCanDefendSelf = true, bool bRun = false, uint64 uiPlayerGUID = 0);
void Start(bool bIsActiveAttacker = true, bool bRun = false, uint64 uiPlayerGUID = 0, const Quest* pQuest = NULL, bool bInstantRespawn = false, bool bCanLoopPath = false);
void SetRun(bool bRun = true);
void SetMaxPlayerDistance(float newMax) { MaxPlayerDistance = newMax; }
@@ -73,7 +73,6 @@ struct TRINITY_DLL_DECL npc_escortAI : public ScriptedAI
bool GetIsBeingEscorted() { return IsBeingEscorted; }//used in EnterEvadeMode override
void SetReturning(bool returning) { m_bIsReturning = returning; }//used in EnterEvadeMode override
void SetCanAttack(bool attack) { m_bIsActiveAttacker = attack; }
void SetCanDefend(bool defend) { m_bCanDefendSelf = defend; }
uint64 GetEventStarterGUID() { return PlayerGUID; }
// EscortAI variables
@@ -87,13 +86,16 @@ struct TRINITY_DLL_DECL npc_escortAI : public ScriptedAI
uint32 m_uiPlayerCheckTimer;
float MaxPlayerDistance;
const Quest* m_pQuestForEscort; //generally passed in Start() when regular escort script.
std::list<Escort_Waypoint> WaypointList;
std::list<Escort_Waypoint>::iterator CurrentWP;
bool m_bIsActiveAttacker; //possible obsolete, and should be determined with db only (civilian)
bool m_bCanDefendSelf; //rarely used, is true in 99%
bool m_bIsReturning; //in use when creature leave combat, and are returning to combat start position
bool m_bIsRunning; //all creatures are walking by default (has flag MOVEMENTFLAG_WALK)
bool m_bCanInstantRespawn; //if creature should respawn instantly after escort over (if not, database respawntime are used)
bool m_bCanReturnToStart; //if creature can walk same path (loop) without despawn. Not for regular escort quests.
bool CanMelee;
bool DespawnAtEnd;
bool DespawnAtFar;
@@ -16,49 +16,18 @@
/* ScriptData
SDName: Alterac_Mountains
SD%Complete: 100
SDComment: Quest support: 6681
SD%Complete: 0
SDComment: Placeholder
SDCategory: Alterac Mountains
EndScriptData */
/* ContentData
npc_ravenholdt
EndContentData */
#include "precompiled.h"
/*######
## npc_ravenholdt
######*/
struct TRINITY_DLL_DECL npc_ravenholdtAI : public ScriptedAI
{
npc_ravenholdtAI(Creature *c) : ScriptedAI(c) {}
void Reset() { }
void MoveInLineOfSight(Unit *who)
{
if( who->GetTypeId() == TYPEID_PLAYER )
if( CAST_PLR(who)->GetQuestStatus(6681) == QUEST_STATUS_INCOMPLETE )
CAST_PLR(who)->KilledMonsterCredit(m_creature->GetEntry(),m_creature->GetGUID() );
}
void EnterCombat(Unit* who) { }
};
CreatureAI* GetAI_npc_ravenholdt(Creature *_Creature)
{
return new npc_ravenholdtAI (_Creature);
}
void AddSC_alterac_mountains()
/*void AddSC_alterac_mountains()
{
Script *newscript;
newscript = new Script;
newscript->Name="npc_ravenholdt";
newscript->GetAI = &GetAI_npc_ravenholdt;
newscript->RegisterSelf();
}
}*/
@@ -117,7 +117,7 @@ bool QuestAccept_npc_professor_phizzlethorpe(Player* player, Creature* creature,
if (quest->GetQuestId() == QUEST_SUNKEN_TREASURE)
{
DoScriptText(SAY_PROGRESS_1, creature, player);
CAST_AI(npc_escortAI, (creature->AI()))->Start(false, false, false, player->GetGUID());
CAST_AI(npc_escortAI, (creature->AI()))->Start(false, false, player->GetGUID());
creature->setFaction(113);
}
return true;
@@ -144,7 +144,7 @@ bool QuestAccept_npc_torek(Player* player, Creature* creature, Quest const* ques
if (quest->GetQuestId() == QUEST_TOREK_ASSULT)
{
//TODO: find companions, make them follow Torek, at any time (possibly done by mangos/database in future?)
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, true, player->GetGUID());
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, player->GetGUID());
DoScriptText(SAY_READY, creature, player);
creature->setFaction(113);
}
@@ -244,7 +244,7 @@ bool QuestAccept_npc_ruul_snowhoof(Player* player, Creature* creature, Quest con
if (quest->GetQuestId() == QUEST_FREEDOM_TO_RUUL)
{
creature->setFaction(113);
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, false, player->GetGUID());
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
}
return true;
}
@@ -394,7 +394,7 @@ bool QuestAccept_npc_magwin(Player* player, Creature* creature, Quest const* que
if (quest->GetQuestId() == QUEST_A_CRY_FOR_SAY_HELP)
{
creature->setFaction(113);
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, false, player->GetGUID());
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
}
return true;
}
@@ -38,21 +38,26 @@ EndContentData */
#define GOSSIP_CORPSE "Examine corpse in detail..."
bool GossipHello_npc_beaten_corpse(Player *player, Creature *_Creature)
enum
{
if( player->GetQuestStatus(4921) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(4921) == QUEST_STATUS_COMPLETE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_CORPSE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
QUEST_LOST_IN_BATTLE = 4921
};
player->SEND_GOSSIP_MENU(3557, _Creature->GetGUID());
bool GossipHello_npc_beaten_corpse(Player* pPlayer, Creature* pCreature)
{
if( pPlayer->GetQuestStatus(QUEST_LOST_IN_BATTLE) == QUEST_STATUS_INCOMPLETE || pPlayer->GetQuestStatus(QUEST_LOST_IN_BATTLE) == QUEST_STATUS_COMPLETE)
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_CORPSE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(3557, pCreature->GetGUID());
return true;
}
bool GossipSelect_npc_beaten_corpse(Player *player, Creature *_Creature, uint32 sender, uint32 action )
bool GossipSelect_npc_beaten_corpse(Player* pPlayer, Creature* pCreature, uint32 sender, uint32 action )
{
if(action == GOSSIP_ACTION_INFO_DEF +1)
{
player->SEND_GOSSIP_MENU(3558, _Creature->GetGUID());
player->KilledMonsterCredit( 10668,_Creature->GetGUID() );
pPlayer->SEND_GOSSIP_MENU(3558, pCreature->GetGUID());
pPlayer->TalkedToCreature(pCreature->GetEntry(), pCreature->GetGUID());
}
return true;
}
@@ -499,7 +504,7 @@ bool QuestAccept_npc_wizzlecrank_shredder(Player* player, Creature* creature, Qu
if (quest->GetQuestId() == QUEST_ESCAPE)
{
creature->setFaction(FACTION_RATCHET);
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, false, player->GetGUID());
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
}
return true;
}
@@ -240,7 +240,7 @@ struct TRINITY_DLL_DECL npc_grimstoneAI : public npc_escortAI
case 0:
DoScriptText(-1000000, m_creature);//1
HandleGameObject(DATA_ARENA4, false);
Start(false, false, false);
Start(false, false);
CanWalk = true;
Event_Timer = 0;
break;
@@ -593,7 +593,7 @@ bool GossipSelect_npc_dughal_stormwing(Player *player, Creature *_Creature, uint
if (action == GOSSIP_ACTION_INFO_DEF + 1)
{
player->CLOSE_GOSSIP_MENU();
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(false, false, true, player->GetGUID());
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(false, true, player->GetGUID());
_Creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
pInstance->SetData(DATA_QUEST_JAIL_BREAK,ENCOUNTER_STATE_IN_PROGRESS);
}
@@ -750,7 +750,7 @@ bool QuestAccept_npc_marshal_windsor(Player *player, Creature *creature, Quest c
{PlayerStart = player;
if( pInstance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED )
{
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, false, player->GetGUID());
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
pInstance->SetData(DATA_QUEST_JAIL_BREAK,ENCOUNTER_STATE_IN_PROGRESS);
creature->setFaction(11);
}
@@ -859,7 +859,7 @@ struct TRINITY_DLL_DECL npc_marshal_reginald_windsorAI : public npc_escortAI
if( m_creature->IsWithinDistInMap(who, Radius) )
{
IsOnHold = false;
Start(true, true, false, who->GetGUID());
Start(true, false, who->GetGUID());
}
}
}
@@ -1058,7 +1058,7 @@ bool GossipSelect_npc_tobias_seecher(Player *player, Creature *_Creature, uint32
if (action == GOSSIP_ACTION_INFO_DEF + 1)
{
player->CLOSE_GOSSIP_MENU();
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(false, false, true, player->GetGUID());
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(false, true, player->GetGUID());
_Creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
pInstance->SetData(DATA_TOBIAS,ENCOUNTER_STATE_IN_PROGRESS);
}
@@ -1196,7 +1196,7 @@ bool ChooseReward_npc_rocknot(Player *player, Creature *_Creature, const Quest *
{
DoScriptText(SAY_GOT_BEER, _Creature);
_Creature->CastSpell(_Creature,SPELL_DRUNKEN_RAGE,false);
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(false, false, false);
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(false, false);
}
}
@@ -50,18 +50,14 @@ struct TRINITY_DLL_DECL mobs_bladespire_ogreAI : public ScriptedAI
{
mobs_bladespire_ogreAI(Creature *c) : ScriptedAI(c) {}
void Reset()
{
}
void Reset() { }
void EnterCombat(Unit* who)
void UpdateAI(const uint32 uiDiff)
{
}
if (!UpdateVictim())
return;
void JustDied(Unit* Killer)
{
if (Killer->GetTypeId() == TYPEID_PLAYER)
CAST_PLR(Killer)->KilledMonsterCredit(19995, m_creature->GetGUID());
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_mobs_bladespire_ogre(Creature *_Creature)
@@ -73,23 +69,26 @@ CreatureAI* GetAI_mobs_bladespire_ogre(Creature *_Creature)
## mobs_nether_drake
######*/
#define SAY_NIHIL_1 -1000396
#define SAY_NIHIL_2 -1000397
#define SAY_NIHIL_3 -1000398
#define SAY_NIHIL_4 -1000399
#define SAY_NIHIL_INTERRUPT -1000400
enum
{
SAY_NIHIL_1 = -1000396,
SAY_NIHIL_2 = -1000397,
SAY_NIHIL_3 = -1000398,
SAY_NIHIL_4 = -1000399,
SAY_NIHIL_INTERRUPT = -1000400,
#define ENTRY_WHELP 20021
#define ENTRY_PROTO 21821
#define ENTRY_ADOLE 21817
#define ENTRY_MATUR 21820
#define ENTRY_NIHIL 21823
ENTRY_WHELP = 20021,
ENTRY_PROTO = 21821,
ENTRY_ADOLE = 21817,
ENTRY_MATUR = 21820,
ENTRY_NIHIL = 21823,
#define SPELL_T_PHASE_MODULATOR 37573
SPELL_T_PHASE_MODULATOR = 37573,
#define SPELL_ARCANE_BLAST 38881
#define SPELL_MANA_BURN 38884
#define SPELL_INTANGIBLE_PRESENCE 36513
SPELL_ARCANE_BLAST = 38881,
SPELL_MANA_BURN = 38884,
SPELL_INTANGIBLE_PRESENCE = 36513
};
struct TRINITY_DLL_DECL mobs_nether_drakeAI : public ScriptedAI
{
@@ -243,7 +242,11 @@ CreatureAI* GetAI_mobs_nether_drake(Creature *_Creature)
## npc_daranelle
######*/
#define SAY_SPELL_INFLUENCE -1000174
enum
{
SAY_SPELL_INFLUENCE = -1000174,
SPELL_LASHHAN_CHANNEL = 36904
};
struct TRINITY_DLL_DECL npc_daranelleAI : public ScriptedAI
{
@@ -257,11 +260,11 @@ struct TRINITY_DLL_DECL npc_daranelleAI : public ScriptedAI
{
if (who->GetTypeId() == TYPEID_PLAYER)
{
if (who->HasAura(36904) && m_creature->IsWithinDistInMap(who, 10.0f))
if (who->HasAura(SPELL_LASHHAN_CHANNEL) && m_creature->IsWithinDistInMap(who, 10.0f))
{
DoScriptText(SAY_SPELL_INFLUENCE, m_creature, who);
//TODO: Move the below to updateAI and run if this statement == true
DoCast(who,37028,true);
m_creature->CastSpell(who,37028,true);
}
}
@@ -136,7 +136,7 @@ struct TRINITY_DLL_DECL boss_anetheronAI : public hyjal_trashAI
AddWaypoint(5, 5026.27, -1736.89, 1323.02);
AddWaypoint(6, 5037.77, -1770.56, 1324.36);
AddWaypoint(7, 5067.23, -1789.95, 1321.17);
Start(false, true, true);
Start(false, true);
SetDespawnAtEnd(false);
}
}
@@ -128,7 +128,7 @@ struct TRINITY_DLL_DECL boss_azgalorAI : public hyjal_trashAI
AddWaypoint(5, 5508.16, -2659.2, 1480.15);
AddWaypoint(6, 5489.62, -2704.05, 1482.18);
AddWaypoint(7, 5457.04, -2726.26, 1485.10);
Start(false, true, true);
Start(false, true);
SetDespawnAtEnd(false);
}
}
@@ -123,7 +123,7 @@ struct TRINITY_DLL_DECL boss_kazrogalAI : public hyjal_trashAI
AddWaypoint(5, 5508.16, -2659.2, 1480.15);
AddWaypoint(6, 5489.62, -2704.05, 1482.18);
AddWaypoint(7, 5457.04, -2726.26, 1485.10);
Start(false, true, true);
Start(false, true);
SetDespawnAtEnd(false);
}
}
@@ -120,7 +120,7 @@ struct TRINITY_DLL_DECL boss_rage_winterchillAI : public hyjal_trashAI
AddWaypoint(5, 5026.27, -1736.89, 1323.02);
AddWaypoint(6, 5037.77, -1770.56, 1324.36);
AddWaypoint(7, 5067.23, -1789.95, 1321.17);
Start(false, true, true);
Start(false, true);
SetDespawnAtEnd(false);
}
}
@@ -669,7 +669,7 @@ void hyjalAI::Retreat()
pInstance->SetData(DATA_ALLIANCE_RETREAT, 1);
AddWaypoint(0,JainaWPs[0][0],JainaWPs[0][1],JainaWPs[0][2]);
AddWaypoint(1,JainaWPs[1][0],JainaWPs[1][1],JainaWPs[1][2]);
Start(false, false, false);
Start(false, false);
SetDespawnAtEnd(false);//move to center of alliance base
}
if(Faction == 1)
@@ -683,7 +683,7 @@ void hyjalAI::Retreat()
DummyGuid = JainaDummy->GetGUID();
}
AddWaypoint(0,JainaDummySpawn[1][0],JainaDummySpawn[1][1],JainaDummySpawn[1][2]);
Start(false, false, false);
Start(false, false);
SetDespawnAtEnd(false);//move to center of alliance base
}
}
@@ -203,7 +203,7 @@ void hyjal_trashAI::UpdateAI(const uint32 diff)
m_creature->SetHomePosition(AllianceOverrunWP[43][0]+irand(-3,3), AllianceOverrunWP[43][1]+irand(-3,3), AllianceOverrunWP[43][2],0);
SetDespawnAtEnd(false);
LastOverronPos = 18;
Start(true, true, true);
Start(true, true);
break;
case 1:
AddWaypoint( 4, AllianceOverrunWP[22][0]+irand(-3,3), AllianceOverrunWP[22][1]+irand(-3,3), AllianceOverrunWP[22][2]);
@@ -225,7 +225,7 @@ void hyjal_trashAI::UpdateAI(const uint32 diff)
m_creature->SetHomePosition(AllianceOverrunWP[44][0]+irand(-3,3), AllianceOverrunWP[44][1]+irand(-3,3), AllianceOverrunWP[44][2],0);
SetDespawnAtEnd(false);
LastOverronPos = 18;
Start(true, true, true);
Start(true, true);
break;
default:
for(uint8 i = 22; i < 36; i++)
@@ -233,7 +233,7 @@ void hyjal_trashAI::UpdateAI(const uint32 diff)
SetDespawnAtEnd(true);
LastOverronPos = 17;
Start(true, true, true);
Start(true, true);
break;
}
}
@@ -249,7 +249,7 @@ void hyjal_trashAI::UpdateAI(const uint32 diff)
m_creature->SetHomePosition(AllianceOverrunWP[2][0]+irand(-3,3), AllianceOverrunWP[2][1]+irand(-3,3), AllianceOverrunWP[2][2],0);
SetDespawnAtEnd(false);
LastOverronPos = 5;
Start(true, true, true);
Start(true, true);
break;
case 1:
AddWaypoint(4, AllianceOverrunWP[3][0]+irand(-3,3), AllianceOverrunWP[3][1]+irand(-3,3), AllianceOverrunWP[3][2]);
@@ -258,7 +258,7 @@ void hyjal_trashAI::UpdateAI(const uint32 diff)
m_creature->SetHomePosition(AllianceOverrunWP[5][0]+irand(-3,3), AllianceOverrunWP[5][1]+irand(-3,3), AllianceOverrunWP[5][2],0);
SetDespawnAtEnd(false);
LastOverronPos = 6;
Start(true, true, true);
Start(true, true);
break;
case 2:
AddWaypoint(4, AllianceOverrunWP[6][0]+irand(-3,3), AllianceOverrunWP[6][1]+irand(-3,3), AllianceOverrunWP[6][2]);
@@ -268,7 +268,7 @@ void hyjal_trashAI::UpdateAI(const uint32 diff)
m_creature->SetHomePosition(AllianceOverrunWP[9][0]+irand(-3,3), AllianceOverrunWP[9][1]+irand(-3,3), AllianceOverrunWP[9][2],0);
SetDespawnAtEnd(false);
LastOverronPos = 7;
Start(true, true, true);
Start(true, true);
break;
case 3:
AddWaypoint(4, AllianceOverrunWP[10][0]+irand(-3,3), AllianceOverrunWP[10][1]+irand(-3,3), AllianceOverrunWP[10][2]);
@@ -277,7 +277,7 @@ void hyjal_trashAI::UpdateAI(const uint32 diff)
m_creature->SetHomePosition(AllianceOverrunWP[12][0]+irand(-3,3), AllianceOverrunWP[12][1]+irand(-3,3), AllianceOverrunWP[12][2],0);
SetDespawnAtEnd(false);
LastOverronPos = 6;
Start(true, true, true);
Start(true, true);
break;
case 4:
AddWaypoint(4, AllianceOverrunWP[13][0]+irand(-3,3), AllianceOverrunWP[13][1]+irand(-3,3), AllianceOverrunWP[13][2]);
@@ -286,7 +286,7 @@ void hyjal_trashAI::UpdateAI(const uint32 diff)
m_creature->SetHomePosition(AllianceOverrunWP[15][0]+irand(-3,3), AllianceOverrunWP[15][1]+irand(-3,3), AllianceOverrunWP[15][2],0);
SetDespawnAtEnd(false);
LastOverronPos = 6;
Start(true, true, true);
Start(true, true);
break;
case 5:
AddWaypoint(4, AllianceOverrunWP[16][0]+irand(-3,3), AllianceOverrunWP[16][1]+irand(-3,3), AllianceOverrunWP[16][2]);
@@ -298,14 +298,14 @@ void hyjal_trashAI::UpdateAI(const uint32 diff)
m_creature->SetHomePosition(AllianceOverrunWP[21][0]+irand(-3,3), AllianceOverrunWP[21][1]+irand(-3,3), AllianceOverrunWP[21][2],0);
SetDespawnAtEnd(false);
LastOverronPos = 9;
Start(true, true, true);
Start(true, true);
break;
default:
for(uint8 i = 22; i < 36; i++)
AddWaypoint( i-18, AllianceOverrunWP[i][0]+irand(-3,3), AllianceOverrunWP[i][1]+irand(-3,3), AllianceOverrunWP[i][2]);
SetDespawnAtEnd(true);
LastOverronPos = 17;
Start(true, true, true);
Start(true, true);
break;
}
}
@@ -326,7 +326,7 @@ void hyjal_trashAI::UpdateAI(const uint32 diff)
m_creature->SetHomePosition(HordeOverrunWP[19][0], HordeOverrunWP[19][1], HordeOverrunWP[19][2],0);
SetDespawnAtEnd(false);
LastOverronPos = 8;
Start(true, true, true);
Start(true, true);
break;
case 1:
AddWaypoint( 5, HordeOverrunWP[16][0]+irand(-10,10), HordeOverrunWP[16][1]+irand(-10,10), HordeOverrunWP[16][2]);
@@ -336,14 +336,14 @@ void hyjal_trashAI::UpdateAI(const uint32 diff)
m_creature->SetHomePosition(HordeOverrunWP[20][0], HordeOverrunWP[20][1], HordeOverrunWP[20][2],0);
SetDespawnAtEnd(false);
LastOverronPos = 8;
Start(true, true, true);
Start(true, true);
break;
default:
for(uint8 i = 0; i < 16; i++)
AddWaypoint( i+6, HordeOverrunWP[i][0]+irand(-10,10), HordeOverrunWP[i][1]+irand(-10,10), HordeOverrunWP[i][2]);
SetDespawnAtEnd(true);
LastOverronPos = 21;
Start(true, true, true);
Start(true, true);
break;
}
}
@@ -355,7 +355,7 @@ void hyjal_trashAI::UpdateAI(const uint32 diff)
AddWaypoint( i+6, HordeOverrunWP[i][0]+irand(-10,10), HordeOverrunWP[i][1]+irand(-10,10), HordeOverrunWP[i][2]);
SetDespawnAtEnd(true);
LastOverronPos = 21;
Start(true, true, true);
Start(true, true);
}
}
}
@@ -474,7 +474,7 @@ struct mob_giant_infernalAI : public hyjal_trashAI
if(pInstance)
{
AddWaypoint(0, HordeWPs[7][0]+irand(-3,3), HordeWPs[7][1]+irand(-3,3), HordeWPs[7][2]);//HordeWPs[7] infront of thrall
Start(true, true, true);
Start(true, true);
SetDespawnAtEnd(false);
}
}
@@ -567,13 +567,13 @@ struct mob_abominationAI : public hyjal_trashAI
{
for (uint8 i = 0; i < 8; ++i)
AddWaypoint(i, HordeWPs[i][0]+irand(-3,3), HordeWPs[i][1]+irand(-3,3), HordeWPs[i][2]);
Start(false, true, true);
Start(false, true);
SetDespawnAtEnd(false);
}else//use alliance WPs
{
for (uint8 i = 0; i < 8; ++i)
AddWaypoint(i, AllianceWPs[i][0]+irand(-3,3), AllianceWPs[i][1]+irand(-3,3), AllianceWPs[i][2]);
Start(false, true, true);
Start(false, true);
SetDespawnAtEnd(false);
}
}
@@ -668,13 +668,13 @@ struct mob_ghoulAI : public hyjal_trashAI
{
for (uint8 i = 0; i < 8; ++i)
AddWaypoint(i, HordeWPs[i][0]+irand(-3,3), HordeWPs[i][1]+irand(-3,3), HordeWPs[i][2]);
Start(false, true, true);
Start(false, true);
SetDespawnAtEnd(false);
}else//use alliance WPs
{
for (uint8 i = 0; i < 8; ++i)
AddWaypoint(i, AllianceWPs[i][0]+irand(-3,3), AllianceWPs[i][1]+irand(-3,3), AllianceWPs[i][2]);
Start(false, true, true);
Start(false, true);
SetDespawnAtEnd(false);
}
}
@@ -787,13 +787,13 @@ struct mob_necromancerAI : public hyjal_trashAI
{
for (uint8 i = 0; i < 8; ++i)
AddWaypoint(i, HordeWPs[i][0]+irand(-3,3), HordeWPs[i][1]+irand(-3,3), HordeWPs[i][2]);
Start(true, true, true);
Start(true, true);
SetDespawnAtEnd(false);
}else//use alliance WPs
{
for (uint8 i = 0; i < 8; ++i)
AddWaypoint(i, AllianceWPs[i][0]+irand(-3,3), AllianceWPs[i][1]+irand(-3,3), AllianceWPs[i][2]);
Start(true, true, true);
Start(true, true);
SetDespawnAtEnd(false);
}
}
@@ -879,13 +879,13 @@ struct mob_bansheeAI : public hyjal_trashAI
{
for (uint8 i = 0; i < 8; ++i)
AddWaypoint(i, HordeWPs[i][0]+irand(-3,3), HordeWPs[i][1]+irand(-3,3), HordeWPs[i][2]);
Start(false, true, true);
Start(false, true);
SetDespawnAtEnd(false);
}else//use alliance WPs
{
for (uint8 i = 0; i < 8; ++i)
AddWaypoint(i, AllianceWPs[i][0]+irand(-3,3), AllianceWPs[i][1]+irand(-3,3), AllianceWPs[i][2]);
Start(false, true, true);
Start(false, true);
SetDespawnAtEnd(false);
}
}
@@ -974,13 +974,13 @@ struct mob_crypt_fiendAI : public hyjal_trashAI
{
for (uint8 i = 0; i < 8; ++i)
AddWaypoint(i, HordeWPs[i][0]+irand(-3,3), HordeWPs[i][1]+irand(-3,3), HordeWPs[i][2]);
Start(false, true, true);
Start(false, true);
SetDespawnAtEnd(false);
}else//use alliance WPs
{
for (uint8 i = 0; i < 8; ++i)
AddWaypoint(i, AllianceWPs[i][0]+irand(-3,3), AllianceWPs[i][1]+irand(-3,3), AllianceWPs[i][2]);
Start(false, true, true);
Start(false, true);
SetDespawnAtEnd(false);
}
@@ -1060,13 +1060,13 @@ struct mob_fel_stalkerAI : public hyjal_trashAI
{
for (uint8 i = 0; i < 8; ++i)
AddWaypoint(i, HordeWPs[i][0]+irand(-3,3), HordeWPs[i][1]+irand(-3,3), HordeWPs[i][2]);
Start(false, true, true);
Start(false, true);
SetDespawnAtEnd(false);
}else//use alliance WPs
{
for (uint8 i = 0; i < 8; ++i)
AddWaypoint(i, AllianceWPs[i][0]+irand(-3,3), AllianceWPs[i][1]+irand(-3,3), AllianceWPs[i][2]);
Start(false, true, true);
Start(false, true);
SetDespawnAtEnd(false);
}
@@ -1161,12 +1161,12 @@ struct mob_frost_wyrmAI : public hyjal_trashAI
{
for (uint8 i = 0; i < 3; ++i)
AddWaypoint(i, FrostWyrmWPs[i][0], FrostWyrmWPs[i][1], FrostWyrmWPs[i][2]);
Start(false, true, true);
Start(false, true);
SetDespawnAtEnd(false);
}else{//fly path FlyPathWPs
for (uint8 i = 0; i < 3; ++i)
AddWaypoint(i, FlyPathWPs[i][0]+irand(-10,10), FlyPathWPs[i][1]+irand(-10,10), FlyPathWPs[i][2]);
Start(false, true, true);
Start(false, true);
SetDespawnAtEnd(false);
}
}
@@ -1273,12 +1273,12 @@ struct mob_gargoyleAI : public hyjal_trashAI
{
for (uint8 i = 0; i < 3; ++i)
AddWaypoint(i, GargoyleWPs[i][0]+irand(-10,10), GargoyleWPs[i][1]+irand(-10,10), GargoyleWPs[i][2]);
Start(false, true, true);
Start(false, true);
SetDespawnAtEnd(false);
}else{//fly path FlyPathWPs
for (uint8 i = 0; i < 3; ++i)
AddWaypoint(i, FlyPathWPs[i][0]+irand(-10,10), FlyPathWPs[i][1]+irand(-10,10), FlyPathWPs[i][2]);
Start(false, true, true);
Start(false, true);
SetDespawnAtEnd(false);
}
}
@@ -336,7 +336,7 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
if (uint64 TarethaGUID = pInstance->GetData64(DATA_TARETHA))
{
if (Creature* Taretha = (Unit::GetCreature(*m_creature, TarethaGUID)))
CAST_AI(npc_escortAI, (Taretha->AI()))->Start(false, false, true, PlayerGUID);
CAST_AI(npc_escortAI, (Taretha->AI()))->Start(false, true, PlayerGUID);
}
//kill credit creature for quest
@@ -537,7 +537,7 @@ bool GossipSelect_npc_thrall_old_hillsbrad(Player *player, Creature *_Creature,
DoScriptText(SAY_TH_START_EVENT_PART1, _Creature);
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(true, true, true, player->GetGUID());
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(true, true, player->GetGUID());
CAST_AI(npc_escortAI, (_Creature->AI()))->SetMaxPlayerDistance(100.0f);//not really needed, because it will not despawn if player is too far
CAST_AI(npc_escortAI, (_Creature->AI()))->SetDespawnAtEnd(false);
CAST_AI(npc_escortAI, (_Creature->AI()))->SetDespawnAtFar(false);
@@ -156,7 +156,7 @@ bool QuestAccept_npc_prospector_remtravel(Player* pPlayer, Creature* pCreature,
{
if(pQuest->GetQuestId() == QUEST_ABSENT_MINDED_PT2)
{
CAST_AI(npc_escortAI, pCreature->AI())->Start(false, true, false, pPlayer->GetGUID());
CAST_AI(npc_escortAI, pCreature->AI())->Start(false, false, pPlayer->GetGUID());
pCreature->setFaction(FACTION_ESCORTEE);
}
@@ -659,7 +659,7 @@ bool QuestAccept_npc_koltira_deathweaver(Player* pPlayer, Creature* pCreature, c
if (pQuest->GetQuestId() == QUEST_BREAKOUT)
{
pCreature->SetStandState(UNIT_STAND_STATE_STAND);
CAST_AI(npc_escortAI,pCreature->AI())->Start(false, true, false, pPlayer->GetGUID());
CAST_AI(npc_escortAI,pCreature->AI())->Start(false, false, pPlayer->GetGUID());
}
return true;
}
@@ -771,13 +771,6 @@ struct TRINITY_DLL_DECL npc_unworthy_initiateAI : public ScriptedAI
events.ScheduleEvent(EVENT_DEATH_COIL, 5000, GCD_CAST);
}
void JustDied(Unit *killer)
{
if(m_creature->GetEntry() != 29519)
if(killer->GetTypeId() == TYPEID_PLAYER)
CAST_PLR(killer)->KilledMonsterCredit(29519,m_creature->GetGUID());
}
void MovementInform(uint32 type, uint32 id)
{
if(type != POINT_MOTION_TYPE)
@@ -111,7 +111,7 @@ bool GossipSelect_npc_prospector_anvilward(Player *player, Creature *_Creature,
break;
case GOSSIP_ACTION_INFO_DEF+2:
player->CLOSE_GOSSIP_MENU();
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(true, true, false, player->GetGUID());
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(true, false, player->GetGUID());
break;
}
return true;
@@ -190,7 +190,7 @@ bool QuestAccept_npc_oox22fe(Player* pPlayer, Creature* pCreature, const Quest*
if (pPlayer->GetTeam() == HORDE)
pCreature->setFaction(FACTION_ESCORTEE_H);
CAST_AI(npc_escortAI, (pCreature->AI()))->Start(true, true, false, pPlayer->GetGUID());
CAST_AI(npc_escortAI, (pCreature->AI()))->Start(true, false, pPlayer->GetGUID());
}
return true;
@@ -246,7 +246,7 @@ bool QuestAccept_npc_ranger_lilatha(Player* player, Creature* creature, Quest co
if (quest->GetQuestId() == QUEST_ESCAPE_FROM_THE_CATACOMBS)
{
creature->setFaction(113);
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, false, player->GetGUID());
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
}
return true;
}
@@ -16,7 +16,7 @@
/* ScriptData
SDName: Boss_Gruul
SD%Complete: 25
SD%Complete: 50
SDComment: Ground Slam seriously messed up due to core problem
SDCategory: Gruul's Lair
EndScriptData */
@@ -24,30 +24,34 @@ EndScriptData */
#include "precompiled.h"
#include "def_gruuls_lair.h"
#define SAY_AGGRO -1565010
#define SAY_SLAM1 -1565011
#define SAY_SLAM2 -1565012
#define SAY_SHATTER1 -1565013
#define SAY_SHATTER2 -1565014
#define SAY_SLAY1 -1565015
#define SAY_SLAY2 -1565016
#define SAY_SLAY3 -1565017
#define SAY_DEATH -1565018
#define EMOTE_GROW -1565019
enum
{
SAY_AGGRO = -1565010,
SAY_SLAM1 = -1565011,
SAY_SLAM2 = -1565012,
SAY_SHATTER1 = -1565013,
SAY_SHATTER2 = -1565014,
SAY_SLAY1 = -1565015,
SAY_SLAY2 = -1565016,
SAY_SLAY3 = -1565017,
SAY_DEATH = -1565018,
#define SPELL_GROWTH 36300
#define SPELL_CAVE_IN 36240
#define SPELL_GROUND_SLAM 33525 //AoE Ground Slam applying Ground Slam to everyone with a script effect (most likely the knock back, we can code it to a set knockback)
#define SPELL_REVERBERATION 36297 //AoE Silence
#define SPELL_SHATTER 33654
EMOTE_GROW = -1565019,
#define SPELL_SHATTER_EFFECT 33671
#define SPELL_HURTFUL_STRIKE 33813
#define SPELL_STONED 33652 //Spell is self cast
#define SPELL_MAGNETIC_PULL 28337
#define SPELL_KNOCK_BACK 24199 //Knockback spell until correct implementation is made
SPELL_GROWTH = 36300,
SPELL_CAVE_IN = 36240,
SPELL_GROUND_SLAM = 33525, //AoE Ground Slam applying Ground Slam to everyone with a script effect (most likely the knock back, we can code it to a set knockback)
SPELL_REVERBERATION = 36297,
SPELL_SHATTER = 33654,
#define SPELL_GRONN_LORDS_GRASP 33572 //Triggered by Ground Slam
SPELL_SHATTER_EFFECT = 33671,
SPELL_HURTFUL_STRIKE = 33813,
SPELL_STONED = 33652, //Spell is self cast by target
SPELL_MAGNETIC_PULL = 28337,
SPELL_KNOCK_BACK = 24199, //Knockback spell until correct implementation is made
SPELL_GRONN_LORDS_GRASP = 33572 //Triggered by Ground Slam
};
struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
{
@@ -231,7 +231,7 @@ bool QuestAccept_npc_wounded_blood_elf(Player* player, Creature* creature, Quest
{
if (quest->GetQuestId() == QUEST_ROAD_TO_FALCON_WATCH)
{
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, false, player->GetGUID());
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
// Change faction so mobs attack
creature->setFaction(775);
}
@@ -99,13 +99,13 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
}
if(pInstance)
pInstance->SetData(DATA_MOROES_EVENT, NOT_STARTED);
pInstance->SetData(TYPE_MOROES, NOT_STARTED);
}
void StartEvent()
{
if(pInstance)
pInstance->SetData(DATA_MOROES_EVENT, IN_PROGRESS);
pInstance->SetData(TYPE_MOROES, IN_PROGRESS);
DoZoneInCombat();
}
@@ -134,7 +134,7 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
DoScriptText(SAY_DEATH, m_creature);
if (pInstance)
pInstance->SetData(DATA_MOROES_EVENT, DONE);
pInstance->SetData(TYPE_MOROES, DONE);
DeSpawnAdds();
@@ -248,7 +248,7 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
if(!UpdateVictim() )
return;
if(pInstance && !pInstance->GetData(DATA_MOROES_EVENT))
if(pInstance && !pInstance->GetData(TYPE_MOROES))
{
EnterEvadeMode();
return;
@@ -346,7 +346,7 @@ struct TRINITY_DLL_DECL boss_moroes_guestAI : public ScriptedAI
void Reset()
{
if(pInstance)
pInstance->SetData(DATA_MOROES_EVENT, NOT_STARTED);
pInstance->SetData(TYPE_MOROES, NOT_STARTED);
}
void AcquireGUID()
@@ -382,7 +382,7 @@ struct TRINITY_DLL_DECL boss_moroes_guestAI : public ScriptedAI
void UpdateAI(const uint32 diff)
{
if(pInstance && !pInstance->GetData(DATA_MOROES_EVENT))
if(pInstance && !pInstance->GetData(TYPE_MOROES))
EnterEvadeMode();
DoMeleeAttackIfReady();
@@ -113,7 +113,7 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
m_creature->setActive(true);
if(pInstance->GetData(DATA_NIGHTBANE_EVENT) == DONE || pInstance->GetData(DATA_NIGHTBANE_EVENT) == IN_PROGRESS)
if(pInstance->GetData(TYPE_NIGHTBANE) == DONE || pInstance->GetData(TYPE_NIGHTBANE) == IN_PROGRESS)
{
m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
m_creature->RemoveCorpse();
@@ -121,7 +121,7 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
else
{
if(pInstance)
pInstance->SetData(DATA_NIGHTBANE_EVENT, NOT_STARTED);
pInstance->SetData(TYPE_NIGHTBANE, NOT_STARTED);
}
HandleTerraceDoors(true);
@@ -145,7 +145,7 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
void EnterCombat(Unit *who)
{
if(pInstance)
pInstance->SetData(DATA_NIGHTBANE_EVENT, IN_PROGRESS);
pInstance->SetData(TYPE_NIGHTBANE, IN_PROGRESS);
HandleTerraceDoors(false);
DoYell(YELL_AGGRO, LANG_UNIVERSAL, NULL);
@@ -160,7 +160,7 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
void JustDied(Unit* killer)
{
if(pInstance)
pInstance->SetData(DATA_NIGHTBANE_EVENT, DONE);
pInstance->SetData(TYPE_NIGHTBANE, DONE);
HandleTerraceDoors(true);
}
@@ -207,7 +207,7 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
phase = 1;
if(pInstance)
pInstance->HandleGameObject(pInstance->GetData64(DATA_GAMEOBJECT_NETHER_DOOR), true);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_NETHER_DOOR), true);
}
void KilledUnit(Unit *victim)
@@ -233,7 +233,7 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
positions.push_back(&InfernalPoints[i]);
if(pInstance)
pInstance->HandleGameObject(pInstance->GetData64(DATA_GAMEOBJECT_NETHER_DOOR), true);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_NETHER_DOOR), true);
}
void EnterCombat(Unit *who)
@@ -241,7 +241,7 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
DoScriptText(SAY_AGGRO, m_creature);
if(pInstance)
pInstance->HandleGameObject(pInstance->GetData64(DATA_GAMEOBJECT_NETHER_DOOR), false); // Open the door leading further in
pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_NETHER_DOOR), false); // Open the door leading further in
}
void InfernalCleanup()
@@ -140,8 +140,8 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
if(pInstance)
{
// Not in progress
pInstance->SetData(DATA_SHADEOFARAN_EVENT, NOT_STARTED);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GAMEOBJECT_LIBRARY_DOOR), true);
pInstance->SetData(TYPE_ARAN, NOT_STARTED);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_LIBRARY_DOOR), true);
}
}
@@ -160,8 +160,8 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
if(pInstance)
{
pInstance->SetData(DATA_SHADEOFARAN_EVENT, DONE);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GAMEOBJECT_LIBRARY_DOOR), true);
pInstance->SetData(TYPE_ARAN, DONE);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_LIBRARY_DOOR), true);
}
}
@@ -176,8 +176,8 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
if(pInstance)
{
pInstance->SetData(DATA_SHADEOFARAN_EVENT, IN_PROGRESS);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GAMEOBJECT_LIBRARY_DOOR), false);
pInstance->SetData(TYPE_ARAN, IN_PROGRESS);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_LIBRARY_DOOR), false);
}
}
@@ -227,7 +227,7 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
{
if(pInstance)
{
pInstance->HandleGameObject(pInstance->GetData64(DATA_GAMEOBJECT_LIBRARY_DOOR), false);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_LIBRARY_DOOR), false);
CloseDoorTimer = 0;
}
}else CloseDoorTimer -= diff;
@@ -200,7 +200,7 @@ struct TRINITY_DLL_DECL boss_terestianAI : public ScriptedAI
ReSummon = false;
if(pInstance)
pInstance->SetData(DATA_TERESTIAN_EVENT, NOT_STARTED);
pInstance->SetData(TYPE_TERESTIAN, NOT_STARTED);
}
void EnterCombat(Unit* who)
@@ -220,7 +220,7 @@ struct TRINITY_DLL_DECL boss_terestianAI : public ScriptedAI
if(Kilrek && !Kilrek->getVictim())
Kilrek->AddThreat(who, 1.0f);
pInstance->SetData(DATA_TERESTIAN_EVENT, IN_PROGRESS);
pInstance->SetData(TYPE_TERESTIAN, IN_PROGRESS);
}else ERROR_INST_DATA(m_creature);
}
@@ -249,7 +249,7 @@ struct TRINITY_DLL_DECL boss_terestianAI : public ScriptedAI
DoScriptText(SAY_DEATH, m_creature);
if(pInstance)
pInstance->SetData(DATA_TERESTIAN_EVENT, DONE);
pInstance->SetData(TYPE_TERESTIAN, DONE);
}
void UpdateAI(const uint32 diff)
@@ -595,9 +595,9 @@ struct TRINITY_DLL_DECL boss_croneAI : public ScriptedAI
if(pInstance)
{
pInstance->SetData(DATA_OPERA_EVENT, DONE);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT), true);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORRIGHT), true);
pInstance->SetData(TYPE_OPERA, DONE);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_STAGEDOORLEFT), true);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_STAGEDOORRIGHT), true);
if (GameObject* pSideEntrance = pInstance->instance->GetGameObject(pInstance->GetData64(DATA_GO_SIDE_ENTRANCE_DOOR)))
pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
@@ -786,9 +786,9 @@ struct TRINITY_DLL_DECL boss_bigbadwolfAI : public ScriptedAI
if(pInstance)
{
pInstance->SetData(DATA_OPERA_EVENT, DONE);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT), true);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORRIGHT), true);
pInstance->SetData(TYPE_OPERA, DONE);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_STAGEDOORLEFT), true);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_STAGEDOORRIGHT), true);
if (GameObject* pSideEntrance = pInstance->instance->GetGameObject(pInstance->GetData64(DATA_GO_SIDE_ENTRANCE_DOOR)))
pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
@@ -1029,9 +1029,9 @@ struct TRINITY_DLL_DECL boss_julianneAI : public ScriptedAI
if(pInstance)
{
pInstance->SetData(DATA_OPERA_EVENT, DONE);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT), true);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORRIGHT), true);
pInstance->SetData(TYPE_OPERA, DONE);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_STAGEDOORLEFT), true);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_STAGEDOORRIGHT), true);
if (GameObject* pSideEntrance = pInstance->instance->GetGameObject(pInstance->GetData64(DATA_GO_SIDE_ENTRANCE_DOOR)))
pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
}
@@ -1120,9 +1120,9 @@ struct TRINITY_DLL_DECL boss_romuloAI : public ScriptedAI
if (pInstance)
{
pInstance->SetData(DATA_OPERA_EVENT, DONE);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT), true);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORRIGHT), true);
pInstance->SetData(TYPE_OPERA, DONE);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_STAGEDOORLEFT), true);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_STAGEDOORRIGHT), true);
if (GameObject* pSideEntrance = pInstance->instance->GetGameObject(pInstance->GetData64(DATA_GO_SIDE_ENTRANCE_DOOR)))
pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
@@ -8,31 +8,34 @@
enum
{
DATA_ATTUMEN_EVENT = 1,
DATA_MOROES_EVENT = 2,
DATA_MAIDENOFVIRTUE_EVENT = 3,
DATA_OPTIONAL_BOSS_EVENT = 4,
DATA_OPERA_EVENT = 5,
DATA_CURATOR_EVENT = 6,
DATA_SHADEOFARAN_EVENT = 7,
DATA_TERESTIAN_EVENT = 8,
DATA_NETHERSPITE_EVENT = 9,
DATA_CHESS_EVENT = 10,
DATA_MALCHEZZAR_EVENT = 11,
DATA_NIGHTBANE_EVENT = 12,
TYPE_ATTUMEN = 1,
TYPE_MOROES = 2,
TYPE_MAIDEN = 3,
TYPE_OPTIONAL_BOSS = 4,
TYPE_OPERA = 5,
TYPE_CURATOR = 6,
TYPE_ARAN = 7,
TYPE_TERESTIAN = 8,
TYPE_NETHERSPITE = 9,
TYPE_CHESS = 10,
TYPE_MALCHEZZAR = 11,
TYPE_NIGHTBANE = 12,
DATA_OPERA_PERFORMANCE = 13,
DATA_OPERA_OZ_DEATHCOUNT = 14,
DATA_KILREK = 15,
DATA_TERESTIAN = 16,
DATA_MOROES = 17,
DATA_GAMEOBJECT_CURTAINS = 18,
DATA_GAMEOBJECT_STAGEDOORLEFT = 19,
DATA_GAMEOBJECT_STAGEDOORRIGHT = 20,
DATA_GAMEOBJECT_LIBRARY_DOOR = 21,
DATA_GAMEOBJECT_MASSIVE_DOOR = 22,
DATA_GAMEOBJECT_NETHER_DOOR = 23,
DATA_GAMEOBJECT_GAME_DOOR = 24,
DATA_GAMEOBJECT_GAME_EXIT_DOOR = 25,
DATA_GO_CURTAINS = 18,
DATA_GO_STAGEDOORLEFT = 19,
DATA_GO_STAGEDOORRIGHT = 20,
DATA_GO_LIBRARY_DOOR = 21,
DATA_GO_MASSIVE_DOOR = 22,
DATA_GO_NETHER_DOOR = 23,
DATA_GO_GAME_DOOR = 24,
DATA_GO_GAME_EXIT_DOOR = 25,
DATA_IMAGE_OF_MEDIVH = 26,
DATA_MASTERS_TERRACE_DOOR_1 = 27,
DATA_MASTERS_TERRACE_DOOR_2 = 28,
@@ -45,24 +45,24 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
{
instance_karazhan(Map* map) : ScriptedInstance(map) {Initialize();}
uint32 Encounters[ENCOUNTERS];
std::string str_data;
uint32 m_auiEncounter[ENCOUNTERS];
std::string strSaveData;
uint32 OperaEvent;
uint32 OzDeathCount;
uint32 m_uiOperaEvent;
uint32 m_uiOzDeathCount;
uint64 CurtainGUID;
uint64 StageDoorLeftGUID;
uint64 StageDoorRightGUID;
uint64 KilrekGUID;
uint64 TerestianGUID;
uint64 MoroesGUID;
uint64 LibraryDoor; // Door at Shade of Aran
uint64 MassiveDoor; // Door at Netherspite
uint64 SideEntranceDoor; // Side Entrance
uint64 GamesmansDoor; // Door before Chess
uint64 GamesmansExitDoor; // Door after Chess
uint64 NetherspaceDoor; // Door at Malchezaar
uint64 m_uiCurtainGUID;
uint64 m_uiStageDoorLeftGUID;
uint64 m_uiStageDoorRightGUID;
uint64 m_uiKilrekGUID;
uint64 m_uiTerestianGUID;
uint64 m_uiMoroesGUID;
uint64 m_uiLibraryDoor; // Door at Shade of Aran
uint64 m_uiMassiveDoor; // Door at Netherspite
uint64 m_uiSideEntranceDoor; // Side Entrance
uint64 m_uiGamesmansDoor; // Door before Chess
uint64 m_uiGamesmansExitDoor; // Door after Chess
uint64 m_uiNetherspaceDoor; // Door at Malchezaar
uint64 MastersTerraceDoor[2];
uint64 ImageGUID;
uint64 DustCoveredChest;
@@ -70,25 +70,26 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
void Initialize()
{
for (uint8 i = 0; i < ENCOUNTERS; ++i)
Encounters[i] = NOT_STARTED;
m_auiEncounter[i] = NOT_STARTED;
OperaEvent = urand(1,3); // 1 - OZ, 2 - HOOD, 3 - RAJ, this never gets altered.
OzDeathCount = 0;
// 1 - OZ, 2 - HOOD, 3 - RAJ, this never gets altered.
m_uiOperaEvent = urand(1,3);
m_uiOzDeathCount = 0;
CurtainGUID = 0;
StageDoorLeftGUID = 0;
StageDoorRightGUID = 0;
m_uiCurtainGUID = 0;
m_uiStageDoorLeftGUID = 0;
m_uiStageDoorRightGUID = 0;
KilrekGUID = 0;
TerestianGUID = 0;
MoroesGUID = 0;
m_uiKilrekGUID = 0;
m_uiTerestianGUID = 0;
m_uiMoroesGUID = 0;
LibraryDoor = 0;
MassiveDoor = 0;
SideEntranceDoor = 0;
GamesmansDoor = 0;
GamesmansExitDoor = 0;
NetherspaceDoor = 0;
m_uiLibraryDoor = 0;
m_uiMassiveDoor = 0;
m_uiSideEntranceDoor = 0;
m_uiGamesmansDoor = 0;
m_uiGamesmansExitDoor = 0;
m_uiNetherspaceDoor = 0;
MastersTerraceDoor[0]= 0;
MastersTerraceDoor[1]= 0;
ImageGUID = 0;
@@ -98,115 +99,68 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < ENCOUNTERS; ++i)
if (Encounters[i] == IN_PROGRESS)
if (m_auiEncounter[i] == IN_PROGRESS)
return true;
return false;
}
uint32 GetData(uint32 identifier)
{
switch (identifier)
{
case DATA_ATTUMEN_EVENT: return Encounters[0];
case DATA_MOROES_EVENT: return Encounters[1];
case DATA_MAIDENOFVIRTUE_EVENT: return Encounters[2];
case DATA_OPTIONAL_BOSS_EVENT: return Encounters[3];
case DATA_OPERA_EVENT: return Encounters[4];
case DATA_CURATOR_EVENT: return Encounters[5];
case DATA_SHADEOFARAN_EVENT: return Encounters[6];
case DATA_TERESTIAN_EVENT: return Encounters[7];
case DATA_NETHERSPITE_EVENT: return Encounters[8];
case DATA_CHESS_EVENT: return Encounters[9];
case DATA_MALCHEZZAR_EVENT: return Encounters[10];
case DATA_NIGHTBANE_EVENT: return Encounters[11];
case DATA_OPERA_PERFORMANCE: return OperaEvent;
case DATA_OPERA_OZ_DEATHCOUNT: return OzDeathCount;
case DATA_IMAGE_OF_MEDIVH: return ImageGUID;
}
return 0;
}
void OnCreatureCreate(Creature *creature, bool add)
{
switch (creature->GetEntry())
{
case 17229: KilrekGUID = creature->GetGUID(); break;
case 15688: TerestianGUID = creature->GetGUID(); break;
case 15687: MoroesGUID = creature->GetGUID(); break;
case 17229: m_uiKilrekGUID = creature->GetGUID(); break;
case 15688: m_uiTerestianGUID = creature->GetGUID(); break;
case 15687: m_uiMoroesGUID = creature->GetGUID(); break;
}
}
uint64 GetData64(uint32 data)
void SetData(uint32 type, uint32 uiData)
{
switch (data)
switch (type)
{
case DATA_KILREK: return KilrekGUID;
case DATA_TERESTIAN: return TerestianGUID;
case DATA_MOROES: return MoroesGUID;
case DATA_GAMEOBJECT_STAGEDOORLEFT: return StageDoorLeftGUID;
case DATA_GAMEOBJECT_STAGEDOORRIGHT: return StageDoorRightGUID;
case DATA_GAMEOBJECT_CURTAINS: return CurtainGUID;
case DATA_GAMEOBJECT_LIBRARY_DOOR: return LibraryDoor;
case DATA_GAMEOBJECT_MASSIVE_DOOR: return MassiveDoor;
case DATA_GO_SIDE_ENTRANCE_DOOR: return SideEntranceDoor;
case DATA_GAMEOBJECT_GAME_DOOR: return GamesmansDoor;
case DATA_GAMEOBJECT_GAME_EXIT_DOOR: return GamesmansExitDoor;
case DATA_GAMEOBJECT_NETHER_DOOR: return NetherspaceDoor;
case DATA_MASTERS_TERRACE_DOOR_1: return MastersTerraceDoor[0];
case DATA_MASTERS_TERRACE_DOOR_2: return MastersTerraceDoor[1];
}
return 0;
}
void SetData(uint32 type, uint32 data)
{
switch (type)
{
case DATA_ATTUMEN_EVENT: Encounters[0] = data; break;
case DATA_MOROES_EVENT:
if (Encounters[1] == DONE)
case TYPE_ATTUMEN: m_auiEncounter[0] = uiData; break;
case TYPE_MOROES:
if (m_auiEncounter[1] == DONE)
break;
Encounters[1] = data;
m_auiEncounter[1] = uiData;
break;
case DATA_MAIDENOFVIRTUE_EVENT: Encounters[2] = data; break;
case DATA_OPTIONAL_BOSS_EVENT: Encounters[3] = data; break;
case DATA_OPERA_EVENT: Encounters[4] = data; break;
case DATA_CURATOR_EVENT: Encounters[5] = data; break;
case DATA_SHADEOFARAN_EVENT: Encounters[6] = data; break;
case DATA_TERESTIAN_EVENT: Encounters[7] = data; break;
case DATA_NETHERSPITE_EVENT: Encounters[8] = data; break;
case DATA_CHESS_EVENT:
if (data == DONE)
case TYPE_MAIDEN: m_auiEncounter[2] = uiData; break;
case TYPE_OPTIONAL_BOSS: m_auiEncounter[3] = uiData; break;
case TYPE_OPERA: m_auiEncounter[4] = uiData; break;
case TYPE_CURATOR: m_auiEncounter[5] = uiData; break;
case TYPE_ARAN: m_auiEncounter[6] = uiData; break;
case TYPE_TERESTIAN: m_auiEncounter[7] = uiData; break;
case TYPE_NETHERSPITE: m_auiEncounter[8] = uiData; break;
case TYPE_CHESS:
if (uiData == DONE)
DoRespawnGameObject(DustCoveredChest,DAY);
Encounters[9] = data;
m_auiEncounter[9] = uiData;
break;
case DATA_MALCHEZZAR_EVENT: Encounters[10] = data; break;
case DATA_NIGHTBANE_EVENT:
if (Encounters[11] == DONE)
case TYPE_MALCHEZZAR: m_auiEncounter[10] = uiData; break;
case TYPE_NIGHTBANE: m_auiEncounter[11] = uiData; break;
if (m_auiEncounter[11] == DONE)
break;
Encounters[11] = data;
m_auiEncounter[11] = uiData;
break;
case DATA_OPERA_OZ_DEATHCOUNT:
if (data == SPECIAL)
++OzDeathCount;
else if (data == IN_PROGRESS)
OzDeathCount = 0;
if (uiData == SPECIAL)
++m_uiOzDeathCount;
else if (uiData == IN_PROGRESS)
m_uiOzDeathCount = 0;
break;
}
if(data == DONE)
if(uiData == DONE)
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << Encounters[0] << " " << Encounters[1] << " " << Encounters[2] << " "
<< Encounters[3] << " " << Encounters[4] << " " << Encounters[5] << " " << Encounters[6] << " "
<< Encounters[7] << " " << Encounters[8] << " " << Encounters[9] << " " << Encounters[10] << " " << Encounters[11];
saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " "
<< m_auiEncounter[3] << " " << m_auiEncounter[4] << " " << m_auiEncounter[5] << " " << m_auiEncounter[6] << " "
<< m_auiEncounter[7] << " " << m_auiEncounter[8] << " " << m_auiEncounter[9] << " " << m_auiEncounter[10] << " " << m_auiEncounter[11];
str_data = saveStream.str();
strSaveData = saveStream.str();
SaveToDB();
OUT_SAVE_INST_DATA_COMPLETE;
@@ -225,19 +179,27 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
{
switch(go->GetEntry())
{
case 183932: CurtainGUID = go->GetGUID(); break;
case 184278: StageDoorLeftGUID = go->GetGUID(); break;
case 184279: StageDoorRightGUID = go->GetGUID(); break;
case 184517: LibraryDoor = go->GetGUID(); break;
case 185521: MassiveDoor = go->GetGUID(); break;
case 184276: GamesmansDoor = go->GetGUID(); break;
case 184277: GamesmansExitDoor = go->GetGUID(); break;
case 185134: NetherspaceDoor = go->GetGUID(); break;
case 183932: m_uiCurtainGUID = go->GetGUID(); break;
case 184278:
m_uiStageDoorLeftGUID = go->GetGUID();
if (m_auiEncounter[4] == DONE)
go->SetGoState(GO_STATE_ACTIVE);
break;
case 184279:
m_uiStageDoorRightGUID = go->GetGUID();
if (m_auiEncounter[4] == DONE)
go->SetGoState(GO_STATE_ACTIVE);
break;
case 184517: m_uiLibraryDoor = go->GetGUID(); break;
case 185521: m_uiMassiveDoor = go->GetGUID(); break;
case 184276: m_uiGamesmansDoor = go->GetGUID(); break;
case 184277: m_uiGamesmansExitDoor = go->GetGUID(); break;
case 185134: m_uiNetherspaceDoor = go->GetGUID(); break;
case 184274: MastersTerraceDoor[0] = go->GetGUID(); break;
case 184280: MastersTerraceDoor[1] = go->GetGUID(); break;
case 184275:
SideEntranceDoor = go->GetGUID();
if (GetData(DATA_OPERA_EVENT) != DONE)
m_uiSideEntranceDoor = go->GetGUID();
if (m_auiEncounter[4] == DONE)
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
else
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
@@ -245,7 +207,7 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
case 185119: DustCoveredChest = go->GetGUID(); break;
}
switch(OperaEvent)
switch(m_uiOperaEvent)
{
//TODO: Set Object visibilities for Opera based on performance
case EVENT_OZ:
@@ -261,25 +223,73 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
std::string GetSaveData()
{
return str_data;
return strSaveData;
}
void Load(const char* in)
uint32 GetData(uint32 uiData)
{
if(!in)
switch (uiData)
{
case TYPE_ATTUMEN: return m_auiEncounter[0];
case TYPE_MOROES: return m_auiEncounter[1];
case TYPE_MAIDEN: return m_auiEncounter[2];
case TYPE_OPTIONAL_BOSS: return m_auiEncounter[3];
case TYPE_OPERA: return m_auiEncounter[4];
case TYPE_CURATOR: return m_auiEncounter[5];
case TYPE_ARAN: return m_auiEncounter[6];
case TYPE_TERESTIAN: return m_auiEncounter[7];
case TYPE_NETHERSPITE: return m_auiEncounter[8];
case TYPE_CHESS: return m_auiEncounter[9];
case TYPE_MALCHEZZAR: return m_auiEncounter[10];
case TYPE_NIGHTBANE: return m_auiEncounter[11];
case DATA_OPERA_PERFORMANCE: return m_uiOperaEvent;
case DATA_OPERA_OZ_DEATHCOUNT: return m_uiOzDeathCount;
case DATA_IMAGE_OF_MEDIVH: return ImageGUID;
}
return 0;
}
uint64 GetData64(uint32 uiData)
{
switch (uiData)
{
case DATA_KILREK: return m_uiKilrekGUID;
case DATA_TERESTIAN: return m_uiTerestianGUID;
case DATA_MOROES: return m_uiMoroesGUID;
case DATA_GO_STAGEDOORLEFT: return m_uiStageDoorLeftGUID;
case DATA_GO_STAGEDOORRIGHT: return m_uiStageDoorRightGUID;
case DATA_GO_CURTAINS: return m_uiCurtainGUID;
case DATA_GO_LIBRARY_DOOR: return m_uiLibraryDoor;
case DATA_GO_MASSIVE_DOOR: return m_uiMassiveDoor;
case DATA_GO_SIDE_ENTRANCE_DOOR: return m_uiSideEntranceDoor;
case DATA_GO_GAME_DOOR: return m_uiGamesmansDoor;
case DATA_GO_GAME_EXIT_DOOR: return m_uiGamesmansExitDoor;
case DATA_GO_NETHER_DOOR: return m_uiNetherspaceDoor;
case DATA_MASTERS_TERRACE_DOOR_1: return MastersTerraceDoor[0];
case DATA_MASTERS_TERRACE_DOOR_2: return MastersTerraceDoor[1];
}
return 0;
}
void Load(const char* chrIn)
{
if (!chrIn)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
std::istringstream loadStream(in);
loadStream >> Encounters[0] >> Encounters[1] >> Encounters[2] >> Encounters[3]
>> Encounters[4] >> Encounters[5] >> Encounters[6] >> Encounters[7]
>> Encounters[8] >> Encounters[9] >> Encounters[10] >> Encounters[11];
OUT_LOAD_INST_DATA(chrIn);
std::istringstream loadStream(chrIn);
loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3]
>> m_auiEncounter[4] >> m_auiEncounter[5] >> m_auiEncounter[6] >> m_auiEncounter[7]
>> m_auiEncounter[8] >> m_auiEncounter[9] >> m_auiEncounter[10] >> m_auiEncounter[11];
for(uint8 i = 0; i < ENCOUNTERS; ++i)
if(Encounters[i] == IN_PROGRESS) // Do not load an encounter as "In Progress" - reset it instead.
Encounters[i] = NOT_STARTED;
if(m_auiEncounter[i] == IN_PROGRESS) // Do not load an encounter as "In Progress" - reset it instead.
m_auiEncounter[i] = NOT_STARTED;
OUT_LOAD_INST_DATA_COMPLETE;
}
};
@@ -91,16 +91,6 @@ float Spawns[6][2]=
{17534, -10900}, // Julianne
};
float StageLocations[6][2]=
{
{-10866.711, -1779.816}, // Open door, begin walking (0)
{-10894.917, -1775.467}, // (1)
{-10896.044, -1782.619}, // Begin Speech after this (2)
{-10894.917, -1775.467}, // Resume walking (back to spawn point now) after speech (3)
{-10866.711, -1779.816}, // (4)
{-10866.700, -1781.030} // Summon mobs, open curtains, close door (5)
};
#define CREATURE_SPOTLIGHT 19525
#define SPELL_SPOTLIGHT 25824
@@ -115,72 +105,83 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
npc_barnesAI(Creature* c) : npc_escortAI(c)
{
RaidWiped = false;
m_uiEventId = 0;
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance;
uint64 SpotlightGUID;
uint64 m_uiSpotlightGUID;
uint32 TalkCount;
uint32 TalkTimer;
uint32 CurtainTimer;
uint32 WipeTimer;
uint32 Event;
uint32 m_uiEventId;
bool PerformanceReady;
bool RaidWiped;
bool IsTalking;
void Reset()
{
m_uiSpotlightGUID = 0;
TalkCount = 0;
TalkTimer = 2000;
CurtainTimer = 5000;
WipeTimer = 5000;
PerformanceReady = false;
IsTalking = false;
if(pInstance)
{
pInstance->SetData(DATA_OPERA_EVENT, NOT_STARTED);
m_uiEventId = pInstance->GetData(DATA_OPERA_PERFORMANCE);
}
Event = pInstance->GetData(DATA_OPERA_PERFORMANCE);
void StartEvent()
{
if (!pInstance)
return;
pInstance->HandleGameObject(pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT), false);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GAMEOBJECT_CURTAINS), false);
}
pInstance->SetData(TYPE_OPERA, IN_PROGRESS);
//resets count for this event, in case earlier failed
if (m_uiEventId == EVENT_OZ)
pInstance->SetData(DATA_OPERA_OZ_DEATHCOUNT, IN_PROGRESS);
Start(false, false);
}
void EnterCombat(Unit* who) {}
void WaypointReached(uint32 i)
{
if (!pInstance)
return;
switch(i)
{
case 2:
IsBeingEscorted = false;
case 0:
m_creature->CastSpell(m_creature, SPELL_TUXEDO, false);
pInstance->DoUseDoorOrButton(pInstance->GetData64(DATA_GO_STAGEDOORLEFT));
break;
case 4:
TalkCount = 0;
IsTalking = true;
IsOnHold = true;
float x,y,z;
m_creature->GetPosition(x, y, z);
if (Creature* Spotlight = m_creature->SummonCreature(CREATURE_SPOTLIGHT, x, y, z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 50000))
if (Creature* pSpotlight = m_creature->SummonCreature(CREATURE_SPOTLIGHT,
m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 0.0f,
TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000))
{
Spotlight->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
Spotlight->CastSpell(Spotlight, SPELL_SPOTLIGHT, false);
SpotlightGUID = Spotlight->GetGUID();
pSpotlight->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
pSpotlight->CastSpell(pSpotlight, SPELL_SPOTLIGHT, false);
m_uiSpotlightGUID = pSpotlight->GetGUID();
}
break;
case 5:
if(pInstance)
pInstance->HandleGameObject(pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT), false);
IsBeingEscorted = false;
case 8:
pInstance->DoUseDoorOrButton(pInstance->GetData64(DATA_GO_STAGEDOORLEFT));
PerformanceReady = true;
m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
break;
case 9:
PrepareEncounter();
pInstance->DoUseDoorOrButton(pInstance->GetData64(DATA_GO_CURTAINS));
break;
}
}
@@ -189,7 +190,7 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
{
int32 text = 0;
switch(Event)
switch(m_uiEventId)
{
case EVENT_OZ:
if (OzDialogue[count].textid)
@@ -217,52 +218,70 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
DoScriptText(text, m_creature);
}
void PrepareEncounter()
{
debug_log("TSCR: Barnes Opera Event - Introduction complete - preparing encounter %d", m_uiEventId);
uint8 index = 0;
uint8 count = 0;
switch(m_uiEventId)
{
case EVENT_OZ:
index = 0;
count = 4;
break;
case EVENT_HOOD:
index = 4;
count = index+1;
break;
case EVENT_RAJ:
index = 5;
count = index+1;
break;
}
for(; index < count; ++index)
{
uint32 entry = ((uint32)Spawns[index][0]);
float PosX = Spawns[index][1];
if (Creature* pCreature = m_creature->SummonCreature(entry, PosX, SPAWN_Y, SPAWN_Z, SPAWN_O, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, HOUR*2*IN_MILISECONDS))
{
// In case database has bad flags
pCreature->SetUInt32Value(UNIT_FIELD_FLAGS, 0);
pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
}
RaidWiped = false;
}
void UpdateAI(const uint32 diff)
{
npc_escortAI::UpdateAI(diff);
if(IsTalking)
if(IsOnHold)
{
if(TalkTimer < diff)
{
if(TalkCount > 3)
{
if (Unit* Spotlight = Unit::GetUnit((*m_creature), SpotlightGUID))
{
Spotlight->RemoveAllAuras();
Spotlight->SetVisibility(VISIBILITY_OFF);
}
if (Creature* pSpotlight = Unit::GetCreature(*m_creature, m_uiSpotlightGUID))
pSpotlight->ForcedDespawn();
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_STAND);
IsTalking = false;
IsBeingEscorted = true;
IsOnHold = false;
return;
}
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_TALK);
Talk(TalkCount);
++TalkCount;
}else TalkTimer -= diff;
}
else
TalkTimer -= diff;
}
if(PerformanceReady)
{
if(CurtainTimer)
{
if(CurtainTimer <= diff)
{
PrepareEncounter();
if(!pInstance)
return;
if (GameObject* Curtain = pInstance->instance->GetGameObject(pInstance->GetData64(DATA_GAMEOBJECT_CURTAINS)))
Curtain->SetGoState(GO_STATE_ACTIVE);
CurtainTimer = 0;
}else CurtainTimer -= diff;
}
if(!RaidWiped)
{
if(WipeTimer < diff)
@@ -297,103 +316,53 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
}
}
void StartEvent()
{
if(!pInstance)
return;
pInstance->SetData(DATA_OPERA_EVENT, IN_PROGRESS);
//resets count for this event, in case earlier failed
if (Event == EVENT_OZ)
pInstance->SetData(DATA_OPERA_OZ_DEATHCOUNT, IN_PROGRESS);
pInstance->HandleGameObject(pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT), true);
m_creature->CastSpell(m_creature, SPELL_TUXEDO, true);
m_creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
Start(false, false, false);
}
void PrepareEncounter()
{
debug_log("TSCR: Barnes Opera Event - Introduction complete - preparing encounter %d", Event);
uint8 index = 0;
uint8 count = 0;
switch(Event)
{
case EVENT_OZ:
index = 0;
count = 4;
break;
case EVENT_HOOD:
index = 4;
count = index+1;
break;
case EVENT_RAJ:
index = 5;
count = index+1;
break;
}
for( ; index < count; ++index)
{
uint32 entry = ((uint32)Spawns[index][0]);
float PosX = Spawns[index][1];
if (Creature* pCreature = m_creature->SummonCreature(entry, PosX, SPAWN_Y, SPAWN_Z, SPAWN_O, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, HOUR*2*IN_MILISECONDS))
{
// In case database has bad flags
pCreature->SetUInt32Value(UNIT_FIELD_FLAGS, 0);
pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
}
CurtainTimer = 10000;
PerformanceReady = true;
RaidWiped = false;
}
};
CreatureAI* GetAI_npc_barnesAI(Creature* _Creature)
{
npc_barnesAI* Barnes_AI = new npc_barnesAI(_Creature);
for(uint8 i = 0; i < 6; ++i)
Barnes_AI->AddWaypoint(i, StageLocations[i][0], StageLocations[i][1], 90.465);
Barnes_AI->FillPointMovementListForCreature();
return (Barnes_AI);
return (CreatureAI*)Barnes_AI;
}
bool GossipHello_npc_barnes(Player* player, Creature* _Creature)
bool GossipHello_npc_barnes(Player* pPlayer, Creature* pCreature)
{
// Check for death of Moroes.
ScriptedInstance* pInstance = (_Creature->GetInstanceData());
if(pInstance && (pInstance->GetData(DATA_MOROES_EVENT) >= DONE))
if (ScriptedInstance* pInstance = (ScriptedInstance*)pCreature->GetInstanceData())
{
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, OZ_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
if (player->isGameMaster())
// Check for death of Moroes and if opera event is not done already
if (pInstance->GetData(TYPE_MOROES) == DONE && pInstance->GetData(TYPE_OPERA) != DONE)
{
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_DOT, OZ_GM_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_DOT, OZ_GM_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_DOT, OZ_GM_GOSSIP3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, OZ_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
if (pPlayer->isGameMaster())
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_DOT, OZ_GM_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_DOT, OZ_GM_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_DOT, OZ_GM_GOSSIP3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
}
if (npc_barnesAI* pBarnesAI = CAST_AI(npc_barnesAI,pCreature->AI()))
{
if (!pBarnesAI->RaidWiped)
pPlayer->SEND_GOSSIP_MENU(8970, pCreature->GetGUID());
else
pPlayer->SEND_GOSSIP_MENU(8975, pCreature->GetGUID());
return true;
}
}
}
if(!CAST_AI(npc_barnesAI, _Creature->AI())->RaidWiped)
player->SEND_GOSSIP_MENU(8970, _Creature->GetGUID());
else
player->SEND_GOSSIP_MENU(8975, _Creature->GetGUID());
}else player->SEND_GOSSIP_MENU(8978, _Creature->GetGUID());
pPlayer->SEND_GOSSIP_MENU(8978, pCreature->GetGUID());
return true;
}
bool GossipSelect_npc_barnes(Player *player, Creature *_Creature, uint32 sender, uint32 action)
{
npc_barnesAI* pBarnesAI = CAST_AI(npc_barnesAI,_Creature->AI());
switch(action)
{
case GOSSIP_ACTION_INFO_DEF+1:
@@ -402,21 +371,21 @@ bool GossipSelect_npc_barnes(Player *player, Creature *_Creature, uint32 sender,
break;
case GOSSIP_ACTION_INFO_DEF+2:
player->CLOSE_GOSSIP_MENU();
CAST_AI(npc_barnesAI, _Creature->AI())->StartEvent();
pBarnesAI->StartEvent();
break;
case GOSSIP_ACTION_INFO_DEF+3:
player->CLOSE_GOSSIP_MENU();
CAST_AI(npc_barnesAI, _Creature->AI())->Event = EVENT_OZ;
pBarnesAI->m_uiEventId = EVENT_OZ;
outstring_log("TSCR: player (GUID %i) manually set Opera event to EVENT_OZ",player->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+4:
player->CLOSE_GOSSIP_MENU();
CAST_AI(npc_barnesAI, _Creature->AI())->Event = EVENT_HOOD;
pBarnesAI->m_uiEventId = EVENT_HOOD;
outstring_log("TSCR: player (GUID %i) manually set Opera event to EVENT_HOOD",player->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+5:
player->CLOSE_GOSSIP_MENU();
CAST_AI(npc_barnesAI, _Creature->AI())->Event = EVENT_RAJ;
pBarnesAI->m_uiEventId = EVENT_RAJ;
outstring_log("TSCR: player (GUID %i) manually set Opera event to EVENT_RAJ",player->GetGUID());
break;
}
@@ -428,18 +397,23 @@ bool GossipSelect_npc_barnes(Player *player, Creature *_Creature, uint32 sender,
# npc_berthold
####*/
#define SPELL_TELEPORT 39567
#define GOSSIP_ITEM_TELEPORT "Teleport me to the Guardian's Library"
bool GossipHello_npc_berthold(Player* player, Creature* _Creature)
enum
{
ScriptedInstance* pInstance = (_Creature->GetInstanceData());
// Check if Shade of Aran is dead or not
if(pInstance && (pInstance->GetData(DATA_SHADEOFARAN_EVENT) >= DONE))
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_TELEPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
SPELL_TELEPORT = 39567
};
player->SEND_GOSSIP_MENU(_Creature->GetNpcTextId(), _Creature->GetGUID());
#define GOSSIP_ITEM_TELEPORT "Teleport me to the Guardian's Library"
bool GossipHello_npc_berthold(Player* pPlayer, Creature* pCreature)
{
if (ScriptedInstance* pInstance = (ScriptedInstance*)pCreature->GetInstanceData())
{
// Check if Shade of Aran event is done
if (pInstance->GetData(TYPE_ARAN) == DONE)
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_TELEPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
}
pPlayer->SEND_GOSSIP_MENU(pCreature->GetNpcTextId(), pCreature->GetGUID());
return true;
}
@@ -329,7 +329,7 @@ public:
AddWaypoint(i, Clintar_spirit_WP[i][0], Clintar_spirit_WP[i][1], Clintar_spirit_WP[i][2], (uint32)Clintar_spirit_WP[i][4]);
}
PlayerGUID = player->GetGUID();
Start(true,true,false,PlayerGUID);
Start(true,false,PlayerGUID);
}
return;
}
@@ -876,7 +876,7 @@ bool QuestAccept_npc_bessy(Player* player, Creature* creature, Quest const* ques
{
creature->setFaction(113);
creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, false, player->GetGUID());
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
}
return true;
}
@@ -131,7 +131,7 @@ bool QuestAccept_npc_willix(Player* player, Creature* creature, Quest const* que
{
if (quest->GetQuestId() == QUEST_WILLIX_THE_IMPORTER)
{
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, false, player->GetGUID());
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
DoScriptText(SAY_READY, creature, player);
creature->setFaction(113);
}
@@ -129,7 +129,7 @@ struct TRINITY_DLL_DECL mob_scarlet_traineeAI : public npc_escortAI
{
if (Start_Timer < diff)
{
Start(true,true,true);
Start(true,true);
Start_Timer = 0;
}else Start_Timer -= diff;
}
@@ -126,7 +126,7 @@ bool GossipSelect_npc_shadowfang_prisoner(Player* pPlayer, Creature* pCreature,
if (uiAction == GOSSIP_ACTION_INFO_DEF+1)
{
pPlayer->CLOSE_GOSSIP_MENU();
CAST_AI(npc_escortAI, (pCreature->AI()))->Start(false, true, false);
CAST_AI(npc_escortAI, (pCreature->AI()))->Start(false, false);
}
return true;
}
@@ -1059,7 +1059,7 @@ bool QuestAccept_npc_earthmender_wilda(Player* player, Creature* creature, Quest
if (quest->GetQuestId() == QUEST_ESCAPE_FROM_COILSKAR_CISTERN)
{
creature->setFaction(113);
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, false, player->GetGUID());
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
}
return true;
}
@@ -341,7 +341,7 @@ public:
float Radius = 10.0;
if( m_creature->IsWithinDistInMap(who, Radius) )
{
Start(false, false, false, who->GetGUID());
Start(false, false, who->GetGUID());
}
}
}
@@ -135,7 +135,7 @@ bool GossipSelect_npc_injured_rainspeaker_oracle(Player *player, Creature *_Crea
{
if( action == GOSSIP_ACTION_INFO_DEF+1 )
{
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(true, true, false, player->GetGUID());
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(true, false, player->GetGUID());
CAST_AI(npc_escortAI, (_Creature->AI()))->SetMaxPlayerDistance(35.0f);
_Creature->SetUnitMovementFlags(MOVEMENTFLAG_JUMPING);
DoScriptText(SAY_START_IRO,_Creature);
@@ -171,7 +171,7 @@ bool QuestAccept_npc_deathstalker_erland(Player* player, Creature* creature, Que
if (quest->GetQuestId() == QUEST_ESCORTING)
{
DoScriptText(SAY_QUESTACCEPT, creature, player);
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, false, player->GetGUID());
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
}
return true;
@@ -151,7 +151,7 @@ bool QuestAccept_npc_kaya_flathoof(Player* player, Creature* creature, Quest con
{
if (quest->GetQuestId() == QUEST_PROTECT_KAYA)
{
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, false, player->GetGUID());
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
DoScriptText(SAY_START, creature);
creature->setFaction(113);
creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
@@ -196,7 +196,7 @@ struct TRINITY_DLL_DECL npc_custodian_of_timeAI : public npc_escortAI
float Radius = 10.0;
if( m_creature->IsWithinDistInMap(who, Radius) )
{
Start(false, false, false, who->GetGUID());
Start(false, false, who->GetGUID());
}
}
}
@@ -435,7 +435,7 @@ bool QuestAccept_npc_OOX17(Player* player, Creature* creature, Quest const* ques
creature->SetUInt32Value(UNIT_FIELD_BYTES_1,0);
creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
DoScriptText(SAY_CHICKEN_ACC, creature);
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, false, player->GetGUID());
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
}
return true;
@@ -205,7 +205,7 @@ public:
float Radius = 10.0;
if( m_creature->IsWithinDistInMap(who, Radius) )
{
Start(false, false, false, who->GetGUID());
Start(false, false, who->GetGUID());
}
}
}
@@ -484,7 +484,7 @@ bool QuestAccept_npc_isla_starmane(Player* player, Creature* creature, Quest con
{
if (quest->GetQuestId() == QUEST_EFTW_H || quest->GetQuestId() == QUEST_EFTW_A)
{
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, false, player->GetGUID());
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
creature->setFaction(113);
}
return true;
@@ -101,7 +101,7 @@ bool QuestAccept_npc_swiftmountain(Player* player, Creature* creature, Quest con
{
if (quest->GetQuestId() == QUEST_HOMEWARD_BOUND)
{
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, false, player->GetGUID());
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
DoScriptText(SAY_READY, creature, player);
creature->setFaction(113);
}
@@ -124,7 +124,7 @@ bool QuestAccept_npc_ame(Player* player, Creature* creature, Quest const* quest)
{
if (quest->GetQuestId() == QUEST_CHASING_AME)
{
CAST_AI(npc_escortAI, (creature->AI()))->Start(false, true, false, player->GetGUID());
CAST_AI(npc_escortAI, (creature->AI()))->Start(false, false, player->GetGUID());
DoScriptText(SAY_READY, creature, player);
creature->SetUInt32Value(UNIT_FIELD_BYTES_1,0);
// Change faction so mobs attack
@@ -193,7 +193,7 @@ struct TRINITY_DLL_DECL npc_disciple_of_naralexAI : public npc_escortAI
eventProgress++;
DoScriptText(SAY_BANISH_THE_SPIRITS, m_creature);
DoCast(m_creature, SPELL_SERPENTINE_CLEANSING);
CAST_AI(npc_escortAI, m_creature->AI())->SetCanDefend(false);
//CAST_AI(npc_escortAI, m_creature->AI())->SetCanDefend(false);
eventTimer = 30000;
m_creature->SummonCreature(NPC_DEVIATE_VIPER, -61.5261, 273.676, -92.8442, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
m_creature->SummonCreature(NPC_DEVIATE_VIPER, -58.4658, 280.799, -92.8393, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
@@ -202,7 +202,7 @@ struct TRINITY_DLL_DECL npc_disciple_of_naralexAI : public npc_escortAI
else
if (eventProgress == 2)
{
CAST_AI(npc_escortAI, m_creature->AI())->SetCanDefend(true);
//CAST_AI(npc_escortAI, m_creature->AI())->SetCanDefend(true);
DoScriptText(SAY_CAVERNS_PURIFIED, m_creature);
pInstance->SetData(TYPE_NARALEX_PART2, DONE);
if (m_creature->HasAura(SPELL_SERPENTINE_CLEANSING))
@@ -222,7 +222,7 @@ struct TRINITY_DLL_DECL npc_disciple_of_naralexAI : public npc_escortAI
{
eventProgress++;
eventTimer = 15000;
CAST_AI(npc_escortAI, m_creature->AI())->SetCanDefend(false);
//CAST_AI(npc_escortAI, m_creature->AI())->SetCanDefend(false);
if (Creature* naralex = pInstance->instance->GetCreature(pInstance->GetData64(DATA_NARALEX)))
DoCast(naralex, SPELL_NARALEXS_AWAKENING, true);
DoScriptText(EMOTE_AWAKENING_RITUAL, m_creature);
@@ -395,7 +395,7 @@ bool GossipSelect_npc_disciple_of_naralex(Player *player, Creature *_Creature, u
_Creature->setFaction(250);
_Creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(false, true, false, player->GetGUID());
CAST_AI(npc_escortAI, (_Creature->AI()))->Start(false, false, player->GetGUID());
CAST_AI(npc_escortAI, (_Creature->AI()))->SetDespawnAtFar(false);
CAST_AI(npc_escortAI, (_Creature->AI()))->SetDespawnAtEnd(false);
}
@@ -175,7 +175,7 @@ bool QuestAccept_npc_daphne_stilwell(Player* pPlayer, Creature* pCreature, const
if (pQuest->GetQuestId() == QUEST_TOME_VALOR)
{
DoScriptText(SAY_DS_START, pCreature);
CAST_AI(npc_escortAI, (pCreature->AI()))->Start(true, true, true, pPlayer->GetGUID());
CAST_AI(npc_escortAI, (pCreature->AI()))->Start(true, true, pPlayer->GetGUID());
}
return true;
@@ -261,7 +261,7 @@ bool QuestAccept_npc_defias_traitor(Player* player, Creature* creature, Quest co
{
if (quest->GetQuestId() == QUEST_DEFIAS_BROTHERHOOD)
{
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, true, player->GetGUID());
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, player->GetGUID());
DoScriptText(SAY_START, creature, player);
}
@@ -338,7 +338,7 @@ bool QuestAccept_npc_kayra_longmane(Player* pPlayer, Creature* pCreature, Quest
if (pQuest->GetQuestId() == QUEST_ESCAPE_FROM)
{
DoScriptText(SAY_START, pCreature, pPlayer);
CAST_AI(npc_escortAI, pCreature->AI())->Start(false, true, false, pPlayer->GetGUID());
CAST_AI(npc_escortAI, pCreature->AI())->Start(false, false, pPlayer->GetGUID());
}
return true;
}