brackenhide full

This commit is contained in:
luis
2026-02-27 22:14:13 -03:00
parent 97fefa3340
commit 77002ca1ab
8 changed files with 977 additions and 0 deletions
@@ -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();
}