Merge branch 'master' of github.com:TrinityCore/TrinityCore into mmaps

Conflicts:
	src/server/game/World/World.cpp
	src/server/worldserver/worldserver.conf.dist
This commit is contained in:
Vincent_Michael
2013-01-07 16:57:39 +01:00
26 changed files with 1006 additions and 538 deletions

View File

@@ -33,12 +33,10 @@ enum Spells
SPELL_WING_FLAP = 12882,
SPELL_PIERCE_ARMOR = 6016,
SPELL_DISARM = 8379,
SPELL_KIRTONOS_TRANSFORM = 16467,
SPELL_SHADOW_BOLT = 17228,
SPELL_CURSE_OF_TONGUES = 12889,
SPELL_DONINATE_MIND = 14515
SPELL_DOMINATE_MIND = 14515
};
enum Events
@@ -55,37 +53,15 @@ enum Events
EVENT_DISARM = 10,
EVENT_SHADOW_BOLT = 11,
EVENT_CURSE_OF_TONGUES = 12,
EVENT_DONINATE_MIND = 13,
EVENT_DOMINATE_MIND = 13,
EVENT_KIRTONOS_TRANSFORM = 14
};
enum Points
{
MAX_KIRTONOS_WAYPOINTS_INTRO = 14,
POINT_KIRTONOS_LAND = 14
};
enum Misc
{
WEAPON_KIRTONOS_STAFF = 11365
};
Position const kirtonosIntroWaypoint[MAX_KIRTONOS_WAYPOINTS_INTRO] =
{
{316.7087f, 71.26834f, 104.5843f, 0.0f},
{321.1605f, 72.80973f, 104.6676f, 0.0f},
{332.3713f, 77.98991f, 105.8621f, 0.0f},
{333.3254f, 86.60159f, 106.6399f, 0.0f},
{334.1263f, 101.6836f, 106.8343f, 0.0f},
{331.0458f, 114.5935f, 106.3621f, 0.0f},
{329.5439f, 126.7019f, 106.1399f, 0.0f},
{335.2471f, 136.5460f, 105.7232f, 0.0f},
{343.2100f, 139.9459f, 107.6399f, 0.0f},
{364.3288f, 140.9012f, 109.9454f, 0.0f},
{362.6760f, 115.6384f, 110.3065f, 0.0f},
{341.7896f, 91.94390f, 107.1676f, 0.0f},
{313.4945f, 93.45945f, 104.0565f, 0.0f},
{306.3839f, 93.61675f, 104.0565f, 0.0f},
WEAPON_KIRTONOS_STAFF = 11365,
POINT_KIRTONOS_LAND = 13,
KIRTONOS_PATH = 105061
};
class boss_kirtonos_the_herald : public CreatureScript
@@ -113,7 +89,7 @@ class boss_kirtonos_the_herald : public CreatureScript
events.ScheduleEvent(EVENT_DISARM, urand(22000, 22000));
events.ScheduleEvent(EVENT_SHADOW_BOLT, urand(42000, 42000));
events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, urand(53000, 53000));
events.ScheduleEvent(EVENT_DONINATE_MIND, urand(34000, 48000));
events.ScheduleEvent(EVENT_DOMINATE_MIND, urand(34000, 48000));
events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, urand(20000, 20000));
_EnterCombat();
}
@@ -142,12 +118,7 @@ class boss_kirtonos_the_herald : public CreatureScript
me->DespawnOrUnsummon(5000);
}
void DamageTaken(Unit* /*killer*/, uint32 &damage)
{
}
void IsSummonedBy(Unit* summoner)
void IsSummonedBy(Unit* /*summoner*/)
{
me->SetDisableGravity(true);
me->SetReactState(REACT_PASSIVE);
@@ -163,12 +134,13 @@ class boss_kirtonos_the_herald : public CreatureScript
BossAI::JustSummoned(summon);
}
void MovementInform(uint32 movementType, uint32 pointId)
void MovementInform(uint32 type, uint32 id)
{
if (movementType != POINT_MOTION_TYPE)
return;
_currentPoint = pointId + 1;
if (type == WAYPOINT_MOTION_TYPE && id == POINT_KIRTONOS_LAND)
{
_introTimer = 1500;
_introEvent = INTRO_2;
}
}
void UpdateAI(uint32 const diff)
@@ -180,13 +152,8 @@ class boss_kirtonos_the_herald : public CreatureScript
switch (_introEvent)
{
case INTRO_1:
if (_currentPoint < POINT_KIRTONOS_LAND)
me->GetMotionMaster()->MovePoint(_currentPoint, kirtonosIntroWaypoint[_currentPoint]);
else
{
_introTimer = 1000;
_introEvent = INTRO_2;
}
me->GetMotionMaster()->MovePath(KIRTONOS_PATH,false);
_introEvent = 0;
break;
case INTRO_2:
me->SetWalk(true);
@@ -204,6 +171,7 @@ class boss_kirtonos_the_herald : public CreatureScript
case INTRO_4:
if (GameObject* brazier = me->GetMap()->GetGameObject(instance->GetData64(GO_BRAZIER_OF_THE_HERALD)))
brazier->SetGoState(GO_STATE_READY);
me->SetWalk(true);
me->SetDisableGravity(false);
DoCast(me, SPELL_KIRTONOS_TRANSFORM);
_introTimer = 1000;
@@ -227,7 +195,7 @@ class boss_kirtonos_the_herald : public CreatureScript
_introTimer -= diff;
}
if (!UpdateVictim())
if (!UpdateVictim())
return;
events.Update(diff);
@@ -241,31 +209,31 @@ class boss_kirtonos_the_herald : public CreatureScript
{
case EVENT_SWOOP:
DoCast(me, SPELL_SWOOP);
events.ScheduleEvent(EVENT_SWOOP, urand(15000, 15000));
events.ScheduleEvent(EVENT_SWOOP, 15000);
break;
case EVENT_WING_FLAP:
DoCast(me, SPELL_WING_FLAP);
events.ScheduleEvent(EVENT_WING_FLAP, urand(13000, 13000));
events.ScheduleEvent(EVENT_WING_FLAP, 13000);
break;
case EVENT_PIERCE_ARMOR:
DoCastVictim(SPELL_PIERCE_ARMOR, true);
events.ScheduleEvent(EVENT_PIERCE_ARMOR, urand(12000, 12000));
events.ScheduleEvent(EVENT_PIERCE_ARMOR, 12000);
break;
case EVENT_DISARM:
DoCastVictim(SPELL_DISARM, true);
events.ScheduleEvent(EVENT_DISARM, urand(11000, 11000));
events.ScheduleEvent(EVENT_DISARM, 11000);
break;
case EVENT_SHADOW_BOLT:
DoCastVictim(SPELL_SHADOW_BOLT, true);
events.ScheduleEvent(EVENT_SHADOW_BOLT, urand(42000, 42000));
events.ScheduleEvent(EVENT_SHADOW_BOLT, 42000);
break;
case EVENT_CURSE_OF_TONGUES:
DoCastVictim(SPELL_CURSE_OF_TONGUES, true);
events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, urand(35000, 35000));
events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, 35000);
break;
case EVENT_DONINATE_MIND:
DoCastVictim(SPELL_DONINATE_MIND, true);
events.ScheduleEvent(EVENT_DONINATE_MIND, urand(44000, 48000));
case EVENT_DOMINATE_MIND:
DoCastVictim(SPELL_DOMINATE_MIND, true);
events.ScheduleEvent(EVENT_DOMINATE_MIND, urand(44000, 48000));
break;
case EVENT_KIRTONOS_TRANSFORM:
if (me->HasAura(SPELL_KIRTONOS_TRANSFORM))
@@ -312,16 +280,16 @@ enum Brazier_Of_The_Herald
class go_brazier_of_the_herald : public GameObjectScript
{
public:
go_brazier_of_the_herald() : GameObjectScript("go_brazier_of_the_herald") { }
public:
go_brazier_of_the_herald() : GameObjectScript("go_brazier_of_the_herald") { }
bool OnGossipHello(Player* player, GameObject* go)
{
go->UseDoorOrButton();
go->PlayDirectSound(SOUND_SCREECH,0);
player->SummonCreature(NPC_KIRTONOS, 315.028f, 70.53845f, 102.1496f, 0.3859715f, TEMPSUMMON_DEAD_DESPAWN, 900000);
return true;
}
bool OnGossipHello(Player* player, GameObject* go)
{
go->UseDoorOrButton();
go->PlayDirectSound(SOUND_SCREECH, 0);
player->SummonCreature(NPC_KIRTONOS, 315.028f, 70.53845f, 102.1496f, 0.3859715f, TEMPSUMMON_DEAD_DESPAWN, 900000);
return true;
}
};
void AddSC_boss_kirtonos_the_herald()

