mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-21 17:54:48 +01:00
convert Botanica to new format
--HG-- branch : trunk
This commit is contained in:
@@ -25,169 +25,184 @@ EndScriptData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
|
||||
#define SAY_AGGRO -1553000
|
||||
#define SAY_KILL_1 -1553001
|
||||
#define SAY_KILL_2 -1553002
|
||||
#define SAY_TREE_1 -1553003
|
||||
#define SAY_TREE_2 -1553004
|
||||
#define SAY_DEATH -1553005
|
||||
|
||||
#define SPELL_TRANQUILITY 34550
|
||||
#define SPELL_TREE_FORM 34551
|
||||
|
||||
#define SPELL_SUMMON_FRAYER 34557
|
||||
#define ENTRY_FRAYER 19953
|
||||
|
||||
#define SPELL_PLANT_WHITE 34759
|
||||
#define SPELL_PLANT_GREEN 34761
|
||||
#define SPELL_PLANT_BLUE 34762
|
||||
#define SPELL_PLANT_RED 34763
|
||||
|
||||
struct boss_high_botanist_freywinnAI : public ScriptedAI
|
||||
enum eSays
|
||||
{
|
||||
boss_high_botanist_freywinnAI(Creature *c) : ScriptedAI(c) {}
|
||||
|
||||
std::list<uint64> Adds_List;
|
||||
|
||||
uint32 SummonSeedling_Timer;
|
||||
uint32 TreeForm_Timer;
|
||||
uint32 MoveCheck_Timer;
|
||||
uint32 DeadAddsCount;
|
||||
bool MoveFree;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Adds_List.clear();
|
||||
|
||||
SummonSeedling_Timer = 6000;
|
||||
TreeForm_Timer = 30000;
|
||||
MoveCheck_Timer = 1000;
|
||||
DeadAddsCount = 0;
|
||||
MoveFree = true;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
DoScriptText(SAY_AGGRO, me);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature *summoned)
|
||||
{
|
||||
if (summoned->GetEntry() == ENTRY_FRAYER)
|
||||
Adds_List.push_back(summoned->GetGUID());
|
||||
}
|
||||
|
||||
void DoSummonSeedling()
|
||||
{
|
||||
switch(rand()%4)
|
||||
{
|
||||
case 0: DoCast(me, SPELL_PLANT_WHITE); break;
|
||||
case 1: DoCast(me, SPELL_PLANT_GREEN); break;
|
||||
case 2: DoCast(me, SPELL_PLANT_BLUE); break;
|
||||
case 3: DoCast(me, SPELL_PLANT_RED); break;
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
DoScriptText(RAND(SAY_KILL_1,SAY_KILL_2), me);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
{
|
||||
DoScriptText(SAY_DEATH, me);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (TreeForm_Timer <= diff)
|
||||
{
|
||||
DoScriptText(RAND(SAY_TREE_1,SAY_TREE_2), me);
|
||||
|
||||
if (me->IsNonMeleeSpellCasted(false))
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
|
||||
me->RemoveAllAuras();
|
||||
|
||||
DoCast(me, SPELL_SUMMON_FRAYER, true);
|
||||
DoCast(me, SPELL_TRANQUILITY, true);
|
||||
DoCast(me, SPELL_TREE_FORM, true);
|
||||
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
MoveFree = false;
|
||||
|
||||
TreeForm_Timer = 75000;
|
||||
} else TreeForm_Timer -= diff;
|
||||
|
||||
if (!MoveFree)
|
||||
{
|
||||
if (MoveCheck_Timer <= diff)
|
||||
{
|
||||
if (!Adds_List.empty())
|
||||
{
|
||||
for (std::list<uint64>::iterator itr = Adds_List.begin(); itr != Adds_List.end(); ++itr)
|
||||
{
|
||||
if (Unit *temp = Unit::GetUnit(*me,*itr))
|
||||
{
|
||||
if (!temp->isAlive())
|
||||
{
|
||||
Adds_List.erase(itr);
|
||||
++DeadAddsCount;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (DeadAddsCount < 3 && TreeForm_Timer-30000 <= diff)
|
||||
DeadAddsCount = 3;
|
||||
|
||||
if (DeadAddsCount >= 3)
|
||||
{
|
||||
Adds_List.clear();
|
||||
DeadAddsCount = 0;
|
||||
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
me->RemoveAllAuras();
|
||||
me->GetMotionMaster()->MoveChase(me->getVictim());
|
||||
MoveFree = true;
|
||||
}
|
||||
MoveCheck_Timer = 500;
|
||||
}
|
||||
else MoveCheck_Timer -= diff;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*if (me->HasAura(SPELL_TREE_FORM,0) || me->HasAura(SPELL_TRANQUILITY,0))
|
||||
return;*/
|
||||
|
||||
//one random seedling every 5 secs, but not in tree form
|
||||
if (SummonSeedling_Timer <= diff)
|
||||
{
|
||||
DoSummonSeedling();
|
||||
SummonSeedling_Timer = 6000;
|
||||
} else SummonSeedling_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
SAY_AGGRO = -1553000,
|
||||
SAY_KILL_1 = -1553001,
|
||||
SAY_KILL_2 = -1553002,
|
||||
SAY_TREE_1 = -1553003,
|
||||
SAY_TREE_2 = -1553004,
|
||||
SAY_DEATH = -1553005,
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_high_botanist_freywinn(Creature* pCreature)
|
||||
enum eSpells
|
||||
{
|
||||
SPELL_TRANQUILITY = 34550,
|
||||
SPELL_TREE_FORM = 34551,
|
||||
SPELL_SUMMON_FRAYER = 34557,
|
||||
SPELL_PLANT_WHITE = 34759,
|
||||
SPELL_PLANT_GREEN = 34761,
|
||||
SPELL_PLANT_BLUE = 34762,
|
||||
SPELL_PLANT_RED = 34763,
|
||||
};
|
||||
|
||||
#define ENTRY_FRAYER 19953
|
||||
|
||||
class boss_high_botanist_freywinn : public CreatureScript
|
||||
{
|
||||
return new boss_high_botanist_freywinnAI (pCreature);
|
||||
}
|
||||
public:
|
||||
|
||||
boss_high_botanist_freywinn()
|
||||
: CreatureScript("boss_high_botanist_freywinn")
|
||||
{
|
||||
}
|
||||
|
||||
struct boss_high_botanist_freywinnAI : public ScriptedAI
|
||||
{
|
||||
boss_high_botanist_freywinnAI(Creature* pCreature) : ScriptedAI(pCreature) {}
|
||||
|
||||
std::list<uint64> Adds_List;
|
||||
|
||||
uint32 SummonSeedling_Timer;
|
||||
uint32 TreeForm_Timer;
|
||||
uint32 MoveCheck_Timer;
|
||||
uint32 DeadAddsCount;
|
||||
bool MoveFree;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Adds_List.clear();
|
||||
|
||||
SummonSeedling_Timer = 6000;
|
||||
TreeForm_Timer = 30000;
|
||||
MoveCheck_Timer = 1000;
|
||||
DeadAddsCount = 0;
|
||||
MoveFree = true;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
DoScriptText(SAY_AGGRO, me);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature *summoned)
|
||||
{
|
||||
if (summoned->GetEntry() == ENTRY_FRAYER)
|
||||
Adds_List.push_back(summoned->GetGUID());
|
||||
}
|
||||
|
||||
void DoSummonSeedling()
|
||||
{
|
||||
switch(rand()%4)
|
||||
{
|
||||
case 0: DoCast(me, SPELL_PLANT_WHITE); break;
|
||||
case 1: DoCast(me, SPELL_PLANT_GREEN); break;
|
||||
case 2: DoCast(me, SPELL_PLANT_BLUE); break;
|
||||
case 3: DoCast(me, SPELL_PLANT_RED); break;
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
DoScriptText(RAND(SAY_KILL_1,SAY_KILL_2), me);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
{
|
||||
DoScriptText(SAY_DEATH, me);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (TreeForm_Timer <= diff)
|
||||
{
|
||||
DoScriptText(RAND(SAY_TREE_1,SAY_TREE_2), me);
|
||||
|
||||
if (me->IsNonMeleeSpellCasted(false))
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
|
||||
me->RemoveAllAuras();
|
||||
|
||||
DoCast(me, SPELL_SUMMON_FRAYER, true);
|
||||
DoCast(me, SPELL_TRANQUILITY, true);
|
||||
DoCast(me, SPELL_TREE_FORM, true);
|
||||
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
MoveFree = false;
|
||||
|
||||
TreeForm_Timer = 75000;
|
||||
}
|
||||
else
|
||||
TreeForm_Timer -= diff;
|
||||
|
||||
if (!MoveFree)
|
||||
{
|
||||
if (MoveCheck_Timer <= diff)
|
||||
{
|
||||
if (!Adds_List.empty())
|
||||
{
|
||||
for (std::list<uint64>::iterator itr = Adds_List.begin(); itr != Adds_List.end(); ++itr)
|
||||
{
|
||||
if (Unit *temp = Unit::GetUnit(*me,*itr))
|
||||
{
|
||||
if (!temp->isAlive())
|
||||
{
|
||||
Adds_List.erase(itr);
|
||||
++DeadAddsCount;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (DeadAddsCount < 3 && TreeForm_Timer-30000 <= diff)
|
||||
DeadAddsCount = 3;
|
||||
|
||||
if (DeadAddsCount >= 3)
|
||||
{
|
||||
Adds_List.clear();
|
||||
DeadAddsCount = 0;
|
||||
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
me->RemoveAllAuras();
|
||||
me->GetMotionMaster()->MoveChase(me->getVictim());
|
||||
MoveFree = true;
|
||||
}
|
||||
MoveCheck_Timer = 500;
|
||||
}
|
||||
else
|
||||
MoveCheck_Timer -= diff;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*if (me->HasAura(SPELL_TREE_FORM,0) || me->HasAura(SPELL_TRANQUILITY,0))
|
||||
return;*/
|
||||
|
||||
//one random seedling every 5 secs, but not in tree form
|
||||
if (SummonSeedling_Timer <= diff)
|
||||
{
|
||||
DoSummonSeedling();
|
||||
SummonSeedling_Timer = 6000;
|
||||
}
|
||||
else
|
||||
SummonSeedling_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* Creature) const
|
||||
{
|
||||
return new boss_high_botanist_freywinnAI (Creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_high_botanist_freywinn()
|
||||
{
|
||||
Script *newscript;
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name = "boss_high_botanist_freywinn";
|
||||
newscript->GetAI = &GetAI_boss_high_botanist_freywinn;
|
||||
newscript->RegisterSelf();
|
||||
new boss_high_botanist_freywinn();
|
||||
}
|
||||
|
||||
|
||||
@@ -25,183 +25,200 @@ EndScriptData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
|
||||
#define EMOTE_SUMMON -1553006
|
||||
enum eSpells
|
||||
{
|
||||
SPELL_ALLERGIC_REACTION = 34697,
|
||||
SPELL_TELEPORT_SELF = 34673,
|
||||
|
||||
#define SPELL_ALLERGIC_REACTION 34697
|
||||
#define SPELL_TELEPORT_SELF 34673
|
||||
|
||||
#define SPELL_SUMMON_LASHER_1 34681
|
||||
#define SPELL_SUMMON_FLAYER_1 34682
|
||||
#define SPELL_SUMMON_LASHER_2 34684
|
||||
#define SPELL_SUMMON_FLAYER_2 34685
|
||||
#define SPELL_SUMMON_LASHER_3 34686
|
||||
#define SPELL_SUMMON_FLAYER_4 34687
|
||||
#define SPELL_SUMMON_LASHER_4 34688
|
||||
#define SPELL_SUMMON_FLAYER_3 34690
|
||||
|
||||
#define MODEL_DEFAULT 13109
|
||||
#define MODEL_ARCANE 14213
|
||||
#define MODEL_FIRE 13110
|
||||
#define MODEL_FROST 14112
|
||||
#define MODEL_NATURE 14214
|
||||
|
||||
struct boss_lajAI : public ScriptedAI
|
||||
SPELL_SUMMON_LASHER_1 = 34681,
|
||||
SPELL_SUMMON_FLAYER_1 = 34682,
|
||||
SPELL_SUMMON_LASHER_2 = 34684,
|
||||
SPELL_SUMMON_FLAYER_2 = 34685,
|
||||
SPELL_SUMMON_LASHER_3 = 34686,
|
||||
SPELL_SUMMON_FLAYER_4 = 34687,
|
||||
SPELL_SUMMON_LASHER_4 = 34688,
|
||||
SPELL_SUMMON_FLAYER_3 = 34690,
|
||||
};
|
||||
enum eOthers
|
||||
{
|
||||
boss_lajAI(Creature *c) : ScriptedAI(c) {}
|
||||
EMOTE_SUMMON = -1553006,
|
||||
MODEL_DEFAULT = 13109,
|
||||
MODEL_ARCANE = 14213,
|
||||
MODEL_FIRE = 13110,
|
||||
MODEL_FROST = 14112,
|
||||
MODEL_NATURE = 14214,
|
||||
};
|
||||
|
||||
bool CanSummon;
|
||||
uint32 Teleport_Timer;
|
||||
uint32 Summon_Timer;
|
||||
uint32 Transform_Timer;
|
||||
uint32 Allergic_Timer;
|
||||
class boss_laj : public CreatureScript
|
||||
{
|
||||
public:
|
||||
|
||||
void Reset()
|
||||
{
|
||||
me->SetDisplayId(MODEL_DEFAULT);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
|
||||
|
||||
CanSummon = false;
|
||||
Teleport_Timer = 20000;
|
||||
Summon_Timer = 2500;
|
||||
Transform_Timer = 30000;
|
||||
Allergic_Timer = 5000;
|
||||
}
|
||||
|
||||
void DoTransform()
|
||||
{
|
||||
switch(rand()%5)
|
||||
boss_laj()
|
||||
: CreatureScript("boss_laj")
|
||||
{
|
||||
case 0:
|
||||
}
|
||||
|
||||
struct boss_lajAI : public ScriptedAI
|
||||
{
|
||||
boss_lajAI(Creature* pCreature) : ScriptedAI(pCreature) {}
|
||||
|
||||
bool CanSummon;
|
||||
uint32 Teleport_Timer;
|
||||
uint32 Summon_Timer;
|
||||
uint32 Transform_Timer;
|
||||
uint32 Allergic_Timer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
me->SetDisplayId(MODEL_DEFAULT);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
|
||||
break;
|
||||
case 1:
|
||||
me->SetDisplayId(MODEL_ARCANE);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
|
||||
break;
|
||||
case 2:
|
||||
me->SetDisplayId(MODEL_FIRE);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
|
||||
break;
|
||||
case 3:
|
||||
me->SetDisplayId(MODEL_FROST);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
|
||||
break;
|
||||
case 4:
|
||||
me->SetDisplayId(MODEL_NATURE);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void DoSummons()
|
||||
{
|
||||
switch(rand()%4)
|
||||
{
|
||||
case 0:
|
||||
DoCast(me, SPELL_SUMMON_LASHER_1, true);
|
||||
DoCast(me, SPELL_SUMMON_FLAYER_1, true);
|
||||
break;
|
||||
case 1:
|
||||
DoCast(me, SPELL_SUMMON_LASHER_2, true);
|
||||
DoCast(me, SPELL_SUMMON_FLAYER_2, true);
|
||||
break;
|
||||
case 2:
|
||||
DoCast(me, SPELL_SUMMON_LASHER_3, true);
|
||||
DoCast(me, SPELL_SUMMON_FLAYER_3, true);
|
||||
break;
|
||||
case 3:
|
||||
DoCast(me, SPELL_SUMMON_LASHER_4, true);
|
||||
DoCast(me, SPELL_SUMMON_FLAYER_4, true);
|
||||
break;
|
||||
}
|
||||
CanSummon = false;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
}
|
||||
|
||||
void JustSummoned(Creature *summon)
|
||||
{
|
||||
if (summon && me->getVictim())
|
||||
summon->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0));
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (CanSummon)
|
||||
{
|
||||
if (Summon_Timer <= diff)
|
||||
{
|
||||
DoScriptText(EMOTE_SUMMON, me);
|
||||
DoSummons();
|
||||
CanSummon = false;
|
||||
Teleport_Timer = 20000;
|
||||
Summon_Timer = 2500;
|
||||
} else Summon_Timer -= diff;
|
||||
Transform_Timer = 30000;
|
||||
Allergic_Timer = 5000;
|
||||
}
|
||||
|
||||
void DoTransform()
|
||||
{
|
||||
switch(rand()%5)
|
||||
{
|
||||
case 0:
|
||||
me->SetDisplayId(MODEL_DEFAULT);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
|
||||
break;
|
||||
case 1:
|
||||
me->SetDisplayId(MODEL_ARCANE);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
|
||||
break;
|
||||
case 2:
|
||||
me->SetDisplayId(MODEL_FIRE);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
|
||||
break;
|
||||
case 3:
|
||||
me->SetDisplayId(MODEL_FROST);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
|
||||
break;
|
||||
case 4:
|
||||
me->SetDisplayId(MODEL_NATURE);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void DoSummons()
|
||||
{
|
||||
switch(rand()%4)
|
||||
{
|
||||
case 0:
|
||||
DoCast(me, SPELL_SUMMON_LASHER_1, true);
|
||||
DoCast(me, SPELL_SUMMON_FLAYER_1, true);
|
||||
break;
|
||||
case 1:
|
||||
DoCast(me, SPELL_SUMMON_LASHER_2, true);
|
||||
DoCast(me, SPELL_SUMMON_FLAYER_2, true);
|
||||
break;
|
||||
case 2:
|
||||
DoCast(me, SPELL_SUMMON_LASHER_3, true);
|
||||
DoCast(me, SPELL_SUMMON_FLAYER_3, true);
|
||||
break;
|
||||
case 3:
|
||||
DoCast(me, SPELL_SUMMON_LASHER_4, true);
|
||||
DoCast(me, SPELL_SUMMON_FLAYER_4, true);
|
||||
break;
|
||||
}
|
||||
CanSummon = false;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
}
|
||||
|
||||
void JustSummoned(Creature *summon)
|
||||
{
|
||||
if (summon && me->getVictim())
|
||||
summon->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0));
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (CanSummon)
|
||||
{
|
||||
if (Summon_Timer <= diff)
|
||||
{
|
||||
DoScriptText(EMOTE_SUMMON, me);
|
||||
DoSummons();
|
||||
Summon_Timer = 2500;
|
||||
}
|
||||
else
|
||||
Summon_Timer -= diff;
|
||||
}
|
||||
|
||||
if (Allergic_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_ALLERGIC_REACTION);
|
||||
Allergic_Timer = 25000+rand()%15000;
|
||||
}
|
||||
else
|
||||
Allergic_Timer -= diff;
|
||||
|
||||
if (Teleport_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_TELEPORT_SELF);
|
||||
Teleport_Timer = 30000+rand()%10000;
|
||||
CanSummon = true;
|
||||
}
|
||||
else
|
||||
Teleport_Timer -= diff;
|
||||
|
||||
if (Transform_Timer <= diff)
|
||||
{
|
||||
DoTransform();
|
||||
Transform_Timer = 25000+rand()%15000;
|
||||
}
|
||||
else
|
||||
Transform_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_laj(Creature* Creature) const
|
||||
{
|
||||
return new boss_lajAI (Creature);
|
||||
}
|
||||
|
||||
if (Allergic_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_ALLERGIC_REACTION);
|
||||
Allergic_Timer = 25000+rand()%15000;
|
||||
} else Allergic_Timer -= diff;
|
||||
|
||||
if (Teleport_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_TELEPORT_SELF);
|
||||
Teleport_Timer = 30000+rand()%10000;
|
||||
CanSummon = true;
|
||||
} else Teleport_Timer -= diff;
|
||||
|
||||
if (Transform_Timer <= diff)
|
||||
{
|
||||
DoTransform();
|
||||
Transform_Timer = 25000+rand()%15000;
|
||||
} else Transform_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_laj(Creature* pCreature)
|
||||
{
|
||||
return new boss_lajAI (pCreature);
|
||||
}
|
||||
|
||||
void AddSC_boss_laj()
|
||||
{
|
||||
Script *newscript;
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name = "boss_laj";
|
||||
newscript->GetAI = &GetAI_boss_laj;
|
||||
newscript->RegisterSelf();
|
||||
new boss_laj();
|
||||
}
|
||||
|
||||
|
||||
@@ -25,76 +25,30 @@ EndScriptData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
|
||||
/*#####
|
||||
# mob_treant (Sapling)
|
||||
#####*/
|
||||
|
||||
#define SPELL_HEAL_FATHER 6262
|
||||
|
||||
struct mob_treantAI : public ScriptedAI
|
||||
enum eSays
|
||||
{
|
||||
mob_treantAI (Creature *c) : ScriptedAI(c)
|
||||
{
|
||||
WarpGuid = 0;
|
||||
}
|
||||
|
||||
uint64 WarpGuid;
|
||||
uint32 check_Timer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
check_Timer = 0;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/) {}
|
||||
|
||||
void MoveInLineOfSight(Unit* /*who*/) {}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
if (WarpGuid && check_Timer <= diff)
|
||||
{
|
||||
if (Unit *Warp = Unit::GetUnit(*me, WarpGuid))
|
||||
{
|
||||
if (me->IsWithinMeleeRange(Warp,2.5f))
|
||||
{
|
||||
int32 CurrentHP_Treant = (int32)me->GetHealth();
|
||||
Warp->CastCustomSpell(Warp,SPELL_HEAL_FATHER,&CurrentHP_Treant, 0, 0, true,0 ,0, me->GetGUID());
|
||||
me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
|
||||
return;
|
||||
}
|
||||
me->GetMotionMaster()->MoveFollow(Warp,0,0);
|
||||
}
|
||||
check_Timer = 1000;
|
||||
} else check_Timer -= diff;
|
||||
return;
|
||||
}
|
||||
|
||||
if (me->getVictim()->GetGUID() != WarpGuid)
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
SAY_AGGRO = -1553007,
|
||||
SAY_SLAY_1 = -1553008,
|
||||
SAY_SLAY_2 = -1553009,
|
||||
SAY_SUMMON_1 = -1553010,
|
||||
SAY_SUMMON_2 = -1553011,
|
||||
SAY_DEATH = -1553012,
|
||||
};
|
||||
|
||||
/*#####
|
||||
# boss_warp_splinter
|
||||
#####*/
|
||||
enum eSpells
|
||||
{
|
||||
WAR_STOMP = 34716,
|
||||
SUMMON_TREANTS = 34727, // DBC: 34727, 34731, 34733, 34734, 34736, 34739, 34741 (with Ancestral Life spell 34742) // won't work (guardian summon)
|
||||
ARCANE_VOLLEY = 36705,
|
||||
ARCANE_VOLLEY_H = 39133,
|
||||
SPELL_HEAL_FATHER = 6262,
|
||||
};
|
||||
|
||||
#define SAY_AGGRO -1553007
|
||||
#define SAY_SLAY_1 -1553008
|
||||
#define SAY_SLAY_2 -1553009
|
||||
#define SAY_SUMMON_1 -1553010
|
||||
#define SAY_SUMMON_2 -1553011
|
||||
#define SAY_DEATH -1553012
|
||||
|
||||
#define WAR_STOMP 34716
|
||||
#define SUMMON_TREANTS 34727 // DBC: 34727, 34731, 34733, 34734, 34736, 34739, 34741 (with Ancestral Life spell 34742) // won't work (guardian summon)
|
||||
#define ARCANE_VOLLEY DUNGEON_MODE(36705, 39133)
|
||||
|
||||
#define CREATURE_TREANT 19949
|
||||
|
||||
#define TREANT_SPAWN_DIST 50 //50 yards from Warp Splinter's spawn point
|
||||
enum eOthers
|
||||
{
|
||||
CREATURE_TREANT = 19949,
|
||||
TREANT_SPAWN_DIST = 50, //50 yards from Warp Splinter's spawn point
|
||||
};
|
||||
|
||||
float treant_pos[6][3] =
|
||||
{
|
||||
@@ -106,113 +60,181 @@ float treant_pos[6][3] =
|
||||
{106.780159, 355.582581, -27.593357}
|
||||
};
|
||||
|
||||
struct boss_warp_splinterAI : public ScriptedAI
|
||||
/*#####
|
||||
# mob_treant (Sapling)
|
||||
#####*/
|
||||
class mob_warp_splinter_treant : public CreatureScript
|
||||
{
|
||||
boss_warp_splinterAI(Creature *c) : ScriptedAI(c)
|
||||
{
|
||||
Treant_Spawn_Pos_X = c->GetPositionX();
|
||||
Treant_Spawn_Pos_Y = c->GetPositionY();
|
||||
}
|
||||
public:
|
||||
|
||||
uint32 War_Stomp_Timer;
|
||||
uint32 Summon_Treants_Timer;
|
||||
uint32 Arcane_Volley_Timer;
|
||||
|
||||
float Treant_Spawn_Pos_X;
|
||||
float Treant_Spawn_Pos_Y;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
War_Stomp_Timer = 25000 + rand()%15000;
|
||||
Summon_Treants_Timer = 45000;
|
||||
Arcane_Volley_Timer = 8000 + rand()%12000;
|
||||
|
||||
me->SetSpeed(MOVE_RUN, 0.7f, true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
DoScriptText(SAY_AGGRO, me);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
{
|
||||
DoScriptText(SAY_DEATH, me);
|
||||
}
|
||||
|
||||
void SummonTreants()
|
||||
{
|
||||
for (uint8 i = 0; i < 6; ++i)
|
||||
mob_warp_splinter_treant()
|
||||
: CreatureScript("mob_warp_splinter_treant")
|
||||
{
|
||||
float angle = (M_PI / 3) * i;
|
||||
|
||||
float X = Treant_Spawn_Pos_X + TREANT_SPAWN_DIST * cos(angle);
|
||||
float Y = Treant_Spawn_Pos_Y + TREANT_SPAWN_DIST * sin(angle);
|
||||
float O = - me->GetAngle(X,Y);
|
||||
|
||||
if (Creature *pTreant = me->SummonCreature(CREATURE_TREANT,treant_pos[i][0],treant_pos[i][1],treant_pos[i][2],O,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,25000))
|
||||
CAST_AI(mob_treantAI, pTreant->AI())->WarpGuid = me->GetGUID();
|
||||
}
|
||||
DoScriptText(RAND(SAY_SUMMON_1,SAY_SUMMON_2), me);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//Check for War Stomp
|
||||
if (War_Stomp_Timer <= diff)
|
||||
struct mob_warp_splinter_treantAI : public ScriptedAI
|
||||
{
|
||||
DoCast(me->getVictim(), WAR_STOMP);
|
||||
War_Stomp_Timer = 25000 + rand()%15000;
|
||||
} else War_Stomp_Timer -= diff;
|
||||
mob_warp_splinter_treantAI (Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
WarpGuid = 0;
|
||||
}
|
||||
|
||||
//Check for Arcane Volley
|
||||
if (Arcane_Volley_Timer <= diff)
|
||||
uint64 WarpGuid;
|
||||
uint32 check_Timer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
check_Timer = 0;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/) {}
|
||||
|
||||
void MoveInLineOfSight(Unit* /*who*/) {}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
if (WarpGuid && check_Timer <= diff)
|
||||
{
|
||||
if (Unit *Warp = Unit::GetUnit(*me, WarpGuid))
|
||||
{
|
||||
if (me->IsWithinMeleeRange(Warp,2.5f))
|
||||
{
|
||||
int32 CurrentHP_Treant = (int32)me->GetHealth();
|
||||
Warp->CastCustomSpell(Warp,SPELL_HEAL_FATHER,&CurrentHP_Treant, 0, 0, true,0 ,0, me->GetGUID());
|
||||
me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
|
||||
return;
|
||||
}
|
||||
me->GetMotionMaster()->MoveFollow(Warp,0,0);
|
||||
}
|
||||
check_Timer = 1000;
|
||||
}
|
||||
else
|
||||
check_Timer -= diff;
|
||||
return;
|
||||
}
|
||||
|
||||
if (me->getVictim()->GetGUID() != WarpGuid)
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
CreatureAI* GetAI(Creature* Creature) const
|
||||
{
|
||||
DoCast(me->getVictim(), ARCANE_VOLLEY);
|
||||
Arcane_Volley_Timer = 20000 + rand()%15000;
|
||||
} else Arcane_Volley_Timer -= diff;
|
||||
|
||||
//Check for Summon Treants
|
||||
if (Summon_Treants_Timer <= diff)
|
||||
{
|
||||
SummonTreants();
|
||||
Summon_Treants_Timer = 45000;
|
||||
} else Summon_Treants_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
return new mob_warp_splinter_treantAI (Creature);
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_warp_splinter(Creature* pCreature)
|
||||
/*#####
|
||||
# boss_warp_splinter
|
||||
#####*/
|
||||
class boss_warp_splinter : public CreatureScript
|
||||
{
|
||||
return new boss_warp_splinterAI (pCreature);
|
||||
}
|
||||
public:
|
||||
|
||||
CreatureAI* GetAI_mob_treant(Creature* pCreature)
|
||||
{
|
||||
return new mob_treantAI (pCreature);
|
||||
}
|
||||
boss_warp_splinter()
|
||||
: CreatureScript("boss_warp_splinter")
|
||||
{
|
||||
}
|
||||
struct boss_warp_splinterAI : public ScriptedAI
|
||||
{
|
||||
boss_warp_splinterAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
Treant_Spawn_Pos_X = pCreature->GetPositionX();
|
||||
Treant_Spawn_Pos_Y = pCreature->GetPositionY();
|
||||
}
|
||||
|
||||
uint32 War_Stomp_Timer;
|
||||
uint32 Summon_Treants_Timer;
|
||||
uint32 Arcane_Volley_Timer;
|
||||
|
||||
float Treant_Spawn_Pos_X;
|
||||
float Treant_Spawn_Pos_Y;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
War_Stomp_Timer = 25000 + rand()%15000;
|
||||
Summon_Treants_Timer = 45000;
|
||||
Arcane_Volley_Timer = 8000 + rand()%12000;
|
||||
|
||||
me->SetSpeed(MOVE_RUN, 0.7f, true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
DoScriptText(SAY_AGGRO, me);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
{
|
||||
DoScriptText(SAY_DEATH, me);
|
||||
}
|
||||
|
||||
void SummonTreants()
|
||||
{
|
||||
for (uint8 i = 0; i < 6; ++i)
|
||||
{
|
||||
float angle = (M_PI / 3) * i;
|
||||
|
||||
float X = Treant_Spawn_Pos_X + TREANT_SPAWN_DIST * cos(angle);
|
||||
float Y = Treant_Spawn_Pos_Y + TREANT_SPAWN_DIST * sin(angle);
|
||||
float O = - me->GetAngle(X,Y);
|
||||
|
||||
if (Creature *pTreant = me->SummonCreature(CREATURE_TREANT,treant_pos[i][0],treant_pos[i][1],treant_pos[i][2],O,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,25000))
|
||||
CAST_AI(mob_warp_splinter_treant::mob_warp_splinter_treantAI, pTreant->AI())->WarpGuid = me->GetGUID();
|
||||
}
|
||||
DoScriptText(RAND(SAY_SUMMON_1,SAY_SUMMON_2), me);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//Check for War Stomp
|
||||
if (War_Stomp_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), WAR_STOMP);
|
||||
War_Stomp_Timer = 25000 + rand()%15000;
|
||||
}
|
||||
else
|
||||
War_Stomp_Timer -= diff;
|
||||
|
||||
//Check for Arcane Volley
|
||||
if (Arcane_Volley_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), DUNGEON_MODE(ARCANE_VOLLEY,ARCANE_VOLLEY_H));
|
||||
Arcane_Volley_Timer = 20000 + rand()%15000;
|
||||
}
|
||||
else
|
||||
Arcane_Volley_Timer -= diff;
|
||||
|
||||
//Check for Summon Treants
|
||||
if (Summon_Treants_Timer <= diff)
|
||||
{
|
||||
SummonTreants();
|
||||
Summon_Treants_Timer = 45000;
|
||||
}
|
||||
else
|
||||
Summon_Treants_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* Creature) const
|
||||
{
|
||||
return new boss_warp_splinterAI (Creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_warp_splinter()
|
||||
{
|
||||
Script *newscript;
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name = "boss_warp_splinter";
|
||||
newscript->GetAI = &GetAI_boss_warp_splinter;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name = "mob_warp_splinter_treant";
|
||||
newscript->GetAI = &GetAI_mob_treant;
|
||||
newscript->RegisterSelf();
|
||||
new boss_warp_splinter();
|
||||
new mob_warp_splinter_treant();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user