aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmake/genrev.cmake2
-rw-r--r--sql/updates/world/2013_10_10_00_world_misc.sql4
-rw-r--r--sql/updates/world/2013_10_10_01_world_update.sql1
-rw-r--r--sql/updates/world/2013_10_11_00_world_sai.sql16
-rw-r--r--sql/updates/world/2013_10_12_00_world_sai.sql74
-rw-r--r--sql/updates/world/2013_10_13_00_world_disable.sql3
-rw-r--r--sql/updates/world/2013_10_13_01_world_spelldifficulty_dbc.sql3
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp54
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp2
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp4
-rw-r--r--src/server/game/Scripting/ScriptMgr.h10
-rw-r--r--src/server/game/Spells/SpellMgr.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp12
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp497
14 files changed, 390 insertions, 294 deletions
diff --git a/cmake/genrev.cmake b/cmake/genrev.cmake
index b39a0780b1c..ceeed7bfac7 100644
--- a/cmake/genrev.cmake
+++ b/cmake/genrev.cmake
@@ -58,7 +58,7 @@ else()
# No valid ways available to find/set the revision/hash, so let's force some defaults
message(STATUS "
Could not find a proper repository signature (hash) - you may need to pull tags with git fetch -t
- Continuing anyway - note that the versionstring will be set to \"unknown 1970-01-01 00:00:00 (Archived)"\")
+ Continuing anyway - note that the versionstring will be set to \"unknown 1970-01-01 00:00:00 (Archived)\"")
set(rev_date "1970-01-01 00:00:00 +0000")
set(rev_hash "unknown")
set(rev_branch "Archived")
diff --git a/sql/updates/world/2013_10_10_00_world_misc.sql b/sql/updates/world/2013_10_10_00_world_misc.sql
index e46668548b1..9dcae219b16 100644
--- a/sql/updates/world/2013_10_10_00_world_misc.sql
+++ b/sql/updates/world/2013_10_10_00_world_misc.sql
@@ -2,7 +2,7 @@ UPDATE `creature` SET `spawndist`=0 WHERE `guid`=142524;
UPDATE `smart_scripts` SET `event_param2`=100 WHERE `entryorguid`=16769 AND `source_type`=0 AND `id`=9;
UPDATE `smart_scripts` SET `action_param1`=55661 WHERE `entryorguid`=29872 AND `source_type`=0 AND `id`=1;
-UPDATE `smart_scripts` SET `action_param1`=55661 WHERE `entryorguid`=29895 AND `source_type`=0 AND `id`=3;
+UPDATE `smart_scripts` SET `action_param1`=55662 WHERE `entryorguid`=29895 AND `source_type`=0 AND `id`=3;
UPDATE `conditions` SET `SourceGroup`=10059 WHERE `SourceTypeOrReferenceId`=10 AND `SourceGroup`=10058 AND `SourceEntry`=51969;
-UPDATE `conditions` SET `SourceGroup`=10058 WHERE `SourceTypeOrReferenceId`=10 AND `SourceGroup`=10059 AND `SourceEntry`=51961; \ No newline at end of file
+UPDATE `conditions` SET `SourceGroup`=10058 WHERE `SourceTypeOrReferenceId`=10 AND `SourceGroup`=10059 AND `SourceEntry`=51961;
diff --git a/sql/updates/world/2013_10_10_01_world_update.sql b/sql/updates/world/2013_10_10_01_world_update.sql
new file mode 100644
index 00000000000..e6aaa90f07f
--- /dev/null
+++ b/sql/updates/world/2013_10_10_01_world_update.sql
@@ -0,0 +1 @@
+UPDATE `smart_scripts` SET `event_flags` = 1 WHERE `entryorguid` IN (16325,16326) AND `source_type` = 0 AND `id` = 0 AND `link` = 1;
diff --git a/sql/updates/world/2013_10_11_00_world_sai.sql b/sql/updates/world/2013_10_11_00_world_sai.sql
new file mode 100644
index 00000000000..ff3e9ccc9f3
--- /dev/null
+++ b/sql/updates/world/2013_10_11_00_world_sai.sql
@@ -0,0 +1,16 @@
+UPDATE `creature_template` SET `ainame`='SmartAI' WHERE `entry` IN (18305,18306,18307);
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (18305,18306,18307) AND `source_type`=0;
+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
+(18305,0,0,0,8,0,100,0,32205,0,0,0,33,18305,0,0,0,0,0,7,0,0,0,0,0,0,0,'Burning Blade Pyre (01) - On Spell Hit (Place Maghar Battle Standard)- Give Quest Credit'),
+(18306,0,0,0,8,0,100,0,32205,0,0,0,33,18306,0,0,0,0,0,7,0,0,0,0,0,0,0,'Burning Blade Pyre (02) - On Spell Hit (Place Maghar Battle Standard)- Give Quest Credit'),
+(18307,0,0,0,8,0,100,0,32205,0,0,0,33,18307,0,0,0,0,0,7,0,0,0,0,0,0,0,'Burning Blade Pyre (03) - On Spell Hit (Place Maghar Battle Standard)- Give Quest Credit');
+
+UPDATE `creature_template` SET `ainame`='SmartAI' WHERE `entry`=23439;
+DELETE FROM `smart_scripts` WHERE `entryorguid`= 23439 AND `source_type`=0;
+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
+(23439,0,0,1,38,0,100,0,1,1,0,0,45,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Hungry Nether Ray - On Data set - Set Data'),
+(23439,0,1,0,61,0,100,0,0,0,0,0,11,41427,0,0,0,0,0,23,0,0,0,0,0,0,0,'Hungry Nether Ray - Linked with Previous Event - Cast Lucille Feed Credit Trigger');
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`=23219 AND `id`=6;
+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
+(23219, 0, 6, 0, 6, 0, 100, 0, 0, 0, 0, 0, 45, 1, 1, 0, 0, 0, 0, 9, 23439, 0, 50, 0, 0, 0, 0, 'Blackwind Warp Chaser - On Death - Set Data Hungry Nether Ray');
diff --git a/sql/updates/world/2013_10_12_00_world_sai.sql b/sql/updates/world/2013_10_12_00_world_sai.sql
new file mode 100644
index 00000000000..914fbba5f50
--- /dev/null
+++ b/sql/updates/world/2013_10_12_00_world_sai.sql
@@ -0,0 +1,74 @@
+-- Fix I've Got a Flying Machine
+-- Steel Gate Chief Archaeologist SAI & Text & Condition
+SET @ENTRY := 24399;
+SET @ENTRY1 := 24418;
+SET @ENTRY2 := 24439;
+SET @ENTRY3 := 24438;
+SET @STALKER := 105997;
+SET @MENUID := 8954;
+SET @OPTION := 0;
+
+DELETE FROM `creature_template_addon` WHERE `entry`=24418;
+INSERT INTO `creature_template_addon` (`entry`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES
+(24418, 0, 0, 0, 0x1, 0x1, '43775 43889'); -- Steel Gate Flying Machine - Flight Drop Off Buff
+
+UPDATE `creature_template` SET `AIName`= 'SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY;
+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
+(@ENTRY,0,0,1,62,0,100,0,@MENUID,@OPTION,0,0,11,45973,1,0,0,0,0,7,0,0,0,0,0,0,0, 'Steel Gate Chief Archaeologist - On gossip option select - Cast spell'),
+(@ENTRY,0,1,2,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Steel Gate Chief Archaeologist - On Link - Close gossip'),
+(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,11,43767,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Steel Gate Chief Archaeologist - On Link - Cast Invoker'),
+(@ENTRY,0,3,4,19,0,100,0,11390,0,0,0,11,45973,1,0,0,0,0,7,0,0,0,0,0,0,0, 'Steel Gate Chief Archaeologist - On Quest Accept - Cast spell'),
+(@ENTRY,0,4,0,61,0,100,0,0,0,0,0,11,43767,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Steel Gate Chief Archaeologist - On Link - Cast Invoker'),
+(@ENTRY,0,5,6,19,0,100,0,11390,0,0,0,12,@ENTRY3,3,120000,0,0,0,8,0,0,0,1972.773,-3265.381,134.719,0, 'Steel Gate Chief Archaeologist - On Quest Accept - Summon Graple Target');
+
+DELETE FROM `spell_area` WHERE `spell`=43889;
+INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `racemask`, `gender`, `autocast`, `quest_start_status`, `quest_end_status`) VALUES
+(43889, 3999, 11390, 0, 0, 0, 2, 1, 8, 0);
+
+UPDATE `creature_template` SET `modelid1`=11686, `modelid2`=0, `AIName`= 'SmartAI', `type_flags`=1048576 WHERE `entry`=@ENTRY3;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY3;
+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
+(@ENTRY3,0,0,0,54,0,100,0,0,0,0,0,11,43890,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Grapple Target - Just Summoned - Cast Invisibility on self');
+
+DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`= @ENTRY1;
+INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES
+(@ENTRY1, 43768, 1, 0);
+
+-- Gossip conditions
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=@MENUID AND `SourceEntry`=@OPTION;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(15,@MENUID,@OPTION,0,9,11390,0,0,0,'','Show gossip option 0 if player has quest I''ve got a Flying Machine');
+
+DELETE FROM `conditions` WHERE `SourceEntry`=@ENTRY1;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(16, 0, @ENTRY1, 0, 23, 3999, 0, 0, 0, '', 'Dismount player when not in intended zone');
+-- Condition for Grappling Hook spell(43770)
+DELETE FROM `conditions` WHERE `SourceEntry`=43770;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(13, 1, 43770, 0, 31, 3, 24439, 0, 0, '', 'Spell 43770(Grappling Hook) targets npc 24439(Sack of Relics)');
+-- Spell Conditions
+DELETE FROM `conditions` WHERE `SourceEntry`IN (43891,43892,43789);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(13, 1, 43892, 0, 31, 3, 24439, 0, 0, '', 'Spell 43892 targets npc 24439'),
+(13, 1, 43891, 0, 29, @ENTRY2, 1, 0, 0, '', 'Spell 43892 targets npc 24439'),
+(13, 1, 43789, 0, 31, 3, 24439, 0, 0, '', 'Spell 43892 targets npc 24439');
+
+-- Sack of Relics SAI
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY2 AND `source_type`=0;
+UPDATE `creature_template` SET AIName='SmartAI' WHERE entry=@ENTRY2;
+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
+(@ENTRY2,0,0,0,8,0,100,0,43770,0,0,0,11,46598,0,0,0,0,0,7,0,0,0,0.0,0.0,0.0,0.0,'Sack of Relics - On Link - Mount Sack to vehicle'),
+(@ENTRY2,0,1,2,8,0,100,1,43892,0,0,0,11,46598,0,0,0,0,0,10,105997,15214,0,0.0,0.0,0.0,0.0,' Sack of Relics - Remove Vehicle - In range'),
+(@ENTRY2,0,2,3,61,0,100,1,0,0,0,0,11,36553,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,'Sack of Relics - On Link - Cast pet stay(36553)'),
+(@ENTRY2,0,3,4,61,0,100,1,0,0,0,0,33,24439,0,0,0,0,0,21,20,0,0,0.0,0.0,0.0,0.0,'Sack of Relics - On Link - Quest Credit'),
+(@ENTRY2,0,4,0,61,0,100,1,0,0,0,0,41,10000,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,'Sack of Relics - On Link - Despawn');
+
+DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=43770;
+INSERT INTO `spell_linked_spell` (`spell_trigger`,`spell_effect`,`type`,`comment`) VALUES
+(43770,43789,1,'Trigger grip beam');
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`=-@STALKER AND `source_type`=0;
+UPDATE `creature_template` SET AIName='SmartAI' WHERE entry=15214;
+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
+(-@STALKER,0,0,0,1,0,100,0,0,0,0,0,11,43892,0,0,0,0,0,11,@ENTRY2,10,0,0.0,0.0,0.0,0.0,'Invisible Stalker - OOC - Cast Spell');
diff --git a/sql/updates/world/2013_10_13_00_world_disable.sql b/sql/updates/world/2013_10_13_00_world_disable.sql
new file mode 100644
index 00000000000..1c062837397
--- /dev/null
+++ b/sql/updates/world/2013_10_13_00_world_disable.sql
@@ -0,0 +1,3 @@
+DELETE FROM `disables` WHERE `entry` =56940;
+INSERT INTO `disables` (`sourceType`, `entry`, `flags`, `params_0`, `params_1`, `comment`) VALUES
+(0,56940,64,'','','Disable LOS check for Thorim Story Kill Credit');
diff --git a/sql/updates/world/2013_10_13_01_world_spelldifficulty_dbc.sql b/sql/updates/world/2013_10_13_01_world_spelldifficulty_dbc.sql
new file mode 100644
index 00000000000..4ebdf253422
--- /dev/null
+++ b/sql/updates/world/2013_10_13_01_world_spelldifficulty_dbc.sql
@@ -0,0 +1,3 @@
+DELETE FROM `spelldifficulty_dbc` WHERE `id` = 55959;
+INSERT INTO `spelldifficulty_dbc` (`id`, `spellid0`, `spellid1`) VALUES
+(55959, 55959, 59513);
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 3823f7ba287..d228a441893 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -507,18 +507,20 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
{
- if (IsUnit(*itr))
+ if (!IsUnit(*itr))
+ continue;
+
+ if (!(e.action.cast.flags & SMARTCAST_AURA_NOT_PRESENT) || !(*itr)->ToUnit()->HasAura(e.action.cast.spell))
{
if (e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS)
me->InterruptNonMeleeSpells(false);
- if (!(e.action.cast.flags & SMARTCAST_AURA_NOT_PRESENT) || !(*itr)->ToUnit()->HasAura(e.action.cast.spell))
- me->CastSpell((*itr)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED) ? true : false);
- else
- TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "Spell %u not casted because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: " UI64FMTD " Entry: %u Type: %u) already has the aura", e.action.cast.spell, (*itr)->GetGUID(), (*itr)->GetEntry(), uint32((*itr)->GetTypeId()));
+ me->CastSpell((*itr)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED) ? true : false);
TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_CAST:: Creature %u casts spell %u on target %u with castflags %u",
me->GetGUIDLow(), e.action.cast.spell, (*itr)->GetGUIDLow(), e.action.cast.flags);
}
+ else
+ TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "Spell %u not casted because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: " UI64FMTD " Entry: %u Type: %u) already has the aura", e.action.cast.spell, (*itr)->GetGUID(), (*itr)->GetEntry(), uint32((*itr)->GetTypeId()));
}
delete targets;
@@ -536,19 +538,20 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
{
- if (IsUnit(*itr))
- {
- if (e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS)
- tempLastInvoker->InterruptNonMeleeSpells(false);
+ if (!IsUnit(*itr))
+ continue;
if (!(e.action.cast.flags & SMARTCAST_AURA_NOT_PRESENT) || !(*itr)->ToUnit()->HasAura(e.action.cast.spell))
+ {
+ if (e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS)
+ tempLastInvoker->InterruptNonMeleeSpells(false);
+
tempLastInvoker->CastSpell((*itr)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED) ? true : false);
+ TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_INVOKER_CAST: Invoker %u casts spell %u on target %u with castflags %u",
+ tempLastInvoker->GetGUIDLow(), e.action.cast.spell, (*itr)->GetGUIDLow(), e.action.cast.flags);
+ }
else
TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "Spell %u not casted because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: " UI64FMTD " Entry: %u Type: %u) already has the aura", e.action.cast.spell, (*itr)->GetGUID(), (*itr)->GetEntry(), uint32((*itr)->GetTypeId()));
-
- TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_INVOKER_CAST: Invoker %u casts spell %u on target %u with castflags %u",
- tempLastInvoker->GetGUIDLow(), e.action.cast.spell, (*itr)->GetGUIDLow(), e.action.cast.flags);
- }
}
delete targets;
@@ -1659,21 +1662,28 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (ObjectList::const_iterator itr = casters->begin(); itr != casters->end(); ++itr)
{
- if (IsUnit(*itr))
+ if (!IsUnit(*itr))
+ continue;
+
+ bool interruptedSpell = false;
+
+ for (ObjectList::const_iterator it = targets->begin(); it != targets->end(); ++it)
{
- if (e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS)
- (*itr)->ToUnit()->InterruptNonMeleeSpells(false);
+ if (!IsUnit(*it))
+ continue;
- for (ObjectList::const_iterator it = targets->begin(); it != targets->end(); ++it)
+ if (!(e.action.cast.flags & SMARTCAST_AURA_NOT_PRESENT) || !(*it)->ToUnit()->HasAura(e.action.cast.spell))
{
- if (IsUnit(*it))
+ if (!interruptedSpell && e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS)
{
- if (!(e.action.cast.flags & SMARTCAST_AURA_NOT_PRESENT) || !(*it)->ToUnit()->HasAura(e.action.cast.spell))
- (*itr)->ToUnit()->CastSpell((*it)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED) ? true : false);
- else
- TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "Spell %u not casted because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: " UI64FMTD " Entry: %u Type: %u) already has the aura", e.action.cast.spell, (*it)->GetGUID(), (*it)->GetEntry(), uint32((*it)->GetTypeId()));
+ (*itr)->ToUnit()->InterruptNonMeleeSpells(false);
+ interruptedSpell = true;
}
+
+ (*itr)->ToUnit()->CastSpell((*it)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED) ? true : false);
}
+ else
+ TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "Spell %u not casted because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: " UI64FMTD " Entry: %u Type: %u) already has the aura", e.action.cast.spell, (*it)->GetGUID(), (*it)->GetEntry(), uint32((*it)->GetTypeId()));
}
}
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 659543d897d..9a1bec457ea 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -8114,7 +8114,7 @@ int32 Unit::DealHeal(Unit* victim, uint32 addhealth)
gain = victim->ModifyHealth(int32(addhealth));
// Hook for OnHeal Event
- sScriptMgr->OnHeal(this, victim, gain);
+ sScriptMgr->OnHeal(this, victim, (uint32&)gain);
Unit* unit = this;
diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp
index 30725acd69c..ef62af88fd6 100644
--- a/src/server/game/Scripting/ScriptMgr.cpp
+++ b/src/server/game/Scripting/ScriptMgr.cpp
@@ -1363,12 +1363,12 @@ void ScriptMgr::OnGroupDisband(Group* group)
}
// Unit
-void ScriptMgr::OnHeal(Unit* healer, Unit* reciever, uint32 gain)
+void ScriptMgr::OnHeal(Unit* healer, Unit* reciever, uint32& gain)
{
FOREACH_SCRIPT(UnitScript)->OnHeal(healer, reciever, gain);
}
-void ScriptMgr::OnDamage(Unit* attacker, Unit* victim, uint32 damage)
+void ScriptMgr::OnDamage(Unit* attacker, Unit* victim, uint32& damage)
{
FOREACH_SCRIPT(UnitScript)->OnDamage(attacker, victim, damage);
}
diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h
index f83fa5a6299..bd283f87a91 100644
--- a/src/server/game/Scripting/ScriptMgr.h
+++ b/src/server/game/Scripting/ScriptMgr.h
@@ -395,11 +395,11 @@ class UnitScript : public ScriptObject
UnitScript(const char* name, bool addToScripts = true);
public:
- // Called when a unit deals damage to another unit
- virtual void OnHeal(Unit* /*healer*/, Unit* /*reciever*/, uint32 /*gain*/) { }
+ // Called when a unit deals healing to another unit
+ virtual void OnHeal(Unit* /*healer*/, Unit* /*reciever*/, uint32& /*gain*/) { }
// Called when a unit deals damage to another unit
- virtual void OnDamage(Unit* /*attacker*/, Unit* /*victim*/, uint32 /*damage*/) { }
+ virtual void OnDamage(Unit* /*attacker*/, Unit* /*victim*/, uint32& /*damage*/) { }
// Called when DoT's Tick Damage is being Dealt
virtual void ModifyPeriodicDamageAurasTick(Unit* /*target*/, Unit* /*attacker*/, uint32& /*damage*/) { }
@@ -1059,8 +1059,8 @@ class ScriptMgr
public: /* UnitScript */
- void OnHeal(Unit* healer, Unit* reciever, uint32 gain);
- void OnDamage(Unit* attacker, Unit* victim, uint32 damage);
+ void OnHeal(Unit* healer, Unit* reciever, uint32& gain);
+ void OnDamage(Unit* attacker, Unit* victim, uint32& damage);
void ModifyPeriodicDamageAurasTick(Unit* target, Unit* attacker, uint32& damage);
void ModifyMeleeDamage(Unit* target, Unit* attacker, uint32& damage);
void ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage);
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 8b26244d0a5..41dd9b30e60 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -1910,7 +1910,7 @@ void SpellMgr::LoadSpellProcEvents()
}
if (!spellInfo->ProcFlags && !spellProcEvent.procFlags)
- TC_LOG_ERROR(LOG_FILTER_SQL, "Spell %u listed in `spell_proc_event` probally not triggered spell", spellInfo->Id);
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Spell %u listed in `spell_proc_event` probably not triggered spell", spellInfo->Id);
mSpellProcEventMap[spellInfo->Id] = spellProcEvent;
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp
index d8dfa2f5cf6..19024172aa0 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp
@@ -196,7 +196,7 @@ public:
TC_LOG_DEBUG(LOG_FILTER_TSCR, "Instance The Black Morass: Starting event.");
InitWorldState();
m_auiEncounter[1] = IN_PROGRESS;
- Events.ScheduleEvent(EVENT_NEXT_PORTAL, 15000);
+ ScheduleEventNextPortal(15000);
}
if (data == DONE)
@@ -228,7 +228,7 @@ public:
if (data == SPECIAL)
{
if (mRiftPortalCount < 7)
- Events.ScheduleEvent(EVENT_NEXT_PORTAL, 5000);
+ ScheduleEventNextPortal(5000);
}
else
m_auiEncounter[1] = data;
@@ -336,10 +336,16 @@ public:
++mRiftPortalCount;
DoUpdateWorldState(WORLD_STATE_BM_RIFT, mRiftPortalCount);
DoSpawnPortal();
- Events.ScheduleEvent(EVENT_NEXT_PORTAL, RiftWaves[GetRiftWaveId()].NextPortalTime);
+ ScheduleEventNextPortal(RiftWaves[GetRiftWaveId()].NextPortalTime);
}
}
+ void ScheduleEventNextPortal(uint32 nextPortalTime)
+ {
+ if (nextPortalTime > 0)
+ Events.RescheduleEvent(EVENT_NEXT_PORTAL, nextPortalTime);
+ }
+
protected:
EventMap Events;
};
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
index 2f01cc734e6..e0098570923 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
@@ -17,6 +17,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "Player.h"
#include "ahnkahet.h"
enum Spells
@@ -29,11 +30,9 @@ enum Spells
SPELL_FLAME_SPHERE_SPAWN_EFFECT = 55891,
SPELL_FLAME_SPHERE_VISUAL = 55928,
SPELL_FLAME_SPHERE_PERIODIC = 55926,
- H_SPELL_FLAME_SPHERE_PERIODIC = 59508,
SPELL_FLAME_SPHERE_DEATH_EFFECT = 55947,
SPELL_BEAM_VISUAL = 60342,
SPELL_EMBRACE_OF_THE_VAMPYR = 55959,
- H_SPELL_EMBRACE_OF_THE_VAMPYR = 59513,
SPELL_VANISH = 55964,
CREATURE_FLAME_SPHERE = 30106,
H_CREATURE_FLAME_SPHERE_1 = 31686,
@@ -48,8 +47,8 @@ enum Misc
DATA_SPHERE_DISTANCE = 15
};
-#define DATA_SPHERE_ANGLE_OFFSET 0.7f
-#define DATA_GROUND_POSITION_Z 11.30809f
+#define DATA_SPHERE_ANGLE_OFFSET 0.7f
+#define DATA_GROUND_POSITION_Z 11.30809f
enum Yells
{
@@ -61,315 +60,299 @@ enum Yells
SAY_FEED = 5,
SAY_VANISH = 6
};
-enum CombatPhase
+
+enum Events
+{
+ EVENT_CASTING_FLAME_SPHERES = 1,
+ EVENT_JUST_VANISHED,
+ EVENT_VANISHED,
+ EVENT_FEEDING,
+
+ EVENT_BLOODTHIRST,
+ EVENT_FLAME_SPHERE,
+ EVENT_VANISH
+};
+
+enum Phase
{
- NORMAL,
- CASTING_FLAME_SPHERES,
- JUST_VANISHED,
- VANISHED,
- FEEDING
+ PHASE_NORMAL = 1,
+ PHASE_SPECIAL = 2
};
class boss_taldaram : public CreatureScript
{
-public:
- boss_taldaram() : CreatureScript("boss_taldaram") { }
+ public:
+ boss_taldaram() : CreatureScript("boss_taldaram") { }
- struct boss_taldaramAI : public ScriptedAI
- {
- boss_taldaramAI(Creature* creature) : ScriptedAI(creature)
+ struct boss_taldaramAI : public BossAI
{
- instance = creature->GetInstanceScript();
- me->SetDisableGravity(true);
- }
-
- uint32 uiBloodthirstTimer;
- uint32 uiVanishTimer;
- uint32 uiWaitTimer;
- uint32 uiEmbraceTimer;
- uint32 uiEmbraceTakenDamage;
- uint32 uiFlamesphereTimer;
- uint32 uiPhaseTimer;
+ boss_taldaramAI(Creature* creature) : BossAI(creature, DATA_PRINCE_TALDARAM)
+ {
+ me->SetDisableGravity(true);
+ }
- uint64 uiEmbraceTarget;
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ _embraceTargetGUID = 0;
+ _embraceTakenDamage = 0;
+ }
- CombatPhase Phase;
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ Talk(SAY_AGGRO);
+ events.SetPhase(PHASE_NORMAL);
+ events.ScheduleEvent(EVENT_BLOODTHIRST, 10000);
+ events.ScheduleEvent(EVENT_VANISH, urand(25000, 35000));
+ events.ScheduleEvent(EVENT_FLAME_SPHERE, 5000);
+ }
- InstanceScript* instance;
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
- void Reset() OVERRIDE
- {
- uiBloodthirstTimer = 10*IN_MILLISECONDS;
- uiVanishTimer = urand(25*IN_MILLISECONDS, 35*IN_MILLISECONDS);
- uiEmbraceTimer = 20*IN_MILLISECONDS;
- uiFlamesphereTimer = 5*IN_MILLISECONDS;
- uiEmbraceTakenDamage = 0;
- Phase = NORMAL;
- uiPhaseTimer = 0;
- uiEmbraceTarget = 0;
- if (instance)
- instance->SetBossState(DATA_PRINCE_TALDARAM, NOT_STARTED);
- }
+ events.Update(diff);
- void EnterCombat(Unit* /*who*/) OVERRIDE
- {
- if (instance)
- instance->SetBossState(DATA_PRINCE_TALDARAM, IN_PROGRESS);
- Talk(SAY_AGGRO);
- }
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (!UpdateVictim())
- return;
- if (uiPhaseTimer <= diff)
- {
- switch (Phase)
+ while (uint32 eventId = events.ExecuteEvent())
{
- case CASTING_FLAME_SPHERES:
+ switch (eventId)
{
- Creature* pSpheres[3];
-
- //DoCast(me, SPELL_FLAME_SPHERE_SUMMON_1);
- pSpheres[0] = DoSpawnCreature(CREATURE_FLAME_SPHERE, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10*IN_MILLISECONDS);
- Unit* pSphereTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
- if (pSphereTarget && pSpheres[0])
- {
- float angle, x, y;
- angle = pSpheres[0]->GetAngle(pSphereTarget);
- x = pSpheres[0]->GetPositionX() + DATA_SPHERE_DISTANCE * std::cos(angle);
- y = pSpheres[0]->GetPositionY() + DATA_SPHERE_DISTANCE * std::sin(angle);
- pSpheres[0]->GetMotionMaster()->MovePoint(0, x, y, pSpheres[0]->GetPositionZ());
- }
- if (IsHeroic())
+ if (events.IsInPhase(PHASE_NORMAL))
{
- //DoCast(me, H_SPELL_FLAME_SPHERE_SUMMON_1);
- pSpheres[1] = DoSpawnCreature(H_CREATURE_FLAME_SPHERE_1, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10*IN_MILLISECONDS);
- //DoCast(me, H_SPELL_FLAME_SPHERE_SUMMON_2);
- pSpheres[2] = DoSpawnCreature(H_CREATURE_FLAME_SPHERE_2, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10*IN_MILLISECONDS);
- if (pSphereTarget && pSpheres[1] && pSpheres[2])
+ case EVENT_BLOODTHIRST:
+ DoCast(me, SPELL_BLOODTHIRST);
+ events.ScheduleEvent(EVENT_BLOODTHIRST, 10000);
+ break;
+ case EVENT_FLAME_SPHERE:
+ DoCastVictim(SPELL_CONJURE_FLAME_SPHERE);
+ events.SetPhase(PHASE_SPECIAL);
+ events.ScheduleEvent(EVENT_CASTING_FLAME_SPHERES, 3000);
+ events.ScheduleEvent(EVENT_FLAME_SPHERE, 15000);
+ break;
+ case EVENT_VANISH:
{
- float angle, x, y;
- angle = pSpheres[1]->GetAngle(pSphereTarget) + DATA_SPHERE_ANGLE_OFFSET;
- x = pSpheres[1]->GetPositionX() + DATA_SPHERE_DISTANCE/2 * std::cos(angle);
- y = pSpheres[1]->GetPositionY() + DATA_SPHERE_DISTANCE/2 * std::sin(angle);
- pSpheres[1]->GetMotionMaster()->MovePoint(0, x, y, pSpheres[1]->GetPositionZ());
- angle = pSpheres[2]->GetAngle(pSphereTarget) - DATA_SPHERE_ANGLE_OFFSET;
- x = pSpheres[2]->GetPositionX() + DATA_SPHERE_DISTANCE/2 * std::cos(angle);
- y = pSpheres[2]->GetPositionY() + DATA_SPHERE_DISTANCE/2 * std::sin(angle);
- pSpheres[2]->GetMotionMaster()->MovePoint(0, x, y, pSpheres[2]->GetPositionZ());
+ Map::PlayerList const& players = me->GetMap()->GetPlayers();
+ uint32 targets = 0;
+ for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i)
+ {
+ Player* player = i->GetSource();
+ if (player && player->IsAlive())
+ ++targets;
+ }
+
+ if (targets > 2)
+ {
+ Talk(SAY_VANISH);
+ DoCast(me, SPELL_VANISH);
+ events.SetPhase(PHASE_SPECIAL);
+ events.ScheduleEvent(EVENT_JUST_VANISHED, 500);
+ if (Unit* embraceTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
+ _embraceTargetGUID = embraceTarget->GetGUID();
+ }
+ events.ScheduleEvent(EVENT_VANISH, urand(25000, 35000));
+ break;
}
}
-
- Phase = NORMAL;
- uiPhaseTimer = 0;
- break;
- }
- case JUST_VANISHED:
- if (Unit* pEmbraceTarget = GetEmbraceTarget())
- {
- me->GetMotionMaster()->Clear();
- me->SetSpeed(MOVE_WALK, 2.0f, true);
- me->GetMotionMaster()->MoveChase(pEmbraceTarget);
- }
- Phase = VANISHED;
- uiPhaseTimer = 1300;
- break;
- case VANISHED:
- if (Unit* pEmbraceTarget = GetEmbraceTarget())
- DoCast(pEmbraceTarget, DUNGEON_MODE(SPELL_EMBRACE_OF_THE_VAMPYR, H_SPELL_EMBRACE_OF_THE_VAMPYR));
- Talk(SAY_FEED);
- me->GetMotionMaster()->Clear();
- me->SetSpeed(MOVE_WALK, 1.0f, true);
- me->GetMotionMaster()->MoveChase(me->GetVictim());
- Phase = FEEDING;
- uiPhaseTimer = 20*IN_MILLISECONDS;
- break;
- case FEEDING:
- Phase = NORMAL;
- uiPhaseTimer = 0;
- uiEmbraceTarget = 0;
- break;
- case NORMAL:
- if (uiBloodthirstTimer <= diff)
+ case EVENT_CASTING_FLAME_SPHERES:
{
- DoCast(me, SPELL_BLOODTHIRST);
- uiBloodthirstTimer = 10*IN_MILLISECONDS;
- } else uiBloodthirstTimer -= diff;
+ events.SetPhase(PHASE_NORMAL);
+ Unit* sphereTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
+ if (!sphereTarget)
+ break;
- if (uiFlamesphereTimer <= diff)
- {
- // because TARGET_UNIT_TARGET_ENEMY we need a target selected to cast
- DoCastVictim(SPELL_CONJURE_FLAME_SPHERE);
- Phase = CASTING_FLAME_SPHERES;
- uiPhaseTimer = 3*IN_MILLISECONDS + diff;
- uiFlamesphereTimer = 15*IN_MILLISECONDS;
- } else uiFlamesphereTimer -= diff;
-
- if (uiVanishTimer <= diff)
- {
- //Count alive players
- Unit* target = NULL;
- std::list<HostileReference*> t_list = me->getThreatManager().getThreatList();
- std::vector<Unit*> target_list;
- for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
+ float angle, x, y;
+
+ //DoCast(me, SPELL_FLAME_SPHERE_SUMMON_1);
+ if (Creature* sphere = DoSpawnCreature(CREATURE_FLAME_SPHERE, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10 * IN_MILLISECONDS))
{
- target = Unit::GetUnit(*me, (*itr)->getUnitGuid());
- // exclude pets & totems
- if (target && target->GetTypeId() == TYPEID_PLAYER && target->IsAlive())
- target_list.push_back(target);
- target = NULL;
+ angle = sphere->GetAngle(sphereTarget);
+ x = sphere->GetPositionX() + DATA_SPHERE_DISTANCE * std::cos(angle);
+ y = sphere->GetPositionY() + DATA_SPHERE_DISTANCE * std::sin(angle);
+ sphere->GetMotionMaster()->MovePoint(0, x, y, sphere->GetPositionZ());
}
- //He only vanishes if there are 3 or more alive players
- if (target_list.size() > 2)
- {
- Talk(SAY_VANISH);
- DoCast(me, SPELL_VANISH);
- Phase = JUST_VANISHED;
- uiPhaseTimer = 500;
- if (Unit* pEmbraceTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
- uiEmbraceTarget = pEmbraceTarget->GetGUID();
+ if (IsHeroic())
+ {
+ //DoCast(me, H_SPELL_FLAME_SPHERE_SUMMON_1);
+ if (Creature* sphere = DoSpawnCreature(H_CREATURE_FLAME_SPHERE_1, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10 * IN_MILLISECONDS))
+ {
+ angle = sphere->GetAngle(sphereTarget) + DATA_SPHERE_ANGLE_OFFSET;
+ x = sphere->GetPositionX() + DATA_SPHERE_DISTANCE/2 * std::cos(angle);
+ y = sphere->GetPositionY() + DATA_SPHERE_DISTANCE/2 * std::sin(angle);
+ sphere->GetMotionMaster()->MovePoint(0, x, y, sphere->GetPositionZ());
+ }
+
+ //DoCast(me, H_SPELL_FLAME_SPHERE_SUMMON_2);
+ if (Creature* sphere = DoSpawnCreature(H_CREATURE_FLAME_SPHERE_2, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10 * IN_MILLISECONDS))
+ {
+ angle = sphere->GetAngle(sphereTarget) - DATA_SPHERE_ANGLE_OFFSET;
+ x = sphere->GetPositionX() + DATA_SPHERE_DISTANCE/2 * std::cos(angle);
+ y = sphere->GetPositionY() + DATA_SPHERE_DISTANCE/2 * std::sin(angle);
+ sphere->GetMotionMaster()->MovePoint(0, x, y, sphere->GetPositionZ());
+ }
}
- uiVanishTimer = urand(25*IN_MILLISECONDS, 35*IN_MILLISECONDS);
- } else uiVanishTimer -= diff;
-
- DoMeleeAttackIfReady();
- break;
+ break;
+ }
+ case EVENT_JUST_VANISHED:
+ if (Unit* embraceTarget = GetEmbraceTarget())
+ {
+ me->GetMotionMaster()->Clear();
+ me->SetSpeed(MOVE_WALK, 2.0f, true);
+ me->GetMotionMaster()->MoveChase(embraceTarget);
+ }
+ events.ScheduleEvent(EVENT_VANISHED, 1300);
+ break;
+ case EVENT_VANISHED:
+ if (Unit* embraceTarget = GetEmbraceTarget())
+ DoCast(embraceTarget, SPELL_EMBRACE_OF_THE_VAMPYR);
+ Talk(SAY_FEED);
+ me->GetMotionMaster()->Clear();
+ me->SetSpeed(MOVE_WALK, 1.0f, true);
+ me->GetMotionMaster()->MoveChase(me->GetVictim());
+ events.ScheduleEvent(EVENT_FEEDING, 20000);
+ break;
+ case EVENT_FEEDING:
+ _embraceTargetGUID = 0;
+ events.SetPhase(PHASE_NORMAL);
+ break;
+ default:
+ break;
+ }
}
- } else uiPhaseTimer -= diff;
- }
- void DamageTaken(Unit* /*done_by*/, uint32 &damage) OVERRIDE
- {
- Unit* pEmbraceTarget = GetEmbraceTarget();
+ DoMeleeAttackIfReady();
+ }
- if (Phase == FEEDING && pEmbraceTarget && pEmbraceTarget->IsAlive())
+ void DamageTaken(Unit* /*doneBy*/, uint32& damage) OVERRIDE
{
- uiEmbraceTakenDamage += damage;
- if (uiEmbraceTakenDamage > (uint32) DUNGEON_MODE(DATA_EMBRACE_DMG, H_DATA_EMBRACE_DMG))
- {
- Phase = NORMAL;
- uiPhaseTimer = 0;
- uiEmbraceTarget = 0;
- me->CastStop();
- }
+ Unit* embraceTarget = GetEmbraceTarget();
+
+ if (events.IsInPhase(PHASE_SPECIAL) && embraceTarget && embraceTarget->IsAlive())
+ {
+ _embraceTakenDamage += damage;
+ if (_embraceTakenDamage > DUNGEON_MODE<uint32>(DATA_EMBRACE_DMG, H_DATA_EMBRACE_DMG))
+ {
+ _embraceTargetGUID = 0;
+ events.SetPhase(PHASE_NORMAL);
+ me->CastStop();
+ }
+ }
}
- }
- void JustDied(Unit* /*killer*/) OVERRIDE
- {
- Talk(SAY_DEATH);
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ Talk(SAY_DEATH);
+ _JustDied();
+ }
- if (instance)
- instance->SetBossState(DATA_PRINCE_TALDARAM, DONE);
- }
+ void KilledUnit(Unit* victim) OVERRIDE
+ {
+ if (victim->GetTypeId() != TYPEID_PLAYER)
+ return;
- void KilledUnit(Unit* victim) OVERRIDE
- {
- if (victim->GetTypeId() != TYPEID_PLAYER)
- return;
+ Unit* embraceTarget = GetEmbraceTarget();
+ if (events.IsInPhase(PHASE_SPECIAL) && embraceTarget && victim == embraceTarget)
+ {
+ _embraceTargetGUID = 0;
+ events.SetPhase(PHASE_NORMAL);
+ }
+ Talk(SAY_SLAY);
+ }
- Unit* pEmbraceTarget = GetEmbraceTarget();
- if (Phase == FEEDING && pEmbraceTarget && victim == pEmbraceTarget)
+ bool CheckSpheres()
{
- Phase = NORMAL;
- uiPhaseTimer = 0;
- uiEmbraceTarget = 0;
- }
- Talk(SAY_SLAY);
- }
+ for (uint8 i = 0; i < 2; ++i)
+ if (!instance->GetData(DATA_SPHERE_1 + i))
+ return false;
- bool CheckSpheres()
- {
- for (uint8 i = 0; i < 2; ++i)
- if (!instance->GetData(DATA_SPHERE_1 + i))
- return false;
+ RemovePrison();
+ return true;
+ }
- RemovePrison();
- return true;
- }
+ Unit* GetEmbraceTarget()
+ {
+ if (_embraceTargetGUID)
+ return ObjectAccessor::GetUnit(*me, _embraceTargetGUID);
- Unit* GetEmbraceTarget()
- {
- if (!uiEmbraceTarget)
return NULL;
+ }
- return Unit::GetUnit(*me, uiEmbraceTarget);
- }
+ void RemovePrison()
+ {
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->RemoveAurasDueToSpell(SPELL_BEAM_VISUAL);
+ me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), DATA_GROUND_POSITION_Z, me->GetOrientation());
+ DoCast(SPELL_HOVER_FALL);
+ me->SetDisableGravity(false);
+ me->GetMotionMaster()->MovePoint(0, me->GetHomePosition());
+ Talk(SAY_WARNING);
+ instance->HandleGameObject(instance->GetData64(DATA_PRINCE_TALDARAM_PLATFORM), true);
+ }
+
+ private:
+ uint64 _embraceTargetGUID;
+ uint32 _embraceTakenDamage;
+ };
- void RemovePrison()
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- if (!instance)
- return;
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->RemoveAurasDueToSpell(SPELL_BEAM_VISUAL);
- me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), DATA_GROUND_POSITION_Z, me->GetOrientation());
- DoCast(SPELL_HOVER_FALL);
- me->SetDisableGravity(false);
- me->GetMotionMaster()->MovePoint(0, me->GetHomePosition());
- Talk(SAY_WARNING);
- uint64 prison_GUID = instance->GetData64(DATA_PRINCE_TALDARAM_PLATFORM);
- instance->HandleGameObject(prison_GUID, true);
+ return GetAhnKahetAI<boss_taldaramAI>(creature);
}
- };
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return GetAhnKahetAI<boss_taldaramAI>(creature);
- }
};
class npc_taldaram_flamesphere : public CreatureScript
{
-public:
- npc_taldaram_flamesphere() : CreatureScript("npc_taldaram_flamesphere") { }
+ public:
+ npc_taldaram_flamesphere() : CreatureScript("npc_taldaram_flamesphere") { }
- struct npc_taldaram_flamesphereAI : public ScriptedAI
- {
- npc_taldaram_flamesphereAI(Creature* creature) : ScriptedAI(creature)
+ struct npc_taldaram_flamesphereAI : public ScriptedAI
{
- instance = creature->GetInstanceScript();
- }
+ npc_taldaram_flamesphereAI(Creature* creature) : ScriptedAI(creature)
+ {
+ }
- uint32 uiDespawnTimer;
- InstanceScript* instance;
+ void Reset() OVERRIDE
+ {
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
+ me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
+ me->setFaction(16);
+ me->SetObjectScale(1.0f);
+ DoCast(me, SPELL_FLAME_SPHERE_VISUAL);
+ DoCast(me, SPELL_FLAME_SPHERE_SPAWN_EFFECT);
+ DoCast(me, SPELL_FLAME_SPHERE_PERIODIC);
+ _despawnTimer = 10 * IN_MILLISECONDS;
+ }
- void Reset() OVERRIDE
- {
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
- me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
- me->setFaction(16);
- me->SetObjectScale(1.0f);
- DoCast(me, SPELL_FLAME_SPHERE_VISUAL);
- DoCast(me, SPELL_FLAME_SPHERE_SPAWN_EFFECT);
- DoCast(me, SPELL_FLAME_SPHERE_PERIODIC);
- uiDespawnTimer = 10*IN_MILLISECONDS;
- }
+ void EnterCombat(Unit* /*who*/) OVERRIDE { }
+ void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { }
- void EnterCombat(Unit* /*who*/) OVERRIDE {}
- void MoveInLineOfSight(Unit* /*who*/) OVERRIDE {}
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ DoCast(me, SPELL_FLAME_SPHERE_DEATH_EFFECT);
+ }
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (_despawnTimer <= diff)
+ me->DisappearAndDie();
+ else
+ _despawnTimer -= diff;
+ }
- void JustDied(Unit* /*killer*/) OVERRIDE
- {
- DoCast(me, SPELL_FLAME_SPHERE_DEATH_EFFECT);
- }
+ private:
+ uint32 _despawnTimer;
+ };
- void UpdateAI(uint32 diff) OVERRIDE
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- if (uiDespawnTimer <= diff)
- me->DisappearAndDie();
- else
- uiDespawnTimer -= diff;
+ return new npc_taldaram_flamesphereAI(creature);
}
- };
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_taldaram_flamesphereAI(creature);
- }
};
class prince_taldaram_sphere : public GameObjectScript
@@ -377,7 +360,7 @@ class prince_taldaram_sphere : public GameObjectScript
public:
prince_taldaram_sphere() : GameObjectScript("prince_taldaram_sphere") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go)
+ bool OnGossipHello(Player* /*player*/, GameObject* go) OVERRIDE
{
InstanceScript* instance = go->GetInstanceScript();
if (!instance)