View File

@@ -29,13 +29,14 @@ EndScriptData */
#include "Player.h"
#include "TemporarySummon.h"
#define MAX_ENCOUNTER 6
#define RAND_VENDOR 2
enum Misc
{
MAX_ENCOUNTER = 7,
RAND_VENDOR = 2,
WORLDSTATE_SHOW_TIMER = 3104,
WORLDSTATE_TIME_TO_SACRIFICE = 3106
};
//187021 //Harkor's Satchel
//186648 //Tanzar's Trunk
//186672 //Ashli's Bag
//186667 //Kraz's Package
// Chests spawn at bear/eagle/dragonhawk/lynx bosses
// The loots depend on how many bosses have been killed, but not the entries of the chests
// But we cannot add loots to gameobject, so we have to use the fixed loot_template
@@ -51,9 +52,10 @@ static SHostageInfo HostageInfo[] =
{23999, 187021, 400, 1414, 74.36f, 3.3f}, // eagle
{24001, 186672, -35, 1134, 18.71f, 1.9f}, // dragonhawk
{24024, 186667, 413, 1117, 6.32f, 3.1f} // lynx
};
Position const HarrisonJonesLoc = {120.687f, 1674.0f, 42.0217f, 1.59044f};
class instance_zulaman : public InstanceMapScript
{
public:
@@ -70,9 +72,11 @@ class instance_zulaman : public InstanceMapScript
uint64 TanzarsTrunkGUID;
uint64 AshlisBagGUID;
uint64 KrazsPackageGUID;
uint64 StrangeGongGUID;
uint64 HexLordGateGUID;
uint64 ZulJinGateGUID;
uint64 MassiveGateGUID;
uint64 AkilzonDoorGUID;
uint64 ZulJinDoorGUID;
uint64 HalazziDoorGUID;
@@ -93,20 +97,24 @@ class instance_zulaman : public InstanceMapScript
TanzarsTrunkGUID = 0;
AshlisBagGUID = 0;
KrazsPackageGUID = 0;
StrangeGongGUID = 0;
HexLordGateGUID = 0;
ZulJinGateGUID = 0;
MassiveGateGUID = 0;
AkilzonDoorGUID = 0;
HalazziDoorGUID = 0;
ZulJinDoorGUID = 0;
QuestTimer = 0;
QuestMinute = 21;
QuestMinute = 0;
BossKilled = 0;
ChestLooted = 0;
for (uint8 i = 0; i < RAND_VENDOR; ++i)
RandVendor[i] = NOT_STARTED;
m_auiEncounter[DATA_GONGEVENT] = NOT_STARTED;
instance->SummonCreature(NPC_HARRISON_JONES, HarrisonJonesLoc);
}
bool IsEncounterInProgress() const
@@ -122,11 +130,11 @@ class instance_zulaman : public InstanceMapScript
{
switch (creature->GetEntry())
{
case 23578://janalai
case 23863://zuljin
case 24239://hexlord
case 23577://halazzi
case 23576://nalorakk
case NPC_JANALAI:
case NPC_ZULJIN:
case NPC_HEXLORD:
case NPC_HALAZZI:
case NPC_NALORAKK:
default: break;
}
}
@@ -135,18 +143,19 @@ class instance_zulaman : public InstanceMapScript
{
switch (go->GetEntry())
{
case 186303: HalazziDoorGUID = go->GetGUID(); break;
case 186304: ZulJinGateGUID = go->GetGUID(); break;
case 186305: HexLordGateGUID = go->GetGUID(); break;
case 186858: AkilzonDoorGUID = go->GetGUID(); break;
case 186859: ZulJinDoorGUID = go->GetGUID(); break;
case GO_DOOR_HALAZZI: HalazziDoorGUID = go->GetGUID(); break;
case GO_GATE_ZULJIN: ZulJinGateGUID = go->GetGUID(); break;
case GO_GATE_HEXLORD: HexLordGateGUID = go->GetGUID(); break;
case GO_MASSIVE_GATE: MassiveGateGUID = go->GetGUID(); break;
case GO_DOOR_AKILZON: AkilzonDoorGUID = go->GetGUID(); break;
case GO_DOOR_ZULJIN: ZulJinDoorGUID = go->GetGUID(); break;
case 187021: HarkorsSatchelGUID = go->GetGUID(); break;
case 186648: TanzarsTrunkGUID = go->GetGUID(); break;
case 186672: AshlisBagGUID = go->GetGUID(); break;
case 186667: KrazsPackageGUID = go->GetGUID(); break;
case GO_HARKORS_SATCHEL: HarkorsSatchelGUID = go->GetGUID(); break;
case GO_TANZARS_TRUNK: TanzarsTrunkGUID = go->GetGUID(); break;
case GO_ASHLIS_BAG: AshlisBagGUID = go->GetGUID(); break;
case GO_KRAZS_PACKAGE: KrazsPackageGUID = go->GetGUID(); break;
case GO_STRANGE_GONG: StrangeGongGUID = go->GetGUID(); break;
default: break;
}
CheckInstanceStatus();
}
@@ -173,10 +182,13 @@ class instance_zulaman : public InstanceMapScript
void CheckInstanceStatus()
{
if (BossKilled >= 4)
if (m_auiEncounter[DATA_GONGEVENT] == DONE)
HandleGameObject(MassiveGateGUID, true);
if (BossKilled >= DATA_HALAZZIEVENT)
HandleGameObject(HexLordGateGUID, true);
if (BossKilled >= 5)
if (BossKilled >= DATA_HEXLORDEVENT)
HandleGameObject(ZulJinGateGUID, true);
}
@@ -214,49 +226,57 @@ class instance_zulaman : public InstanceMapScript
{
switch (type)
{
case DATA_GONGEVENT:
m_auiEncounter[DATA_GONGEVENT] = data;
if (data == SPECIAL)
SaveToDB();
if (data == DONE)
QuestMinute = 21;
break;
case DATA_NALORAKKEVENT:
m_auiEncounter[0] = data;
m_auiEncounter[DATA_NALORAKKEVENT] = data;
if (data == DONE)
{
if (QuestMinute)
{
QuestMinute += 15;
DoUpdateWorldState(3106, QuestMinute);
DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute);
}
SummonHostage(0);
}
break;
case DATA_AKILZONEVENT:
m_auiEncounter[1] = data;
m_auiEncounter[DATA_AKILZONEVENT] = data;
HandleGameObject(AkilzonDoorGUID, data != IN_PROGRESS);
if (data == DONE)
{
if (QuestMinute)
{
QuestMinute += 10;
DoUpdateWorldState(3106, QuestMinute);
DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute);
}
SummonHostage(1);
}
break;
case DATA_JANALAIEVENT:
m_auiEncounter[2] = data;
if (data == DONE) SummonHostage(2);
m_auiEncounter[DATA_JANALAIEVENT] = data;
if (data == DONE)
SummonHostage(2);
break;
case DATA_HALAZZIEVENT:
m_auiEncounter[3] = data;
m_auiEncounter[DATA_HALAZZIEVENT] = data;
HandleGameObject(HalazziDoorGUID, data != IN_PROGRESS);
if (data == DONE) SummonHostage(3);
break;
case DATA_HEXLORDEVENT:
m_auiEncounter[4] = data;
m_auiEncounter[DATA_HEXLORDEVENT] = data;
if (data == IN_PROGRESS)
HandleGameObject(HexLordGateGUID, false);
else if (data == NOT_STARTED)
CheckInstanceStatus();
break;
case DATA_ZULJINEVENT:
m_auiEncounter[5] = data;
m_auiEncounter[DATA_ZULJINEVENT] = data;
HandleGameObject(ZulJinDoorGUID, data != IN_PROGRESS);
break;
case DATA_CHESTLOOTED:
@@ -274,10 +294,10 @@ class instance_zulaman : public InstanceMapScript
if (data == DONE)
{
++BossKilled;
if (QuestMinute && BossKilled >= 4)
if (QuestMinute && BossKilled >= DATA_HALAZZIEVENT)
{
QuestMinute = 0;
DoUpdateWorldState(3104, 0);
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
}
CheckInstanceStatus();
SaveToDB();
@@ -288,12 +308,13 @@ class instance_zulaman : public InstanceMapScript
{
switch (type)
{
case DATA_NALORAKKEVENT: return m_auiEncounter[0];
case DATA_AKILZONEVENT: return m_auiEncounter[1];
case DATA_JANALAIEVENT: return m_auiEncounter[2];
case DATA_HALAZZIEVENT: return m_auiEncounter[3];
case DATA_HEXLORDEVENT: return m_auiEncounter[4];
case DATA_ZULJINEVENT: return m_auiEncounter[5];
case DATA_GONGEVENT: return m_auiEncounter[DATA_GONGEVENT];
case DATA_NALORAKKEVENT: return m_auiEncounter[DATA_NALORAKKEVENT];
case DATA_AKILZONEVENT: return m_auiEncounter[DATA_AKILZONEVENT];
case DATA_JANALAIEVENT: return m_auiEncounter[DATA_JANALAIEVENT];
case DATA_HALAZZIEVENT: return m_auiEncounter[DATA_HALAZZIEVENT];
case DATA_HEXLORDEVENT: return m_auiEncounter[DATA_HEXLORDEVENT];
case DATA_ZULJINEVENT: return m_auiEncounter[DATA_ZULJINEVENT];
case DATA_CHESTLOOTED: return ChestLooted;
case TYPE_RAND_VENDOR_1: return RandVendor[0];
case TYPE_RAND_VENDOR_2: return RandVendor[1];
@@ -312,13 +333,27 @@ class instance_zulaman : public InstanceMapScript
QuestTimer += 60000;
if (QuestMinute)
{
DoUpdateWorldState(3104, 1);
DoUpdateWorldState(3106, QuestMinute);
} else DoUpdateWorldState(3104, 0);
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1);
DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute);
} else DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
}
QuestTimer -= diff;
}
}
uint64 GetData64(uint32 type) const
{
switch (type)
{
case GO_STRANGE_GONG:
return StrangeGongGUID;
case GO_MASSIVE_GATE:
return MassiveGateGUID;
}
return 0;
}
};
InstanceScript* GetInstanceScript(InstanceMap* map) const

