Update Zul Farrak, add pyramid event. thanks to totoro requires db support

--HG--
branch : trunk
This commit is contained in:
Supabad
2010-07-26 11:08:44 +02:00
parent 495bf7df45
commit dbacf82a95
7 changed files with 643 additions and 119 deletions

View File

@@ -1,4 +1,4 @@
-- Up to TC2 5408
-- Up to TC2 5408
--
-- trinityscript_script_texts.sql Contains data for table `script_texts` mainly used in C++ parts.
-- valid entries for table are between -1000000 and -1999999
@@ -303,7 +303,7 @@ INSERT INTO `script_texts` (`npc_entry`,`entry`,`content_default`,`content_loc1`
(10181,-1000358,'Look out! We''re under attack!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,0,0,'KAYA_AMBUSH'),
(17900,-1000359,'Thank you for helping me. I know my way back from here.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,0,0,'KAYA_END'),
(17969,-1000360,'The strands of LIFE have been severed! The Dreamers must be avenged!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,1,0,0,' ysondre SAY_AGGRO'),
(17969,-1000361,'Come forth, ye Dreamers <EFBFBD> and claim your vengeance!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,1,0,0,' ysondre SAY_SUMMONDRUIDS'),
(17969,-1000361,'Come forth, ye Dreamers and claim your vengeance!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,1,0,0,' ysondre SAY_SUMMONDRUIDS'),
(17969,-1000362,'Let''s go $N. I am ready to reach Whitereach Post.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,'paoka SAY_START'),
(17969,-1000363,'Now this looks familiar. If we keep heading east, I think we can... Ahh, Wyvern on the attack!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,'paoka SAY_WYVERN'),
(17969,-1000364,'Thanks a bunch... I can find my way back to Whitereach Post from here. Be sure to talk with Motega Firemane; perhaps you can keep him from sending me home.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,'paoka SAY_COMPLETE'),
@@ -629,6 +629,10 @@ INSERT INTO `script_texts` (`npc_entry`,`entry`,`content_default`,`content_loc1`
(3974,-1189021,'Release the hounds!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,5841,1,0,0,'loksey SAY_AGGRO'),
-- -1 209 000 ZUL'FARRAK
('7607','-1209000','Oh no! Here they come!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','0','1','0','Weegli Blastfuse SAY_WEEGLI_OHNO'),
('7607','-1209001','OK. Here I go.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','0','1','0','Weegli Blastfuse SAY_WEEGLI_OK_I_GO'),
('7604','-1209002','Placeholder 1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','0','1','0','Sergeant Bly SAY_1'),
('7604','-1209003','Placeholder 2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','0','1','0','Sergeant Bly SAY_2');
-- -1 229 000 BLACKROCK SPIRE
@@ -3059,7 +3063,7 @@ INSERT INTO `script_texts` (`npc_entry`,`entry`,`content_default`,`content_loc1`
(29173,-1609283,'%s collapses.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,2,0,0,'Highlord Darion Mograine'),
(29173,-1609284,'%s charges towards the Lich King, Ashbringer in hand and strikes the Lich King.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,2,0,0,'Highlord Tirion Fordring'),
(29173,-1609285,'%s disappears. Tirion walks over to where Darion lay',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,2,0,0,'The Lich King'),
(29173,-1609286,'Light washes over the chapel the Light of Dawn is uncovered.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,2,0,0,''),
(29173,-1609286,'Light washes over the chapel ? the Light of Dawn is uncovered.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,2,0,0,''),
(25504, -1750040, 'My father''s aura is quite strong, he cannot be far. Could you be a doll and fight off the monsters wandering throught the mist?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,0,0, 'npc_mootoo_the_younger'),
(25504, -1750041, 'Watch out for the monsters!Which way should we go first? Let''s try this way...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,0,0, 'npc_mootoo_the_younger'),
(25504, -1750042, 'What could this be?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,0,0, 'npc_mootoo_the_younger'),

View File

@@ -1607,6 +1607,7 @@ UPDATE `creature_template` SET `ScriptName`='npc_weegli_blastfuse' WHERE `entry`
UPDATE `gameobject_template` SET `ScriptName`='go_shallow_grave' WHERE `entry` IN (128308,128403);
INSERT IGNORE INTO `areatrigger_scripts` (`entry`,`ScriptName`) VALUES(962, 'at_zumrah');
UPDATE `gameobject_template` SET `ScriptName`='go_table_theka' WHERE `entry`=142715;
UPDATE `gameobject_template` SET `ScriptName`='go_troll_cage' WHERE `entry`>= 141070 AND `entry`< 141075;
UPDATE `instance_template` SET `script`='instance_zulfarrak' WHERE `map`=209;
/* ZUL'GURUB */

View File

@@ -0,0 +1,7 @@
-- script texts
delete from script_texts where npc_entry in (7607,7604);
insert into `script_texts` (`npc_entry`, `entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`, `sound`, `type`, `language`, `emote`, `comment`) values
('7607','-1209000','Oh no! Here they come!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','0','1','0','Weegli Blastfuse SAY_WEEGLI_OHNO'),
('7607','-1209001','OK. Here I go.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','0','1','0','Weegli Blastfuse SAY_WEEGLI_OK_I_GO'),
('7604','-1209002','Placeholder 1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','0','1','0','Sergeant Bly SAY_1'),
('7604','-1209003','Placeholder 2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','0','1','0','Sergeant Bly SAY_2');

View File

@@ -0,0 +1,2 @@
-- script names
update gameobject_template set scriptName = 'go_troll_cage' where entry >= 141070 and entry < 141075;

View File

@@ -16,14 +16,94 @@
*/
#include "ScriptPCH.h"
#include "zulfarrak.h"
#define NPC_GAHZRILLA 7273
#define PATH_ADDS 81553
int const pyramidSpawnTotal = 54;
/* list of wave spawns: 0 = wave ID, 1 = creature id, 2 = x, 3 = y
no z coordinat b/c they're all the same */
float pyramidSpawns [pyramidSpawnTotal][4] = {
{1,7789,1894.64,1206.29},
{1,7787,1890.08,1218.68},
{1,8876,1883.76,1222.3},
{1,7789,1874.18,1221.24},
{1,7787,1892.28,1225.49},
{1,7788,1889.94,1212.21},
{1,7787,1879.02,1223.06},
{1,7789,1874.45,1204.44},
{1,8876,1898.23,1217.97},
{1,7787,1882.07,1225.7},
{1,8877,1896.46,1205.62},
{1,7787,1886.97,1225.86},
{1,7787,1894.72,1221.91},
{1,7787,1883.5,1218.25},
{1,7787,1886.93,1221.4},
{1,8876,1889.82,1222.51},
{1,7788,1893.07,1215.26},
{1,7788,1878.57,1214.16},
{1,7788,1883.74,1212.35},
{1,8877,1877,1207.27},
{1,8877,1873.63,1204.65},
{1,8876,1877.4,1216.41},
{1,8877,1899.63,1202.52},
{2,7789,1902.83,1223.41},
{2,8876,1889.82,1222.51},
{2,7787,1883.5,1218.25},
{2,7788,1883.74,1212.35},
{2,8877,1877,1207.27},
{2,7787,1890.08,1218.68},
{2,7789,1894.64,1206.29},
{2,8876,1877.4,1216.41},
{2,7787,1892.28,1225.49},
{2,7788,1893.07,1215.26},
{2,8877,1896.46,1205.62},
{2,7789,1874.45,1204.44},
{2,7789,1874.18,1221.24},
{2,7787,1879.02,1223.06},
{2,8876,1898.23,1217.97},
{2,7787,1882.07,1225.7},
{2,8877,1873.63,1204.65},
{2,7787,1886.97,1225.86},
{2,7788,1878.57,1214.16},
{2,7787,1894.72,1221.91},
{2,7787,1886.93,1221.4},
{2,8876,1883.76,1222.3},
{2,7788,1889.94,1212.21},
{2,8877,1899.63,1202.52},
{3,7788,1878.57,1214.16},
{3,7787,1894.72,1221.91},
{3,7787,1886.93,1221.4},
{3,8876,1883.76,1222.3},
{3,7788,1889.94,1212.21},
{3,7275,1889.23,1207.72},
{3,7796,1879.77,1207.96}
};
float Spawnsway[2][3] =
{
{1884.86,1228.62,9},
{1887.53,1263,41}
};
struct instance_zulfarrak : public ScriptedInstance
{
instance_zulfarrak(Map* pMap) : ScriptedInstance(pMap) {Initialize();}
uint32 GahzRillaEncounter;
uint64 ZumrahGUID;
uint64 BlyGUID;
uint64 WeegliGUID;
uint64 OroGUID;
uint64 RavenGUID;
uint64 MurtaGUID;
uint64 EndDoorGUID;
uint32 PyramidPhase;
uint32 major_wave_Timer;
uint32 minor_wave_Timer;
uint32 addGroupSize;
uint32 waypoint;
void Initialize()
{
@@ -32,12 +112,234 @@ struct instance_zulfarrak : public ScriptedInstance
void OnCreatureCreate(Creature* pCreature, bool /*add*/)
{
if (pCreature->GetEntry() == NPC_GAHZRILLA)
switch (pCreature->GetEntry())
{
if (GahzRillaEncounter >= IN_PROGRESS)
pCreature->DisappearAndDie();
else
GahzRillaEncounter = IN_PROGRESS;
case ENTRY_ZUMRAH:
ZumrahGUID = pCreature->GetGUID();
break;
case ENTRY_BLY:
BlyGUID = pCreature->GetGUID();
pCreature->SetReactState(REACT_PASSIVE); // starts out passive (in a cage)
break;
case ENTRY_RAVEN:
RavenGUID = pCreature->GetGUID();
pCreature->SetReactState(REACT_PASSIVE);// starts out passive (in a cage)
break;
case ENTRY_ORO:
OroGUID = pCreature->GetGUID();
pCreature->SetReactState(REACT_PASSIVE);// starts out passive (in a cage)
break;
case ENTRY_WEEGLI:
WeegliGUID = pCreature->GetGUID();
pCreature->SetReactState(REACT_PASSIVE);// starts out passive (in a cage)
break;
case ENTRY_MURTA:
MurtaGUID = pCreature->GetGUID();
pCreature->SetReactState(REACT_PASSIVE);// starts out passive (in a cage)
break;
case NPC_GAHZRILLA:
if (GahzRillaEncounter >= IN_PROGRESS)
pCreature->DisappearAndDie();
else
GahzRillaEncounter = IN_PROGRESS;
break;
}
}
void OnGameObjectCreate(GameObject* pGo, bool /*apply*/)
{
switch(pGo->GetEntry())
{
case GO_END_DOOR:
EndDoorGUID = pGo->GetGUID();
break;
}
}
uint32 GetData(uint32 type)
{
switch(type)
{
case EVENT_PYRAMID:
return PyramidPhase;
}
return 0;
}
uint64 GetData64(uint32 data)
{
switch(data)
{
case ENTRY_ZUMRAH:
return ZumrahGUID;
case ENTRY_BLY:
return BlyGUID;
case ENTRY_RAVEN:
return RavenGUID;
case ENTRY_ORO:
return OroGUID;
case ENTRY_WEEGLI:
return WeegliGUID;
case ENTRY_MURTA:
return MurtaGUID;
case GO_END_DOOR:
return EndDoorGUID;
}
return 0;
}
void SetData(uint32 type, uint32 data)
{
switch(type)
{
case EVENT_PYRAMID:
PyramidPhase=data;
break;
};
}
virtual void Update(uint32 diff)
{
switch (PyramidPhase)
{
case PYRAMID_NOT_STARTED:
case PYRAMID_KILLED_ALL_TROLLS:
break;
case PYRAMID_ARRIVED_AT_STAIR:
SpawnPyramidWave(1);
SetData(EVENT_PYRAMID,PYRAMID_WAVE_1);
major_wave_Timer=120000;
minor_wave_Timer=0;
addGroupSize=2;
break;
case PYRAMID_WAVE_1:
if (IsWaveAllDead())
{
SetData(EVENT_PYRAMID,PYRAMID_PRE_WAVE_2);
major_wave_Timer = 10000; //give players a few seconds before wave 2 starts to rebuff
}
else
if (minor_wave_Timer<diff)
{
SendAddsUpStairs(addGroupSize++);
minor_wave_Timer=10000;
}
else
minor_wave_Timer -= diff;
break;
case PYRAMID_PRE_WAVE_2:
if (major_wave_Timer<diff)
{
// beginning 2nd wave!
SpawnPyramidWave(2);
SetData(EVENT_PYRAMID,PYRAMID_WAVE_2);
minor_wave_Timer = 0;
addGroupSize=2;
}
else
major_wave_Timer -= diff;
break;
case PYRAMID_WAVE_2:
if (IsWaveAllDead())
{
SpawnPyramidWave(3);
SetData(EVENT_PYRAMID,PYRAMID_PRE_WAVE_3);
major_wave_Timer = 5000; //give NPCs time to return to their home spots
}
else
if (minor_wave_Timer<diff)
{
SendAddsUpStairs(addGroupSize++);
minor_wave_Timer=10000;
}
else
minor_wave_Timer -= diff;
break;
case PYRAMID_PRE_WAVE_3:
if (major_wave_Timer<diff)
{
// move NPCs to bottom of stair
MoveNPCIfAlive(ENTRY_BLY,1887.92,1228.179,9.98,4.78);
MoveNPCIfAlive(ENTRY_MURTA,1891.57,1228.68,9.69,4.78);
MoveNPCIfAlive(ENTRY_ORO,1897.23,1228.34,9.43,4.78);
MoveNPCIfAlive(ENTRY_RAVEN,1883.68,1227.95,9.543,4.78);
MoveNPCIfAlive(ENTRY_WEEGLI,1878.02,1227.65,9.485,4.78);
SetData(EVENT_PYRAMID,PYRAMID_WAVE_3);
}
else
major_wave_Timer -= diff;
break;
case PYRAMID_WAVE_3:
if (IsWaveAllDead()) // move NPCS to their final positions
{
SetData(EVENT_PYRAMID,PYRAMID_KILLED_ALL_TROLLS);
MoveNPCIfAlive(ENTRY_BLY,1883.82,1200.83,8.87,1.32);
MoveNPCIfAlive(ENTRY_MURTA,1891.83,1201.45,8.87,1.32);
MoveNPCIfAlive(ENTRY_ORO,1894.50,1204.40,8.87,1.32);
MoveNPCIfAlive(ENTRY_RAVEN,1874.11,1206.17,8.87,1.32);
MoveNPCIfAlive(ENTRY_WEEGLI,1877.52,1199.63,8.87,1.32);
}
break;
};
}
std::list<uint64> addsAtBase,movedadds;
void MoveNPCIfAlive(uint32 entry,float x,float y,float z,float o)
{
if (Creature* npc = instance->GetCreature(GetData64(entry)))
{
if (npc->isAlive())
{
npc->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
npc->GetMotionMaster()->MovePoint(1,x,y,z);
npc->SetHomePosition(x,y,z,o);
}
}
}
void SpawnPyramidWave(uint32 wave){
for (int i = 0; i < pyramidSpawnTotal; i++)
{
if (pyramidSpawns[i][0] == (float)wave)
{
Position pos = {pyramidSpawns[i][2], pyramidSpawns[i][3], 8.87, 0};
TempSummon* ts = instance->SummonCreature(pyramidSpawns[i][1],pos);
ts->GetMotionMaster()->MoveRandom(10);
addsAtBase.push_back(ts->GetGUID());
}
}
}
bool IsWaveAllDead(){
for(std::list<uint64>::iterator itr = addsAtBase.begin(); itr != addsAtBase.end(); ++itr)
{
if (Creature* add = instance->GetCreature((*itr)))
{
if (add->isAlive())
return false;
}
}
for(std::list<uint64>::iterator itr = movedadds.begin(); itr != movedadds.end(); ++itr)
{
if (Creature* add = instance->GetCreature(((*itr))))
{
if (add->isAlive())
return false;
}
}
return true;
}
void SendAddsUpStairs(uint32 count)
{
//pop a add from list, send him up the stairs...
for (uint32 addCount = 0; addCount<count && !addsAtBase.empty(); addCount++)
{
Creature* add = instance->GetCreature(*addsAtBase.begin());
add->GetMotionMaster()->MovePath(PATH_ADDS,false);
movedadds.push_back(add->GetGUID());
addsAtBase.erase(addsAtBase.begin());
}
}
};

View File

@@ -29,30 +29,48 @@ npc_weegli_blastfuse
EndContentData */
#include "ScriptPCH.h"
#include "zulfarrak.h"
/*######
## npc_sergeant_bly
######*/
#define FACTION_HOSTILE 14
#define FACTION_FRIENDLY 35
enum blyAndCrewFactions
{
FACTION_HOSTILE = 14,
FACTION_FRIENDLY = 35, //while in cages (so the trolls won't attack them while they're caged)
FACTION_FREED = 250 //after release (so they'll be hostile towards trolls)
};
#define SPELL_SHIELD_BASH 11972
#define SPELL_REVENGE 12170
enum blySays
{
SAY_1 = -1209002,
SAY_2 = -1209003
};
enum blySpells
{
SPELL_SHIELD_BASH = 11972,
SPELL_REVENGE = 12170
};
#define GOSSIP_BLY "[PH] In that case, I will take my reward!"
struct npc_sergeant_blyAI : public ScriptedAI
{
npc_sergeant_blyAI(Creature *c) : ScriptedAI(c)
npc_sergeant_blyAI(Creature* pCreature) : ScriptedAI(pCreature)
{
//pInstance = c->GetInstanceData();
pInstance = pCreature->GetInstanceData();
postGossipStep = 0;
}
//ScriptedInstance* pInstance;
ScriptedInstance* pInstance;
uint32 postGossipStep;
uint32 Text_Timer;
uint32 ShieldBash_Timer;
uint32 Revenge_Timer; //this is wrong, spell should never be used unless me->getVictim() dodge, parry or block attack. Trinity support required.
uint64 PlayerGUID;
void Reset()
{
@@ -60,15 +78,190 @@ struct npc_sergeant_blyAI : public ScriptedAI
Revenge_Timer = 8000;
me->setFaction(FACTION_FRIENDLY);
}
void UpdateAI(const uint32 diff)
{
if (postGossipStep>0 && postGossipStep<4)
{
if (Text_Timer<diff)
{
switch (postGossipStep)
{
case 1:
//weegli doesn't fight - he goes & blows up the door
if (Creature* pWeegli = pInstance->instance->GetCreature(pInstance->GetData64(ENTRY_WEEGLI)))
pWeegli->AI()->DoAction();
DoScriptText(SAY_1,me);
Text_Timer = 5000;
break;
case 2:
DoScriptText(SAY_2,me);
Text_Timer = 5000;
break;
case 3:
me->setFaction(FACTION_HOSTILE);
if (Player* pTarget = Player::GetPlayer(PlayerGUID))
AttackStart(pTarget);
if (pInstance)
{
switchFactionIfAlive(pInstance, ENTRY_RAVEN);
switchFactionIfAlive(pInstance, ENTRY_ORO);
switchFactionIfAlive(pInstance, ENTRY_MURTA);
}
}
postGossipStep++;
}
else Text_Timer -= diff;
}
if (!UpdateVictim())
return;
if (ShieldBash_Timer <= diff)
{
DoCast(me->getVictim(), SPELL_SHIELD_BASH);
ShieldBash_Timer = 15000;
}
else
ShieldBash_Timer -= diff;
if (Revenge_Timer <= diff)
{
DoCast(me->getVictim(), SPELL_REVENGE);
Revenge_Timer = 10000;
}
else
Revenge_Timer -= diff;
DoMeleeAttackIfReady();
}
void DoAction(const int32 param)
{
postGossipStep=1;
Text_Timer = 0;
}
void switchFactionIfAlive(ScriptedInstance* pInstance,uint32 entry)
{
if (Creature* crew = pInstance->instance->GetCreature(pInstance->GetData64(entry)))
if (crew->isAlive())
crew->setFaction(FACTION_HOSTILE);
}
};
CreatureAI* GetAI_npc_sergeant_bly(Creature* pCreature)
{
return new npc_sergeant_blyAI (pCreature);
}
bool GossipHello_npc_sergeant_bly(Player* pPlayer, Creature* pCreature)
{
if (ScriptedInstance* pInstance = pCreature->GetInstanceData())
{
if (pInstance->GetData(EVENT_PYRAMID) == PYRAMID_KILLED_ALL_TROLLS)
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BLY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(1517, pCreature->GetGUID());
}
else
if (pInstance->GetData(EVENT_PYRAMID) == PYRAMID_NOT_STARTED)
pPlayer->SEND_GOSSIP_MENU(1515, pCreature->GetGUID());
else
pPlayer->SEND_GOSSIP_MENU(1516, pCreature->GetGUID());
return true;
}
return false;
}
bool GossipSelect_npc_sergeant_bly(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction)
{
if (uiAction == GOSSIP_ACTION_INFO_DEF+1)
{
pPlayer->CLOSE_GOSSIP_MENU();
CAST_AI(npc_sergeant_blyAI,pCreature->AI())->PlayerGUID = pPlayer->GetGUID();
pCreature->AI()->DoAction();
}
return true;
}
/*######
+## go_troll_cage
+######*/
void initBlyCrewMember(ScriptedInstance* pInstance, uint32 entry,float x,float y, float z)
{
if (Creature* crew = pInstance->instance->GetCreature(pInstance->GetData64(entry)))
{
crew->SetReactState(REACT_AGGRESSIVE);
crew->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
crew->SetHomePosition(x,y,z,0);
crew->GetMotionMaster()->MovePoint(1,x,y,z);
crew->setFaction(FACTION_FREED);
}
}
bool GOHello_go_troll_cage(Player* pPlayer, GameObject* pGo)
{
if (ScriptedInstance* pInstance = pGo->GetInstanceData())
{
pInstance->SetData(EVENT_PYRAMID, PYRAMID_CAGES_OPEN);
//set bly & co to aggressive & start moving to top of stairs
initBlyCrewMember(pInstance,ENTRY_BLY,1884.99,1263,41.52);
initBlyCrewMember(pInstance,ENTRY_RAVEN,1882.5,1263,41.52);
initBlyCrewMember(pInstance,ENTRY_ORO,1886.47,1270.68,41.68);
initBlyCrewMember(pInstance,ENTRY_WEEGLI,1890,1263,41.52);
initBlyCrewMember(pInstance,ENTRY_MURTA,1891.19,1272.03,41.60);
}
return false;
}
/*######
## npc_weegli_blastfuse
######*/
enum weegliSpells
{
SPELL_BOMB = 8858,
SPELL_GOBLIN_LAND_MINE = 21688,
SPELL_SHOOT = 6660,
SPELL_WEEGLIS_BARREL = 10772
};
enum weegliSays
{
SAY_WEEGLI_OHNO = -1209000,
SAY_WEEGLI_OK_I_GO = -1209001
};
#define GOSSIP_WEEGLI "[PH] Please blow up the door."
struct npc_weegli_blastfuseAI : public ScriptedAI
{
npc_weegli_blastfuseAI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
destroyingDoor=false;
Bomb_Timer = 10000;
LandMine_Timer = 30000;
}
uint32 Bomb_Timer;
uint32 LandMine_Timer;
bool destroyingDoor;
ScriptedInstance* pInstance;
void Reset()
{
/*if (pInstance)
pInstance->SetData(0, NOT_STARTED);*/
}
void EnterCombat(Unit * /*who*/)
void AttackStart(Unit *victim)
{
/*if (pInstance)
pInstance->SetData(0, IN_PROGRESS);*/
AttackStartCaster(victim,10);//keep back & toss bombs/shoot
}
void JustDied(Unit * /*victim*/)
@@ -82,96 +275,61 @@ struct npc_sergeant_blyAI : public ScriptedAI
if (!UpdateVictim())
return;
if (ShieldBash_Timer <= diff)
if (Bomb_Timer < diff)
{
DoCast(me->getVictim(), SPELL_SHIELD_BASH);
ShieldBash_Timer = 15000;
} else ShieldBash_Timer -= diff;
DoCast(me->getVictim(),SPELL_BOMB);
Bomb_Timer = 10000;
}
else
Bomb_Timer -= diff;
if (Revenge_Timer <= diff)
if (me->isAttackReady() && !me->IsWithinMeleeRange(me->getVictim()))
{
DoCast(me->getVictim(), SPELL_REVENGE);
Revenge_Timer = 10000;
} else Revenge_Timer -= diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_npc_sergeant_bly(Creature* pCreature)
{
return new npc_sergeant_blyAI (pCreature);
}
bool GossipHello_npc_sergeant_bly(Player* pPlayer, Creature* pCreature)
{
/*if (pInstance->GetData(0) == DONE)
{*/
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BLY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(1517, pCreature->GetGUID());
/*}
else if (pInstance->GetData(0) == IN_PROGRESS)
pPlayer->SEND_GOSSIP_MENU(1516, pCreature->GetGUID());
else
pPlayer->SEND_GOSSIP_MENU(1515, pCreature->GetGUID());*/
return true;
}
bool GossipSelect_npc_sergeant_bly(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
if (uiAction == GOSSIP_ACTION_INFO_DEF+1)
{
pPlayer->CLOSE_GOSSIP_MENU();
pCreature->setFaction(FACTION_HOSTILE);
CAST_AI(npc_sergeant_blyAI, pCreature->AI())->AttackStart(pPlayer);
}
return true;
}
/*######
## npc_weegli_blastfuse
######*/
#define SPELL_BOMB 8858
#define SPELL_GOBLIN_LAND_MINE 21688
#define SPELL_SHOOT 6660
#define SPELL_WEEGLIS_BARREL 10772
#define GOSSIP_WEEGLI "[PH] Please blow up the door."
struct npc_weegli_blastfuseAI : public ScriptedAI
{
npc_weegli_blastfuseAI(Creature *c) : ScriptedAI(c)
{
//pInstance = c->GetInstanceData();
DoCast(me->getVictim(),SPELL_SHOOT);
me->SetSheath(SHEATH_STATE_RANGED);
}
else
{
me->SetSheath(SHEATH_STATE_MELEE);
DoMeleeAttackIfReady();
}
}
//ScriptedInstance* pInstance;
void Reset()
void MovementInform(uint32 type, uint32 id)
{
/*if (pInstance)
pInstance->SetData(0, NOT_STARTED);*/
if (pInstance)
{
if (pInstance->GetData(EVENT_PYRAMID) == PYRAMID_CAGES_OPEN)
{
pInstance->SetData(EVENT_PYRAMID,PYRAMID_ARRIVED_AT_STAIR);
DoScriptText(SAY_WEEGLI_OHNO,me);
me->SetHomePosition(1882.69,1272.28,41.87,0);
}
else
if (destroyingDoor)
{
pInstance->DoUseDoorOrButton(pInstance->GetData64(GO_END_DOOR));
//TODO: leave the area...
me->ForcedDespawn();
};
}
}
void EnterCombat(Unit * /*who*/)
void DoAction(const int32 param)
{
/*if (pInstance)
pInstance->SetData(0, IN_PROGRESS);*/
DestroyDoor();
}
void JustDied(Unit * /*victim*/)
void DestroyDoor()
{
/*if (pInstance)
pInstance->SetData(0, DONE);*/
}
void UpdateAI(const uint32 /*diff*/)
{
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
if (me->isAlive())
{
me->setFaction(FACTION_FRIENDLY);
me->GetMotionMaster()->MovePoint(0, 1858.57,1146.35,14.745);
me->SetHomePosition(1858.57,1146.35,14.745,3.85); // in case he gets interrupted
DoScriptText(SAY_WEEGLI_OK_I_GO,me);
destroyingDoor=true;
}
}
};
CreatureAI* GetAI_npc_weegli_blastfuse(Creature* pCreature)
@@ -181,25 +339,32 @@ CreatureAI* GetAI_npc_weegli_blastfuse(Creature* pCreature)
bool GossipHello_npc_weegli_blastfuse(Player* pPlayer, Creature* pCreature)
{
//event not implemented yet, this is only placeholder for future developement
/*if (pInstance->GetData(0) == DONE)
if (ScriptedInstance* pInstance = pCreature->GetInstanceData())
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_WEEGLI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(1514, pCreature->GetGUID());//if event can proceed to end
switch (pInstance->GetData(EVENT_PYRAMID))
{
case PYRAMID_KILLED_ALL_TROLLS:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_WEEGLI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(1514, pCreature->GetGUID()); //if event can proceed to end
break;
case PYRAMID_NOT_STARTED:
pPlayer->SEND_GOSSIP_MENU(1511, pCreature->GetGUID()); //if event not started
break;
default:
pPlayer->SEND_GOSSIP_MENU(1513, pCreature->GetGUID()); //if event are in progress
}
return true;
}
else if (pInstance->GetData(0) == IN_PROGRESS)
pPlayer->SEND_GOSSIP_MENU(1513, pCreature->GetGUID());//if event are in progress
else*/
pPlayer->SEND_GOSSIP_MENU(1511, pCreature->GetGUID()); //if event not started
return true;
return false;
}
bool GossipSelect_npc_weegli_blastfuse(Player* pPlayer, Creature* /*pCreature*/, uint32 /*uiSender*/, uint32 uiAction)
bool GossipSelect_npc_weegli_blastfuse(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction)
{
if (uiAction == GOSSIP_ACTION_INFO_DEF+1)
{
pPlayer->CLOSE_GOSSIP_MENU();
//here we make him run to door, set the charge and run away off to nowhere
pCreature->AI()->DoAction();
}
return true;
}
@@ -208,14 +373,15 @@ bool GossipSelect_npc_weegli_blastfuse(Player* pPlayer, Creature* /*pCreature*/,
## go_shallow_grave
######*/
enum {
enum
{
ZOMBIE = 7286,
DEAD_HERO = 7276,
ZOMBIE_CHANCE = 65,
DEAD_HERO_CHANCE = 10
};
bool GOHello_go_shallow_grave(Player* /*pPlayer*/, GameObject* pGo)
bool GOHello_go_shallow_grave(Player* pPlayer, GameObject* pGo)
{
// randomly summon a zombie or dead hero the first time a grave is used
if (pGo->GetUseCount() == 0)
@@ -223,8 +389,9 @@ bool GOHello_go_shallow_grave(Player* /*pPlayer*/, GameObject* pGo)
uint32 randomchance = urand(0,100);
if (randomchance < ZOMBIE_CHANCE)
pGo->SummonCreature(ZOMBIE, pGo->GetPositionX(), pGo->GetPositionY(), pGo->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000);
else if ((randomchance-ZOMBIE_CHANCE) < DEAD_HERO_CHANCE)
pGo->SummonCreature(DEAD_HERO, pGo->GetPositionX(), pGo->GetPositionY(), pGo->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000);
else
if ((randomchance-ZOMBIE_CHANCE) < DEAD_HERO_CHANCE)
pGo->SummonCreature(DEAD_HERO, pGo->GetPositionX(), pGo->GetPositionY(), pGo->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000);
}
pGo->AddUse();
return false;
@@ -234,20 +401,20 @@ bool GOHello_go_shallow_grave(Player* /*pPlayer*/, GameObject* pGo)
## at_zumrah
######*/
enum {
enum zumrahConsts
{
ZUMRAH_ID = 7271,
ZUMRAH_HOSTILE_FACTION = 37
};
bool AreaTrigger_at_zumrah(Player* pPlayer, const AreaTriggerEntry * /*at*/)
bool AreaTrigger_at_zumrah(Player* pPlayer,const AreaTriggerEntry *at)
{
Creature* Zumrah = pPlayer->FindNearestCreature(ZUMRAH_ID, 30.0f);
Creature* pZumrah = pPlayer->FindNearestCreature(ZUMRAH_ID, 30.0f);
if (!Zumrah)
if (!pZumrah)
return false;
Zumrah->setFaction(ZUMRAH_HOSTILE_FACTION);
Zumrah->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
pZumrah->setFaction(ZUMRAH_HOSTILE_FACTION);
return true;
}
@@ -256,21 +423,21 @@ void AddSC_zulfarrak()
Script *newscript;
newscript = new Script;
newscript->Name = "npc_sergeant_bly";
newscript->Name="npc_sergeant_bly";
newscript->GetAI = &GetAI_npc_sergeant_bly;
newscript->pGossipHello = &GossipHello_npc_sergeant_bly;
newscript->pGossipSelect = &GossipSelect_npc_sergeant_bly;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_weegli_blastfuse";
newscript->Name="npc_weegli_blastfuse";
newscript->GetAI = &GetAI_npc_weegli_blastfuse;
newscript->pGossipHello = &GossipHello_npc_weegli_blastfuse;
newscript->pGossipSelect = &GossipSelect_npc_weegli_blastfuse;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "go_shallow_grave";
newscript->Name="go_shallow_grave";
newscript->pGOHello = &GOHello_go_shallow_grave;
newscript->RegisterSelf();
@@ -279,4 +446,9 @@ void AddSC_zulfarrak()
newscript->pAreaTrigger = &AreaTrigger_at_zumrah;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "go_troll_cage";
newscript->pGOHello = &GOHello_go_troll_cage;
newscript->RegisterSelf();
}

View File

@@ -0,0 +1,36 @@
/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
#ifndef DEF_ZF_H
#define DEF_ZF_H
enum zfEntries
{
ENTRY_ZUMRAH = 7271,
ENTRY_BLY = 7604,
ENTRY_RAVEN = 7605,
ENTRY_ORO = 7606,
ENTRY_WEEGLI = 7607,
ENTRY_MURTA = 7608,
GO_END_DOOR = 146084,
EVENT_PYRAMID = 1,
EVENT_GAHZRILLA
};
enum zfPyramidPhases
{
PYRAMID_NOT_STARTED, //default
PYRAMID_CAGES_OPEN, //happens in GO hello for cages
PYRAMID_ARRIVED_AT_STAIR , //happens in Weegli's movementinform
PYRAMID_WAVE_1,
PYRAMID_PRE_WAVE_2,
PYRAMID_WAVE_2,
PYRAMID_PRE_WAVE_3,
PYRAMID_WAVE_3,
PYRAMID_KILLED_ALL_TROLLS,
};
#endif