Scripting/Sethekk Halls: Move Boss Anzu from EAI to CPP and some cleanup.

This commit is contained in:
Malcrom
2013-08-07 18:53:17 -02:30
parent 9d4c2c5b1e
commit 090f348d59
8 changed files with 363 additions and 122 deletions

View File

@@ -0,0 +1,8 @@
-- Move boss_anzu from EAI to CPP
UPDATE `creature_template` SET `AIName`= '', `ScriptName`= 'boss_anzu' WHERE `entry`=23035;
DELETE FROM creature_ai_scripts WHERE `creature_id`=23035;
DELETE FROM `creature_text` WHERE `entry`=23035;
INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES
(23035, 0, 0, 'Awaken, my children and assist your master!', 14, 0, 100, 0, 0, 0, 'Anzu - Summon Brood'),
(23035, 1, 0, 'Your spells... ke-kaw... are weak magics... easy to turn against you...', 15, 0, 100, 0, 0, 0, 'Anzu - Spell Bomb'),
(23035, 1, 1, 'Yes... cast your precious little spells, ak-a-ak!', 15, 0, 100, 0, 0, 0, 'Anzu - Spell Bomb');

View File

@@ -535,6 +535,7 @@ void AddSC_boss_nexusprince_shaffar(); //Auchindoun Mana Tombs
void AddSC_boss_pandemonius();
void AddSC_boss_darkweaver_syth(); //Auchindoun Sekketh Halls
void AddSC_boss_talon_king_ikiss();
void AddSC_boss_anzu();
void AddSC_instance_sethekk_halls();
void AddSC_instance_shadow_labyrinth(); //Auchindoun Shadow Labyrinth
void AddSC_boss_ambassador_hellmaw();
@@ -1027,6 +1028,7 @@ void AddOutlandScripts()
AddSC_boss_pandemonius();
AddSC_boss_darkweaver_syth(); //Auchindoun Sekketh Halls
AddSC_boss_talon_king_ikiss();
AddSC_boss_anzu();
AddSC_instance_sethekk_halls();
AddSC_instance_shadow_labyrinth(); //Auchindoun Shadow Labyrinth
AddSC_boss_ambassador_hellmaw();

View File

@@ -0,0 +1,172 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
*
* 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/>.
*/
/*
Name: Boss_Anzu
%Complete: 80%
Comment:
Category: Auchindoun, Sethekk Halls
*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "sethekk_halls.h"
enum Says
{
SAY_SUMMON_BROOD = 0,
SAY_SPELL_BOMB = 1
};
enum Spells
{
SPELL_PARALYZING_SCREECH = 40184,
SPELL_SPELL_BOMB = 40303,
SPELL_CYCLONE_OF_FEATHERS = 40321,
SPELL_BANISH_SELF = 42354,
SPELL_FLESH_RIP = 40199
};
enum Events
{
EVENT_PARALYZING_SCREECH = 1,
EVENT_SPELL_BOMB = 2,
EVENT_CYCLONE_OF_FEATHERS = 3,
EVENT_SUMMON = 4
};
Position const PosSummonBrood[7] =
{
{ -118.1717f, 284.5299f, 121.2287f, 2.775074f },
{ -98.15528f, 293.4469f, 109.2385f, 0.174533f },
{ -99.70160f, 270.1699f, 98.27389f, 6.178465f },
{ -69.25543f, 303.0768f, 97.84479f, 5.532694f },
{ -87.59662f, 263.5181f, 92.70478f, 1.658063f },
{ -73.54323f, 276.6267f, 94.25807f, 2.802979f },
{ -81.70527f, 280.8776f, 44.58830f, 0.526849f },
};
class boss_anzu : public CreatureScript
{
public:
boss_anzu() : CreatureScript("boss_anzu") { }
struct boss_anzuAI : public BossAI
{
boss_anzuAI(Creature* creature) : BossAI(creature, DATA_ANZU) { }
void Reset() OVERRIDE
{
summon66 = false;
summon33 = false;
}
void EnterCombat(Unit* /*who*/) OVERRIDE
{
events.ScheduleEvent(EVENT_PARALYZING_SCREECH, 14000);
events.ScheduleEvent(EVENT_CYCLONE_OF_FEATHERS, 5000);
}
void JustDied(Unit* /*killer*/) OVERRIDE
{
if (instance)
instance->SetData(DATA_ANZU, DONE);
}
void KilledUnit(Unit* /*victim*/) OVERRIDE {}
void UpdateAI(uint32 diff) OVERRIDE
{
if (!UpdateVictim())
return;
events.Update(diff);
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_PARALYZING_SCREECH:
DoCastVictim(SPELL_PARALYZING_SCREECH);
events.ScheduleEvent(EVENT_PARALYZING_SCREECH, 26000);
break;
case EVENT_CYCLONE_OF_FEATHERS:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_CYCLONE_OF_FEATHERS);
events.ScheduleEvent(EVENT_CYCLONE_OF_FEATHERS, 21000);
break;
case EVENT_SUMMON:
// TODO: Add pathing for Brood of Anzu
me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000);
me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[1], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000);
me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[2], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000);
me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[3], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000);
me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[4], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000);
me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[5], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000);
me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[6], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000);
DoCast(me, SPELL_BANISH_SELF);
events.ScheduleEvent(EVENT_SPELL_BOMB, 12000);
break;
case EVENT_SPELL_BOMB:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
{
if (target->getPowerType() == POWER_MANA)
{
DoCast(target, SPELL_SPELL_BOMB);
Talk(SAY_SPELL_BOMB, target->GetGUID());
}
}
break;
default:
break;
}
}
if (HealthBelowPct(66) && !summon66)
{
summon66 = true;
Talk(SAY_SUMMON_BROOD);
events.ScheduleEvent(EVENT_SUMMON, 3000);
}
if (HealthBelowPct(33) && !summon33)
{
summon33 = true;
Talk(SAY_SUMMON_BROOD);
events.ScheduleEvent(EVENT_SUMMON, 3000);
}
DoMeleeAttackIfReady();
}
private:
bool summon66;
bool summon33;
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
return new boss_anzuAI(creature);
}
};
void AddSC_boss_anzu()
{
new boss_anzu();
}