View File

@@ -33,6 +33,7 @@ EndContentData */
#include "zulaman.h"
#include "Player.h"
#include "SpellInfo.h"
#include "SpellScript.h"
/*######
## npc_forest_frog
@@ -199,9 +200,303 @@ class npc_zulaman_hostage : public CreatureScript
}
};
/*######
## npc_harrison_jones
######*/
enum Says
{
SAY_HARRISON_0 = 0,
SAY_HARRISON_1 = 1,
SAY_HARRISON_2 = 0,
SAY_HARRISON_3 = 1
};
enum Spells
{
SPELL_BANGING_THE_GONG = 45225,
SPELL_STEALTH = 34189,
SPELL_COSMETIC_SPEAR_THROW = 43647
};
enum Events
{
GONG_EVENT_1 = 1,
GONG_EVENT_2 = 2,
GONG_EVENT_3 = 3,
GONG_EVENT_4 = 4,
GONG_EVENT_5 = 5,
GONG_EVENT_6 = 6,
GONG_EVENT_7 = 7,
GONG_EVENT_8 = 8,
GONG_EVENT_9 = 9,
GONG_EVENT_10 = 10,
GONG_EVENT_11 = 11,
GONG_EVENT_12 = 12
};
enum Waypoints
{
HARRISON_MOVE_1 = 860440,
HARRISON_MOVE_2 = 860441,
HARRISON_MOVE_3 = 860442
};
enum DisplayIds
{
MODEL_HARRISON_JONES_0 = 22340,
MODEL_HARRISON_JONES_1 = 22354,
MODEL_HARRISON_JONES_2 = 22347
};
enum EntryIds
{
NPC_HARRISON_JONES_1 = 24375,
NPC_HARRISON_JONES_2 = 24365,
NPC_AMANISHI_GUARDIAN = 23597,
};
enum Weapons
{
WEAPON_MACE = 5301,
WEAPON_SPEAR = 13631
};
Position const AmanishiGuardianLoc = {120.687f, 1674.0f, 42.0217f, 1.59044f};
class npc_harrison_jones : public CreatureScript
{
public:
npc_harrison_jones()
: CreatureScript("npc_harrison_jones")
{
}
struct npc_harrison_jonesAI : public ScriptedAI
{
npc_harrison_jonesAI(Creature* creature) : ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
}
InstanceScript* instance;
uint8 _gongEvent;
uint32 _gongTimer;
uint64 uiTargetGUID;
void Reset()
{
_gongEvent = 0;
_gongTimer = 0;
uiTargetGUID = 0;
}
void EnterCombat(Unit* /*who*/) {}
void sGossipSelect(Player* player, uint32 sender, uint32 action)
{
if (me->GetCreatureTemplate()->GossipMenuId == sender && !action)
{
player->CLOSE_GOSSIP_MENU();
me->SetInFront(player);
me->SendMovementFlagUpdate(true);
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
Talk(SAY_HARRISON_0);
instance->SetData(DATA_GONGEVENT, IN_PROGRESS);
_gongEvent = GONG_EVENT_1;
_gongTimer = 4000;
}
}
void SpellHit(Unit*, const SpellInfo* spell)
{
if (spell->Id == SPELL_COSMETIC_SPEAR_THROW)
{
me->RemoveAllAuras();
me->SetEntry(NPC_HARRISON_JONES_2);
me->SetDisplayId(MODEL_HARRISON_JONES_2);
me->SetTarget(0);
me->SetByteValue(UNIT_FIELD_BYTES_1,0,UNIT_STAND_STATE_DEAD);
me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
if (instance)
instance->SetData(DATA_GONGEVENT, DONE);
}
}
void UpdateAI(uint32 const diff)
{
if (_gongEvent)
{
if (_gongTimer <= diff)
{
switch (_gongEvent)
{
case GONG_EVENT_1:
me->GetMotionMaster()->MovePath(HARRISON_MOVE_1,false);
_gongTimer = 12000;
_gongEvent = GONG_EVENT_2;
break;
case GONG_EVENT_2:
me->SetFacingTo(6.235659f);
Talk(SAY_HARRISON_1);
DoCast(me, SPELL_BANGING_THE_GONG);
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_MACE));
me->SetSheath(SHEATH_STATE_MELEE);
_gongTimer = 4000;
_gongEvent = GONG_EVENT_3;
break;
case GONG_EVENT_3:
if (GameObject* gong = me->GetMap()->GetGameObject(instance->GetData64(GO_STRANGE_GONG)))
gong->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_NOT_SELECTABLE);
_gongTimer = 105000;
_gongEvent = GONG_EVENT_4;
break;
case GONG_EVENT_4:
me->RemoveAura(SPELL_BANGING_THE_GONG);
if (GameObject* gong = me->GetMap()->GetGameObject(instance->GetData64(GO_STRANGE_GONG)))
gong->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_NOT_SELECTABLE);
// trigger or gong will need to be scripted to set SPECIAL if enough players click gong.
// This is temp workaround.
if (instance)
instance->SetData(DATA_GONGEVENT, SPECIAL); // to be removed.
if (instance->GetData(DATA_GONGEVENT) == SPECIAL)
{
// Players are Now Saved to instance at SPECIAL (Player should be notified?)
me->GetMotionMaster()->MovePath(HARRISON_MOVE_2,false);
_gongTimer = 5000;
_gongEvent = 5;
}
else
{
_gongTimer = 1000;
_gongEvent = 10;
}
break;
case GONG_EVENT_5:
me->SetEntry(NPC_HARRISON_JONES_1);
me->SetDisplayId(MODEL_HARRISON_JONES_1);
Talk(SAY_HARRISON_2);
_gongTimer = 14000;
_gongEvent = 6;
break;
case GONG_EVENT_6:
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING);
Talk(SAY_HARRISON_3);
_gongTimer = 7000;
_gongEvent = 7;
break;
case GONG_EVENT_7:
if (!uiTargetGUID)
{
std::list<Creature*> targetList;
GetCreatureListWithEntryInGrid(targetList, me, NPC_AMANISHI_GUARDIAN, 26.0f);
if (!targetList.empty())
{
for (std::list<Creature*>::const_iterator itr = targetList.begin(); itr != targetList.end(); ++itr)
{
if (Creature* ptarget = *itr)
{
if (ptarget->GetPositionX() > 120)
{
ptarget->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_SPEAR));
ptarget->AI()->SetData(0,1);
}
}
}
}
}
if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_MASSIVE_GATE)))
gate->SetGoState(GO_STATE_ACTIVE);
_gongTimer = 1000;
_gongEvent = 8;
case GONG_EVENT_8:
DoCast(me, SPELL_STEALTH);
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(0));
me->GetMotionMaster()->MovePath(HARRISON_MOVE_3,false);
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
_gongTimer = 100;
_gongEvent = 9;
case GONG_EVENT_9:
// If player in 10.0f range
// Send setdata to SAI for previous target
// SAI BELOW
// move 23597, guid 86194 to be deleted
// path 138.2242 Y: 1586.994 Z: 43.5488
// path 131.8407 Y: 1590.247 Z: 43.61384
// Reach end of path turnto 2.024582 cast Spell ID: 43647 on self hits 24365 update UNIT_VIRTUAL_ITEM_SLOT_ID: 33979
// wait 2 sec say text 0
// Set below after complete above
_gongTimer = 0;
_gongEvent = 0;
break;
case GONG_EVENT_10:
me->GetMotionMaster()->MovePoint(0, 120.687f, 1674.0f, 42.0217f);
_gongTimer = 12000;
_gongEvent = 11;
break;
case GONG_EVENT_11:
me->SetFacingTo(1.59044f);
_gongTimer = 6000;
_gongEvent = 12;
break;
case GONG_EVENT_12:
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
if (instance)
instance->SetData(DATA_GONGEVENT, NOT_STARTED);
_gongTimer = 0;
_gongEvent = 0;
break;
}
}
else
_gongTimer -= diff;
}
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new npc_harrison_jonesAI(creature);
}
};
class spell_banging_the_gong : public SpellScriptLoader
{
public:
spell_banging_the_gong() : SpellScriptLoader("spell_banging_the_gong") { }
class spell_banging_the_gong_SpellScript : public SpellScript
{
PrepareSpellScript(spell_banging_the_gong_SpellScript);
void Activate(SpellEffIndex index)
{
PreventHitDefaultEffect(index);
GetHitGObj()->SendCustomAnim(0);
}
void Register()
{
OnEffectHitTarget += SpellEffectFn(spell_banging_the_gong_SpellScript::Activate, EFFECT_1, SPELL_EFFECT_ACTIVATE_OBJECT);
}
};
SpellScript* GetSpellScript() const
{
return new spell_banging_the_gong_SpellScript();
}
};
void AddSC_zulaman()
{
new npc_forest_frog();
new npc_zulaman_hostage();
new npc_harrison_jones();
new spell_banging_the_gong();
}

