diff options
4 files changed, 159 insertions, 64 deletions
diff --git a/sql/updates/world/3.3.5/2025_07_12_01_world.sql b/sql/updates/world/3.3.5/2025_07_12_01_world.sql new file mode 100644 index 00000000000..c6b4b59e035 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_07_12_01_world.sql @@ -0,0 +1,22 @@ +-- +DELETE FROM `creature_text` WHERE `CreatureID` = 17380; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(17380,0,0,"Kill them!",14,0,100,0,0,0,15115,0,"broggok SAY_INTRO"), +(17380,1,0,"Come intruders....",14,0,100,0,0,0,14259,0,"broggok SAY_AGGRO"); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 26838; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,26838,0,0,31,0,3,16006,0,0,0,0,"","Group 0: Spell 'Despawn InCombat Trigger' (Effect 0) targets creature 'InCombat Trigger'"); + +DELETE FROM `spell_script_names` WHERE `spell_id` = 26838 AND `ScriptName` = 'spell_gen_despawn_target'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(26838,'spell_gen_despawn_target'); +-- Credit - Cmangos +DELETE FROM `waypoint_data` WHERE `id` = 1381150; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(1381150,1,455.6496,33.33417,9.544375,NULL,0,1,0,100,0), +(1381150,2,456.105,44.3159,9.62544,NULL,0,1,0,100,0), +(1381150,3,458.401,50.6364,9.62375,NULL,0,1,0,100,0), +(1381150,4,461.782,54.9224,9.6233,NULL,0,1,0,100,0), +(1381150,5,463.657,60.3144,9.61813,NULL,0,1,0,100,0), +(1381150,6,456.328,78.3051,9.61487,1.53589,0,1,0,100,0); diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h index de6d9e04db6..4edf289f1d0 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h @@ -51,9 +51,7 @@ enum BFCreatureIds NPC_BROGGOK = 17380, NPC_KELIDAN_THE_BREAKER = 17377, NPC_PRISONER1 = 17398, - NPC_PRISONER2 = 17429, - NPC_BROGGOK_POISON_CLOUD = 17662, - NPC_INCOMBAT_TRIGGER = 16006 + NPC_PRISONER2 = 17429 }; enum BFGameObjectIds diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp index 068b70116b7..b8b794d20cc 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp @@ -21,36 +21,54 @@ #include "GameObject.h" #include "GameObjectAI.h" #include "InstanceScript.h" -#include "ObjectAccessor.h" +#include "MotionMaster.h" #include "ScriptedCreature.h" #include "SpellAuraEffects.h" #include "SpellScript.h" enum BroggokTexts { - SAY_AGGRO = 0 + SAY_INTRO = 0, + SAY_AGGRO = 1 }; enum BroggokSpells { - SPELL_SLIME_SPRAY = 30913, - SPELL_POISON_CLOUD = 30916, - SPELL_POISON_BOLT = 30917, - SPELL_POISON_CLOUD_PASSIVE = 30914, - SPELL_SUMMON_INCOMBAT_TRIGGER = 26837, + SPELL_SLIME_SPRAY = 30913, + SPELL_POISON_BOLT = 30917, + SPELL_POISON_CLOUD = 30916, + + SPELL_SUMMON_INCOMBAT_TRIGGER = 26837, + SPELL_DESPAWN_INCOMBAT_TRIGGER = 26838, + + // Cloud + SPELL_POISON_CLOUD_PASSIVE = 30914, // Prisioners - SPELL_STOMP = 31900, - SPELL_CONCUSSION_BLOW = 22427, - SPELL_FRENZY = 8269, - SPELL_CHARGE = 22120 + SPELL_STOMP = 31900, + SPELL_CONCUSSION_BLOW = 22427, + SPELL_FRENZY = 8269, + SPELL_CHARGE = 22120 }; enum BroggokEvents { - EVENT_SLIME_SPRAY = 1, + EVENT_SLIME_SPRAY = 1, EVENT_POISON_BOLT, EVENT_POISON_CLOUD, + + EVENT_INTRO_1, + EVENT_INTRO_2, + + EVENT_ACTIVATE_1, + EVENT_ACTIVATE_2 +}; + +enum BroggokMisc +{ + PATH_ROOM = 1381150, + NPC_BROGGOK_POISON_CLOUD = 17662, + NPC_INCOMBAT_TRIGGER = 16006 }; // 17380 - Broggok @@ -67,11 +85,11 @@ struct boss_broggok : public BossAI void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); - Talk(SAY_AGGRO); + DoCastSelf(SPELL_DESPAWN_INCOMBAT_TRIGGER); - events.ScheduleEvent(EVENT_SLIME_SPRAY, 10s); - events.ScheduleEvent(EVENT_POISON_BOLT, 7s); - events.ScheduleEvent(EVENT_POISON_CLOUD, 5s); + events.ScheduleEvent(EVENT_SLIME_SPRAY, 8s, 12s); + events.ScheduleEvent(EVENT_POISON_BOLT, 2s, 10s); + events.ScheduleEvent(EVENT_POISON_CLOUD, 5s, 10s); } void JustSummoned(Creature* summoned) override @@ -90,22 +108,29 @@ struct boss_broggok : public BossAI } } + void EnterEvadeMode(EvadeReason /*why*/) override + { + summons.DespawnEntry(NPC_BROGGOK_POISON_CLOUD); + DoCastSelf(SPELL_DESPAWN_INCOMBAT_TRIGGER, true); + instance->SetBossState(DATA_BROGGOK, NOT_STARTED); + _DespawnAtEvade(); + } + void DoAction(int32 action) override { switch (action) { case ACTION_PREPARE_BROGGOK: - DoCastSelf(SPELL_SUMMON_INCOMBAT_TRIGGER); + events.ScheduleEvent(EVENT_INTRO_1, 0s); break; case ACTION_ACTIVATE_BROGGOK: - me->SetReactState(REACT_AGGRESSIVE); - me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE); - DoZoneInCombat(); + events.ScheduleEvent(EVENT_ACTIVATE_1, 0s); break; case ACTION_RESET_BROGGOK: me->SetReactState(REACT_PASSIVE); me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE); - summons.DespawnAll(); + summons.DespawnEntry(NPC_BROGGOK_POISON_CLOUD); + DoCastSelf(SPELL_DESPAWN_INCOMBAT_TRIGGER); instance->SetBossState(DATA_BROGGOK, NOT_STARTED); if (GameObject * lever = instance->GetGameObject(DATA_BROGGOK_LEVER)) { @@ -118,24 +143,73 @@ struct boss_broggok : public BossAI } } - void ExecuteEvent(uint32 eventId) override + void UpdateAI(uint32 diff) override { - switch (eventId) + if (!UpdateVictim()) { - case EVENT_SLIME_SPRAY: - DoCastVictim(SPELL_SLIME_SPRAY); - events.Repeat(4s, 12s); - break; - case EVENT_POISON_BOLT: - DoCastVictim(SPELL_POISON_BOLT); - events.Repeat(4s, 12s); - break; - case EVENT_POISON_CLOUD: - DoCastSelf(SPELL_POISON_CLOUD); - events.Repeat(20s); - break; - default: - break; + UpdateOutOfCombatEvents(diff); + return; + } + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SLIME_SPRAY: + DoCastSelf(SPELL_SLIME_SPRAY); + events.Repeat(4s, 12s); + break; + case EVENT_POISON_BOLT: + DoCastSelf(SPELL_POISON_BOLT); + events.Repeat(4s, 12s); + break; + case EVENT_POISON_CLOUD: + DoCastSelf(SPELL_POISON_CLOUD); + events.Repeat(20s); + break; + default: + break; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } + + DoMeleeAttackIfReady(); + } + + void UpdateOutOfCombatEvents(uint32 diff) + { + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_INTRO_1: + DoCastSelf(SPELL_SUMMON_INCOMBAT_TRIGGER); + events.ScheduleEvent(EVENT_INTRO_2, 2s); + break; + case EVENT_INTRO_2: + Talk(SAY_INTRO); + break; + case EVENT_ACTIVATE_1: + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE); + events.ScheduleEvent(EVENT_ACTIVATE_2, 4s); + break; + case EVENT_ACTIVATE_2: + Talk(SAY_AGGRO); + me->GetMotionMaster()->MovePath(PATH_ROOM, false); + break; + default: + break; + } } } }; @@ -154,10 +228,10 @@ struct BroggokPrisionersAI : public ScriptedAI void Reset() override { scheduler.CancelAll(); - scheduler.Schedule(1s, 5s, [this](TaskContext emote) + scheduler.Schedule(1s, 5s, [this](TaskContext task) { me->HandleEmoteCommand(Trinity::Containers::SelectRandomContainerElement(PrisionersEmotes)); - emote.Repeat(6s, 9s); + task.Repeat(6s, 9s); }); } @@ -202,17 +276,18 @@ struct npc_nascent_fel_orc : public BroggokPrisionersAI void ScheduleEvents() override { - scheduler.Schedule(15s, [this](TaskContext concussionBlow) - { - DoCastVictim(SPELL_CONCUSSION_BLOW); - concussionBlow.Repeat(8s, 11s); - }).Schedule(7s, [this](TaskContext stomp) - { - DoCastVictim(SPELL_STOMP); - stomp.Repeat(16s, 21s); - }); + scheduler + .Schedule(15s, [this](TaskContext task) + { + DoCastVictim(SPELL_CONCUSSION_BLOW); + task.Repeat(8s, 11s); + }) + .Schedule(7s, [this](TaskContext task) + { + DoCastSelf(SPELL_STOMP); + task.Repeat(16s, 21s); + }); } - }; // 17429 - Fel Orc Neophyte @@ -222,17 +297,19 @@ struct npc_fel_orc_neophyte : public BroggokPrisionersAI void ScheduleEvents() override { - scheduler.Schedule(5s, [this](TaskContext charge) - { - DoCastVictim(SPELL_CHARGE); - charge.Repeat(20s); - }).Schedule(1s, [this](TaskContext frenzy) - { - DoCastSelf(SPELL_FRENZY); - frenzy.Repeat(12s, 13s); - }); + scheduler + .Schedule(5s, [this](TaskContext task) + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, SPELL_CHARGE); + task.Repeat(20s); + }) + .Schedule(1s, [this](TaskContext task) + { + DoCastSelf(SPELL_FRENZY); + task.Repeat(12s, 13s); + }); } - }; // 181982 - Cell Door Lever diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp index 50d89a71548..6fc6a707eb4 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp @@ -221,7 +221,6 @@ class instance_blood_furnace : public InstanceMapScript { if (!prisoner->IsAlive()) prisoner->Respawn(true); - prisoner->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); prisoner->SetImmuneToAll(true); if (prisoner->IsAIEnabled()) prisoner->AI()->EnterEvadeMode(); @@ -313,7 +312,6 @@ class instance_blood_furnace : public InstanceMapScript for (GuidSet::const_iterator i = prisoners.begin(); i != prisoners.end(); ++i) if (Creature* prisoner = instance->GetCreature(*i)) { - prisoner->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); prisoner->SetImmuneToAll(false); prisoner->AI()->DoZoneInCombat(); } |