diff options
-rw-r--r-- | data/sql/updates/pending_db_world/rev_1731176128691196300.sql | 4 | ||||
-rw-r--r-- | src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp | 305 |
2 files changed, 129 insertions, 180 deletions
diff --git a/data/sql/updates/pending_db_world/rev_1731176128691196300.sql b/data/sql/updates/pending_db_world/rev_1731176128691196300.sql new file mode 100644 index 0000000000..bb2a543444 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1731176128691196300.sql @@ -0,0 +1,4 @@ +-- +DELETE FROM `creature_template_movement` WHERE `CreatureId` = 24858; +INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Flight`) VALUES +(24858, 1, 1); diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp index ee9b78f812..f2e1c70f1e 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp @@ -58,26 +58,6 @@ enum Says constexpr auto NPC_SOARING_EAGLE = 24858; -//enum Misc -//{ -// SE_LOC_X_MAX = 400, -// SE_LOC_X_MIN = 335, -// SE_LOC_Y_MAX = 1435, -// SE_LOC_Y_MIN = 1370 -//}; - -enum Events -{ - EVENT_STATIC_DISRUPTION = 1, - EVENT_GUST_OF_WIND = 2, - EVENT_CALL_LIGHTNING = 3, - EVENT_ELECTRICAL_STORM = 4, - EVENT_RAIN = 5, - EVENT_SUMMON_EAGLES = 6, - EVENT_STORM_SEQUENCE = 7, - EVENT_ENRAGE = 8 -}; - class boss_akilzon : public CreatureScript { public: @@ -85,9 +65,7 @@ public: struct boss_akilzonAI : public BossAI { - boss_akilzonAI(Creature* creature) : BossAI(creature, DATA_AKILZON) - { - } + boss_akilzonAI(Creature* creature) : BossAI(creature, DATA_AKILZON) { } void Reset() override { @@ -97,32 +75,103 @@ public: CloudGUID.Clear(); CycloneGUID.Clear(); - for (uint8 i = 0; i < 8; ++i) - BirdGUIDs[i].Clear(); - StormCount = 0; isRaining = false; SetWeather(WEATHER_STATE_FINE, 0.0f); + + me->m_Events.KillAllEvents(false); } void JustEngagedWith(Unit* /*who*/) override { - events.ScheduleEvent(EVENT_STATIC_DISRUPTION, urand(10000, 20000)); // 10 to 20 seconds (bosskillers) - events.ScheduleEvent(EVENT_GUST_OF_WIND, urand(20000, 30000)); // 20 to 30 seconds(bosskillers) - events.ScheduleEvent(EVENT_CALL_LIGHTNING, urand(10000, 20000)); // totaly random timer. can't find any info on this - events.ScheduleEvent(EVENT_ELECTRICAL_STORM, 60000); // 60 seconds(bosskillers) - events.ScheduleEvent(EVENT_RAIN, urand(47000, 52000)); - events.ScheduleEvent(EVENT_ENRAGE, 10 * MINUTE * IN_MILLISECONDS); // 10 minutes till enrage(bosskillers) + ScheduleTimedEvent(10s, 20s, [&]{ + Unit* target = SelectTarget(SelectTargetMethod::Random, 1); + if (!target) + target = me->GetVictim(); + if (target) + { + TargetGUID = target->GetGUID(); + DoCast(target, SPELL_STATIC_DISRUPTION, false); + me->SetInFront(me->GetVictim()); + } + }, 10s, 18s); + + ScheduleTimedEvent(20s, 30s, [&] { + Unit* target = SelectTarget(SelectTargetMethod::Random, 1); + if (!target) + target = me->GetVictim(); + if (target) + DoCast(target, SPELL_GUST_OF_WIND); + }, 20s, 30s); + + ScheduleTimedEvent(10s, 20s, [&] { + DoCastVictim(SPELL_CALL_LIGHTNING); + }, 12s, 17s); + + ScheduleTimedEvent(1min, [&] { + Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50, true); + if (!target) + { + EnterEvadeMode(); + return; + } + target->CastSpell(target, 44007, true); // cloud visual + DoCast(target, SPELL_ELECTRICAL_STORM, false); // storm cyclon + visual + float x, y, z; + target->GetPosition(x, y, z); + + Unit* Cloud = me->SummonTrigger(x, y, me->GetPositionZ() + 16, 0, 15000); + if (Cloud) + { + target->GetMotionMaster()->MoveJump(Cloud->GetPosition(), 1.0f, 1.0f); + + CloudGUID = Cloud->GetGUID(); + Cloud->SetDisableGravity(true); + Cloud->StopMoving(); + Cloud->SetObjectScale(1.0f); + Cloud->SetFaction(FACTION_FRIENDLY); + Cloud->SetMaxHealth(9999999); + Cloud->SetHealth(9999999); + Cloud->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + + me->m_Events.AddEventAtOffset([&, Cloud] { + HandleStormSequence(Cloud); + }, 3s); + } + + StormCount = 1; + + me->m_Events.AddEventAtOffset([&] { + if (!isRaining) + { + SetWeather(WEATHER_STATE_HEAVY_RAIN, 0.9999f); + isRaining = true; + } + }, Seconds(urand(47, 52))); + }, 1min); + + ScheduleTimedEvent(47s, 52s, [&] { + if (!isRaining) + { + SetWeather(WEATHER_STATE_HEAVY_RAIN, 0.9999f); + isRaining = true; + } + }, 47s, 52s); + + me->m_Events.AddEventAtOffset([&] { + Talk(SAY_ENRAGE); + DoCastSelf(SPELL_BERSERK, true); + }, 10min); Talk(SAY_AGGRO); - //DoZoneInCombat(); } void JustDied(Unit* /*killer*/) override { Talk(SAY_DEATH); _JustDied(); + me->m_Events.KillAllEvents(false); } void KilledUnit(Unit* who) override @@ -133,18 +182,14 @@ public: void SetWeather(uint32 weather, float grade) { - Map* map = me->GetMap(); - if (!map->IsDungeon()) - return; - - WorldPacket data(SMSG_WEATHER, (4 + 4 + 4)); - data << uint32(weather) << float(grade) << uint8(0); - - map->SendToPlayers(&data); + me->GetMap()->SetZoneWeather(me->GetZoneId(), WeatherState(weather), grade); } void HandleStormSequence(Unit* Cloud) // 1: begin, 2-9: tick, 10: end { + if (!Cloud) + return; + if (StormCount < 10 && StormCount > 1) { // deal damage @@ -159,9 +204,9 @@ public: Cell::VisitAllObjects(me, searcher, SIZE_OF_GRIDS); // deal damage - for (std::list<Unit*>::const_iterator i = tempUnitMap.begin(); i != tempUnitMap.end(); ++i) + for (auto const& target : tempUnitMap) { - if (Unit* target = (*i)) + if (target) { if (Cloud && !Cloud->IsWithinDist(target, 6, false)) Cloud->CastCustomSpell(target, SPELL_ZAP, &bp0, nullptr, nullptr, true, 0, 0, me->GetGUID()); @@ -192,158 +237,58 @@ public: if (StormCount > 10) { StormCount = 0; // finish - events.ScheduleEvent(EVENT_SUMMON_EAGLES, 5000); + + me->m_Events.AddEventAtOffset([&] { + SummonEagles(); + }, 5s); + me->InterruptNonMeleeSpells(false); CloudGUID.Clear(); if (Cloud) - Unit::DealDamage(Cloud, Cloud, Cloud->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false); + Cloud->KillSelf(); SetWeather(WEATHER_STATE_FINE, 0.0f); isRaining = false; } - events.ScheduleEvent(EVENT_STORM_SEQUENCE, 1000); + + me->m_Events.AddEventAtOffset([&] { + Unit* target = ObjectAccessor::GetUnit(*me, CloudGUID); + if (!target || !target->IsAlive()) + return; + else if (Unit* Cyclone = ObjectAccessor::GetUnit(*me, CycloneGUID)) + Cyclone->CastSpell(target, SPELL_SAND_STORM, true); // keep casting or... + HandleStormSequence(target); + }, 1s); } - void UpdateAI(uint32 diff) override + void SummonEagles() { - if (!UpdateVictim()) - return; + Talk(SAY_SUMMON); - events.Update(diff); + float x, y, z; + me->GetPosition(x, y, z); - while (uint32 eventId = events.ExecuteEvent()) + for (uint8 i = 0; i < 8; ++i) { - switch (eventId) + Unit* bird = ObjectAccessor::GetUnit(*me, BirdGUIDs[i]); + if (!bird) //they despawned on die { - case EVENT_STATIC_DISRUPTION: - { - Unit* target = SelectTarget(SelectTargetMethod::Random, 1); - if (!target) - target = me->GetVictim(); - if (target) - { - TargetGUID = target->GetGUID(); - DoCast(target, SPELL_STATIC_DISRUPTION, false); - me->SetInFront(me->GetVictim()); - } - /*if (float dist = me->IsWithinDist3d(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 5.0f) dist = 5.0f; - SDisruptAOEVisual_Timer = 1000 + std::floor(dist / 30 * 1000.0f);*/ - events.ScheduleEvent(EVENT_STATIC_DISRUPTION, urand(10000, 18000)); - break; - } - case EVENT_GUST_OF_WIND: - { - Unit* target = SelectTarget(SelectTargetMethod::Random, 1); - if (!target) - target = me->GetVictim(); - if (target) - DoCast(target, SPELL_GUST_OF_WIND); - events.ScheduleEvent(EVENT_GUST_OF_WIND, urand(20000, 30000)); - break; - } - case EVENT_CALL_LIGHTNING: - DoCastVictim(SPELL_CALL_LIGHTNING); - events.ScheduleEvent(EVENT_CALL_LIGHTNING, urand(12000, 17000)); // totaly random timer. can't find any info on this - break; - case EVENT_ELECTRICAL_STORM: - { - Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50, true); - if (!target) - { - EnterEvadeMode(); - return; - } - target->CastSpell(target, 44007, true); // cloud visual - DoCast(target, SPELL_ELECTRICAL_STORM, false); // storm cyclon + visual - float x, y, z; - target->GetPosition(x, y, z); - /// @todo: fix it in correct way, that causes player to can fly until logout - /* - if (target) - { - target->SetDisableGravity(true); - target->MonsterMoveWithSpeed(x, y, me->GetPositionZ()+15, 0); - } - */ - - Unit* Cloud = me->SummonTrigger(x, y, me->GetPositionZ() + 16, 0, 15000); - if (Cloud) - { - CloudGUID = Cloud->GetGUID(); - Cloud->SetDisableGravity(true); - Cloud->StopMoving(); - Cloud->SetObjectScale(1.0f); - Cloud->SetFaction(FACTION_FRIENDLY); - Cloud->SetMaxHealth(9999999); - Cloud->SetHealth(9999999); - Cloud->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - } - StormCount = 1; - events.ScheduleEvent(EVENT_ELECTRICAL_STORM, 60000); // 60 seconds(bosskillers) - events.ScheduleEvent(EVENT_RAIN, urand(47000, 52000)); - break; - } - case EVENT_RAIN: - if (!isRaining) - { - SetWeather(WEATHER_STATE_HEAVY_RAIN, 0.9999f); - isRaining = true; - } - else - events.ScheduleEvent(EVENT_RAIN, 1000); - break; - case EVENT_STORM_SEQUENCE: - { - Unit* target = ObjectAccessor::GetUnit(*me, CloudGUID); - if (!target || !target->IsAlive()) - { - EnterEvadeMode(); - return; - } - else if (Unit* Cyclone = ObjectAccessor::GetUnit(*me, CycloneGUID)) - Cyclone->CastSpell(target, SPELL_SAND_STORM, true); // keep casting or... - HandleStormSequence(target); - break; - } - case EVENT_SUMMON_EAGLES: - Talk(SAY_SUMMON); - - float x, y, z; - me->GetPosition(x, y, z); - - for (uint8 i = 0; i < 8; ++i) - { - Unit* bird = ObjectAccessor::GetUnit(*me, BirdGUIDs[i]); - if (!bird) //they despawned on die - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - { - x = target->GetPositionX() + irand(-10, 10); - y = target->GetPositionY() + irand(-10, 10); - z = target->GetPositionZ() + urand(16, 20); - if (z > 95) - z = 95.0f - urand(0, 5); - } - Creature* creature = me->SummonCreature(NPC_SOARING_EAGLE, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); - if (creature) - { - creature->AddThreat(me->GetVictim(), 1.0f); - creature->AI()->AttackStart(me->GetVictim()); - BirdGUIDs[i] = creature->GetGUID(); - } - } - } - break; - case EVENT_ENRAGE: - Talk(SAY_ENRAGE); - DoCast(me, SPELL_BERSERK, true); - events.ScheduleEvent(EVENT_ENRAGE, 600000); - break; - default: - break; + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + { + x = target->GetPositionX() + irand(-10, 10); + y = target->GetPositionY() + irand(-10, 10); + z = target->GetPositionZ() + urand(16, 20); + if (z > 95) + z = 95.0f - urand(0, 5); + } +; + if (Creature* creature = me->SummonCreature(NPC_SOARING_EAGLE, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0)) + { + creature->AddThreat(me->GetVictim(), 1.0f); + creature->AI()->AttackStart(me->GetVictim()); + BirdGUIDs[i] = creature->GetGUID(); + } } } - - DoMeleeAttackIfReady(); } private: |