From a2170f218b85bc534062835eb8d0dcb2b35ea9f0 Mon Sep 17 00:00:00 2001 From: sucofog <4pdcvicente@gmail.com> Date: Sun, 29 Oct 2017 11:23:55 +0100 Subject: [PATCH 1/2] Scripts/Northrend: fix event for quest A Suitable Test Subject (#700) * Scripts/Northrend: talk event for quest A Suitable Test Subject Ported from: https://github.com/TrinityCore/TrinityCore/commit/fda99b2972aed2b98642f8974e34c5b18f7f3676 Credits to @Wyreth and Trinitycore * [Fix] No newline at end of file --- .../rev_1509271997120618300.sql | 12 ++ src/scripts/Northrend/zone_borean_tundra.cpp | 104 ++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1509271997120618300.sql diff --git a/data/sql/updates/pending_db_world/rev_1509271997120618300.sql b/data/sql/updates/pending_db_world/rev_1509271997120618300.sql new file mode 100644 index 000000000..0144df7e1 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1509271997120618300.sql @@ -0,0 +1,12 @@ +INSERT INTO version_db_world (`sql_rev`) VALUES ('1509271997120618300'); + +-- Quest: A Suitable Test Subject (11719) +DELETE FROM `spell_script_names` WHERE `ScriptName`="spell_q11719_bloodspore_ruination_45997"; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(45997, "spell_q11719_bloodspore_ruination_45997"); + +UPDATE `creature_template` SET `ScriptName`="npc_bloodmage_laurith" WHERE `entry`=25381; + +DELETE FROM `creature_text` WHERE `entry`=25381; +INSERT INTO `creature_text` (`entry`,`GroupID`,`ID`,`Text`,`Type`,`Language`,`Probability`,`Emote`,`Duration`,`Sound`,`BroadcastTextId`,`TextRange`,`comment`) VALUES +(25381, 0, 0, "How positively awful! You were totally incapacitated? Weak? Hot flashes?", 15, 0, 100, 21, 0, 0, 24992, 0, "Bloodmage Laurith"); \ No newline at end of file diff --git a/src/scripts/Northrend/zone_borean_tundra.cpp b/src/scripts/Northrend/zone_borean_tundra.cpp index a88a56359..50db4397d 100644 --- a/src/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/scripts/Northrend/zone_borean_tundra.cpp @@ -1264,6 +1264,108 @@ public: }; +enum BloodsporeRuination +{ + NPC_BLOODMAGE_LAURITH = 25381, + SAY_BLOODMAGE_LAURITH = 0, + EVENT_TALK = 1, + EVENT_RESET_ORIENTATION +}; + +class spell_q11719_bloodspore_ruination_45997 : public SpellScriptLoader +{ +public: + spell_q11719_bloodspore_ruination_45997() : SpellScriptLoader("spell_q11719_bloodspore_ruination_45997") { } + + class spell_q11719_bloodspore_ruination_45997_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q11719_bloodspore_ruination_45997_SpellScript); + + void HandleEffect(SpellEffIndex /*effIndex*/) + { + if (Unit* caster = GetCaster()) + if (Creature* laurith = caster->FindNearestCreature(NPC_BLOODMAGE_LAURITH, 100.0f)) + laurith->AI()->SetGUID(caster->GetGUID()); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_q11719_bloodspore_ruination_45997_SpellScript::HandleEffect, EFFECT_1, SPELL_EFFECT_SEND_EVENT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_q11719_bloodspore_ruination_45997_SpellScript(); + } +}; + +class npc_bloodmage_laurith : public CreatureScript +{ +public: + npc_bloodmage_laurith() : CreatureScript("npc_bloodmage_laurith") { } + + struct npc_bloodmage_laurithAI : public ScriptedAI + { + npc_bloodmage_laurithAI(Creature* creature) : ScriptedAI(creature) { } + + void Reset() override + { + _events.Reset(); + _playerGUID = 0; + } + + void SetGUID(uint64 guid, int32 /*action*/) override + { + if (_playerGUID) + return; + + _playerGUID = guid; + + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + me->SetFacingToObject(player); + + _events.ScheduleEvent(EVENT_TALK, 1000); + } + + void UpdateAI(uint32 diff) override + { + if (UpdateVictim()) + { + DoMeleeAttackIfReady(); + return; + } + + _events.Update(diff); + + if (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_TALK: + if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + Talk(SAY_BLOODMAGE_LAURITH, player); + _playerGUID = 0; + _events.ScheduleEvent(EVENT_RESET_ORIENTATION, 5000); + break; + case EVENT_RESET_ORIENTATION: + me->SetFacingTo(me->GetHomePosition().GetOrientation()); + break; + } + } + } + + private: + EventMap _events; + uint64 _playerGUID; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_bloodmage_laurithAI(creature); + } +}; + void AddSC_borean_tundra() { // Ours @@ -1283,4 +1385,6 @@ void AddSC_borean_tundra() new npc_valiance_keep_cannoneer(); new npc_warmage_coldarra(); new npc_hidden_cultist(); + new spell_q11719_bloodspore_ruination_45997(); + new npc_bloodmage_laurith(); } From a95be19341ce777466fc0b330bd2ea2e7e56e433 Mon Sep 17 00:00:00 2001 From: Gargarensis Date: Fri, 10 Nov 2017 14:55:19 +0100 Subject: [PATCH 2/2] Molten Core - Core Hounds (#683) * fixed core hounds * removed warning * removed warning --- .../MoltenCore/boss_magmadar.cpp | 237 ++++++++++-------- 1 file changed, 136 insertions(+), 101 deletions(-) diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp b/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp index 8e4325c28..0908b5b10 100644 --- a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp +++ b/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp @@ -4,12 +4,12 @@ * Copyright (C) 2005-2009 MaNGOS */ -/* ScriptData -SDName: Boss_Magmadar -SD%Complete: 75 -SDComment: Conflag on ground nyi -SDCategory: Molten Core -EndScriptData */ + /* ScriptData + SDName: Boss_Magmadar + SD%Complete: 75 + SDComment: Conflag on ground nyi + SDCategory: Molten Core + EndScriptData */ #include "ObjectMgr.h" #include "ScriptMgr.h" @@ -18,99 +18,98 @@ EndScriptData */ enum Texts { - EMOTE_FRENZY = 0, - EMOTE_SMOLDERING = 0, - EMOTE_IGNITE = 1, + EMOTE_FRENZY = 0, + EMOTE_SMOLDERING = 0, + EMOTE_IGNITE = 1, }; enum Spells { - SPELL_FRENZY = 19451, - SPELL_MAGMA_SPIT = 19449, - SPELL_PANIC = 19408, - SPELL_LAVA_BOMB = 19428, - SPELL_SERRATED_BITE = 19771, + SPELL_FRENZY = 19451, + SPELL_MAGMA_SPIT = 19449, + SPELL_PANIC = 19408, + SPELL_LAVA_BOMB = 19428, + SPELL_SERRATED_BITE = 19771, }; enum Events { - EVENT_FRENZY = 1, - EVENT_PANIC = 2, - EVENT_LAVA_BOMB = 3, + EVENT_FRENZY = 1, + EVENT_PANIC = 2, + EVENT_LAVA_BOMB = 3, EVENT_SERRATED_BITE = 1, - EVENT_IGNITE = 2, + EVENT_IGNITE = 2, }; class boss_magmadar : public CreatureScript { - public: - boss_magmadar() : CreatureScript("boss_magmadar") { } +public: + boss_magmadar() : CreatureScript("boss_magmadar") { } - struct boss_magmadarAI : public BossAI + struct boss_magmadarAI : public BossAI + { + boss_magmadarAI(Creature* creature) : BossAI(creature, BOSS_MAGMADAR) { - boss_magmadarAI(Creature* creature) : BossAI(creature, BOSS_MAGMADAR) - { - } - - void Reset() - { - BossAI::Reset(); - DoCast(me, SPELL_MAGMA_SPIT, true); - } - - void EnterCombat(Unit* victim) - { - BossAI::EnterCombat(victim); - events.ScheduleEvent(EVENT_FRENZY, 30000); - events.ScheduleEvent(EVENT_PANIC, 20000); - events.ScheduleEvent(EVENT_LAVA_BOMB, 12000); - } - - void UpdateAI(uint32 diff) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_FRENZY: - Talk(EMOTE_FRENZY); - DoCast(me, SPELL_FRENZY); - events.ScheduleEvent(EVENT_FRENZY, 15000); - break; - case EVENT_PANIC: - DoCastVictim(SPELL_PANIC); - events.ScheduleEvent(EVENT_PANIC, 35000); - break; - case EVENT_LAVA_BOMB: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_LAVA_BOMB)) - DoCast(target, SPELL_LAVA_BOMB); - events.ScheduleEvent(EVENT_LAVA_BOMB, 12000); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_magmadarAI(creature); } + + void Reset() + { + BossAI::Reset(); + DoCast(me, SPELL_MAGMA_SPIT, true); + } + + void EnterCombat(Unit* victim) + { + BossAI::EnterCombat(victim); + events.ScheduleEvent(EVENT_FRENZY, 30000); + events.ScheduleEvent(EVENT_PANIC, 20000); + events.ScheduleEvent(EVENT_LAVA_BOMB, 12000); + } + + void UpdateAI(uint32 diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_FRENZY: + Talk(EMOTE_FRENZY); + DoCast(me, SPELL_FRENZY); + events.ScheduleEvent(EVENT_FRENZY, 15000); + break; + case EVENT_PANIC: + DoCastVictim(SPELL_PANIC); + events.ScheduleEvent(EVENT_PANIC, 35000); + break; + case EVENT_LAVA_BOMB: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_LAVA_BOMB)) + DoCast(target, SPELL_LAVA_BOMB); + events.ScheduleEvent(EVENT_LAVA_BOMB, 12000); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_magmadarAI(creature); + } }; -// Smoldering animation is an hack, Serrated Bites timer may be wrong -// The original smoldering aura should increase crit chance to 100% and play dead animation +// Serrated Bites timer may be wrong class npc_magmadar_core_hound : public CreatureScript { public: @@ -123,19 +122,38 @@ public: } EventMap events; - bool smoldering; std::list hounds; + bool smoldering = false; + Unit* killer; - void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/) + void removeFeignDeath() { + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29); + me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); + me->RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT); + me->ClearUnitState(UNIT_STATE_DIED); + me->ClearUnitState(UNIT_STATE_CANNOT_AUTOATTACK); + me->DisableRotate(false); + } + + void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/) { if (me->HealthBelowPctDamaged(0, damage)) { if (!smoldering) { + killer = attacker; events.ScheduleEvent(EVENT_IGNITE, 10000); me->SetHealth(1); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED|UNIT_FLAG_PACIFIED); - me->AddAura(57626, me); // feign death animation, this is an hack even if the result is good + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29); + me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); + me->AddUnitMovementFlag(MOVEMENTFLAG_ROOT); + me->AddUnitState(UNIT_STATE_DIED); + me->AddUnitState(UNIT_STATE_CANNOT_AUTOATTACK); + me->DisableRotate(true); Talk(EMOTE_SMOLDERING); } damage = 0; @@ -143,20 +161,22 @@ public: } } - void Reset() - { + void Reset() { + removeFeignDeath(); + } + void JustDied(Unit* /*killer*/) { + removeFeignDeath(); } void EnterCombat(Unit* /*victim*/) { events.ScheduleEvent(EVENT_SERRATED_BITE, 10000); // timer may be wrong - smoldering = false; } void UpdateAI(uint32 diff) { - if (!UpdateVictim()) + if (!UpdateVictim() && !smoldering) return; events.Update(diff); @@ -166,34 +186,49 @@ public: switch (eventId) { case EVENT_SERRATED_BITE: - if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED)) + if (UpdateVictim() && !smoldering) { DoCast(me->GetVictim(), SPELL_SERRATED_BITE); - events.ScheduleEvent(EVENT_SERRATED_BITE, 10000); // again, timer may be wrong + events.ScheduleEvent(EVENT_SERRATED_BITE, 10000); // again, timer may be wrong + } break; case EVENT_IGNITE: - me->GetCreaturesWithEntryInRange(hounds, 100, NPC_CORE_HOUND); + smoldering = false; + me->GetCreaturesWithEntryInRange(hounds, 80, NPC_CORE_HOUND); for (Creature * i : hounds) { - if (i && i->IsAlive() && i->IsInCombat() && !i->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED)) + if (i && i->IsAlive() && i->IsInCombat() && !i->HasUnitState(UNIT_STATE_DIED)) { - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED|UNIT_FLAG_PACIFIED); - me->RemoveAura(me->GetAura(57626), AURA_REMOVE_BY_DEFAULT); - me->SetFullHealth(); - smoldering = false; Talk(EMOTE_IGNITE); + me->SetFullHealth(); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29); + me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); + me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); + me->RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT); + me->ClearUnitState(UNIT_STATE_DIED); + me->ClearUnitState(UNIT_STATE_CANNOT_AUTOATTACK); + me->DisableRotate(false); + me->AI()->AttackStart(i->GetVictim()); return; } } - Unit::Kill(me, me); + if (me->HasUnitState(UNIT_STATE_DIED)) + { + if (killer) + { + me->Kill(killer, me); + } + else + { + me->Kill(me, me); + } + } break; default: break; } } - if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED)) - return; - DoMeleeAttackIfReady(); } };