Scripted/BaradinHold: Implemented Pit Lord Argaloth

Note: Need some update with sniff
This commit is contained in:
Vincent-Michael
2013-08-10 16:35:06 +02:00
parent 0e75857702
commit ba6e62fd6e
7 changed files with 403 additions and 177 deletions

View File

@@ -0,0 +1,13 @@
DELETE FROM `spell_script_names` WHERE `spell_id` IN (88954,95173,88942,95172);
INSERT INTO `spell_script_names`(`spell_id`, `ScriptName`) VALUES
(88954,'spell_argaloth_consuming_darkness'),
(95173,'spell_argaloth_consuming_darkness'),
(88942,'spell_argaloth_meteor_slash'),
(95172,'spell_argaloth_meteor_slash');
UPDATE `creature_template` SET `ScriptName`='boss_pit_lord_argaloth' WHERE `entry`=47120;
UPDATE `creature_template` SET `faction_A`=85,`faction_H`=85,`faction_A`=16,`faction_H`=16,`flags_extra`=128 WHERE `entry`=47829;
DELETE FROM `creature_template_addon` WHERE `entry`=47829;
INSERT INTO `creature_template_addon` (`entry`, `mount`, `bytes1`, `bytes2`, `auras`) VALUES
(47829, 0, 0x0, 0x1, '88999');

View File

@@ -102,6 +102,7 @@ void AddSC_boss_drekthar();
void AddSC_boss_galvangar();
void AddSC_boss_vanndar();
void AddSC_boss_alizabal(); //Baradin Hold
void AddSC_boss_pit_lord_argaloth();
void AddSC_instance_baradin_hold();
void AddSC_blackrock_depths(); //Blackrock Depths
void AddSC_boss_ambassador_flamelash();
@@ -760,6 +761,7 @@ void AddEasternKingdomsScripts()
AddSC_boss_galvangar();
AddSC_boss_vanndar();
AddSC_boss_alizabal(); //Baradin Hold
AddSC_boss_pit_lord_argaloth();
AddSC_instance_baradin_hold();
AddSC_blackrock_depths(); //Blackrock Depths
AddSC_boss_ambassador_flamelash();

View File

@@ -18,9 +18,18 @@
#ifndef DEF_BARADIN_HOLD_H_
#define DEF_BARADIN_HOLD_H_
#define MAX_ENCOUNTERS 3
#define BHScriptName "instance_baradin_hold"
enum Creatures
uint32 const EncounterCount = 3;
enum DataTypes
{
DATA_ARGALOTH = 0,
DATA_OCCUTHAR = 1,
DATA_ALIZABAL = 2
};
enum CreatureIds
{
BOSS_ARGALOTH = 47120,
BOSS_OCCUTHAR = 52363,
@@ -28,20 +37,23 @@ enum Creatures
NPC_EYE_OF_OCCUTHAR = 52389,
NPC_FOCUS_FIRE_DUMMY = 52369,
NPC_OCCUTHAR_EYE = 52368,
NPC_OCCUTHAR_EYE = 52368
};
enum Objects
enum GameObjectIds
{
GO_ARGALOTH_DOOR = 207619,
GO_OCCUTHAR_DOOR = 208953,
GO_ARGALOTH_DOOR = 207619,
GO_OCCUTHAR_DOOR = 208953
};
enum Data
template<class AI>
CreatureAI* GetBaradinHoldAI(Creature* creature)
{
DATA_ARGALOTH = 1,
DATA_OCCUTHAR = 2,
DATA_ALIZABAL = 3,
};
if (InstanceMap* instance = creature->GetMap()->ToInstanceMap())
if (instance->GetInstanceScript())
if (instance->GetScriptId() == sObjectMgr->GetScriptId(BHScriptName))
return new AI(creature);
return NULL;
}
#endif

View File