View File

@@ -25,14 +25,18 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "sethekk_halls.h"
enum DarkweaverSyth
enum Says
{
SAY_SUMMON = 0,
SAY_AGGRO = 1,
SAY_SLAY = 2,
SAY_DEATH = 3,
SAY_DEATH = 3
};
enum Spells
{
SPELL_FROST_SHOCK = 21401, //37865
SPELL_FLAME_SHOCK = 34354,
SPELL_SHADOW_SHOCK = 30138,
@@ -51,40 +55,26 @@ enum DarkweaverSyth
SPELL_SHADOW_BUFFET = 33529
};
enum Events
{
EVENT_FLAME_SHOCK = 1,
EVENT_ARCANE_SHOCK = 2,
EVENT_FROST_SHOCK = 3,
EVENT_SHADOW_SHOCK = 4,
EVENT_CHAIN_LIGHTNING = 5
};
class boss_darkweaver_syth : public CreatureScript
{
public:
boss_darkweaver_syth() : CreatureScript("boss_darkweaver_syth") { }
CreatureAI* GetAI(Creature* creature) const OVERRIDE
struct boss_darkweaver_sythAI : public BossAI
{
return new boss_darkweaver_sythAI(creature);
}
struct boss_darkweaver_sythAI : public ScriptedAI
{
boss_darkweaver_sythAI(Creature* creature) : ScriptedAI(creature)
{
}
uint32 flameshock_timer;
uint32 arcaneshock_timer;
uint32 frostshock_timer;
uint32 shadowshock_timer;
uint32 chainlightning_timer;
bool summon90;
bool summon50;
bool summon10;
boss_darkweaver_sythAI(Creature* creature) : BossAI(creature, DATA_DARKWEAVER_SYTH) { }
void Reset() OVERRIDE
{
flameshock_timer = 2000;
arcaneshock_timer = 4000;
frostshock_timer = 6000;
shadowshock_timer = 8000;
chainlightning_timer = 15000;
summon90 = false;
summon50 = false;
summon10 = false;
@@ -92,12 +82,21 @@ public:
void EnterCombat(Unit* /*who*/) OVERRIDE
{
events.ScheduleEvent(EVENT_FLAME_SHOCK, 2000);
events.ScheduleEvent(EVENT_ARCANE_SHOCK, 4000);
events.ScheduleEvent(EVENT_FROST_SHOCK, 6000);
events.ScheduleEvent(EVENT_SHADOW_SHOCK, 8000);
events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 15000);
Talk(SAY_AGGRO);
}
void JustDied(Unit* /*killer*/) OVERRIDE
{
Talk(SAY_DEATH);
if (instance)
instance->SetData(DATA_DARKWEAVER_SYTH, DONE);
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
@@ -132,6 +131,42 @@ public:
if (!UpdateVictim())
return;
events.Update(diff);
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_FLAME_SHOCK:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_FLAME_SHOCK);
events.ScheduleEvent(EVENT_FLAME_SHOCK, urand(10000, 15000));
break;
case EVENT_ARCANE_SHOCK:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_ARCANE_SHOCK);
events.ScheduleEvent(EVENT_ARCANE_SHOCK, urand(10000, 15000));
break;
case EVENT_FROST_SHOCK:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_FROST_SHOCK);
events.ScheduleEvent(EVENT_FROST_SHOCK, urand(10000, 15000));
break;
case EVENT_SHADOW_SHOCK:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_SHADOW_SHOCK);
events.ScheduleEvent(EVENT_SHADOW_SHOCK, urand(10000, 15000));
break;
case EVENT_CHAIN_LIGHTNING:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_CHAIN_LIGHTNING);
events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 25000);
break;
default:
break;
}
}
if (HealthBelowPct(90) && !summon90)
{
SythSummoning();
@@ -150,50 +185,19 @@ public:
summon10 = true;
}
if (flameshock_timer <= diff)
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_FLAME_SHOCK);
flameshock_timer = urand(10000, 15000);
} else flameshock_timer -= diff;
if (arcaneshock_timer <= diff)
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_ARCANE_SHOCK);
arcaneshock_timer = urand(10000, 15000);
} else arcaneshock_timer -= diff;
if (frostshock_timer <= diff)
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_FROST_SHOCK);
frostshock_timer = urand(10000, 15000);
} else frostshock_timer -= diff;
if (shadowshock_timer <= diff)
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_SHADOW_SHOCK);
shadowshock_timer = urand(10000, 15000);
} else shadowshock_timer -= diff;
if (chainlightning_timer <= diff)
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_CHAIN_LIGHTNING);
chainlightning_timer = 25000;
} else chainlightning_timer -= diff;
DoMeleeAttackIfReady();
}
private:
bool summon90;
bool summon50;
bool summon10;
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
return new boss_darkweaver_sythAI(creature);
}
};
/* ELEMENTALS */

