Scripts/AzureVault: Implement Leymor encounter (#28810)

This commit is contained in:
Naddley
2023-03-02 23:52:05 +01:00
committed by GitHub
parent 0026706e83
commit 1baa2f4f39
6 changed files with 822 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
/*
* This file is part of the TrinityCore 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 General Public License as published by the
* Free Software Foundation; either version 2 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 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/>.
*/
#ifndef DEF_AZURE_VAULT_H_
#define DEF_AZURE_VAULT_H_
#include "CreatureAIImpl.h"
#define DataHeader "AzureVault"
#define AVScriptName "instance_azure_vault"
uint32 const EncounterCount = 4;
enum AVDataTypes
{
// Encounters
DATA_LEYMOR = 0,
DATA_AZUREBLADE,
DATA_TELASH_GREYWING,
DATA_UMBRELSKUL,
DATA_LEYMOR_INTRO_DONE
};
enum AVCreatureIds
{
// Bosses
BOSS_LEYMOR = 186644,
BOSS_AZUREBLADE = 186739,
BOSS_TELASH_GREYWING = 199614,
BOSS_UMBRELSKUL = 186738,
// Leymor
NPC_ARCANE_TENDER = 191164,
};
enum AVGameObjectIds
{
GO_ARCANE_VAULTS_DOOR_LEYMOR_ENTRANCE = 380536,
GO_ARCANE_VAULTS_DOOR_LEYMOR_EXIT = 377951
};
template <class AI, class T>
inline AI* GetAzureVaultAI(T* obj)
{
return GetInstanceAI<AI>(obj, AVScriptName);
}
#define RegisterAzureVaultCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetAzureVaultAI)
#endif

View File

@@ -0,0 +1,573 @@
/*
* This file is part of the TrinityCore 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 General Public License as published by the
* Free Software Foundation; either version 2 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 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 "AreaTrigger.h"
#include "AreaTriggerAI.h"
#include "CreatureAI.h"
#include "CreatureAIImpl.h"
#include "InstanceScript.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
#include "SpellAuras.h"
#include "SharedDefines.h"
#include "TemporarySummon.h"
#include "azure_vault.h"
enum LeymorSpells
{
// Leymor
SPELL_STASIS = 375729,
SPELL_ARCANE_ERUPTION = 375749,
SPELL_LEY_LINE_SPROUTS = 374364,
SPELL_LEY_LINE_SPROUTS_MISSILE = 374362,
SPELL_CONSUMING_STOMP = 374720,
SPELL_CONSUMING_STOMP_DAMAGE = 374731,
SPELL_ERUPTING_FISSURE = 386660,
SPELL_ERUPTING_FISSURE_SPROUT_SELECTOR = 394154,
SPELL_EXPLOSIVE_BRAND = 374567,
SPELL_EXPLOSIVE_BRAND_DAMAGE = 374570,
SPELL_EXPLOSIVE_BRAND_KNOCKBACK = 374582,
SPELL_INFUSED_STRIKE = 374789,
// Ley-Line Sprout
SPELL_VOLATILE_SAPLING = 388654,
SPELL_LEY_LINE_SPROUT_AT = 374161,
SPELL_ARCANE_POWER = 374736,
// Volatile Sapling
SPELL_SAPPY_BURST = 375591,
// Arcane Tender
SPELL_STASIS_RITUAL = 375732,
SPELL_STASIS_RITUAL_MISSILE = 375738,
SPELL_ERRATIC_GROWTH_CHANNEL = 375596,
SPELL_WILD_ERUPTION = 375652,
SPELL_WILD_ERUPTION_MISSILE = 375650
};
enum LeymorEvents
{
// Leymor
EVENT_LEYMOR_AWAKE = 1,
EVENT_LEY_LINE_SPROUTS,
EVENT_CONSUMING_STOMP,
EVENT_ERUPTING_FISSURE,
EVENT_EXPLOSIVE_BRAND,
EVENT_INFUSED_STRIKE,
// Arcane Tender
EVENT_ERRATIC_GROWTH = 1,
EVENT_WILD_ERUPTION,
EVENT_INFUSED_GROUND,
};
enum LeymorTexts
{
SAY_ANNOUNCE_AWAKEN = 0
};
enum LeymorVisuals
{
SPELL_VISUAL_KIT_SPROUT_DEATH = 159239
};
enum LeymorNpcs
{
NPC_LEYLINE_SPROUTS = 190509
};
enum LeymorActions
{
ACTION_ARCANE_TENDER_DEATH = 1
};
// 186644 - Leymor
struct boss_leymor : public BossAI
{
boss_leymor(Creature* creature) : BossAI(creature, DATA_LEYMOR), _killedArcaneTender(0) { }
void JustAppeared() override
{
if (instance->GetData(DATA_LEYMOR_INTRO_DONE))
return;
me->SetUnitFlag(UnitFlags(UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC));
DoCastSelf(SPELL_STASIS);
}
void DoAction(int32 action) override
{
if (action == ACTION_ARCANE_TENDER_DEATH)
{
_killedArcaneTender++;
if (_killedArcaneTender >= 3)
{
instance->SetData(DATA_LEYMOR_INTRO_DONE, 1);
scheduler.Schedule(1s, [this](TaskContext /*context*/)
{
me->RemoveAurasDueToSpell(SPELL_STASIS);
me->RemoveUnitFlag(UnitFlags(UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC));
DoCastSelf(SPELL_ARCANE_ERUPTION);
Talk(SAY_ANNOUNCE_AWAKEN);
});
}
}
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
summons.DespawnAll();
_EnterEvadeMode();
_DespawnAtEvade();
}
void OnChannelFinished(SpellInfo const* spell) override
{
if (spell->Id == SPELL_CONSUMING_STOMP)
DoCastAOE(SPELL_CONSUMING_STOMP_DAMAGE, true);
};
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_LEY_LINE_SPROUTS, 3s);
events.ScheduleEvent(EVENT_CONSUMING_STOMP, 45s);
events.ScheduleEvent(EVENT_ERUPTING_FISSURE, 20s);
events.ScheduleEvent(EVENT_EXPLOSIVE_BRAND, 31s);
events.ScheduleEvent(EVENT_INFUSED_STRIKE, 10s);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
}
void UpdateAI(uint32 diff) override
{
scheduler.Update(diff);
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_LEY_LINE_SPROUTS:
DoCastSelf(SPELL_LEY_LINE_SPROUTS);
events.ScheduleEvent(EVENT_LEY_LINE_SPROUTS, 48s);
break;
case EVENT_CONSUMING_STOMP:
DoCastSelf(SPELL_CONSUMING_STOMP);
events.ScheduleEvent(EVENT_CONSUMING_STOMP, 48s);
break;
case EVENT_ERUPTING_FISSURE:
DoCastVictim(SPELL_ERUPTING_FISSURE);
events.ScheduleEvent(EVENT_ERUPTING_FISSURE, 48s);
break;
case EVENT_EXPLOSIVE_BRAND:
DoCastSelf(SPELL_EXPLOSIVE_BRAND);
events.ScheduleEvent(EVENT_EXPLOSIVE_BRAND, 48s);
break;
case EVENT_INFUSED_STRIKE:
DoCastVictim(SPELL_INFUSED_STRIKE);
events.ScheduleEvent(EVENT_INFUSED_STRIKE, 48s);
break;
default:
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
}
DoMeleeAttackIfReady();
}
private:
int32 _killedArcaneTender;
};
// 191164 - Arcane Tender
struct npc_arcane_tender : public ScriptedAI
{
npc_arcane_tender(Creature* creature) : ScriptedAI(creature) { }
void JustDied(Unit* /*killer*/) override
{
Creature* leymor = me->GetInstanceScript()->GetCreature(DATA_LEYMOR);
if (!leymor)
return;
if (!leymor->IsAIEnabled())
return;
leymor->AI()->DoAction(ACTION_ARCANE_TENDER_DEATH);
}
void JustAppeared() override
{
Creature* leymor = me->GetInstanceScript()->GetCreature(DATA_LEYMOR);
if (!leymor)
return;
DoCast(leymor, SPELL_STASIS_RITUAL);
}
void JustReachedHome() override
{
JustAppeared();
}
void Reset() override
{
_events.Reset();
}
void JustEngagedWith(Unit* /*who*/) override
{
_events.ScheduleEvent(EVENT_ERRATIC_GROWTH, 22s);
_events.ScheduleEvent(EVENT_WILD_ERUPTION, 12s);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
_events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_ERRATIC_GROWTH:
DoCastAOE(SPELL_ERRATIC_GROWTH_CHANNEL);
_events.ScheduleEvent(EVENT_ERRATIC_GROWTH, 22s);
break;
case EVENT_WILD_ERUPTION:
DoCastAOE(SPELL_WILD_ERUPTION);
_events.ScheduleEvent(EVENT_WILD_ERUPTION, 12s);
break;
default:
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
}
DoMeleeAttackIfReady();
}
private:
EventMap _events;
};
// 190509 - Ley-Line Sprout
struct npc_ley_line_sprouts : public ScriptedAI
{
npc_ley_line_sprouts(Creature* creature) : ScriptedAI(creature) { }
void JustAppeared() override
{
DoCastSelf(SPELL_LEY_LINE_SPROUT_AT);
DoCastAOE(SPELL_ARCANE_POWER, true);
}
void JustDied(Unit* /*killer*/) override
{
if (GetDifficulty() == DIFFICULTY_MYTHIC || GetDifficulty() == DIFFICULTY_MYTHIC_KEYSTONE)
DoCastAOE(SPELL_VOLATILE_SAPLING, true);
if (TempSummon* tempSummon = me->ToTempSummon())
{
if (Unit* summoner = tempSummon->GetSummonerUnit())
{
if (Aura* aura = summoner->GetAura(SPELL_ARCANE_POWER))
aura->ModStackAmount(-1);
}
}
}
void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
{
if (spellInfo->Id != SPELL_EXPLOSIVE_BRAND_DAMAGE && spellInfo->Id != SPELL_ERUPTING_FISSURE_SPROUT_SELECTOR)
return;
me->SendPlaySpellVisualKit(SPELL_VISUAL_KIT_SPROUT_DEATH, 0, 0);
me->KillSelf();
}
};
// 196559 - Volatile Sapling
struct npc_volatile_sapling : public ScriptedAI
{
npc_volatile_sapling(Creature* creature) : ScriptedAI(creature), _isSappyBurstCast(false) { }
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/)
{
if (me->GetHealth() <= damage)
{
damage = me->GetHealth() - 1;
if (!_isSappyBurstCast)
{
me->CastSpell(nullptr, SPELL_SAPPY_BURST, false);
_isSappyBurstCast = true;
}
}
}
private:
bool _isSappyBurstCast;
};
static Position const LeyLineSproutGroupOrigin[] =
{
{ -5129.39f, 1253.30f, 555.58f },
{ -5101.68f, 1253.71f, 555.90f },
{ -5114.70f, 1230.28f, 555.89f },
{ -5141.62f, 1230.33f, 555.83f },
{ -5155.62f, 1253.60f, 555.87f },
{ -5141.42f, 1276.70f, 555.89f },
{ -5114.78f, 1277.42f, 555.87f }
};
// 374364 - Ley-Line Sprouts
class spell_ley_line_sprouts : public SpellScript
{
PrepareSpellScript(spell_ley_line_sprouts);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_LEY_LINE_SPROUTS_MISSILE });
}
void HandleHit(SpellEffIndex /*effIndex*/)
{
for (Position const& pos : LeyLineSproutGroupOrigin)
{
for (int8 i = 0; i < 2; i++)
GetCaster()->CastSpell(pos, SPELL_LEY_LINE_SPROUTS_MISSILE, true);
}
}
void Register() override
{
OnEffectHit += SpellEffectFn(spell_ley_line_sprouts::HandleHit, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
// 375732 - Stasis Ritual
class spell_stasis_ritual : public AuraScript
{
PrepareAuraScript(spell_stasis_ritual);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_STASIS_RITUAL_MISSILE });
}
void HandlePeriodic(AuraEffect const* /*aurEff*/)
{
if (Unit* caster = GetCaster())
caster->CastSpell(nullptr, SPELL_STASIS_RITUAL_MISSILE, true);
}
void Register() override
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_stasis_ritual::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};
// 375652 - Wild Eruption
class spell_wild_eruption : public SpellScript
{
PrepareSpellScript(spell_wild_eruption);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_WILD_ERUPTION_MISSILE });
}
void HandleHitTarget(SpellEffIndex /*effIndex*/)
{
GetCaster()->CastSpell(*GetHitDest(), SPELL_WILD_ERUPTION_MISSILE, true);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_wild_eruption::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
// 375749 - Arcane Eruption
struct at_leymor_arcane_eruption : AreaTriggerAI
{
at_leymor_arcane_eruption(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
void OnUnitEnter(Unit* unit) override
{
if (!unit->IsPlayer())
return;
unit->ApplyMovementForce(at->GetGUID(), at->GetPosition(), -20.0f, MovementForceType::Gravity);
}
void OnUnitExit(Unit* unit) override
{
if (!unit->IsPlayer())
return;
unit->RemoveMovementForce(at->GetGUID());
}
};
// 374567 - Explosive Brand
class spell_explosive_brand : public SpellScript
{
PrepareSpellScript(spell_explosive_brand);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_EXPLOSIVE_BRAND_KNOCKBACK });
}
void HandleHit(SpellEffIndex /*effIndex*/)
{
GetCaster()->CastSpell(nullptr, SPELL_EXPLOSIVE_BRAND_KNOCKBACK, true);
}
void Register() override
{
OnEffectHit += SpellEffectFn(spell_explosive_brand::HandleHit, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
}
};
// 374567 - Explosive Brand
class spell_explosive_brand_AuraScript : public AuraScript
{
PrepareAuraScript(spell_explosive_brand_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_EXPLOSIVE_BRAND_DAMAGE });
}
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
return;
if (Unit* caster = GetCaster())
caster->CastSpell(GetTarget(), SPELL_EXPLOSIVE_BRAND_DAMAGE, true);
}
void Register() override
{
AfterEffectRemove += AuraEffectRemoveFn(spell_explosive_brand_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
// 374720 - Consuming Stomp
class spell_consuming_stomp : public AuraScript
{
PrepareAuraScript(spell_consuming_stomp);
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
GetTarget()->KillSelf();
}
void Register() override
{
AfterEffectRemove += AuraEffectRemoveFn(spell_consuming_stomp::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
}
};
// 386660 - Erupting Fissure
class spell_erupting_fissure : public SpellScript
{
PrepareSpellScript(spell_erupting_fissure);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_ERUPTING_FISSURE_SPROUT_SELECTOR });
}
void HandleHit(SpellEffIndex /*effIndex*/)
{
GetCaster()->CastSpell(*GetHitDest(), SPELL_ERUPTING_FISSURE_SPROUT_SELECTOR, true);
}
void Register() override
{
OnEffectHit += SpellEffectFn(spell_erupting_fissure::HandleHit, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
// 375591 - Sappy Burst
class spell_sappy_burst : public SpellScript
{
PrepareSpellScript(spell_sappy_burst);
void HandleHitTarget(SpellEffIndex /*effIndex*/)
{
GetCaster()->KillSelf();
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_sappy_burst::HandleHitTarget, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
void AddSC_boss_leymor()
{
// Creature
RegisterAzureVaultCreatureAI(boss_leymor);
RegisterAzureVaultCreatureAI(npc_arcane_tender);
RegisterAzureVaultCreatureAI(npc_ley_line_sprouts);
RegisterAzureVaultCreatureAI(npc_volatile_sapling);
// Spells
RegisterSpellScript(spell_ley_line_sprouts);
RegisterSpellScript(spell_stasis_ritual);
RegisterSpellScript(spell_wild_eruption);
RegisterSpellScript(spell_consuming_stomp);
RegisterSpellScript(spell_erupting_fissure);
RegisterSpellScript(spell_sappy_burst);
RegisterSpellAndAuraScriptPair(spell_explosive_brand, spell_explosive_brand_AuraScript);
// AreaTrigger
RegisterAreaTriggerAI(at_leymor_arcane_eruption);
}

View File

@@ -0,0 +1,108 @@
/*
* This file is part of the TrinityCore 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 General Public License as published by the
* Free Software Foundation; either version 2 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 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 "AreaBoundary.h"
#include "InstanceScript.h"
#include "ScriptMgr.h"
#include "azure_vault.h"
BossBoundaryData const boundaries =
{
{ DATA_LEYMOR, new CircleBoundary(Position(-5129.39f, 1253.30f), 75.0f) }
};
ObjectData const creatureData[] =
{
{ BOSS_LEYMOR, DATA_LEYMOR },
{ BOSS_AZUREBLADE, DATA_AZUREBLADE },
{ BOSS_TELASH_GREYWING, DATA_TELASH_GREYWING },
{ BOSS_UMBRELSKUL, DATA_UMBRELSKUL },
{ 0, 0 } // END
};
DoorData const doorData[] =
{
{ GO_ARCANE_VAULTS_DOOR_LEYMOR_ENTRANCE, DATA_LEYMOR, DOOR_TYPE_ROOM },
{ GO_ARCANE_VAULTS_DOOR_LEYMOR_EXIT, DATA_LEYMOR, DOOR_TYPE_PASSAGE },
{ 0, 0, DOOR_TYPE_ROOM } // END
};
DungeonEncounterData const encounters[] =
{
{ DATA_LEYMOR, {{ 2582 }} },
{ DATA_AZUREBLADE, {{ 2585 }} },
{ DATA_TELASH_GREYWING, {{ 2583 }} },
{ DATA_UMBRELSKUL, {{ 2584 }} },
};
class instance_azure_vault : public InstanceMapScript
{
public:
instance_azure_vault() : InstanceMapScript(AVScriptName, 2515) { }
struct instance_azure_vault_InstanceMapScript: public InstanceScript
{
instance_azure_vault_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
{
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadObjectData(creatureData, nullptr);
LoadDoorData(doorData);
LoadBossBoundaries(boundaries);
LoadDungeonEncounterData(encounters);
_leymorIntroDone = false;
}
uint32 GetData(uint32 dataId) const override
{
switch (dataId)
{
case DATA_LEYMOR_INTRO_DONE:
return _leymorIntroDone ? 1 : 0;
default:
break;
}
return 0;
}
void SetData(uint32 dataId, uint32 /*value*/) override
{
switch (dataId)
{
case DATA_LEYMOR_INTRO_DONE:
_leymorIntroDone = true; // no need to pass value, it will never reset to false
break;
default:
break;
}
}
private:
bool _leymorIntroDone;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
{
return new instance_azure_vault_InstanceMapScript(map);
}
};
void AddSC_instance_azure_vault()
{
new instance_azure_vault();
}

View File

@@ -22,6 +22,10 @@ void AddSC_zone_the_forbidden_reach();
void AddSC_instance_ruby_life_pools();
void AddSC_ruby_life_pools();
// Azure Vault
void AddSC_instance_azure_vault();
void AddSC_boss_leymor();
// The name of this function should match:
// void Add${NameOfDirectory}Scripts()
void AddDragonIslesScripts()
@@ -31,4 +35,8 @@ void AddDragonIslesScripts()
// Ruby Life Pools
AddSC_instance_ruby_life_pools();
AddSC_ruby_life_pools();
// Azure Vault
AddSC_instance_azure_vault();
AddSC_boss_leymor();
}