@@ -15,23 +15,22 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "baradin_hold.h"
#include "InstanceScript.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "Player.h"
#include "ObjectAccessor.h"
#include "ScriptedCreature.h"
#include "baradin_hold.h"
enum Texts
{
SAY_INTRO = 1,
SAY_AGGRO = 2,
SAY_HATE = 3,
SAY_SKEWER = 4,
SAY_SKEWER_ANNOUNCE = 5,
SAY_BLADE_STORM = 6,
SAY_SLAY = 10,
SAY_DEATH = 12,
SAY_INTRO = 1,
SAY_AGGRO = 2,
SAY_HATE = 3,
SAY_SKEWER = 4,
SAY_SKEWER_ANNOUNCE = 5,
SAY_BLADE_STORM = 6,
SAY_SLAY = 10,
SAY_DEATH = 12
};
enum Spells
@@ -40,25 +39,25 @@ enum Spells
SPELL_BLADE_DANCE_DUMMY = 105828,
SPELL_SEETHING_HATE = 105067,
SPELL_SKEWER = 104936,
SPELL_BERSERK = 47008,
SPELL_BERSERK = 47008
};
enum Actions
{
ACTION_INTRO = 1,
ACTION_INTRO = 1
};
enum Points
enum Points
{
POINT_STORM = 1,
POINT_STORM = 1
};
enum Events
{
EVENT_RANDOM_CAST = 1,
EVENT_STOP_STORM = 2,
EVENT_MOVE_STORM = 3,
EVENT_CAST_STORM = 4,
EVENT_RANDOM_CAST = 1,
EVENT_STOP_STORM = 2,
EVENT_MOVE_STORM = 3,
EVENT_CAST_STORM = 4
};
class at_alizabal_intro : public AreaTriggerScript
@@ -84,20 +83,14 @@ class boss_alizabal : public CreatureScript
{
boss_alizabalAI(Creature* creature) : BossAI(creature, DATA_ALIZABAL)
{
Intro = false;
Hate = false;
Skewer = false;
_intro = false;
}
bool Intro;
bool Hate;
bool Skewer;
void Reset() OVERRIDE
{
_Reset();
Hate = false;
Skewer = false;
_hate = false;
_skewer = false;
}
void EnterCombat(Unit* /*who*/) OVERRIDE
@@ -133,10 +126,10 @@ class boss_alizabal : public CreatureScript
switch (action)
{
case ACTION_INTRO:
if (!Intro)
if (!_intro)
{
Talk(SAY_INTRO);
Intro = true;
_intro = true;
}
break;
}
@@ -167,7 +160,7 @@ class boss_alizabal : public CreatureScript
switch (urand(0, 1))
{
case 0:
if (!Skewer)
if (!_skewer)
{
if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0))
{
@@ -175,20 +168,20 @@ class boss_alizabal : public CreatureScript
Talk(SAY_SKEWER);
Talk(SAY_SKEWER_ANNOUNCE, target->GetGUID());
}
Skewer = true;
_skewer = true;
events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000));
}
else if (!Hate)
else if (!_hate)
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me)))
{
DoCast(target, SPELL_SEETHING_HATE, true);
Talk(SAY_HATE);
}
Hate = true;
_hate = true;
events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000));
}
else if (Hate && Skewer)
else if (_hate && _skewer)
{
Talk(SAY_BLADE_STORM);
DoCastAOE(SPELL_BLADE_DANCE_DUMMY);
@@ -199,17 +192,17 @@ class boss_alizabal : public CreatureScript
}
break;
case 1:
if (!Hate)
if (!_hate)
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me)))
{
DoCast(target, SPELL_SEETHING_HATE, true);
Talk(SAY_HATE);
}
Hate = true;
_hate = true;
events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000));
}
else if (!Skewer)
else if (!_skewer)
{
if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0))
{
@@ -217,10 +210,10 @@ class boss_alizabal : public CreatureScript
Talk(SAY_SKEWER);
Talk(SAY_SKEWER_ANNOUNCE, target->GetGUID());
}
Skewer = true;
_skewer = true;
events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000));
}
else if (Hate && Skewer)
else if (_hate && _skewer)
{
Talk(SAY_BLADE_STORM);
DoCastAOE(SPELL_BLADE_DANCE_DUMMY);
@@ -245,8 +238,8 @@ class boss_alizabal : public CreatureScript
me->SetSpeed(MOVE_WALK, 1.0f);
me->SetSpeed(MOVE_RUN, 1.14f);
me->GetMotionMaster()->MoveChase(me->GetVictim());
Hate = false;
Skewer = false;
_hate = false;
_skewer = false;
break;
case EVENT_CAST_STORM:
DoCastAOE(SPELL_BLADE_DANCE);
@@ -256,11 +249,17 @@ class boss_alizabal : public CreatureScript
DoMeleeAttackIfReady();
}
private:
bool _intro;
bool _hate;
bool _skewer;
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
return new boss_alizabalAI(creature);
return GetBaradinHoldAI<boss_alizabalAI>(creature);
}
};

View File

