Merge branch 'master' into Playerbot
This commit is contained in:
@@ -19,10 +19,11 @@
|
||||
#include "InstanceMapScript.h"
|
||||
#include "InstanceScript.h"
|
||||
#include "Player.h"
|
||||
#include "SpellScript.h"
|
||||
#include "SpellScriptLoader.h"
|
||||
#include "WorldPacket.h"
|
||||
#include "WorldStatePackets.h"
|
||||
#include "ruby_sanctum.h"
|
||||
#include "SpellScript.h"
|
||||
|
||||
BossBoundaryData const boundaries =
|
||||
{
|
||||
@@ -63,7 +64,6 @@ public:
|
||||
{
|
||||
if (GetBossState(DATA_HALION_INTRO_DONE) != DONE && GetBossState(DATA_GENERAL_ZARITHRIAN) == DONE)
|
||||
{
|
||||
instance->LoadGrid(3156.0f, 537.0f);
|
||||
if (Creature* halionController = instance->GetCreature(HalionControllerGUID))
|
||||
halionController->AI()->DoAction(ACTION_INTRO_HALION);
|
||||
}
|
||||
@@ -218,11 +218,12 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
void FillInitialWorldStates(WorldPacket& data) override
|
||||
void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet) override
|
||||
{
|
||||
data << uint32(WORLDSTATE_CORPOREALITY_MATERIAL) << uint32(50);
|
||||
data << uint32(WORLDSTATE_CORPOREALITY_TWILIGHT) << uint32(50);
|
||||
data << uint32(WORLDSTATE_CORPOREALITY_TOGGLE) << uint32(0);
|
||||
packet.Worldstates.reserve(3);
|
||||
packet.Worldstates.emplace_back(WORLDSTATE_CORPOREALITY_MATERIAL, 50);
|
||||
packet.Worldstates.emplace_back(WORLDSTATE_CORPOREALITY_TWILIGHT, 50);
|
||||
packet.Worldstates.emplace_back(WORLDSTATE_CORPOREALITY_TOGGLE, 0);
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
+2
-5
@@ -15,12 +15,12 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "Group.h"
|
||||
#include "InstanceMapScript.h"
|
||||
#include "InstanceScript.h"
|
||||
#include "MapMgr.h"
|
||||
#include "Transport.h"
|
||||
#include "halls_of_reflection.h"
|
||||
#include "InstanceScript.h"
|
||||
#include "Group.h"
|
||||
|
||||
class UtherBatteredHiltEvent : public BasicEvent
|
||||
{
|
||||
@@ -325,7 +325,6 @@ public:
|
||||
}
|
||||
else
|
||||
{
|
||||
instance->LoadGrid(PathWaypoints[PATH_WP_COUNT - 1].GetPositionX(), PathWaypoints[PATH_WP_COUNT - 1].GetPositionY());
|
||||
creature->UpdatePosition(PathWaypoints[PATH_WP_COUNT - 1], true);
|
||||
creature->StopMovingOnCurrentPos();
|
||||
}
|
||||
@@ -515,7 +514,6 @@ public:
|
||||
{
|
||||
break;
|
||||
}
|
||||
instance->LoadGrid(LeaderEscapePos.GetPositionX(), LeaderEscapePos.GetPositionY());
|
||||
if (Creature* c = instance->GetCreature(NPC_LeaderGUID))
|
||||
{
|
||||
if (!c->IsAlive())
|
||||
@@ -567,7 +565,6 @@ public:
|
||||
case DATA_LICH_KING:
|
||||
if (data == DONE)
|
||||
{
|
||||
instance->LoadGrid(PathWaypoints[0].GetPositionX(), PathWaypoints[0].GetPositionY());
|
||||
EncounterMask |= (1 << DATA_LICH_KING);
|
||||
if (Creature* c = instance->GetCreature(NPC_LeaderGUID))
|
||||
c->setActive(false);
|
||||
|
||||
@@ -78,7 +78,6 @@ public:
|
||||
{
|
||||
InstanceScript::OnPlayerEnter(player);
|
||||
|
||||
instance->LoadGrid(LeaderIntroPos.GetPositionX(), LeaderIntroPos.GetPositionY());
|
||||
if (Creature* c = instance->GetCreature(GetGuidData(DATA_LEADER_FIRST_GUID)))
|
||||
c->AI()->SetData(DATA_START_INTRO, 0);
|
||||
}
|
||||
|
||||
@@ -342,7 +342,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) override
|
||||
void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/, SpellSchoolMask /*damageSchoolMask*/) override
|
||||
{
|
||||
if (!target->IsPlayer())
|
||||
return;
|
||||
@@ -612,7 +612,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) override
|
||||
void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/, SpellSchoolMask /*damageSchoolMask*/) override
|
||||
{
|
||||
if (!target->IsPlayer())
|
||||
return;
|
||||
@@ -906,7 +906,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) override
|
||||
void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/, SpellSchoolMask /*damageSchoolMask*/) override
|
||||
{
|
||||
if (!target->IsPlayer())
|
||||
return;
|
||||
@@ -1334,7 +1334,7 @@ public:
|
||||
me->DespawnOrUnsummon(1);
|
||||
}
|
||||
|
||||
void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) override
|
||||
void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/, SpellSchoolMask /*damageSchoolMask*/) override
|
||||
{
|
||||
if (!target->IsPlayer())
|
||||
{
|
||||
|
||||
@@ -1021,18 +1021,25 @@ public:
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
events.Reset();
|
||||
if (Player* owner = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
|
||||
|
||||
if (!killer)
|
||||
return;
|
||||
|
||||
Player* owner = killer->GetCharmerOrOwnerPlayerOrPlayerItself();
|
||||
if (!owner)
|
||||
return;
|
||||
|
||||
Group* group = owner->GetGroup();
|
||||
if (!group)
|
||||
{
|
||||
if (Group* group = owner->GetGroup())
|
||||
{
|
||||
for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
|
||||
if (Player* member = itr->GetSource())
|
||||
if (member->IsInMap(owner))
|
||||
member->FailQuest(QUEST_DEPROGRAMMING);
|
||||
}
|
||||
else
|
||||
owner->FailQuest(QUEST_DEPROGRAMMING);
|
||||
owner->FailQuest(QUEST_DEPROGRAMMING);
|
||||
return;
|
||||
}
|
||||
|
||||
for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
|
||||
if (Player* member = itr->GetSource())
|
||||
if (member->IsInMap(owner))
|
||||
member->FailQuest(QUEST_DEPROGRAMMING);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id) override
|
||||
|
||||
@@ -1537,7 +1537,6 @@ public:
|
||||
|
||||
if (!instance->GetData(DATA_SINDRAGOSA_FROSTWYRMS) && instance->GetBossState(DATA_SINDRAGOSA) != IN_PROGRESS)
|
||||
{
|
||||
player->GetMap()->LoadGrid(SindragosaSpawnPos.GetPositionX(), SindragosaSpawnPos.GetPositionY());
|
||||
if (Creature* sindragosa = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_SINDRAGOSA)))
|
||||
sindragosa->AI()->DoAction(ACTION_START_FROSTWYRM);
|
||||
}
|
||||
|
||||
@@ -747,8 +747,6 @@ public:
|
||||
me->setActive(true);
|
||||
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetImmuneToAll(true);
|
||||
// Load Grid with Sister Svalna
|
||||
me->GetMap()->LoadGrid(4356.71f, 2484.33f);
|
||||
if (Creature* svalna = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_SISTER_SVALNA)))
|
||||
svalna->AI()->DoAction(ACTION_START_GAUNTLET);
|
||||
for (uint32 i = 0; i < 4; ++i)
|
||||
|
||||
@@ -230,16 +230,14 @@ public:
|
||||
IsSindragosaIntroDone = false;
|
||||
}
|
||||
|
||||
void FillInitialWorldStates(WorldPacket& data) override
|
||||
void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet) override
|
||||
{
|
||||
if (instance->IsHeroic())
|
||||
{
|
||||
data << uint32(WORLDSTATE_SHOW_TIMER) << uint32(BloodQuickeningState == IN_PROGRESS);
|
||||
data << uint32(WORLDSTATE_EXECUTION_TIME) << uint32(BloodQuickeningMinutes);
|
||||
data << uint32(WORLDSTATE_SHOW_ATTEMPTS) << uint32(1);
|
||||
data << uint32(WORLDSTATE_ATTEMPTS_REMAINING) << uint32(HeroicAttempts);
|
||||
data << uint32(WORLDSTATE_ATTEMPTS_MAX) << uint32(MaxHeroicAttempts);
|
||||
}
|
||||
packet.Worldstates.reserve(5);
|
||||
packet.Worldstates.emplace_back(WORLDSTATE_SHOW_TIMER, BloodQuickeningState == IN_PROGRESS ? 1 : 0);
|
||||
packet.Worldstates.emplace_back(WORLDSTATE_EXECUTION_TIME, BloodQuickeningMinutes);
|
||||
packet.Worldstates.emplace_back(WORLDSTATE_SHOW_ATTEMPTS, 1); // instance->IsHeroic() ? 1 : 0
|
||||
packet.Worldstates.emplace_back(WORLDSTATE_ATTEMPTS_REMAINING, HeroicAttempts);
|
||||
packet.Worldstates.emplace_back(WORLDSTATE_ATTEMPTS_MAX, MaxHeroicAttempts);
|
||||
}
|
||||
|
||||
void OnPlayerAreaUpdate(Player* player, uint32 /*oldArea*/, uint32 newArea) override
|
||||
@@ -651,7 +649,6 @@ public:
|
||||
FrostwyrmGUIDs.erase(creature->GetSpawnId());
|
||||
if (FrostwyrmGUIDs.empty())
|
||||
{
|
||||
instance->LoadGrid(SindragosaSpawnPos.GetPositionX(), SindragosaSpawnPos.GetPositionY());
|
||||
if (Creature* boss = instance->SummonCreature(NPC_SINDRAGOSA, SindragosaSpawnPos))
|
||||
boss->AI()->DoAction(ACTION_START_FROSTWYRM);
|
||||
}
|
||||
@@ -1190,7 +1187,6 @@ public:
|
||||
if (GameObject* pillars = instance->GetGameObject(PillarsUnchainedGUID))
|
||||
pillars->SetRespawnTime(7 * DAY);
|
||||
|
||||
instance->LoadGrid(JainaSpawnPos.GetPositionX(), JainaSpawnPos.GetPositionY());
|
||||
instance->SummonCreature(NPC_LADY_JAINA_PROUDMOORE_QUEST, JainaSpawnPos);
|
||||
instance->SummonCreature(NPC_MURADIN_BRONZEBEARD_QUEST, MuradinSpawnPos);
|
||||
instance->SummonCreature(NPC_UTHER_THE_LIGHTBRINGER_QUEST, UtherSpawnPos);
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
#include "SpellInfo.h"
|
||||
#include "naxxramas.h"
|
||||
|
||||
|
||||
using namespace Faerlina;
|
||||
|
||||
void AddSC_boss_faerlina()
|
||||
|
||||
@@ -21,21 +21,16 @@ enum Yells
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_POISON_BOLT_VOLLEY_10 = 28796,
|
||||
SPELL_POISON_BOLT_VOLLEY_25 = 54098,
|
||||
SPELL_RAIN_OF_FIRE_10 = 28794,
|
||||
SPELL_RAIN_OF_FIRE_25 = 54099,
|
||||
SPELL_FRENZY_10 = 28798,
|
||||
SPELL_FRENZY_25 = 54100,
|
||||
SPELL_POISON_BOLT_VOLLEY = 28796,
|
||||
SPELL_RAIN_OF_FIRE = 28794,
|
||||
SPELL_FRENZY = 28798,
|
||||
SPELL_WIDOWS_EMBRACE = 28732,
|
||||
SPELL_MINION_WIDOWS_EMBRACE = 54097
|
||||
};
|
||||
|
||||
enum Events
|
||||
enum Groups
|
||||
{
|
||||
EVENT_POISON_BOLT = 1,
|
||||
EVENT_RAIN_OF_FIRE = 2,
|
||||
EVENT_FRENZY = 3
|
||||
GROUP_FRENZY = 1
|
||||
};
|
||||
|
||||
enum Misc
|
||||
@@ -56,16 +51,7 @@ public:
|
||||
|
||||
struct boss_faerlinaAI : public BossAI
|
||||
{
|
||||
boss_faerlinaAI(Creature* c) : BossAI(c, BOSS_FAERLINA), summons(me)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
sayGreet = false;
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
bool sayGreet;
|
||||
boss_faerlinaAI(Creature* c) : BossAI(c, BOSS_FAERLINA), _introDone(false) { }
|
||||
|
||||
void SummonHelpers()
|
||||
{
|
||||
@@ -80,24 +66,13 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* cr) override
|
||||
{
|
||||
summons.Summon(cr);
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
BossAI::Reset();
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
SummonHelpers();
|
||||
if (pInstance)
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_FAERLINA_WEB)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
}
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(instance->GetGuidData(DATA_FAERLINA_WEB)))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
@@ -106,25 +81,38 @@ public:
|
||||
me->CallForHelp(VISIBLE_RANGE);
|
||||
summons.DoZoneInCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
events.ScheduleEvent(EVENT_POISON_BOLT, 7s, 15s);
|
||||
events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 8s, 18s);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 60s, 80s, 1);
|
||||
events.SetPhase(1);
|
||||
if (pInstance)
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_FAERLINA_WEB)))
|
||||
|
||||
ScheduleTimedEvent(7s, 15s, [&]{
|
||||
if (!me->HasAura(SPELL_WIDOWS_EMBRACE))
|
||||
DoCastVictim(SPELL_POISON_BOLT_VOLLEY);
|
||||
}, 7s, 15s);
|
||||
|
||||
ScheduleTimedEvent(8s, 18s, [&] {
|
||||
DoCastRandomTarget(SPELL_RAIN_OF_FIRE);
|
||||
}, 8s, 18s);
|
||||
|
||||
scheduler.Schedule(60s, 80s, GROUP_FRENZY, [this](TaskContext context) {
|
||||
if (!me->HasAura(SPELL_WIDOWS_EMBRACE))
|
||||
{
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
Talk(SAY_FRENZY);
|
||||
Talk(EMOTE_FRENZY);
|
||||
DoCastSelf(SPELL_FRENZY, true);
|
||||
context.Repeat(1min);
|
||||
}
|
||||
}
|
||||
else
|
||||
context.Repeat(30s);
|
||||
});
|
||||
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(instance->GetGuidData(DATA_FAERLINA_WEB)))
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
if (!sayGreet && who->IsPlayer())
|
||||
if (!_introDone && who->IsPlayer())
|
||||
{
|
||||
Talk(SAY_GREET);
|
||||
sayGreet = true;
|
||||
_introDone = true;
|
||||
}
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
@@ -135,83 +123,17 @@ public:
|
||||
return;
|
||||
|
||||
if (!urand(0, 3))
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
|
||||
instance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
Talk(SAY_DEATH);
|
||||
if (pInstance)
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_FAERLINA_WEB)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!me->IsInCombat() && sayGreet)
|
||||
{
|
||||
for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
{
|
||||
if (pInstance)
|
||||
{
|
||||
if (Creature* cr = pInstance->instance->GetCreature(*itr))
|
||||
{
|
||||
if (cr->IsInCombat())
|
||||
DoZoneInCombat();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_POISON_BOLT:
|
||||
if (!me->HasAura(RAID_MODE(SPELL_WIDOWS_EMBRACE, SPELL_MINION_WIDOWS_EMBRACE)))
|
||||
{
|
||||
me->CastCustomSpell(RAID_MODE(SPELL_POISON_BOLT_VOLLEY_10, SPELL_POISON_BOLT_VOLLEY_25), SPELLVALUE_MAX_TARGETS, RAID_MODE(3, 10), me, false);
|
||||
}
|
||||
events.Repeat(7s, 15s);
|
||||
break;
|
||||
case EVENT_RAIN_OF_FIRE:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
{
|
||||
me->CastSpell(target, RAID_MODE(SPELL_RAIN_OF_FIRE_10, SPELL_RAIN_OF_FIRE_25), false);
|
||||
}
|
||||
events.Repeat(8s, 18s);
|
||||
break;
|
||||
case EVENT_FRENZY:
|
||||
if (!me->HasAura(RAID_MODE(SPELL_FRENZY_10, SPELL_FRENZY_25)))
|
||||
{
|
||||
Talk(SAY_FRENZY);
|
||||
Talk(EMOTE_FRENZY);
|
||||
me->CastSpell(me, RAID_MODE(SPELL_FRENZY_10, SPELL_FRENZY_25), true);
|
||||
events.Repeat(1min);
|
||||
}
|
||||
else
|
||||
{
|
||||
events.Repeat(30s);
|
||||
}
|
||||
break;
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(instance->GetGuidData(DATA_FAERLINA_WEB)))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
|
||||
void SpellHit(Unit* caster, SpellInfo const* spell) override
|
||||
@@ -219,18 +141,16 @@ public:
|
||||
if (spell->Id == RAID_MODE(SPELL_WIDOWS_EMBRACE, SPELL_MINION_WIDOWS_EMBRACE))
|
||||
{
|
||||
Talk(EMOTE_WIDOWS_EMBRACE);
|
||||
if (me->HasAura(RAID_MODE(SPELL_FRENZY_10, SPELL_FRENZY_25)))
|
||||
{
|
||||
me->RemoveAurasDueToSpell(RAID_MODE(SPELL_FRENZY_10, SPELL_FRENZY_25));
|
||||
events.RescheduleEvent(EVENT_FRENZY, 1min);
|
||||
}
|
||||
pInstance->SetData(DATA_FRENZY_REMOVED, 0);
|
||||
scheduler.RescheduleGroup(GROUP_FRENZY, 1min);
|
||||
me->RemoveAurasDueToSpell(SPELL_FRENZY);
|
||||
instance->SetData(DATA_FRENZY_REMOVED, 0);
|
||||
if (Is25ManRaid())
|
||||
{
|
||||
Unit::Kill(caster, caster);
|
||||
}
|
||||
caster->KillSelf();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
bool _introDone;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -121,12 +121,9 @@ public:
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
if (pInstance)
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_MAEXXNA_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
}
|
||||
if (pInstance->GetBossState(BOSS_FAERLINA) == DONE)
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
|
||||
@@ -101,7 +101,7 @@ public:
|
||||
_screamTimer = 2 * MINUTE * IN_MILLISECONDS;
|
||||
_hadThaddiusGreet = false;
|
||||
_currentWingTaunt = SAY_FIRST_WING_TAUNT;
|
||||
_horsemanLoaded = 0;
|
||||
_currentHorsemenLine = 0;
|
||||
|
||||
// Achievements
|
||||
abominationsKilled = 0;
|
||||
@@ -174,6 +174,7 @@ public:
|
||||
bool _hadThaddiusGreet;
|
||||
EventMap events;
|
||||
uint8 _currentWingTaunt;
|
||||
uint8 _currentHorsemenLine;
|
||||
uint8 _horsemanLoaded;
|
||||
|
||||
// Achievements
|
||||
@@ -821,8 +822,6 @@ public:
|
||||
if (state == DONE)
|
||||
{
|
||||
_speakTimer = 1;
|
||||
// Load KT's grid so he can talk
|
||||
instance->LoadGrid(3763.43f, -5115.87f);
|
||||
}
|
||||
else if (state == NOT_STARTED)
|
||||
{
|
||||
@@ -945,6 +944,7 @@ public:
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_HORSEMEN_INTRO, 10s);
|
||||
break;
|
||||
case BOSS_SAPPHIRON:
|
||||
events.ScheduleEvent(EVENT_FROSTWYRM_WATERFALL_DOOR, 5s);
|
||||
@@ -1061,8 +1061,6 @@ public:
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_KELTHUZAD_WING_TAUNT:
|
||||
// Loads Kel'Thuzad's grid. We need this as he must be active in order for his texts to work.
|
||||
instance->LoadGrid(3749.67f, -5114.06f);
|
||||
if (Creature* kelthuzad = instance->GetCreature(_kelthuzadGUID))
|
||||
{
|
||||
kelthuzad->AI()->Talk(_currentWingTaunt);
|
||||
@@ -1075,6 +1073,52 @@ public:
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
break;
|
||||
case EVENT_HORSEMEN_INTRO:
|
||||
switch (_currentHorsemenLine)
|
||||
{
|
||||
case 0: // To arms, ye roustabouts! We've got company!
|
||||
if (Creature* korthazz = instance->GetCreature(_korthazzGUID))
|
||||
korthazz->AI()->Talk(SAY_HORSEMEN_DIALOG1);
|
||||
events.ScheduleEvent(EVENT_HORSEMEN_INTRO, 4500ms);
|
||||
break;
|
||||
case 1: // Invaders, cease this foolish venture at once! Turn away while you still can!
|
||||
if (Creature* zeliek = instance->GetCreature(_zeliekGUID))
|
||||
zeliek->AI()->Talk(SAY_HORSEMEN_DIALOG1);
|
||||
events.ScheduleEvent(EVENT_HORSEMEN_INTRO, 6500ms);
|
||||
break;
|
||||
case 2: // Come, Zeliek, do not drive them out. Not before we've had our fun!
|
||||
if (Creature* blaumeux = instance->GetCreature(_blaumeuxGUID))
|
||||
blaumeux->AI()->Talk(SAY_HORSEMEN_DIALOG1);
|
||||
events.ScheduleEvent(EVENT_HORSEMEN_INTRO, 6500ms);
|
||||
break;
|
||||
case 3: // Enough prattling. Let them come. We shall grind their bones to dust.
|
||||
if (Creature* rivendare = instance->GetCreature(_rivendareGUID))
|
||||
rivendare->AI()->Talk(SAY_HORSEMEN_DIALOG1);
|
||||
events.ScheduleEvent(EVENT_HORSEMEN_INTRO, 6500ms);
|
||||
break;
|
||||
case 4: // I do hope they stay alive long enough for me to... introduce myself.
|
||||
if (Creature* blaumeux = instance->GetCreature(_blaumeuxGUID))
|
||||
blaumeux->AI()->Talk(SAY_HORSEMEN_DIALOG2);
|
||||
events.ScheduleEvent(EVENT_HORSEMEN_INTRO, 6500ms);
|
||||
break;
|
||||
case 5: // Perhaps they will come to their senses... and run away as fast as they can.
|
||||
if (Creature* zeliek = instance->GetCreature(_zeliekGUID))
|
||||
zeliek->AI()->Talk(SAY_HORSEMEN_DIALOG2);
|
||||
events.ScheduleEvent(EVENT_HORSEMEN_INTRO, 6500ms);
|
||||
break;
|
||||
case 6: // I've heard about enough a' yer snivelin'! Shut yer flytrap before I shut it for ye'!
|
||||
if (Creature* korthazz = instance->GetCreature(_korthazzGUID))
|
||||
korthazz->AI()->Talk(SAY_HORSEMEN_DIALOG2);
|
||||
events.ScheduleEvent(EVENT_HORSEMEN_INTRO, 6500ms);
|
||||
break;
|
||||
case 7: // Conserve your anger. Harness your rage. You will all have outlets for your frustrations soon enough.
|
||||
if (Creature* rivendare = instance->GetCreature(_rivendareGUID))
|
||||
rivendare->AI()->Talk(SAY_HORSEMEN_DIALOG2);
|
||||
events.ScheduleEvent(EVENT_HORSEMEN_INTRO, 6500ms);
|
||||
break;
|
||||
}
|
||||
++_currentHorsemenLine;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -190,14 +190,17 @@ enum NXSays
|
||||
SAY_SAPP_DIALOG5 = 4,
|
||||
SAY_SAPP_DIALOG6 = 20,
|
||||
SAY_CAT_DIED = 5,
|
||||
SAY_FIRST_WING_TAUNT = 16
|
||||
SAY_FIRST_WING_TAUNT = 16,
|
||||
SAY_HORSEMEN_DIALOG1 = 5,
|
||||
SAY_HORSEMEN_DIALOG2 = 6
|
||||
};
|
||||
|
||||
enum NXEvents
|
||||
{
|
||||
EVENT_THADDIUS_SCREAMS = 0,
|
||||
EVENT_KELTHUZAD_WING_TAUNT = 1,
|
||||
EVENT_FROSTWYRM_WATERFALL_DOOR = 2
|
||||
EVENT_FROSTWYRM_WATERFALL_DOOR = 2,
|
||||
EVENT_HORSEMEN_INTRO = 3
|
||||
};
|
||||
|
||||
template <class AI, class T>
|
||||
|
||||
@@ -80,12 +80,16 @@ float summons[3][4] =
|
||||
{NPC_PHANTASMAL_CLOUDSCRAPER, NPC_PHANTASMAL_CLOUDSCRAPER, NPC_PHANTASMAL_MAMMOTH, NPC_PHANTASMAL_WOLF}
|
||||
};
|
||||
|
||||
float cords[4][4] =
|
||||
float cords[5][4] =
|
||||
{
|
||||
{1177.47f, 937.722f, 527.405f, 2.21657f},
|
||||
{968.66f, 1042.53f, 527.32f, 0.077f},
|
||||
{1164.02f, 1170.85f, 527.321f, 3.66f},
|
||||
{1118.31f, 1080.377f, 508.361f, 4.25f}
|
||||
{1118.31f, 1080.377f, 508.361f, 4.25f},
|
||||
// There are 4 phases but with the code like this:
|
||||
// me->SetHomePosition(cords[phase + 1][0], cords[phase + 1][1], cords[phase + 1][2], cords[phase + 1][3]);
|
||||
// lets provide fallback position.
|
||||
{1177.47f, 937.722f, 527.405f, 2.21657f}
|
||||
};
|
||||
|
||||
class boss_urom : public CreatureScript
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include "LFGMgr.h"
|
||||
#include "Player.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "WorldStatePackets.h"
|
||||
#include "oculus.h"
|
||||
|
||||
class instance_oculus : public InstanceMapScript
|
||||
|
||||
@@ -630,7 +630,7 @@ public:
|
||||
uint32 _timer;
|
||||
bool _damaged, justSpawned;
|
||||
|
||||
void DamageDealt(Unit* /*victim*/, uint32& damage, DamageEffectType /*damageType*/) override
|
||||
void DamageDealt(Unit* /*victim*/, uint32& damage, DamageEffectType /*damageType*/, SpellSchoolMask /*damageSchoolMask*/) override
|
||||
{
|
||||
if (damage > 0 && !_damaged && me->GetInstanceScript())
|
||||
{
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "ScriptedCreature.h"
|
||||
#include "Transport.h"
|
||||
#include "WorldPacket.h"
|
||||
#include "WorldStatePackets.h"
|
||||
#include "ulduar.h"
|
||||
|
||||
class instance_ulduar : public InstanceMapScript
|
||||
@@ -169,16 +170,16 @@ public:
|
||||
m_mimironTramUsed = false;
|
||||
}
|
||||
|
||||
void FillInitialWorldStates(WorldPacket& packet) override
|
||||
void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet) override
|
||||
{
|
||||
packet << uint32(WORLD_STATE_ALGALON_TIMER_ENABLED) << uint32(m_algalonTimer && m_algalonTimer <= 60);
|
||||
packet << uint32(WORLD_STATE_ALGALON_DESPAWN_TIMER) << uint32(std::min<uint32>(m_algalonTimer, 60));
|
||||
packet.Worldstates.reserve(2);
|
||||
packet.Worldstates.emplace_back(WORLD_STATE_ALGALON_TIMER_ENABLED, (m_algalonTimer && m_algalonTimer <= 60) ? 1 : 0);
|
||||
packet.Worldstates.emplace_back(WORLD_STATE_ALGALON_DESPAWN_TIMER, std::min<int32>(m_algalonTimer, 60));
|
||||
}
|
||||
|
||||
void OnPlayerEnter(Player* player) override
|
||||
{
|
||||
// mimiron tram:
|
||||
instance->LoadGrid(2307.0f, 284.632f);
|
||||
if (GameObject* MimironTram = instance->GetGameObject(m_mimironTramGUID))
|
||||
{
|
||||
player->UpdateVisibilityOf(MimironTram);
|
||||
@@ -537,10 +538,7 @@ public:
|
||||
break;
|
||||
case GO_KEEPERS_GATE:
|
||||
if (GetData(TYPE_MIMIRON) == DONE && GetData(TYPE_FREYA) == DONE && GetData(TYPE_HODIR) == DONE && GetData(TYPE_THORIM) == DONE)
|
||||
{
|
||||
instance->LoadGrid(1903.0f, 248.0f);
|
||||
gameObject->RemoveGameObjectFlag(GO_FLAG_LOCKED);
|
||||
}
|
||||
|
||||
m_keepersgateGUID = gameObject->GetGUID();
|
||||
break;
|
||||
@@ -752,8 +750,6 @@ public:
|
||||
case EVENT_TOWER_OF_FROST_DESTROYED:
|
||||
case EVENT_TOWER_OF_FLAMES_DESTROYED:
|
||||
{
|
||||
instance->LoadGrid(364.0f, -16.0f); //make sure leviathan is loaded
|
||||
instance->LoadGrid(364.0f, 32.0f); //make sure Mimiron's and Thorim's Targetting Crystal are loaded
|
||||
m_leviathanTowers[type - EVENT_TOWER_OF_LIFE_DESTROYED] = data;
|
||||
for (uint8 i = 0; i < 2; ++i)
|
||||
{
|
||||
|
||||
@@ -233,88 +233,6 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
enum eFeedinDaGoolz
|
||||
{
|
||||
NPC_DECAYING_GHOUL = 28565,
|
||||
GO_BOWL = 190656,
|
||||
};
|
||||
|
||||
class npc_feedin_da_goolz : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_feedin_da_goolz() : CreatureScript("npc_feedin_da_goolz") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new npc_feedin_da_goolzAI(creature);
|
||||
}
|
||||
|
||||
struct npc_feedin_da_goolzAI : public NullCreatureAI
|
||||
{
|
||||
npc_feedin_da_goolzAI(Creature* creature) : NullCreatureAI(creature) { findTimer = 1; checkTimer = 0; }
|
||||
|
||||
uint32 findTimer;
|
||||
uint32 checkTimer;
|
||||
ObjectGuid ghoulFed;
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (findTimer)
|
||||
{
|
||||
findTimer += diff;
|
||||
if (findTimer >= 1000)
|
||||
{
|
||||
if (Creature* ghoul = me->FindNearestCreature(NPC_DECAYING_GHOUL, 30.0f, true))
|
||||
{
|
||||
ghoul->SetReactState(REACT_DEFENSIVE);
|
||||
float o = me->GetAngle(ghoul);
|
||||
ghoul->GetMotionMaster()->MovePoint(1, me->GetPositionX() + 2 * cos(o), me->GetPositionY() + 2 * std::sin(o), me->GetPositionZ());
|
||||
checkTimer = 1;
|
||||
findTimer = 0;
|
||||
}
|
||||
else
|
||||
findTimer = 1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (checkTimer)
|
||||
{
|
||||
checkTimer += diff;
|
||||
if (checkTimer >= 1500)
|
||||
{
|
||||
checkTimer = 1;
|
||||
if (!ghoulFed)
|
||||
{
|
||||
if (Creature* ghoul = me->FindNearestCreature(NPC_DECAYING_GHOUL, 3.0f, true))
|
||||
{
|
||||
ghoulFed = ghoul->GetGUID();
|
||||
ghoul->HandleEmoteCommand(EMOTE_ONESHOT_EAT);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GameObject* bowl = me->FindNearestGameObject(GO_BOWL, 10.0f))
|
||||
bowl->Delete();
|
||||
|
||||
if (Creature* ghoul = ObjectAccessor::GetCreature(*me, ghoulFed))
|
||||
{
|
||||
ghoul->SetReactState(REACT_AGGRESSIVE);
|
||||
ghoul->GetMotionMaster()->MoveTargetedHome();
|
||||
}
|
||||
|
||||
if (Unit* owner = me->ToTempSummon()->GetSummonerUnit())
|
||||
if (Player* player = owner->ToPlayer())
|
||||
player->KilledMonsterCredit(me->GetEntry());
|
||||
|
||||
me->DespawnOrUnsummon(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
enum overlordDrakuru
|
||||
{
|
||||
SPELL_SHADOW_BOLT = 54113,
|
||||
@@ -953,7 +871,6 @@ void AddSC_zuldrak()
|
||||
// Ours
|
||||
new npc_finklestein();
|
||||
new go_finklestein_cauldron();
|
||||
new npc_feedin_da_goolz();
|
||||
new npc_overlord_drakuru_betrayal();
|
||||
new npc_drakuru_shackles();
|
||||
new npc_captured_rageclaw();
|
||||
|
||||
Reference in New Issue
Block a user