mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-02-14 16:03:45 +00:00
Merge branch 'master' of https://github.com/azerothcore/azerothcore-wotlk into dir-restructure
This commit is contained in:
@@ -78,8 +78,8 @@ message("")
|
||||
include_directories(
|
||||
${scripts_INCLUDE_DIRS}
|
||||
${CMAKE_BINARY_DIR}
|
||||
${CMAKE_SOURCE_DIR}/deps/recastnavigation/Detour
|
||||
${CMAKE_SOURCE_DIR}/deps/recastnavigation/Recast
|
||||
${CMAKE_SOURCE_DIR}/deps/recastnavigation/Detour/Include
|
||||
${CMAKE_SOURCE_DIR}/deps/recastnavigation/Recast/Include
|
||||
${CMAKE_SOURCE_DIR}/deps/g3dlite/include
|
||||
${CMAKE_SOURCE_DIR}/deps/SFMT
|
||||
${CMAKE_SOURCE_DIR}/deps/zlib
|
||||
|
||||
@@ -31,6 +31,7 @@ set(scripts_STAT_SRCS
|
||||
Commands/cs_lookup.cpp
|
||||
Commands/cs_message.cpp
|
||||
Commands/cs_misc.cpp
|
||||
Commands/cs_mmaps.cpp
|
||||
Commands/cs_modify.cpp
|
||||
Commands/cs_npc.cpp
|
||||
Commands/cs_quest.cpp
|
||||
|
||||
@@ -191,14 +191,10 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
const uint32 VISUAL_AURA = 37800;
|
||||
std::string param = (char*)args;
|
||||
|
||||
if (param == "on")
|
||||
{
|
||||
if (_player->HasAura(VISUAL_AURA, 0))
|
||||
_player->RemoveAurasDueToSpell(VISUAL_AURA);
|
||||
|
||||
_player->SetGMVisible(true);
|
||||
//_player->UpdateObjectVisibility();
|
||||
handler->GetSession()->SendNotification(LANG_INVISIBLE_VISIBLE);
|
||||
@@ -208,7 +204,6 @@ public:
|
||||
|
||||
if (param == "off")
|
||||
{
|
||||
_player->AddAura(VISUAL_AURA, _player);
|
||||
_player->SetGMVisible(false);
|
||||
//_player->UpdateObjectVisibility();
|
||||
handler->GetSession()->SendNotification(LANG_INVISIBLE_INVISIBLE);
|
||||
|
||||
@@ -417,7 +417,7 @@ public:
|
||||
|
||||
uint32 areaId = id ? (uint32)atoi(id) : player->GetZoneId();
|
||||
|
||||
AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(areaId);
|
||||
AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId);
|
||||
|
||||
if (x < 0 || x > 100 || y < 0 || y > 100 || !areaEntry)
|
||||
{
|
||||
@@ -427,7 +427,7 @@ public:
|
||||
}
|
||||
|
||||
// update to parent zone if exist (client map show only zones without parents)
|
||||
AreaTableEntry const* zoneEntry = areaEntry->zone ? GetAreaEntryByAreaID(areaEntry->zone) : areaEntry;
|
||||
AreaTableEntry const* zoneEntry = areaEntry->zone ? sAreaTableStore.LookupEntry(areaEntry->zone) : areaEntry;
|
||||
|
||||
Map const* map = sMapMgr->CreateBaseMap(zoneEntry->mapid);
|
||||
|
||||
|
||||
@@ -548,6 +548,7 @@ public:
|
||||
stmt->setFloat(5, player->GetPositionY());
|
||||
stmt->setFloat(6, player->GetPositionZ());
|
||||
stmt->setFloat(7, distance * distance);
|
||||
stmt->setFloat(8, player->GetPhaseMask());
|
||||
PreparedQueryResult result = WorldDatabase.Query(stmt);
|
||||
|
||||
if (result)
|
||||
|
||||
@@ -86,9 +86,9 @@ public:
|
||||
wstrToLower(wNamePart);
|
||||
|
||||
// Search in AreaTable.dbc
|
||||
for (uint32 areaflag = 0; areaflag < sAreaStore.GetNumRows(); ++areaflag)
|
||||
for (uint32 i = 0; i < sAreaTableStore.GetNumRows(); ++i)
|
||||
{
|
||||
AreaTableEntry const* areaEntry = sAreaStore.LookupEntry(areaflag);
|
||||
AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(i);
|
||||
if (areaEntry)
|
||||
{
|
||||
int locale = handler->GetSessionDbcLocale();
|
||||
|
||||
@@ -400,8 +400,8 @@ public:
|
||||
object->GetZoneAndAreaId(zoneId, areaId);
|
||||
|
||||
MapEntry const* mapEntry = sMapStore.LookupEntry(object->GetMapId());
|
||||
AreaTableEntry const* zoneEntry = GetAreaEntryByAreaID(zoneId);
|
||||
AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(areaId);
|
||||
AreaTableEntry const* zoneEntry = sAreaTableStore.LookupEntry(zoneId);
|
||||
AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId);
|
||||
|
||||
float zoneX = object->GetPositionX();
|
||||
float zoneY = object->GetPositionY();
|
||||
@@ -612,8 +612,8 @@ public:
|
||||
else
|
||||
_player->SaveRecallPosition();
|
||||
|
||||
_player->TeleportTo(target->GetMapId(), target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()+0.25f, _player->GetOrientation(), TELE_TO_GM_MODE);
|
||||
_player->SetPhaseMask(target->GetPhaseMask() | 1, false);
|
||||
if (_player->TeleportTo(target->GetMapId(), target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()+0.25f, _player->GetOrientation(), TELE_TO_GM_MODE, target))
|
||||
_player->SetPhaseMask(target->GetPhaseMask() | 1, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -734,8 +734,8 @@ public:
|
||||
// before GM
|
||||
float x, y, z;
|
||||
handler->GetSession()->GetPlayer()->GetClosePoint(x, y, z, target->GetObjectSize());
|
||||
target->TeleportTo(handler->GetSession()->GetPlayer()->GetMapId(), x, y, z, target->GetOrientation());
|
||||
target->SetPhaseMask(handler->GetSession()->GetPlayer()->GetPhaseMask(), false);
|
||||
if (target->TeleportTo(handler->GetSession()->GetPlayer()->GetMapId(), x, y, z, target->GetOrientation(), 0, handler->GetSession()->GetPlayer()))
|
||||
target->SetPhaseMask(handler->GetSession()->GetPlayer()->GetPhaseMask(), false);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -845,7 +845,7 @@ public:
|
||||
// before GM
|
||||
float x, y, z;
|
||||
handler->GetSession()->GetPlayer()->GetClosePoint(x, y, z, player->GetObjectSize());
|
||||
player->TeleportTo(handler->GetSession()->GetPlayer()->GetMapId(), x, y, z, player->GetOrientation());
|
||||
player->TeleportTo(handler->GetSession()->GetPlayer()->GetMapId(), x, y, z, player->GetOrientation(), 0, handler->GetSession()->GetPlayer());
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -1280,7 +1280,7 @@ public:
|
||||
|
||||
uint32 zoneId = player->GetZoneId();
|
||||
|
||||
AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(zoneId);
|
||||
AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(zoneId);
|
||||
if (!areaEntry || areaEntry->zone !=0)
|
||||
{
|
||||
handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDWRONGZONE, graveyardId, zoneId);
|
||||
@@ -1411,17 +1411,23 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
int32 area = GetAreaFlagByAreaID(atoi((char*)args));
|
||||
int32 offset = area / 32;
|
||||
uint32 val = uint32((1 << (area % 32)));
|
||||
|
||||
if (area<0 || offset >= PLAYER_EXPLORED_ZONES_SIZE)
|
||||
AreaTableEntry const* area = sAreaTableStore.LookupEntry(atoi(args));
|
||||
if (!area)
|
||||
{
|
||||
handler->SendSysMessage(LANG_BAD_VALUE);
|
||||
handler->SetSentErrorMessage(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
int32 offset = area->exploreFlag / 32;
|
||||
if (offset >= PLAYER_EXPLORED_ZONES_SIZE)
|
||||
{
|
||||
handler->SendSysMessage(LANG_BAD_VALUE);
|
||||
handler->SetSentErrorMessage(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32 val = uint32((1 << (area->exploreFlag % 32)));
|
||||
uint32 currFields = playerTarget->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset);
|
||||
playerTarget->SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, uint32((currFields | val)));
|
||||
|
||||
@@ -1442,17 +1448,23 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
int32 area = GetAreaFlagByAreaID(atoi((char*)args));
|
||||
int32 offset = area / 32;
|
||||
uint32 val = uint32((1 << (area % 32)));
|
||||
|
||||
if (area < 0 || offset >= PLAYER_EXPLORED_ZONES_SIZE)
|
||||
AreaTableEntry const* area = sAreaTableStore.LookupEntry(atoi(args));
|
||||
if (!area)
|
||||
{
|
||||
handler->SendSysMessage(LANG_BAD_VALUE);
|
||||
handler->SetSentErrorMessage(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
int32 offset = area->exploreFlag / 32;
|
||||
if (offset >= PLAYER_EXPLORED_ZONES_SIZE)
|
||||
{
|
||||
handler->SendSysMessage(LANG_BAD_VALUE);
|
||||
handler->SetSentErrorMessage(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32 val = uint32((1 << (area->exploreFlag % 32)));
|
||||
uint32 currFields = playerTarget->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset);
|
||||
playerTarget->SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, uint32((currFields ^ val)));
|
||||
|
||||
@@ -2025,12 +2037,12 @@ public:
|
||||
|
||||
MapEntry const* map = sMapStore.LookupEntry(mapId);
|
||||
|
||||
AreaTableEntry const* area = GetAreaEntryByAreaID(areaId);
|
||||
AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId);
|
||||
if (area)
|
||||
{
|
||||
areaName = area->area_name[locale];
|
||||
|
||||
AreaTableEntry const* zone = GetAreaEntryByAreaID(area->zone);
|
||||
AreaTableEntry const* zone = sAreaTableStore.LookupEntry(area->zone);
|
||||
if (zone)
|
||||
zoneName = zone->area_name[locale];
|
||||
}
|
||||
|
||||
@@ -668,6 +668,7 @@ public:
|
||||
stmt->setFloat(5, player->GetPositionY());
|
||||
stmt->setFloat(6, player->GetPositionZ());
|
||||
stmt->setFloat(7, distance * distance);
|
||||
stmt->setFloat(8, player->GetPhaseMask());
|
||||
PreparedQueryResult result = WorldDatabase.Query(stmt);
|
||||
|
||||
if (result)
|
||||
|
||||
@@ -6,14 +6,20 @@ They will be git-ignored
|
||||
Remember to use cmake macro inside your CMakeLists.txt to correctly
|
||||
add scripts to project solution.
|
||||
|
||||
BTW, **We strongly suggest you** to use our module system to create your custom
|
||||
|
||||
|
||||
/!\ BTW, **We strongly suggest you** to use our module system to create your custom
|
||||
powerful module instead of simple scripts.
|
||||
|
||||
|
||||
|
||||
|
||||
-----------------
|
||||
CMakeLists.txt example:
|
||||
How to:
|
||||
|
||||
1) Create a CMakeLists.txt in this directory
|
||||
|
||||
Example (everything below is needed, just replace with your scripts' names):
|
||||
|
||||
set(scripts_STAT_SRCS
|
||||
${scripts_STAT_SRCS}
|
||||
@@ -24,3 +30,8 @@ set(scripts_STAT_SRCS
|
||||
AC_ADD_SCRIPT_LOADER("Custom" "ScriptLoader.h")
|
||||
|
||||
message(" -> Prepared: My custom scripts")
|
||||
|
||||
|
||||
2) Add them to ../ScriptLoader.cpp
|
||||
|
||||
Open the file and go at the end of the file to know what to edit.
|
||||
|
||||
@@ -110,4 +110,9 @@ enum GameObjectsIds
|
||||
GO_UROK_PILE = 175621,
|
||||
};
|
||||
|
||||
enum npcspells
|
||||
{
|
||||
SPELL_FINKLE_IS_EINHORN = 16710
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -67,6 +67,19 @@ public:
|
||||
memset(go_emberseerrunes, 0, sizeof(go_emberseerrunes));
|
||||
}
|
||||
|
||||
void CreatureLooted(Creature* creature, LootType loot)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_THE_BEAST:
|
||||
if (loot == LOOT_SKINNING)
|
||||
{
|
||||
creature->CastSpell(creature, SPELL_FINKLE_IS_EINHORN, true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
|
||||
@@ -61,6 +61,17 @@ class boss_golemagg : public CreatureScript
|
||||
{
|
||||
BossAI::EnterCombat(victim);
|
||||
events.ScheduleEvent(EVENT_PYROBLAST, 7000);
|
||||
|
||||
// The two ragers should join the fight alongside me against my foes.
|
||||
std::list<Creature *> ragers;
|
||||
me->GetCreaturesWithEntryInRange(ragers, 100, NPC_CORE_RAGER);
|
||||
for (Creature * i : ragers)
|
||||
{
|
||||
if (i && i->IsAlive() && !i->IsInCombat())
|
||||
{
|
||||
i->AI()->AttackStart(victim);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask)
|
||||
|
||||
@@ -4,12 +4,12 @@
|
||||
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Magmadar
|
||||
SD%Complete: 75
|
||||
SDComment: Conflag on ground nyi
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
/* ScriptData
|
||||
SDName: Boss_Magmadar
|
||||
SD%Complete: 75
|
||||
SDComment: Conflag on ground nyi
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
|
||||
#include "ObjectMgr.h"
|
||||
#include "ScriptMgr.h"
|
||||
@@ -18,93 +18,229 @@ EndScriptData */
|
||||
|
||||
enum Texts
|
||||
{
|
||||
EMOTE_FRENZY = 0
|
||||
EMOTE_FRENZY = 0,
|
||||
EMOTE_SMOLDERING = 0,
|
||||
EMOTE_IGNITE = 1,
|
||||
};
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_FRENZY = 19451,
|
||||
SPELL_MAGMA_SPIT = 19449,
|
||||
SPELL_PANIC = 19408,
|
||||
SPELL_LAVA_BOMB = 19428,
|
||||
SPELL_FRENZY = 19451,
|
||||
SPELL_MAGMA_SPIT = 19449,
|
||||
SPELL_PANIC = 19408,
|
||||
SPELL_LAVA_BOMB = 19428,
|
||||
SPELL_SERRATED_BITE = 19771,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_FRENZY = 1,
|
||||
EVENT_PANIC = 2,
|
||||
EVENT_LAVA_BOMB = 3,
|
||||
EVENT_FRENZY = 1,
|
||||
EVENT_PANIC = 2,
|
||||
EVENT_LAVA_BOMB = 3,
|
||||
EVENT_SERRATED_BITE = 1,
|
||||
EVENT_IGNITE = 2,
|
||||
};
|
||||
|
||||
class boss_magmadar : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_magmadar() : CreatureScript("boss_magmadar") { }
|
||||
public:
|
||||
boss_magmadar() : CreatureScript("boss_magmadar") { }
|
||||
|
||||
struct boss_magmadarAI : public BossAI
|
||||
struct boss_magmadarAI : public BossAI
|
||||
{
|
||||
boss_magmadarAI(Creature* creature) : BossAI(creature, BOSS_MAGMADAR)
|
||||
{
|
||||
boss_magmadarAI(Creature* creature) : BossAI(creature, BOSS_MAGMADAR)
|
||||
{
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
DoCast(me, SPELL_MAGMA_SPIT, true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* victim)
|
||||
{
|
||||
BossAI::EnterCombat(victim);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 30000);
|
||||
events.ScheduleEvent(EVENT_PANIC, 20000);
|
||||
events.ScheduleEvent(EVENT_LAVA_BOMB, 12000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_FRENZY:
|
||||
Talk(EMOTE_FRENZY);
|
||||
DoCast(me, SPELL_FRENZY);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 15000);
|
||||
break;
|
||||
case EVENT_PANIC:
|
||||
DoCastVictim(SPELL_PANIC);
|
||||
events.ScheduleEvent(EVENT_PANIC, 35000);
|
||||
break;
|
||||
case EVENT_LAVA_BOMB:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_LAVA_BOMB))
|
||||
DoCast(target, SPELL_LAVA_BOMB);
|
||||
events.ScheduleEvent(EVENT_LAVA_BOMB, 12000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_magmadarAI(creature);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
DoCast(me, SPELL_MAGMA_SPIT, true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* victim)
|
||||
{
|
||||
BossAI::EnterCombat(victim);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 30000);
|
||||
events.ScheduleEvent(EVENT_PANIC, 20000);
|
||||
events.ScheduleEvent(EVENT_LAVA_BOMB, 12000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_FRENZY:
|
||||
Talk(EMOTE_FRENZY);
|
||||
DoCast(me, SPELL_FRENZY);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 15000);
|
||||
break;
|
||||
case EVENT_PANIC:
|
||||
DoCastVictim(SPELL_PANIC);
|
||||
events.ScheduleEvent(EVENT_PANIC, 35000);
|
||||
break;
|
||||
case EVENT_LAVA_BOMB:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_LAVA_BOMB))
|
||||
DoCast(target, SPELL_LAVA_BOMB);
|
||||
events.ScheduleEvent(EVENT_LAVA_BOMB, 12000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_magmadarAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
// Serrated Bites timer may be wrong
|
||||
class npc_magmadar_core_hound : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_magmadar_core_hound() : CreatureScript("npc_magmadar_core_hound") { }
|
||||
|
||||
struct npc_magmadar_core_houndAI : public CreatureAI
|
||||
{
|
||||
npc_magmadar_core_houndAI(Creature* creature) : CreatureAI(creature)
|
||||
{
|
||||
}
|
||||
|
||||
EventMap events;
|
||||
std::list<Creature *> hounds;
|
||||
bool smoldering = false;
|
||||
Unit* killer;
|
||||
|
||||
void removeFeignDeath() {
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||
me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
me->RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT);
|
||||
me->ClearUnitState(UNIT_STATE_DIED);
|
||||
me->ClearUnitState(UNIT_STATE_CANNOT_AUTOATTACK);
|
||||
me->DisableRotate(false);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/)
|
||||
{
|
||||
if (me->HealthBelowPctDamaged(0, damage))
|
||||
{
|
||||
if (!smoldering)
|
||||
{
|
||||
killer = attacker;
|
||||
events.ScheduleEvent(EVENT_IGNITE, 10000);
|
||||
me->SetHealth(1);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||
me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
me->AddUnitMovementFlag(MOVEMENTFLAG_ROOT);
|
||||
me->AddUnitState(UNIT_STATE_DIED);
|
||||
me->AddUnitState(UNIT_STATE_CANNOT_AUTOATTACK);
|
||||
me->DisableRotate(true);
|
||||
Talk(EMOTE_SMOLDERING);
|
||||
}
|
||||
damage = 0;
|
||||
smoldering = true;
|
||||
}
|
||||
}
|
||||
|
||||
void Reset() {
|
||||
removeFeignDeath();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) {
|
||||
removeFeignDeath();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*victim*/)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SERRATED_BITE, 10000); // timer may be wrong
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim() && !smoldering)
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SERRATED_BITE:
|
||||
if (UpdateVictim() && !smoldering) {
|
||||
DoCast(me->GetVictim(), SPELL_SERRATED_BITE);
|
||||
events.ScheduleEvent(EVENT_SERRATED_BITE, 10000); // again, timer may be wrong
|
||||
}
|
||||
break;
|
||||
case EVENT_IGNITE:
|
||||
smoldering = false;
|
||||
me->GetCreaturesWithEntryInRange(hounds, 80, NPC_CORE_HOUND);
|
||||
for (Creature * i : hounds)
|
||||
{
|
||||
if (i && i->IsAlive() && i->IsInCombat() && !i->HasUnitState(UNIT_STATE_DIED))
|
||||
{
|
||||
Talk(EMOTE_IGNITE);
|
||||
me->SetFullHealth();
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||
me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
me->RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT);
|
||||
me->ClearUnitState(UNIT_STATE_DIED);
|
||||
me->ClearUnitState(UNIT_STATE_CANNOT_AUTOATTACK);
|
||||
me->DisableRotate(false);
|
||||
me->AI()->AttackStart(i->GetVictim());
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (me->HasUnitState(UNIT_STATE_DIED))
|
||||
{
|
||||
if (killer)
|
||||
{
|
||||
me->Kill(killer, me);
|
||||
}
|
||||
else
|
||||
{
|
||||
me->Kill(me, me);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_magmadar_core_houndAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_magmadar()
|
||||
{
|
||||
new boss_magmadar();
|
||||
new npc_magmadar_core_hound();
|
||||
}
|
||||
|
||||
@@ -80,6 +80,8 @@ class boss_majordomo : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_DAMAGE_REFLECTION, 15000);
|
||||
events.ScheduleEvent(EVENT_BLAST_WAVE, 10000);
|
||||
events.ScheduleEvent(EVENT_TELEPORT, 20000);
|
||||
// Call every flamewaker around him
|
||||
me->CallForHelp(30);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
|
||||
@@ -61,6 +61,7 @@ enum Events
|
||||
EVENT_INTRO_5 = 12
|
||||
};
|
||||
|
||||
|
||||
class boss_ragnaros : public CreatureScript
|
||||
{
|
||||
public:
|
||||
@@ -83,6 +84,7 @@ class boss_ragnaros : public CreatureScript
|
||||
_hasSubmergedOnce = false;
|
||||
_isBanished = false;
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
|
||||
me->SetOrientation(0.8f);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* victim)
|
||||
|
||||
@@ -20,15 +20,15 @@ EndScriptData */
|
||||
|
||||
Position const SummonPositions[10] =
|
||||
{
|
||||
{737.850f, -1145.35f, -120.288f, 4.71368f},
|
||||
{744.162f, -1151.63f, -119.726f, 4.58204f},
|
||||
{751.247f, -1152.82f, -119.744f, 4.49673f},
|
||||
{759.206f, -1155.09f, -120.051f, 4.30104f},
|
||||
{755.973f, -1152.33f, -120.029f, 4.25588f},
|
||||
{731.712f, -1147.56f, -120.195f, 4.95955f},
|
||||
{726.499f, -1149.80f, -120.156f, 5.24055f},
|
||||
{722.408f, -1152.41f, -120.029f, 5.33087f},
|
||||
{718.994f, -1156.36f, -119.805f, 5.75738f},
|
||||
{759.542f, -1173.43f, -118.974f, 3.3048f},
|
||||
{761.652f, -1164.30f, -119.533f, 3.3919f},
|
||||
{747.323f, -1149.24f, -120.060f, 3.6629f},
|
||||
{766.734f, -1183.16f, -119.292f, 2.9889f},
|
||||
{757.364f, -1198.31f, -118.652f, 2.3095f},
|
||||
{752.349f, -1159.19f, -119.261f, 3.6032f},
|
||||
{738.015f, -1152.22f, -119.512f, 4.0792f},
|
||||
{757.246f, -1189.79f, -118.633f, 2.5333f},
|
||||
{745.916f, -1199.35f, -118.119f, 1.8932f},
|
||||
{838.510f, -829.840f, -232.000f, 2.00000f},
|
||||
};
|
||||
|
||||
@@ -45,29 +45,17 @@ class instance_molten_core : public InstanceMapScript
|
||||
_golemaggTheIncineratorGUID = 0;
|
||||
_majordomoExecutusGUID = 0;
|
||||
_cacheOfTheFirelordGUID = 0;
|
||||
_executusSchedule = NULL;
|
||||
_deadBossCount = 0;
|
||||
_ragnarosAddDeaths = 0;
|
||||
_isLoading = false;
|
||||
_summonedExecutus = false;
|
||||
}
|
||||
|
||||
~instance_molten_core_InstanceMapScript()
|
||||
void OnPlayerEnter(Player* /*player*/) override
|
||||
{
|
||||
delete _executusSchedule;
|
||||
if (CheckMajordomoExecutus())
|
||||
SummonMajordomoExecutus();
|
||||
}
|
||||
|
||||
void OnPlayerEnter(Player* /*player*/)
|
||||
{
|
||||
if (_executusSchedule)
|
||||
{
|
||||
SummonMajordomoExecutus(*_executusSchedule);
|
||||
delete _executusSchedule;
|
||||
_executusSchedule = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
void OnCreatureCreate(Creature* creature) override
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
@@ -82,19 +70,40 @@ class instance_molten_core : public InstanceMapScript
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
void OnGameObjectCreate(GameObject* go) override
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_CACHE_OF_THE_FIRELORD:
|
||||
_cacheOfTheFirelordGUID = go->GetGUID();
|
||||
break;
|
||||
case GO_CIRCLE_BARON:
|
||||
_circlesGUIDs[5] = go->GetGUID();
|
||||
break;
|
||||
case GO_CIRCLE_GARR:
|
||||
_circlesGUIDs[3] = go->GetGUID();
|
||||
break;
|
||||
case GO_CIRCLE_GEHENNAS:
|
||||
_circlesGUIDs[2] = go->GetGUID();
|
||||
break;
|
||||
case GO_CIRCLE_GOLEMAGG:
|
||||
_circlesGUIDs[7] = go->GetGUID();
|
||||
break;
|
||||
case GO_CIRCLE_MAGMADAR:
|
||||
_circlesGUIDs[1] = go->GetGUID();
|
||||
break;
|
||||
case GO_CIRCLE_SHAZZRAH:
|
||||
_circlesGUIDs[4] = go->GetGUID();
|
||||
break;
|
||||
case GO_CIRCLE_SULFURON:
|
||||
_circlesGUIDs[6] = go->GetGUID();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
void SetData(uint32 type, uint32 data) override
|
||||
{
|
||||
if (type == DATA_RAGNAROS_ADDS)
|
||||
{
|
||||
@@ -105,7 +114,7 @@ class instance_molten_core : public InstanceMapScript
|
||||
}
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const
|
||||
uint32 GetData(uint32 type) const override
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
@@ -116,7 +125,7 @@ class instance_molten_core : public InstanceMapScript
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 type) const
|
||||
uint64 GetData64(uint32 type) const override
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
@@ -129,33 +138,28 @@ class instance_molten_core : public InstanceMapScript
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 bossId, EncounterState state)
|
||||
bool SetBossState(uint32 bossId, EncounterState state) override
|
||||
{
|
||||
if (!InstanceScript::SetBossState(bossId, state))
|
||||
return false;
|
||||
|
||||
|
||||
if (state == DONE && bossId < BOSS_MAJORDOMO_EXECUTUS)
|
||||
++_deadBossCount;
|
||||
|
||||
if (_isLoading)
|
||||
return true;
|
||||
|
||||
if (_deadBossCount == 8)
|
||||
SummonMajordomoExecutus(false);
|
||||
|
||||
if (bossId == BOSS_MAJORDOMO_EXECUTUS && state == DONE)
|
||||
if (CheckMajordomoExecutus())
|
||||
SummonMajordomoExecutus();
|
||||
|
||||
if (bossId == BOSS_MAJORDOMO_EXECUTUS && state == DONE) {
|
||||
DoRespawnGameObject(_cacheOfTheFirelordGUID, 7 * DAY);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void SummonMajordomoExecutus(bool done)
|
||||
void SummonMajordomoExecutus()
|
||||
{
|
||||
if (_summonedExecutus)
|
||||
if (_majordomoExecutusGUID)
|
||||
return;
|
||||
|
||||
_summonedExecutus = true;
|
||||
if (!done)
|
||||
if (GetBossState(BOSS_MAJORDOMO_EXECUTUS) != DONE)
|
||||
{
|
||||
instance->SummonCreature(NPC_MAJORDOMO_EXECUTUS, SummonPositions[0]);
|
||||
instance->SummonCreature(NPC_FLAMEWAKER_HEALER, SummonPositions[1]);
|
||||
@@ -168,10 +172,22 @@ class instance_molten_core : public InstanceMapScript
|
||||
instance->SummonCreature(NPC_FLAMEWAKER_ELITE, SummonPositions[8]);
|
||||
}
|
||||
else if (TempSummon* summon = instance->SummonCreature(NPC_MAJORDOMO_EXECUTUS, RagnarosTelePos))
|
||||
summon->AI()->DoAction(ACTION_START_RAGNAROS_ALT);
|
||||
summon->AI()->DoAction(ACTION_START_RAGNAROS_ALT);
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
bool CheckMajordomoExecutus() const
|
||||
{
|
||||
if (GetBossState(BOSS_RAGNAROS) == DONE)
|
||||
return false;
|
||||
|
||||
for (uint8 i = 0; i < BOSS_MAJORDOMO_EXECUTUS; ++i)
|
||||
if (GetBossState(i) != DONE)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string GetSaveData() override
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
@@ -182,7 +198,7 @@ class instance_molten_core : public InstanceMapScript
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(char const* data)
|
||||
void Load(char const* data) override
|
||||
{
|
||||
if (!data)
|
||||
{
|
||||
@@ -190,7 +206,6 @@ class instance_molten_core : public InstanceMapScript
|
||||
return;
|
||||
}
|
||||
|
||||
_isLoading = true;
|
||||
OUT_LOAD_INST_DATA(data);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
@@ -200,44 +215,32 @@ class instance_molten_core : public InstanceMapScript
|
||||
|
||||
if (dataHead1 == 'M' && dataHead2 == 'C')
|
||||
{
|
||||
EncounterState states[MAX_ENCOUNTER];
|
||||
uint8 executusCounter = 0;
|
||||
|
||||
// need 2 loops to check spawning executus/ragnaros
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > TO_BE_DECIDED)
|
||||
tmpState = NOT_STARTED;
|
||||
states[i] = EncounterState(tmpState);
|
||||
|
||||
if (tmpState == DONE && i < BOSS_MAJORDOMO_EXECUTUS)
|
||||
++executusCounter;
|
||||
}
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
|
||||
if (executusCounter >= 8 && states[BOSS_RAGNAROS] != DONE)
|
||||
_executusSchedule = new bool(states[BOSS_MAJORDOMO_EXECUTUS] == DONE);
|
||||
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
SetBossState(i, states[i]);
|
||||
if (CheckMajordomoExecutus())
|
||||
SummonMajordomoExecutus();
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
_isLoading = false;
|
||||
}
|
||||
|
||||
private:
|
||||
uint64 _golemaggTheIncineratorGUID;
|
||||
uint64 _majordomoExecutusGUID;
|
||||
uint64 _cacheOfTheFirelordGUID;
|
||||
bool* _executusSchedule;
|
||||
uint8 _deadBossCount;
|
||||
uint8 _ragnarosAddDeaths;
|
||||
bool _isLoading;
|
||||
bool _summonedExecutus;
|
||||
std::unordered_map<uint8, uint64> _circlesGUIDs;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
|
||||
@@ -47,11 +47,20 @@ enum Creatures
|
||||
NPC_RAGNAROS = 11502,
|
||||
NPC_FLAMEWAKER_HEALER = 11663,
|
||||
NPC_FLAMEWAKER_ELITE = 11664,
|
||||
NPC_CORE_RAGER = 11672,
|
||||
NPC_CORE_HOUND = 11671,
|
||||
};
|
||||
|
||||
enum GameObjects
|
||||
{
|
||||
GO_CACHE_OF_THE_FIRELORD = 179703,
|
||||
GO_CIRCLE_SULFURON = 178187,
|
||||
GO_CIRCLE_BARON = 178188,
|
||||
GO_CIRCLE_SHAZZRAH = 178189,
|
||||
GO_CIRCLE_GOLEMAGG = 178190,
|
||||
GO_CIRCLE_GARR = 178191,
|
||||
GO_CIRCLE_MAGMADAR = 178192,
|
||||
GO_CIRCLE_GEHENNAS = 178193,
|
||||
};
|
||||
|
||||
enum Data
|
||||
|
||||
@@ -196,11 +196,13 @@ class boss_ayamiss : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_SWARMER_ATTACK, 60000);
|
||||
break;
|
||||
case EVENT_SUMMON_SWARMER:
|
||||
{
|
||||
Position Pos;
|
||||
me->GetRandomPoint(SwarmerPos, 80.0f, Pos);
|
||||
me->SummonCreature(NPC_SWARMER, Pos);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SWARMER, 5000);
|
||||
break;
|
||||
}
|
||||
case EVENT_TRASH:
|
||||
DoCastVictim(SPELL_TRASH);
|
||||
events.ScheduleEvent(EVENT_TRASH, urand(5000, 7000));
|
||||
|
||||
@@ -880,7 +880,7 @@ public:
|
||||
}
|
||||
else
|
||||
{
|
||||
NextWaveTimer = 65000;
|
||||
NextWaveTimer = 150000;
|
||||
|
||||
uint8 num_to_activate = 5;
|
||||
if (WaveNumber <= 2)
|
||||
|
||||
@@ -107,7 +107,7 @@ enum Spells
|
||||
SPELL_RISEN_WITCH_DOCTOR_SPAWN = 69639,
|
||||
SPELL_SUMMON_SHAMBLING_HORROR = 70372,
|
||||
SPELL_SUMMON_DRUDGE_GHOULS = 70358,
|
||||
SPELL_INFEST = 70541,
|
||||
SPELL_INFEST = 70541, //cast time 2 sec
|
||||
SPELL_NECROTIC_PLAGUE = 70337,
|
||||
SPELL_NECROTIC_PLAGUE_JUMP = 70338,
|
||||
SPELL_PLAGUE_SIPHON = 74074,
|
||||
@@ -116,12 +116,12 @@ enum Spells
|
||||
SPELL_SHADOW_TRAP_KNOCKBACK = 73529,
|
||||
|
||||
// Phase 2
|
||||
SPELL_DEFILE = 72762,
|
||||
SPELL_DEFILE = 72762, //cast time 2 sec
|
||||
SPELL_DEFILE_AURA = 72743,
|
||||
SPELL_DEFILE_GROW = 72756,
|
||||
SPELL_SOUL_REAPER = 69409,
|
||||
SPELL_SOUL_REAPER = 69409, // instant
|
||||
SPELL_SOUL_REAPER_BUFF = 69410,
|
||||
SPELL_SUMMON_VALKYR = 69037,
|
||||
SPELL_SUMMON_VALKYR = 69037, // instant
|
||||
SPELL_SUMMON_VALKYR_PERIODIC = 74361,
|
||||
SPELL_WINGS_OF_THE_DAMNED = 74352,
|
||||
SPELL_VALKYR_TARGET_SEARCH = 69030,
|
||||
@@ -980,10 +980,10 @@ class boss_the_lich_king : public CreatureScript
|
||||
case EVENT_QUAKE:
|
||||
_phase = PHASE_TWO;
|
||||
events.CancelEventGroup(EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_INFEST, 8000, EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SUMMON_VALKYR, 15000, EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SOUL_REAPER, 22000, EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_DEFILE, 32500, EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_INFEST, 14000, EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SUMMON_VALKYR, 20000, EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SOUL_REAPER, 40000, EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_DEFILE, 38000, EVENT_GROUP_ABILITIES);
|
||||
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
me->ClearUnitState(UNIT_STATE_CASTING);
|
||||
@@ -995,10 +995,10 @@ class boss_the_lich_king : public CreatureScript
|
||||
case EVENT_QUAKE_2:
|
||||
_phase = PHASE_THREE;
|
||||
events.CancelEventGroup(EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SOUL_REAPER, 25000, EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_DEFILE, 32500, EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_VILE_SPIRITS, 18000, EVENT_GROUP_VILE_SPIRITS);
|
||||
events.ScheduleEvent(IsHeroic() ? EVENT_HARVEST_SOULS : EVENT_HARVEST_SOUL, 11000, EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SOUL_REAPER, 40000, EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_DEFILE, 38000, EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_VILE_SPIRITS, 20000, EVENT_GROUP_VILE_SPIRITS);
|
||||
events.ScheduleEvent(IsHeroic() ? EVENT_HARVEST_SOULS : EVENT_HARVEST_SOUL, 14000, EVENT_GROUP_ABILITIES);
|
||||
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
me->ClearUnitState(UNIT_STATE_CASTING);
|
||||
@@ -1020,7 +1020,7 @@ class boss_the_lich_king : public CreatureScript
|
||||
break;
|
||||
case EVENT_INFEST:
|
||||
me->CastSpell(me, SPELL_INFEST, false);
|
||||
events.ScheduleEvent(EVENT_INFEST, urand(21000, 22000), EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_INFEST, 22500, EVENT_GROUP_ABILITIES);
|
||||
break;
|
||||
case EVENT_NECROTIC_PLAGUE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NecroticPlagueTargetCheck(me, NECROTIC_PLAGUE_LK, NECROTIC_PLAGUE_PLR)))
|
||||
@@ -1040,7 +1040,7 @@ class boss_the_lich_king : public CreatureScript
|
||||
case EVENT_PAIN_AND_SUFFERING:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
|
||||
{
|
||||
events.DelayEventsToMax(500, EVENT_GROUP_ABILITIES);
|
||||
//events.DelayEventsToMax(500, EVENT_GROUP_ABILITIES);
|
||||
me->SetOrientation(me->GetAngle(target));
|
||||
me->CastSpell(target, SPELL_PAIN_AND_SUFFERING, false);
|
||||
}
|
||||
@@ -1058,33 +1058,43 @@ class boss_the_lich_king : public CreatureScript
|
||||
case EVENT_DEFILE:
|
||||
{
|
||||
uint32 evTime = events.GetNextEventTime(EVENT_SUMMON_VALKYR);
|
||||
if (evTime && (events.GetTimer() > evTime || evTime - events.GetTimer() < 5000)) // defile cast 2sec -> valkyr in less than 3 secs after defile appears
|
||||
// if defile (cast time 2sec) is less than 3 before valkyr appears
|
||||
// we've to decide
|
||||
if (evTime && (events.GetTimer() > evTime || evTime - events.GetTimer() < 5000))
|
||||
{
|
||||
if (events.GetTimer() > evTime || evTime - events.GetTimer() < 3500) // valkyr is less than 1.5 secs after defile - reschedule defile
|
||||
// if valkyr is less than 1.5 secs after defile (cast time 2 sec) then we've a sync issue, so
|
||||
// we need to cancel it (break) and schedule a defile to be casted 5 or 4 seconds after valkyr
|
||||
if (events.GetTimer() > evTime || evTime - events.GetTimer() < 3500)
|
||||
{
|
||||
uint32 t = events.GetTimer() > evTime ? 0 : evTime - events.GetTimer();
|
||||
events.ScheduleEvent(EVENT_DEFILE, t+(Is25ManRaid() ? 5000 : 4000), EVENT_GROUP_ABILITIES);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// if valkyr is coming between 1.5 and 3 seconds after defile then we've to
|
||||
// delay valkyr just a bit
|
||||
events.RescheduleEvent(EVENT_SUMMON_VALKYR, 5000, EVENT_GROUP_ABILITIES);
|
||||
}
|
||||
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, DefileTargetSelector(me)))
|
||||
{
|
||||
Talk(EMOTE_DEFILE_WARNING);
|
||||
me->CastSpell(target, SPELL_DEFILE, false);
|
||||
events.ScheduleEvent(EVENT_DEFILE, urand(31000, 34000), EVENT_GROUP_ABILITIES);
|
||||
// defile has a fixed CD (from dbm) that can be variable only
|
||||
// if no target has been found at the moment (schedule after 1 second)
|
||||
events.ScheduleEvent(EVENT_DEFILE, 32500, EVENT_GROUP_ABILITIES);
|
||||
}
|
||||
else {
|
||||
// be sure it happen trying each seconds if no target
|
||||
events.ScheduleEvent(EVENT_DEFILE, 1000, EVENT_GROUP_ABILITIES);
|
||||
}
|
||||
else
|
||||
events.ScheduleEvent(EVENT_DEFILE, 2000, EVENT_GROUP_ABILITIES);
|
||||
}
|
||||
break;
|
||||
case EVENT_SOUL_REAPER:
|
||||
if (me->IsWithinMeleeRange(me->GetVictim()))
|
||||
{
|
||||
me->CastSpell(me->GetVictim(), SPELL_SOUL_REAPER, false);
|
||||
events.DelayEventsToMax(12000, EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SOUL_REAPER, 30000, EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SOUL_REAPER, 30500, EVENT_GROUP_ABILITIES);
|
||||
}
|
||||
else
|
||||
events.ScheduleEvent(EVENT_SOUL_REAPER, 1000, EVENT_GROUP_ABILITIES);
|
||||
@@ -1094,12 +1104,15 @@ class boss_the_lich_king : public CreatureScript
|
||||
me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL);
|
||||
Talk(SAY_LK_SUMMON_VALKYR);
|
||||
me->CastSpell((Unit*)NULL, SUMMON_VALKYR, false);
|
||||
events.ScheduleEvent(EVENT_SUMMON_VALKYR, urand(45000, 48000), EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SUMMON_VALKYR, 45000, EVENT_GROUP_ABILITIES);
|
||||
|
||||
// schedule a defile (or reschedule it) if next defile event
|
||||
// doesn't exist ( now > next defile ) or defile is coming too soon
|
||||
uint32 minTime = (Is25ManRaid() ? 5000 : 4000);
|
||||
if (uint32 evTime = events.GetNextEventTime(EVENT_DEFILE))
|
||||
if (events.GetTimer() > evTime || evTime - events.GetTimer() < minTime)
|
||||
if (events.GetTimer() > evTime || evTime - events.GetTimer() < minTime) {
|
||||
events.RescheduleEvent(EVENT_DEFILE, minTime, EVENT_GROUP_ABILITIES);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case EVENT_VILE_SPIRITS:
|
||||
@@ -1112,7 +1125,7 @@ class boss_the_lich_king : public CreatureScript
|
||||
{
|
||||
Talk(SAY_LK_HARVEST_SOUL);
|
||||
me->CastSpell(target, SPELL_HARVEST_SOUL, false);
|
||||
events.ScheduleEvent(EVENT_HARVEST_SOUL, 70000, EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_HARVEST_SOUL, 75000, EVENT_GROUP_ABILITIES);
|
||||
}
|
||||
else
|
||||
events.ScheduleEvent(EVENT_HARVEST_SOUL, 10000, EVENT_GROUP_ABILITIES);
|
||||
@@ -3789,4 +3802,4 @@ void AddSC_boss_the_lich_king()
|
||||
new npc_lk_wicked_spirit();
|
||||
new achievement_been_waiting_long_time();
|
||||
new achievement_neck_deep_in_vile();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1548,7 +1548,8 @@ class instance_icecrown_citadel : public InstanceMapScript
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "I C " << GetBossSaveData() << HeroicAttempts << ' '
|
||||
<< ColdflameJetsState << ' ' << BloodQuickeningState << ' ' << BloodQuickeningMinutes << ' ' << WeeklyQuestId10 << ' ' << PutricideEventProgress << ' '
|
||||
<< uint32(LichKingHeroicAvailable ? 1 : 0) << ' ' << BloodPrinceTrashCount;
|
||||
<< uint32(LichKingHeroicAvailable ? 1 : 0) << ' ' << BloodPrinceTrashCount << ' ' << uint32(IsBuffAvailable ? 1 : 0);
|
||||
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
@@ -1600,6 +1601,8 @@ class instance_icecrown_citadel : public InstanceMapScript
|
||||
loadStream >> temp;
|
||||
LichKingHeroicAvailable = temp ? true : false;
|
||||
loadStream >> BloodPrinceTrashCount;
|
||||
loadStream >> temp;
|
||||
SetData(DATA_BUFF_AVAILABLE, temp ? true : false);
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
@@ -49,9 +49,9 @@ public:
|
||||
return new boss_anubrekhanAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_anubrekhanAI : public ScriptedAI
|
||||
struct boss_anubrekhanAI : public BossAI
|
||||
{
|
||||
boss_anubrekhanAI(Creature *c) : ScriptedAI(c), summons(me)
|
||||
boss_anubrekhanAI(Creature *c) : BossAI(c, BOSS_ANUB), summons(me)
|
||||
{
|
||||
pInstance = c->GetInstanceScript();
|
||||
sayGreet = false;
|
||||
@@ -71,15 +71,15 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void Reset()
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
SummonCryptGuards();
|
||||
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(EVENT_ANUB, NOT_STARTED);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_ANUB_GATE)))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
@@ -107,13 +107,13 @@ public:
|
||||
|
||||
void SummonedCreatureDespawn(Creature* cr) { summons.Despawn(cr); }
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
summons.DespawnAll();
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
pInstance->SetData(EVENT_ANUB, DONE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -132,13 +132,13 @@ public:
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit * who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
me->CallForHelp(30.0f); // catch helpers
|
||||
Talk(SAY_AGGRO);
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(EVENT_ANUB, IN_PROGRESS);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_ANUB_GATE)))
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
@@ -179,12 +179,14 @@ public:
|
||||
events.RepeatEvent(20000);
|
||||
break;
|
||||
case EVENT_SPELL_LOCUST_SWARM:
|
||||
{
|
||||
me->CastSpell(me, RAID_MODE(SPELL_LOCUST_SWARM_10, SPELL_LOCUST_SWARM_25), false);
|
||||
Position pos;
|
||||
me->GetNearPosition(pos, 10.0f, rand_norm()*2*M_PI);
|
||||
me->GetNearPosition(pos, 10.0f, rand_norm() * 2 * M_PI);
|
||||
me->SummonCreature(NPC_CRYPT_GUARD, pos);
|
||||
events.RepeatEvent(90000);
|
||||
break;
|
||||
}
|
||||
case EVENT_SPELL_BERSERK:
|
||||
me->CastSpell(me, SPELL_BERSERK, true);
|
||||
events.PopEvent();
|
||||
|
||||
@@ -49,9 +49,9 @@ public:
|
||||
return new boss_faerlinaAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_faerlinaAI : public ScriptedAI
|
||||
struct boss_faerlinaAI : public BossAI
|
||||
{
|
||||
boss_faerlinaAI(Creature *c) : ScriptedAI(c), summons(me)
|
||||
boss_faerlinaAI(Creature *c) : BossAI(c, BOSS_FAERLINA), summons(me)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
sayGreet = false;
|
||||
@@ -81,24 +81,21 @@ public:
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
SummonHelpers();
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_FAERLINA, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit * who)
|
||||
{
|
||||
me->SetInCombatWithZone();
|
||||
BossAI::EnterCombat(who);
|
||||
summons.DoZoneInCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
events.ScheduleEvent(EVENT_SPELL_POISON_BOLT, urand(12000,15000));
|
||||
events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, urand(6000,18000));
|
||||
events.ScheduleEvent(EVENT_SPELL_FRENZY, urand(60000,80000), 1);
|
||||
events.SetPhase(1);
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_FAERLINA, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit *who)
|
||||
@@ -124,11 +121,10 @@ public:
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
Talk(SAY_DEATH);
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_FAERLINA, DONE);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
|
||||
@@ -121,9 +121,9 @@ public:
|
||||
return new boss_four_horsemenAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_four_horsemenAI : public ScriptedAI
|
||||
struct boss_four_horsemenAI : public BossAI
|
||||
{
|
||||
boss_four_horsemenAI(Creature *c) : ScriptedAI(c)
|
||||
boss_four_horsemenAI(Creature *c) : BossAI(c, BOSS_HORSEMAN)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
switch (me->GetEntry())
|
||||
@@ -174,15 +174,13 @@ public:
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
me->SetPosition(me->GetHomePosition());
|
||||
movementPhase = MOVE_PHASE_NONE;
|
||||
currentWaypoint = 0;
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
events.Reset();
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_HORSEMAN, NOT_STARTED);
|
||||
|
||||
// Schedule Events
|
||||
events.RescheduleEvent(EVENT_SPELL_MARK_CAST, 24000);
|
||||
events.RescheduleEvent(EVENT_BERSERK, 100*15000);
|
||||
@@ -248,25 +246,24 @@ public:
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(EVENT_HORSEMAN, DONE);
|
||||
if (pInstance->GetData(EVENT_HORSEMAN) == DONE)
|
||||
if (pInstance->GetBossState(BOSS_HORSEMAN) == DONE) {
|
||||
if (!me->GetMap()->GetPlayers().isEmpty())
|
||||
if (Player* player = me->GetMap()->GetPlayers().getFirst()->GetSource())
|
||||
player->SummonGameObject(RAID_MODE(GO_HORSEMEN_CHEST_10, GO_HORSEMEN_CHEST_25), 2514.8f, -2944.9f, 245.55f, 5.51f, 0, 0, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit * who)
|
||||
{
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_HORSEMAN, IN_PROGRESS);
|
||||
|
||||
BossAI::EnterCombat(who);
|
||||
if (movementPhase == MOVE_PHASE_NONE)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
@@ -52,9 +52,9 @@ public:
|
||||
return new boss_gluthAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_gluthAI : public ScriptedAI
|
||||
struct boss_gluthAI : public BossAI
|
||||
{
|
||||
boss_gluthAI(Creature *c) : ScriptedAI(c), summons(me)
|
||||
boss_gluthAI(Creature *c) : BossAI(c, BOSS_GLUTH), summons(me)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
@@ -66,14 +66,12 @@ public:
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
me->ApplySpellImmune(29306, IMMUNITY_ID, 29306, true);
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
gazeTarget = 0;
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_GLUTH, NOT_STARTED);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit *who)
|
||||
@@ -87,8 +85,9 @@ public:
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit * who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
me->SetInCombatWithZone();
|
||||
events.ScheduleEvent(EVENT_SPELL_MORTAL_WOUND, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 30000);
|
||||
@@ -96,9 +95,6 @@ public:
|
||||
events.ScheduleEvent(EVENT_SPELL_BERSERK, 8*60000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ZOMBIE, 10000);
|
||||
events.ScheduleEvent(EVENT_CAN_EAT_ZOMBIE, 1000);
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_GLUTH, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature *summon)
|
||||
@@ -120,11 +116,10 @@ public:
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
|
||||
void JustDied(Unit*)
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
summons.DespawnAll();
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_GLUTH, DONE);
|
||||
}
|
||||
|
||||
bool SelectPlayerInRoom()
|
||||
|
||||
@@ -135,9 +135,9 @@ public:
|
||||
return new boss_gothikAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_gothikAI : public ScriptedAI
|
||||
struct boss_gothikAI : public BossAI
|
||||
{
|
||||
boss_gothikAI(Creature *c) : ScriptedAI(c), summons(me)
|
||||
boss_gothikAI(Creature *c) : BossAI(c, BOSS_GOTHIK), summons(me)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
@@ -162,6 +162,7 @@ public:
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_DISABLE_MOVE);
|
||||
@@ -172,7 +173,6 @@ public:
|
||||
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(EVENT_GOTHIK, NOT_STARTED);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_GOTHIK_ENTER_GATE)))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_GOTHIK_INNER_GATE)))
|
||||
@@ -182,8 +182,9 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit * who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
me->SetInCombatWithZone();
|
||||
Talk(SAY_SPEECH);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_DISABLE_MOVE);
|
||||
@@ -194,7 +195,6 @@ public:
|
||||
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(EVENT_GOTHIK, IN_PROGRESS);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_GOTHIK_ENTER_GATE)))
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_GOTHIK_INNER_GATE)))
|
||||
@@ -225,14 +225,14 @@ public:
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
Talk(SAY_DEATH);
|
||||
summons.DespawnAll();
|
||||
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(EVENT_GOTHIK, DONE);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_GOTHIK_ENTER_GATE)))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_GOTHIK_INNER_GATE)))
|
||||
|
||||
@@ -45,9 +45,9 @@ public:
|
||||
return new boss_grobbulusAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_grobbulusAI : public ScriptedAI
|
||||
struct boss_grobbulusAI : public BossAI
|
||||
{
|
||||
boss_grobbulusAI(Creature *c) : ScriptedAI(c), summons(me)
|
||||
boss_grobbulusAI(Creature *c) : BossAI(c, BOSS_GROBBULUS), summons(me)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
@@ -59,24 +59,20 @@ public:
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
dropSludgeTimer = 0;
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_GROBBULUS, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit * who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
me->SetInCombatWithZone();
|
||||
events.ScheduleEvent(EVENT_SPELL_POISON_CLOUD, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_MUTATING_INJECTION, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SLIME_SPRAY, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BERSERK, RAID_MODE(12*MINUTE*IN_MILLISECONDS, 9*MINUTE*IN_MILLISECONDS));
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_GROBBULUS, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void SpellHitTarget(Unit *target, const SpellInfo* spellInfo)
|
||||
@@ -95,11 +91,10 @@ public:
|
||||
|
||||
void SummonedCreatureDespawn(Creature* summon){ summons.Despawn(summon); }
|
||||
|
||||
void JustDied(Unit*)
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
summons.DespawnAll();
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_GROBBULUS, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who)
|
||||
|
||||
@@ -48,9 +48,9 @@ public:
|
||||
return new boss_heiganAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_heiganAI : public ScriptedAI
|
||||
struct boss_heiganAI : public BossAI
|
||||
{
|
||||
boss_heiganAI(Creature *c) : ScriptedAI(c)
|
||||
boss_heiganAI(Creature *c) : BossAI(c, BOSS_HEIGAN)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
@@ -63,6 +63,7 @@ public:
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
events.Reset();
|
||||
currentPhase = 0;
|
||||
currentSection = 3;
|
||||
@@ -70,7 +71,6 @@ public:
|
||||
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(EVENT_HEIGAN, NOT_STARTED);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_HEIGAN_ENTER_GATE)))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
@@ -88,20 +88,19 @@ public:
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
Talk(SAY_DEATH);
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_HEIGAN, DONE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit * who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
me->SetInCombatWithZone();
|
||||
Talk(SAY_AGGRO);
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(EVENT_HEIGAN, IN_PROGRESS);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_HEIGAN_ENTER_GATE)))
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
|
||||
@@ -115,9 +115,9 @@ public:
|
||||
return new boss_kelthuzadAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_kelthuzadAI : public ScriptedAI
|
||||
struct boss_kelthuzadAI : public BossAI
|
||||
{
|
||||
boss_kelthuzadAI(Creature* c) : ScriptedAI(c), summons(me)
|
||||
boss_kelthuzadAI(Creature* c) : BossAI(c, BOSS_KELTHUZAD), summons(me)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
@@ -162,6 +162,7 @@ public:
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_DISABLE_MOVE);
|
||||
@@ -169,7 +170,6 @@ public:
|
||||
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(EVENT_KELTHUZAD, NOT_STARTED);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_KELTHUZAD_FLOOR)))
|
||||
{
|
||||
go->SetPhaseMask(1, true);
|
||||
@@ -198,12 +198,11 @@ public:
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
summons.DespawnAll();
|
||||
Talk(SAY_DEATH);
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_KELTHUZAD, DONE);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
@@ -212,8 +211,9 @@ public:
|
||||
AttackStart(who);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
void EnterCombat(Unit * who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
Talk(SAY_SUMMON_MINIONS);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE);
|
||||
me->RemoveAllAttackers();
|
||||
@@ -229,7 +229,6 @@ public:
|
||||
events.ScheduleEvent(EVENT_START_SECOND_PHASE, 228000);
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(EVENT_KELTHUZAD, IN_PROGRESS);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_KELTHUZAD_FLOOR)))
|
||||
{
|
||||
events.ScheduleEvent(EVENT_FLOOR_CHANGE, 15000);
|
||||
|
||||
@@ -42,9 +42,9 @@ public:
|
||||
return new boss_loathebAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_loathebAI : public ScriptedAI
|
||||
struct boss_loathebAI : public BossAI
|
||||
{
|
||||
boss_loathebAI(Creature *c) : ScriptedAI(c)
|
||||
boss_loathebAI(Creature *c) : BossAI(c, BOSS_LOATHEB)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
@@ -54,10 +54,10 @@ public:
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
events.Reset();
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(EVENT_LOATHEB, NOT_STARTED);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_LOATHEB_GATE)))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
@@ -77,11 +77,11 @@ public:
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit * who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(EVENT_LOATHEB, IN_PROGRESS);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_LOATHEB_GATE)))
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
@@ -93,12 +93,6 @@ public:
|
||||
events.ScheduleEvent(EVENT_SPELL_BERSERK, 720000);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
{
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_LOATHEB, DONE);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
|
||||
@@ -53,9 +53,9 @@ public:
|
||||
return new boss_maexxnaAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_maexxnaAI : public ScriptedAI
|
||||
struct boss_maexxnaAI : public BossAI
|
||||
{
|
||||
boss_maexxnaAI(Creature *c) : ScriptedAI(c), summons(me)
|
||||
boss_maexxnaAI(Creature *c) : BossAI(c, BOSS_MAEXXNA), summons(me)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
@@ -77,20 +77,21 @@ public:
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(EVENT_MAEXXNA, NOT_STARTED);
|
||||
if (pInstance->GetData(EVENT_FAERLINA) == DONE)
|
||||
if (pInstance->GetData(BOSS_FAERLINA) == DONE)
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_MAEXXNA_GATE)))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit * who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
me->SetInCombatWithZone();
|
||||
events.ScheduleEvent(EVENT_WEB_WRAP, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_WEB_SPRAY, 40000);
|
||||
@@ -101,18 +102,11 @@ public:
|
||||
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(EVENT_MAEXXNA, IN_PROGRESS);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_MAEXXNA_GATE)))
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
{
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_MAEXXNA, DONE);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* cr)
|
||||
{
|
||||
if (cr->GetEntry() == NPC_MAEXXNA_SPIDERLING)
|
||||
|
||||
@@ -66,9 +66,9 @@ public:
|
||||
return new boss_nothAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_nothAI : public ScriptedAI
|
||||
struct boss_nothAI : public BossAI
|
||||
{
|
||||
boss_nothAI(Creature *c) : ScriptedAI(c), summons(me)
|
||||
boss_nothAI(Creature *c) : BossAI(c, BOSS_NOTH), summons(me)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
@@ -123,14 +123,12 @@ public:
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
events.SetPhase(0);
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_NOTH, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
@@ -139,12 +137,10 @@ public:
|
||||
ScriptedAI::EnterEvadeMode();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit * who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
Talk(SAY_AGGRO);
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_NOTH, IN_PROGRESS);
|
||||
|
||||
StartGroundPhase();
|
||||
}
|
||||
|
||||
@@ -154,11 +150,10 @@ public:
|
||||
summon->SetInCombatWithZone();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
Talk(SAY_DEATH);
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_NOTH, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who)
|
||||
|
||||
@@ -47,9 +47,9 @@ public:
|
||||
return new boss_patchwerkAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_patchwerkAI : public ScriptedAI
|
||||
struct boss_patchwerkAI : public BossAI
|
||||
{
|
||||
boss_patchwerkAI(Creature *c) : ScriptedAI(c)
|
||||
boss_patchwerkAI(Creature *c) : BossAI(c, BOSS_PATCHWERK)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
@@ -59,9 +59,8 @@ public:
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
events.Reset();
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_PATCHWERK, NOT_STARTED);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who)
|
||||
@@ -76,15 +75,15 @@ public:
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
Talk(SAY_DEATH);
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_PATCHWERK, DONE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit * who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
me->SetInCombatWithZone();
|
||||
@@ -95,7 +94,6 @@ public:
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
pInstance->SetData(EVENT_PATCHWERK, IN_PROGRESS);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -60,9 +60,9 @@ public:
|
||||
return new boss_razuviousAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_razuviousAI : public ScriptedAI
|
||||
struct boss_razuviousAI : public BossAI
|
||||
{
|
||||
boss_razuviousAI(Creature *c) : ScriptedAI(c), summons(me)
|
||||
boss_razuviousAI(Creature *c) : BossAI(c, BOSS_RAZUVIOUS), summons(me)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
@@ -86,11 +86,10 @@ public:
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
summons.DespawnAll();
|
||||
events.Reset();
|
||||
SpawnHelpers();
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_RAZUVIOUS, NOT_STARTED);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who)
|
||||
@@ -115,18 +114,18 @@ public:
|
||||
me->LowerPlayerDamageReq(damage);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
DoPlaySoundToSet(me, SOUND_DEATH);
|
||||
me->MonsterYell("An honorable... death...", LANG_UNIVERSAL, 0);
|
||||
|
||||
me->CastSpell(me, SPELL_HOPELESS, true);
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_RAZUVIOUS, DONE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit * who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
switch (urand(0,2))
|
||||
{
|
||||
case 0:
|
||||
@@ -147,8 +146,6 @@ public:
|
||||
events.ScheduleEvent(EVENT_SPELL_DISRUPTING_SHOUT, 25000);
|
||||
events.ScheduleEvent(EVENT_SPELL_JAGGED_KNIFE, 15000);
|
||||
events.ScheduleEvent(EVENT_PLAY_COMMAND, 40000);
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_RAZUVIOUS, IN_PROGRESS);
|
||||
|
||||
summons.DoZoneInCombat();
|
||||
}
|
||||
|
||||
@@ -77,9 +77,9 @@ public:
|
||||
return new boss_sapphironAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_sapphironAI : public ScriptedAI
|
||||
struct boss_sapphironAI : public BossAI
|
||||
{
|
||||
boss_sapphironAI(Creature* c) : ScriptedAI(c)
|
||||
boss_sapphironAI(Creature* c) : BossAI(c, BOSS_SAPPHIRON)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
@@ -113,6 +113,7 @@ public:
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
if (me->IsVisible())
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
|
||||
@@ -121,9 +122,6 @@ public:
|
||||
spawnTimer = 0;
|
||||
currentTarget = 0;
|
||||
blockList.clear();
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_SAPPHIRON, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombatSelfFunction()
|
||||
@@ -147,8 +145,9 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit * who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
EnterCombatSelfFunction();
|
||||
me->CastSpell(me, RAID_MODE(SPELL_FROST_AURA_10, SPELL_FROST_AURA_25), true);
|
||||
|
||||
@@ -159,16 +158,12 @@ public:
|
||||
events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 21000);
|
||||
events.ScheduleEvent(EVENT_FLIGHT_START, 45000);
|
||||
events.ScheduleEvent(EVENT_HUNDRED_CLUB, 5000);
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_SAPPHIRON, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*who*/)
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
me->CastSpell(me, SPELL_SAPPHIRON_DIES, true);
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_SAPPHIRON, DONE);
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
|
||||
@@ -94,9 +94,9 @@ public:
|
||||
return new boss_thaddiusAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_thaddiusAI : public ScriptedAI
|
||||
struct boss_thaddiusAI : public BossAI
|
||||
{
|
||||
boss_thaddiusAI(Creature *c) : ScriptedAI(c), summons(me)
|
||||
boss_thaddiusAI(Creature *c) : BossAI(c, BOSS_THADDIUS), summons(me)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
@@ -139,8 +139,9 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void Reset()
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
@@ -149,9 +150,6 @@ public:
|
||||
resetTimer = 1;
|
||||
me->SetPosition(me->GetHomePosition());
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_THADDIUS, NOT_STARTED);
|
||||
|
||||
me->SummonCreature(NPC_STALAGG, 3450.45f, -2931.42f, 312.091f, 5.49779f);
|
||||
me->SummonCreature(NPC_FEUGEN, 3508.14f, -2988.65f, 312.092f, 2.37365f);
|
||||
if (Creature* cr = me->SummonCreature(NPC_TESLA_COIL, 3527.34f, -2951.56f, 318.75f, 0.0f))
|
||||
@@ -182,12 +180,12 @@ public:
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
Talk(SAY_DEATH);
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(EVENT_THADDIUS, DONE);
|
||||
pInstance->DoRemoveAurasDueToSpellOnPlayers(28059);
|
||||
pInstance->DoRemoveAurasDueToSpellOnPlayers(28084);
|
||||
}
|
||||
@@ -195,14 +193,12 @@ public:
|
||||
|
||||
void JustSummoned(Creature* cr) { summons.Summon(cr); }
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit * who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
me->SetInCombatWithZone();
|
||||
summons.DoZoneInCombat(NPC_FEUGEN);
|
||||
summons.DoZoneInCombat(NPC_STALAGG);
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(EVENT_THADDIUS, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
|
||||
@@ -49,7 +49,7 @@ public:
|
||||
{
|
||||
instance_naxxramas_InstanceMapScript(Map* pMap) : InstanceScript(pMap)
|
||||
{
|
||||
memset(&Encounters, 0, sizeof(Encounters));
|
||||
SetBossNumber(MAX_ENCOUNTERS);
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
HeiganEruption[i].clear();
|
||||
|
||||
@@ -101,7 +101,6 @@ public:
|
||||
immortalAchievement = 1;
|
||||
}
|
||||
|
||||
uint32 Encounters[MAX_ENCOUNTERS];
|
||||
std::set<GameObject*> HeiganEruption[4];
|
||||
|
||||
// GOs
|
||||
@@ -169,17 +168,17 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
bool IsEncounterInProgress() const
|
||||
bool IsEncounterInProgress() const override
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
{
|
||||
if (Encounters[i] == IN_PROGRESS)
|
||||
if (GetBossState(i) == IN_PROGRESS)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
void OnCreatureCreate(Creature* creature) override
|
||||
{
|
||||
switch(creature->GetEntry())
|
||||
{
|
||||
@@ -216,7 +215,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* pGo)
|
||||
void OnGameObjectCreate(GameObject* pGo) override
|
||||
{
|
||||
if (pGo->GetGOInfo()->displayId == 6785 || pGo->GetGOInfo()->displayId == 1287)
|
||||
{
|
||||
@@ -228,57 +227,57 @@ public:
|
||||
{
|
||||
case GO_PATCHWERK_GATE:
|
||||
_patchwerkGateGUID = pGo->GetGUID();
|
||||
if (Encounters[EVENT_PATCHWERK] == DONE)
|
||||
if (GetBossState(BOSS_PATCHWERK) == DONE)
|
||||
pGo->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_GLUTH_GATE:
|
||||
_gluthGateGUID = pGo->GetGUID();
|
||||
if (Encounters[EVENT_GLUTH] == DONE)
|
||||
if (GetBossState(BOSS_GLUTH) == DONE)
|
||||
pGo->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_NOTH_GATE:
|
||||
_nothGateGUID = pGo->GetGUID();
|
||||
if (Encounters[EVENT_NOTH] == DONE)
|
||||
if (GetBossState(BOSS_NOTH) == DONE)
|
||||
pGo->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_HEIGAN_ENTERANCE_GATE:
|
||||
_heiganGateGUID = pGo->GetGUID();
|
||||
if (Encounters[EVENT_HEIGAN] == DONE || Encounters[EVENT_NOTH] == DONE)
|
||||
if (GetBossState(BOSS_HEIGAN) == DONE || GetBossState(BOSS_NOTH) == DONE)
|
||||
pGo->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_HEIGAN_EXIT_GATE:
|
||||
_heiganGateExitGUID = pGo->GetGUID();
|
||||
if (Encounters[EVENT_HEIGAN] == DONE)
|
||||
if (GetBossState(BOSS_HEIGAN) == DONE)
|
||||
pGo->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_LOATHEB_GATE:
|
||||
_loathebGateGUID = pGo->GetGUID();
|
||||
if (Encounters[EVENT_LOATHEB] == DONE)
|
||||
if (GetBossState(BOSS_LOATHEB) == DONE)
|
||||
pGo->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_ANUB_GATE:
|
||||
_anubGateGUID = pGo->GetGUID();
|
||||
if (Encounters[EVENT_ANUB] == DONE)
|
||||
if (GetBossState(BOSS_ANUB) == DONE)
|
||||
pGo->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_ANUB_NEXT_GATE:
|
||||
_anubNextGateGUID = pGo->GetGUID();
|
||||
if (Encounters[EVENT_ANUB] == DONE)
|
||||
if (GetBossState(BOSS_ANUB) == DONE)
|
||||
pGo->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_FAERLINA_GATE:
|
||||
_faerlinaGateGUID = pGo->GetGUID();
|
||||
if (Encounters[EVENT_FAERLINA] == DONE)
|
||||
if (GetBossState(BOSS_FAERLINA) == DONE)
|
||||
pGo->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_MAEXXNA_GATE:
|
||||
_maexxnaGateGUID = pGo->GetGUID();
|
||||
if (Encounters[EVENT_FAERLINA] == DONE) // faerlina is correct
|
||||
if (GetBossState(BOSS_FAERLINA) == DONE) // faerlina is correct
|
||||
pGo->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_THADDIUS_GATE:
|
||||
_thaddiusGateGUID = pGo->GetGUID();
|
||||
if (Encounters[EVENT_GLUTH] == DONE) // gluth is correct
|
||||
if (GetBossState(BOSS_GLUTH) == DONE) // gluth is correct
|
||||
pGo->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_GOTHIK_ENTER_GATE:
|
||||
@@ -289,12 +288,12 @@ public:
|
||||
break;
|
||||
case GO_GOTHIK_EXIT_GATE:
|
||||
_gothikExitGateGUID = pGo->GetGUID();
|
||||
if (Encounters[EVENT_GOTHIK] == DONE)
|
||||
if (GetBossState(BOSS_GOTHIK) == DONE)
|
||||
pGo->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_HORSEMAN_GATE:
|
||||
_horsemanGateGUID = pGo->GetGUID();
|
||||
if (Encounters[EVENT_GOTHIK] == DONE) // correct
|
||||
if (GetBossState(BOSS_GOTHIK) == DONE) // correct
|
||||
pGo->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_KELTHUZAD_FLOOR:
|
||||
@@ -305,33 +304,33 @@ public:
|
||||
break;
|
||||
case GO_SAPPHIRON_GATE:
|
||||
_sapphironGateGUID = pGo->GetGUID();
|
||||
if (Encounters[EVENT_SAPPHIRON] == DONE)
|
||||
if (GetBossState(BOSS_SAPPHIRON) == DONE)
|
||||
pGo->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_DEATHKNIGHT_WING:
|
||||
_loathebPortalGUID = pGo->GetGUID();
|
||||
if (Encounters[EVENT_LOATHEB] == DONE)
|
||||
if (GetBossState(BOSS_LOATHEB) == DONE)
|
||||
pGo->SetPhaseMask(1, true);
|
||||
break;
|
||||
case GO_THADDIUS_PORTAL:
|
||||
_thaddiusPortalGUID = pGo->GetGUID();
|
||||
if (Encounters[EVENT_THADDIUS] == DONE)
|
||||
if (GetBossState(BOSS_THADDIUS) == DONE)
|
||||
pGo->SetPhaseMask(1, true);
|
||||
break;
|
||||
case GO_MAEXXNA_PORTAL:
|
||||
_maexxnaPortalGUID = pGo->GetGUID();
|
||||
if (Encounters[EVENT_MAEXXNA] == DONE)
|
||||
if (GetBossState(BOSS_MAEXXNA) == DONE)
|
||||
pGo->SetPhaseMask(1, true);
|
||||
break;
|
||||
case GO_HORSEMAN_PORTAL:
|
||||
_horsemanPortalGUID = pGo->GetGUID();
|
||||
if (Encounters[EVENT_HORSEMAN] == DONE)
|
||||
if (GetBossState(BOSS_HORSEMAN) == DONE)
|
||||
pGo->SetPhaseMask(1, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectRemove(GameObject* pGo)
|
||||
void OnGameObjectRemove(GameObject* pGo) override
|
||||
{
|
||||
if (pGo->GetGOInfo()->displayId == 6785 || pGo->GetGOInfo()->displayId == 1287)
|
||||
{
|
||||
@@ -345,7 +344,7 @@ public:
|
||||
cr->AI()->DoAction(ACTION_SAPPHIRON_BIRTH);
|
||||
}
|
||||
|
||||
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/)
|
||||
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/) override
|
||||
{
|
||||
switch(criteria_id)
|
||||
{
|
||||
@@ -389,7 +388,7 @@ public:
|
||||
{
|
||||
uint8 count = 0;
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
if (Encounters[i] == NOT_STARTED)
|
||||
if (GetBossState(i) == NOT_STARTED)
|
||||
++count;
|
||||
|
||||
return !count && immortalAchievement;
|
||||
@@ -398,57 +397,10 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
void SetData(uint32 id, uint32 data)
|
||||
void SetData(uint32 id, uint32 data) override
|
||||
{
|
||||
// Bosses data
|
||||
switch(id)
|
||||
{
|
||||
case EVENT_PATCHWERK:
|
||||
case EVENT_GROBBULUS:
|
||||
case EVENT_GLUTH:
|
||||
case EVENT_NOTH:
|
||||
case EVENT_ANUB:
|
||||
case EVENT_MAEXXNA:
|
||||
case EVENT_RAZUVIOUS:
|
||||
case EVENT_GOTHIK:
|
||||
// EVENT_HORSEMAN HANDLED BELOW
|
||||
Encounters[id] = data;
|
||||
break;
|
||||
case EVENT_KELTHUZAD:
|
||||
if (data == NOT_STARTED)
|
||||
abominationsKilled = 0;
|
||||
Encounters[id] = data;
|
||||
break;
|
||||
case EVENT_FAERLINA:
|
||||
if (data == NOT_STARTED)
|
||||
faerlinaAchievement = true;
|
||||
Encounters[id] = data;
|
||||
break;
|
||||
case EVENT_THADDIUS:
|
||||
if (data == NOT_STARTED)
|
||||
thaddiusAchievement = true;
|
||||
Encounters[id] = data;
|
||||
break;
|
||||
case EVENT_LOATHEB:
|
||||
if (data == NOT_STARTED)
|
||||
loathebAchievement = true;
|
||||
Encounters[id] = data;
|
||||
break;
|
||||
case EVENT_HEIGAN:
|
||||
if (data == NOT_STARTED)
|
||||
heiganAchievement = true;
|
||||
Encounters[id] = data;
|
||||
break;
|
||||
case DATA_HEIGAN_ERUPTION:
|
||||
HeiganEruptSections(data);
|
||||
return;
|
||||
case EVENT_SAPPHIRON:
|
||||
Encounters[id] = data;
|
||||
if (data == DONE)
|
||||
_speakTimer = 1;
|
||||
else if (data == NOT_STARTED)
|
||||
sapphironAchievement = true;
|
||||
break;
|
||||
case DATA_ABOMINATION_KILLED:
|
||||
abominationsKilled++;
|
||||
return;
|
||||
@@ -471,17 +423,24 @@ public:
|
||||
immortalAchievement = 0;
|
||||
SaveToDB();
|
||||
return;
|
||||
case DATA_HEIGAN_ERUPTION:
|
||||
HeiganEruptSections(data);
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 bossId, EncounterState state) override
|
||||
{
|
||||
// Horseman handling
|
||||
if (id == EVENT_HORSEMAN)
|
||||
if (bossId == BOSS_HORSEMAN)
|
||||
{
|
||||
if (data == DONE)
|
||||
if (state == DONE)
|
||||
{
|
||||
_horsemanTimer++;
|
||||
_horsemanKilled++;
|
||||
if (_horsemanKilled < 4)
|
||||
return;
|
||||
if (_horsemanKilled < 4) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// All horsemans are killed
|
||||
if (Creature* cr = instance->GetCreature(_blaumeuxGUID))
|
||||
@@ -489,7 +448,7 @@ public:
|
||||
}
|
||||
|
||||
// respawn
|
||||
else if (data == NOT_STARTED && _horsemanKilled > 0)
|
||||
else if (state == NOT_STARTED && _horsemanKilled > 0)
|
||||
{
|
||||
Creature* cr;
|
||||
_horsemanKilled = 0;
|
||||
@@ -518,7 +477,7 @@ public:
|
||||
cr->Respawn();
|
||||
}
|
||||
}
|
||||
else if (data == IN_PROGRESS)
|
||||
else if (state == IN_PROGRESS)
|
||||
{
|
||||
Creature* cr;
|
||||
if ((cr = instance->GetCreature(_blaumeuxGUID)))
|
||||
@@ -531,66 +490,99 @@ public:
|
||||
cr->SetInCombatWithZone();
|
||||
}
|
||||
|
||||
if (data == NOT_STARTED)
|
||||
if (state == NOT_STARTED)
|
||||
_horsemanTimer = 0;
|
||||
|
||||
Encounters[id] = data;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (!InstanceScript::SetBossState(bossId, state))
|
||||
return false;
|
||||
|
||||
// Bosses data
|
||||
switch(bossId)
|
||||
{
|
||||
case BOSS_KELTHUZAD:
|
||||
if (state == NOT_STARTED)
|
||||
abominationsKilled = 0;
|
||||
break;
|
||||
case BOSS_FAERLINA:
|
||||
if (state == NOT_STARTED)
|
||||
faerlinaAchievement = true;
|
||||
break;
|
||||
case BOSS_THADDIUS:
|
||||
if (state == NOT_STARTED)
|
||||
thaddiusAchievement = true;
|
||||
break;
|
||||
case BOSS_LOATHEB:
|
||||
if (state == NOT_STARTED)
|
||||
loathebAchievement = true;
|
||||
break;
|
||||
case BOSS_HEIGAN:
|
||||
if (state == NOT_STARTED)
|
||||
heiganAchievement = true;
|
||||
break;
|
||||
case BOSS_SAPPHIRON:
|
||||
if (state == DONE)
|
||||
_speakTimer = 1;
|
||||
else if (state == NOT_STARTED)
|
||||
sapphironAchievement = true;
|
||||
break;
|
||||
}
|
||||
|
||||
// Save instance and open gates
|
||||
if (data == DONE)
|
||||
if (state == DONE)
|
||||
{
|
||||
SaveToDB();
|
||||
|
||||
switch (id)
|
||||
switch (bossId)
|
||||
{
|
||||
case EVENT_PATCHWERK:
|
||||
case BOSS_PATCHWERK:
|
||||
if (GameObject* go = instance->GetGameObject(_patchwerkGateGUID))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case EVENT_GLUTH:
|
||||
case BOSS_GLUTH:
|
||||
if (GameObject* go = instance->GetGameObject(_gluthGateGUID))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
if (GameObject* go = instance->GetGameObject(_thaddiusGateGUID))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case EVENT_NOTH:
|
||||
case BOSS_NOTH:
|
||||
if (GameObject* go = instance->GetGameObject(_nothGateGUID))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
if (GameObject* go = instance->GetGameObject(_heiganGateGUID))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case EVENT_HEIGAN:
|
||||
case BOSS_HEIGAN:
|
||||
if (GameObject* go = instance->GetGameObject(_heiganGateGUID))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
if (GameObject* go = instance->GetGameObject(_heiganGateExitGUID))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case EVENT_LOATHEB:
|
||||
case BOSS_LOATHEB:
|
||||
if (GameObject* go = instance->GetGameObject(_loathebGateGUID))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
if (GameObject* go = instance->GetGameObject(_loathebPortalGUID))
|
||||
go->SetPhaseMask(1, true);
|
||||
break;
|
||||
case EVENT_ANUB:
|
||||
case BOSS_ANUB:
|
||||
if (GameObject* go = instance->GetGameObject(_anubGateGUID))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
if (GameObject* go = instance->GetGameObject(_anubNextGateGUID))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case EVENT_FAERLINA:
|
||||
case BOSS_FAERLINA:
|
||||
if (GameObject* go = instance->GetGameObject(_faerlinaGateGUID))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
if (GameObject* go = instance->GetGameObject(_maexxnaGateGUID))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case EVENT_MAEXXNA:
|
||||
case BOSS_MAEXXNA:
|
||||
if (GameObject* go = instance->GetGameObject(_maexxnaGateGUID))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
if (GameObject* go = instance->GetGameObject(_maexxnaPortalGUID))
|
||||
go->SetPhaseMask(1, true);
|
||||
break;
|
||||
case EVENT_GOTHIK:
|
||||
case BOSS_GOTHIK:
|
||||
if (GameObject* go = instance->GetGameObject(_gothikEnterGateGUID))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
if (GameObject* go = instance->GetGameObject(_gothikExitGateGUID))
|
||||
@@ -598,33 +590,25 @@ public:
|
||||
if (GameObject* go = instance->GetGameObject(_horsemanGateGUID))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case EVENT_SAPPHIRON:
|
||||
case BOSS_SAPPHIRON:
|
||||
if (GameObject* go = instance->GetGameObject(_sapphironGateGUID))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case EVENT_THADDIUS:
|
||||
case BOSS_THADDIUS:
|
||||
if (GameObject* go = instance->GetGameObject(_thaddiusPortalGUID))
|
||||
go->SetPhaseMask(1, true);
|
||||
break;
|
||||
case EVENT_HORSEMAN:
|
||||
case BOSS_HORSEMAN:
|
||||
if (GameObject* go = instance->GetGameObject(_horsemanPortalGUID))
|
||||
go->SetPhaseMask(1, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 identifier) const
|
||||
{
|
||||
switch(identifier)
|
||||
{
|
||||
case EVENT_HORSEMAN:
|
||||
return Encounters[identifier];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Update(uint32 diff)
|
||||
void Update(uint32 diff) override
|
||||
{
|
||||
if (_speakTimer)
|
||||
{
|
||||
@@ -666,7 +650,7 @@ public:
|
||||
_horsemanTimer += diff;
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 id) const
|
||||
uint64 GetData64(uint32 id) const override
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
@@ -703,21 +687,18 @@ public:
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
std::string GetSaveData() override
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "N X X " << Encounters[0] << ' ' << Encounters[1] << ' ' << Encounters[2] << ' ' << Encounters[3]
|
||||
<< ' ' << Encounters[4] << ' ' << Encounters[5] << ' ' << Encounters[6] << ' ' << Encounters[7]
|
||||
<< ' ' << Encounters[8] << ' ' << Encounters[9] << ' ' << Encounters[10] << ' ' << Encounters[11]
|
||||
<< ' ' << Encounters[12] << ' ' << Encounters[13] << ' ' << Encounters[14] << ' ' << immortalAchievement;
|
||||
saveStream << "N X X " << GetBossSaveData() << ' ' << immortalAchievement;
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* in)
|
||||
void Load(const char* in) override
|
||||
{
|
||||
if (!in)
|
||||
{
|
||||
@@ -735,9 +716,12 @@ public:
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
{
|
||||
loadStream >> Encounters[i];
|
||||
if (Encounters[i] == IN_PROGRESS)
|
||||
Encounters[i] = NOT_STARTED;
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS)
|
||||
tmpState = NOT_STARTED;
|
||||
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
loadStream >> immortalAchievement;
|
||||
|
||||
|
||||
@@ -7,23 +7,23 @@
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
|
||||
enum NXEncounter
|
||||
enum Encouters
|
||||
{
|
||||
EVENT_PATCHWERK = 0,
|
||||
EVENT_GROBBULUS = 1,
|
||||
EVENT_GLUTH = 2,
|
||||
EVENT_NOTH = 3,
|
||||
EVENT_HEIGAN = 4,
|
||||
EVENT_LOATHEB = 5,
|
||||
EVENT_ANUB = 6,
|
||||
EVENT_FAERLINA = 7,
|
||||
EVENT_MAEXXNA = 8,
|
||||
EVENT_THADDIUS = 9,
|
||||
EVENT_RAZUVIOUS = 10,
|
||||
EVENT_GOTHIK = 11,
|
||||
EVENT_HORSEMAN = 12,
|
||||
EVENT_SAPPHIRON = 13,
|
||||
EVENT_KELTHUZAD = 14,
|
||||
BOSS_PATCHWERK = 0,
|
||||
BOSS_GROBBULUS = 1,
|
||||
BOSS_GLUTH = 2,
|
||||
BOSS_NOTH = 3,
|
||||
BOSS_HEIGAN = 4,
|
||||
BOSS_LOATHEB = 5,
|
||||
BOSS_ANUB = 6,
|
||||
BOSS_FAERLINA = 7,
|
||||
BOSS_MAEXXNA = 8,
|
||||
BOSS_THADDIUS = 9,
|
||||
BOSS_RAZUVIOUS = 10,
|
||||
BOSS_GOTHIK = 11,
|
||||
BOSS_HORSEMAN = 12,
|
||||
BOSS_SAPPHIRON = 13,
|
||||
BOSS_KELTHUZAD = 14,
|
||||
MAX_ENCOUNTERS,
|
||||
};
|
||||
|
||||
|
||||
@@ -1264,6 +1264,108 @@ public:
|
||||
|
||||
};
|
||||
|
||||
enum BloodsporeRuination
|
||||
{
|
||||
NPC_BLOODMAGE_LAURITH = 25381,
|
||||
SAY_BLOODMAGE_LAURITH = 0,
|
||||
EVENT_TALK = 1,
|
||||
EVENT_RESET_ORIENTATION
|
||||
};
|
||||
|
||||
class spell_q11719_bloodspore_ruination_45997 : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_q11719_bloodspore_ruination_45997() : SpellScriptLoader("spell_q11719_bloodspore_ruination_45997") { }
|
||||
|
||||
class spell_q11719_bloodspore_ruination_45997_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_q11719_bloodspore_ruination_45997_SpellScript);
|
||||
|
||||
void HandleEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* caster = GetCaster())
|
||||
if (Creature* laurith = caster->FindNearestCreature(NPC_BLOODMAGE_LAURITH, 100.0f))
|
||||
laurith->AI()->SetGUID(caster->GetGUID());
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHit += SpellEffectFn(spell_q11719_bloodspore_ruination_45997_SpellScript::HandleEffect, EFFECT_1, SPELL_EFFECT_SEND_EVENT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const override
|
||||
{
|
||||
return new spell_q11719_bloodspore_ruination_45997_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class npc_bloodmage_laurith : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_bloodmage_laurith() : CreatureScript("npc_bloodmage_laurith") { }
|
||||
|
||||
struct npc_bloodmage_laurithAI : public ScriptedAI
|
||||
{
|
||||
npc_bloodmage_laurithAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_events.Reset();
|
||||
_playerGUID = 0;
|
||||
}
|
||||
|
||||
void SetGUID(uint64 guid, int32 /*action*/) override
|
||||
{
|
||||
if (_playerGUID)
|
||||
return;
|
||||
|
||||
_playerGUID = guid;
|
||||
|
||||
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
|
||||
me->SetFacingToObject(player);
|
||||
|
||||
_events.ScheduleEvent(EVENT_TALK, 1000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (UpdateVictim())
|
||||
{
|
||||
DoMeleeAttackIfReady();
|
||||
return;
|
||||
}
|
||||
|
||||
_events.Update(diff);
|
||||
|
||||
if (uint32 eventId = _events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_TALK:
|
||||
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
|
||||
Talk(SAY_BLOODMAGE_LAURITH, player);
|
||||
_playerGUID = 0;
|
||||
_events.ScheduleEvent(EVENT_RESET_ORIENTATION, 5000);
|
||||
break;
|
||||
case EVENT_RESET_ORIENTATION:
|
||||
me->SetFacingTo(me->GetHomePosition().GetOrientation());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap _events;
|
||||
uint64 _playerGUID;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new npc_bloodmage_laurithAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_borean_tundra()
|
||||
{
|
||||
// Ours
|
||||
@@ -1283,4 +1385,6 @@ void AddSC_borean_tundra()
|
||||
new npc_valiance_keep_cannoneer();
|
||||
new npc_warmage_coldarra();
|
||||
new npc_hidden_cultist();
|
||||
new spell_q11719_bloodspore_ruination_45997();
|
||||
new npc_bloodmage_laurith();
|
||||
}
|
||||
|
||||
@@ -576,13 +576,15 @@ class npc_minigob_manabonk : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_BLINK, 3*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_BLINK:
|
||||
{
|
||||
DoCast(me, SPELL_IMPROVED_BLINK);
|
||||
Position pos;
|
||||
me->GetRandomNearPosition(pos, (urand(15, 40)));
|
||||
me->GetMotionMaster()->MovePoint(0, pos.m_positionX, pos.m_positionY, pos.m_positionZ);
|
||||
events.ScheduleEvent(EVENT_DESPAWN, 3*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_DESPAWN, 3 * IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_DESPAWN_VISUAL, 2.5*IN_MILLISECONDS);
|
||||
break;
|
||||
}
|
||||
case EVENT_DESPAWN_VISUAL:
|
||||
DoCast(me, SPELL_TELEPORT_VISUAL);
|
||||
break;
|
||||
|
||||
@@ -104,11 +104,13 @@ class boss_mechano_lord_capacitus : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_REFLECTIVE_DAMAGE_SHIELD, 20000);
|
||||
break;
|
||||
case EVENT_SUMMON_NETHER_CHARGE:
|
||||
{
|
||||
Position pos;
|
||||
me->GetRandomNearPosition(pos, 8.0f);
|
||||
me->SummonCreature(NPC_NETHER_CHARGE, pos, TEMPSUMMON_TIMED_DESPAWN, 18000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_NETHER_CHARGE, 5000);
|
||||
break;
|
||||
}
|
||||
case EVENT_POSITIVE_SHIFT:
|
||||
me->CastSpell(me, SPELL_POLARITY_SHIFT, true);
|
||||
events.ScheduleEvent(EVENT_POSITIVE_SHIFT, 30000);
|
||||
|
||||
@@ -52,6 +52,7 @@ class npc_pet_mage_mirror_image : public CreatureScript
|
||||
|
||||
uint32 selectionTimer;
|
||||
uint64 _ebonGargoyleGUID;
|
||||
uint32 checktarget;
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
@@ -135,7 +136,7 @@ class npc_pet_mage_mirror_image : public CreatureScript
|
||||
}
|
||||
}
|
||||
|
||||
bool MySelectNextTarget()
|
||||
void MySelectNextTarget()
|
||||
{
|
||||
if (_ebonGargoyleGUID)
|
||||
{
|
||||
@@ -153,21 +154,27 @@ class npc_pet_mage_mirror_image : public CreatureScript
|
||||
// target has cc, search target without cc!
|
||||
if (selection->HasBreakableByDamageCrowdControlAura() || !me->IsValidAttackTarget(selection))
|
||||
{
|
||||
return false;
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
|
||||
me->getThreatManager().resetAllAggro();
|
||||
me->AddThreat(selection, 1000000.0f);
|
||||
AttackStart(selection);
|
||||
return true;
|
||||
|
||||
if (owner->IsInCombat())
|
||||
AttackStart(selection);
|
||||
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
if (!me->GetVictim() || !me->GetVictim()->IsAlive())
|
||||
return;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
selectionTimer = 0;
|
||||
checktarget = 0;
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
@@ -182,12 +189,15 @@ class npc_pet_mage_mirror_image : public CreatureScript
|
||||
return;
|
||||
}
|
||||
|
||||
if (me->GetVictim()->HasBreakableByDamageCrowdControlAura() || !me->GetVictim()->IsAlive())
|
||||
checktarget += diff;
|
||||
if (checktarget >= 1000)
|
||||
{
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
if (!MySelectNextTarget())
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
if (me->GetVictim()->HasBreakableByDamageCrowdControlAura() || !me->GetVictim()->IsAlive())
|
||||
{
|
||||
MySelectNextTarget();
|
||||
me->InterruptNonMeleeSpells(true); // Stop casting if target is C or not Alive.
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
selectionTimer += diff;
|
||||
|
||||
@@ -46,6 +46,7 @@ void AddSC_list_commandscript();
|
||||
void AddSC_lookup_commandscript();
|
||||
void AddSC_message_commandscript();
|
||||
void AddSC_misc_commandscript();
|
||||
void AddSC_mmaps_commandscript();
|
||||
void AddSC_modify_commandscript();
|
||||
void AddSC_npc_commandscript();
|
||||
void AddSC_quest_commandscript();
|
||||
@@ -616,6 +617,7 @@ void AddCommandScripts()
|
||||
AddSC_lookup_commandscript();
|
||||
AddSC_message_commandscript();
|
||||
AddSC_misc_commandscript();
|
||||
AddSC_mmaps_commandscript();
|
||||
AddSC_modify_commandscript();
|
||||
AddSC_npc_commandscript();
|
||||
AddSC_quest_commandscript();
|
||||
@@ -1169,3 +1171,15 @@ void AddOutdoorPvPScripts()
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
//~ ********************** Put your custom scripts below, like the commented examples, uncomment and edit *************************************
|
||||
|
||||
|
||||
//~ void AddSC_MySuperScript();
|
||||
|
||||
void AddCustomScripts()
|
||||
{
|
||||
#ifdef SCRIPTS
|
||||
//~ AddSC_MySuperScript();
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1545,12 +1545,16 @@ class spell_dk_death_grip : public SpellScriptLoader
|
||||
{
|
||||
PrepareSpellScript(spell_dk_death_grip_SpellScript);
|
||||
|
||||
SpellCastResult CheckPvPRange()
|
||||
SpellCastResult CheckCast()
|
||||
{
|
||||
Unit* caster = GetCaster();
|
||||
if (Unit* target = GetExplTargetUnit())
|
||||
if (target->GetTypeId() == TYPEID_PLAYER && caster->GetExactDist(target) < 8.0f) // xinef: should be 8.0f, but we have to add target size (1.5f)
|
||||
return SPELL_FAILED_TOO_CLOSE;
|
||||
Unit* target = GetExplTargetUnit();
|
||||
|
||||
if (target->GetTypeId() == TYPEID_PLAYER && caster->GetExactDist(target) < 8.0f) // xinef: should be 8.0f, but we have to add target size (1.5f)
|
||||
return SPELL_FAILED_TOO_CLOSE;
|
||||
|
||||
if (caster->HasUnitState(UNIT_STATE_JUMPING) || caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING))
|
||||
return SPELL_FAILED_MOVING;
|
||||
|
||||
return SPELL_CAST_OK;
|
||||
}
|
||||
@@ -1560,9 +1564,22 @@ class spell_dk_death_grip : public SpellScriptLoader
|
||||
Unit* caster = GetCaster();
|
||||
Unit* target = GetHitUnit();
|
||||
Unit* baseTarget = GetExplTargetUnit();
|
||||
Creature* targetCreature = GetHitCreature();
|
||||
|
||||
if (caster != target)
|
||||
caster->CastSpell(target, 49560, true);
|
||||
{
|
||||
if (targetCreature && (targetCreature->isWorldBoss() || targetCreature->IsDungeonBoss()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
caster->CastSpell(target, 49560, true);
|
||||
const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(1766); // Rogue kick
|
||||
if (!target->IsImmunedToSpellEffect(spellInfo, EFFECT_0))
|
||||
target->InterruptNonMeleeSpells(true);
|
||||
}
|
||||
}
|
||||
else
|
||||
baseTarget->CastSpell(caster, 49560, true);
|
||||
}
|
||||
@@ -1592,7 +1609,7 @@ class spell_dk_death_grip : public SpellScriptLoader
|
||||
{
|
||||
if (m_scriptSpellId == 49576) // xinef: base death grip, add pvp range restriction
|
||||
{
|
||||
OnCheckCast += SpellCheckCastFn(spell_dk_death_grip_SpellScript::CheckPvPRange);
|
||||
OnCheckCast += SpellCheckCastFn(spell_dk_death_grip_SpellScript::CheckCast);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_dk_death_grip_SpellScript::HandleBaseDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -4431,10 +4431,7 @@ class spell_gen_mount : public SpellScriptLoader
|
||||
if (map == 530 || (map == 571 && target->HasSpell(SPELL_COLD_WEATHER_FLYING)))
|
||||
canFly = true;
|
||||
|
||||
float x, y, z;
|
||||
target->GetPosition(x, y, z);
|
||||
uint32 areaFlag = target->GetBaseMap()->GetAreaFlag(x, y, z);
|
||||
AreaTableEntry const* area = sAreaStore.LookupEntry(areaFlag);
|
||||
AreaTableEntry const* area = sAreaTableStore.LookupEntry(target->GetAreaId());
|
||||
// Xinef: add battlefield check
|
||||
Battlefield* Bf = sBattlefieldMgr->GetBattlefieldToZoneId(target->GetZoneId());
|
||||
if (!area || (canFly && ((area->flags & AREA_FLAG_NO_FLY_ZONE) || (Bf && !Bf->CanFlyIn()))))
|
||||
|
||||
@@ -592,7 +592,7 @@ class spell_warr_overpower : public SpellScriptLoader
|
||||
|
||||
if (Player* target = GetHitPlayer())
|
||||
if (target->HasUnitState(UNIT_STATE_CASTING))
|
||||
target->CastSpell(target, spellId, true);
|
||||
target->CastSpell(target, spellId, true, 0, 0, GetCaster()->GetGUID());
|
||||
}
|
||||
|
||||
void Register()
|
||||
|
||||
@@ -112,10 +112,10 @@ class achievement_bg_sa_artillery : public AchievementCriteriaScript
|
||||
}
|
||||
};
|
||||
|
||||
class achievement_arena_kills : public AchievementCriteriaScript
|
||||
class achievement_arena_by_type : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_arena_kills(char const* name, uint8 arenaType) : AchievementCriteriaScript(name),
|
||||
achievement_arena_by_type(char const* name, uint8 arenaType) : AchievementCriteriaScript(name),
|
||||
_arenaType(arenaType)
|
||||
{
|
||||
}
|
||||
@@ -129,7 +129,6 @@ class achievement_arena_kills : public AchievementCriteriaScript
|
||||
uint8 const _arenaType;
|
||||
};
|
||||
|
||||
|
||||
class achievement_sickly_gazelle : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
@@ -254,9 +253,9 @@ void AddSC_achievement_scripts()
|
||||
new achievement_sickly_gazelle();
|
||||
new achievement_everything_counts();
|
||||
new achievement_bg_av_perfection();
|
||||
new achievement_arena_kills("achievement_arena_2v2_kills", ARENA_TYPE_2v2);
|
||||
new achievement_arena_kills("achievement_arena_3v3_kills", ARENA_TYPE_3v3);
|
||||
new achievement_arena_kills("achievement_arena_5v5_kills", ARENA_TYPE_5v5);
|
||||
new achievement_arena_by_type("achievement_arena_2v2_check", ARENA_TYPE_2v2);
|
||||
new achievement_arena_by_type("achievement_arena_3v3_check", ARENA_TYPE_3v3);
|
||||
new achievement_arena_by_type("achievement_arena_5v5_check", ARENA_TYPE_5v5);
|
||||
new achievement_sa_defense_of_the_ancients();
|
||||
new achievement_tilted();
|
||||
new achievement_not_even_a_scratch();
|
||||
|
||||
Reference in New Issue
Block a user