@@ -0,0 +1,200 @@
/*
* 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/>.
*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
#include "baradin_hold.h"
/* TODO:
- Fel Firestorm need completion
- Need Correct timer
*/
enum Spells
{
SPELL_METEOR_SLASH = 88942,
SPELL_CONSUMING_DARKNESS = 88954,
SPELL_FEL_FIRESTORM = 88972,
SPELL_BERSEKER = 47008
};
enum Events
{
EVENT_METEOR_SLASH = 1,
EVENT_CONSUMING_DARKNESS = 2,
EVENT_BERSEKER = 3
};
class boss_pit_lord_argaloth : public CreatureScript
{
public:
boss_pit_lord_argaloth() : CreatureScript("boss_pit_lord_argaloth") { }
struct boss_pit_lord_argalothAI : public BossAI
{
boss_pit_lord_argalothAI(Creature* creature) : BossAI(creature, DATA_ARGALOTH) { }
void EnterCombat(Unit* /*who*/) OVERRIDE
{
_EnterCombat();
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me);
events.ScheduleEvent(EVENT_METEOR_SLASH, urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS));
events.ScheduleEvent(EVENT_CONSUMING_DARKNESS, urand(20 * IN_MILLISECONDS, 25 * IN_MILLISECONDS));
events.ScheduleEvent(SPELL_BERSEKER, 5 * MINUTE * IN_MILLISECONDS);
}
void EnterEvadeMode() OVERRIDE
{
me->GetMotionMaster()->MoveTargetedHome();
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
_DespawnAtEvade();
}
void DamageTaken(Unit* /*attacker*/, uint32& damage) OVERRIDE
{
if (me->HealthBelowPctDamaged(33, damage) ||
me->HealthBelowPctDamaged(66, damage))
{
DoCastAOE(SPELL_FEL_FIRESTORM);
}
}
void JustDied(Unit* /*killer*/) OVERRIDE
{
_JustDied();
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
}
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_METEOR_SLASH:
DoCastAOE(SPELL_METEOR_SLASH);
events.ScheduleEvent(EVENT_METEOR_SLASH, urand(15 * IN_MILLISECONDS, 20 * IN_MILLISECONDS));
break;
case EVENT_CONSUMING_DARKNESS:
DoCastAOE(SPELL_CONSUMING_DARKNESS, true);
events.ScheduleEvent(EVENT_CONSUMING_DARKNESS, urand(20 * IN_MILLISECONDS, 25 * IN_MILLISECONDS));
break;
case SPELL_BERSEKER:
DoCast(me, EVENT_BERSEKER, true);
break;
default:
break;
}
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
return GetBaradinHoldAI<boss_pit_lord_argalothAI>(creature);
}
};
// 88954 / 95173 - Consuming Darkness
class spell_argaloth_consuming_darkness : public SpellScriptLoader
{
public:
spell_argaloth_consuming_darkness() : SpellScriptLoader("spell_argaloth_consuming_darkness") { }
class spell_argaloth_consuming_darkness_SpellScript : public SpellScript
{
PrepareSpellScript(spell_argaloth_consuming_darkness_SpellScript);
void FilterTargets(std::list<WorldObject*>& targets)
{
Trinity::Containers::RandomResizeList(targets, GetCaster()->GetMap()->Is25ManRaid() ? 8 : 3);
}
void Register() OVERRIDE
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_argaloth_consuming_darkness_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
}
};
SpellScript* GetSpellScript() const OVERRIDE
{
return new spell_argaloth_consuming_darkness_SpellScript();
}
};
// 88942 / 95172 - Meteor Slash
class spell_argaloth_meteor_slash : public SpellScriptLoader
{
public:
spell_argaloth_meteor_slash() : SpellScriptLoader("spell_argaloth_meteor_slash") { }
class spell_argaloth_meteor_slash_SpellScript : public SpellScript
{
PrepareSpellScript(spell_argaloth_meteor_slash_SpellScript);
bool Load() OVERRIDE
{
_targetCount = 0;
return true;
}
void CountTargets(std::list<WorldObject*>& targets)
{
_targetCount = targets.size();
}
void SplitDamage()
{
if (!_targetCount)
return;
SetHitDamage(GetHitDamage() / _targetCount);
}
void Register() OVERRIDE
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_argaloth_meteor_slash_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
OnHit += SpellHitFn(spell_argaloth_meteor_slash_SpellScript::SplitDamage);
}
private:
uint32 _targetCount;
};
SpellScript* GetSpellScript() const OVERRIDE
{
return new spell_argaloth_meteor_slash_SpellScript();
}
};
void AddSC_boss_pit_lord_argaloth()
{
new boss_pit_lord_argaloth();
new spell_argaloth_consuming_darkness();
new spell_argaloth_meteor_slash();
}

View File

