diff options
author | Treeston <treeston.mmoc@gmail.com> | 2017-09-15 03:53:02 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2020-08-29 00:41:22 +0200 |
commit | fe938b99f843df3f6c120695db38f327bd55ea94 (patch) | |
tree | b6e47409a22c4262ac6657272842c1205f986f0c /src | |
parent | 77d13a7b97d4b9d243ce753ca02ae94d9e10b17e (diff) |
Core/Scripts: Implemented OnlyOnceAreaTriggerScript (#20288)
(cherry picked from commit 971ed856a49dc56ea33d9a0779b1386eea5cd3ca)
Diffstat (limited to 'src')
26 files changed, 210 insertions, 165 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 696d8a05555..dd2fb6486f5 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -967,7 +967,7 @@ bool WorldObject::IsInWorldPvpZone() const } } -InstanceScript* WorldObject::GetInstanceScript() +InstanceScript* WorldObject::GetInstanceScript() const { Map* map = GetMap(); return map->IsDungeon() ? ((InstanceMap*)map)->GetInstanceScript() : nullptr; diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 865d4095bff..9ba475fce44 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -425,7 +425,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation void GetZoneAndAreaId(uint32& zoneid, uint32& areaid) const { zoneid = m_zoneId, areaid = m_areaId; } bool IsInWorldPvpZone() const; - InstanceScript* GetInstanceScript(); + InstanceScript* GetInstanceScript() const; std::string const& GetName() const { return m_name; } void SetName(std::string newname) { m_name = std::move(newname); } diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index 06324f553a9..823996f2481 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -266,6 +266,11 @@ class TC_GAME_API InstanceScript : public ZoneScript // Get's the current entrance id uint32 GetEntranceLocation() const { return _temporaryEntranceId ? _temporaryEntranceId : _entranceId; } + // 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 SendEncounterUnit(uint32 type, Unit* unit = nullptr, uint8 priority = 0); void SendEncounterStart(uint32 inCombatResCount = 0, uint32 maxInCombatResCount = 0, uint32 inCombatResChargeRecovery = 0, uint32 nextCombatResChargeTime = 0); void SendEncounterEnd(); @@ -333,6 +338,7 @@ class TC_GAME_API InstanceScript : public ZoneScript ObjectGuidMap _objectGuids; uint32 completedEncounters; // completed encounter mask, bit indexes are DungeonEncounter.dbc boss numbers, used for packets std::vector<InstanceSpawnGroupInfo> const* const _instanceSpawnGroups; + std::unordered_set<uint32> _activatedAreaTriggers; uint32 _entranceId; uint32 _temporaryEntranceId; uint32 _combatResurrectionTimer; diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index f6f26e457f2..b70994a3ed2 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -26,6 +26,7 @@ #include "Errors.h" #include "GameObject.h" #include "GossipDef.h" +#include "InstanceScript.h" #include "Item.h" #include "LFGScripts.h" #include "Log.h" @@ -2353,7 +2354,22 @@ AreaTriggerScript::AreaTriggerScript(const char* name) ScriptRegistry<AreaTriggerScript>::Instance()->AddScript(this); } -BattlegroundScript::BattlegroundScript(const char* name) +bool OnlyOnceAreaTriggerScript::OnTrigger(Player* player, AreaTriggerEntry const* trigger, bool entered) +{ + uint32 const triggerId = trigger->ID; + if (InstanceScript* instance = player->GetInstanceScript()) + { + if (instance->IsAreaTriggerDone(triggerId)) + return true; + else + instance->MarkAreaTriggerDone(triggerId); + } + return _OnTrigger(player, trigger, entered); +} +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(char const* name) : ScriptObject(name) { ScriptRegistry<BattlegroundScript>::Instance()->AddScript(this); diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 79925f338ce..375b75264b2 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -451,6 +451,19 @@ class TC_GAME_API AreaTriggerScript : public ScriptObject virtual bool OnTrigger(Player* /*player*/, AreaTriggerEntry const* /*trigger*/, bool /*entered*/) { return false; } }; +class TC_GAME_API OnlyOnceAreaTriggerScript : public AreaTriggerScript +{ + using AreaTriggerScript::AreaTriggerScript; + + public: + bool OnTrigger(Player* player, AreaTriggerEntry const* trigger, bool entered) override; + + protected: + virtual bool _OnTrigger(Player* player, AreaTriggerEntry const* trigger, bool entered) = 0; + void ResetAreaTriggerDone(InstanceScript* instance, uint32 triggerId); + void ResetAreaTriggerDone(Player const* player, AreaTriggerEntry const* trigger); +}; + class TC_GAME_API BattlegroundScript : public ScriptObject { protected: diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h index d886437ca47..732fa3aac64 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h @@ -37,7 +37,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 diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp index 326ded1713b..7c3eb46d99a 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp @@ -132,7 +132,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() { @@ -212,9 +212,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; @@ -307,7 +307,6 @@ class boss_krik_thir : public CreatureScript } private: - bool _hadGreet; bool _hadFrenzy; bool _petsInCombat; uint8 _watchersActive; diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp index bcb4ee87547..e5b49d744e2 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp @@ -70,6 +70,7 @@ class instance_azjol_nerub : public InstanceMapScript LoadBossBoundaries(boundaries); LoadDoorData(doorData); LoadObjectData(creatureData, gameobjectData); + GateWatcherGreet = 0; } void OnUnitDeath(Unit* who) override @@ -97,6 +98,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 diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp index 1440f800260..2c8a9075d6c 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp @@ -74,8 +74,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 { @@ -92,9 +91,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; @@ -233,7 +229,6 @@ class boss_baltharus_the_warborn : public CreatureScript private: uint8 _cloneCount; - bool _introDone; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp index 69bf1e645e3..d1fc9f9bbec 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp @@ -153,12 +153,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*/, bool /*entered*/) override + bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/, bool /*entered*/) override { // Only trigger once if (InstanceScript* instance = player->GetInstanceScript()) diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp index 85247eef42d..e21e57e524b 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp @@ -547,18 +547,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* /*areaTrigger*/, bool /*entered*/) override + bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/, bool /*entered*/) 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); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index 1ef1018a447..1c3728d0d06 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -222,7 +222,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); @@ -240,7 +240,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))) { @@ -311,7 +311,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; } @@ -338,9 +338,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); } @@ -425,7 +425,6 @@ class boss_blood_council_controller : public CreatureScript uint32 _invocationStage; uint32 _resetCounter; - bool _intro; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index 75990d02c92..51422aefc9b 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -203,7 +203,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(); } @@ -237,43 +237,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 @@ -585,7 +581,6 @@ class boss_lady_deathwhisper : public CreatureScript uint32 _waveCounter; uint8 const _dominateMindCount; uint8 _phase; - bool _introDone; }; CreatureAI* GetAI(Creature* creature) const override @@ -1022,12 +1017,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*/, bool /*entered*/) override + bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/, bool /*entered*/) override { if (InstanceScript* instance = player->GetInstanceScript()) if (instance->GetBossState(DATA_LADY_DEATHWHISPER) != DONE) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index c432352bdea..80d826d9211 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -139,7 +139,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; } @@ -154,7 +153,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(); } @@ -332,11 +330,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; @@ -349,7 +343,6 @@ class boss_lord_marrowgar : public CreatureScript ObjectGuid _coldflameTarget; uint32 _boneStormDuration; float _baseSpeed; - bool _introDone; bool _boneSlice; }; @@ -761,12 +754,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*/, bool /*entered*/) override + bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/, bool /*entered*/) override { if (InstanceScript* instance = player->GetInstanceScript()) if (Creature* lordMarrowgar = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_LORD_MARROWGAR))) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index 928a94e4694..b33cc623d91 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -229,7 +229,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(); } @@ -254,7 +254,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); @@ -314,10 +314,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); @@ -567,7 +565,6 @@ class boss_sindragosa : public CreatureScript uint8 _mysticBuffetStack; bool _isInAirPhase; bool _isThirdPhase; - bool _summoned; }; CreatureAI* GetAI(Creature* creature) const override @@ -1620,12 +1617,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*/, bool /*entered*/) override + bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/, bool /*entered*/) override { if (InstanceScript* instance = player->GetInstanceScript()) { diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h index 8fff8922983..b019ecb8640 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h @@ -120,7 +120,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 diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 53785f1f064..0a11d6e7830 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -149,6 +149,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. @@ -734,6 +736,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; } @@ -1099,6 +1105,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; } @@ -1529,6 +1541,8 @@ class instance_icecrown_citadel : public InstanceMapScript uint32 BloodQuickeningState; uint32 HeroicAttempts; uint16 BloodQuickeningMinutes; + uint8 BloodPrinceIntro; + uint8 SindragosaIntro; bool IsBonedEligible; bool IsOozeDanceEligible; bool IsNauseaEligible; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp index bf5e30de4de..b6783166857 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp @@ -238,20 +238,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*/, bool /*entered*/) override + bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/, bool /*entered*/) 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; } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp index 7f0a5cdc6ed..8e3dbb5a271 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp @@ -261,20 +261,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*/, bool /*entered*/) override + bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/, bool /*entered*/) 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; } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp index 33b48c08c9c..39461928c99 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp @@ -1224,20 +1224,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*/, bool /*entered*/) override + bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/, bool /*entered*/) 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; } diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp index 0244f7539a5..9c7ae6063a5 100644 --- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp +++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp @@ -123,9 +123,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; @@ -281,15 +278,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; @@ -302,12 +290,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: @@ -625,9 +607,6 @@ class instance_naxxramas : public InstanceMapScript ObjectGuid PortalsGUID[4]; ObjectGuid KelthuzadDoorGUID; ObjectGuid LichKingGUID; - bool hadAnubRekhanGreet; - bool hadFaerlinaGreet; - bool hadThaddiusGreet; bool hadSapphironBirth; uint8 CurrentWingTaunt; diff --git a/src/server/scripts/Northrend/Naxxramas/naxxramas.h b/src/server/scripts/Northrend/Naxxramas/naxxramas.h index c9f0dcaa3fc..82f148af184 100644 --- a/src/server/scripts/Northrend/Naxxramas/naxxramas.h +++ b/src/server/scripts/Northrend/Naxxramas/naxxramas.h @@ -47,9 +47,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, diff --git a/src/server/scripts/Outland/BlackTemple/black_temple.h b/src/server/scripts/Outland/BlackTemple/black_temple.h index 42a6c0457d8..6e93e0c63c0 100644 --- a/src/server/scripts/Outland/BlackTemple/black_temple.h +++ b/src/server/scripts/Outland/BlackTemple/black_temple.h @@ -40,25 +40,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 diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index befa2fa0164..9de5e595a1e 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -454,7 +454,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 { @@ -470,7 +470,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); } @@ -568,7 +568,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); @@ -1023,7 +1023,6 @@ public: } private: - bool _intro; uint8 _minionsCount; uint8 _flameCount; float _orientation; diff --git a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp index bdbc067ae92..76323235cdf 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp @@ -115,10 +115,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->AddUnitFlag(UnitFlags(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE)); - creature->SetReactState(REACT_PASSIVE); + _Reset(); + if (instance->GetData(DATA_TERON_GOREFIEND_INTRO)) + { + me->AddUnitFlag(UnitFlags(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE)); + me->SetReactState(REACT_PASSIVE); + } } void EnterCombat(Unit* /*who*/) override @@ -142,9 +148,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)); @@ -216,9 +222,6 @@ public: DoMeleeAttackIfReady(); } - - private: - bool _intro; }; CreatureAI* GetAI(Creature* creature) const override @@ -365,12 +368,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*/, bool entered) override + bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/, bool entered) override { if (!entered) return true; diff --git a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp index bc2c071f7c3..51983b77e20 100644 --- a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp +++ b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp @@ -101,7 +101,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 @@ -126,7 +128,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; @@ -135,27 +137,39 @@ 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; + switch (type) + { + case DATA_AKAMA: + return AkamaState; + case DATA_TERON_GOREFIEND_INTRO: + return TeronGorefiendIntro; + case DATA_AKAMA_ILLIDAN_INTRO: + return AkamaIllidanIntro; + default: + return 0; + } } - void SetData(uint32 data, uint32 value) override + void SetData(uint32 type, uint32 data) override { - switch (data) + switch (type) { - case DATA_AKAMA: - akamaState = value; - break; - case ACTION_OPEN_DOOR: - if (GameObject* illidanGate = GetGameObject(DATA_GO_ILLIDAN_GATE)) - HandleGameObject(ObjectGuid::Empty, true, illidanGate); - break; - default: - break; + 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; } } @@ -211,7 +225,9 @@ class instance_black_temple : public InstanceMapScript protected: GuidVector AshtongueGUIDs; - uint8 akamaState; + uint8 AkamaState; + uint8 TeronGorefiendIntro; + uint8 AkamaIllidanIntro; }; InstanceScript* GetInstanceScript(InstanceMap* map) const override |