View File

@@ -19,15 +19,43 @@
#ifndef DEF_ZULAMAN_H
#define DEF_ZULAMAN_H
#define DATA_NALORAKKEVENT 1
#define DATA_AKILZONEVENT 2
#define DATA_JANALAIEVENT 3
#define DATA_HALAZZIEVENT 4
#define DATA_HEXLORDEVENT 5
#define DATA_ZULJINEVENT 6
#define DATA_CHESTLOOTED 7
#define TYPE_RAND_VENDOR_1 8
#define TYPE_RAND_VENDOR_2 9
enum DataTypes
{
DATA_GONGEVENT = 0,
DATA_NALORAKKEVENT = 1,
DATA_AKILZONEVENT = 2,
DATA_JANALAIEVENT = 3,
DATA_HALAZZIEVENT = 4,
DATA_HEXLORDEVENT = 5,
DATA_ZULJINEVENT = 6,
DATA_CHESTLOOTED = 7,
TYPE_RAND_VENDOR_1 = 8,
TYPE_RAND_VENDOR_2 = 9
};
enum CreatureIds
{
NPC_HARRISON_JONES = 24358,
NPC_JANALAI = 23578,
NPC_ZULJIN = 23863,
NPC_HEXLORD = 24239,
NPC_HALAZZI = 23577,
NPC_NALORAKK = 23576
};
enum GameobjectIds
{
GO_DOOR_HALAZZI = 186303,
GO_GATE_ZULJIN = 186304,
GO_GATE_HEXLORD = 186305,
GO_MASSIVE_GATE = 186728,
GO_DOOR_AKILZON = 186858,
GO_DOOR_ZULJIN = 186859,
GO_HARKORS_SATCHEL = 187021,
GO_TANZARS_TRUNK = 186648,
GO_ASHLIS_BAG = 186672,
GO_KRAZS_PACKAGE = 186667,
GO_STRANGE_GONG = 187359
};
#endif

