diff --git a/data/sql/updates/pending_db_world/rev_1784760633944475600.sql b/data/sql/updates/pending_db_world/rev_1784760633944475600.sql new file mode 100644 index 000000000..1cbac0d94 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784760633944475600.sql @@ -0,0 +1,5 @@ +-- +DELETE FROM `vehicle_template_accessory` WHERE `entry` = 32930; +INSERT INTO `vehicle_template_accessory` (`entry`, `accessory_entry`, `seat_id`, `minion`, `description`, `summontype`, `summontimer`) VALUES +(32930, 32933, 0, 1, 'Kologarn', 8, 0), +(32930, 32934, 1, 1, 'Kologarn', 8, 0); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp index 3710026d8..4d28f8110 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp @@ -156,6 +156,10 @@ struct boss_kologarn : public BossAI instance->SaveToDB(); } Reset(); + // Arms are vehicle accessories; the initial pair is seated by Map::AddToMap, + // so only wipe recovery needs to heal survivors or reinstall missing arms. + AttachLeftArm(); + AttachRightArm(); me->setActive(false); } @@ -167,18 +171,8 @@ struct boss_kologarn : public BossAI // Clear the arm's combat-start state so it can re-pull the boss on a subsequent attempt. arm->AI()->Reset(); } - else if (Creature* accessory = me->SummonCreature(NPC_LEFT_ARM, *me, TEMPSUMMON_MANUAL_DESPAWN)) - { - accessory->AddUnitTypeMask(UNIT_MASK_ACCESSORY); - if (!me->HandleSpellClick(accessory, 0)) - accessory->DespawnOrUnsummon(); - else - { - _left = accessory->GetGUID(); - accessory->SetOrientation(M_PI); - accessory->CastSpell(accessory, SPELL_ARM_RESPAWN_VISUAL, true); - } - } + else + vehicle->InstallAccessory(NPC_LEFT_ARM, 0, true, TEMPSUMMON_MANUAL_DESPAWN, 0); } void AttachRightArm() @@ -189,18 +183,8 @@ struct boss_kologarn : public BossAI // Clear the arm's combat-start state so it can re-pull the boss on a subsequent attempt. arm->AI()->Reset(); } - else if (Creature* accessory = me->SummonCreature(NPC_RIGHT_ARM, *me, TEMPSUMMON_MANUAL_DESPAWN)) - { - accessory->AddUnitTypeMask(UNIT_MASK_ACCESSORY); - if (!me->HandleSpellClick(accessory, 1)) - accessory->DespawnOrUnsummon(); - else - { - _right = accessory->GetGUID(); - accessory->SetOrientation(M_PI); - accessory->CastSpell(accessory, SPELL_ARM_RESPAWN_VISUAL, true); - } - } + else + vehicle->InstallAccessory(NPC_RIGHT_ARM, 1, true, TEMPSUMMON_MANUAL_DESPAWN, 0); } void Reset() override @@ -221,9 +205,6 @@ struct boss_kologarn : public BossAI door->SetGoState(GO_STATE_ACTIVE); } - AttachLeftArm(); - AttachRightArm(); - // Reset breath on pull breathReady = false; } @@ -326,35 +307,46 @@ struct boss_kologarn : public BossAI void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override { + if (apply) + { + if (who->GetEntry() == NPC_LEFT_ARM) + _left = who->GetGUID(); + else if (who->GetEntry() == NPC_RIGHT_ARM) + _right = who->GetGUID(); + else + return; + + who->SetOrientation(M_PI); + who->CastSpell(who, SPELL_ARM_RESPAWN_VISUAL, true); + return; + } + if (!me->IsAlive() || instance->GetBossState(BOSS_KOLOGARN) != IN_PROGRESS) return; - if (!apply) + // left arm + if (who->GetGUID() == _left) { - // left arm - if (who->GetGUID() == _left) + _left.Clear(); + if (me->IsInCombat()) { - _left.Clear(); - if (me->IsInCombat()) - { - Talk(SAY_LEFT_ARM_GONE); - events.ScheduleEvent(EVENT_RESTORE_ARM_LEFT, 50s); - } + Talk(SAY_LEFT_ARM_GONE); + events.ScheduleEvent(EVENT_RESTORE_ARM_LEFT, 50s); } - else - { - _right.Clear(); - if (me->IsInCombat()) - { - Talk(SAY_RIGHT_ARM_GONE); - events.ScheduleEvent(EVENT_RESTORE_ARM_RIGHT, 50s); - } - } - - me->CastSpell(me, SPELL_ARM_DEAD, true); - if (!_right && !_left) - events.ScheduleEvent(EVENT_STONE_SHOUT, 5s); } + else + { + _right.Clear(); + if (me->IsInCombat()) + { + Talk(SAY_RIGHT_ARM_GONE); + events.ScheduleEvent(EVENT_RESTORE_ARM_RIGHT, 50s); + } + } + + me->CastSpell(me, SPELL_ARM_DEAD, true); + if (!_right && !_left) + events.ScheduleEvent(EVENT_STONE_SHOUT, 5s); } void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) override