View File

@@ -27,14 +27,17 @@ EndScriptData */
#include "ScriptedCreature.h"
#include "sethekk_halls.h"
enum TailonkingIkiss
enum Says
{
SAY_INTRO = 0,
SAY_AGGRO = 1,
SAY_SLAY = 2,
SAY_DEATH = 3,
EMOTE_ARCANE_EXP = 4,
EMOTE_ARCANE_EXP = 4
};
enum Spells
{
SPELL_BLINK = 38194,
SPELL_BLINK_TELEPORT = 38203,
SPELL_MANA_SHIELD = 38151,
@@ -53,28 +56,9 @@ class boss_talon_king_ikiss : public CreatureScript
public:
boss_talon_king_ikiss() : CreatureScript("boss_talon_king_ikiss") { }
CreatureAI* GetAI(Creature* creature) const OVERRIDE
struct boss_talon_king_ikissAI : public BossAI
{
return new boss_talon_king_ikissAI(creature);
}
struct boss_talon_king_ikissAI : public ScriptedAI
{
boss_talon_king_ikissAI(Creature* creature) : ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
}
InstanceScript* instance;
uint32 ArcaneVolley_Timer;
uint32 Sheep_Timer;
uint32 Blink_Timer;
uint32 Slow_Timer;
bool ManaShield;
bool Blink;
bool Intro;
boss_talon_king_ikissAI(Creature* creature) : BossAI(creature, DATA_TALON_KING_IKISS) { }
void Reset() OVERRIDE
{
@@ -120,7 +104,7 @@ public:
Talk(SAY_DEATH);
if (instance)
instance->SetData(DATA_IKISSDOOREVENT, DONE);
instance->SetData(DATA_TALON_KING_IKISS, DONE);
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
@@ -204,8 +188,22 @@ public:
if (!Blink)
DoMeleeAttackIfReady();
}
private:
uint32 ArcaneVolley_Timer;
uint32 Sheep_Timer;
uint32 Blink_Timer;
uint32 Slow_Timer;
bool ManaShield;
bool Blink;
bool Intro;
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
return new boss_talon_king_ikissAI(creature);
}
};
void AddSC_boss_talon_king_ikiss()

