Merge branch 'master' into Playerbot

This commit is contained in:
Yunfan Li
2025-02-19 22:29:36 +08:00
parent d1032678ff
commit 7d431dc796
277 changed files with 7092 additions and 5050 deletions
@@ -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:
@@ -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();