View File

@@ -16,229 +16,245 @@
*/
#include "ScriptMgr.h"
#include "SpellScript.h"
#include "ScriptedCreature.h"
#include "drak_tharon_keep.h"
enum Spells
enum Misc
{
SPELL_ARCANE_BLAST = 49198,
H_SPELL_ARCANE_BLAST = 59909,
SPELL_ARCANE_FIELD = 47346,
SPELL_BLIZZARD = 49034,
H_SPELL_BLIZZARD = 59854,
SPELL_FROSTBOLT = 49037,
H_SPELL_FROSTBOLT = 59855,
SPELL_WRATH_OF_MISERY = 50089,
H_SPELL_WRATH_OF_MISERY = 59856,
SPELL_SUMMON_MINIONS = 59910 //Summons an army of Fetid Troll Corpses to assist the caster.
};
//not in db
enum Yells
{
SAY_AGGRO = 0,
SAY_KILL = 1,
SAY_DEATH = 2,
SAY_NECRO_ADD = 3,
SAY_REUBBLE = 4
ACTION_RESET_CRYSTALS,
ACTION_ACTIVATE_CRYSTAL,
ACTION_DEACTIVATE,
EVENT_ATTACK,
EVENT_SUMMON_MINIONS,
DATA_NOVOS_ACHIEV
};
enum Creatures
{
CREATURE_RISEN_SHADOWCASTER = 27600,
CREATURE_FETID_TROLL_CORPSE = 27598,
CREATURE_HULKING_CORPSE = 27597,
CREATURE_CRYSTAL_HANDLER = 26627
NPC_CRYSTAL_CHANNEL_TARGET = 26712,
NPC_FETID_TROLL_CORPSE = 27597,
NPC_RISEN_SHADOWCASTER = 27600,
NPC_HULKING_CORPSE = 27597
};
enum CombatPhase
enum Spells
{
IDLE,
PHASE_1,
PHASE_2
SPELL_BEAM_CHANNEL = 52106,
SPELL_ARCANE_FIELD = 47346,
SPELL_SUMMON_RISEN_SHADOWCASTER = 49105,
SPELL_SUMMON_FETID_TROLL_CORPSE = 49103,
SPELL_SUMMON_HULKING_CORPSE = 49104,
SPELL_SUMMON_CRYSTAL_HANDLER = 49179,
SPELL_ARCANE_BLAST = 49198,
SPELL_BLIZZARD = 49034,
SPELL_FROSTBOLT = 49037,
SPELL_WRATH_OF_MISERY = 50089,
SPELL_SUMMON_MINIONS = 59910
};
#define ACTION_MINION_REACHED 1
#define DATA_OH_NOVOS 2
struct SummonerInfo
{
uint32 data, spell, timer;
};
static Position AddSpawnPoint = { -379.20f, -816.76f, 59.70f, 0.0f };
static Position CrystalHandlerSpawnPoint = { -326.626343f, -709.956604f, 27.813314f, 0.0f };
static Position AddDestinyPoint = { -379.314545f, -772.577637f, 28.58837f, 0.0f };
const SummonerInfo summoners[] =
{
{ DATA_NOVOS_SUMMONER_1, SPELL_SUMMON_RISEN_SHADOWCASTER, 15000 },
{ DATA_NOVOS_SUMMONER_2, SPELL_SUMMON_FETID_TROLL_CORPSE, 5000 },
{ DATA_NOVOS_SUMMONER_3, SPELL_SUMMON_HULKING_CORPSE, 30000 },
{ DATA_NOVOS_SUMMONER_4, SPELL_SUMMON_CRYSTAL_HANDLER, 30000 }
};
#define MAX_Y_COORD_OH_NOVOS -771.95f
class boss_novos : public CreatureScript
{
public:
boss_novos() : CreatureScript("boss_novos") { }
struct boss_novosAI : public Scripted_NoMovementAI
struct boss_novosAI : public BossAI
{
boss_novosAI(Creature* creature) : Scripted_NoMovementAI(creature), lSummons(me)
{
instance = creature->GetInstanceScript();
}
uint32 uiTimer;
uint32 uiCrystalHandlerTimer;
uint8 crystalHandlerAmount;
bool ohNovos;
SummonList lSummons;
std::list<uint64> luiCrystals;
CombatPhase Phase;
InstanceScript* instance;
boss_novosAI(Creature* creature) : BossAI(creature, DATA_NOVOS_EVENT) {}
void Reset()
{
Phase = IDLE;
luiCrystals.clear();
ohNovos = true;
me->CastStop();
lSummons.DespawnAll();
crystalHandlerAmount = 0;
events.Reset();
summons.DespawnAll();
instance->SetData(DATA_NOVOS_EVENT, NOT_STARTED);
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC))
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
if (instance)
{
instance->SetData(DATA_NOVOS_EVENT, NOT_STARTED);
for (uint8 n = 0; n < 4; ++n)
luiCrystals.push_back(instance->GetData64(DATA_NOVOS_CRYSTAL_1 + n));
for (std::list<uint64>::const_iterator itr = luiCrystals.begin(); itr != luiCrystals.end(); ++itr)
{
if (GameObject* temp = instance->instance->GetGameObject(*itr))
temp->SetGoState(GO_STATE_READY);
}
}
_ohNovos = true;
_crystalHandlerCount = 0;
SetCrystalsStatus(false);
SetSummonerStatus(false);
SetBubbled(false);
}
void EnterCombat(Unit* /*who*/)
void EnterCombat(Unit* /* victim */)
{
Talk(SAY_AGGRO);
Phase = PHASE_1;
uiCrystalHandlerTimer = 30*IN_MILLISECONDS;
uiTimer = 1*IN_MILLISECONDS;
DoCast(SPELL_ARCANE_FIELD);
if (instance)
{
for (std::list<uint64>::const_iterator itr = luiCrystals.begin(); itr != luiCrystals.end(); ++itr)
{
if (GameObject* temp = instance->instance->GetGameObject(*itr))
temp->SetGoState(GO_STATE_ACTIVE);
}
instance->SetData(DATA_NOVOS_EVENT, IN_PROGRESS);
}
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->setActive(true);
DoZoneInCombat();
instance->SetData(DATA_NOVOS_EVENT, IN_PROGRESS);
SetCrystalsStatus(true);
SetSummonerStatus(true);
SetBubbled(true);
}
void AttackStart(Unit* target)
{
if (!target)
return;
if (me->Attack(target, true))
DoStartNoMovement(target);
}
void UpdateAI(const uint32 diff)
{
switch (Phase)
{
case PHASE_1:
if (uiTimer <= diff)
{
Creature* summon = me->SummonCreature(RAND(CREATURE_FETID_TROLL_CORPSE, CREATURE_HULKING_CORPSE, CREATURE_RISEN_SHADOWCASTER), AddSpawnPoint, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20*IN_MILLISECONDS);
summon->GetMotionMaster()->MovePoint(0, AddDestinyPoint);
//If spell is casted stops casting arcane field so no spell casting
//DoCast(me, SPELL_SUMMON_MINIONS);
uiTimer = 3*IN_MILLISECONDS;
} else uiTimer -= diff;
if (crystalHandlerAmount < 4)
{
if (uiCrystalHandlerTimer <= diff)
{
Talk(SAY_NECRO_ADD);
Creature* pCrystalHandler = me->SummonCreature(CREATURE_CRYSTAL_HANDLER, CrystalHandlerSpawnPoint, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20*IN_MILLISECONDS);
pCrystalHandler->GetMotionMaster()->MovePoint(0, AddDestinyPoint);
uiCrystalHandlerTimer = urand(20*IN_MILLISECONDS, 30*IN_MILLISECONDS);
} else uiCrystalHandlerTimer -= diff;
}
break;
case PHASE_2:
if (uiTimer <= diff)
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
DoCast(target, DUNGEON_MODE(RAND(SPELL_ARCANE_BLAST, SPELL_BLIZZARD, SPELL_FROSTBOLT, SPELL_WRATH_OF_MISERY),
RAND(H_SPELL_ARCANE_BLAST, H_SPELL_BLIZZARD, H_SPELL_FROSTBOLT, H_SPELL_WRATH_OF_MISERY)));
uiTimer = urand(1*IN_MILLISECONDS, 3*IN_MILLISECONDS);
} else uiTimer -= diff;
break;
default:
break;
}
}
void JustDied(Unit* /*killer*/)
{
Talk(SAY_DEATH);
if (instance)
instance->SetData(DATA_NOVOS_EVENT, DONE);
lSummons.DespawnAll();
}
void KilledUnit(Unit* victim)
{
if (victim == me)
if (!UpdateVictim() || _bubbled)
return;
Talk(SAY_KILL);
}
void JustSummoned(Creature* summon)
{
if (summon->GetEntry() == CREATURE_CRYSTAL_HANDLER)
crystalHandlerAmount++;
events.Update(diff);
lSummons.Summon(summon);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
if (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_SUMMON_MINIONS:
DoCast(SPELL_SUMMON_MINIONS);
events.ScheduleEvent(EVENT_SUMMON_MINIONS, 15000);
break;
case EVENT_ATTACK:
if (Unit* victim = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(victim, RAND(SPELL_ARCANE_BLAST, SPELL_BLIZZARD, SPELL_FROSTBOLT, SPELL_WRATH_OF_MISERY));
events.ScheduleEvent(EVENT_ATTACK, 3000);
break;
default:
break;
}
}
}
void DoAction(int32 const action)
{
if (action == ACTION_MINION_REACHED)
ohNovos = false;
if (action == ACTION_CRYSTAL_HANDLER_DIED)
CrystalHandlerDied();
}
void MoveInLineOfSight(Unit* who)
{
BossAI::MoveInLineOfSight(who);
if (!_ohNovos || !who || who->GetTypeId() != TYPEID_UNIT || who->GetPositionY() > MAX_Y_COORD_OH_NOVOS)
return;
uint32 entry = who->GetEntry();
if (entry == NPC_HULKING_CORPSE || entry == NPC_RISEN_SHADOWCASTER || entry == NPC_FETID_TROLL_CORPSE)
_ohNovos = false;
}
uint32 GetData(uint32 type) const
{
if (type == DATA_OH_NOVOS)
return ohNovos ? 1 : 0;
return 0;
return type == DATA_NOVOS_ACHIEV && _ohNovos ? 1 : 0;
}
void RemoveCrystal()
void JustSummoned(Creature* summon)
{
if (!luiCrystals.empty())
summons.Summon(summon);
}
private:
void SetBubbled(bool state)
{
_bubbled = state;
if (!state)
{
if (instance)
if (GameObject* temp = instance->instance->GetGameObject(luiCrystals.back()))
temp->SetGoState(GO_STATE_READY);
luiCrystals.pop_back();
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC))
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
if (me->HasUnitState(UNIT_STATE_CASTING))
me->CastStop();
}
if (luiCrystals.empty())
else
{
me->CastStop();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
Phase = PHASE_2;
uiTimer = 1*IN_MILLISECONDS;
if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC))
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
DoCast(SPELL_ARCANE_FIELD);
}
}
Unit* GetRandomTarget()
void SetSummonerStatus(bool active)
{
return SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
for (uint8 i = 0; i < 4; i++)
if (uint64 guid = instance->GetData64(summoners[i].data))
if (Creature* crystalChannelTarget = instance->instance->GetCreature(guid))
{
if (active)
crystalChannelTarget->AI()->SetData(summoners[i].spell, summoners[i].timer);
else
crystalChannelTarget->AI()->Reset();
}
}
void SetCrystalsStatus(bool active)
{
for (uint8 i = 0; i < 4; i++)
if (uint64 guid = instance->GetData64(DATA_NOVOS_CRYSTAL_1 + i))
if (GameObject* crystal = instance->instance->GetGameObject(guid))
SetCrystalStatus(crystal, active);
}
void SetCrystalStatus(GameObject* crystal, bool active)
{
if (!crystal)
return;
crystal->SetGoState(active ? GO_STATE_ACTIVE : GO_STATE_READY);
if (Creature* crystalChannelTarget = crystal->FindNearestCreature(NPC_CRYSTAL_CHANNEL_TARGET, 5.0f))
{
if (active)
crystalChannelTarget->AI()->DoCastAOE(SPELL_BEAM_CHANNEL);
else if (crystalChannelTarget->HasUnitState(UNIT_STATE_CASTING))
crystalChannelTarget->CastStop();
}
}
void CrystalHandlerDied()
{
for (uint8 i = 0; i < 4; i++)
if (uint64 guid = instance->GetData64(DATA_NOVOS_CRYSTAL_1 + i))
if (GameObject* crystal = instance->instance->GetGameObject(guid))
if (crystal->GetGoState() == GO_STATE_ACTIVE)
{
SetCrystalStatus(crystal, false);
break;
}
if (++_crystalHandlerCount >= 4)
{
SetSummonerStatus(false);
SetBubbled(false);
events.ScheduleEvent(EVENT_ATTACK, 3000);
if (IsHeroic())
events.ScheduleEvent(EVENT_SUMMON_MINIONS, 15000);
}
else if (uint64 guid = instance->GetData64(DATA_NOVOS_SUMMONER_4))
if (Creature* crystalChannelTarget = instance->instance->GetCreature(guid))
crystalChannelTarget->AI()->SetData(SPELL_SUMMON_CRYSTAL_HANDLER, 15000);
}
uint8 _crystalHandlerCount;
bool _ohNovos;
bool _bubbled;
};
CreatureAI* GetAI(Creature* creature) const
@@ -247,126 +263,116 @@ public:
}
};
enum CrystalHandlerSpells
{
SPELL_FLASH_OF_DARKNESS = 49668,
H_SPELL_FLASH_OF_DARKNESS = 59004
};
class mob_crystal_handler : public CreatureScript
class npc_crystal_channel_target : public CreatureScript
{
public:
mob_crystal_handler() : CreatureScript("mob_crystal_handler") { }
npc_crystal_channel_target() : CreatureScript("npc_crystal_channel_target") {}
struct mob_crystal_handlerAI : public ScriptedAI
struct npc_crystal_channel_targetAI : public ScriptedAI
{
mob_crystal_handlerAI(Creature* creature) : ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
}
uint32 uiFlashOfDarknessTimer;
InstanceScript* instance;
npc_crystal_channel_targetAI(Creature* creature) : ScriptedAI(creature) {}
void Reset()
{
uiFlashOfDarknessTimer = 5*IN_MILLISECONDS;
}
void JustDied(Unit* /*killer*/)
{
if (Creature* pNovos = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_NOVOS) : 0))
CAST_AI(boss_novos::boss_novosAI, pNovos->AI())->RemoveCrystal();
_spell = 0;
_timer = 0;
_temp = 0;
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (uiFlashOfDarknessTimer <= diff)
if (_spell)
{
DoCast(me->getVictim(), DUNGEON_MODE(SPELL_FLASH_OF_DARKNESS, H_SPELL_FLASH_OF_DARKNESS));
uiFlashOfDarknessTimer = 5*IN_MILLISECONDS;
} else uiFlashOfDarknessTimer -= diff;
DoMeleeAttackIfReady();
}
void MovementInform(uint32 type, uint32 id)
{
if (type != POINT_MOTION_TYPE || id != 0)
return;
if (Creature* pNovos = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_NOVOS) : 0))
if (Unit* target = CAST_AI(boss_novos::boss_novosAI, pNovos->AI())->GetRandomTarget())
AttackStart(target);
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new mob_crystal_handlerAI(creature);
}
};
class mob_novos_minion : public CreatureScript
{
public:
mob_novos_minion() : CreatureScript("mob_novos_minion") { }
struct mob_novos_minionAI : public ScriptedAI
{
mob_novos_minionAI(Creature* creature) : ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
}
InstanceScript* instance;
void MovementInform(uint32 type, uint32 id)
{
if (type != POINT_MOTION_TYPE || id !=0)
return;
if (Creature* Novos = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_NOVOS) : 0))
{
Novos->AI()->DoAction(ACTION_MINION_REACHED);
if (Unit* target = CAST_AI(boss_novos::boss_novosAI, Novos->AI())->GetRandomTarget())
AttackStart(target);
if (_temp <= diff)
{
DoCast(_spell);
_temp = _timer;
}
else
_temp -= diff;
}
}
void SetData(uint32 id, uint32 value)
{
_spell = id;
_timer = value;
_temp = value;
}
void JustSummoned(Creature* summon)
{
if (InstanceScript* instance = me->GetInstanceScript())
if (uint64 guid = instance->GetData64(DATA_NOVOS))
if (Creature* novos = Creature::GetCreature(*me, guid))
novos->AI()->JustSummoned(summon);
if (summon)
summon->GetMotionMaster()->MovePath(summon->GetEntry() * 100, false);
if (_spell == SPELL_SUMMON_CRYSTAL_HANDLER)
Reset();
}
private:
uint32 _spell;
uint32 _timer;
uint32 _temp;
};
CreatureAI* GetAI(Creature* creature) const
{
return new mob_novos_minionAI(creature);
return new npc_crystal_channel_targetAI(creature);
}
};
class achievement_oh_novos : public AchievementCriteriaScript
{
public:
achievement_oh_novos() : AchievementCriteriaScript("achievement_oh_novos")
public:
achievement_oh_novos() : AchievementCriteriaScript("achievement_oh_novos") {}
bool OnCheck(Player* /*player*/, Unit* target)
{
return target && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(DATA_NOVOS_ACHIEV);
}
};
enum SummonMinions
{
SPELL_COPY_OF_SUMMON_MINIONS = 59933
};
class spell_summon_minions : public SpellScriptLoader
{
public:
spell_summon_minions() : SpellScriptLoader("spell_summon_minions") { }
class spell_summon_minions_SpellScript : public SpellScript
{
PrepareSpellScript(spell_summon_minions_SpellScript);
void HandleScript(SpellEffIndex /*effIndex*/)
{
GetCaster()->CastSpell((Unit*)NULL, SPELL_COPY_OF_SUMMON_MINIONS, true);
GetCaster()->CastSpell((Unit*)NULL, SPELL_COPY_OF_SUMMON_MINIONS, true);
}
bool OnCheck(Player* /*player*/, Unit* target)
void Register()
{
if (!target)
return false;
if (Creature* Novos = target->ToCreature())
if (Novos->AI()->GetData(DATA_OH_NOVOS))
return true;
return false;
OnEffectHitTarget += SpellEffectFn(spell_summon_minions_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
SpellScript* GetSpellScript() const
{
return new spell_summon_minions_SpellScript();
}
};
void AddSC_boss_novos()
{
new boss_novos();
new mob_crystal_handler();
new mob_novos_minion();
new npc_crystal_channel_target();
new spell_summon_minions();
new achievement_oh_novos();
}

View File

@@ -31,9 +31,16 @@ enum Data64
DATA_NOVOS,
DATA_DRED,
DATA_THARON_JA,
DATA_NOVOS_CRYSTAL_1,
DATA_NOVOS_CRYSTAL_2,
DATA_NOVOS_CRYSTAL_3,
DATA_NOVOS_CRYSTAL_4
DATA_NOVOS_CRYSTAL_4,
DATA_NOVOS_SUMMONER_1,
DATA_NOVOS_SUMMONER_2,
DATA_NOVOS_SUMMONER_3,
DATA_NOVOS_SUMMONER_4,
ACTION_CRYSTAL_HANDLER_DIED
};
#endif

View File

@@ -16,6 +16,7 @@
*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "InstanceScript.h"
#include "drak_tharon_keep.h"
@@ -30,17 +31,23 @@
enum Creatures
{
NPC_TROLLGORE = 26630,
NPC_NOVOS = 26631,
NPC_KING_DRED = 27483,
NPC_THARON_JA = 26632
NPC_TROLLGORE = 26630,
NPC_NOVOS = 26631,
NPC_KING_DRED = 27483,
NPC_THARON_JA = 26632,
NPC_CRYSTAL_CHANNEL_TARGET = 26712,
NPC_CRYSTAL_HANDLER = 26627
};
enum GameObjects
{
GO_NOVOS_CRYSTAL_1 = 189299,
GO_NOVOS_CRYSTAL_2 = 189300,
GO_NOVOS_CRYSTAL_3 = 189301,
GO_NOVOS_CRYSTAL_4 = 189302
GO_NOVOS_CRYSTAL_1 = 189299,
GO_NOVOS_CRYSTAL_2 = 189300,
GO_NOVOS_CRYSTAL_3 = 189301,
GO_NOVOS_CRYSTAL_4 = 189302
};
enum Achievements
{
ACM_CRITERIA_OH_NOVOS = 7361
};
class instance_drak_tharon : public InstanceMapScript
@@ -52,17 +59,22 @@ public:
{
instance_drak_tharon_InstanceScript(Map* map) : InstanceScript(map) {}
uint8 uiDredAchievCounter;
uint8 dredAchievCounter;
uint64 uiTrollgore;
uint64 uiNovos;
uint64 uiDred;
uint64 uiTharonJa;
uint64 trollgoreGUID;
uint64 novosGUID;
uint64 dredGUID;
uint64 tharonJaGUID;
uint64 uiNovosCrystal1;
uint64 uiNovosCrystal2;
uint64 uiNovosCrystal3;
uint64 uiNovosCrystal4;
uint64 novosCrystalGUID1;
uint64 novosCrystalGUID2;
uint64 novosCrystalGUID3;
uint64 novosCrystalGUID4;
uint64 novosSummonerGUID1;
uint64 novosSummonerGUID2;
uint64 novosSummonerGUID3;
uint64 novosSummonerGUID4;
uint16 m_auiEncounter[MAX_ENCOUNTER];
@@ -71,15 +83,23 @@ public:
void Initialize()
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
uiTrollgore = 0;
uiNovos = 0;
uiDred = 0;
uiTharonJa = 0;
uiNovosCrystal1 = 0;
uiNovosCrystal2 = 0;
uiNovosCrystal3 = 0;
uiNovosCrystal4 = 0;
uiDredAchievCounter = 0;
dredAchievCounter = 0;
trollgoreGUID = 0;
novosGUID = 0;
dredGUID = 0;
tharonJaGUID = 0;
novosCrystalGUID1 = 0;
novosCrystalGUID2 = 0;
novosCrystalGUID3 = 0;
novosCrystalGUID4 = 0;
novosSummonerGUID1 = 0;
novosSummonerGUID2 = 0;
novosSummonerGUID3 = 0;
novosSummonerGUID4 = 0;
}
bool IsEncounterInProgress() const
@@ -96,16 +116,20 @@ public:
switch (go->GetEntry())
{
case GO_NOVOS_CRYSTAL_1:
uiNovosCrystal1 = go->GetGUID();
novosCrystalGUID1 = go->GetGUID();
go->SetGoState(GO_STATE_READY);
break;
case GO_NOVOS_CRYSTAL_2:
uiNovosCrystal2 = go->GetGUID();
novosCrystalGUID2 = go->GetGUID();
go->SetGoState(GO_STATE_READY);
break;
case GO_NOVOS_CRYSTAL_3:
uiNovosCrystal3 = go->GetGUID();
novosCrystalGUID3 = go->GetGUID();
go->SetGoState(GO_STATE_READY);
break;
case GO_NOVOS_CRYSTAL_4:
uiNovosCrystal4 = go->GetGUID();
novosCrystalGUID4 = go->GetGUID();
go->SetGoState(GO_STATE_READY);
break;
}
}
@@ -115,32 +139,55 @@ public:
switch (creature->GetEntry())
{
case NPC_TROLLGORE:
uiTrollgore = creature->GetGUID();
trollgoreGUID = creature->GetGUID();
break;
case NPC_NOVOS:
uiNovos = creature->GetGUID();
novosGUID = creature->GetGUID();
break;
case NPC_KING_DRED:
uiDred = creature->GetGUID();
dredGUID = creature->GetGUID();
break;
case NPC_THARON_JA:
uiTharonJa = creature->GetGUID();
tharonJaGUID = creature->GetGUID();
break;
case NPC_CRYSTAL_CHANNEL_TARGET:
InitializeNovosSummoner(creature);
break;
}
}
void InitializeNovosSummoner(Creature* creature)
{
float x = creature->GetPositionX();
float y = creature->GetPositionY();
float z = creature->GetPositionZ();
if (x < -374.0f && x > -379.0f && y > -820.0f && y < -815.0f && z < 60.0f && z > 58.0f)
novosSummonerGUID1 = creature->GetGUID();
else if (x < -379.0f && x > -385.0f && y > -820.0f && y < -815.0f && z < 60.0f && z > 58.0f)
novosSummonerGUID2 = creature->GetGUID();
else if (x < -374.0f && x > -385.0f && y > -827.0f && y < -820.0f && z < 60.0f && z > 58.0f)
novosSummonerGUID3 = creature->GetGUID();
else if (x < -338.0f && x > -344.0f && y > -727.0f && y < 721.0f && z < 30.0f && z > 26.0f)
novosSummonerGUID4 = creature->GetGUID();
}
uint64 GetData64(uint32 identifier) const
{
switch (identifier)
{
case DATA_TROLLGORE: return uiTrollgore;
case DATA_NOVOS: return uiNovos;
case DATA_DRED: return uiDred;
case DATA_THARON_JA: return uiTharonJa;
case DATA_NOVOS_CRYSTAL_1: return uiNovosCrystal1;
case DATA_NOVOS_CRYSTAL_2: return uiNovosCrystal2;
case DATA_NOVOS_CRYSTAL_3: return uiNovosCrystal3;
case DATA_NOVOS_CRYSTAL_4: return uiNovosCrystal4;
case DATA_TROLLGORE: return trollgoreGUID;
case DATA_NOVOS: return novosGUID;
case DATA_DRED: return dredGUID;
case DATA_THARON_JA: return tharonJaGUID;
case DATA_NOVOS_CRYSTAL_1: return novosCrystalGUID1;
case DATA_NOVOS_CRYSTAL_2: return novosCrystalGUID2;
case DATA_NOVOS_CRYSTAL_3: return novosCrystalGUID3;
case DATA_NOVOS_CRYSTAL_4: return novosCrystalGUID4;
case DATA_NOVOS_SUMMONER_1: return novosSummonerGUID1;
case DATA_NOVOS_SUMMONER_2: return novosSummonerGUID2;
case DATA_NOVOS_SUMMONER_3: return novosSummonerGUID3;
case DATA_NOVOS_SUMMONER_4: return novosSummonerGUID4;
}
return 0;
@@ -164,7 +211,7 @@ public:
break;
case DATA_KING_DRED_ACHIEV:
uiDredAchievCounter = data;
dredAchievCounter = data;
break;
}
@@ -182,7 +229,7 @@ public:
case DATA_NOVOS_EVENT: return m_auiEncounter[1];
case DATA_DRED_EVENT: return m_auiEncounter[2];
case DATA_THARON_JA_EVENT: return m_auiEncounter[3];
case DATA_KING_DRED_ACHIEV: return uiDredAchievCounter;
case DATA_KING_DRED_ACHIEV: return dredAchievCounter;
}
return 0;
}
@@ -199,6 +246,14 @@ public:
return saveStream.str();
}
void OnUnitDeath(Unit* unit)
{
if (unit->GetEntry() == NPC_CRYSTAL_HANDLER)
if (novosGUID)
if (Creature* novos = instance->GetCreature(novosGUID))
novos->AI()->DoAction(ACTION_CRYSTAL_HANDLER_DIED);
}
void Load(const char* in)
{
if (!in)