mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-19 08:55:32 +01:00
Core/Scripts: Implemented OnlyOnceAreaTriggerScript (#20288)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -71,6 +71,7 @@ class instance_azjol_nerub : public InstanceMapScript
|
||||
LoadBossBoundaries(boundaries);
|
||||
LoadDoorData(doorData);
|
||||
LoadObjectData(creatureData, gameobjectData);
|
||||
GateWatcherGreet = 0;
|
||||
}
|
||||
|
||||
void OnUnitDeath(Unit* who) override
|
||||
@@ -98,6 +99,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
|
||||
|
||||
@@ -73,8 +73,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
|
||||
{
|
||||
@@ -91,9 +90,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;
|
||||
@@ -232,7 +228,6 @@ class boss_baltharus_the_warborn : public CreatureScript
|
||||
|
||||
private:
|
||||
uint8 _cloneCount;
|
||||
bool _introDone;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
|
||||
@@ -152,12 +152,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())
|
||||
|
||||
@@ -539,18 +539,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, AreaTriggerEntry const* /*at*/) override
|
||||
bool _OnTrigger(Player* player, AreaTriggerEntry const* /*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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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*/) override
|
||||
bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
|
||||
{
|
||||
if (InstanceScript* instance = player->GetInstanceScript())
|
||||
if (instance->GetBossState(DATA_LADY_DEATHWHISPER) != DONE)
|
||||
|
||||
@@ -140,7 +140,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;
|
||||
}
|
||||
|
||||
@@ -155,7 +154,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();
|
||||
}
|
||||
@@ -333,11 +331,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;
|
||||
@@ -350,7 +344,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*/) 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)))
|
||||
|
||||
@@ -226,7 +226,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();
|
||||
}
|
||||
@@ -251,7 +251,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);
|
||||
@@ -311,10 +311,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);
|
||||
|
||||
@@ -565,7 +563,6 @@ class boss_sindragosa : public CreatureScript
|
||||
uint8 _mysticBuffetStack;
|
||||
bool _isInAirPhase;
|
||||
bool _isThirdPhase;
|
||||
bool _summoned;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
@@ -1616,12 +1613,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())
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -147,6 +147,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.
|
||||
@@ -739,6 +741,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;
|
||||
}
|
||||
@@ -1116,6 +1122,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;
|
||||
}
|
||||
@@ -1530,6 +1542,8 @@ class instance_icecrown_citadel : public InstanceMapScript
|
||||
uint32 BloodQuickeningState;
|
||||
uint32 HeroicAttempts;
|
||||
uint16 BloodQuickeningMinutes;
|
||||
uint8 BloodPrinceIntro;
|
||||
uint8 SindragosaIntro;
|
||||
bool IsBonedEligible;
|
||||
bool IsOozeDanceEligible;
|
||||
bool IsNauseaEligible;
|
||||
|
||||
@@ -239,20 +239,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;
|
||||
}
|
||||
|
||||
@@ -260,20 +260,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;
|
||||
}
|
||||
|
||||
@@ -1225,20 +1225,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;
|
||||
}
|
||||
|
||||
@@ -121,9 +121,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;
|
||||
|
||||
@@ -279,15 +276,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;
|
||||
@@ -300,12 +288,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;
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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->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
|
||||
@@ -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
|
||||
@@ -364,12 +367,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))
|
||||
|
||||
@@ -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,25 +137,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;
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user