diff options
-rw-r--r-- | data/sql/updates/pending_db_world/rev_1731194758257727900.sql | 15 | ||||
-rw-r--r-- | src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp | 153 |
2 files changed, 68 insertions, 100 deletions
diff --git a/data/sql/updates/pending_db_world/rev_1731194758257727900.sql b/data/sql/updates/pending_db_world/rev_1731194758257727900.sql new file mode 100644 index 0000000000..9473c09a94 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1731194758257727900.sql @@ -0,0 +1,15 @@ +-- +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 43734; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 43734, 0, 0, 31, 0, 3, 23817, 0, 0, 0, 0, '', 'Hatch Eggs can only hit Dragonhawk Egg'); + +UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = 23817; + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 23817) AND (`source_type` = 0) AND (`id` IN (0, 1)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(23817, 0, 0, 0, 8, 0, 100, 0, 42471, 0, 0, 0, 0, 0, 11, 42493, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Dragonhawk Egg - On Spellhit \'Hatch Eggs\' - Cast \'Summon Dragonhawk Hatchling\''), +(23817, 0, 1, 0, 8, 0, 100, 0, 43734, 0, 0, 0, 0, 0, 11, 42493, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Dragonhawk Egg - On Spellhit \'Hatch Eggs\' - Cast \'Summon Dragonhawk Hatchling\''); + +DELETE FROM `creature_template_movement` WHERE `CreatureId` = 23598; +INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Flight`) VALUES +(23598, 1, 1); diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp index 0fd4a8334b..ae7651914e 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp @@ -15,13 +15,6 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Boss_Janalai -SD%Complete: 100 -SDComment: -SDCategory: Zul'Aman -EndScriptData */ - #include "CellImpl.h" #include "CreatureScript.h" #include "GridNotifiers.h" @@ -125,7 +118,13 @@ enum Misc struct boss_janalai : public BossAI { - boss_janalai(Creature* creature) : BossAI(creature, DATA_JANALAI) { } + boss_janalai(Creature* creature) : BossAI(creature, DATA_JANALAI) + { + scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); + } void Reset() override { @@ -134,18 +133,17 @@ struct boss_janalai : public BossAI _isBombing = false; _isFlameBreathing = false; - ScheduleHealthCheckEvent(25, [&]{ - DoCastSelf(SPELL_ENRAGE, true); - }); - ScheduleHealthCheckEvent(35, [&]{ Talk(SAY_ALL_EGGS); me->AttackStop(); me->GetMotionMaster()->Clear(); me->SetPosition(janalainPos); me->StopMovingOnCurrentPos(); - DoCastSelf(SPELL_HATCH_ALL); - HatchAllEggs(HATCH_ALL); + DoCastAOE(SPELL_HATCH_ALL); + }); + + ScheduleHealthCheckEvent(25, [&] { + DoCastSelf(SPELL_ENRAGE, true); }); } @@ -209,19 +207,19 @@ struct boss_janalai : public BossAI return false; if (hatchAction == HATCH_RESET) + { for (Creature* egg : eggList) egg->Respawn(); - else if (hatchAction == HATCH_ALL) - DoCastSelf(SPELL_HATCH_EGG_ALL); - if (hatchAction == HATCH_RESET) - { std::list<Creature* > hatchlingList; me->GetCreaturesWithEntryInRange(hatchlingList, 100.0f, NPC_HATCHLING); for (Creature* hatchling : hatchlingList) hatchling->DespawnOrUnsummon(); hatchlingList.clear(); } + else if (hatchAction == HATCH_ALL) + DoCastSelf(SPELL_HATCH_EGG_ALL); + eggList.clear(); return true; } @@ -239,9 +237,7 @@ struct boss_janalai : public BossAI : me->SummonCreature(NPC_FIRE_BOMB, fireWallCoords[i].GetPositionX() - 2 + 4 * j, fireWallCoords[i].GetPositionY(), fireWallCoords[i].GetPositionZ(), fireWallCoords[i].GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 15000); if (wall) - { wall->AI()->DoCastSelf(SPELL_FIRE_WALL, true); - } } } } @@ -259,18 +255,16 @@ struct boss_janalai : public BossAI void Boom() { - std::list<Creature*> fireBombs; - me->GetCreaturesWithEntryInRange(fireBombs, 100.0f, NPC_FIRE_BOMB); - - if (fireBombs.empty()) - return; - - for (Creature* bomb : fireBombs) - { - bomb->AI()->DoCastSelf(SPELL_FIRE_BOMB_DAMAGE, true); - bomb->RemoveAllAuras(); - } - fireBombs.clear(); + summons.DoForAllSummons([&](WorldObject* summon) { + if (summon->GetEntry() == NPC_FIRE_BOMB) + { + if (Creature* bomb = summon->ToCreature()) + { + bomb->AI()->DoCastSelf(SPELL_FIRE_BOMB_DAMAGE, true); + bomb->RemoveAllAuras(); + } + } + }); } void StartBombing() @@ -286,14 +280,11 @@ struct boss_janalai : public BossAI SpawnBombs(); _isBombing = true; - if (Map* map = me->GetMap()) + me->GetMap()->DoForAllPlayers([&](Player* player) { - map->DoForAllPlayers([&](Player* player) - { - if (player->IsAlive()) - DoTeleportPlayer(player, janalainPos.GetPositionX() - 5 + rand() % 10, janalainPos.GetPositionY() - 5 + rand() % 10, janalainPos.GetPositionZ(), 0.0f); - }); - } + if (player->IsAlive()) + DoTeleportPlayer(player, janalainPos.GetPositionX() - 5 + rand() % 10, janalainPos.GetPositionY() - 5 + rand() % 10, janalainPos.GetPositionZ(), 0.0f); + }); //DoCast(Temp, SPELL_SUMMON_PLAYERS, true) // core bug, spell does not work if too far ThrowBombs(); @@ -308,20 +299,23 @@ struct boss_janalai : public BossAI void ThrowBombs() { - std::list<Creature*> fireBombs; std::chrono::milliseconds bombTimer = 100ms; - me->GetCreaturesWithEntryInRange(fireBombs, 100.0f, NPC_FIRE_BOMB); - for (Creature* bomb : fireBombs) - { - scheduler.Schedule(bombTimer, [this, bomb](TaskContext) + + summons.DoForAllSummons([this, &bombTimer](WorldObject* summon) { + if (summon->GetEntry() == NPC_FIRE_BOMB) { - bomb->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - DoCast(bomb, SPELL_FIRE_BOMB_THROW, true); - bomb->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - }); - bombTimer = bombTimer + 100ms; - } - fireBombs.clear(); + if (Creature* bomb = summon->ToCreature()) + { + bomb->m_Events.AddEventAtOffset([this, bomb] { + bomb->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + DoCast(bomb, SPELL_FIRE_BOMB_THROW, true); + bomb->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + }, bombTimer); + } + + bombTimer += 100ms; + } + }); } bool CheckEvadeIfOutOfCombatArea() const override @@ -335,10 +329,7 @@ private: struct npc_janalai_hatcher : public ScriptedAI { - npc_janalai_hatcher(Creature* creature) : ScriptedAI(creature) - { - _instance = creature->GetInstanceScript(); - } + npc_janalai_hatcher(Creature* creature) : ScriptedAI(creature) { } void Reset() override { @@ -347,7 +338,6 @@ struct npc_janalai_hatcher : public ScriptedAI _side = (me->GetPositionY() < 1150); _waypoint = 0; _isHatching = false; - _hasChangedSide = false; me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MovePoint(0, hatcherway[_side][0]); } @@ -357,29 +347,13 @@ struct npc_janalai_hatcher : public ScriptedAI if (_waypoint == 5) { _isHatching = true; - std::list<Creature* > eggList; - me->GetCreaturesWithEntryInRange(eggList, 50.0f, NPC_EGG); - scheduler.Schedule(1500ms, SCHEDULER_GROUP_HATCHING, [this, eggList](TaskContext context) + + scheduler.Schedule(1500ms, SCHEDULER_GROUP_HATCHING, [this](TaskContext context) { - std::list<Creature* > unhatchedEggs; - for (Creature* egg : eggList) - { - if (egg->IsAlive()) - unhatchedEggs.emplace_front(egg); - } - Acore::Containers::RandomResize(unhatchedEggs, 1); - if (Creature* egg = unhatchedEggs.front()) - egg->AI()->DoCastSelf(SPELL_HATCH_EGG_SINGULAR); - else if (!_hasChangedSide) - { - _side = _side ? 0 : 1; - _isHatching = false; - _waypoint = 3; - MoveToNewWaypoint(_waypoint); - _hasChangedSide = true; - context.CancelGroup(SCHEDULER_GROUP_HATCHING); - } - context.Repeat(1500ms); + me->CastCustomSpell(SPELL_HATCH_EGG_ALL, SPELLVALUE_MAX_TARGETS, context.GetRepeatCounter() + 1); + + if (me->FindNearestCreature(NPC_EGG, 100.0f)) + context.Repeat(4s); }); } else @@ -411,19 +385,14 @@ struct npc_janalai_hatcher : public ScriptedAI void MoveInLineOfSight(Unit* /*who*/) override { } private: - InstanceScript* _instance; uint8 _side; uint8 _waypoint; bool _isHatching; - bool _hasChangedSide; }; struct npc_janalai_hatchling : public ScriptedAI { - npc_janalai_hatchling(Creature* creature) : ScriptedAI(creature) - { - _instance = creature->GetInstanceScript(); - } + npc_janalai_hatchling(Creature* creature) : ScriptedAI(creature) { } void Reset() override { @@ -433,7 +402,6 @@ struct npc_janalai_hatchling : public ScriptedAI else me->GetMotionMaster()->MovePoint(0, hatcherway[1][3].GetPositionX() + rand() % 4 - 2, 1150.0f + rand() % 4 - 2, hatcherway[1][3].GetPositionY()); - me->SetDisableGravity(true); me->SetInCombatWithZone(); } @@ -454,20 +422,6 @@ struct npc_janalai_hatchling : public ScriptedAI DoMeleeAttackIfReady(); } - -private: - InstanceScript* _instance; -}; - -struct npc_janalai_egg : public NullCreatureAI -{ - npc_janalai_egg(Creature* creature) : NullCreatureAI(creature) { } - - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override - { - if (spell->Id == SPELL_HATCH_EGG_ALL || spell->Id == SPELL_HATCH_EGG_SINGULAR) - DoCastSelf(SPELL_SUMMON_HATCHLING); - } }; void AddSC_boss_janalai() @@ -475,5 +429,4 @@ void AddSC_boss_janalai() RegisterZulAmanCreatureAI(boss_janalai); RegisterZulAmanCreatureAI(npc_janalai_hatcher); RegisterZulAmanCreatureAI(npc_janalai_hatchling); - RegisterZulAmanCreatureAI(npc_janalai_egg); } |