Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
DELETE FROM `spelldifficulty_dbc` WHERE `id` IN (49527, 49518, 49528, 49544, 49537, 49548);
|
||||
INSERT INTO `spelldifficulty_dbc` (`id`, `spellid0`, `spellid1`) VALUES
|
||||
(49527, 49527, 59972),
|
||||
(49518, 49518, 59971),
|
||||
(49528, 49528, 59973),
|
||||
(49544, 49544, 59965),
|
||||
(49537, 49537, 59963),
|
||||
(49548, 49548, 59969);
|
||||
|
||||
UPDATE `creature_template` SET `AIName` = 'NullAI' WHERE `entry` = 30413;
|
||||
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id` = 53242;
|
||||
INSERT INTO `spell_script_names`(`spell_id`, `ScriptName`) VALUES
|
||||
(53242, 'spell_tharon_ja_clear_gift_of_tharon_ja');
|
||||
@@ -0,0 +1,120 @@
|
||||
-- Digging Through Bones (10922)
|
||||
SET @LETOLL := 22458;
|
||||
SET @RESEARCHER := 22464;
|
||||
SET @B_SIFTER := 22466;
|
||||
SET @SG_TRIGGER := 22457;
|
||||
SET @RESEARCHER1 := 78837;
|
||||
|
||||
-- Faulty spawn, it needs to be spawned by a script.
|
||||
DELETE FROM `creature` WHERE `guid`=85488;
|
||||
|
||||
DELETE FROM `creature_text` WHERE `entry`=@LETOLL;
|
||||
INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
|
||||
(@LETOLL,0,0,"'Aright, listen up! Form a circle around me and move out!",12,0,100,0,0,0,''),
|
||||
(@LETOLL,1,0,"Aright, $R, just keep us safe from harm while we work. We'll pay you when we return.",12,0,100,0,0,0,''),
|
||||
(@LETOLL,2,0,"The dig site is just north of here.",12,0,100,0,0,0,''),
|
||||
(@LETOLL,3,0,"We're here! Start diggin'!",12,0,100,0,0,0,''),
|
||||
(@LETOLL,4,0,"I think there's somethin' buried here, beneath the sand!",12,0,100,396,0,0,''),
|
||||
(@LETOLL,5,0,"Almost got it!",12,0,100,396,0,0,''),
|
||||
(@LETOLL,6,0,"By Brann's brittle bananas! What is it?! It... It looks like a drum.",12,0,100,396,0,0,''),
|
||||
(@LETOLL,7,0,"Have ye gone mad? You expect me to leave behind a drum without first beatin' on it? Not this son of Ironforge! No sir!",12,0,100,0,0,0,''),
|
||||
(@LETOLL,8,0,"Shut yer yaps! I'm gonna bang on this drum and that's that!",12,0,100,0,0,0,''),
|
||||
(@LETOLL,9,0,"IN YOUR FACE! I told you there was somethin' here!",12,0,100,0,0,0,''),
|
||||
(@LETOLL,10,0,"Don't just stand there! Help him out!",12,0,100,0,0,0,''),
|
||||
(@LETOLL,11,0,"You've been a tremendous help, $R! Let's get out of here before more of those things show up! I'll let Dwarfowitz know you did the job asked of ya' admirably.",12,0,100,0,0,0,'');
|
||||
|
||||
DELETE FROM `creature_text` WHERE `entry`=@RESEARCHER;
|
||||
INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
|
||||
(@RESEARCHER,0,0,"Wow... a drum.",12,0,100,0,0,0,''),
|
||||
(@RESEARCHER,1,0,"This discovery will surely rock the foundation of modern archaeology.",12,0,100,0,0,0,''),
|
||||
(@RESEARCHER,2,0,"Yea, great. Can we leave now? This desert is giving me hives.",12,0,100,0,0,0,''),
|
||||
(@RESEARCHER,3,0,"This reminds me of that one time where you made us search Silithus for evidence of sand gnomes.",12,0,100,0,0,0,''),
|
||||
(@RESEARCHER,4,0,"Or that time when you told us that you'd discovered the cure for the plague of the 20th century. What is that even? 20th century?",12,0,100,0,0,0,''),
|
||||
(@RESEARCHER,5,0,"I don't think it can top the one time where he told us that he'd heard that Arthas's cousin's skeleton was frozen beneath a glacier in Winterspring. I'll never forgive you for that one, Letoll. I mean honestly... Arthas's cousin?",12,0,100,0,0,0,''),
|
||||
(@RESEARCHER,6,0,"I dunno. It can't possibly beat the time he tried to convince us that we're all actually a figment of some being's imagination and that they only use us for their own personal amusement. That went over well during dinner with the family.",12,0,100,0,0,0,''),
|
||||
(@RESEARCHER,7,0,"Say, do you guys hear that?",12,0,100,0,0,0,'');
|
||||
|
||||
DELETE FROM `waypoints` WHERE `entry` IN (@LETOLL,@RESEARCHER,@LETOLL*100);
|
||||
INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES
|
||||
(@LETOLL,0,-3728.1,5385.5,-3.41,''),
|
||||
(@LETOLL,1,-3735.9,5392.8,-4.8,''),
|
||||
(@LETOLL,2,-3729.7,5381,-4.9,''),
|
||||
(@LETOLL,3,-3704.6, 5372.74, -9.33,''),
|
||||
(@LETOLL,4,-3704.8,5374.7,-8.9,''),
|
||||
(@LETOLL,5,-3623.2,5403.2,-11.5,''),
|
||||
(@LETOLL,6,-3554.6,5455.2,-11.3,''),
|
||||
(@LETOLL,7,-3557.7,5468.9,-8.1,''),
|
||||
(@LETOLL,8,-3548.9,5458.3,-12.3,''),
|
||||
(@RESEARCHER,0,-3725.1,5381.9,-4.4,''),
|
||||
(@RESEARCHER,1,-3735.7,5390.7,-5.7,''),
|
||||
(@RESEARCHER,2,-3728.4,5384.1,-3.4,''),
|
||||
(@RESEARCHER,3,-3703.1,5371.4,-10.1,''),
|
||||
(@RESEARCHER,4,-3619.6,5400.8,-12.1,''),
|
||||
(@RESEARCHER,5,-3554.2,5451.1,-11.8,''),
|
||||
(@RESEARCHER,6,-3563.1,5462.8,-6.5,''),
|
||||
(@RESEARCHER,7,-3551.1,5454,-11.9,'');
|
||||
|
||||
|
||||
UPDATE `creature_template` SET `AIname`='SmartAI' WHERE `entry` IN (@LETOLL,@RESEARCHER,@B_SIFTER);
|
||||
DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid` IN (@LETOLL,-@RESEARCHER1,@B_SIFTER);
|
||||
DELETE FROM `smart_scripts` WHERE `source_type`=9 AND `entryorguid` IN (@LETOLL*100+2,@LETOLL*100+1,@LETOLL*100,@RESEARCHER*100);
|
||||
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
|
||||
(@LETOLL,0,0,1,19,0,100,0,10922,0,0,0,53,0,@LETOLL,0,0,0,0,1,0,0,0,0,0,0,0,'On quest accept - Start WP'),
|
||||
(@LETOLL,0,1,0,61,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Say line 0'),
|
||||
(@LETOLL,0,2,3,40,0,100,0,1,@LETOLL,0,0,54,10000,0,0,0,0,0,1,0,0,0,0,0,0,0,'On WP reached - Pause WP'),
|
||||
(@LETOLL,0,3,10,61,0,100,0,0,0,0,0,80,@LETOLL*100,0,0,0,0,0,1,0,0,0,0,0,0,0,'On WP reached - Start Timed Event'),
|
||||
(@LETOLL,0,4,5,40,0,100,0,7,@LETOLL,0,0,17,233,0,0,0,0,0,1,0,0,0,0,0,0,0,'On WP reached - Set emote digging'),
|
||||
(@LETOLL,0,5,0,61,0,100,0,0,0,0,0,45,0,2,0,0,0,0,10,78837,@RESEARCHER,0,0,0,0,0,'On Link - Set Data'),
|
||||
(@LETOLL,0,6,7,40,0,100,0,8,@LETOLL,0,0,17,467,0,0,0,0,0,1,0,0,0,0,0,0,0,'On WP reached - Set emote digging'),
|
||||
(@LETOLL,0,7,8,61,0,100,0,0,0,0,0,45,0,3,0,0,0,0,10,78837,@RESEARCHER,0,0,0,0,0,'On Link - Set Data'),
|
||||
(@LETOLL,0,8,0,61,0,100,0,0,0,0,0,80,@LETOLL*100+1,0,0,0,0,0,1,0,0,0,0,0,0,0,'On WP reached - Start Timed Event'),
|
||||
(@LETOLL,0,9,0,40,0,100,0,6,@LETOLL,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'On WP reached - Say line 3'),
|
||||
(@LETOLL,0,10,0,61,0,100,0,0,0,0,0,81,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Set npc flag'),
|
||||
(@LETOLL,0,11,0,40,0,100,0,7,@LETOLL,0,0,54,3000,0,0,0,0,0,1,0,0,0,0,0,0,0,'On WP reached - Pause WP'),
|
||||
--
|
||||
(-@RESEARCHER1,0,0,0,38,0,100,0,0,1,0,0,53,0,@RESEARCHER,0,0,0,0,1,0,0,0,0,0,0,0,'On Data - Start WP'),
|
||||
(-@RESEARCHER1,0,1,2,40,0,100,0,5,@RESEARCHER,0,0,54,3000,0,0,0,0,0,1,0,0,0,0,0,0,0,' On Data - Start WP'),
|
||||
(-@RESEARCHER1,0,2,0,61,0,100,0,0,0,0,0,17,233,0,0,0,0,0,1,0,0,0,0,0,0,0,'On link - Start digging'),
|
||||
(-@RESEARCHER1,0,3,4,40,0,100,0,6,@RESEARCHER,0,0,54,3000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Pause WP'),
|
||||
(-@RESEARCHER1,0,4,0,61,0,100,0,0,0,0,0,17,233,0,0,0,0,0,1,0,0,0,0,0,0,0,'On link - Start digging'),
|
||||
(-@RESEARCHER1,0,5,6,40,0,100,0,7,@RESEARCHER,0,0,54,35500,0,0,0,0,0,1,0,0,0,0,0,0,0,'On WP reached - Pause WP'),
|
||||
(-@RESEARCHER1,0,6,0,61,0,100,0,0,0,0,0,80,@RESEARCHER*100,0,0,0,0,0,1,0,0,0,0,0,0,0,'ON WP reached - Start Timed Event'),
|
||||
(-@RESEARCHER1,0,7,0,11,0,100,0,0,0,0,0,17,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Respawn - Set Emote State none'),
|
||||
--
|
||||
(@LETOLL*100,9,0,0,0,0,100,0,3000,3000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Say line 1'),
|
||||
(@LETOLL*100,9,1,0,0,0,100,0,7000,7000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Say line 2'),
|
||||
(@LETOLL*100,9,2,0,0,0,100,0,500,500,0,0,45,0,1,0,0,0,0,10,78837,@RESEARCHER,0,0,0,0,0,'On Script - Set Data'),
|
||||
--
|
||||
(@LETOLL*100+1,9,0,0,0,0,100,0,0,0,0,0,1,4,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Say line 4'),
|
||||
(@LETOLL*100+1,9,1,0,0,0,100,0,2000,2000,0,0,1,5,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Say line 5'),
|
||||
(@LETOLL*100+1,9,2,0,0,0,100,0,5000,5000,0,0,1,6,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Say line 6'),
|
||||
--
|
||||
(@RESEARCHER*100,9,0,0,0,0,100,0,5000,5000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Say line 0'),
|
||||
(@RESEARCHER*100,9,1,0,0,0,100,0,0,0,0,0,17,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Set emote state none'),
|
||||
(@RESEARCHER*100,9,2,0,0,0,100,0,4000,4000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Say line 1'),
|
||||
(@RESEARCHER*100,9,3,0,0,0,100,0,7000,7000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Say line 2'),
|
||||
--
|
||||
(@LETOLL*100+1,9,3,0,0,0,100,0,0,0,0,0,17,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Set emote state none'),
|
||||
(@LETOLL*100+1,9,4,0,0,0,100,0,22000,22000,0,0,1,7,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Say line 7'),
|
||||
--
|
||||
(@RESEARCHER*100,9,4,0,0,0,100,0,12000,12000,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Say line 3'),
|
||||
(@RESEARCHER*100,9,5,0,0,0,100,0,6000,6000,0,0,1,4,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Say line 4'),
|
||||
(@RESEARCHER*100,9,6,0,0,0,100,0,6000,6000,0,0,1,5,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Say line 5'),
|
||||
(@RESEARCHER*100,9,7,0,0,0,100,0,17000,17000,0,0,1,6,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Say line 6'),
|
||||
--
|
||||
(@LETOLL*100+1,9,5,0,0,0,100,0,34000,34000,0,0,1,8,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Say line 8'),
|
||||
--
|
||||
(@RESEARCHER*100,9,8,0,0,0,100,0,6000,6000,0,0,1,7,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Say line 7'),
|
||||
(@RESEARCHER*100,9,9,0,0,0,100,0,15000,15000,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Despawn'),
|
||||
--
|
||||
(@LETOLL*100+1,9,6,0,0,0,100,0,7000,7000,0,0,1,9,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Say line 9'),
|
||||
(@LETOLL*100+1,9,7,0,0,0,100,0,500,500,0,0,12,@B_SIFTER,1,60000,0,0,0,8,0,0,0,-3550,5456.1,-12.3,0,'On Script - Summon worm'),
|
||||
(@LETOLL*100+1,9,8,0,0,0,100,0,8000,8000,0,0,1,10,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Say line 10'),
|
||||
(@LETOLL*100+1,9,9,0,0,0,100,0,8000,8000,0,0,1,11,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Say line 11'),
|
||||
(@LETOLL*100+1,9,10,0,0,0,100,0,6000,6000,0,0,15,10922,0,0,0,0,0,18,20,0,0,0,0,0,0,'On Script - Give quest credit'),
|
||||
(@LETOLL*100+1,9,11,0,0,0,100,0,3000,3000,0,0,81,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Restore npcflags'),
|
||||
(@LETOLL*100+1,9,12,0,0,0,100,0,1000,1000,0,0,78,0,0,0,0,0,0,1,0,0,0,0,0,0,0,' On Script - Stop Script'),
|
||||
(@LETOLL*100+1,9,13,0,0,0,100,0,16000,16000,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'On Script - Despawn'),
|
||||
--
|
||||
(@B_SIFTER,0,0,0,0,0,100,0,2000,6000,12000,17000,11,31747,0,0,0,0,0,2,0,0,0,0,0,0,0,'- IC - Cast Poison'),
|
||||
(@B_SIFTER,0,1,0,0,0,100,0,5000,25000,35000,40000,11,32738,0,0,0,0,0,2,0,0,0,0,0,0,0,'- IC - Cast Bore');
|
||||
@@ -6507,7 +6507,8 @@ bool Unit::HandleAuraProc(Unit* victim, uint32 /*damage*/, Aura* triggeredByAura
|
||||
// Blood of the North
|
||||
// Reaping
|
||||
// Death Rune Mastery
|
||||
if (dummySpell->SpellIconID == 3041 || dummySpell->SpellIconID == 22 || dummySpell->SpellIconID == 2622)
|
||||
/// @todo move those to spell scripts
|
||||
if (dummySpell->SpellIconID == 3041 || (dummySpell->SpellIconID == 22 && dummySpell->Id != 62459) || dummySpell->SpellIconID == 2622)
|
||||
{
|
||||
*handled = true;
|
||||
// Convert recently used Blood Rune to Death Rune
|
||||
|
||||
@@ -17,29 +17,48 @@
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "drak_tharon_keep.h"
|
||||
#include "SpellScript.h"
|
||||
#include "SpellAuraEffects.h"
|
||||
#include "Player.h"
|
||||
#include "drak_tharon_keep.h"
|
||||
|
||||
/*
|
||||
* Known Issues: Spell 49356 and 53463 will be interrupted for an unknown reason
|
||||
*/
|
||||
|
||||
enum Spells
|
||||
{
|
||||
//skeletal spells (phase 1)
|
||||
// Skeletal Spells (phase 1)
|
||||
SPELL_CURSE_OF_LIFE = 49527,
|
||||
H_SPELL_CURSE_OF_LIFE = 59972,
|
||||
SPELL_RAIN_OF_FIRE = 49518,
|
||||
H_SPELL_RAIN_OF_FIRE = 59971,
|
||||
SPELL_SHADOW_VOLLEY = 49528,
|
||||
H_SPELL_SHADOW_VOLLEY = 59973,
|
||||
SPELL_DECAY_FLESH = 49356, //casted at end of phase 1, starts phase 2
|
||||
//flesh spells (phase 2)
|
||||
SPELL_DECAY_FLESH = 49356, // casted at end of phase 1, starts phase 2
|
||||
// Flesh Spells (phase 2)
|
||||
SPELL_GIFT_OF_THARON_JA = 52509,
|
||||
SPELL_CLEAR_GIFT_OF_THARON_JA = 53242,
|
||||
SPELL_EYE_BEAM = 49544,
|
||||
H_SPELL_EYE_BEAM = 59965,
|
||||
SPELL_LIGHTNING_BREATH = 49537,
|
||||
H_SPELL_LIGHTNING_BREATH = 59963,
|
||||
SPELL_POISON_CLOUD = 49548,
|
||||
H_SPELL_POISON_CLOUD = 59969,
|
||||
SPELL_RETURN_FLESH = 53463, //Channeled spell ending phase two and returning to phase 1. This ability will stun the party for 6 seconds.
|
||||
SPELL_RETURN_FLESH = 53463, // Channeled spell ending phase two and returning to phase 1. This ability will stun the party for 6 seconds.
|
||||
SPELL_ACHIEVEMENT_CHECK = 61863,
|
||||
SPELL_FLESH_VISUAL = 52582,
|
||||
SPELL_DUMMY = 49551
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_CURSE_OF_LIFE = 1,
|
||||
EVENT_RAIN_OF_FIRE,
|
||||
EVENT_SHADOW_VOLLEY,
|
||||
|
||||
EVENT_EYE_BEAM,
|
||||
EVENT_LIGHTNING_BREATH,
|
||||
EVENT_POISON_CLOUD,
|
||||
|
||||
EVENT_DECAY_FLESH,
|
||||
EVENT_GOING_FLESH,
|
||||
EVENT_RETURN_FLESH,
|
||||
EVENT_GOING_SKELETAL
|
||||
};
|
||||
|
||||
enum Yells
|
||||
@@ -50,204 +69,178 @@ enum Yells
|
||||
SAY_SKELETON = 3,
|
||||
SAY_DEATH = 4
|
||||
};
|
||||
|
||||
enum Models
|
||||
{
|
||||
MODEL_FLESH = 27073,
|
||||
MODEL_SKELETON = 27511
|
||||
};
|
||||
enum CombatPhase
|
||||
{
|
||||
SKELETAL,
|
||||
GOING_FLESH,
|
||||
FLESH,
|
||||
GOING_SKELETAL
|
||||
MODEL_FLESH = 27073
|
||||
};
|
||||
|
||||
class boss_tharon_ja : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_tharon_ja() : CreatureScript("boss_tharon_ja") { }
|
||||
public:
|
||||
boss_tharon_ja() : CreatureScript("boss_tharon_ja") { }
|
||||
|
||||
struct boss_tharon_jaAI : public ScriptedAI
|
||||
{
|
||||
boss_tharon_jaAI(Creature* creature) : ScriptedAI(creature)
|
||||
struct boss_tharon_jaAI : public BossAI
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
boss_tharon_jaAI(Creature* creature) : BossAI(creature, DATA_THARON_JA) { }
|
||||
|
||||
uint32 uiPhaseTimer;
|
||||
uint32 uiCurseOfLifeTimer;
|
||||
uint32 uiRainOfFireTimer;
|
||||
uint32 uiShadowVolleyTimer;
|
||||
uint32 uiEyeBeamTimer;
|
||||
uint32 uiLightningBreathTimer;
|
||||
uint32 uiPoisonCloudTimer;
|
||||
|
||||
CombatPhase Phase;
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
void Reset() OVERRIDE
|
||||
{
|
||||
uiPhaseTimer = 20*IN_MILLISECONDS;
|
||||
uiCurseOfLifeTimer = 1*IN_MILLISECONDS;
|
||||
uiRainOfFireTimer = urand(14*IN_MILLISECONDS, 18*IN_MILLISECONDS);
|
||||
uiShadowVolleyTimer = urand(8*IN_MILLISECONDS, 10*IN_MILLISECONDS);
|
||||
Phase = SKELETAL;
|
||||
me->SetDisplayId(me->GetNativeDisplayId());
|
||||
instance->SetBossState(DATA_THARON_JA, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
instance->SetBossState(DATA_THARON_JA, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) OVERRIDE
|
||||
{
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
switch (Phase)
|
||||
void Reset() OVERRIDE
|
||||
{
|
||||
case SKELETAL:
|
||||
if (uiCurseOfLifeTimer < diff)
|
||||
{
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
DoCast(target, SPELL_CURSE_OF_LIFE);
|
||||
uiCurseOfLifeTimer = urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS);
|
||||
} else uiCurseOfLifeTimer -= diff;
|
||||
|
||||
if (uiShadowVolleyTimer < diff)
|
||||
{
|
||||
DoCastVictim(SPELL_SHADOW_VOLLEY);
|
||||
uiShadowVolleyTimer = urand(8*IN_MILLISECONDS, 10*IN_MILLISECONDS);
|
||||
} else uiShadowVolleyTimer -= diff;
|
||||
|
||||
if (uiRainOfFireTimer < diff)
|
||||
{
|
||||
DoCastAOE(SPELL_RAIN_OF_FIRE);
|
||||
uiRainOfFireTimer = urand(14*IN_MILLISECONDS, 18*IN_MILLISECONDS);
|
||||
} else uiRainOfFireTimer -= diff;
|
||||
|
||||
if (uiPhaseTimer < diff)
|
||||
{
|
||||
DoCast(SPELL_DECAY_FLESH);
|
||||
Phase = GOING_FLESH;
|
||||
uiPhaseTimer = 6*IN_MILLISECONDS;
|
||||
} else uiPhaseTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
break;
|
||||
case GOING_FLESH:
|
||||
if (uiPhaseTimer < diff)
|
||||
{
|
||||
Talk(SAY_FLESH);
|
||||
me->SetDisplayId(MODEL_FLESH);
|
||||
|
||||
std::list<Unit*> playerList;
|
||||
SelectTargetList(playerList, 5, SELECT_TARGET_TOPAGGRO, 0, true);
|
||||
for (std::list<Unit*>::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr)
|
||||
{
|
||||
Unit* temp = (*itr);
|
||||
me->AddAura(SPELL_GIFT_OF_THARON_JA, temp);
|
||||
temp->SetDisplayId(MODEL_SKELETON);
|
||||
}
|
||||
uiPhaseTimer = 20*IN_MILLISECONDS;
|
||||
uiLightningBreathTimer = urand(3*IN_MILLISECONDS, 4*IN_MILLISECONDS);
|
||||
uiEyeBeamTimer = urand(4*IN_MILLISECONDS, 8*IN_MILLISECONDS);
|
||||
uiPoisonCloudTimer = urand(6*IN_MILLISECONDS, 7*IN_MILLISECONDS);
|
||||
Phase = FLESH;
|
||||
} else uiPhaseTimer -= diff;
|
||||
break;
|
||||
case FLESH:
|
||||
if (uiLightningBreathTimer < diff)
|
||||
{
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
DoCast(target, SPELL_LIGHTNING_BREATH);
|
||||
uiLightningBreathTimer = urand(6*IN_MILLISECONDS, 7*IN_MILLISECONDS);
|
||||
} else uiLightningBreathTimer -= diff;
|
||||
|
||||
if (uiEyeBeamTimer < diff)
|
||||
{
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
DoCast(target, SPELL_EYE_BEAM);
|
||||
uiEyeBeamTimer = urand(4*IN_MILLISECONDS, 6*IN_MILLISECONDS);
|
||||
} else uiEyeBeamTimer -= diff;
|
||||
|
||||
if (uiPoisonCloudTimer < diff)
|
||||
{
|
||||
DoCastAOE(SPELL_POISON_CLOUD);
|
||||
uiPoisonCloudTimer = urand(10*IN_MILLISECONDS, 12*IN_MILLISECONDS);
|
||||
} else uiPoisonCloudTimer -= diff;
|
||||
|
||||
if (uiPhaseTimer < diff)
|
||||
{
|
||||
DoCast(SPELL_RETURN_FLESH);
|
||||
Phase = GOING_SKELETAL;
|
||||
uiPhaseTimer = 6*IN_MILLISECONDS;
|
||||
} else uiPhaseTimer -= diff;
|
||||
DoMeleeAttackIfReady();
|
||||
break;
|
||||
case GOING_SKELETAL:
|
||||
if (uiPhaseTimer < diff)
|
||||
{
|
||||
Talk(SAY_SKELETON);
|
||||
me->DeMorph();
|
||||
Phase = SKELETAL;
|
||||
uiPhaseTimer = 20*IN_MILLISECONDS;
|
||||
uiCurseOfLifeTimer = 1*IN_MILLISECONDS;
|
||||
uiRainOfFireTimer = urand(14*IN_MILLISECONDS, 18*IN_MILLISECONDS);
|
||||
uiShadowVolleyTimer = urand(8*IN_MILLISECONDS, 10*IN_MILLISECONDS);
|
||||
|
||||
std::list<Unit*> playerList;
|
||||
SelectTargetList(playerList, 5, SELECT_TARGET_TOPAGGRO, 0, true);
|
||||
for (std::list<Unit*>::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr)
|
||||
{
|
||||
Unit* temp = (*itr);
|
||||
if (temp->HasAura(SPELL_GIFT_OF_THARON_JA))
|
||||
temp->RemoveAura(SPELL_GIFT_OF_THARON_JA);
|
||||
temp->DeMorph();
|
||||
}
|
||||
} else uiPhaseTimer -= diff;
|
||||
break;
|
||||
_Reset();
|
||||
me->RestoreDisplayId();
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) OVERRIDE
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
if (instance)
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE
|
||||
{
|
||||
// clean morph on players
|
||||
Map::PlayerList const &PlayerList = instance->instance->GetPlayers();
|
||||
Talk(SAY_AGGRO);
|
||||
_EnterCombat();
|
||||
|
||||
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
|
||||
if (Player* player = i->GetSource())
|
||||
player->DeMorph();
|
||||
|
||||
DoCast(me, SPELL_ACHIEVEMENT_CHECK);
|
||||
|
||||
instance->SetBossState(DATA_THARON_JA, DONE);
|
||||
events.ScheduleEvent(EVENT_DECAY_FLESH, 20000);
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_LIFE, 1000);
|
||||
events.ScheduleEvent(EVENT_RAIN_OF_FIRE, urand(14000, 18000));
|
||||
events.ScheduleEvent(EVENT_SHADOW_VOLLEY, urand(8000, 10000));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return GetDrakTharonKeepAI<boss_tharon_jaAI>(creature);
|
||||
}
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) OVERRIDE
|
||||
{
|
||||
_JustDied();
|
||||
|
||||
Talk(SAY_DEATH);
|
||||
DoCastAOE(SPELL_CLEAR_GIFT_OF_THARON_JA, true);
|
||||
DoCastAOE(SPELL_ACHIEVEMENT_CHECK, true);
|
||||
}
|
||||
|
||||
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_CURSE_OF_LIFE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
|
||||
DoCast(target, SPELL_CURSE_OF_LIFE);
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_LIFE, urand(10000, 15000));
|
||||
return;
|
||||
case EVENT_SHADOW_VOLLEY:
|
||||
DoCastVictim(SPELL_SHADOW_VOLLEY);
|
||||
events.ScheduleEvent(EVENT_SHADOW_VOLLEY, urand(8000, 10000));
|
||||
return;
|
||||
case EVENT_RAIN_OF_FIRE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
|
||||
DoCast(target, SPELL_RAIN_OF_FIRE);
|
||||
events.ScheduleEvent(EVENT_RAIN_OF_FIRE, urand(14000, 18000));
|
||||
return;
|
||||
case EVENT_LIGHTNING_BREATH:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
|
||||
DoCast(target, SPELL_LIGHTNING_BREATH);
|
||||
events.ScheduleEvent(EVENT_LIGHTNING_BREATH, urand(6000, 7000));
|
||||
return;
|
||||
case EVENT_EYE_BEAM:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
|
||||
DoCast(target, SPELL_EYE_BEAM);
|
||||
events.ScheduleEvent(EVENT_EYE_BEAM, urand(4000, 6000));
|
||||
return;
|
||||
case EVENT_POISON_CLOUD:
|
||||
DoCastAOE(SPELL_POISON_CLOUD);
|
||||
events.ScheduleEvent(EVENT_POISON_CLOUD, urand(10000, 12000));
|
||||
return;
|
||||
case EVENT_DECAY_FLESH:
|
||||
DoCastAOE(SPELL_DECAY_FLESH);
|
||||
events.ScheduleEvent(EVENT_GOING_FLESH, 6000);
|
||||
return;
|
||||
case EVENT_GOING_FLESH:
|
||||
Talk(SAY_FLESH);
|
||||
me->SetDisplayId(MODEL_FLESH);
|
||||
DoCastAOE(SPELL_GIFT_OF_THARON_JA, true);
|
||||
DoCast(me, SPELL_FLESH_VISUAL, true);
|
||||
DoCast(me, SPELL_DUMMY, true);
|
||||
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_RETURN_FLESH, 20000);
|
||||
events.ScheduleEvent(EVENT_LIGHTNING_BREATH, urand(3000, 4000));
|
||||
events.ScheduleEvent(EVENT_EYE_BEAM, urand(4000, 8000));
|
||||
events.ScheduleEvent(EVENT_POISON_CLOUD, urand(6000, 7000));
|
||||
break;
|
||||
case EVENT_RETURN_FLESH:
|
||||
DoCastAOE(SPELL_RETURN_FLESH);
|
||||
events.ScheduleEvent(EVENT_GOING_SKELETAL, 6000);
|
||||
return;
|
||||
case EVENT_GOING_SKELETAL:
|
||||
Talk(SAY_SKELETON);
|
||||
me->RestoreDisplayId();
|
||||
DoCastAOE(SPELL_CLEAR_GIFT_OF_THARON_JA, true);
|
||||
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_DECAY_FLESH, 20000);
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_LIFE, 1000);
|
||||
events.ScheduleEvent(EVENT_RAIN_OF_FIRE, urand(14000, 18000));
|
||||
events.ScheduleEvent(EVENT_SHADOW_VOLLEY, urand(8000, 10000));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return GetDrakTharonKeepAI<boss_tharon_jaAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_tharon_ja_clear_gift_of_tharon_ja : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_tharon_ja_clear_gift_of_tharon_ja() : SpellScriptLoader("spell_tharon_ja_clear_gift_of_tharon_ja") { }
|
||||
|
||||
class spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript);
|
||||
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
|
||||
{
|
||||
if (!sSpellMgr->GetSpellInfo(SPELL_GIFT_OF_THARON_JA))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void HandleScript(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->RemoveAura(SPELL_GIFT_OF_THARON_JA);
|
||||
}
|
||||
|
||||
void Register() OVERRIDE
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const OVERRIDE
|
||||
{
|
||||
return new spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_tharon_ja()
|
||||
{
|
||||
new boss_tharon_ja;
|
||||
new boss_tharon_ja();
|
||||
new spell_tharon_ja_clear_gift_of_tharon_ja();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user