Core/Scripts: Implemented OnlyOnceAreaTriggerScript

This commit is contained in:
Aokromes committed 2017-12-11 16:15:22 +01:00
1 parent 2103c33611
commit 1a00fad992
26 files changed
+213 -168

No files matched your search

+1 -1
View File
@@ -1301,7 +1301,7 @@ void WorldObject::RemoveFromWorld()
Object::RemoveFromWorld();
}
InstanceScript* WorldObject::GetInstanceScript()
InstanceScript* WorldObject::GetInstanceScript() const
{
Map* map = GetMap();
return map->IsDungeon() ? ((InstanceMap*)map)->GetInstanceScript() : NULL;
+1 -1
View File
@@ -503,7 +503,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
uint32 GetAreaId() const { return m_areaId; }
void GetZoneAndAreaId(uint32& zoneid, uint32& areaid) const { zoneid = m_zoneId, areaid = m_areaId; }
InstanceScript* GetInstanceScript();
InstanceScript* GetInstanceScript() const;
std::string const& GetName() const { return m_name; }
void SetName(std::string const& newname) { m_name=newname; }
+15 -9
View File
@@ -254,12 +254,17 @@ class TC_GAME_API InstanceScript : public ZoneScript
uint32 GetEncounterCount() const { return bosses.size(); }
void InitializeCombatResurrections(uint8 charges = 1, uint32 interval = 0);
void AddCombatResurrectionCharge();
void UseCombatResurrection();
void ResetCombatResurrections();
uint8 GetCombatResurrectionCharges() const { return _combatResurrectionCharges; }
uint32 GetCombatResurrectionChargeInterval() const;
// Only used by areatriggers that inherit from OnlyOnceAreaTriggerScript
void MarkAreaTriggerDone(uint32 id) { _activatedAreaTriggers.insert(id); }
void ResetAreaTriggerDone(uint32 id) { _activatedAreaTriggers.erase(id); }
bool IsAreaTriggerDone(uint32 id) const { return _activatedAreaTriggers.find(id) != _activatedAreaTriggers.end(); }
void InitializeCombatResurrections(uint8 charges = 1, uint32 interval = 0);
void AddCombatResurrectionCharge();
void UseCombatResurrection();
void ResetCombatResurrections();
uint8 GetCombatResurrectionCharges() const { return _combatResurrectionCharges; }
uint32 GetCombatResurrectionChargeInterval() const;
protected:
void SetHeaders(std::string const& dataHeaders);
@@ -304,9 +309,10 @@ class TC_GAME_API InstanceScript : public ZoneScript
ObjectInfoMap _gameObjectInfo;
ObjectGuidMap _objectGuids;
uint32 completedEncounters; // completed encounter mask, bit indexes are DungeonEncounter.dbc boss numbers, used for packets
uint32 _combatResurrectionTimer;
uint8 _combatResurrectionCharges; // the counter for available battle resurrections
bool _combatResurrectionTimerStarted;
uint32 _combatResurrectionTimer;
uint8 _combatResurrectionCharges; // the counter for available battle resurrections
bool _combatResurrectionTimerStarted;
std::unordered_set<uint32> _activatedAreaTriggers;
#ifdef TRINITY_API_USE_DYNAMIC_LINKING
// Strong reference to the associated script module
+16
View File
@@ -2200,6 +2200,22 @@ AreaTriggerScript::AreaTriggerScript(const char* name)
ScriptRegistry<AreaTriggerScript>::Instance()->AddScript(this);
}
bool OnlyOnceAreaTriggerScript::OnTrigger(Player* player, AreaTriggerEntry const* trigger)
{
uint32 const triggerId = trigger->id;
if (InstanceScript* instance = player->GetInstanceScript())
{
if (instance->IsAreaTriggerDone(triggerId))
return true;
else
instance->MarkAreaTriggerDone(triggerId);
}
return _OnTrigger(player, trigger);
}
void OnlyOnceAreaTriggerScript::ResetAreaTriggerDone(InstanceScript* script, uint32 triggerId) { script->ResetAreaTriggerDone(triggerId); }
void OnlyOnceAreaTriggerScript::ResetAreaTriggerDone(Player const* player, AreaTriggerEntry const* trigger) { if (InstanceScript* instance = player->GetInstanceScript()) ResetAreaTriggerDone(instance, trigger->id); }
BattlegroundScript::BattlegroundScript(const char* name)
: ScriptObject(name)
{
+13
View File
@@ -442,6 +442,19 @@ class TC_GAME_API AreaTriggerScript : public ScriptObject
virtual bool OnTrigger(Player* /*player*/, AreaTriggerEntry const* /*trigger*/) { return false; }
};
class TC_GAME_API OnlyOnceAreaTriggerScript : public AreaTriggerScript
{
using AreaTriggerScript::AreaTriggerScript;
public:
bool OnTrigger(Player* /*player*/, AreaTriggerEntry const* /*trigger*/) override;
protected:
virtual bool _OnTrigger(Player* /*player*/, AreaTriggerEntry const* /*trigger*/) = 0;
void ResetAreaTriggerDone(InstanceScript* /*instance*/, uint32 /*triggerId*/);
void ResetAreaTriggerDone(Player const* /*player*/, AreaTriggerEntry const* /*trigger*/);
};
class TC_GAME_API BattlegroundScript : public ScriptObject
{
protected:
@@ -34,7 +34,8 @@ enum ANDataTypes
DATA_WATCHER_GASHRA,
DATA_WATCHER_SILTHIK,
DATA_ANUBARAK_WALL,
DATA_ANUBARAK_WALL_2
DATA_ANUBARAK_WALL_2,
DATA_GATEWATCHER_GREET
};
enum ANCreatureIds
@@ -130,7 +130,7 @@ class boss_krik_thir : public CreatureScript
struct boss_krik_thirAI : public BossAI
{
boss_krik_thirAI(Creature* creature) : BossAI(creature, DATA_KRIKTHIR), _hadGreet(false), _hadFrenzy(false), _petsInCombat(false), _watchersActive(0) { }
boss_krik_thirAI(Creature* creature) : BossAI(creature, DATA_KRIKTHIR), _hadFrenzy(false), _petsInCombat(false), _watchersActive(0) { }
void SummonAdds()
{
@@ -216,9 +216,9 @@ class boss_krik_thir : public CreatureScript
switch (action)
{
case -ACTION_GATEWATCHER_GREET:
if (!_hadGreet && me->IsAlive() && !me->IsInCombat() && !_petsInCombat)
if (!instance->GetData(DATA_GATEWATCHER_GREET) && me->IsAlive() && !me->IsInCombat() && !_petsInCombat)
{
_hadGreet = true;
instance->SetData(DATA_GATEWATCHER_GREET, 1);
Talk(SAY_PREFIGHT);
}
break;
@@ -311,7 +311,6 @@ class boss_krik_thir : public CreatureScript
}
private:
bool _hadGreet;
bool _hadFrenzy;
bool _petsInCombat;
uint8 _watchersActive;
@@ -67,6 +67,7 @@ class instance_azjol_nerub : public InstanceMapScript
LoadBossBoundaries(boundaries);
LoadDoorData(doorData);
LoadObjectData(creatureData, gameobjectData);
GateWatcherGreet = 0;
}
void OnUnitDeath(Unit* who) override
@@ -94,6 +95,32 @@ class instance_azjol_nerub : public InstanceMapScript
return true;
}
uint32 GetData(uint32 type) const override
{
switch (type)
{
case DATA_GATEWATCHER_GREET:
return GateWatcherGreet;
default:
return 0;
}
}
void SetData(uint32 type, uint32 data) override
{
switch (type)
{
case DATA_GATEWATCHER_GREET:
GateWatcherGreet = data;
break;
default:
break;
}
}
protected:
uint8 GateWatcherGreet;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
@@ -72,8 +72,7 @@ class boss_baltharus_the_warborn : public CreatureScript
struct boss_baltharus_the_warbornAI : public BossAI
{
boss_baltharus_the_warbornAI(Creature* creature) : BossAI(creature, DATA_BALTHARUS_THE_WARBORN),
_cloneCount(0), _introDone(false) { }
boss_baltharus_the_warbornAI(Creature* creature) : BossAI(creature, DATA_BALTHARUS_THE_WARBORN), _cloneCount(0) { }
void Reset() override
{
@@ -90,9 +89,6 @@ class boss_baltharus_the_warborn : public CreatureScript
switch (action)
{
case ACTION_INTRO_BALTHARUS:
if (_introDone)
return;
_introDone = true;
me->setActive(true);
events.ScheduleEvent(EVENT_INTRO_TALK, Seconds(7), 0, PHASE_INTRO);
break;
@@ -231,7 +227,6 @@ class boss_baltharus_the_warborn : public CreatureScript
private:
uint8 _cloneCount;
bool _introDone;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -150,12 +150,12 @@ class npc_xerestrasza : public CreatureScript
}
};
class at_baltharus_plateau : public AreaTriggerScript
class at_baltharus_plateau : public OnlyOnceAreaTriggerScript
{
public:
at_baltharus_plateau() : AreaTriggerScript("at_baltharus_plateau") { }
at_baltharus_plateau() : OnlyOnceAreaTriggerScript("at_baltharus_plateau") { }
bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
{
// Only trigger once
if (InstanceScript* instance = player->GetInstanceScript())
@@ -545,18 +545,18 @@ class spell_tyrannus_rimefang_icy_blast : public SpellScriptLoader
}
};
class at_tyrannus_event_starter : public AreaTriggerScript
class at_tyrannus_event_starter : public OnlyOnceAreaTriggerScript
{
public:
at_tyrannus_event_starter() : AreaTriggerScript("at_tyrannus_event_starter") { }
at_tyrannus_event_starter() : OnlyOnceAreaTriggerScript("at_tyrannus_event_starter") { }
bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/) override
bool _OnTrigger(Player* player, const AreaTriggerEntry * /*at*/) override
{
InstanceScript* instance = player->GetInstanceScript();
if (player->IsGameMaster() || !instance)
return false;
if (instance->GetBossState(DATA_TYRANNUS) != IN_PROGRESS && instance->GetBossState(DATA_TYRANNUS) != DONE)
if (instance->GetBossState(DATA_TYRANNUS) != DONE)
if (Creature* tyrannus = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_TYRANNUS)))
{
tyrannus->AI()->DoAction(ACTION_START_INTRO);
@@ -215,7 +215,7 @@ class boss_blood_council_controller : public CreatureScript
struct boss_blood_council_controllerAI : public BossAI
{
boss_blood_council_controllerAI(Creature* creature) : BossAI(creature, DATA_BLOOD_PRINCE_COUNCIL), _intro(true)
boss_blood_council_controllerAI(Creature* creature) : BossAI(creature, DATA_BLOOD_PRINCE_COUNCIL)
{
Initialize();
SetCombatMovement(false);
@@ -233,7 +233,7 @@ class boss_blood_council_controller : public CreatureScript
Initialize();
me->SummonCreatureGroup(SUMMON_PRINCES_GROUP);
if (!_intro)
if (!instance->GetData(DATA_BLOOD_PRINCE_COUNCIL_INTRO))
for (uint32 bossData : PrincesData)
if (Creature* prince = ObjectAccessor::GetCreature(*me, instance->GetGuidData(bossData)))
{
@@ -303,7 +303,7 @@ class boss_blood_council_controller : public CreatureScript
uint32 GetData(uint32 data) const override
{
if (data == DATA_INTRO && !_intro)
if (data == DATA_INTRO && !instance->GetData(DATA_BLOOD_PRINCE_COUNCIL_INTRO))
return DATA_INTRO_DONE;
return 0;
}
@@ -330,9 +330,9 @@ class boss_blood_council_controller : public CreatureScript
void DoAction(int32 actionId) override
{
if (actionId == ACTION_START_INTRO && _intro && instance->GetBossState(DATA_BLOOD_PRINCE_COUNCIL) != DONE)
if (actionId == ACTION_START_INTRO && instance->GetData(DATA_BLOOD_PRINCE_COUNCIL_INTRO) && instance->GetBossState(DATA_BLOOD_PRINCE_COUNCIL) != DONE)
{
_intro = false;
instance->SetData(DATA_BLOOD_PRINCE_COUNCIL_INTRO, 0);
if (Creature* bloodQueen = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_BLOOD_QUEEN_LANA_THEL_COUNCIL)))
bloodQueen->AI()->DoAction(ACTION_START_INTRO);
}
@@ -417,7 +417,6 @@ class boss_blood_council_controller : public CreatureScript
uint32 _invocationStage;
uint32 _resetCounter;
bool _intro;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -199,7 +199,7 @@ class boss_lady_deathwhisper : public CreatureScript
struct boss_lady_deathwhisperAI : public BossAI
{
boss_lady_deathwhisperAI(Creature* creature) : BossAI(creature, DATA_LADY_DEATHWHISPER),
_dominateMindCount(RAID_MODE<uint8>(0, 1, 1, 3)), _introDone(false)
_dominateMindCount(RAID_MODE<uint8>(0, 1, 1, 3))
{
Initialize();
}
@@ -233,43 +233,39 @@ class boss_lady_deathwhisper : public CreatureScript
if (action != ACTION_START_INTRO)
return;
if (!_introDone)
Talk(SAY_INTRO_1);
_phase = PHASE_INTRO;
scheduler.Schedule(Seconds(10), GROUP_INTRO, [this](TaskContext context)
{
_introDone = true;
Talk(SAY_INTRO_1);
_phase = PHASE_INTRO;
scheduler.Schedule(Seconds(10), GROUP_INTRO, [this](TaskContext context)
switch (context.GetRepeatCounter())
{
switch (context.GetRepeatCounter())
{
case 0:
Talk(SAY_INTRO_2);
context.Repeat(Seconds(21));
break;
case 1:
Talk(SAY_INTRO_3);
context.Repeat(Seconds(11));
break;
case 2:
Talk(SAY_INTRO_4);
context.Repeat(Seconds(9));
break;
case 3:
Talk(SAY_INTRO_5);
context.Repeat(Seconds(21));
break;
case 4:
Talk(SAY_INTRO_6);
context.Repeat(Seconds(10));
break;
case 5:
Talk(SAY_INTRO_7);
return;
default:
break;
}
});
}
case 0:
Talk(SAY_INTRO_2);
context.Repeat(Seconds(21));
break;
case 1:
Talk(SAY_INTRO_3);
context.Repeat(Seconds(11));
break;
case 2:
Talk(SAY_INTRO_4);
context.Repeat(Seconds(9));
break;
case 3:
Talk(SAY_INTRO_5);
context.Repeat(Seconds(21));
break;
case 4:
Talk(SAY_INTRO_6);
context.Repeat(Seconds(10));
break;
case 5:
Talk(SAY_INTRO_7);
return;
default:
break;
}
});
}
void AttackStart(Unit* victim) override
@@ -580,7 +576,6 @@ class boss_lady_deathwhisper : public CreatureScript
uint32 _waveCounter;
uint8 const _dominateMindCount;
uint8 _phase;
bool _introDone;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -1017,12 +1012,12 @@ class spell_deathwhisper_mana_barrier : public SpellScriptLoader
}
};
class at_lady_deathwhisper_entrance : public AreaTriggerScript
class at_lady_deathwhisper_entrance : public OnlyOnceAreaTriggerScript
{
public:
at_lady_deathwhisper_entrance() : AreaTriggerScript("at_lady_deathwhisper_entrance") { }
at_lady_deathwhisper_entrance() : OnlyOnceAreaTriggerScript("at_lady_deathwhisper_entrance") { }
bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
{
if (InstanceScript* instance = player->GetInstanceScript())
if (instance->GetBossState(DATA_LADY_DEATHWHISPER) != DONE)
@@ -135,7 +135,6 @@ class boss_lord_marrowgar : public CreatureScript
_boneStormDuration = RAID_MODE<uint32>(20000, 30000, 20000, 30000);
_baseSpeed = creature->GetSpeedRate(MOVE_RUN);
_coldflameLastPos.Relocate(creature);
_introDone = false;
_boneSlice = false;
}
@@ -150,7 +149,6 @@ class boss_lord_marrowgar : public CreatureScript
events.ScheduleEvent(EVENT_COLDFLAME, 5000, EVENT_GROUP_SPECIAL);
events.ScheduleEvent(EVENT_WARN_BONE_STORM, urand(45000, 50000));
events.ScheduleEvent(EVENT_ENRAGE, 600000);
_introDone = false;
_boneSlice = false;
_boneSpikeImmune.clear();
}
@@ -328,11 +326,7 @@ class boss_lord_marrowgar : public CreatureScript
_boneSpikeImmune.clear();
break;
case ACTION_TALK_ENTER_ZONE:
if (!_introDone)
{
Talk(SAY_ENTER_ZONE);
_introDone = true;
}
break;
default:
break;
@@ -345,7 +339,6 @@ class boss_lord_marrowgar : public CreatureScript
ObjectGuid _coldflameTarget;
uint32 _boneStormDuration;
float _baseSpeed;
bool _introDone;
bool _boneSlice;
};
@@ -760,12 +753,12 @@ class spell_marrowgar_bone_slice : public SpellScriptLoader
}
};
class at_lord_marrowgar_entrance : public AreaTriggerScript
class at_lord_marrowgar_entrance : public OnlyOnceAreaTriggerScript
{
public:
at_lord_marrowgar_entrance() : AreaTriggerScript("at_lord_marrowgar_entrance") { }
at_lord_marrowgar_entrance() : OnlyOnceAreaTriggerScript("at_lord_marrowgar_entrance") { }
bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
{
if (InstanceScript* instance = player->GetInstanceScript())
if (Creature* lordMarrowgar = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_LORD_MARROWGAR)))
@@ -219,7 +219,7 @@ class boss_sindragosa : public CreatureScript
struct boss_sindragosaAI : public BossAI
{
boss_sindragosaAI(Creature* creature) : BossAI(creature, DATA_SINDRAGOSA), _summoned(false)
boss_sindragosaAI(Creature* creature) : BossAI(creature, DATA_SINDRAGOSA)
{
Initialize();
}
@@ -244,7 +244,7 @@ class boss_sindragosa : public CreatureScript
events.ScheduleEvent(EVENT_AIR_PHASE, 50000);
Initialize();
if (!_summoned)
if (instance->GetData(DATA_SINDRAGOSA_INTRO))
{
me->SetCanFly(true);
me->SetDisableGravity(true);
@@ -304,10 +304,8 @@ class boss_sindragosa : public CreatureScript
{
if (action == ACTION_START_FROSTWYRM)
{
if (_summoned)
return;
_summoned = true;
instance->SetData(DATA_SINDRAGOSA_INTRO, 0);
if (TempSummon* summon = me->ToTempSummon())
summon->SetTempSummonType(TEMPSUMMON_DEAD_DESPAWN);
@@ -558,7 +556,6 @@ class boss_sindragosa : public CreatureScript
uint8 _mysticBuffetStack;
bool _isInAirPhase;
bool _isThirdPhase;
bool _summoned;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -1624,12 +1621,12 @@ public:
}
};
class at_sindragosa_lair : public AreaTriggerScript
class at_sindragosa_lair : public OnlyOnceAreaTriggerScript
{
public:
at_sindragosa_lair() : AreaTriggerScript("at_sindragosa_lair") { }
at_sindragosa_lair() : OnlyOnceAreaTriggerScript("at_sindragosa_lair") { }
bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
{
if (InstanceScript* instance = player->GetInstanceScript())
{
@@ -116,7 +116,9 @@ enum ICDataTypes
DATA_TERENAS_MENETHIL = 39,
DATA_ENEMY_GUNSHIP = 40,
DATA_UPPERSPIRE_TELE_ACT = 41, /// also used by conditions
DATA_BLOOD_QUEEN_LANA_THEL_COUNCIL = 42
DATA_BLOOD_QUEEN_LANA_THEL_COUNCIL = 42,
DATA_BLOOD_PRINCE_COUNCIL_INTRO = 43,
DATA_SINDRAGOSA_INTRO = 44
};
enum ICCreaturesIds
@@ -145,6 +145,8 @@ class instance_icecrown_citadel : public InstanceMapScript
UpperSpireTeleporterActiveState = NOT_STARTED;
BloodQuickeningState = NOT_STARTED;
BloodQuickeningMinutes = 0;
BloodPrinceIntro = 1;
SindragosaIntro = 1;
}
// A function to help reduce the number of lines for teleporter management.
@@ -730,6 +732,10 @@ class instance_icecrown_citadel : public InstanceMapScript
return BloodQuickeningState;
case DATA_HEROIC_ATTEMPTS:
return HeroicAttempts;
case DATA_BLOOD_PRINCE_COUNCIL_INTRO:
return BloodPrinceIntro;
case DATA_SINDRAGOSA_INTRO:
return SindragosaIntro;
default:
break;
}
@@ -1104,6 +1110,12 @@ class instance_icecrown_citadel : public InstanceMapScript
SaveToDB();
}
break;
case DATA_BLOOD_PRINCE_COUNCIL_INTRO:
BloodPrinceIntro = data;
break;
case DATA_SINDRAGOSA_INTRO:
SindragosaIntro = data;
break;
default:
break;
}
@@ -1518,6 +1530,8 @@ class instance_icecrown_citadel : public InstanceMapScript
uint32 BloodQuickeningState;
uint32 HeroicAttempts;
uint16 BloodQuickeningMinutes;
uint8 BloodPrinceIntro;
uint8 SindragosaIntro;
bool IsBonedEligible;
bool IsOozeDanceEligible;
bool IsNauseaEligible;
@@ -237,20 +237,19 @@ public:
};
class at_anubrekhan_entrance : public AreaTriggerScript
class at_anubrekhan_entrance : public OnlyOnceAreaTriggerScript
{
public:
at_anubrekhan_entrance() : AreaTriggerScript("at_anubrekhan_entrance") { }
at_anubrekhan_entrance() : OnlyOnceAreaTriggerScript("at_anubrekhan_entrance") { }
bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
{
InstanceScript* instance = player->GetInstanceScript();
if (!instance || instance->GetData(DATA_HAD_ANUBREKHAN_GREET) || instance->GetBossState(BOSS_ANUBREKHAN) != NOT_STARTED)
if (!instance || instance->GetBossState(BOSS_ANUBREKHAN) != NOT_STARTED)
return true;
if (Creature* anub = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_ANUBREKHAN)))
anub->AI()->Talk(SAY_GREET);
instance->SetData(DATA_HAD_ANUBREKHAN_GREET, 1u);
return true;
}
@@ -259,20 +259,19 @@ class achievement_momma_said_knock_you_out : public AchievementCriteriaScript
}
};
class at_faerlina_entrance : public AreaTriggerScript
class at_faerlina_entrance : public OnlyOnceAreaTriggerScript
{
public:
at_faerlina_entrance() : AreaTriggerScript("at_faerlina_entrance") { }
at_faerlina_entrance() : OnlyOnceAreaTriggerScript("at_faerlina_entrance") { }
bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
{
InstanceScript* instance = player->GetInstanceScript();
if (!instance || instance->GetData(DATA_HAD_FAERLINA_GREET) || instance->GetBossState(BOSS_FAERLINA) != NOT_STARTED)
if (!instance || instance->GetBossState(BOSS_FAERLINA) != NOT_STARTED)
return true;
if (Creature* faerlina = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_FAERLINA)))
faerlina->AI()->Talk(SAY_GREET);
instance->SetData(DATA_HAD_FAERLINA_GREET, 1u);
return true;
}
@@ -1270,20 +1270,19 @@ class spell_thaddius_magnetic_pull : public SpellScriptLoader
}
};
class at_thaddius_entrance : public AreaTriggerScript
class at_thaddius_entrance : public OnlyOnceAreaTriggerScript
{
public:
at_thaddius_entrance() : AreaTriggerScript("at_thaddius_entrance") { }
at_thaddius_entrance() : OnlyOnceAreaTriggerScript("at_thaddius_entrance") { }
bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
{
InstanceScript* instance = player->GetInstanceScript();
if (!instance || instance->GetData(DATA_HAD_THADDIUS_GREET) || instance->GetBossState(BOSS_THADDIUS) == DONE)
if (!instance || instance->GetBossState(BOSS_THADDIUS) == DONE)
return true;
if (Creature* thaddius = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_THADDIUS)))
thaddius->AI()->Talk(SAY_GREET);
instance->SetData(DATA_HAD_THADDIUS_GREET, 1u);
return true;
}
@@ -116,9 +116,6 @@ class instance_naxxramas : public InstanceMapScript
LoadDoorData(doorData);
LoadObjectData(nullptr, objectData);
hadAnubRekhanGreet = false;
hadFaerlinaGreet = false;
hadThaddiusGreet = false;
hadSapphironBirth = false;
CurrentWingTaunt = SAY_KELTHUZAD_FIRST_WING_TAUNT;
@@ -274,15 +271,6 @@ class instance_naxxramas : public InstanceMapScript
if (GameObject* gate = instance->GetGameObject(GothikGateGUID))
gate->SetGoState(GOState(value));
break;
case DATA_HAD_ANUBREKHAN_GREET:
hadAnubRekhanGreet = (value == 1u);
break;
case DATA_HAD_FAERLINA_GREET:
hadFaerlinaGreet = (value == 1u);
break;
case DATA_HAD_THADDIUS_GREET:
hadThaddiusGreet = (value == 1u);
break;
case DATA_HAD_SAPPHIRON_BIRTH:
hadSapphironBirth = (value == 1u);
break;
@@ -295,12 +283,6 @@ class instance_naxxramas : public InstanceMapScript
{
switch (id)
{
case DATA_HAD_ANUBREKHAN_GREET:
return hadAnubRekhanGreet ? 1u : 0u;
case DATA_HAD_FAERLINA_GREET:
return hadFaerlinaGreet ? 1u : 0u;
case DATA_HAD_THADDIUS_GREET:
return hadThaddiusGreet ? 1u : 0u;
case DATA_HAD_SAPPHIRON_BIRTH:
return hadSapphironBirth ? 1u : 0u;
default:
@@ -620,9 +602,6 @@ class instance_naxxramas : public InstanceMapScript
ObjectGuid PortalsGUID[4];
ObjectGuid KelthuzadDoorGUID;
ObjectGuid LichKingGUID;
bool hadAnubRekhanGreet;
bool hadFaerlinaGreet;
bool hadThaddiusGreet;
bool hadSapphironBirth;
uint8 CurrentWingTaunt;
@@ -44,9 +44,6 @@ enum NAXEncounter
enum NAXData
{
DATA_GOTHIK_GATE,
DATA_HAD_ANUBREKHAN_GREET,
DATA_HAD_FAERLINA_GREET,
DATA_HAD_THADDIUS_GREET,
DATA_HAD_SAPPHIRON_BIRTH,
DATA_HORSEMEN_CHECK_ACHIEVEMENT_CREDIT,
@@ -38,25 +38,22 @@ enum BTDataTypes
// Additional Data
DATA_AKAMA_SHADE = 9,
DATA_AKAMA = 10,
DATA_MAIEV = 11,
DATA_GO_ILLIDAN_GATE = 12,
DATA_BLACK_TEMPLE_TRIGGER = 13,
DATA_GATHIOS_THE_SHATTERER = 14,
DATA_HIGH_NETHERMANCER_ZEREVOR = 15,
DATA_LADY_MALANDE = 16,
DATA_VERAS_DARKSHADOW = 17,
DATA_BLOOD_ELF_COUNCIL_VOICE = 18,
DATA_GO_DEN_OF_MORTAL_DOOR = 19,
DATA_ESSENCE_OF_SUFFERING = 20,
DATA_ESSENCE_OF_DESIRE = 21,
DATA_ESSENCE_OF_ANGER = 22,
DATA_ILLIDAN_MUSIC_CONTROLLER = 23,
DATA_TERON_GOREFIEND_INTRO = 24,
DATA_AKAMA_ILLIDAN_INTRO = 25
};
enum TriggerEmotes
@@ -449,7 +449,7 @@ public:
struct boss_illidan_stormrageAI : public BossAI
{
boss_illidan_stormrageAI(Creature* creature) : BossAI(creature, DATA_ILLIDAN_STORMRAGE),
_intro(true), _minionsCount(0), _flameCount(0), _orientation(0.0f), _pillarIndex(0), _phase(0), _dead(false), _isDemon(false) { }
_minionsCount(0), _flameCount(0), _orientation(0.0f), _pillarIndex(0), _phase(0), _dead(false), _isDemon(false) { }
void Reset() override
{
@@ -465,7 +465,7 @@ public:
_flameCount = 0;
_phase = PHASE_1;
_isDemon = false;
if (_intro && instance->GetBossState(DATA_ILLIDARI_COUNCIL) == DONE)
if (instance->GetData(DATA_AKAMA_ILLIDAN_INTRO) && instance->GetBossState(DATA_ILLIDARI_COUNCIL) == DONE)
if (Creature* akama = instance->GetCreature(DATA_AKAMA))
akama->AI()->DoAction(ACTION_ACTIVE_AKAMA_INTRO);
}
@@ -566,7 +566,7 @@ public:
akama->AI()->DoAction(ACTION_FREE);
break;
case ACTION_INTRO_DONE:
_intro = false;
instance->SetData(DATA_AKAMA_ILLIDAN_INTRO, 0);
break;
case ACTION_START_MINIONS:
Talk(SAY_ILLIDAN_MINION);
@@ -1021,7 +1021,6 @@ public:
}
private:
bool _intro;
uint8 _minionsCount;
uint8 _flameCount;
float _orientation;
@@ -112,10 +112,16 @@ public:
struct boss_teron_gorefiendAI : public BossAI
{
boss_teron_gorefiendAI(Creature* creature) : BossAI(creature, DATA_TERON_GOREFIEND), _intro(false)
boss_teron_gorefiendAI(Creature* creature) : BossAI(creature, DATA_TERON_GOREFIEND) { }
void Reset() override
{
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
creature->SetReactState(REACT_PASSIVE);
_Reset();
if (instance->GetData(DATA_TERON_GOREFIEND_INTRO))
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_PASSIVE);
}
}
void EnterCombat(Unit* /*who*/) override
@@ -139,9 +145,9 @@ public:
void DoAction(int32 action) override
{
if (action == ACTION_START_INTRO && !_intro && me->IsAlive())
if (action == ACTION_START_INTRO && me->IsAlive())
{
_intro = true;
instance->SetData(DATA_TERON_GOREFIEND_INTRO, 0);
Talk(SAY_INTRO);
events.SetPhase(PHASE_INTRO);
events.ScheduleEvent(EVENT_FINISH_INTRO, Seconds(20));
@@ -213,9 +219,6 @@ public:
DoMeleeAttackIfReady();
}
private:
bool _intro;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -361,12 +364,12 @@ public:
}
};
class at_teron_gorefiend_entrance : public AreaTriggerScript
class at_teron_gorefiend_entrance : public OnlyOnceAreaTriggerScript
{
public:
at_teron_gorefiend_entrance() : AreaTriggerScript("at_teron_gorefiend_entrance") { }
at_teron_gorefiend_entrance() : OnlyOnceAreaTriggerScript("at_teron_gorefiend_entrance") { }
bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
{
if (InstanceScript* instance = player->GetInstanceScript())
if (Creature* teron = instance->GetCreature(DATA_TERON_GOREFIEND))
@@ -96,7 +96,9 @@ class instance_black_temple : public InstanceMapScript
LoadDoorData(doorData);
LoadObjectData(creatureData, gameObjectData);
LoadBossBoundaries(boundaries);
akamaState = AKAMA_INTRO;
AkamaState = AKAMA_INTRO;
TeronGorefiendIntro = 1;
AkamaIllidanIntro = 1;
}
void OnGameObjectCreate(GameObject* go) override
@@ -121,7 +123,7 @@ class instance_black_temple : public InstanceMapScript
case NPC_ASHTONGUE_STORMCALLER:
case NPC_ASHTONGUE_FERAL_SPIRIT:
case NPC_STORM_FURY:
AshtongueGUIDs.emplace_back(creature->GetGUID());
AshtongueGUIDs.push_back(creature->GetGUID());
if (GetBossState(DATA_SHADE_OF_AKAMA) == DONE)
creature->SetFaction(FACTION_ASHTONGUE_DEATHSWORN);
break;
@@ -130,25 +132,37 @@ class instance_black_temple : public InstanceMapScript
}
}
uint32 GetData(uint32 data) const override
uint32 GetData(uint32 type) const override
{
if (data == DATA_AKAMA)
return akamaState;
return 0;
}
void SetData(uint32 data, uint32 value) override
{
switch (data)
switch (type)
{
case DATA_AKAMA:
akamaState = value;
return AkamaState;
case DATA_TERON_GOREFIEND_INTRO:
return TeronGorefiendIntro;
case DATA_AKAMA_ILLIDAN_INTRO:
return AkamaIllidanIntro;
default:
return 0;
}
}
void SetData(uint32 type, uint32 data) override
{
switch (type)
{
case DATA_AKAMA:
AkamaState = data;
break;
case ACTION_OPEN_DOOR:
if (GameObject* illidanGate = GetGameObject(DATA_GO_ILLIDAN_GATE))
HandleGameObject(ObjectGuid::Empty, true, illidanGate);
break;
case DATA_TERON_GOREFIEND_INTRO:
TeronGorefiendIntro = data;
break;
case DATA_AKAMA_ILLIDAN_INTRO:
AkamaIllidanIntro = data;
default:
break;
}
@@ -206,7 +220,9 @@ class instance_black_temple : public InstanceMapScript
protected:
GuidVector AshtongueGUIDs;
uint8 akamaState;
uint8 AkamaState;
uint8 TeronGorefiendIntro;
uint8 AkamaIllidanIntro;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override