brackenhide full
This commit is contained in:
@@ -0,0 +1,119 @@
|
||||
/*
|
||||
* Copyright (C) WowCommunity Project
|
||||
*
|
||||
* This SourceCode is NOT free a software. Please hold everything Private
|
||||
* and read our Terms
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "SpellScript.h"
|
||||
#include "Spell.h"
|
||||
#include "SpellAuras.h"
|
||||
#include "SpellAuraEffects.h"
|
||||
#include "TemporarySummon.h"
|
||||
#include "Zone_BrackenhideHollow.h"
|
||||
|
||||
enum decatriarchspells
|
||||
{
|
||||
SPELL_DECAYING_STRENGHT = 373960,
|
||||
SPELL_ROBUST_TOTEM = 373942,
|
||||
SPELL_COOKING_ROOTCLOUD = 376170,
|
||||
SPELL_DECAY_STRIKE = 373917,
|
||||
};
|
||||
|
||||
enum decatriarchevents
|
||||
{
|
||||
EVENT_DECAYING_STRENGHT = 1, //40s
|
||||
EVENT_ROBUST_TOTEM, //16s
|
||||
EVENT_COOKING_ROOTCLOUD, //5s
|
||||
EVENT_DECAY_STRIKE = 373917, //11s
|
||||
};
|
||||
|
||||
//186121
|
||||
struct Boss_Decatriarch_Wratheye : public BossAI
|
||||
{
|
||||
Boss_Decatriarch_Wratheye(Creature* creature) : BossAI(creature, DATA_DECATRIARCH_WRATHEYE) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
events.Reset();
|
||||
}
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
|
||||
events.ScheduleEvent(EVENT_DECAYING_STRENGHT, 40s);
|
||||
events.ScheduleEvent(EVENT_ROBUST_TOTEM, 16s);
|
||||
events.ScheduleEvent(EVENT_COOKING_ROOTCLOUD, 5s);
|
||||
events.ScheduleEvent(EVENT_DECAY_STRIKE, 11s);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
{
|
||||
summons.DespawnAll();
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
|
||||
_EnterEvadeMode();
|
||||
_DespawnAtEvade();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
|
||||
|
||||
// me->SummonGameObject(380834, -3335.98f, 3654.75f, 109.633f, 2.12159f, QuaternionData(), 0s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 const diff)
|
||||
{
|
||||
scheduler.Update(diff);
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_DECAYING_STRENGHT:
|
||||
DoCastVictim(SPELL_DECAYING_STRENGHT);
|
||||
events.ScheduleEvent(EVENT_DECAYING_STRENGHT, 39s);
|
||||
break;
|
||||
case EVENT_DECAY_STRIKE:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, 0, 100.0f, true))
|
||||
{
|
||||
me->CastSpell(target, SPELL_DECAY_STRIKE);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_DECAY_STRIKE, 12s);
|
||||
break;
|
||||
case EVENT_ROBUST_TOTEM:
|
||||
DoCastVictim(SPELL_ROBUST_TOTEM);
|
||||
events.ScheduleEvent(EVENT_ROBUST_TOTEM, 16s);
|
||||
break;
|
||||
case EVENT_COOKING_ROOTCLOUD:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 100.0f, true))
|
||||
{
|
||||
me->CastSpell(target, SPELL_COOKING_ROOTCLOUD);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_COOKING_ROOTCLOUD, 5s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
void AddSC_Boss_Decatriarch_Wratheye()
|
||||
{
|
||||
RegisterBrackenhideHollowCreatureAI(Boss_Decatriarch_Wratheye);
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
/*
|
||||
* Copyright (C) WowCommunity Project
|
||||
*
|
||||
* This SourceCode is NOT free a software. Please hold everything Private
|
||||
* and read our Terms
|
||||
*/
|
||||
|
||||
#include "Zone_BrackenhideHollow.h"
|
||||
#include "AreaTriggerAI.h"
|
||||
#include "AreaTrigger.h"
|
||||
#include "InstanceScript.h"
|
||||
#include "SpellScript.h"
|
||||
#include "SpellAuraEffects.h"
|
||||
#include "SpellAuras.h"
|
||||
#include "SpellHistory.h"
|
||||
#include "Spell.h"
|
||||
#include "Player.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptMgr.h"
|
||||
|
||||
enum GutshootSpells
|
||||
{
|
||||
SPELL_CALL_HIENAS = 394540,
|
||||
SPELL_ENSNARING_TRAP_VISUAL = 385359,
|
||||
SPELL_ENSNARING_TRAP_DAMAGE = 384148,
|
||||
SPELL_MEAT_TOSS = 384416,
|
||||
SPELL_MASTER_CALL = 384633,
|
||||
SPELL_GUT_SHOOT_TANK = 384353,
|
||||
SPELL_CRIPPLING_BITE = 384577,
|
||||
};
|
||||
|
||||
enum GutshotEvents
|
||||
{
|
||||
EVENT_ENSNARING_TRAP,
|
||||
EVENT_GUTSHOOT_TANK,
|
||||
EVENT_MASTER_CALL,
|
||||
EVENT_MEAT_TOSS,
|
||||
EVENT_BITE,
|
||||
EVENT_CALL_HIENAS,
|
||||
};
|
||||
|
||||
//186116
|
||||
class Boss_Gutshoot186116 : public BossAI
|
||||
{
|
||||
public:
|
||||
Boss_Gutshoot186116(Creature* creature) : BossAI(creature, DATA_GUTSHOT)
|
||||
{
|
||||
}
|
||||
void Reset() override
|
||||
{
|
||||
events.Reset();
|
||||
}
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
|
||||
events.ScheduleEvent(EVENT_ENSNARING_TRAP, 8s);
|
||||
events.ScheduleEvent(EVENT_GUTSHOOT_TANK, 12s);
|
||||
events.ScheduleEvent(EVENT_MASTER_CALL, 16s);
|
||||
events.ScheduleEvent(EVENT_MEAT_TOSS, 20s);
|
||||
events.ScheduleEvent(EVENT_BITE, 14s);
|
||||
events.ScheduleEvent(EVENT_CALL_HIENAS, 30s);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
{
|
||||
summons.DespawnAll();
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
|
||||
_EnterEvadeMode();
|
||||
_DespawnAtEvade();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 const diff)
|
||||
{
|
||||
scheduler.Update(diff);
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_ENSNARING_TRAP:
|
||||
DoCastVictim(SPELL_ENSNARING_TRAP_VISUAL);
|
||||
DoCastVictim(SPELL_ENSNARING_TRAP_DAMAGE);
|
||||
events.ScheduleEvent(EVENT_ENSNARING_TRAP, 8s);
|
||||
break;
|
||||
case EVENT_GUTSHOOT_TANK:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, 0, 100.0f, true))
|
||||
{
|
||||
me->CastSpell(target, SPELL_GUT_SHOOT_TANK);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_GUTSHOOT_TANK, 12s);
|
||||
break;
|
||||
case EVENT_MASTER_CALL:
|
||||
DoCastVictim(SPELL_MASTER_CALL);
|
||||
events.ScheduleEvent(EVENT_MASTER_CALL, 16s);
|
||||
break;
|
||||
case EVENT_MEAT_TOSS:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 100.0f, true))
|
||||
{
|
||||
me->CastSpell(target, SPELL_MEAT_TOSS);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_MEAT_TOSS, 20s);
|
||||
break;
|
||||
case EVENT_BITE:
|
||||
DoCastVictim(SPELL_CRIPPLING_BITE);
|
||||
events.ScheduleEvent(EVENT_BITE, 14s);
|
||||
break;
|
||||
case EVENT_CALL_HIENAS:
|
||||
DoCastVictim(SPELL_CALL_HIENAS, 50, true, 0);
|
||||
events.ScheduleEvent(EVENT_BITE, 30s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_Boss_Gutshoot()
|
||||
{
|
||||
RegisterBrackenhideHollowCreatureAI(Boss_Gutshoot186116);
|
||||
}
|
||||
@@ -0,0 +1,319 @@
|
||||
/*
|
||||
* Copyright (C) WowCommunity Project
|
||||
*
|
||||
* This SourceCode is NOT free a software. Please hold everything Private
|
||||
* and read our Terms
|
||||
*/
|
||||
|
||||
#include "Zone_BrackenhideHollow.h"
|
||||
#include "AreaTriggerAI.h"
|
||||
#include "AreaTrigger.h"
|
||||
#include "InstanceScript.h"
|
||||
#include "SpellScript.h"
|
||||
#include "SpellAuraEffects.h"
|
||||
#include "SpellAuras.h"
|
||||
#include "SpellHistory.h"
|
||||
#include "Spell.h"
|
||||
#include "Player.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptMgr.h"
|
||||
|
||||
enum Spells
|
||||
{
|
||||
//Rira
|
||||
SPELL_SAVAGE_CHARGE = 381419,
|
||||
SPELL_SAVAGE_CHARGE_F = 381444, //charge in front of player then cast savage charge
|
||||
SPELL_BLADESTORM = 377827, //,381835 , 377830 damage
|
||||
SPELL_BLADESTORM_DAMAGE = 377830,
|
||||
SPELL_BLADESTORM_VISUAL = 381834, //checked visual circle
|
||||
SPELL_BLADESTORM_AURA = 377844, // fixate on player
|
||||
SPELL_CLEAVE = 377807,
|
||||
//Gashtooth
|
||||
SPELL_GASH_FRENZY_CAST = 378029, //only cast visual
|
||||
SPELL_GASH_FRENZY = 378020, //dmg 5s
|
||||
SPELL_GASH_FRENZY_MYTH = 378020, //dmg on mythic 5s
|
||||
SPELL_DECAYED_SENSES = 381694, // dmg 9s
|
||||
//Tricktotem
|
||||
SPELL_EARTHBOLT = 378155, //dmg 7s
|
||||
SPELL_GREATER_HEALING = 377950, //heal him 12s
|
||||
SPELL_GREATER_HEALING_2 = 377947,
|
||||
SPELL_BLOODFRENZY = 377965, //casted on self 18s
|
||||
};
|
||||
|
||||
enum Says
|
||||
{
|
||||
SAY_COUNTDOWN = 0
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
//RIRA
|
||||
EVENT_SAVAGE_CHARGE = 1,
|
||||
EVENT_BLADESTORM = 2,
|
||||
EVENT_CLEAVE = 3,
|
||||
//Gashtooth
|
||||
EVENT_GASH_FRENZY,
|
||||
EVENT_DECAYED_SENSES,
|
||||
//TrickTotem
|
||||
EVENT_EARTHBOLT,
|
||||
EVENT_GREATER_HEALING,
|
||||
EVENT_BLOODFRENZY,
|
||||
};
|
||||
|
||||
//186122
|
||||
struct npc_rira_hackclaw : public BossAI
|
||||
{
|
||||
npc_rira_hackclaw(Creature* creature) : BossAI(creature, DATA_RIRA_HACKLAW) { }
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
|
||||
Talk(0);
|
||||
events.ScheduleEvent(EVENT_SAVAGE_CHARGE, 8s);
|
||||
events.ScheduleEvent(EVENT_BLADESTORM, 15s);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 18s);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
{
|
||||
summons.DespawnAll();
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
|
||||
_EnterEvadeMode();
|
||||
_DespawnAtEvade();
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
Talk(4);
|
||||
BossAI::JustDied(killer);
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
scheduler.Update(diff);
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SAVAGE_CHARGE:
|
||||
DoCastVictim(SPELL_SAVAGE_CHARGE_F);
|
||||
DoCastVictim(SPELL_SAVAGE_CHARGE);
|
||||
events.ScheduleEvent(EVENT_SAVAGE_CHARGE, 10s);
|
||||
break;
|
||||
case EVENT_BLADESTORM:
|
||||
DoCastVictim(SPELL_BLADESTORM);
|
||||
DoCastVictim(SPELL_BLADESTORM_VISUAL);
|
||||
DoCastVictim(SPELL_BLADESTORM_DAMAGE, 100.0f);
|
||||
events.ScheduleEvent(EVENT_BLADESTORM, 8s);
|
||||
break;
|
||||
case EVENT_CLEAVE:
|
||||
DoCastVictim(SPELL_CLEAVE);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 13s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
//186124 gashtooth
|
||||
struct npc_gasthooth_186124 : public ScriptedAI
|
||||
{
|
||||
npc_gasthooth_186124(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
Talk(2);
|
||||
_events.ScheduleEvent(EVENT_GASH_FRENZY, 5s);
|
||||
_events.ScheduleEvent(EVENT_DECAYED_SENSES, 9s);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
Talk(1);
|
||||
}
|
||||
|
||||
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_GASH_FRENZY:
|
||||
DoCastVictim(SPELL_GASH_FRENZY_CAST);
|
||||
DoCastVictim(SPELL_GASH_FRENZY);
|
||||
_events.ScheduleEvent(EVENT_GASH_FRENZY, 6s);
|
||||
break;
|
||||
case EVENT_DECAYED_SENSES:
|
||||
DoCastVictim(SPELL_DECAYED_SENSES);
|
||||
_events.ScheduleEvent(EVENT_DECAYED_SENSES, 9s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap _events;
|
||||
};
|
||||
|
||||
//377827
|
||||
class spell_rira_bladestorm : public SpellScript
|
||||
{
|
||||
void HandleScript(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
Unit* caster = GetCaster();
|
||||
if (!caster)
|
||||
return;
|
||||
|
||||
if (Unit* target = GetHitUnit())
|
||||
{
|
||||
target->CastSpell(target, SPELL_BLADESTORM_DAMAGE, true);
|
||||
target->SetSpeed(MOVE_RUN, 0.7f);
|
||||
target->AddUnitState(UNIT_STATE_ROOT);
|
||||
target->AddAura(SPELL_BLADESTORM, target);
|
||||
target->SetAuraStack(SPELL_BLADESTORM, target, 4);
|
||||
}
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_rira_bladestorm::HandleScript, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE);
|
||||
}
|
||||
};
|
||||
|
||||
//377844
|
||||
class spell_rira_bladestorm_aura : public AuraScript
|
||||
{
|
||||
void HandlePeriodic(AuraEffect const* /*aurEff*/)
|
||||
{
|
||||
if (Unit* caster = GetCaster())
|
||||
{
|
||||
if (Unit* target = GetTarget())
|
||||
{
|
||||
int32 _damage = 0;
|
||||
std::list<Unit*> targetList;
|
||||
Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(target, target, 8.0f);
|
||||
Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(target, targetList, u_check);
|
||||
Cell::VisitAllObjects(target, searcher, 8.0f);
|
||||
for (auto itr : targetList)
|
||||
{
|
||||
if (itr->IsAlive())
|
||||
{
|
||||
_damage += itr->SpellDamageBonusTaken(caster, GetSpellInfo(), 0, SPELL_DIRECT_DAMAGE);
|
||||
caster->CastSpell(target, SPELL_BLADESTORM_DAMAGE, SPELLVALUE_BASE_POINT0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (Unit* target = GetTarget())
|
||||
{
|
||||
target->SetSpeed(MOVE_RUN, 1.0f);
|
||||
target->ClearUnitState(UNIT_STATE_ROOT);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_rira_bladestorm_aura::HandlePeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
//186125 Tricktotem
|
||||
struct npc_gasTricktotem_186125 : public ScriptedAI
|
||||
{
|
||||
npc_gasTricktotem_186125(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
Talk(5);
|
||||
_events.ScheduleEvent(EVENT_EARTHBOLT, 7s);
|
||||
_events.ScheduleEvent(EVENT_GREATER_HEALING, 12s);
|
||||
_events.ScheduleEvent(EVENT_BLOODFRENZY, 18s);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
Talk(2);
|
||||
}
|
||||
|
||||
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_EARTHBOLT:
|
||||
DoCastVictim(SPELL_EARTHBOLT);
|
||||
_events.ScheduleEvent(EVENT_EARTHBOLT, 6s);
|
||||
break;
|
||||
case EVENT_GREATER_HEALING:
|
||||
DoCastAOE(SPELL_GREATER_HEALING, 50.0f);
|
||||
DoCastSelf(SPELL_GREATER_HEALING_2);
|
||||
_events.ScheduleEvent(EVENT_GREATER_HEALING, 12s);
|
||||
break;
|
||||
case EVENT_BLOODFRENZY:
|
||||
DoCastSelf(SPELL_BLOODFRENZY);
|
||||
_events.ScheduleEvent(EVENT_BLOODFRENZY, 18s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap _events;
|
||||
};
|
||||
|
||||
void AddSC_npc_rira_hackclaw()
|
||||
{
|
||||
RegisterBrackenhideHollowCreatureAI(npc_rira_hackclaw);
|
||||
RegisterBrackenhideHollowCreatureAI(npc_gasthooth_186124);
|
||||
RegisterBrackenhideHollowCreatureAI(npc_gasTricktotem_186125);
|
||||
RegisterSpellScript(spell_rira_bladestorm);
|
||||
RegisterSpellScript(spell_rira_bladestorm_aura);
|
||||
}
|
||||
@@ -0,0 +1,269 @@
|
||||
/*
|
||||
* Copyright (C) WowCommunity Project
|
||||
*
|
||||
* This SourceCode is NOT free a software. Please hold everything Private
|
||||
* and read our Terms
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "SpellScript.h"
|
||||
#include "Spell.h"
|
||||
#include "SpellAuras.h"
|
||||
#include "SpellAuraEffects.h"
|
||||
#include "Zone_BrackenhideHollow.h"
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_CONSUME = 377222,
|
||||
SPELL_DECAY_SPRAY = 376811,
|
||||
SPELL_VINE_WHIP = 377559,
|
||||
SPELL_GRASPING_VINES = 376934,
|
||||
SPELL_DECAY_SPRAY_SUMMON = 376797,//summon 1 slime need set to 4
|
||||
SPELL_GUSHING_OOZE = 381770,//used by npc slime
|
||||
SPELL_BURST = 378057, //used by npc slime
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_CONSUME = 1,
|
||||
EVENT_DECAY_SPRAY,
|
||||
EVENT_VINE_WHIP,
|
||||
EVENT_GRASPING_VINES,
|
||||
EVENT_DECAY_SPRAY_SUMMON,
|
||||
EVENT_RESET,
|
||||
};
|
||||
|
||||
enum TreemouthNpcs
|
||||
{
|
||||
NPC_DECAY_SLIME = 192481
|
||||
};
|
||||
|
||||
enum GraspingVines
|
||||
{
|
||||
DRAG_DURATION = 4000,
|
||||
};
|
||||
|
||||
//186120
|
||||
class boss_treemouth : public BossAI
|
||||
{
|
||||
public:
|
||||
boss_treemouth(Creature* creature) : BossAI(creature, DATA_TREE_MOUTH)
|
||||
{
|
||||
}
|
||||
void Reset() override
|
||||
{
|
||||
events.Reset();
|
||||
me->RemoveAurasDueToSpell(SPELL_VINE_WHIP);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
Talk(0);
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
|
||||
events.ScheduleEvent(EVENT_CONSUME, 6s);
|
||||
events.ScheduleEvent(EVENT_DECAY_SPRAY, 10s);
|
||||
events.ScheduleEvent(SPELL_VINE_WHIP, 15s);
|
||||
events.ScheduleEvent(EVENT_DECAY_SPRAY_SUMMON, 13s);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
{
|
||||
summons.DespawnAll();
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
|
||||
_EnterEvadeMode();
|
||||
_DespawnAtEvade();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
Talk(5);
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 const diff)
|
||||
{
|
||||
scheduler.Update(diff);
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_CONSUME:
|
||||
DoCastVictim(SPELL_CONSUME);
|
||||
events.ScheduleEvent(EVENT_CONSUME, 6s);
|
||||
break;
|
||||
case EVENT_DECAY_SPRAY:
|
||||
DoCast(me->GetVictim(), SPELL_DECAY_SPRAY);
|
||||
events.ScheduleEvent(EVENT_DECAY_SPRAY, 10s);
|
||||
break;
|
||||
case SPELL_VINE_WHIP:
|
||||
DoCastVictim(SPELL_VINE_WHIP);
|
||||
events.ScheduleEvent(SPELL_VINE_WHIP, 15s);
|
||||
break;
|
||||
case EVENT_DECAY_SPRAY_SUMMON:
|
||||
DoCastVictim(SPELL_DECAY_SPRAY_SUMMON);
|
||||
events.ScheduleEvent(SPELL_DECAY_SPRAY_SUMMON, 13s);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
//npc=192481 decay slime
|
||||
class npc_decaying_slime : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_decaying_slime() : CreatureScript("npc_decaying_slime") {}
|
||||
|
||||
struct npc_decaying_slimeAI : public ScriptedAI
|
||||
{
|
||||
npc_decaying_slimeAI(Creature* creature) : ScriptedAI(creature) {}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
DoZoneInCombat();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
me->DespawnOrUnsummon();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 const /*diff*/)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
if (me->HealthBelowPct(50))
|
||||
{
|
||||
DoCast(me->GetVictim(), SPELL_GUSHING_OOZE);
|
||||
}
|
||||
else
|
||||
{
|
||||
DoCast(me, SPELL_BURST);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_decaying_slimeAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
//376811
|
||||
class spell_decay_spray : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_decay_spray() : SpellScriptLoader("spell_decay_spray") {}
|
||||
|
||||
class spell_decay_spray_AuraScript : public AuraScript
|
||||
{
|
||||
void HandleTick(AuraEffect const* aurEff)
|
||||
{
|
||||
if (Unit* caster = GetCaster())
|
||||
{
|
||||
// Check if the caster is a creature (NPC) and not a player
|
||||
if (caster->IsCreature() && !caster->ToCreature()->GetVictim())
|
||||
{
|
||||
// Find all players within the cone in front of the caster
|
||||
std::list<Player*> players;
|
||||
caster->SelectNearbyTarget();
|
||||
|
||||
for (Player* player : players)
|
||||
{
|
||||
// Inflict nature damage to each player
|
||||
caster->DealDamage(caster, player, aurEff->GetAmount(), 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_decay_spray_AuraScript::HandleTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const override
|
||||
{
|
||||
return new spell_decay_spray_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
//376934
|
||||
class spell_grasping_vines : public SpellScript
|
||||
{
|
||||
void HandleSpellEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
Unit* caster = GetCaster();
|
||||
if (!caster)
|
||||
return;
|
||||
|
||||
std::list<Player*> players;
|
||||
caster->GetPlayerListInGrid(players, 100.0f);
|
||||
|
||||
for (Player* player : players)
|
||||
{
|
||||
if (!player->IsAlive())
|
||||
continue;
|
||||
|
||||
player->SetDisableGravity(true);
|
||||
player->m_movementInfo.AddMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY);
|
||||
|
||||
player->m_Events.AddEventAtOffset([playerGuid = player->GetGUID(), casterGuid = caster->GetGUID()]()
|
||||
{
|
||||
// Use caster as the finder object
|
||||
if (Player* casterPtr = ObjectAccessor::FindConnectedPlayer(casterGuid))
|
||||
{
|
||||
if (Player* p = ObjectAccessor::GetPlayer(*casterPtr, playerGuid))
|
||||
{
|
||||
if (p->IsAlive())
|
||||
{
|
||||
p->SetDisableGravity(false);
|
||||
p->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY);
|
||||
p->CastSpell(p, SPELL_CONSUME, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}, Milliseconds(DRAG_DURATION));
|
||||
}
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHit += SpellEffectFn(spell_grasping_vines::HandleSpellEffect, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_treemouth()
|
||||
{
|
||||
RegisterBrackenhideHollowCreatureAI(boss_treemouth);
|
||||
new npc_decaying_slime();
|
||||
new spell_decay_spray();
|
||||
RegisterSpellScript(spell_grasping_vines);
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
/*
|
||||
* Copyright (C) WowCommunity Project
|
||||
*
|
||||
* This SourceCode is NOT free a software. Please hold everything Private
|
||||
* and read our Terms
|
||||
*/
|
||||
|
||||
//map 2520
|
||||
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (C) WowCommunity Project
|
||||
*
|
||||
* This SourceCode is NOT free a software. Please hold everything Private
|
||||
* and read our Terms
|
||||
*/
|
||||
|
||||
#ifndef DEF_BRACKENHIDE_HOLLOW_H
|
||||
#define DEF_BRACKENHIDE_HOLLOW_H
|
||||
|
||||
#include "CreatureAIImpl.h"
|
||||
|
||||
#define DataHeader "BRH"
|
||||
#define BRHScriptName "instance_brackenhide_hollow"
|
||||
|
||||
uint32 const EncounterCount = 4;
|
||||
|
||||
enum BRHDataTypes
|
||||
{
|
||||
// Encounters
|
||||
DATA_RIRA_HACKLAW = 0,
|
||||
DATA_TREE_MOUTH = 1,
|
||||
DATA_GUTSHOT = 2,
|
||||
DATA_DECATRIARCH_WRATHEYE = 3
|
||||
};
|
||||
|
||||
enum BRHCreatureIds
|
||||
{
|
||||
//BOSSES
|
||||
BOSS_RIRA_HACKLAW = 186122,
|
||||
BOSS_TREE_MOUTH = 186120,
|
||||
BOSS_GUTSHOT = 186116,
|
||||
BOSS_DECATRIARCH_WRATHEYE = 186121,
|
||||
};
|
||||
|
||||
template <class AI, class T>
|
||||
inline AI* GetBrackenhideHollowAI(T* obj)
|
||||
{
|
||||
return GetInstanceAI<AI>(obj, BRHScriptName);
|
||||
}
|
||||
|
||||
#define RegisterBrackenhideHollowCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetBrackenhideHollowAI)
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Copyright (C) WowCommunity Project
|
||||
*
|
||||
* This SourceCode is NOT free a software. Please hold everything Private
|
||||
* and read our Terms
|
||||
*/
|
||||
|
||||
#include "InstanceScript.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "Zone_BrackenhideHollow.h"
|
||||
|
||||
DungeonEncounterData const encounters[] =
|
||||
{
|
||||
{ DATA_GUTSHOT, {{ 2567 }} },
|
||||
{ DATA_TREE_MOUTH, {{ 2568 }} },
|
||||
{ DATA_DECATRIARCH_WRATHEYE, {{ 2569 }} },
|
||||
{ DATA_RIRA_HACKLAW, {{ 2570 }} },
|
||||
};
|
||||
|
||||
ObjectData const creatureData[] =
|
||||
{
|
||||
{ BOSS_RIRA_HACKLAW, DATA_RIRA_HACKLAW },
|
||||
{ BOSS_TREE_MOUTH, DATA_TREE_MOUTH },
|
||||
{ BOSS_GUTSHOT, DATA_GUTSHOT },
|
||||
{ BOSS_DECATRIARCH_WRATHEYE, DATA_DECATRIARCH_WRATHEYE },
|
||||
{ 0, 0 } // END
|
||||
};
|
||||
|
||||
|
||||
class instance_brackenhide_hollow : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_brackenhide_hollow() : InstanceMapScript(BRHScriptName, 2520) { }
|
||||
|
||||
struct instance_brackenhide_hollow_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_brackenhide_hollow_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
|
||||
{
|
||||
SetHeaders(DataHeader);
|
||||
SetBossNumber(EncounterCount);
|
||||
LoadDungeonEncounterData(encounters);
|
||||
}
|
||||
|
||||
void OnPlayerEnter(Player* player) override
|
||||
{
|
||||
if (!player->GetGroup() || !player->GetGroup()->GetLeaderGUID())
|
||||
return;
|
||||
}
|
||||
|
||||
void OnPlayerExit(Player* player)
|
||||
{
|
||||
if (!player->GetGroup())
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const override
|
||||
{
|
||||
return new instance_brackenhide_hollow_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_brackenhide_hollow()
|
||||
{
|
||||
new instance_brackenhide_hollow();
|
||||
}
|
||||
@@ -59,6 +59,13 @@ void AddSC_boss_Terros();
|
||||
void AddSC_boss_PrimalistCouncil();
|
||||
void AddSC_boss_Sennarth();
|
||||
|
||||
// BrackenHide Hollow
|
||||
void AddSC_instance_brackenhide_hollow();
|
||||
void AddSC_Boss_Decatriarch_Wratheye();
|
||||
void AddSC_npc_rira_hackclaw();
|
||||
void AddSC_boss_treemouth();
|
||||
void AddSC_Boss_Gutshoot();
|
||||
|
||||
// The name of this function should match:
|
||||
// void Add${NameOfDirectory}Scripts()
|
||||
void AddDragonIslesScripts()
|
||||
@@ -105,4 +112,11 @@ void AddDragonIslesScripts()
|
||||
AddSC_boss_Terros();
|
||||
AddSC_boss_PrimalistCouncil();
|
||||
AddSC_boss_Sennarth();
|
||||
|
||||
// BrackenHide Hollow
|
||||
AddSC_Boss_Decatriarch_Wratheye();
|
||||
AddSC_instance_brackenhide_hollow();
|
||||
AddSC_npc_rira_hackclaw();
|
||||
AddSC_boss_treemouth();
|
||||
AddSC_Boss_Gutshoot();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user