@@ -27,142 +27,141 @@ DoorData const doorData[] =
class instance_baradin_hold: public InstanceMapScript
{
public:
instance_baradin_hold() : InstanceMapScript("instance_baradin_hold", 757) { }
public:
instance_baradin_hold() : InstanceMapScript(BHScriptName, 757) { }
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_baradin_hold_InstanceMapScript(map);
}
struct instance_baradin_hold_InstanceMapScript: public InstanceScript
{
instance_baradin_hold_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
struct instance_baradin_hold_InstanceMapScript: public InstanceScript
{
SetBossNumber(MAX_ENCOUNTERS);
LoadDoorData(doorData);
_argalothGUID = 0;
_occutharGUID = 0;
_alizabalGUID = 0;
_argalothDoor = 0;
_occutharDoor = 0;
}
void Initialize()
{
}
void OnCreatureCreate(Creature* creature)
{
switch(creature->GetEntry())
instance_baradin_hold_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
{
case BOSS_ARGALOTH:
_argalothGUID = creature->GetGUID();
break;
case BOSS_OCCUTHAR:
_occutharGUID = creature->GetGUID();
break;
case BOSS_ALIZABAL:
_alizabalGUID = creature->GetGUID();
break;
}
}
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
void OnGameObjectCreate(GameObject* go)
{
switch(go->GetEntry())
{
case GO_ARGALOTH_DOOR:
_argalothDoor = go->GetGUID();
AddDoor(go, true);
break;
case GO_OCCUTHAR_DOOR:
_occutharDoor = go->GetGUID();
AddDoor(go, true);
break;
}
}
uint64 GetData64(uint32 data) const
{
switch (data)
{
case DATA_ARGALOTH:
return _argalothGUID;
case DATA_OCCUTHAR:
return _occutharGUID;
case DATA_ALIZABAL:
return _alizabalGUID;
default:
break;
ArgalothGUID = 0;
OccutharGUID = 0;
AlizabalGUID = 0;
ArgalothDoor = 0;
OccutharDoor = 0;
}
return 0;
}
void OnGameObjectRemove(GameObject* go)
{
switch(go->GetEntry())
void OnCreatureCreate(Creature* creature)
{
case GO_ARGALOTH_DOOR:
AddDoor(go, false);
break;
case GO_OCCUTHAR_DOOR:
AddDoor(go, false);
break;
}
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "B H " << GetBossSaveData();
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'B' && dataHead2 == 'H')
{
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
switch(creature->GetEntry())
{
uint32 tmpState;
loadStream >> tmpState;
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
tmpState = NOT_STARTED;
case BOSS_ARGALOTH:
ArgalothGUID = creature->GetGUID();
break;
case BOSS_OCCUTHAR:
OccutharGUID = creature->GetGUID();
break;
case BOSS_ALIZABAL:
AlizabalGUID = creature->GetGUID();
break;
}
}
SetBossState(i, EncounterState(tmpState));
void OnGameObjectCreate(GameObject* go)
{
switch(go->GetEntry())
{
case GO_ARGALOTH_DOOR:
ArgalothDoor = go->GetGUID();
AddDoor(go, true);
break;
case GO_OCCUTHAR_DOOR:
OccutharDoor = go->GetGUID();
AddDoor(go, true);
break;
}
}
uint64 GetData64(uint32 data) const
{
switch (data)
{
case DATA_ARGALOTH:
return ArgalothGUID;
case DATA_OCCUTHAR:
return OccutharGUID;
case DATA_ALIZABAL:
return AlizabalGUID;
default:
break;
}
} else OUT_LOAD_INST_DATA_FAIL;
return 0;
}
OUT_LOAD_INST_DATA_COMPLETE;
void OnGameObjectRemove(GameObject* go)
{
switch(go->GetEntry())
{
case GO_ARGALOTH_DOOR:
AddDoor(go, false);
break;
case GO_OCCUTHAR_DOOR:
AddDoor(go, false);
break;
}
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "B H " << GetBossSaveData();
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'B' && dataHead2 == 'H')
{
for (uint8 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 ArgalothGUID;
uint64 OccutharGUID;
uint64 AlizabalGUID;
uint64 ArgalothDoor;
uint64 OccutharDoor;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_baradin_hold_InstanceMapScript(map);
}
private:
uint64 _argalothGUID;
uint64 _occutharGUID;
uint64 _alizabalGUID;
uint64 _argalothDoor;
uint64 _occutharDoor;
};
};
void AddSC_instance_baradin_hold()

View File

@@ -18,6 +18,7 @@ set(scripts_STAT_SRCS
EasternKingdoms/AlteracValley/boss_vanndar.cpp
EasternKingdoms/AlteracValley/alterac_valley.cpp
EasternKingdoms/BaradinHold/boss_alizabal.cpp
EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp
EasternKingdoms/BaradinHold/instance_baradin_hold.cpp
EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp
EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp