From 5dcea531b5fb00c6364686bb771e23a4a9fd54db Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Mon, 17 Apr 2023 00:19:12 -0300 Subject: [PATCH 01/16] fix(Scripts/ShadowLabyrinth): Update Murmur script (#15970) Co-authored-by: Gultask <100873791+Gultask@users.noreply.github.com> --- .../rev_1681662634958347500.sql | 25 ++ src/common/Utilities/TaskScheduler.cpp | 18 + src/common/Utilities/TaskScheduler.h | 6 + .../ShadowLabyrinth/boss_murmur.cpp | 337 ++++++++++-------- .../ShadowLabyrinth/shadow_labyrinth.h | 5 +- src/server/scripts/Spells/spell_generic.cpp | 4 +- 6 files changed, 238 insertions(+), 157 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1681662634958347500.sql diff --git a/data/sql/updates/pending_db_world/rev_1681662634958347500.sql b/data/sql/updates/pending_db_world/rev_1681662634958347500.sql new file mode 100644 index 000000000..830d551fd --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1681662634958347500.sql @@ -0,0 +1,25 @@ +-- +DELETE FROM `creature_template_movement` WHERE `CreatureId` IN (18708, 20657); +INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Rooted`, `Flight`) VALUES +(18708, 1, 1, 1), +(20657, 1, 1, 1); + +DELETE FROM `spell_script_names` WHERE `spell_id` = 33711; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(33711, 'spell_murmur_touch'); + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = -146210) AND (`source_type` = 0) AND (`id` IN (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`, `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 +(-146210, 0, 1, 0, 58, 0, 100, 0, 8, 1863400, 0, 0, 0, 225, 0, 1, 0, 0, 0, 0, 10, 146104, 18708, 0, 0, 0, 0, 0, 0, 'Cabal Summoner - On Waypoint Finished - Send GUID to Murmur'); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = -146209 AND `id` = 4); +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`, `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 +(-146209, 0, 4, 0, 34, 0, 100, 0, 8, 1, 0, 0, 0, 225, 0, 1, 0, 0, 0, 0, 10, 146104, 18708, 0, 0, 0, 0, 0, 0, 'Cabal Summoner - On Reached Point 1 - Send GUID to Murmur'); -- This is a hack as it will trigger spell 33331 instead of 33329 + +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceEntry` = 33329); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 33329, 0, 0, 31, 0, 3, 18639, 146225, 0, 0, 0, '', 'Murmur\'s Wrath (33329) only targets a set of guids'), +(13, 1, 33329, 0, 1, 31, 0, 3, 18634, 146226, 0, 0, 0, '', 'Murmur\'s Wrath (33329) only targets a set of guids'), +(13, 1, 33329, 0, 2, 31, 0, 3, 18639, 146227, 0, 0, 0, '', 'Murmur\'s Wrath (33329) only targets a set of guids'), +(13, 1, 33329, 0, 3, 31, 0, 3, 18634, 146228, 0, 0, 0, '', 'Murmur\'s Wrath (33329) only targets a set of guids'), +(13, 1, 33329, 0, 4, 31, 0, 3, 18639, 146229, 0, 0, 0, '', 'Murmur\'s Wrath (33329) only targets a set of guids'); diff --git a/src/common/Utilities/TaskScheduler.cpp b/src/common/Utilities/TaskScheduler.cpp index ef6477422..b1c1cbd41 100644 --- a/src/common/Utilities/TaskScheduler.cpp +++ b/src/common/Utilities/TaskScheduler.cpp @@ -107,6 +107,11 @@ void TaskScheduler::Dispatch(success_t const& callback) callback(); } +bool TaskScheduler::IsGroupScheduled(group_t const group) +{ + return _task_holder.IsGroupQueued(group); +} + void TaskScheduler::TaskQueue::Push(TaskContainer&& task) { container.insert(task); @@ -159,6 +164,19 @@ void TaskScheduler::TaskQueue::ModifyIf(std::functionIsInGroup(group)) + { + return true; + } + } + + return false; +} + bool TaskScheduler::TaskQueue::IsEmpty() const { return container.empty(); diff --git a/src/common/Utilities/TaskScheduler.h b/src/common/Utilities/TaskScheduler.h index dcf1642d8..c8b7b584d 100644 --- a/src/common/Utilities/TaskScheduler.h +++ b/src/common/Utilities/TaskScheduler.h @@ -136,6 +136,9 @@ class TaskScheduler void ModifyIf(std::function const& filter); + /// Check if the group exists and is currently scheduled. + bool IsGroupQueued(group_t const group); + bool IsEmpty() const; }; @@ -260,6 +263,9 @@ public: /// Hint: Use std::initializer_list for this: "{1, 2, 3, 4}" TaskScheduler& CancelGroupsOf(std::vector const& groups); + /// Check if the group exists and is currently scheduled. + bool IsGroupScheduled(group_t const group); + /// Delays all tasks with the given duration. template TaskScheduler& DelayAll(std::chrono::duration<_Rep, _Period> const& duration) diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp index b9a9f3229..665c174eb 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp @@ -24,10 +24,15 @@ enum Murmur { EMOTE_SONIC_BOOM = 0, + SPELL_SUPPRESSION = 33332, + SPELL_SHOCKWAVE = 33686, + SPELL_SHOCKWAVE_SERVERSIDE = 33673, SPELL_RESONANCE = 33657, SPELL_MAGNETIC_PULL = 33689, SPELL_SONIC_SHOCK = 38797, SPELL_THUNDERING_STORM = 39365, + SPELL_MURMUR_WRATH_AOE = 33329, + SPELL_MURMUR_WRATH = 33331, SPELL_SONIC_BOOM_CAST_N = 33923, SPELL_SONIC_BOOM_CAST_H = 38796, @@ -36,194 +41,218 @@ enum Murmur SPELL_MURMURS_TOUCH_N = 33711, SPELL_MURMURS_TOUCH_H = 38794, - EVENT_SPELL_SONIC_BOOM = 1, - EVENT_SPELL_SONIC_BOOM_EFFECT = 2, - EVENT_SPELL_MURMURS_TOUCH = 3, - EVENT_SPELL_RESONANCE = 4, - EVENT_SPELL_MAGNETIC = 5, - EVENT_SPELL_THUNDERING = 6, - EVENT_SPELL_SONIC_SHOCK = 7 + GROUP_RESONANCE = 1, + GROUP_OOC_CAST = 2, + + GUID_MURMUR_NPCS = 1 }; -class boss_murmur : public CreatureScript +enum Creatures { -public: - boss_murmur() : CreatureScript("boss_murmur") { } + NPC_CABAL_SPELLBINDER = 18639 +}; - CreatureAI* GetAI(Creature* creature) const override +struct boss_murmur : public BossAI +{ + boss_murmur(Creature* creature) : BossAI(creature, DATA_MURMUR) { - return GetShadowLabyrinthAI(creature); + SetCombatMovement(false); + + scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); } - struct boss_murmurAI : public ScriptedAI + void Reset() override { - boss_murmurAI(Creature* creature) : ScriptedAI(creature) - { - SetCombatMovement(false); - instance = creature->GetInstanceScript(); - } + _Reset(); + me->SetHealth(me->CountPctFromMaxHealth(40)); + me->ResetPlayerDamageReq(); + CastSupressionOOC(); + } - InstanceScript* instance; - EventMap events; - - void Reset() override - { - events.Reset(); - me->SetHealth(me->CountPctFromMaxHealth(40)); - me->ResetPlayerDamageReq(); - - if (instance) - instance->SetData(DATA_MURMUREVENT, NOT_STARTED); - } - - void JustEngagedWith(Unit* /*who*/) override - { - events.ScheduleEvent(EVENT_SPELL_SONIC_BOOM, 30000); - events.ScheduleEvent(EVENT_SPELL_MURMURS_TOUCH, urand(8000, 20000)); - events.ScheduleEvent(EVENT_SPELL_RESONANCE, 5000); - events.ScheduleEvent(EVENT_SPELL_MAGNETIC, urand(15000, 30000)); - if (IsHeroic()) + void CastSupressionOOC() + { + me->m_Events.AddEventAtOffset([this] { + if (me->FindNearestCreature(NPC_CABAL_SPELLBINDER, 35.0f)) { - events.ScheduleEvent(EVENT_SPELL_THUNDERING, 15000); - events.ScheduleEvent(EVENT_SPELL_SONIC_SHOCK, 10000); + me->CastCustomSpell(SPELL_SUPPRESSION, SPELLVALUE_MAX_TARGETS, 5); + DoCastAOE(SPELL_SUPPRESSION); + CastSupressionOOC(); + } + }, 3600ms, 10900ms, GROUP_OOC_CAST); + } + + bool CanAIAttack(Unit const* victim) const override + { + return me->IsWithinMeleeRange(victim); + } + + void EnterEvadeMode(EvadeReason why) override + { + if (me->GetThreatMgr().GetThreatList().empty()) + { + BossAI::EnterEvadeMode(why); + } + } + + bool ShouldCastResonance() + { + if (Unit* victim = me->GetVictim()) + { + if (!me->IsWithinMeleeRange(victim)) + { + return true; } - if (instance) - instance->SetData(DATA_MURMUREVENT, IN_PROGRESS); - } - - void JustDied(Unit*) override - { - if (instance) - instance->SetData(DATA_MURMUREVENT, DONE); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_CASTING)) - return; - - events.Update(diff); - switch (events.ExecuteEvent()) + if (Unit* victimTarget = victim->GetVictim()) { - case EVENT_SPELL_SONIC_BOOM: - Talk(EMOTE_SONIC_BOOM); - me->CastSpell(me, DUNGEON_MODE(SPELL_SONIC_BOOM_CAST_N, SPELL_SONIC_BOOM_CAST_H), false); - events.RepeatEvent(28500); - events.DelayEvents(1500); - events.ScheduleEvent(EVENT_SPELL_SONIC_BOOM_EFFECT, 0); - return; - case EVENT_SPELL_SONIC_BOOM_EFFECT: - me->CastSpell(me, DUNGEON_MODE(SPELL_SONIC_BOOM_EFFECT_N, SPELL_SONIC_BOOM_EFFECT_H), true); - break; - case EVENT_SPELL_MURMURS_TOUCH: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 80.0f, true)) - me->CastSpell(target, DUNGEON_MODE(SPELL_MURMURS_TOUCH_N, SPELL_MURMURS_TOUCH_H), false); - events.RepeatEvent(urand(25000, 35000)); - break; - case EVENT_SPELL_RESONANCE: - if (!me->IsWithinMeleeRange(me->GetVictim())) - me->CastSpell(me, SPELL_RESONANCE, false); - events.RepeatEvent(5000); - break; - case EVENT_SPELL_MAGNETIC: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 80.0f, true)) + return victimTarget != me; + } + } + + return true; + } + + void SetGUID(ObjectGuid guid, int32 index) override + { + if (index == GUID_MURMUR_NPCS) + { + if (Creature* creature = ObjectAccessor::GetCreature(*me, guid)) + { + DoCast(creature, SPELL_MURMUR_WRATH, true); + } + } + } + + void JustEngagedWith(Unit* /*who*/) override + { + _JustEngagedWith(); + + scheduler.Schedule(30s, [this](TaskContext context) + { + Talk(EMOTE_SONIC_BOOM); + DoCastAOE(DUNGEON_MODE(SPELL_SONIC_BOOM_CAST_N, SPELL_SONIC_BOOM_CAST_H)); + + scheduler.Schedule(1500ms, [this](TaskContext) + { + DoCastAOE(DUNGEON_MODE(SPELL_SONIC_BOOM_EFFECT_N, SPELL_SONIC_BOOM_EFFECT_H), true); + }); + + context.Repeat(28500ms); + }).Schedule(8s, 20s, [this](TaskContext context) + { + DoCastRandomTarget(DUNGEON_MODE(SPELL_MURMURS_TOUCH_N, SPELL_MURMURS_TOUCH_H)); + context.Repeat(25s, 35s); + }).Schedule(15s, 30s, [this](TaskContext context) + { + if (DoCastRandomTarget(SPELL_MAGNETIC_PULL, 0, 80.0f) == SPELL_CAST_OK) + { + context.Repeat(15s, 30s); + } + else + { + context.Repeat(500ms); + } + }).Schedule(3s, [this](TaskContext context) + { + if (ShouldCastResonance()) + { + if (!scheduler.IsGroupScheduled(GROUP_RESONANCE)) + { + scheduler.Schedule(5s, 5s, GROUP_RESONANCE, [this](TaskContext context) { - me->CastSpell(target, SPELL_MAGNETIC_PULL, false); - events.RepeatEvent(urand(15000, 30000)); - return; - } - events.RepeatEvent(500); - break; - case EVENT_SPELL_THUNDERING: - me->CastSpell(me, SPELL_THUNDERING_STORM, true); - events.RepeatEvent(15000); - break; - case EVENT_SPELL_SONIC_SHOCK: - me->CastSpell(me->GetVictim(), SPELL_SONIC_SHOCK, false); - events.RepeatEvent(urand(10000, 20000)); - break; - } - - if (!me->isAttackReady()) - return; - - if (!me->IsWithinMeleeRange(me->GetVictim())) - { - ThreatContainer::StorageType threatlist = me->GetThreatMgr().GetThreatList(); - for (ThreatContainer::StorageType::const_iterator i = threatlist.begin(); i != threatlist.end(); ++i) - if (Unit* target = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid())) - if (target->IsAlive() && me->IsWithinMeleeRange(target)) + if (ShouldCastResonance()) { - me->TauntApply(target); - break; + DoCastAOE(SPELL_RESONANCE); + context.Repeat(5s); } + }); + } } - DoMeleeAttackIfReady(); - } - }; -}; + context.Repeat(); + }); -class spell_murmur_sonic_boom_effect : public SpellScriptLoader -{ -public: - spell_murmur_sonic_boom_effect() : SpellScriptLoader("spell_murmur_sonic_boom_effect") { } - - class spell_murmur_sonic_boom_effect_SpellScript : public SpellScript - { - PrepareSpellScript(spell_murmur_sonic_boom_effect_SpellScript) - - public: - spell_murmur_sonic_boom_effect_SpellScript() : SpellScript() { } - - void RecalculateDamage() + if (IsHeroic()) { - SetHitDamage(GetHitUnit()->CountPctFromMaxHealth(90)); + scheduler.Schedule(15s, [this](TaskContext context) + { + DoCastAOE(SPELL_THUNDERING_STORM); + context.Repeat(15s); + }).Schedule(10s, [this](TaskContext context) + { + DoCastVictim(SPELL_SONIC_SHOCK); + context.Repeat(10s, 20s); + }); } - void Register() override - { - OnHit += SpellHitFn(spell_murmur_sonic_boom_effect_SpellScript::RecalculateDamage); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_murmur_sonic_boom_effect_SpellScript(); + me->m_Events.CancelEventGroup(GROUP_OOC_CAST); } }; -class spell_murmur_thundering_storm : public SpellScriptLoader +class spell_murmur_thundering_storm : public SpellScript { + PrepareSpellScript(spell_murmur_thundering_storm); + + void SelectTarget(std::list& targets) + { + targets.remove_if(Acore::AllWorldObjectsInExactRange(GetCaster(), 100.0f, true)); + targets.remove_if(Acore::AllWorldObjectsInExactRange(GetCaster(), 25.0f, false)); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_murmur_thundering_storm::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } +}; + +// 33711/38794 - Murmur's Touch +class spell_murmur_touch : public AuraScript +{ + PrepareAuraScript(spell_murmur_touch); + + void HandleAfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) + { + if (GetTarget()) + { + GetTarget()->CastSpell(GetTarget(), SPELL_SHOCKWAVE, true); + GetTarget()->CastSpell(GetTarget(), SPELL_SHOCKWAVE_SERVERSIDE, true); + } + } + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_murmur_touch::HandleAfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } +}; + +class spell_murmur_sonic_boom_effect : public SpellScript +{ + PrepareSpellScript(spell_murmur_sonic_boom_effect) + public: - spell_murmur_thundering_storm() : SpellScriptLoader("spell_murmur_thundering_storm") { } + spell_murmur_sonic_boom_effect() : SpellScript() { } - class spell_murmur_thundering_storm_SpellScript : public SpellScript + void RecalculateDamage() { - PrepareSpellScript(spell_murmur_thundering_storm_SpellScript); + SetHitDamage(GetHitUnit()->CountPctFromCurHealth(80)); + } - void SelectTarget(std::list& targets) - { - targets.remove_if(Acore::AllWorldObjectsInExactRange(GetCaster(), 100.0f, true)); - targets.remove_if(Acore::AllWorldObjectsInExactRange(GetCaster(), 25.0f, false)); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_murmur_thundering_storm_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_murmur_thundering_storm_SpellScript(); + OnHit += SpellHitFn(spell_murmur_sonic_boom_effect::RecalculateDamage); } }; void AddSC_boss_murmur() { - new boss_murmur(); - new spell_murmur_sonic_boom_effect(); - new spell_murmur_thundering_storm(); + RegisterShadowLabyrinthCreatureAI(boss_murmur); + RegisterSpellScript(spell_murmur_thundering_storm); + RegisterSpellScript(spell_murmur_touch); + RegisterSpellScript(spell_murmur_sonic_boom_effect); } diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h index 49f76fa1e..b0fa42f77 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h @@ -31,8 +31,9 @@ enum slData TYPE_HELLMAW = 1, DATA_BLACKHEARTTHEINCITEREVENT = 2, DATA_GRANDMASTERVORPILEVENT = 3, - DATA_MURMUREVENT = 4, - MAX_ENCOUNTER = 5 + DATA_MURMUR = 4, + DATA_MURMUREVENT = 5, + MAX_ENCOUNTER = 6 }; enum slNPCandGO diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index e4acbc9a1..0acf396ff 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -3663,7 +3663,9 @@ class spell_gen_ds_flush_knockback : public SpellScript 60864 - Jaws of Death (spell_gen_default_count_pct_from_max_hp) 38441 - Cataclysmic Bolt (spell_gen_50pct_count_pct_from_max_hp) 66316, 67100, 67101, 67102 - Spinning Pain Spike (spell_gen_50pct_count_pct_from_max_hp) - 41360 - L5 Arcane Charge (spell_gen_100pct_count_pct_from_max_hp) */ + 41360 - L5 Arcane Charge (spell_gen_100pct_count_pct_from_max_hp) + 33711/38794 - Murmur's Touch + */ class spell_gen_count_pct_from_max_hp : public SpellScript { PrepareSpellScript(spell_gen_count_pct_from_max_hp) From 9fcacc5c06910305e0175445f486aca77a9e7c92 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Mon, 17 Apr 2023 03:21:41 +0000 Subject: [PATCH 02/16] chore(DB): import pending files Referenced commit(s): 5dcea531b5fb00c6364686bb771e23a4a9fd54db --- .../rev_1681662634958347500.sql => db_world/2023_04_17_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1681662634958347500.sql => db_world/2023_04_17_00.sql} (98%) diff --git a/data/sql/updates/pending_db_world/rev_1681662634958347500.sql b/data/sql/updates/db_world/2023_04_17_00.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1681662634958347500.sql rename to data/sql/updates/db_world/2023_04_17_00.sql index 830d551fd..5fc3f3344 100644 --- a/data/sql/updates/pending_db_world/rev_1681662634958347500.sql +++ b/data/sql/updates/db_world/2023_04_17_00.sql @@ -1,3 +1,4 @@ +-- DB update 2023_04_15_00 -> 2023_04_17_00 -- DELETE FROM `creature_template_movement` WHERE `CreatureId` IN (18708, 20657); INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Rooted`, `Flight`) VALUES From af1e878fcc9920b42684f2c308516fcfd673a115 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Mon, 17 Apr 2023 20:38:13 -0300 Subject: [PATCH 03/16] fix(Scripts/ShadowLabirynth): Fix OOC Murmur Supperssion Barrage (#15992) Co-authored-by: Gultask <100873791+Gultask@users.noreply.github.com> --- .../updates/pending_db_world/rev_1681770837660007300.sql | 6 ++++++ .../Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp | 3 +-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1681770837660007300.sql diff --git a/data/sql/updates/pending_db_world/rev_1681770837660007300.sql b/data/sql/updates/pending_db_world/rev_1681770837660007300.sql new file mode 100644 index 000000000..f186f2a7a --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1681770837660007300.sql @@ -0,0 +1,6 @@ +-- +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 1) AND (`SourceEntry` = 33332); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 33332, 0, 1, 31, 0, 3, 18639, 0, 0, 0, 0, '', 'Suppression Blast (33332) can only target a set of Entries'), +(13, 1, 33332, 0, 2, 31, 0, 3, 18634, 0, 0, 0, 0, '', 'Suppression Blast (33332) can only target a set of Entries'), +(13, 1, 33332, 0, 3, 31, 0, 3, 18632, 0, 0, 0, 0, '', 'Suppression Blast (33332) can only target a set of Entries'); diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp index 665c174eb..e69580e3c 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp @@ -77,8 +77,7 @@ struct boss_murmur : public BossAI me->m_Events.AddEventAtOffset([this] { if (me->FindNearestCreature(NPC_CABAL_SPELLBINDER, 35.0f)) { - me->CastCustomSpell(SPELL_SUPPRESSION, SPELLVALUE_MAX_TARGETS, 5); - DoCastAOE(SPELL_SUPPRESSION); + me->CastCustomSpell(SPELL_SUPPRESSION, SPELLVALUE_MAX_TARGETS, 5, (Unit*)nullptr, false); CastSupressionOOC(); } }, 3600ms, 10900ms, GROUP_OOC_CAST); From 629c0df7f1af50d58dbe633b2059e588a64cb62a Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Mon, 17 Apr 2023 23:40:45 +0000 Subject: [PATCH 04/16] chore(DB): import pending files Referenced commit(s): af1e878fcc9920b42684f2c308516fcfd673a115 --- .../rev_1681770837660007300.sql => db_world/2023_04_17_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1681770837660007300.sql => db_world/2023_04_17_01.sql} (94%) diff --git a/data/sql/updates/pending_db_world/rev_1681770837660007300.sql b/data/sql/updates/db_world/2023_04_17_01.sql similarity index 94% rename from data/sql/updates/pending_db_world/rev_1681770837660007300.sql rename to data/sql/updates/db_world/2023_04_17_01.sql index f186f2a7a..1862998c0 100644 --- a/data/sql/updates/pending_db_world/rev_1681770837660007300.sql +++ b/data/sql/updates/db_world/2023_04_17_01.sql @@ -1,3 +1,4 @@ +-- DB update 2023_04_17_00 -> 2023_04_17_01 -- DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 1) AND (`SourceEntry` = 33332); INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES From 9a5c4dfc719d05add47cdfcfdf497306cdcbbab6 Mon Sep 17 00:00:00 2001 From: avarishd <46330494+avarishd@users.noreply.github.com> Date: Tue, 18 Apr 2023 02:50:36 +0300 Subject: [PATCH 05/16] fix(DB/SAI): Power Converter not despawning. (#15957) * fix(DB/SAI): Power Converter not despawning. * fix comment --- .../updates/pending_db_world/rev_1681478008053171600.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1681478008053171600.sql diff --git a/data/sql/updates/pending_db_world/rev_1681478008053171600.sql b/data/sql/updates/pending_db_world/rev_1681478008053171600.sql new file mode 100644 index 000000000..2dab7f6bd --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1681478008053171600.sql @@ -0,0 +1,6 @@ +-- 184906 (Power Converter) +UPDATE `gameobject_template` SET `AIName` = 'SmartGameObjectAI' WHERE `entry` = 184906; + +DELETE FROM `smart_scripts` WHERE (`source_type` = 1 AND `entryorguid` = 184906); +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`, `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 +(184906, 1, 0, 0, 70, 0, 100, 0, 2, 0, 0, 0, 0, 41, 1000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Power Converter - On Gameobject State Changed - Despawn In 1000 ms'); From 530a534ca4433fedcf7286889110e14fdfdb8b09 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Mon, 17 Apr 2023 23:53:08 +0000 Subject: [PATCH 06/16] chore(DB): import pending files Referenced commit(s): 9a5c4dfc719d05add47cdfcfdf497306cdcbbab6 --- .../rev_1681478008053171600.sql => db_world/2023_04_17_02.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1681478008053171600.sql => db_world/2023_04_17_02.sql} (95%) diff --git a/data/sql/updates/pending_db_world/rev_1681478008053171600.sql b/data/sql/updates/db_world/2023_04_17_02.sql similarity index 95% rename from data/sql/updates/pending_db_world/rev_1681478008053171600.sql rename to data/sql/updates/db_world/2023_04_17_02.sql index 2dab7f6bd..c8e8f124a 100644 --- a/data/sql/updates/pending_db_world/rev_1681478008053171600.sql +++ b/data/sql/updates/db_world/2023_04_17_02.sql @@ -1,3 +1,4 @@ +-- DB update 2023_04_17_01 -> 2023_04_17_02 -- 184906 (Power Converter) UPDATE `gameobject_template` SET `AIName` = 'SmartGameObjectAI' WHERE `entry` = 184906; From 09f000e3a478e32d88166d78bb0a7b4adca469b0 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Mon, 17 Apr 2023 21:01:32 -0300 Subject: [PATCH 07/16] fix(DB/SAI): Correct Bog Overlord Trample being cast twice (#15927) Create rev_1681325343035334200.sql --- .../updates/pending_db_world/rev_1681325343035334200.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1681325343035334200.sql diff --git a/data/sql/updates/pending_db_world/rev_1681325343035334200.sql b/data/sql/updates/pending_db_world/rev_1681325343035334200.sql new file mode 100644 index 000000000..916a614b5 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1681325343035334200.sql @@ -0,0 +1,6 @@ +-- +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 21694) AND (`source_type` = 0) AND (`id` IN (2, 3, 4, 5)); +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`, `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 +(21694, 0, 2, 0, 0, 0, 100, 0, 7000, 9500, 12000, 15000, 0, 11, 40340, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bog Overlord - In Combat - Cast \'Trample\''), +(21694, 0, 3, 4, 2, 0, 100, 1, 0, 20, 0, 0, 0, 11, 8599, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bog Overlord - Between 0-20% Health - Cast \'Enrage\' (No Repeat)'), +(21694, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bog Overlord - Between 0-20% Health - Say Line 0 (No Repeat)'); From dda048d63443fee7c158c999f3060349dbf8327f Mon Sep 17 00:00:00 2001 From: Dan <83884799+elthehablo@users.noreply.github.com> Date: Tue, 18 Apr 2023 02:02:15 +0200 Subject: [PATCH 08/16] fix(Scripts/ShadowLabyrinth): fix Grandmaster Vorpil (#15962) * Vorpil ROF edit Added delay (works?) + added functionality for use of the heroic ability * fixed position matrix added orientation and used Gultask's sniffed values * added orientation values to for loops * testcommit to test rof testing to see if they removal of the delay fixes it not casting * attempt to fix shadownova visual with docastaoe instead of me->spell * attempt to solve rain of fire with separate event * extra event works. extra edits delay between events now half a second, also added delay events because rain of fire is channeled. make sure to check for correct repeat timing now. * latest changes see title * spell first then event see title * remove whitespace see title * remove creepy whitespace that is irrelevant because it was in a comment * added increase in void traveler spawns as fight goes on... as per retail sniffs by Gultask * fix timers for Vorpil according to Gultask's sniffs. draw shadows should also be random, so still needs work. schedule rain of fire inside draw shadows? * attempt to handle ROF differently it is now launched every time from the draw shadows event. --- .../boss_grandmaster_vorpil.cpp | 89 ++++++++++++++----- 1 file changed, 65 insertions(+), 24 deletions(-) diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp index f26528d9c..771de6165 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp @@ -47,18 +47,20 @@ enum GrandmasterVorpil EVENT_SPELL_SHADOWBOLT = 1, EVENT_SPELL_DRAWSHADOWS = 2, EVENT_SUMMON_TRAVELER = 3, - EVENT_SPELL_BANISH = 4 + EVENT_SPELL_BANISH = 4, + EVENT_SPELL_RAIN_OF_FIRE = 5 }; -float VorpilPosition[3] = {-252.8820f, -264.3030f, 17.1f}; +float VorpilPosition[3] = {-253.548f, -263.646f, 17.0864f}; -float VoidPortalCoords[5][3] = +//x, y, z, and orientation +float VoidPortalCoords[5][4] = { - {-283.5894f, -239.5718f, 12.7f}, - {-306.5853f, -258.4539f, 12.7f}, - {-295.8789f, -269.0899f, 12.7f}, - {-209.3401f, -262.7564f, 17.1f}, - {-261.4533f, -297.3298f, 17.1f} + {-208.411f, -263.652f, 17.086313f, 3.121870040893554687f}, //portal A 33566 + {-261.676f, -297.69f, 17.087011f, 1.360249996185302734f}, //portal B 33614 + {-282.272f, -240.432f, 12.683899f, 5.580170154571533203f}, //portal C 33615 + {-291.833f, -268.595f, 12.682545f, 0.047733999788761138f}, //portal D 33567 + {-303.966f, -255.759f, 12.683404f, 6.012829780578613281f} //portal E 33616 }; class boss_grandmaster_vorpil : public CreatureScript @@ -85,6 +87,8 @@ public: bool sayIntro, sayHelp; + int count = 0; + void Reset() override { sayHelp = false; @@ -98,13 +102,13 @@ public: void summonPortals() { for (uint8 i = 0; i < 5; ++i) - me->SummonCreature(NPC_VOID_PORTAL, VoidPortalCoords[i][0], VoidPortalCoords[i][1], VoidPortalCoords[i][2], 0, TEMPSUMMON_CORPSE_DESPAWN, 3000000); + me->SummonCreature(NPC_VOID_PORTAL, VoidPortalCoords[i][0], VoidPortalCoords[i][1], VoidPortalCoords[i][2], VoidPortalCoords[i][3], TEMPSUMMON_CORPSE_DESPAWN, 3000000); } void spawnVoidTraveler() { uint8 pos = urand(0, 4); - me->SummonCreature(NPC_VOID_TRAVELER, VoidPortalCoords[pos][0], VoidPortalCoords[pos][1], VoidPortalCoords[pos][2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); + me->SummonCreature(NPC_VOID_TRAVELER, VoidPortalCoords[pos][0], VoidPortalCoords[pos][1], VoidPortalCoords[pos][2], VoidPortalCoords[pos][3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); if (!sayHelp) { Talk(SAY_HELP); @@ -112,6 +116,38 @@ public: } } + int counterVoidSpawns(int count) + { + int timer = 0; + switch(count) + { + case 1: + case 2: + timer = 13300; + break; + case 3: + timer = 12100; + break; + case 4: + timer = 10900; + break; + case 5: + case 6: + timer = 9700; + break; + case 7: + case 8: + timer = 7200; + break; + case 9: + timer = 6000; + break; + default: + timer = 4800; + } + return timer; + } + void JustSummoned(Creature* summon) override { summons.Summon(summon); @@ -141,14 +177,17 @@ public: Talk(SAY_AGGRO); summonPortals(); - events.ScheduleEvent(EVENT_SPELL_SHADOWBOLT, urand(7000, 14000)); - events.ScheduleEvent(EVENT_SPELL_DRAWSHADOWS, 45000); - events.ScheduleEvent(EVENT_SUMMON_TRAVELER, 5000); + events.ScheduleEvent(EVENT_SPELL_SHADOWBOLT, urand(9700, 20000)); + events.ScheduleEvent(EVENT_SPELL_DRAWSHADOWS, 36400); + events.ScheduleEvent(EVENT_SUMMON_TRAVELER, 10900); if (IsHeroic()) - events.ScheduleEvent(EVENT_SPELL_BANISH, 17000); - + { + events.ScheduleEvent(EVENT_SPELL_BANISH, urand(17000, 28000)); + } if (instance) + { instance->SetData(DATA_GRANDMASTERVORPILEVENT, IN_PROGRESS); + } } void MoveInLineOfSight(Unit* who) override @@ -172,19 +211,21 @@ public: { case EVENT_SPELL_SHADOWBOLT: me->CastSpell(me, SPELL_SHADOWBOLT_VOLLEY, false); - events.RepeatEvent(urand(15000, 30000)); + events.RepeatEvent(urand(9700, 20000)); break; case EVENT_SPELL_BANISH: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30, false)) me->CastSpell(target, SPELL_BANISH, false); - events.RepeatEvent(16000); + events.RepeatEvent(urand(17000, 28000)); break; case EVENT_SUMMON_TRAVELER: spawnVoidTraveler(); - events.RepeatEvent(HealthBelowPct(20) ? 5000 : 10000); + count++; + events.RepeatEvent(counterVoidSpawns(count)); break; case EVENT_SPELL_DRAWSHADOWS: { + me->CastSpell(me, SPELL_DRAW_SHADOWS, true); Map* map = me->GetMap(); Map::PlayerList const& PlayerList = map->GetPlayers(); for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) @@ -193,15 +234,15 @@ public: player->TeleportTo(me->GetMapId(), VorpilPosition[0], VorpilPosition[1], VorpilPosition[2], 0, TELE_TO_NOT_LEAVE_COMBAT); me->NearTeleportTo(VorpilPosition[0], VorpilPosition[1], VorpilPosition[2], 0.0f); - me->CastSpell(me, SPELL_DRAW_SHADOWS, true); - me->CastSpell(me, SPELL_RAIN_OF_FIRE_N); - - events.RepeatEvent(24000); - events.DelayEvents(6000); + events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, 1000); + events.RepeatEvent(urand(36400, 44950)); break; } + case EVENT_SPELL_RAIN_OF_FIRE: + me->CastSpell(me, DUNGEON_MODE(SPELL_RAIN_OF_FIRE_N, SPELL_RAIN_OF_FIRE_H)); + events.DelayEvents(6000); + break; } - DoMeleeAttackIfReady(); } }; From 9af9208d16941b48d3603ecd74f74963368f8d57 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Tue, 18 Apr 2023 00:04:52 +0000 Subject: [PATCH 09/16] chore(DB): import pending files Referenced commit(s): dda048d63443fee7c158c999f3060349dbf8327f --- .../rev_1681325343035334200.sql => db_world/2023_04_18_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1681325343035334200.sql => db_world/2023_04_18_00.sql} (96%) diff --git a/data/sql/updates/pending_db_world/rev_1681325343035334200.sql b/data/sql/updates/db_world/2023_04_18_00.sql similarity index 96% rename from data/sql/updates/pending_db_world/rev_1681325343035334200.sql rename to data/sql/updates/db_world/2023_04_18_00.sql index 916a614b5..c31f71acf 100644 --- a/data/sql/updates/pending_db_world/rev_1681325343035334200.sql +++ b/data/sql/updates/db_world/2023_04_18_00.sql @@ -1,3 +1,4 @@ +-- DB update 2023_04_17_02 -> 2023_04_18_00 -- DELETE FROM `smart_scripts` WHERE (`entryorguid` = 21694) AND (`source_type` = 0) AND (`id` IN (2, 3, 4, 5)); 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`, `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 From 5af67b384be72dbeb2ac545dd85ac427389b05c3 Mon Sep 17 00:00:00 2001 From: ZhengPeiRu21 <98835050+ZhengPeiRu21@users.noreply.github.com> Date: Mon, 17 Apr 2023 18:06:04 -0600 Subject: [PATCH 10/16] feat: Add CanPlaceAuctionBid hook (#15154) * feat: Add CanPlaceAuctionBid hook * Codestyle fix --- src/server/game/Handlers/AuctionHouseHandler.cpp | 6 ++++++ .../game/Scripting/ScriptDefines/PlayerScript.cpp | 15 +++++++++++++++ src/server/game/Scripting/ScriptMgr.h | 4 ++++ 3 files changed, 25 insertions(+) diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index abac07950..2864ec507 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -422,6 +422,12 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recvData) AuctionEntry* auction = auctionHouse->GetAuction(auctionId); Player* player = GetPlayer(); + if (!sScriptMgr->CanPlaceAuctionBid(player, auction)) + { + SendAuctionCommandResult(0, AUCTION_PLACE_BID, ERR_AUCTION_RESTRICTED_ACCOUNT); + return; + } + if (!auction || auction->owner == player->GetGUID()) { //you cannot bid your own auction: diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp index 2434ac25f..03254d66c 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp @@ -606,6 +606,21 @@ void ScriptMgr::OnQuestRewardItem(Player* player, Item* item, uint32 count) }); } +bool ScriptMgr::CanPlaceAuctionBid(Player* player, AuctionEntry* auction) +{ + auto ret = IsValidBoolScript([&](PlayerScript *script) + { + return !script->CanPlaceAuctionBid(player, auction); + }); + + if (ret && *ret) + { + return false; + } + + return true; +} + void ScriptMgr::OnGroupRollRewardItem(Player* player, Item* item, uint32 count, RollVote voteType, Roll* roll) { ExecuteScript([&](PlayerScript* script) diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index a94922d7d..103553217 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -1190,6 +1190,9 @@ public: // After receiving item as a quest reward virtual void OnQuestRewardItem(Player* /*player*/, Item* /*item*/, uint32 /*count*/) { } + // When placing a bid or buying out an auction + [[nodiscard]] virtual bool CanPlaceAuctionBid(Player* /*player*/, AuctionEntry* /*auction*/) { return true; } + // After receiving item as a group roll reward virtual void OnGroupRollRewardItem(Player* /*player*/, Item* /*item*/, uint32 /*count*/, RollVote /*voteType*/, Roll* /*roll*/) { } @@ -2290,6 +2293,7 @@ public: /* PlayerScript */ void OnStoreNewItem(Player* player, Item* item, uint32 count); void OnCreateItem(Player* player, Item* item, uint32 count); void OnQuestRewardItem(Player* player, Item* item, uint32 count); + bool CanPlaceAuctionBid(Player* player, AuctionEntry* auction); void OnGroupRollRewardItem(Player* player, Item* item, uint32 count, RollVote voteType, Roll* roll); bool OnBeforeOpenItem(Player* player, Item* item); bool OnBeforePlayerQuestComplete(Player* player, uint32 quest_id); From 87ea455bec05197e631180e7d8b5019b0f1ff645 Mon Sep 17 00:00:00 2001 From: IntelligentQuantum Date: Tue, 18 Apr 2023 03:37:59 +0330 Subject: [PATCH 11/16] feat(Core/SmartScripts): SMART_ACTION_SELF_CAST (#14371) * feat(Core/SmartScripts): SMART_ACTION_SELF_CAST * Update SmartScriptMgr.cpp --- .../rev_1671958871864691141.sql | 5 ++ .../game/AI/SmartScripts/SmartScript.cpp | 55 +++++++++++++++---- .../game/AI/SmartScripts/SmartScriptMgr.cpp | 25 +++++---- .../game/AI/SmartScripts/SmartScriptMgr.h | 9 +-- 4 files changed, 68 insertions(+), 26 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1671958871864691141.sql diff --git a/data/sql/updates/pending_db_world/rev_1671958871864691141.sql b/data/sql/updates/pending_db_world/rev_1671958871864691141.sql new file mode 100644 index 000000000..04b73a857 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1671958871864691141.sql @@ -0,0 +1,5 @@ +-- +UPDATE `smart_scripts` SET `action_type`=134 WHERE `action_type` = 85; +DELETE FROM `smart_scripts` WHERE `entryorguid`=25418 AND `source_type`=0 AND `id`=4 AND `link`=5; +DELETE FROM `smart_scripts` WHERE `entryorguid`=25416 AND `source_type`=0 AND `id`=4 AND `link`=5; +DELETE FROM `smart_scripts` WHERE `entryorguid`=33518 AND `source_type`=0 AND `id`=3 AND `link`=0; diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index eaed5823a..20e0bb47a 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -597,15 +597,15 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (caster && caster != me) // Areatrigger cast { - caster->CastSpell(target->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED)); + caster->CastSpell(target->ToUnit(), e.action.cast.spell, (e.action.cast.castFlags & SMARTCAST_TRIGGERED)); } - else if (me && (!(e.action.cast.flags & SMARTCAST_AURA_NOT_PRESENT) || !target->ToUnit()->HasAura(e.action.cast.spell))) + else if (me && (!(e.action.cast.castFlags & SMARTCAST_AURA_NOT_PRESENT) || !target->ToUnit()->HasAura(e.action.cast.spell))) { - if (e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS) + if (e.action.cast.castFlags & SMARTCAST_INTERRUPT_PREVIOUS) me->InterruptNonMeleeSpells(false); // Xinef: flag usable only if caster has max dist set - if ((e.action.cast.flags & SMARTCAST_COMBAT_MOVE) && GetCasterMaxDist() > 0.0f && me->GetMaxPower(GetCasterPowerType()) > 0) + if ((e.action.cast.castFlags & SMARTCAST_COMBAT_MOVE) && GetCasterMaxDist() > 0.0f && me->GetMaxPower(GetCasterPowerType()) > 0) { // Xinef: check mana case only and operate movement accordingly, LoS and range is checked in targetet movement generator SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(e.action.cast.spell); @@ -623,12 +623,45 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u } } - me->CastSpell(target->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED)); + me->CastSpell(target->ToUnit(), e.action.cast.spell, (e.action.cast.castFlags & SMARTCAST_TRIGGERED)); } } break; } + case SMART_ACTION_SELF_CAST: + { + if (targets.empty()) + break; + + if (e.action.cast.targetsLimit) + Acore::Containers::RandomResize(targets, e.action.cast.targetsLimit); + + TriggerCastFlags triggerFlags = TRIGGERED_NONE; + if (e.action.cast.castFlags & SMARTCAST_TRIGGERED) + { + if (e.action.cast.triggerFlags) + triggerFlags = TriggerCastFlags(e.action.cast.triggerFlags); + else + triggerFlags = TRIGGERED_FULL_MASK; + } + + for (WorldObject* target : targets) + { + Unit* uTarget = target->ToUnit(); + if (!uTarget) + continue; + + if (!(e.action.cast.castFlags & SMARTCAST_AURA_NOT_PRESENT) || !uTarget->HasAura(e.action.cast.spell)) + { + if (e.action.cast.castFlags & SMARTCAST_INTERRUPT_PREVIOUS) + uTarget->InterruptNonMeleeSpells(false); + + uTarget->CastSpell(uTarget, e.action.cast.spell, triggerFlags); + } + } + break; + } case SMART_ACTION_INVOKER_CAST: { Unit* tempLastInvoker = GetLastInvoker(unit); // xinef: can be used for area triggers cast @@ -638,7 +671,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (targets.empty()) break; - if (e.action.cast.targetsLimit > 0 && targets.size() > e.action.cast.targetsLimit) + if (e.action.cast.targetsLimit) Acore::Containers::RandomResize(targets, e.action.cast.targetsLimit); for (WorldObject* target : targets) @@ -646,12 +679,12 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!IsUnit(target)) continue; - if (!(e.action.cast.flags & SMARTCAST_AURA_NOT_PRESENT) || !target->ToUnit()->HasAura(e.action.cast.spell)) + if (!(e.action.cast.castFlags & SMARTCAST_AURA_NOT_PRESENT) || !target->ToUnit()->HasAura(e.action.cast.spell)) { - if (e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS) + if (e.action.cast.castFlags & SMARTCAST_INTERRUPT_PREVIOUS) tempLastInvoker->InterruptNonMeleeSpells(false); - tempLastInvoker->CastSpell(target->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED)); + tempLastInvoker->CastSpell(target->ToUnit(), e.action.cast.spell, (e.action.cast.castFlags & SMARTCAST_TRIGGERED)); } } @@ -4143,7 +4176,7 @@ void SmartScript::UpdateTimer(SmartScriptHolder& e, uint32 const diff) // delay spell cast event if another spell is being casted if (e.GetActionType() == SMART_ACTION_CAST) { - if (!(e.action.cast.flags & (SMARTCAST_INTERRUPT_PREVIOUS | SMARTCAST_TRIGGERED))) + if (!(e.action.cast.castFlags & (SMARTCAST_INTERRUPT_PREVIOUS | SMARTCAST_TRIGGERED))) { if (me && me->HasUnitState(UNIT_STATE_CASTING)) { @@ -4402,7 +4435,7 @@ void SmartScript::OnInitialize(WorldObject* obj, AreaTrigger const* at) } // Xinef: if smartcast combat move flag is present - if (i->GetActionType() == SMART_ACTION_CAST && (i->action.cast.flags & SMARTCAST_COMBAT_MOVE)) + if (i->GetActionType() == SMART_ACTION_CAST && (i->action.cast.castFlags & SMARTCAST_COMBAT_MOVE)) { if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i->action.cast.spell)) { diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index d4d9efa10..26d52bb23 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -409,7 +409,7 @@ bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e) case SMART_TARGET_INVOKER_PARTY: if (e.GetScriptType() != SMART_SCRIPT_TYPE_TIMED_ACTIONLIST && e.GetEventType() != SMART_EVENT_LINK && !EventHasInvoker(e.event.type)) { - LOG_ERROR("sql.sql", "SmartAIMgr: Entry {} SourceType {} Event {} Action {} has invoker target, but action does not provide any invoker!", e.entryOrGuid, e.GetScriptType(), e.GetEventType(), e.GetActionType()); + LOG_ERROR("sql.sql", "SmartAIMgr: Entry {} SourceType {} Event {} Action {} has invoker target, but event does not provide any invoker!", e.entryOrGuid, e.GetScriptType(), e.GetEventType(), e.GetActionType()); return false; } break; @@ -620,7 +620,7 @@ bool SmartAIMgr::CheckUnusedActionParams(SmartScriptHolder const& e) case SMART_ACTION_THREAT_SINGLE_PCT: return sizeof(SmartAction::threatPCT); case SMART_ACTION_THREAT_ALL_PCT: return sizeof(SmartAction::threatPCT); case SMART_ACTION_CALL_AREAEXPLOREDOREVENTHAPPENS: return sizeof(SmartAction::quest); - //case SMART_ACTION_RESERVED_16: return sizeof(SmartAction::raw); + case SMART_ACTION_RESERVED_16: return sizeof(SmartAction::raw); case SMART_ACTION_SET_EMOTE_STATE: return sizeof(SmartAction::emote); case SMART_ACTION_SET_UNIT_FLAG: return sizeof(SmartAction::unitFlag); case SMART_ACTION_REMOVE_UNIT_FLAG: return sizeof(SmartAction::unitFlag); @@ -690,6 +690,7 @@ bool SmartAIMgr::CheckUnusedActionParams(SmartScriptHolder const& e) case SMART_ACTION_ADD_NPC_FLAG: return sizeof(SmartAction::flag); case SMART_ACTION_REMOVE_NPC_FLAG: return sizeof(SmartAction::flag); case SMART_ACTION_SIMPLE_TALK: return sizeof(SmartAction::simpleTalk); + case SMART_ACTION_SELF_CAST: return sizeof(SmartAction::cast); case SMART_ACTION_INVOKER_CAST: return sizeof(SmartAction::cast); case SMART_ACTION_CROSS_CAST: return sizeof(SmartAction::crossCast); case SMART_ACTION_CALL_RANDOM_TIMED_ACTIONLIST: return sizeof(SmartAction::randTimedActionList); @@ -733,22 +734,21 @@ bool SmartAIMgr::CheckUnusedActionParams(SmartScriptHolder const& e) case SMART_ACTION_TRIGGER_RANDOM_TIMED_EVENT: return sizeof(SmartAction::randomTimedEvent); case SMART_ACTION_REMOVE_ALL_GAMEOBJECTS: return NO_PARAMS; // case SMART_ACTION_PAUSE_MOVEMENT: return sizeof(SmartAction::pauseMovement); - //case SMART_ACTION_PLAY_ANIMKIT: return sizeof(SmartAction::raw); - //case SMART_ACTION_SCENE_PLAY: return sizeof(SmartAction::raw); - //case SMART_ACTION_SCENE_CANCEL: return sizeof(SmartAction::raw); + case SMART_ACTION_PLAY_ANIMKIT: return sizeof(SmartAction::raw); + case SMART_ACTION_SCENE_PLAY: return sizeof(SmartAction::raw); + case SMART_ACTION_SCENE_CANCEL: return sizeof(SmartAction::raw); // case SMART_ACTION_SPAWN_SPAWNGROUP: return sizeof(SmartAction::groupSpawn); // case SMART_ACTION_DESPAWN_SPAWNGROUP: return sizeof(SmartAction::groupSpawn); // case SMART_ACTION_RESPAWN_BY_SPAWNID: return sizeof(SmartAction::respawnData); - // case SMART_ACTION_INVOKER_CAST: return sizeof(SmartAction::cast); case SMART_ACTION_PLAY_CINEMATIC: return sizeof(SmartAction::cinematic); case SMART_ACTION_SET_MOVEMENT_SPEED: return sizeof(SmartAction::movementSpeed); - //case SMART_ACTION_PLAY_SPELL_VISUAL_KIT: return sizeof(SmartAction::raw); + // case SMART_ACTION_PLAY_SPELL_VISUAL_KIT: return sizeof(SmartAction::raw); // case SMART_ACTION_OVERRIDE_LIGHT: return sizeof(SmartAction::overrideLight); // case SMART_ACTION_OVERRIDE_WEATHER: return sizeof(SmartAction::overrideWeather); - //case SMART_ACTION_SET_AI_ANIM_KIT: return sizeof(SmartAction::raw); + // case SMART_ACTION_SET_AI_ANIM_KIT: return sizeof(SmartAction::raw); case SMART_ACTION_SET_HOVER: return sizeof(SmartAction::setHover); case SMART_ACTION_SET_HEALTH_PCT: return sizeof(SmartAction::setHealthPct); - //case SMART_ACTION_CREATE_CONVERSATION: return sizeof(SmartAction::raw); + // case SMART_ACTION_CREATE_CONVERSATION: return sizeof(SmartAction::raw); case SMART_ACTION_MOVE_TO_POS_TARGET: return sizeof(SmartAction::moveToPos); case SMART_ACTION_EXIT_VEHICLE: return NO_PARAMS; case SMART_ACTION_SET_UNIT_MOVEMENT_FLAGS: return sizeof(SmartAction::movementFlag); @@ -1438,11 +1438,14 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) } break; } - case SMART_ACTION_CAST: case SMART_ACTION_INVOKER_CAST: - if (!IsSpellValid(e, e.action.cast.spell)) + if (e.GetScriptType() != SMART_SCRIPT_TYPE_TIMED_ACTIONLIST && e.GetEventType() != SMART_EVENT_LINK && !EventHasInvoker(e.event.type)) + { + LOG_ERROR("sql.sql", "SmartAIMgr: Entry {} SourceType {} Event {} Action {} has invoker cast action, but event does not provide any invoker!", e.entryOrGuid, e.GetScriptType(), e.GetEventType(), e.GetActionType()); return false; + } break; + case SMART_ACTION_CAST: case SMART_ACTION_CROSS_CAST: if (!IsSpellValid(e, e.action.crossCast.spell)) return false; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 40583daa5..55477d9a1 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -607,7 +607,7 @@ enum SMART_ACTION SMART_ACTION_ADD_NPC_FLAG = 82, // Flags SMART_ACTION_REMOVE_NPC_FLAG = 83, // Flags SMART_ACTION_SIMPLE_TALK = 84, // groupID, can be used to make players say groupID, Text_over event is not triggered, whisper can not be used (Target units will say the text) - SMART_ACTION_INVOKER_CAST = 85, // spellID, castFlags, if avaliable, last used invoker will cast spellId with castFlags on targets + SMART_ACTION_SELF_CAST = 85, // spellID, castFlags SMART_ACTION_CROSS_CAST = 86, // spellID, castFlags, CasterTargetType, CasterTarget param1, CasterTarget param2, CasterTarget param3, ( + the origonal target fields as Destination target), CasterTargets will cast spellID on all Targets (use with caution if targeting multiple * multiple units) SMART_ACTION_CALL_RANDOM_TIMED_ACTIONLIST = 87, // script9 ids 1-9 SMART_ACTION_CALL_RANDOM_RANGE_TIMED_ACTIONLIST = 88, // script9 id min, max @@ -656,8 +656,8 @@ enum SMART_ACTION SMART_ACTION_SPAWN_SPAWNGROUP = 131, /// @todo: NOT SUPPORTED YET SMART_ACTION_DESPAWN_SPAWNGROUP = 132, /// @todo: NOT SUPPORTED YET SMART_ACTION_RESPAWN_BY_SPAWNID = 133, /// @todo: NOT SUPPORTED YET - // SMART_ACTION_INVOKER_CAST = 134, /// @todo: solve name conflicts - SMART_ACTION_PLAY_CINEMATIC = 135, // entry + SMART_ACTION_INVOKER_CAST = 134, // spellID, castFlags + SMART_ACTION_PLAY_CINEMATIC = 135, // entry, cinematic SMART_ACTION_SET_MOVEMENT_SPEED = 136, // movementType, speedInteger, speedFraction SMART_ACTION_SET_HEALTH_PCT = 142, // percent @@ -801,7 +801,8 @@ struct SmartAction struct { uint32 spell; - uint32 flags; + uint32 castFlags; + uint32 triggerFlags; uint32 targetsLimit; } cast; From 689ba07971f0604ca71e93ec8c114312e6cb5ccd Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Tue, 18 Apr 2023 00:10:28 +0000 Subject: [PATCH 12/16] chore(DB): import pending files Referenced commit(s): 87ea455bec05197e631180e7d8b5019b0f1ff645 --- .../rev_1671958871864691141.sql => db_world/2023_04_18_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1671958871864691141.sql => db_world/2023_04_18_01.sql} (89%) diff --git a/data/sql/updates/pending_db_world/rev_1671958871864691141.sql b/data/sql/updates/db_world/2023_04_18_01.sql similarity index 89% rename from data/sql/updates/pending_db_world/rev_1671958871864691141.sql rename to data/sql/updates/db_world/2023_04_18_01.sql index 04b73a857..a504089bc 100644 --- a/data/sql/updates/pending_db_world/rev_1671958871864691141.sql +++ b/data/sql/updates/db_world/2023_04_18_01.sql @@ -1,3 +1,4 @@ +-- DB update 2023_04_18_00 -> 2023_04_18_01 -- UPDATE `smart_scripts` SET `action_type`=134 WHERE `action_type` = 85; DELETE FROM `smart_scripts` WHERE `entryorguid`=25418 AND `source_type`=0 AND `id`=4 AND `link`=5; From e38b0702393973451d6d3aff367087078b5d3250 Mon Sep 17 00:00:00 2001 From: Dan <83884799+elthehablo@users.noreply.github.com> Date: Tue, 18 Apr 2023 03:00:58 +0200 Subject: [PATCH 13/16] fix(Scripts/ShadowLabyrinth): Boss spell timers correct values (#15984) * fix(Scripts/ShadowLabyrinth): fix boss timers except Vorpil currently done: hellmaw, blackheart todo: murmur * now done hellmaw forgot to include * added murmur timers see title * Apply suggestions from code review --------- Co-authored-by: Skjalf <47818697+Nyeriah@users.noreply.github.com> --- .../boss_ambassador_hellmaw.cpp | 12 ++++++------ .../boss_blackheart_the_inciter.cpp | 10 +++++----- .../Auchindoun/ShadowLabyrinth/boss_murmur.cpp | 18 +++++++++--------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp index c56fa473f..3acaa2c65 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp @@ -98,21 +98,21 @@ struct boss_ambassador_hellmaw : public BossAI } Talk(SAY_AGGRO); - events.ScheduleEvent(EVENT_SPELL_CORROSIVE, urand(5000, 10000)); + events.ScheduleEvent(EVENT_SPELL_CORROSIVE, urand(23050, 30350)); - scheduler.Schedule(5s, 10s, [this](TaskContext context) + scheduler.Schedule(23050ms, 30350ms, [this](TaskContext context) { DoCastVictim(SPELL_CORROSIVE_ACID); - context.Repeat(15s, 25s); - }).Schedule(15s, 20s, [this](TaskContext context) + context.Repeat(23050ms, 30350ms); + }).Schedule(23s, 33s, [this](TaskContext context) { DoCastAOE(SPELL_FEAR); - context.Repeat(20s, 35s); + context.Repeat(23s, 33s); }); if (IsHeroic()) { - scheduler.Schedule(5min, [this](TaskContext) + scheduler.Schedule(3min, [this](TaskContext) { DoCastSelf(SPELL_ENRAGE, true); }); diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp index d50c42f70..58948980e 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp @@ -85,10 +85,10 @@ public: void JustEngagedWith(Unit* /*who*/) override { Talk(SAY_AGGRO); - events.ScheduleEvent(EVENT_SPELL_INCITE, 20000); + events.ScheduleEvent(EVENT_SPELL_INCITE, 24000); events.ScheduleEvent(EVENT_INCITE_WAIT, 15000); events.ScheduleEvent(EVENT_SPELL_CHARGE, 0); - events.ScheduleEvent(EVENT_SPELL_KNOCKBACK, 15000); + events.ScheduleEvent(EVENT_SPELL_KNOCKBACK, urand(16950, 26350)); if (instance) instance->SetData(DATA_BLACKHEARTTHEINCITEREVENT, IN_PROGRESS); @@ -127,18 +127,18 @@ public: DoResetThreatList(); InciteChaos = true; events.DelayEvents(15000); - events.RepeatEvent(40000); + events.RepeatEvent(urand(50000, 70000)); events.ScheduleEvent(EVENT_INCITE_WAIT, 15000); break; } case EVENT_SPELL_CHARGE: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) me->CastSpell(target, SPELL_CHARGE, false); - events.RepeatEvent(urand(15000, 25000)); + events.RepeatEvent(urand(30000, 50000)); break; case EVENT_SPELL_KNOCKBACK: me->CastSpell(me, SPELL_WAR_STOMP, false); - events.RepeatEvent(urand(18000, 24000)); + events.RepeatEvent(urand(16950, 26350)); break; } diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp index e69580e3c..81b4780cc 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp @@ -129,7 +129,7 @@ struct boss_murmur : public BossAI { _JustEngagedWith(); - scheduler.Schedule(30s, [this](TaskContext context) + scheduler.Schedule(28s, [this](TaskContext context) { Talk(EMOTE_SONIC_BOOM); DoCastAOE(DUNGEON_MODE(SPELL_SONIC_BOOM_CAST_N, SPELL_SONIC_BOOM_CAST_H)); @@ -139,11 +139,11 @@ struct boss_murmur : public BossAI DoCastAOE(DUNGEON_MODE(SPELL_SONIC_BOOM_EFFECT_N, SPELL_SONIC_BOOM_EFFECT_H), true); }); - context.Repeat(28500ms); - }).Schedule(8s, 20s, [this](TaskContext context) + context.Repeat(34s, 40s); + }).Schedule(14600ms, 25500ms, [this](TaskContext context) { DoCastRandomTarget(DUNGEON_MODE(SPELL_MURMURS_TOUCH_N, SPELL_MURMURS_TOUCH_H)); - context.Repeat(25s, 35s); + context.Repeat(14600ms, 25500ms); }).Schedule(15s, 30s, [this](TaskContext context) { if (DoCastRandomTarget(SPELL_MAGNETIC_PULL, 0, 80.0f) == SPELL_CAST_OK) @@ -165,7 +165,7 @@ struct boss_murmur : public BossAI if (ShouldCastResonance()) { DoCastAOE(SPELL_RESONANCE); - context.Repeat(5s); + context.Repeat(6s, 18s); } }); } @@ -176,14 +176,14 @@ struct boss_murmur : public BossAI if (IsHeroic()) { - scheduler.Schedule(15s, [this](TaskContext context) + scheduler.Schedule(5s, [this](TaskContext context) { DoCastAOE(SPELL_THUNDERING_STORM); - context.Repeat(15s); - }).Schedule(10s, [this](TaskContext context) + context.Repeat(6050ms, 10s); + }).Schedule(3650ms, 9150ms, [this](TaskContext context) { DoCastVictim(SPELL_SONIC_SHOCK); - context.Repeat(10s, 20s); + context.Repeat(9150ms, 10s); }); } From 570c0e84984a341ff04939eb4bd797806b4918a6 Mon Sep 17 00:00:00 2001 From: AnchyDev <35346484+AnchyDev@users.noreply.github.com> Date: Tue, 18 Apr 2023 11:10:57 +1000 Subject: [PATCH 14/16] fix(Core/Hook): Fix OnAuraRemove not being called for owned auras. (#15930) * Fix OnAuraRemove hook not being called for owned auras. * Removed OnAuraRemove from multiple places and moved to singular call. --- src/server/game/Entities/Unit/Unit.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 7e2a7fef5..2e77b6cdb 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -4575,6 +4575,8 @@ void Unit::_UnapplyAura(AuraApplicationMap::iterator& i, AuraRemoveMode removeMo // only way correctly remove all auras from list //if (removedAuras != m_removedAurasCount) new aura may be added i = m_appliedAuras.begin(); + + sScriptMgr->OnAuraRemove(this, aurApp, removeMode); } void Unit::_UnapplyAura(AuraApplication* aurApp, AuraRemoveMode removeMode) @@ -4718,8 +4720,6 @@ void Unit::RemoveAura(AuraApplicationMap::iterator& i, AuraRemoveMode mode) // Remove aura - for Area and Target auras if (aura->GetOwner() == this) aura->Remove(mode); - - sScriptMgr->OnAuraRemove(this, aurApp, mode); } void Unit::RemoveAura(uint32 spellId, ObjectGuid caster, uint8 reqEffMask, AuraRemoveMode removeMode) From b247292f985320d1b49fb10b60d484d8923d1e06 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Mon, 17 Apr 2023 23:16:10 -0300 Subject: [PATCH 15/16] fix(DB/Creature): Correct damage school of Steamvault Surgers (#15926) Create rev_1681324752444395800.sql --- data/sql/updates/pending_db_world/rev_1681324752444395800.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1681324752444395800.sql diff --git a/data/sql/updates/pending_db_world/rev_1681324752444395800.sql b/data/sql/updates/pending_db_world/rev_1681324752444395800.sql new file mode 100644 index 000000000..f870b7faa --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1681324752444395800.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `dmgschool` = 0 WHERE (`entry` IN (21695, 21696, 21916, 21917)); From 49820e475e63e42e1d5bbf936f445e2b2c807056 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Tue, 18 Apr 2023 02:19:23 +0000 Subject: [PATCH 16/16] chore(DB): import pending files Referenced commit(s): b247292f985320d1b49fb10b60d484d8923d1e06 --- .../rev_1681324752444395800.sql => db_world/2023_04_18_02.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1681324752444395800.sql => db_world/2023_04_18_02.sql} (69%) diff --git a/data/sql/updates/pending_db_world/rev_1681324752444395800.sql b/data/sql/updates/db_world/2023_04_18_02.sql similarity index 69% rename from data/sql/updates/pending_db_world/rev_1681324752444395800.sql rename to data/sql/updates/db_world/2023_04_18_02.sql index f870b7faa..55ab69151 100644 --- a/data/sql/updates/pending_db_world/rev_1681324752444395800.sql +++ b/data/sql/updates/db_world/2023_04_18_02.sql @@ -1,2 +1,3 @@ +-- DB update 2023_04_18_01 -> 2023_04_18_02 -- UPDATE `creature_template` SET `dmgschool` = 0 WHERE (`entry` IN (21695, 21696, 21916, 21917));