refactor(Scripts/BlackMorass): Move the Rift handling to the creature… (#15316)

This commit is contained in:
Skjalf
2023-03-10 14:32:18 -03:00
committed by GitHub
parent bda4394cee
commit 67d02d4f1e
4 changed files with 52 additions and 71 deletions

View File

@@ -55,6 +55,8 @@ struct boss_aeonus : public BossAI
{
Talk(SAY_ENTER);
me->SetReactState(REACT_DEFENSIVE);
if (Creature* medivh = instance->GetCreature(DATA_MEDIVH))
{
me->SetHomePosition(medivh->GetPositionX() + 14.0f * cos(medivh->GetAngle(me)), medivh->GetPositionY() + 14.0f * std::sin(medivh->GetAngle(me)), medivh->GetPositionZ(), me->GetAngle(medivh));

View File

@@ -171,13 +171,7 @@ public:
DoUpdateWorldState(WORLD_STATE_BM_RIFT, ++_currentRift);
if (Creature* rift = instance->SummonCreature(NPC_TIME_RIFT, spawnPos))
{
_scheduler.Schedule(6s, [this, rift](TaskContext)
{
SummonPortalKeeper(rift);
});
}
instance->SummonCreature(NPC_TIME_RIFT, spawnPos);
// Here we check if we have available rift spots.
if (_currentRift < 18)
@@ -400,51 +394,6 @@ public:
return 0;
}
void SummonPortalKeeper(Creature* rift)
{
if (!rift)
{
return;
}
int32 entry = 0;
switch (_currentRift)
{
case 6:
entry = GetBossState(DATA_CHRONO_LORD_DEJA) == DONE ? (instance->IsHeroic() ? NPC_INFINITE_CHRONO_LORD : -NPC_CHRONO_LORD_DEJA) : NPC_CHRONO_LORD_DEJA;
break;
case 12:
entry = GetBossState(DATA_TEMPORUS) == DONE ? (instance->IsHeroic() ? NPC_INFINITE_TIMEREAVER : -NPC_TEMPORUS) : NPC_TEMPORUS;
break;
case 18:
entry = NPC_AEONUS;
break;
default:
entry = RAND(NPC_RIFT_KEEPER_WARLOCK, NPC_RIFT_KEEPER_MAGE, NPC_RIFT_LORD, NPC_RIFT_LORD_2);
break;
}
Position pos = rift->GetNearPosition(10.0f, 2 * M_PI * rand_norm());
if (Creature* summon = rift->SummonCreature(std::abs(entry), pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3 * MINUTE * IN_MILLISECONDS))
{
if (entry < 0)
{
summon->SetLootMode(0);
}
if (summon->GetEntry() != NPC_AEONUS)
{
rift->CastSpell(summon, SPELL_RIFT_CHANNEL, false);
}
else
{
summon->SetReactState(REACT_DEFENSIVE);
_scheduler.CancelGroup(CONTEXT_GROUP_RIFTS);
}
}
}
void Update(uint32 diff) override
{
_scheduler.Update(diff);

View File

@@ -245,7 +245,8 @@ private:
enum timeRift
{
EVENT_SUMMON_AT_RIFT = 1,
EVENT_CHECK_DEATH = 2
EVENT_CHECK_DEATH = 2,
EVENT_SUMMON_BOSS = 3
};
struct npc_time_rift : public NullCreatureAI
@@ -257,14 +258,14 @@ struct npc_time_rift : public NullCreatureAI
void Reset() override
{
if (_instance->GetData(DATA_RIFT_NUMBER) >= 18)
if (_instance->GetData(DATA_RIFT_NUMBER) > 18)
{
me->DespawnOrUnsummon(30000);
return;
}
events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 16000);
events.ScheduleEvent(EVENT_CHECK_DEATH, 8000);
events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 16s);
events.ScheduleEvent(EVENT_SUMMON_BOSS, 6s);
}
void JustSummoned(Creature* creature) override
@@ -306,31 +307,60 @@ struct npc_time_rift : public NullCreatureAI
}
}
void SummonedCreatureDies(Creature* creature, Unit* /*killer*/) override
{
if (creature->GetGUID() == _riftKeeperGUID)
{
me->DespawnOrUnsummon(0);
}
}
void UpdateAI(uint32 diff) override
{
events.Update(diff);
switch (events.ExecuteEvent())
{
case EVENT_SUMMON_AT_RIFT:
DoSelectSummon();
events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 15000);
break;
case EVENT_CHECK_DEATH:
if (!me->HasUnitState(UNIT_STATE_CASTING))
if (_riftKeeperGUID.GetEntry() != NPC_AEONUS)
{
Creature* riftKeeper = ObjectAccessor::GetCreature(*me, _riftKeeperGUID);
if (!riftKeeper || !riftKeeper->IsAlive())
{
me->DespawnOrUnsummon(0);
DoSelectSummon();
events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 15000);
}
break;
case EVENT_SUMMON_BOSS:
{
int32 entry = 0;
switch (_instance->GetData(DATA_RIFT_NUMBER))
{
case 6:
entry = _instance->GetBossState(DATA_CHRONO_LORD_DEJA) == DONE ? (me->GetMap()->IsHeroic() ? NPC_INFINITE_CHRONO_LORD : -NPC_CHRONO_LORD_DEJA) : NPC_CHRONO_LORD_DEJA;
break;
}
else
case 12:
entry = _instance->GetBossState(DATA_TEMPORUS) == DONE ? (me->GetMap()->IsHeroic() ? NPC_INFINITE_TIMEREAVER : -NPC_TEMPORUS) : NPC_TEMPORUS;
break;
case 18:
entry = NPC_AEONUS;
break;
default:
entry = RAND(NPC_RIFT_KEEPER_WARLOCK, NPC_RIFT_KEEPER_MAGE, NPC_RIFT_LORD, NPC_RIFT_LORD_2);
break;
}
Position pos = me->GetNearPosition(10.0f, 2 * M_PI * rand_norm());
if (Creature* summon = me->SummonCreature(std::abs(entry), pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3 * MINUTE * IN_MILLISECONDS))
{
if (entry < 0)
{
me->CastSpell(riftKeeper, SPELL_RIFT_CHANNEL, false);
summon->SetLootMode(0);
}
if (summon->GetEntry() != NPC_AEONUS)
{
me->CastSpell(summon, SPELL_RIFT_CHANNEL, false);
}
}
events.ScheduleEvent(EVENT_CHECK_DEATH, 500);
break;
}
}
}

View File

@@ -42,7 +42,7 @@ enum DataTypes
DATA_RIFT_NUMBER = 14,
DATA_SUMMONED_NPC = 20,
DATA_DELETED_NPC = 21,
DATA_DELETED_NPC = 21
};
enum WorldStateIds