fix(Scripts/BlackrockSpire): Improved Kormok encounter. (#9394)

Fixes #9101
This commit is contained in:
UltraNix
2021-12-03 14:01:18 +01:00
committed by GitHub
parent 9ceedd4466
commit 1d9eea194f
5 changed files with 231 additions and 72 deletions

View File

@@ -0,0 +1,13 @@
INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1638046780431340000');
UPDATE `creature_template` SET `AiName`='', `ScriptName`='boss_kormok' WHERE `entry`=16118;
DELETE FROM `smart_scripts` WHERE `entryorguid`=16118 AND `source_type`=0;
DELETE FROM `creature_text` WHERE `creatureid`=16118;
INSERT INTO `creature_text` VALUES
(16118,0,0,'You think you can summon us? We are the ones that summon, not you! We bash you good for this and suck the marrow from your bones!',14,0,100,0,0,0,11968,0,'Kormok - Talk Summon'),
(16118,1,0,'You so little and puny... you no make good servants for Kormok!',12,0,100,0,0,0,11959,0,'Kormok - Talk Aggro'),
(16118,2,0,'%s becomes enraged!',16,0,100,0,0,0,10677,0,'Kormok - Enrage'),
(16118,3,0,'We am free! Thank you little, puny ones.',14,0,100,0,0,0,11873,0,'Kormok - Death');
UPDATE `spell_dbc` SET `Effect_1`=28, `EffectMiscValueB_1`=64 WHERE `ID` IN (27690,27691,27692,27693);

View File

@@ -0,0 +1,214 @@
/*
* This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by the
* Free Software Foundation; either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ScriptMgr.h"
#include "scholomance.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
#include "TaskScheduler.h"
enum Spells
{
SPELL_SHADOWBOLT_VOLLEY = 20741,
SPELL_BONE_SHIELD = 27688,
SPELL_SUMMON_BONE_MAGES = 27695,
SPELL_SUMMON_BONE_MAGE_FRONT_LEFT = 27696,
SPELL_SUMMON_BONE_MAGE_FRONT_RIGHT = 27697,
SPELL_SUMMON_BONE_MAGE_BACK_RIGHT = 27698,
SPELL_SUMMON_BONE_MAGE_BACK_LEFT = 27699,
SPELL_SUMMON_BONE_MINION1 = 27690,
SPELL_SUMMON_BONE_MINION2 = 27691,
SPELL_SUMMON_BONE_MINION3 = 27692,
SPELL_SUMMON_BONE_MINION4 = 27693,
SPELL_SUMMON_BONE_MINIONS = 27687
};
enum Events
{
EVENT_SHADOWBOLT_VOLLEY = 1,
EVENT_SUMMON_MINIONS
};
enum Says
{
TALK_SUMMON = 0,
TALK_AGGRO = 1,
TALK_ENRAGE = 2,
TALK_DEATH = 3
};
struct boss_kormok : public ScriptedAI
{
boss_kormok(Creature* creature) : ScriptedAI(creature), _summons(creature) {}
void Reset() override
{
_mages = false;
_scheduler.CancelAll();
_scheduler.SetValidator([this]
{
return !me->HasUnitState(UNIT_STATE_CASTING);
});
_summons.DespawnAll();
}
void IsSummonedBy(Unit* /*summoner*/) override
{
Talk(TALK_SUMMON);
_scheduler.Schedule(2s, [this](TaskContext context)
{
DoCastSelf(SPELL_BONE_SHIELD);
context.Repeat(45s);
});
}
void EnterCombat(Unit* /*who*/) override
{
Talk(TALK_AGGRO);
_scheduler.Schedule(10s, [this](TaskContext context)
{
DoCastVictim(SPELL_SHADOWBOLT_VOLLEY);
context.Repeat(15s);
})
.Schedule(15s, [this](TaskContext context)
{
DoCast(SPELL_SUMMON_BONE_MINIONS);
context.Repeat(12s);
});
}
void JustSummoned(Creature* summon) override
{
_summons.Summon(summon);
DoZoneInCombat(summon);
}
void SummonedCreatureDespawn(Creature* summon) override
{
_summons.Despawn(summon);
}
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellSchoolMask /*damageSchoolMask*/) override
{
if (!_mages && me->HealthBelowPctDamaged(25, damage))
{
_mages = true;
Talk(TALK_ENRAGE);
DoCast(SPELL_SUMMON_BONE_MAGES);
}
}
void JustDied(Unit* /*killer*/) override
{
Talk(TALK_DEATH);
}
void UpdateAI(uint32 diff) override
{
_scheduler.Update(diff);
if (!UpdateVictim())
{
return;
}
DoMeleeAttackIfReady();
}
private:
TaskScheduler _scheduler;
SummonList _summons;
bool _mages;
};
uint32 const SummonMageSpells[4] =
{
SPELL_SUMMON_BONE_MAGE_FRONT_LEFT,
SPELL_SUMMON_BONE_MAGE_FRONT_RIGHT,
SPELL_SUMMON_BONE_MAGE_BACK_RIGHT,
SPELL_SUMMON_BONE_MAGE_BACK_LEFT,
};
// 27695 - Summon Bone Mages
class spell_kormok_summon_bone_mages : public SpellScript
{
PrepareSpellScript(spell_kormok_summon_bone_mages);
bool Validate(SpellInfo const* /*spell*/) override
{
return ValidateSpellInfo(SummonMageSpells);
}
void HandleScript(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
for (uint32 i = 0; i < 2; ++i)
{
GetCaster()->CastSpell(GetCaster(), SummonMageSpells[urand(0, 3)], true);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_kormok_summon_bone_mages::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
// 27687 - Summon Bone Minions
class spell_kormok_summon_bone_minions : public SpellScript
{
PrepareSpellScript(spell_kormok_summon_bone_minions);
bool Validate(SpellInfo const* /*spell*/) override
{
return ValidateSpellInfo({ SPELL_SUMMON_BONE_MINIONS });
}
void HandleScript(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
// Possible spells to handle this not found.
for (uint32 i = 0; i < 4; ++i)
{
GetCaster()->CastSpell(GetCaster(), SPELL_SUMMON_BONE_MINION1 + i, true);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_kormok_summon_bone_minions::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
void AddSC_boss_kormok()
{
RegisterScholomanceCreatureAI(boss_kormok);
RegisterSpellScript(spell_kormok_summon_bone_mages);
RegisterSpellScript(spell_kormok_summon_bone_minions);
}

View File

@@ -289,63 +289,6 @@ public:
}
};
class spell_kormok_summon_bone_mages : SpellScriptLoader
{
public:
spell_kormok_summon_bone_mages() : SpellScriptLoader("spell_kormok_summon_bone_mages") { }
class spell_kormok_summon_bone_magesSpellScript : public SpellScript
{
PrepareSpellScript(spell_kormok_summon_bone_magesSpellScript);
void HandleScript(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
for (uint8 i = 0; i < 2; ++i)
GetCaster()->CastSpell(GetCaster(), SPELL_SUMMON_BONE_MAGE_FRONT_LEFT + urand(0, 3), true);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_kormok_summon_bone_magesSpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_kormok_summon_bone_magesSpellScript();
}
};
class spell_kormok_summon_bone_minions : SpellScriptLoader
{
public:
spell_kormok_summon_bone_minions() : SpellScriptLoader("spell_kormok_summon_bone_minions") { }
class spell_kormok_summon_bone_minionsSpellScript : public SpellScript
{
PrepareSpellScript(spell_kormok_summon_bone_minionsSpellScript);
void HandleScript(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
for (uint32 i = 0; i < 4; ++i)
GetCaster()->CastSpell(GetCaster(), SPELL_SUMMON_BONE_MINION1 + i, true);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_kormok_summon_bone_minionsSpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_kormok_summon_bone_minionsSpellScript();
}
};
class spell_scholomance_boon_of_life : public SpellScriptLoader
{
public:
@@ -525,8 +468,6 @@ void AddSC_instance_scholomance()
{
new instance_scholomance();
new spell_scholomance_fixate();
new spell_kormok_summon_bone_mages();
new spell_kormok_summon_bone_minions();
new spell_scholomance_boon_of_life();
new npc_scholomance_occultist();
}

View File

@@ -62,23 +62,12 @@ enum GameobjectIds
GO_GATE_GANDLING_UP_SOUTH = 177375
};
enum SpellIds
{
SPELL_SUMMON_BONE_MAGE_FRONT_LEFT = 27696,
SPELL_SUMMON_BONE_MAGE_FRONT_RIGHT = 27697,
SPELL_SUMMON_BONE_MAGE_BACK_RIGHT = 27698,
SPELL_SUMMON_BONE_MAGE_BACK_LEFT = 27699,
SPELL_SUMMON_BONE_MINION1 = 27690,
SPELL_SUMMON_BONE_MINION2 = 27691,
SPELL_SUMMON_BONE_MINION3 = 27692,
SPELL_SUMMON_BONE_MINION4 = 27693
};
template <class AI, class T>
inline AI* GetScholomanceAI(T* obj)
{
return GetInstanceAI<AI>(obj, ScholomanceScriptName);
}
#define RegisterScholomanceCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetScholomanceAI)
#endif

View File

@@ -97,6 +97,7 @@ void AddSC_the_scarlet_enclave_c5();
void AddSC_instance_scarlet_monastery(); //Scarlet Monastery
void AddSC_boss_kirtonos_the_herald();
void AddSC_boss_darkmaster_gandling();
void AddSC_boss_kormok();
void AddSC_instance_scholomance(); //Scholomance
void AddSC_instance_shadowfang_keep(); //Shadowfang keep
void AddSC_boss_baroness_anastari();
@@ -240,6 +241,7 @@ void AddEasternKingdomsScripts()
AddSC_instance_scarlet_monastery(); //Scarlet Monastery
AddSC_boss_kirtonos_the_herald();
AddSC_boss_darkmaster_gandling();
AddSC_boss_kormok();
AddSC_instance_scholomance(); //Scholomance
AddSC_instance_shadowfang_keep(); //Shadowfang keep
AddSC_boss_baroness_anastari();