View File

@@ -27,16 +27,6 @@ EndScriptData */
#include "InstanceScript.h"
#include "sethekk_halls.h"
enum Creatures
{
NPC_ANZU = 23035
};
enum GameObjects
{
GO_IKISS_DOOR = 177203
};
class instance_sethekk_halls : public InstanceMapScript
{
public:
@@ -49,49 +39,102 @@ public:
struct instance_sethekk_halls_InstanceMapScript : public InstanceScript
{
instance_sethekk_halls_InstanceMapScript(Map* map) : InstanceScript(map) {}
uint32 AnzuEncounter;
uint64 m_uiIkissDoorGUID;
instance_sethekk_halls_InstanceMapScript(Map* map) : InstanceScript(map)
{
SetBossNumber(EncounterCount);
}
void Initialize()
{
AnzuEncounter = NOT_STARTED;
m_uiIkissDoorGUID = 0;
SetBossState(DATA_ANZU, NOT_STARTED);
iIkissDoorGUID = 0;
}
void OnCreatureCreate(Creature* creature)
{
if (creature->GetEntry() == NPC_ANZU)
{
if (AnzuEncounter >= IN_PROGRESS)
if (GetBossState(DATA_ANZU) == DONE)
creature->DisappearAndDie();
else
AnzuEncounter = IN_PROGRESS;
SetBossState(DATA_ANZU, IN_PROGRESS);
}
}
void OnGameObjectCreate(GameObject* go)
{
if (go->GetEntry() == GO_IKISS_DOOR)
m_uiIkissDoorGUID = go->GetGUID();
iIkissDoorGUID = go->GetGUID();
}
void SetData(uint32 type, uint32 data) OVERRIDE
bool SetBossState(uint32 type, EncounterState state)
{
if (!InstanceScript::SetBossState(type, state))
return false;
switch (type)
{
case DATA_IKISSDOOREVENT:
if (data == DONE)
DoUseDoorOrButton(m_uiIkissDoorGUID, DAY*IN_MILLISECONDS);
case DATA_DARKWEAVER_SYTH:
break;
case TYPE_ANZU_ENCOUNTER:
AnzuEncounter = data;
case DATA_TALON_KING_IKISS:
if (state == DONE)
DoUseDoorOrButton(iIkissDoorGUID, DAY*IN_MILLISECONDS);
break;
case DATA_ANZU:
break;
default:
break;
}
}
};
return true;
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "S H " << GetBossSaveData();
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
void Load(const char* str)
{
if (!str)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(str);
char dataHead1, dataHead2;
std::istringstream loadStream(str);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'S' && dataHead2 == 'H')
{
for (uint32 i = 0; i < EncounterCount; ++i)
{
uint32 tmpState;
loadStream >> tmpState;
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
tmpState = NOT_STARTED;
SetBossState(i, EncounterState(tmpState));
}
}
else
OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
}
protected:
uint64 iIkissDoorGUID;
};
};
void AddSC_instance_sethekk_halls()

View File

@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* 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
@@ -19,10 +18,24 @@
#ifndef DEF_SETHEKK_HALLS_H
#define DEF_SETHEKK_HALLS_H
uint32 const EncounterCount = 3;
enum DataTypes
{
DATA_IKISSDOOREVENT = 1,
TYPE_ANZU_ENCOUNTER = 2,
DATA_DARKWEAVER_SYTH = 0,
DATA_TALON_KING_IKISS = 1,
DATA_ANZU = 2
};
#endif
enum CreatureIds
{
NPC_ANZU = 23035,
NPC_BROOD_OF_ANZU = 23132
};
enum GameObjectIds
{
GO_IKISS_DOOR = 177203
};
#endif

View File

@@ -76,6 +76,7 @@ set(scripts_STAT_SRCS
Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp
Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp
Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp
Outland/Auchindoun/SethekkHalls/boss_anzu.cpp
Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp
Outland/Auchindoun/SethekkHalls/sethekk_halls.h
Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp