aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent-Michael <Vincent_Michael@gmx.de>2013-08-28 19:24:01 +0200
committerVincent-Michael <Vincent_Michael@gmx.de>2013-08-28 19:24:01 +0200
commit316663807862ad2a4a24edbe8c2e508715d02cdc (patch)
treefb12194fcdd574f294b9ec05cef37efa87babd8a
parent14d80d269dd7f9624983bc5a610e511f31ed33f0 (diff)
parenta9174617622a85599e8e2878f3036b35781192dd (diff)
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts: src/server/game/Entities/Player/Player.cpp src/server/game/Guilds/Guild.cpp src/server/game/Spells/Auras/SpellAuraEffects.cpp src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
-rw-r--r--CMakeLists.txt3
-rw-r--r--cmake/macros/FindACE.cmake95
-rw-r--r--cmake/macros/FindOpenSSL.cmake57
-rw-r--r--sql/updates/world/2013_08_27_01_world_instance_template.sql1
-rw-r--r--sql/updates/world/2013_08_27_02_world_reputation_reward_rate.sql1
-rw-r--r--sql/updates/world/2013_08_27_03_world_reputation_reward_rate.sql1
-rw-r--r--sql/updates/world/2013_08_27_04_world_reputation_reward_rate.sql1
-rw-r--r--sql/updates/world/2013_08_28_00_world_misc.sql17
-rw-r--r--sql/updates/world/2013_08_28_01_world_creature.sql14
-rw-r--r--sql/updates/world/2013_08_28_02_world_quest_template.sql2
-rw-r--r--sql/updates/world/2013_08_28_03_world_sai.sql57
-rw-r--r--sql/updates/world/2013_08_28_04_world_conditions.sql4
-rw-r--r--sql/updates/world/2013_08_28_05_world_misc.sql14
-rw-r--r--src/server/collision/BoundingIntervalHierarchyWrapper.h18
-rw-r--r--src/server/game/Entities/Player/Player.cpp16
-rw-r--r--src/server/game/Entities/Player/Player.h1
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp4
-rw-r--r--src/server/game/Entities/Unit/Unit.h13
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp15
-rw-r--r--src/server/game/Globals/ObjectMgr.h1
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h6
-rw-r--r--src/server/game/Grids/ObjectGridLoader.cpp3
-rw-r--r--src/server/game/Guilds/Guild.cpp6
-rw-r--r--src/server/game/Guilds/Guild.h3
-rw-r--r--src/server/game/Instances/InstanceSaveMgr.h8
-rw-r--r--src/server/game/Scripting/ScriptLoader.cpp91
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp28
-rw-r--r--src/server/scripts/Kalimdor/zone_winterspring.cpp4
-rw-r--r--src/server/scripts/Northrend/CMakeLists.txt6
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp2
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp3
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp1
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp473
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp381
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp493
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp434
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp287
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h86
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp (renamed from src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp)0
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp14
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp1
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp1
-rw-r--r--src/server/scripts/Spells/spell_warrior.cpp2
43 files changed, 1372 insertions, 1296 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b5db167fa22..c3e8d8d2b11 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -48,6 +48,9 @@ endif()
include(CheckPlatform)
# basic packagesearching and setup (further support will be needed, this is a preliminary release!)
+set(OPENSSL_EXPECTED_VERSION 1.0.0)
+set(ACE_EXPECTED_VERSION 5.8.3)
+
find_package(PCHSupport)
find_package(ACE REQUIRED)
find_package(OpenSSL REQUIRED)
diff --git a/cmake/macros/FindACE.cmake b/cmake/macros/FindACE.cmake
index 4ade5f64b03..bd534fb33db 100644
--- a/cmake/macros/FindACE.cmake
+++ b/cmake/macros/FindACE.cmake
@@ -1,6 +1,6 @@
#
# Find the ACE client includes and library
-#
+#
# This module defines
# ACE_INCLUDE_DIR, where to find ace.h
@@ -13,47 +13,66 @@
set( ACE_FOUND 0 )
if ( UNIX )
- FIND_PATH( ACE_INCLUDE_DIR
- NAMES
- ace/ACE.h
- PATHS
- /usr/include
- /usr/include/ace
- /usr/local/include
- /usr/local/include/ace
- $ENV{ACE_ROOT}
- $ENV{ACE_ROOT}/include
- ${CMAKE_SOURCE_DIR}/externals/ace
- DOC
- "Specify include-directories that might contain ace.h here."
- )
- FIND_LIBRARY( ACE_LIBRARY
- NAMES
- ace ACE
- PATHS
- /usr/lib
- /usr/lib/ace
- /usr/local/lib
- /usr/local/lib/ace
- /usr/local/ace/lib
- $ENV{ACE_ROOT}/lib
- $ENV{ACE_ROOT}
- DOC "Specify library-locations that might contain the ACE library here."
- )
+ if (NOT ACE_INCLUDE_DIR)
+ FIND_PATH( ACE_INCLUDE_DIR
+ NAMES
+ ace/ACE.h
+ PATHS
+ /usr/include
+ /usr/include/ace
+ /usr/local/include
+ /usr/local/include/ace
+ $ENV{ACE_ROOT}
+ $ENV{ACE_ROOT}/ace
+ $ENV{ACE_ROOT}/include
+ ${CMAKE_SOURCE_DIR}/externals/ace
+ DOC
+ "Specify include-directories that might contain ace.h here."
+ )
+ endif()
+
+ if (NOT ACE_LIBRARY)
+ FIND_LIBRARY( ACE_LIBRARY
+ NAMES
+ ace ACE
+ PATHS
+ /usr/lib
+ /usr/lib/ace
+ /usr/local/lib
+ /usr/local/lib/ace
+ /usr/local/ace/lib
+ $ENV{ACE_ROOT}/lib
+ $ENV{ACE_ROOT}
+ DOC "Specify library-locations that might contain the ACE library here."
+ )
-# FIND_LIBRARY( ACE_EXTRA_LIBRARIES
-# NAMES
-# z zlib
-# PATHS
-# /usr/lib
-# /usr/local/lib
-# DOC
-# "if more libraries are necessary to link into ACE, specify them here."
-# )
+ # FIND_LIBRARY( ACE_EXTRA_LIBRARIES
+ # NAMES
+ # z zlib
+ # PATHS
+ # /usr/lib
+ # /usr/local/lib
+ # DOC
+ # "if more libraries are necessary to link into ACE, specify them here."
+ # )
+ endif()
if ( ACE_LIBRARY )
if ( ACE_INCLUDE_DIR )
- set( ACE_FOUND 1 )
+ if (_ACE_VERSION)
+ set(ACE_VERSION "${_ACE_VERSION}")
+ else (_ACE_VERSION)
+ file(STRINGS "${ACE_INCLUDE_DIR}/ace/Version.h" ACE_VERSION_STR REGEX "^#define ACE_VERSION \".*\"")
+ string(REGEX REPLACE "^.*ACE_VERSION \"([0-9].[0-9].[0-9a-z]).*$"
+ "\\1" ACE_VERSION "${ACE_VERSION_STR}")
+ endif (_ACE_VERSION)
+
+ include(EnsureVersion)
+ ENSURE_VERSION( "${ACE_EXPECTED_VERSION}" "${ACE_VERSION}" ACE_FOUND)
+ if (NOT ACE_FOUND)
+ message(FATAL_ERROR "TrinityCore needs ACE version ${ACE_EXPECTED_VERSION} but found version ${ACE_VERSION}")
+ endif()
+
message( STATUS "Found ACE library: ${ACE_LIBRARY}")
message( STATUS "Found ACE headers: ${ACE_INCLUDE_DIR}")
else ( ACE_INCLUDE_DIR )
diff --git a/cmake/macros/FindOpenSSL.cmake b/cmake/macros/FindOpenSSL.cmake
index 245a91d4199..1cc34b36a4c 100644
--- a/cmake/macros/FindOpenSSL.cmake
+++ b/cmake/macros/FindOpenSSL.cmake
@@ -171,10 +171,57 @@ ELSE(WIN32 AND NOT CYGWIN)
ENDIF(WIN32 AND NOT CYGWIN)
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(OpenSSL DEFAULT_MSG
- OPENSSL_LIBRARIES
- OPENSSL_INCLUDE_DIR
-)
+if (NOT OPENSSL_INCLUDE_DIR)
+ include(FindPackageHandleStandardArgs)
+ find_package_handle_standard_args(OpenSSL DEFAULT_MSG
+ OPENSSL_LIBRARIES
+ OPENSSL_INCLUDE_DIR
+ )
+endif()
+
+if (OPENSSL_INCLUDE_DIR)
+ message( STATUS "Found OpenSSL library: ${OPENSSL_LIBRARIES}")
+ message( STATUS "Found OpenSSL headers: ${OPENSSL_INCLUDE_DIR}")
+ if (_OPENSSL_VERSION)
+ set(OPENSSL_VERSION "${_OPENSSL_VERSION}")
+ else (_OPENSSL_VERSION)
+ file(STRINGS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h" openssl_version_str
+ REGEX "^#define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x[0-9][0-9][0-9][0-9][0-9][0-9].*")
+
+ # The version number is encoded as 0xMNNFFPPS: major minor fix patch status
+ # The status gives if this is a developer or prerelease and is ignored here.
+ # Major, minor, and fix directly translate into the version numbers shown in
+ # the string. The patch field translates to the single character suffix that
+ # indicates the bug fix state, which 00 -> nothing, 01 -> a, 02 -> b and so
+ # on.
+
+ string(REGEX REPLACE "^.*OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f]).*$"
+ "\\1;\\2;\\3;\\4;\\5" OPENSSL_VERSION_LIST "${openssl_version_str}")
+ list(GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR)
+ list(GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR)
+ list(GET OPENSSL_VERSION_LIST 2 OPENSSL_VERSION_FIX)
+ list(GET OPENSSL_VERSION_LIST 3 OPENSSL_VERSION_PATCH)
+
+ string(REGEX REPLACE "^0(.)" "\\1" OPENSSL_VERSION_MINOR "${OPENSSL_VERSION_MINOR}")
+ string(REGEX REPLACE "^0(.)" "\\1" OPENSSL_VERSION_FIX "${OPENSSL_VERSION_FIX}")
+
+ if (NOT OPENSSL_VERSION_PATCH STREQUAL "00")
+ # 96 is the ASCII code of 'a' minus 1
+ math(EXPR OPENSSL_VERSION_PATCH_ASCII "${OPENSSL_VERSION_PATCH} + 96")
+ # Once anyone knows how OpenSSL would call the patch versions beyond 'z'
+ # this should be updated to handle that, too. This has not happened yet
+ # so it is simply ignored here for now.
+ string(ASCII "${OPENSSL_VERSION_PATCH_ASCII}" OPENSSL_VERSION_PATCH_STRING)
+ endif (NOT OPENSSL_VERSION_PATCH STREQUAL "00")
+
+ set(OPENSSL_VERSION "${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_MINOR}.${OPENSSL_VERSION_FIX}${OPENSSL_VERSION_PATCH_STRING}")
+ endif (_OPENSSL_VERSION)
+
+ include(EnsureVersion)
+ ENSURE_VERSION( "${OPENSSL_EXPECTED_VERSION}" "${OPENSSL_VERSION}" OPENSSL_VERSION_OK)
+ if (NOT OPENSSL_VERSION_OK)
+ message(FATAL_ERROR "TrinityCore needs OpenSSL version ${OPENSSL_EXPECTED_VERSION} but found version ${OPENSSL_VERSION}")
+ endif()
+endif (OPENSSL_INCLUDE_DIR)
MARK_AS_ADVANCED(OPENSSL_INCLUDE_DIR OPENSSL_LIBRARIES)
diff --git a/sql/updates/world/2013_08_27_01_world_instance_template.sql b/sql/updates/world/2013_08_27_01_world_instance_template.sql
new file mode 100644
index 00000000000..75000549464
--- /dev/null
+++ b/sql/updates/world/2013_08_27_01_world_instance_template.sql
@@ -0,0 +1 @@
+UPDATE `instance_template` SET `script`='instance_vault_of_archavon' WHERE `map`=624;
diff --git a/sql/updates/world/2013_08_27_02_world_reputation_reward_rate.sql b/sql/updates/world/2013_08_27_02_world_reputation_reward_rate.sql
new file mode 100644
index 00000000000..57776c61e82
--- /dev/null
+++ b/sql/updates/world/2013_08_27_02_world_reputation_reward_rate.sql
@@ -0,0 +1 @@
+ALTER TABLE `reputation_reward_rate` ADD `quest_repeteable_rate` FLOAT NOT NULL DEFAULT '1' AFTER `quest_weekly_rate`;
diff --git a/sql/updates/world/2013_08_27_03_world_reputation_reward_rate.sql b/sql/updates/world/2013_08_27_03_world_reputation_reward_rate.sql
new file mode 100644
index 00000000000..e3398568b7b
--- /dev/null
+++ b/sql/updates/world/2013_08_27_03_world_reputation_reward_rate.sql
@@ -0,0 +1 @@
+UPDATE `reputation_reward_rate` SET `quest_repeteable_rate`=3 WHERE `faction`=970; -- Sporegar, 3x on repeteable quests
diff --git a/sql/updates/world/2013_08_27_04_world_reputation_reward_rate.sql b/sql/updates/world/2013_08_27_04_world_reputation_reward_rate.sql
new file mode 100644
index 00000000000..a260cf61c25
--- /dev/null
+++ b/sql/updates/world/2013_08_27_04_world_reputation_reward_rate.sql
@@ -0,0 +1 @@
+ALTER TABLE `reputation_reward_rate` CHANGE `quest_repeteable_rate` `quest_repeatable_rate` FLOAT NOT NULL DEFAULT '1';
diff --git a/sql/updates/world/2013_08_28_00_world_misc.sql b/sql/updates/world/2013_08_28_00_world_misc.sql
new file mode 100644
index 00000000000..bd414f4d623
--- /dev/null
+++ b/sql/updates/world/2013_08_28_00_world_misc.sql
@@ -0,0 +1,17 @@
+DELETE FROM `creature_text` WHERE `entry` IN (24068, 23954, 23980);
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES
+(24068, 0, 0, 'Ingvar! Your pathetic failure will serve as a warning to all... you are damned! Arise and carry out the master''s will!', 14, 0, 100, 0, 0, 13754, 'Annhylde the Caller to Ingvar the Plunderer'),
+
+(23954, 0, 0, 'I''ll paint my face with your blood!', 14, 0, 100, 0, 0, 13207, 'Ingvar the Plunderer - SAY_AGGRO_1'),
+(23954, 1, 0, 'Mjul orm agn gjor!', 14, 0, 100, 0, 0, 13212, 'Ingvar the Plunderer - SAY_SLAY_1'),
+(23954, 2, 0, 'My life for the... death god!', 14, 0, 100, 0, 0, 13213, 'Ingvar the Plunderer - SAY_DEATH_1'),
+
+(23954, 3, 0, 'I return! A second chance to carve your skull!', 14, 0, 100, 0, 0, 13209, 'Ingvar the Plunderer - SAY_AGGRO_2'),
+(23954, 4, 0, 'I am a warrior born!', 14, 0, 100, 0, 0, 13214, 'Ingvar the Plunderer - SAY_SLAY_2'),
+(23954, 5, 0, 'No! I can do... better! I can...', 14, 0, 100, 0, 0, 13211, 'Ingvar the Plunderer - SAY_DEATH_2');
+
+UPDATE `creature_template` SET `lootid`=`entry` WHERE entry IN (23954, 31673);
+UPDATE `creature_template` SET `lootid`=0 WHERE entry IN (23980, 31674);
+
+UPDATE `creature_loot_template` SET `entry`=23954 WHERE `entry`=23980;
+UPDATE `creature_loot_template` SET `entry`=31673 WHERE `entry`=31674;
diff --git a/sql/updates/world/2013_08_28_01_world_creature.sql b/sql/updates/world/2013_08_28_01_world_creature.sql
new file mode 100644
index 00000000000..2adf9c127a6
--- /dev/null
+++ b/sql/updates/world/2013_08_28_01_world_creature.sql
@@ -0,0 +1,14 @@
+SET @CGUID := 53919; -- set by TDB team (8)
+
+UPDATE `creature_template` SET `faction_A`=35, `faction_H`=35, `rangeattacktime`=2000, `unit_flags`=32768 WHERE `entry`=30755;
+
+DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+7;
+INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES
+(@CGUID+0, 30755, 571, 1, 1, 5844.797, 479.632, 657.6495, 3.351032, 120, 0, 0), -- Kor'kron Reaver (Area: 4395)
+(@CGUID+1, 30755, 571, 1, 1, 5848.494, 480.568, 657.6278, 3.368485, 120, 0, 0), -- Kor'kron Reaver (Area: 4395)
+(@CGUID+2, 30755, 571, 1, 1, 5845.834, 475.8459, 657.7172, 3.298672, 120, 0, 0), -- Kor'kron Reaver (Area: 4395)
+(@CGUID+3, 30755, 571, 1, 1, 5849.62, 476.4291, 657.7032, 3.222836, 120, 0, 0), -- Kor'kron Reaver (Area: 4395)
+(@CGUID+4, 30352, 571, 1, 1, 5803.514, 494.7659, 657.2115, 5.54129, 120, 0, 0), -- Skybreaker Marine (Area: 4395)
+(@CGUID+5, 30352, 571, 1, 1, 5805.08, 492.9698, 657.2003, 5.584598, 120, 0, 0), -- Skybreaker Marine (Area: 4395)
+(@CGUID+6, 30352, 571, 1, 1, 5801.245, 492.336, 657.3757, 5.602507, 120, 0, 0), -- Skybreaker Marine (Area: 4395)
+(@CGUID+7, 30352, 571, 1, 1, 5802.888, 490.7988, 657.3538, 5.602507, 120, 0, 0); -- Skybreaker Marine (Area: 4395)
diff --git a/sql/updates/world/2013_08_28_02_world_quest_template.sql b/sql/updates/world/2013_08_28_02_world_quest_template.sql
new file mode 100644
index 00000000000..f7dfc831f48
--- /dev/null
+++ b/sql/updates/world/2013_08_28_02_world_quest_template.sql
@@ -0,0 +1,2 @@
+-- Prepping the Speech
+UPDATE `quest_template` SET `Details` = 'High Tinker Mekkatorque asked me to write a speech that he could give before the battle starts, but I just can''t tell which draft is good and which ones just stink.$b$bCould you try some of them out on the local gnome residents? This device creates an image of Mekkatorque saying a few lines from each of my speech drafts.$b$bLet me know which one works, okay?', `RequestItemsText` = 'Let me know which one works, okay?', `OfferRewardText` = 'Oh my. Their reactions were that different?$b$bNot completely what I was expecting, but I think I have a speech that will do.$b$bJust let me find where I put it...' WHERE `id`=25283;
diff --git a/sql/updates/world/2013_08_28_03_world_sai.sql b/sql/updates/world/2013_08_28_03_world_sai.sql
new file mode 100644
index 00000000000..a583e5afba6
--- /dev/null
+++ b/sql/updates/world/2013_08_28_03_world_sai.sql
@@ -0,0 +1,57 @@
+-- Fix Q I'm Not Dead Yet! (13229 / 13221) by Rohlik
+UPDATE `creature_template` SET `AIName` = 'SmartAI', `InhabitType` = 1 WHERE `entry` = 31279;
+UPDATE `quest_template` SET `SpecialFlags` = 2 WHERE `Id` IN (13221, 13229);
+
+DELETE FROM `db_script_string` WHERE `entry` IN (2000000507,2000000508);
+DELETE FROM `waypoint_data` where id=3127900; -- We delete old WP data from DB
+DELETE FROM `waypoint_scripts` WHERE id=31279;
+
+-- Text for NPC Father Kamaros
+DELETE from `creature_text` where `entry`=31279 AND `groupid` IN (1, 2, 3, 4);
+INSERT INTO `creature_text` (`entry`, `groupid`, `text`, `type`, `probability`, `comment`) VALUES
+(31279, 1, 'The Light''s blessing be upon you for aiding me in my time of need, $n.', 12, 100, 'Father Kamaros'),
+(31279, 2, 'I''ve had my fill of this place. Let us depart.', 12, 100, 'Father Kamaros'),
+(31279, 3, 'You must tell my brothers that live.', 12, 100, 'Father Kamaros'),
+(31279, 4, 'I have you to thank for my life. I will return to my comrades and spread word of your bravery. Fight the Scourge with all the strength you can muster, and we will be by your side.', 12, 100, 'Father Kamaros');
+
+-- SAI
+DELETE FROM `smart_scripts` WHERE (`entryorguid`=31279 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
+(31279, 0, 0, 0, 4, 0, 100, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Set Phase 1 on Aggro'),
+(31279, 0, 1, 0, 4, 1, 100, 1, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Stop Moving on Aggro'),
+(31279, 0, 2, 0, 4, 1, 100, 1, 0, 0, 0, 0, 11, 25054, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Cast bolt on Aggro'),
+(31279, 0, 3, 0, 9, 1, 100, 0, 0, 40, 3400, 4700, 11, 25054, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Cast bolt'),
+(31279, 0, 4, 0, 9, 1, 100, 0, 40, 100, 0, 0, 21, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Start Moving when not in bolt Range'),
+(31279, 0, 5, 0, 9, 1, 100, 0, 10, 15, 0, 0, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Stop Moving at 15 Yards'),
+(31279, 0, 6, 0, 9, 1, 100, 0, 0, 40, 0, 0, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Stop Moving when in bolt Range'),
+(31279, 0, 7, 0, 3, 1, 100, 0, 0, 15, 0, 0, 22, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Set Phase 2 at 15% Mana'),
+(31279, 0, 8, 0, 3, 2, 100, 0, 0, 15, 0, 0, 21, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Start Moving at 15% Mana'),
+(31279, 0, 9, 0, 3, 2, 100, 0, 30, 100, 100, 100, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Set Phase 1 When Mana is above 30%'),
+(31279, 0, 11, 0, 0, 1, 100, 0, 5000, 6200, 11700, 15600, 11, 17146, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 'Cast Shadow Word: Pain'),
+(31279, 0, 12, 0, 2, 0, 100, 1, 0, 50, 0, 0, 11, 32595, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Cast Power Word: Shield at 50% HP'),
+(31279, 0, 13, 14, 19, 0, 100, 0, 0, 0, 0, 0, 75, 58921, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Father Kamaros - On accept Q - Cast Power Word Fortitude'),
+(31279, 0, 14, 15, 61, 0, 100, 0, 0, 0, 0, 0, 1, 1, 4000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Father Kamaros - On accept Q - Start talking'),
+(31279, 0, 15, 0, 52, 0, 100, 0, 1, 31279, 0, 0, 1, 2, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Father Kamaros - On accept Q - After 4 sec start talking again'),
+(31279, 0, 16, 0, 61, 0, 100, 0, 0, 0, 0, 0, 1, 2, 1000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Father Kamaros - On accept Q - After 4 sec start talking again'),
+(31279, 0, 17, 0, 52, 0, 100, 0, 2, 31279, 0, 0, 53, 0, 31279, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 'Father Kamaros - After 5 sec - WP load'),
+(31279, 0, 18, 0, 40, 0, 100, 0, 13, 0, 0, 0, 1, 3, 2900, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Father Kamaros - On last WP point - Say something'),
+(31279, 0, 19, 0, 52, 0, 100, 0, 3, 31279, 0, 0, 1, 4, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Father Kamaros - On last WP point - Say something 2'),
+(31279, 0, 20, 0, 52, 0, 100, 0, 4, 31279, 0, 0, 15, 13229, 0, 0, 0, 0, 0, 18, 30, 0, 0, 0, 0, 0, 0, 'Father Kamaros - On last WP point - Q complete(horde)'),
+(31279, 0, 21, 0, 52, 0, 100, 0, 4, 31279, 0, 0, 15, 13221, 0, 0, 0, 0, 0, 18, 30, 0, 0, 0, 0, 0, 0, 'Father Kamaros - On last WP point - Q complete(ali)'),
+(31279, 0, 22, 0, 52, 0, 100, 0, 4, 31279, 0, 0, 41, 1000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Father Kamaros - after final talking - despawn');
+
+-- WP for NPC Father Kamaros
+DELETE from `waypoints` where `entry`=31279;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(31279, 1, 6716.76, 3436.7, 682.197, 'Q I''m Not Dead Yet!'),
+(31279, 2, 6724.09, 3433.56, 682.197, 'Q I''m Not Dead Yet!'),
+(31279, 3, 6734.95, 3435.7, 681.87, 'Q I''m Not Dead Yet!'),
+(31279, 4, 6766.36, 3464.42, 673.201, 'Q I''m Not Dead Yet!'),
+(31279, 5, 6782.48, 3478.07, 674.097, 'Q I''m Not Dead Yet!'),
+(31279, 6, 6789.64, 3484.14, 676.423, 'Q I''m Not Dead Yet!'),
+(31279, 7, 6815.31, 3483.01, 685.829, 'Q I''m Not Dead Yet!'),
+(31279, 9, 6875.41, 3479.14, 694.799, 'Q I''m Not Dead Yet!'),
+(31279, 10, 6946.3, 3477.29, 708.832, 'Q I''m Not Dead Yet!'),
+(31279, 11, 6980.65, 3468.12, 710.813, 'Q I''m Not Dead Yet!'),
+(31279, 12, 7008.43, 3458.64, 696.751, 'Q I''m Not Dead Yet!'),
+(31279, 13, 7042.92, 3438.07, 695.543, 'Q I''m Not Dead Yet!');
diff --git a/sql/updates/world/2013_08_28_04_world_conditions.sql b/sql/updates/world/2013_08_28_04_world_conditions.sql
new file mode 100644
index 00000000000..b164b4f0dd1
--- /dev/null
+++ b/sql/updates/world/2013_08_28_04_world_conditions.sql
@@ -0,0 +1,4 @@
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=1 AND `SourceGroup` IN (23980,31674,23954,31673);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(1,23954,43228,0,0,1,0,57940,0,0,0,0,0,'','Can loot Stone Keeper''s Shard only with aura Essence of Wintergrasp'),
+(1,31673,43228,0,0,1,0,57940,0,0,0,0,0,'','Can loot Stone Keeper''s Shard only with aura Essence of Wintergrasp');
diff --git a/sql/updates/world/2013_08_28_05_world_misc.sql b/sql/updates/world/2013_08_28_05_world_misc.sql
new file mode 100644
index 00000000000..066a2dbfc73
--- /dev/null
+++ b/sql/updates/world/2013_08_28_05_world_misc.sql
@@ -0,0 +1,14 @@
+DELETE from `waypoints` where `entry`=31279;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(31279, 1, 6716.76, 3436.7, 682.197, 'Q I''m Not Dead Yet!'),
+(31279, 2, 6724.09, 3433.56, 682.197, 'Q I''m Not Dead Yet!'),
+(31279, 3, 6734.95, 3435.7, 681.87, 'Q I''m Not Dead Yet!'),
+(31279, 4, 6766.36, 3464.42, 673.201, 'Q I''m Not Dead Yet!'),
+(31279, 5, 6782.48, 3478.07, 674.097, 'Q I''m Not Dead Yet!'),
+(31279, 6, 6789.64, 3484.14, 676.423, 'Q I''m Not Dead Yet!'),
+(31279, 7, 6815.31, 3483.01, 685.829, 'Q I''m Not Dead Yet!'),
+(31279, 8, 6875.41, 3479.14, 694.799, 'Q I''m Not Dead Yet!'),
+(31279, 9, 6946.3, 3477.29, 708.832, 'Q I''m Not Dead Yet!'),
+(31279, 10, 6980.65, 3468.12, 710.813, 'Q I''m Not Dead Yet!'),
+(31279, 11, 7008.43, 3458.64, 696.751, 'Q I''m Not Dead Yet!'),
+(31279, 12, 7042.92, 3438.07, 695.543, 'Q I''m Not Dead Yet!');
diff --git a/src/server/collision/BoundingIntervalHierarchyWrapper.h b/src/server/collision/BoundingIntervalHierarchyWrapper.h
index 305d57b0075..8696a759fa8 100644
--- a/src/server/collision/BoundingIntervalHierarchyWrapper.h
+++ b/src/server/collision/BoundingIntervalHierarchyWrapper.h
@@ -37,20 +37,22 @@ class BIHWrap
MDLCallback(RayCallback& callback, const T* const* objects_array, uint32 objects_size ) : objects(objects_array), _callback(callback), objects_size(objects_size) {}
- bool operator() (const G3D::Ray& ray, uint32 Idx, float& MaxDist, bool /*stopAtFirst*/)
+ /// Intersect ray
+ bool operator() (const G3D::Ray& ray, uint32 idx, float& maxDist, bool /*stopAtFirst*/)
{
- if (Idx >= objects_size)
+ if (idx >= objects_size)
return false;
- if (const T* obj = objects[Idx])
- return _callback(ray, *obj, MaxDist/*, stopAtFirst*/);
+ if (const T* obj = objects[idx])
+ return _callback(ray, *obj, maxDist/*, stopAtFirst*/);
return false;
}
- void operator() (const G3D::Vector3& p, uint32 Idx)
+ /// Intersect point
+ void operator() (const G3D::Vector3& p, uint32 idx)
{
- if (Idx >= objects_size)
- return false;
- if (const T* obj = objects[Idx])
+ if (idx >= objects_size)
+ return;
+ if (const T* obj = objects[idx])
_callback(p, *obj);
}
};
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 73f0d09cace..594d33357b4 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -985,7 +985,7 @@ bool Player::Create(uint32 guidlow, CharacterCreateInfo* createInfo)
if (!IsValidGender(createInfo->Gender))
{
- TC_LOG_ERROR(LOG_FILTER_PLAYER, "Player::Create: Possible hacking-attempt: Account %u tried creating a character named '%s' with an invalid gender (%hu) - refusing to do so",
+ TC_LOG_ERROR(LOG_FILTER_PLAYER, "Player::Create: Possible hacking-attempt: Account %u tried creating a character named '%s' with an invalid gender (%u) - refusing to do so",
GetSession()->GetAccountId(), m_name.c_str(), createInfo->Gender);
return false;
}
@@ -6924,6 +6924,7 @@ int32 Player::CalculateReputationGain(ReputationSource source, uint32 creatureOr
case REPUTATION_SOURCE_DAILY_QUEST:
case REPUTATION_SOURCE_WEEKLY_QUEST:
case REPUTATION_SOURCE_MONTHLY_QUEST:
+ case REPUTATION_SOURCE_REPEATABLE_QUEST:
rate = sWorld->getRate(RATE_REPUTATION_LOWLEVEL_QUEST);
break;
case REPUTATION_SOURCE_SPELL:
@@ -6959,6 +6960,9 @@ int32 Player::CalculateReputationGain(ReputationSource source, uint32 creatureOr
case REPUTATION_SOURCE_MONTHLY_QUEST:
repRate = repData->questMonthlyRate;
break;
+ case REPUTATION_SOURCE_REPEATABLE_QUEST:
+ repRate = repData->questRepeatableRate;
+ break;
case REPUTATION_SOURCE_SPELL:
repRate = repData->spellRate;
break;
@@ -7062,6 +7066,8 @@ void Player::RewardReputation(Quest const* quest)
rep = CalculateReputationGain(REPUTATION_SOURCE_WEEKLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], noQuestBonus);
else if (quest->IsMonthly())
rep = CalculateReputationGain(REPUTATION_SOURCE_MONTHLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], noQuestBonus);
+ else if (quest->IsRepeatable())
+ rep = CalculateReputationGain(REPUTATION_SOURCE_REPEATABLE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], noQuestBonus);
else
rep = CalculateReputationGain(REPUTATION_SOURCE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], noQuestBonus);
@@ -17127,10 +17133,10 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder)
// overwrite possible wrong/corrupted guid
SetUInt64Value(OBJECT_FIELD_GUID, MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER));
- uint8 Gender = fields[5].GetUInt8();
- if (!IsValidGender(Gender))
+ uint8 gender = fields[5].GetUInt8();
+ if (!IsValidGender(gender))
{
- TC_LOG_ERROR(LOG_FILTER_PLAYER, "Player (GUID: %u) has wrong gender (%hu), can't be loaded.", guid, Gender);
+ TC_LOG_ERROR(LOG_FILTER_PLAYER, "Player (GUID: %u) has wrong gender (%u), can't be loaded.", guid, gender);
return false;
}
@@ -17138,7 +17144,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder)
uint32 bytes0 = 0;
bytes0 |= fields[3].GetUInt8(); // race
bytes0 |= fields[4].GetUInt8() << 8; // class
- bytes0 |= Gender << 16; // gender
+ bytes0 |= gender << 16; // gender
SetUInt32Value(UNIT_FIELD_BYTES_0, bytes0);
SetUInt32Value(UNIT_FIELD_LEVEL, fields[6].GetUInt8());
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 8fc7deb59ff..491f8e39d28 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -319,6 +319,7 @@ enum ReputationSource
REPUTATION_SOURCE_DAILY_QUEST,
REPUTATION_SOURCE_WEEKLY_QUEST,
REPUTATION_SOURCE_MONTHLY_QUEST,
+ REPUTATION_SOURCE_REPEATABLE_QUEST,
REPUTATION_SOURCE_SPELL
};
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index fde3c0ddfae..97999cb749d 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -2812,8 +2812,6 @@ void Unit::SetCurrentCastedSpell(Spell* pSpell)
void Unit::InterruptSpell(CurrentSpellTypes spellType, bool withDelayed, bool withInstant)
{
- ASSERT(spellType < CURRENT_MAX_SPELL);
-
//TC_LOG_DEBUG(LOG_FILTER_UNITS, "Interrupt spell for unit %u.", GetEntry());
Spell* spell = m_currentSpells[spellType];
if (spell
@@ -12260,7 +12258,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
Unit* actionTarget = !isVictim ? target : this;
DamageInfo damageInfo = DamageInfo(actor, actionTarget, damage, procSpell, procSpell ? SpellSchoolMask(procSpell->SchoolMask) : SPELL_SCHOOL_MASK_NORMAL, SPELL_DIRECT_DAMAGE);
- HealInfo healInfo = HealInfo(actor, actionTarget, damage, procSpell, procSpell ? SpellSchoolMask(procSpell->SchoolMask) : SPELL_SCHOOL_MASK_NORMAL);
+ HealInfo healInfo = HealInfo(damage);
ProcEventInfo eventInfo = ProcEventInfo(actor, actionTarget, target, procFlag, 0, 0, procExtra, NULL, &damageInfo, &healInfo);
ProcTriggeredList procTriggered;
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index ce1763daa23..8dc4b49eec3 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -481,11 +481,10 @@ enum BaseModGroup
enum BaseModType
{
FLAT_MOD,
- PCT_MOD
+ PCT_MOD,
+ MOD_END
};
-#define MOD_END (PCT_MOD+1)
-
enum DeathState
{
ALIVE = 0,
@@ -887,15 +886,11 @@ public:
class HealInfo
{
private:
- Unit* const m_healer;
- Unit* const m_target;
uint32 m_heal;
uint32 m_absorb;
- SpellInfo const* const m_spellInfo;
- SpellSchoolMask const m_schoolMask;
public:
- explicit HealInfo(Unit* _healer, Unit* _target, uint32 _heal, SpellInfo const* _spellInfo, SpellSchoolMask _schoolMask)
- : m_healer(_healer), m_target(_target), m_heal(_heal), m_spellInfo(_spellInfo), m_schoolMask(_schoolMask)
+ explicit HealInfo(uint32 heal)
+ : m_heal(heal)
{
m_absorb = 0;
}
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index e95779c1f20..38971cd3e30 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -6698,8 +6698,8 @@ void ObjectMgr::LoadReputationRewardRate()
_repRewardRateStore.clear(); // for reload case
- uint32 count = 0; // 0 1 2 3 4 5 6
- QueryResult result = WorldDatabase.Query("SELECT faction, quest_rate, quest_daily_rate, quest_weekly_rate, quest_monthly_rate, creature_rate, spell_rate FROM reputation_reward_rate");
+ uint32 count = 0; // 0 1 2 3 4 5 6 7
+ QueryResult result = WorldDatabase.Query("SELECT faction, quest_rate, quest_daily_rate, quest_weekly_rate, quest_monthly_rate, quest_repeatable_rate, creature_rate, spell_rate FROM reputation_reward_rate");
if (!result)
{
TC_LOG_ERROR(LOG_FILTER_SERVER_LOADING, ">> Loaded `reputation_reward_rate`, table is empty!");
@@ -6718,8 +6718,9 @@ void ObjectMgr::LoadReputationRewardRate()
repRate.questDailyRate = fields[2].GetFloat();
repRate.questWeeklyRate = fields[3].GetFloat();
repRate.questMonthlyRate = fields[4].GetFloat();
- repRate.creatureRate = fields[5].GetFloat();
- repRate.spellRate = fields[6].GetFloat();
+ repRate.questRepeatableRate = fields[5].GetFloat();
+ repRate.creatureRate = fields[6].GetFloat();
+ repRate.spellRate = fields[7].GetFloat();
FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId);
if (!factionEntry)
@@ -6752,6 +6753,12 @@ void ObjectMgr::LoadReputationRewardRate()
continue;
}
+ if (repRate.questRepeatableRate < 0.0f)
+ {
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Table reputation_reward_rate has quest_repeatable_rate with invalid rate %f, skipping data for faction %u", repRate.questRepeatableRate, factionId);
+ continue;
+ }
+
if (repRate.creatureRate < 0.0f)
{
TC_LOG_ERROR(LOG_FILTER_SQL, "Table reputation_reward_rate has creature_rate with invalid rate %f, skipping data for faction %u", repRate.creatureRate, factionId);
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 4779700c092..622fbe339e4 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -485,6 +485,7 @@ struct RepRewardRate
float questDailyRate;
float questWeeklyRate;
float questMonthlyRate;
+ float questRepeatableRate;
float creatureRate; // no reputation are given at all for this faction/rate type.
float spellRate;
};
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h
index 10ccd6a77f3..813499e91d7 100644
--- a/src/server/game/Grids/Notifiers/GridNotifiers.h
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.h
@@ -740,13 +740,12 @@ namespace Trinity
class GameObjectWithDbGUIDCheck
{
public:
- GameObjectWithDbGUIDCheck(WorldObject const& obj, uint32 db_guid) : i_obj(obj), i_db_guid(db_guid) {}
+ GameObjectWithDbGUIDCheck(WorldObject const& /*obj*/, uint32 db_guid) : i_db_guid(db_guid) {}
bool operator()(GameObject const* go) const
{
return go->GetDBTableGUIDLow() == i_db_guid;
}
private:
- WorldObject const& i_obj;
uint32 i_db_guid;
};
@@ -874,13 +873,12 @@ namespace Trinity
class CreatureWithDbGUIDCheck
{
public:
- CreatureWithDbGUIDCheck(WorldObject const* obj, uint32 lowguid) : i_obj(obj), i_lowguid(lowguid) {}
+ CreatureWithDbGUIDCheck(WorldObject const* /*obj*/, uint32 lowguid) : i_lowguid(lowguid) {}
bool operator()(Creature* u)
{
return u->GetDBTableGUIDLow() == i_lowguid;
}
private:
- WorldObject const* i_obj;
uint32 i_lowguid;
};
diff --git a/src/server/game/Grids/ObjectGridLoader.cpp b/src/server/game/Grids/ObjectGridLoader.cpp
index 9293f9e9b84..9d1e179db6f 100644
--- a/src/server/game/Grids/ObjectGridLoader.cpp
+++ b/src/server/game/Grids/ObjectGridLoader.cpp
@@ -50,7 +50,7 @@ class ObjectWorldLoader
{
public:
explicit ObjectWorldLoader(ObjectGridLoader& gloader)
- : i_cell(gloader.i_cell), i_grid(gloader.i_grid), i_map(gloader.i_map), i_corpses (0)
+ : i_cell(gloader.i_cell), i_map(gloader.i_map), i_corpses (0)
{}
void Visit(CorpseMapType &m);
@@ -59,7 +59,6 @@ class ObjectWorldLoader
private:
Cell i_cell;
- NGridType &i_grid;
Map* i_map;
public:
uint32 i_corpses;
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index d963750094c..ef8e3712af8 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -2827,10 +2827,10 @@ void Guild::SetBankTabText(uint8 tabId, std::string const& text)
// Private methods
void Guild::_CreateLogHolders()
{
- m_eventLog = new LogHolder(m_id, sWorld->getIntConfig(CONFIG_GUILD_EVENT_LOG_COUNT));
- m_newsLog = new LogHolder(m_id, sWorld->getIntConfig(CONFIG_GUILD_NEWS_LOG_COUNT));
+ m_eventLog = new LogHolder(sWorld->getIntConfig(CONFIG_GUILD_EVENT_LOG_COUNT));
+ m_newsLog = new LogHolder(sWorld->getIntConfig(CONFIG_GUILD_NEWS_LOG_COUNT));
for (uint8 tabId = 0; tabId <= GUILD_BANK_MAX_TABS; ++tabId)
- m_bankEventLog[tabId] = new LogHolder(m_id, sWorld->getIntConfig(CONFIG_GUILD_BANK_EVENT_LOG_COUNT));
+ m_bankEventLog[tabId] = new LogHolder(sWorld->getIntConfig(CONFIG_GUILD_BANK_EVENT_LOG_COUNT));
}
void Guild::_CreateNewBankTab()
diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h
index cf03cb58748..9bf52cb08f2 100644
--- a/src/server/game/Guilds/Guild.h
+++ b/src/server/game/Guilds/Guild.h
@@ -548,7 +548,7 @@ private:
class LogHolder
{
public:
- LogHolder(uint32 guildId, uint32 maxRecords) : m_guildId(guildId), m_maxRecords(maxRecords), m_nextGUID(uint32(GUILD_EVENT_LOG_GUID_UNDEFINED)) { }
+ LogHolder(uint32 maxRecords) : m_maxRecords(maxRecords), m_nextGUID(uint32(GUILD_EVENT_LOG_GUID_UNDEFINED)) { }
~LogHolder();
uint8 GetSize() const { return uint8(m_log.size()); }
@@ -565,7 +565,6 @@ private:
private:
GuildLog m_log;
- uint32 m_guildId;
uint32 m_maxRecords;
uint32 m_nextGUID;
};
diff --git a/src/server/game/Instances/InstanceSaveMgr.h b/src/server/game/Instances/InstanceSaveMgr.h
index ef55005d0d6..e3717a934c3 100644
--- a/src/server/game/Instances/InstanceSaveMgr.h
+++ b/src/server/game/Instances/InstanceSaveMgr.h
@@ -82,14 +82,14 @@ class InstanceSave
does not include the members of the group unless they have permanent saves */
void AddPlayer(Player* player) { TRINITY_GUARD(ACE_Thread_Mutex, _lock); m_playerList.push_back(player); }
bool RemovePlayer(Player* player)
- {
+ {
_lock.acquire();
m_playerList.remove(player);
bool isStillValid = UnloadIfEmpty();
_lock.release();
//delete here if needed, after releasing the lock
- if(m_toDelete)
+ if (m_toDelete)
delete this;
return isStillValid;
@@ -97,10 +97,10 @@ class InstanceSave
/* all groups bound to the instance */
void AddGroup(Group* group) { m_groupList.push_back(group); }
bool RemoveGroup(Group* group)
- {
+ {
m_groupList.remove(group);
bool isStillValid = UnloadIfEmpty();
- if(m_toDelete)
+ if (m_toDelete)
delete this;
return isStillValid;
}
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
index 437638da16d..5ba6d09553d 100644
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/game/Scripting/ScriptLoader.cpp
@@ -375,23 +375,36 @@ void AddSC_thunder_bluff();
void AddSC_ungoro_crater();
void AddSC_winterspring();
-//northrend
+// Northrend
+
void AddSC_boss_slad_ran();
void AddSC_boss_moorabi();
void AddSC_boss_drakkari_colossus();
void AddSC_boss_gal_darah();
void AddSC_boss_eck();
void AddSC_instance_gundrak();
-void AddSC_boss_krik_thir(); //Azjol-Nerub
+
+// Azjol-Nerub - Azjol-Nerub
+void AddSC_boss_krik_thir();
void AddSC_boss_hadronox();
void AddSC_boss_anub_arak();
void AddSC_instance_azjol_nerub();
-void AddSC_instance_ahnkahet(); //Azjol-Nerub Ahn'kahet
-void AddSC_boss_amanitar();
+
+// Azjol-Nerub - Ahn'kahet
+void AddSC_boss_elder_nadox();
void AddSC_boss_taldaram();
+void AddSC_boss_amanitar();
void AddSC_boss_jedoga_shadowseeker();
-void AddSC_boss_elder_nadox();
void AddSC_boss_volazj();
+void AddSC_instance_ahnkahet();
+
+// Drak'Tharon Keep
+void AddSC_boss_trollgore();
+void AddSC_boss_novos();
+void AddSC_boss_king_dred();
+void AddSC_boss_tharon_ja();
+void AddSC_instance_drak_tharon_keep();
+
void AddSC_boss_argent_challenge(); //Trial of the Champion
void AddSC_boss_black_knight();
void AddSC_boss_grand_champions();
@@ -460,26 +473,28 @@ void AddSC_boss_freya();
void AddSC_boss_yogg_saron();
void AddSC_boss_algalon_the_observer();
void AddSC_instance_ulduar();
-void AddSC_boss_keleseth(); //Utgarde Keep
+
+// Utgarde Keep - Utgarde Keep
+void AddSC_boss_keleseth();
void AddSC_boss_skarvald_dalronn();
void AddSC_boss_ingvar_the_plunderer();
void AddSC_instance_utgarde_keep();
-void AddSC_boss_svala(); //Utgarde pinnacle
+void AddSC_utgarde_keep();
+
+// Utgarde Keep - Utgarde Pinnacle
+void AddSC_boss_svala();
void AddSC_boss_palehoof();
void AddSC_boss_skadi();
void AddSC_boss_ymiron();
void AddSC_instance_utgarde_pinnacle();
-void AddSC_utgarde_keep();
-void AddSC_boss_archavon(); //Vault of Archavon
+
+// Vault of Archavon
+void AddSC_boss_archavon();
void AddSC_boss_emalon();
void AddSC_boss_koralon();
void AddSC_boss_toravon();
-void AddSC_instance_archavon();
-void AddSC_boss_trollgore(); //Drak'Tharon Keep
-void AddSC_boss_novos();
-void AddSC_boss_king_dred();
-void AddSC_boss_tharon_ja();
-void AddSC_instance_drak_tharon_keep();
+void AddSC_instance_vault_of_archavon();
+
void AddSC_boss_cyanigosa(); //Violet Hold
void AddSC_boss_erekem();
void AddSC_boss_ichoron();
@@ -1175,12 +1190,28 @@ void AddNorthrendScripts()
AddSC_boss_gal_darah();
AddSC_boss_eck();
AddSC_instance_gundrak();
- AddSC_boss_amanitar();
- AddSC_boss_taldaram(); //Azjol-Nerub Ahn'kahet
+
+ // Azjol-Nerub - Ahn'kahet
AddSC_boss_elder_nadox();
+ AddSC_boss_taldaram();
+ AddSC_boss_amanitar();
AddSC_boss_jedoga_shadowseeker();
AddSC_boss_volazj();
AddSC_instance_ahnkahet();
+
+ // Azjol-Nerub - Azjol-Nerub
+ AddSC_boss_krik_thir();
+ AddSC_boss_hadronox();
+ AddSC_boss_anub_arak();
+ AddSC_instance_azjol_nerub();
+
+ // Drak'Tharon Keep
+ AddSC_boss_trollgore();
+ AddSC_boss_novos();
+ AddSC_boss_king_dred();
+ AddSC_boss_tharon_ja();
+ AddSC_instance_drak_tharon_keep();
+
AddSC_boss_argent_challenge(); //Trial of the Champion
AddSC_boss_black_knight();
AddSC_boss_grand_champions();
@@ -1193,10 +1224,6 @@ void AddNorthrendScripts()
AddSC_boss_twin_valkyr();
AddSC_boss_northrend_beasts();
AddSC_instance_trial_of_the_crusader();
- AddSC_boss_krik_thir(); //Azjol-Nerub Azjol-Nerub
- AddSC_boss_hadronox();
- AddSC_boss_anub_arak();
- AddSC_instance_azjol_nerub();
AddSC_boss_anubrekhan(); //Naxxramas
AddSC_boss_maexxna();
AddSC_boss_patchwerk();
@@ -1253,26 +1280,28 @@ void AddNorthrendScripts()
AddSC_boss_yogg_saron();
AddSC_boss_algalon_the_observer();
AddSC_instance_ulduar();
- AddSC_boss_keleseth(); //Utgarde Keep
+
+ // Utgarde Keep - Utgarde Keep
+ AddSC_boss_keleseth();
AddSC_boss_skarvald_dalronn();
AddSC_boss_ingvar_the_plunderer();
AddSC_instance_utgarde_keep();
- AddSC_boss_svala(); //Utgarde pinnacle
+ AddSC_utgarde_keep();
+
+ // Utgarde Keep - Utgarde Pinnacle
+ AddSC_boss_svala();
AddSC_boss_palehoof();
AddSC_boss_skadi();
AddSC_boss_ymiron();
AddSC_instance_utgarde_pinnacle();
- AddSC_utgarde_keep();
- AddSC_boss_archavon(); //Vault of Archavon
+
+ // Vault of Archavon
+ AddSC_boss_archavon();
AddSC_boss_emalon();
AddSC_boss_koralon();
AddSC_boss_toravon();
- AddSC_instance_archavon();
- AddSC_boss_trollgore(); //Drak'Tharon Keep
- AddSC_boss_novos();
- AddSC_boss_king_dred();
- AddSC_boss_tharon_ja();
- AddSC_instance_drak_tharon_keep();
+ AddSC_instance_vault_of_archavon();
+
AddSC_boss_cyanigosa(); //Violet Hold
AddSC_boss_erekem();
AddSC_boss_ichoron();
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index 617a50c2344..94128262388 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -681,7 +681,6 @@ void AuraEffect::CalculateSpellMod()
{
m_spellmod = new SpellModifier(GetBase());
m_spellmod->op = SpellModOp(GetMiscValue());
- ASSERT(m_spellmod->op < MAX_SPELLMOD);
m_spellmod->type = SpellModType(uint32(GetAuraType())); // SpellModType value == spell aura types
m_spellmod->spellId = GetId();
@@ -2154,9 +2153,6 @@ void AuraEffect::HandleFeignDeath(AuraApplication const* aurApp, uint8 mode, boo
Unit* target = aurApp->GetTarget();
- if (target->GetTypeId() != TYPEID_PLAYER)
- return;
-
if (apply)
{
/*
@@ -2194,14 +2190,14 @@ void AuraEffect::HandleFeignDeath(AuraApplication const* aurApp, uint8 mode, boo
// stop handling the effect if it was removed by linked event
if (aurApp->GetRemoveMode())
return;
- // blizz like 2.0.x
- target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
- // blizz like 2.0.x
- target->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
- // blizz like 2.0.x
- target->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
+ target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29); // blizz like 2.0.x
+ target->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); // blizz like 2.0.x
+ target->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); // blizz like 2.0.x
target->AddUnitState(UNIT_STATE_DIED);
+
+ if (Creature* creature = target->ToCreature())
+ creature->SetReactState(REACT_PASSIVE);
}
else
{
@@ -2209,14 +2205,14 @@ void AuraEffect::HandleFeignDeath(AuraApplication const* aurApp, uint8 mode, boo
WorldPacket data(SMSG_FEIGN_DEATH_RESISTED, 0);
target->SendMessageToSet(&data, true);
*/
- // blizz like 2.0.x
- target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
- // blizz like 2.0.x
- target->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
- // blizz like 2.0.x
- target->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
+ target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29); // blizz like 2.0.x
+ target->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH); // blizz like 2.0.x
+ target->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); // blizz like 2.0.x
target->ClearUnitState(UNIT_STATE_DIED);
+
+ if (Creature* creature = target->ToCreature())
+ creature->InitializeReactState();
}
}
diff --git a/src/server/scripts/Kalimdor/zone_winterspring.cpp b/src/server/scripts/Kalimdor/zone_winterspring.cpp
index e517afe6b46..92d15322f4c 100644
--- a/src/server/scripts/Kalimdor/zone_winterspring.cpp
+++ b/src/server/scripts/Kalimdor/zone_winterspring.cpp
@@ -158,8 +158,7 @@ public:
DialogueHelper(DialogueEntry const* dialogueArray) :
_dialogueArray(dialogueArray),
_currentEntry(NULL),
- _actionTimer(0),
- _isFirstSide(true)
+ _actionTimer(0)
{}
// The array MUST be terminated by {0, 0, 0, 0, 0}
@@ -237,7 +236,6 @@ private:
DialogueEntry const* _currentEntry;
uint32 _actionTimer;
- bool _isFirstSide;
};
const DialogueEntry introDialogue[] =
diff --git a/src/server/scripts/Northrend/CMakeLists.txt b/src/server/scripts/Northrend/CMakeLists.txt
index e04a4c43479..3c56361d096 100644
--- a/src/server/scripts/Northrend/CMakeLists.txt
+++ b/src/server/scripts/Northrend/CMakeLists.txt
@@ -125,11 +125,11 @@ set(scripts_STAT_SRCS
Northrend/VaultOfArchavon/boss_emalon.cpp
Northrend/VaultOfArchavon/boss_toravon.cpp
Northrend/zone_sholazar_basin.cpp
- Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
- Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp
- Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
+ Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
+ Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
+ Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
index 3fb7aef3ae0..c21c43dd161 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
@@ -881,8 +881,6 @@ class npc_halion_controller : public CreatureScript
InstanceScript* _instance;
SummonList _summons;
- bool _corporealityCheck;
-
uint32 _twilightDamageTaken;
uint32 _materialDamageTaken;
uint8 _materialCorporealityValue;
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
index f346c796976..53b11de921a 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
@@ -419,8 +419,6 @@ class boss_anubarak_trial : public CreatureScript
uint64 _sphereGUID[6];
bool _intro;
bool _reachedPhase3;
- uint32 _frostSphereTimer;
- uint32 _berserkTimer;
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
@@ -579,7 +577,6 @@ class npc_nerubian_burrower : public CreatureScript
private:
uint32 _submergeTimer;
- Phases _phase;
EventMap _events;
InstanceScript* _instance;
};
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
index d90ed543376..18cc45657f0 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
@@ -1135,7 +1135,6 @@ class boss_icehowl : public CreatureScript
bool _movementFinish;
bool _trampleCasted;
uint8 _stage;
- Unit* _target;
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
index 0afec32ec84..30174996a42 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
@@ -28,21 +28,18 @@ EndScriptData */
enum Yells
{
- YELL_AGGRO_1 = 0,
- YELL_KILL_1 = 1,
- YELL_DEAD_1 = 2,
-
- YELL_AGGRO_2 = 0,
- YELL_KILL_2 = 1,
- YELL_DEAD_2 = 2
-};
-
-enum Creatures
-{
- NPC_INGVAR_HUMAN = 23954,
- NPC_ANNHYLDE_THE_CALLER = 24068,
- NPC_INGVAR_UNDEAD = 23980,
- NPC_THROW_TARGET = 23996,
+ // Ingvar (Human)
+ SAY_AGGRO_1 = 0,
+ SAY_SLAY_1 = 1,
+ SAY_DEATH_1 = 2,
+
+ // Ingvar (Undead)
+ SAY_AGGRO_2 = 3,
+ SAY_SLAY_2 = 4,
+ SAY_DEATH_2 = 5,
+
+ // Annhylde The Caller
+ YELL_RESURRECT = 0
};
enum Events
@@ -57,7 +54,10 @@ enum Events
EVENT_WOE_STRIKE,
EVENT_SHADOW_AXE,
EVENT_JUST_TRANSFORMED,
- EVENT_SUMMON_BANSHEE
+ EVENT_SUMMON_BANSHEE,
+
+ EVENT_RESURRECT_1,
+ EVENT_RESURRECT_2
};
enum Phases
@@ -93,296 +93,270 @@ enum Spells
SPELL_INGVAR_TRANSFORM = 42796
};
-class boss_ingvar_the_plunderer : public CreatureScript
+enum Misc
{
-public:
- boss_ingvar_the_plunderer() : CreatureScript("boss_ingvar_the_plunderer") { }
+ ACTION_START_PHASE_2
+};
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_ingvar_the_plundererAI(creature);
- }
+class boss_ingvar_the_plunderer : public CreatureScript
+{
+ public:
+ boss_ingvar_the_plunderer() : CreatureScript("boss_ingvar_the_plunderer") { }
- struct boss_ingvar_the_plundererAI : public ScriptedAI
- {
- boss_ingvar_the_plundererAI(Creature* creature) : ScriptedAI(creature)
+ struct boss_ingvar_the_plundererAI : public BossAI
{
- instance = creature->GetInstanceScript();
- bIsUndead = false;
- }
+ boss_ingvar_the_plundererAI(Creature* creature) : BossAI(creature, DATA_INGVAR)
+ {
+ _isUndead = false;
+ }
- InstanceScript* instance;
+ void Reset() OVERRIDE
+ {
+ _isUndead = false;
- bool bIsUndead;
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- void Reset() OVERRIDE
- {
- if (bIsUndead)
- me->UpdateEntry(NPC_INGVAR_HUMAN);
+ _Reset();
+ events.SetPhase(PHASE_HUMAN);
- bIsUndead = false;
+ events.ScheduleEvent(EVENT_CLEAVE, urand(6, 12)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ events.ScheduleEvent(EVENT_STAGGERING_ROAR, urand(18, 21)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ events.ScheduleEvent(EVENT_ENRAGE, urand(7, 14)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ events.ScheduleEvent(EVENT_SMASH, urand(12, 17)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ }
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- me->SetStandState(UNIT_STAND_STATE_STAND);
+ void DamageTaken(Unit* /*doneBy*/, uint32& damage) OVERRIDE
+ {
+ if (damage >= me->GetHealth() && events.IsInPhase(PHASE_HUMAN))
+ {
+ me->RemoveAllAuras();
+ DoCast(me, SPELL_INGVAR_FEIGN_DEATH, true);
- events.Reset();
- events.SetPhase(PHASE_HUMAN);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- events.ScheduleEvent(EVENT_CLEAVE, urand(6, 12)*IN_MILLISECONDS, 0, PHASE_HUMAN);
- events.ScheduleEvent(EVENT_STAGGERING_ROAR, urand(18, 21)*IN_MILLISECONDS, 0, PHASE_HUMAN);
- events.ScheduleEvent(EVENT_ENRAGE, urand(7, 14)*IN_MILLISECONDS, 0, PHASE_HUMAN);
- events.ScheduleEvent(EVENT_SMASH, urand(12, 17)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ events.SetPhase(PHASE_EVENT);
+ events.ScheduleEvent(EVENT_SUMMON_BANSHEE, 3 * IN_MILLISECONDS, 0, PHASE_EVENT);
- if (instance)
- instance->SetData(DATA_INGVAR_EVENT, NOT_STARTED);
- }
+ Talk(SAY_DEATH_1);
+ }
- void DamageTaken(Unit* /*done_by*/, uint32 &damage) OVERRIDE
- {
- if (damage >= me->GetHealth() && !bIsUndead)
- {
- //DoCast(me, SPELL_INGVAR_FEIGN_DEATH, true); // Dont work ???
- // visuel hack
- me->SetHealth(0);
- me->InterruptNonMeleeSpells(true);
- me->RemoveAllAuras();
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- me->GetMotionMaster()->MovementExpired(false);
- me->GetMotionMaster()->MoveIdle();
- me->SetStandState(UNIT_STAND_STATE_DEAD);
- // visuel hack end
-
- events.SetPhase(PHASE_EVENT);
- events.ScheduleEvent(EVENT_SUMMON_BANSHEE, 3 * IN_MILLISECONDS, 0, PHASE_EVENT);
-
- Talk(YELL_DEAD_1);
+ if (events.IsInPhase(PHASE_EVENT))
+ damage = 0;
}
- if (events.IsInPhase(PHASE_EVENT))
- damage = 0;
- }
-
- void StartZombiePhase()
- {
- bIsUndead = true;
- me->UpdateEntry(NPC_INGVAR_UNDEAD);
- events.ScheduleEvent(EVENT_JUST_TRANSFORMED, 2 * IN_MILLISECONDS, 0, PHASE_EVENT);
-
- Talk(YELL_AGGRO_2);
- }
+ void DoAction(int32 actionId)
+ {
+ if (actionId == ACTION_START_PHASE_2)
+ StartZombiePhase();
+ }
- void EnterCombat(Unit* /*who*/) OVERRIDE
- {
- if (!bIsUndead)
- Talk(YELL_AGGRO_1);
+ void StartZombiePhase()
+ {
+ _isUndead = true;
+ me->RemoveAura(SPELL_INGVAR_FEIGN_DEATH);
+ DoCast(me, SPELL_INGVAR_TRANSFORM, true); /// @todo: should be death persistent
+ events.ScheduleEvent(EVENT_JUST_TRANSFORMED, 2 * IN_MILLISECONDS, 0, PHASE_EVENT);
- if (instance)
- instance->SetData(DATA_INGVAR_EVENT, IN_PROGRESS);
+ Talk(SAY_AGGRO_2);
+ }
- me->SetInCombatWithZone();
- }
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
- void JustDied(Unit* /*killer*/) OVERRIDE
- {
- Talk(YELL_DEAD_2);
+ if (!_isUndead)
+ Talk(SAY_AGGRO_1);
+ }
- if (instance)
+ void JustDied(Unit* /*killer*/) OVERRIDE
{
- // Ingvar has NPC_INGVAR_UNDEAD id in this moment, so we have to update encounter state for his original id
- instance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, NPC_INGVAR_HUMAN, me);
- instance->SetData(DATA_INGVAR_EVENT, DONE);
+ _JustDied();
+ Talk(SAY_DEATH_2);
}
- }
- void ScheduleSecondPhase()
- {
- events.SetPhase(PHASE_UNDEAD);
- events.ScheduleEvent(EVENT_DARK_SMASH, urand(14, 18)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
- events.ScheduleEvent(EVENT_DREADFUL_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
- events.ScheduleEvent(EVENT_WOE_STRIKE, urand(10, 14)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
- events.ScheduleEvent(EVENT_SHADOW_AXE, 30*IN_MILLISECONDS, 0, PHASE_UNDEAD);
- }
+ void ScheduleSecondPhase()
+ {
+ events.SetPhase(PHASE_UNDEAD);
+ events.ScheduleEvent(EVENT_DARK_SMASH, urand(14, 18)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ events.ScheduleEvent(EVENT_DREADFUL_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ events.ScheduleEvent(EVENT_WOE_STRIKE, urand(10, 14)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ events.ScheduleEvent(EVENT_SHADOW_AXE, 30*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ }
- void KilledUnit(Unit* /*victim*/) OVERRIDE
- {
- Talk(bIsUndead ? YELL_KILL_1 : YELL_KILL_2);
- }
+ void KilledUnit(Unit* /*victim*/) OVERRIDE
+ {
+ Talk(_isUndead ? SAY_SLAY_1 : SAY_SLAY_2);
+ }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (!UpdateVictim() && !events.IsInPhase(PHASE_EVENT))
- return;
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim() && !events.IsInPhase(PHASE_EVENT))
+ return;
- events.Update(diff);
+ events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
+ while (uint32 eventId = events.ExecuteEvent())
{
- // PHASE ONE
- case EVENT_CLEAVE:
- DoCastVictim(SPELL_CLEAVE);
- events.ScheduleEvent(EVENT_CLEAVE, urand(6, 12)*IN_MILLISECONDS, 0, PHASE_HUMAN);
- break;
- case EVENT_STAGGERING_ROAR:
- DoCast(me, SPELL_STAGGERING_ROAR);
- events.ScheduleEvent(EVENT_STAGGERING_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_HUMAN);
- break;
- case EVENT_ENRAGE:
- DoCast(me, SPELL_ENRAGE);
- events.ScheduleEvent(EVENT_ENRAGE, urand(7, 14)*IN_MILLISECONDS, 0, PHASE_HUMAN);
- break;
- case EVENT_SMASH:
- DoCastAOE(SPELL_SMASH);
- events.ScheduleEvent(EVENT_SMASH, urand(12, 16)*IN_MILLISECONDS, 0, PHASE_HUMAN);
- break;
- case EVENT_JUST_TRANSFORMED:
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- me->SetInCombatWithZone();
- me->GetMotionMaster()->MoveChase(me->GetVictim());
- ScheduleSecondPhase();
- return;
- case EVENT_SUMMON_BANSHEE:
- DoCast(me, SPELL_SUMMON_BANSHEE);
- return;
- // PHASE TWO
- case EVENT_DARK_SMASH:
- DoCastVictim(SPELL_DARK_SMASH);
- events.ScheduleEvent(EVENT_DARK_SMASH, urand(12, 16)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
- break;
- case EVENT_DREADFUL_ROAR:
- DoCast(me, SPELL_DREADFUL_ROAR);
- events.ScheduleEvent(EVENT_DREADFUL_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
- break;
- case EVENT_WOE_STRIKE:
- DoCastVictim(SPELL_WOE_STRIKE);
- events.ScheduleEvent(EVENT_WOE_STRIKE, urand(10, 14)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
- break;
- case EVENT_SHADOW_AXE:
- if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1))
- {
- DoCast(target, SPELL_SHADOW_AXE_SUMMON);
- }
- events.ScheduleEvent(EVENT_SHADOW_AXE, 30*IN_MILLISECONDS, 0, PHASE_UNDEAD);
- break;
+ switch (eventId)
+ {
+ // PHASE ONE
+ case EVENT_CLEAVE:
+ DoCastVictim(SPELL_CLEAVE);
+ events.ScheduleEvent(EVENT_CLEAVE, urand(6, 12)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ break;
+ case EVENT_STAGGERING_ROAR:
+ DoCast(me, SPELL_STAGGERING_ROAR);
+ events.ScheduleEvent(EVENT_STAGGERING_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ break;
+ case EVENT_ENRAGE:
+ DoCast(me, SPELL_ENRAGE);
+ events.ScheduleEvent(EVENT_ENRAGE, urand(7, 14)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ break;
+ case EVENT_SMASH:
+ DoCastAOE(SPELL_SMASH);
+ events.ScheduleEvent(EVENT_SMASH, urand(12, 16)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ break;
+ case EVENT_JUST_TRANSFORMED:
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ DoZoneInCombat();
+ ScheduleSecondPhase();
+ return;
+ case EVENT_SUMMON_BANSHEE:
+ DoCast(me, SPELL_SUMMON_BANSHEE);
+ return;
+ // PHASE TWO
+ case EVENT_DARK_SMASH:
+ DoCastVictim(SPELL_DARK_SMASH);
+ events.ScheduleEvent(EVENT_DARK_SMASH, urand(12, 16)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ break;
+ case EVENT_DREADFUL_ROAR:
+ DoCast(me, SPELL_DREADFUL_ROAR);
+ events.ScheduleEvent(EVENT_DREADFUL_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ break;
+ case EVENT_WOE_STRIKE:
+ DoCastVictim(SPELL_WOE_STRIKE);
+ events.ScheduleEvent(EVENT_WOE_STRIKE, urand(10, 14)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ break;
+ case EVENT_SHADOW_AXE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1))
+ DoCast(target, SPELL_SHADOW_AXE_SUMMON);
+
+ events.ScheduleEvent(EVENT_SHADOW_AXE, 30*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ break;
+ }
}
+
+ if (!events.IsInPhase(PHASE_EVENT))
+ DoMeleeAttackIfReady();
}
- DoMeleeAttackIfReady();
- }
- private:
- EventMap events;
- };
+ private:
+ bool _isUndead;
+ };
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetUtgardeKeepAI<boss_ingvar_the_plundererAI>(creature);
+ }
};
class npc_annhylde_the_caller : public CreatureScript
{
-public:
- npc_annhylde_the_caller() : CreatureScript("npc_annhylde_the_caller") { }
+ public:
+ npc_annhylde_the_caller() : CreatureScript("npc_annhylde_the_caller") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_annhylde_the_callerAI(creature);
- }
-
- struct npc_annhylde_the_callerAI : public ScriptedAI
- {
- npc_annhylde_the_callerAI(Creature* creature) : ScriptedAI(creature)
+ struct npc_annhylde_the_callerAI : public ScriptedAI
{
- instance = creature->GetInstanceScript();
- }
-
- float x, y, z;
- InstanceScript* instance;
- uint32 uiResurectTimer;
- uint32 uiResurectPhase;
+ npc_annhylde_the_callerAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = creature->GetInstanceScript();
+ }
- void Reset() OVERRIDE
- {
- //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
- me->SetHover(true);
+ void Reset() OVERRIDE
+ {
+ _events.Reset();
- me->GetPosition(x, y, z);
- DoTeleportTo(x+1, y, z+30);
+ //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
+ me->SetHover(true);
- Unit* ingvar = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_INGVAR) : 0);
- if (ingvar)
- {
+ me->GetPosition(x, y, z);
+ DoTeleportTo(x+1, y, z+30);
me->GetMotionMaster()->MovePoint(1, x, y, z+15);
-
- // Talk(YELL_RESSURECT);
}
- }
- void MovementInform(uint32 type, uint32 id) OVERRIDE
- {
- if (type != POINT_MOTION_TYPE)
- return;
- Unit* ingvar = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_INGVAR) : 0);
- if (ingvar)
+ void MovementInform(uint32 type, uint32 id) OVERRIDE
{
+ if (type != POINT_MOTION_TYPE)
+ return;
+
switch (id)
{
- case 1:
- ingvar->RemoveAura(SPELL_SUMMON_BANSHEE);
- ingvar->CastSpell(ingvar, SPELL_SCOURG_RESURRECTION_DUMMY, true);
- DoCast(ingvar, SPELL_SCOURG_RESURRECTION_BEAM);
- uiResurectTimer = 8000;
- uiResurectPhase = 1;
- break;
- case 2:
- me->SetVisible(false);
- me->DealDamage(me, me->GetHealth());
- me->RemoveCorpse();
- break;
+ case 1:
+ Talk(YELL_RESURRECT);
+ if (Creature* ingvar = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_INGVAR)))
+ {
+ ingvar->RemoveAura(SPELL_SUMMON_BANSHEE);
+ ingvar->CastSpell(ingvar, SPELL_SCOURG_RESURRECTION_DUMMY, true);
+ DoCast(ingvar, SPELL_SCOURG_RESURRECTION_BEAM);
+ }
+ _events.ScheduleEvent(EVENT_RESURRECT_1, 8000);
+ break;
+ case 2:
+ me->DespawnOrUnsummon();
+ break;
+ default:
+ break;
}
}
- }
- void AttackStart(Unit* /*who*/) OVERRIDE {}
- void MoveInLineOfSight(Unit* /*who*/) OVERRIDE {}
+ void AttackStart(Unit* /*who*/) OVERRIDE { }
+ void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { }
+ void EnterCombat(Unit* /*who*/) OVERRIDE { }
- void EnterCombat(Unit* /*who*/) OVERRIDE {}
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (uiResurectTimer)
+ void UpdateAI(uint32 diff) OVERRIDE
{
- if (uiResurectTimer <= diff)
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
{
- if (uiResurectPhase == 1)
+ switch (eventId)
{
- Unit* ingvar = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_INGVAR) : 0);
- if (ingvar)
- {
- ingvar->SetStandState(UNIT_STAND_STATE_STAND);
- ingvar->CastSpell(ingvar, SPELL_SCOURG_RESURRECTION_HEAL, false);
- }
- uiResurectTimer = 3000;
- uiResurectPhase = 2;
- }
- else if (uiResurectPhase == 2)
- {
- if (Creature* ingvar = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_INGVAR) : 0))
- {
- ingvar->RemoveAurasDueToSpell(SPELL_SCOURG_RESURRECTION_DUMMY);
-
- if (ingvar->GetVictim())
- if (boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI* ai = CAST_AI(boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI, ingvar->AI()))
- ai->StartZombiePhase();
+ case EVENT_RESURRECT_1:
+ if (Creature* ingvar = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_INGVAR)))
+ {
+ ingvar->RemoveAura(SPELL_INGVAR_FEIGN_DEATH);
+ ingvar->CastSpell(ingvar, SPELL_SCOURG_RESURRECTION_HEAL, false);
+ }
+ _events.ScheduleEvent(EVENT_RESURRECT_2, 3000);
+ break;
+ case EVENT_RESURRECT_2:
+ if (Creature* ingvar = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_INGVAR)))
+ {
+ ingvar->RemoveAurasDueToSpell(SPELL_SCOURG_RESURRECTION_DUMMY);
+ ingvar->AI()->DoAction(ACTION_START_PHASE_2);
+ }
me->GetMotionMaster()->MovePoint(2, x+1, y, z+30);
- ++uiResurectPhase;
- uiResurectTimer = 0;
- }
+ break;
+ default:
+ break;
}
- } else uiResurectTimer -= diff;
+ }
}
+
+ private:
+ InstanceScript* _instance;
+ EventMap _events;
+ float x, y, z;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetUtgardeKeepAI<npc_annhylde_the_callerAI>(creature);
}
- };
};
enum ShadowAxe
@@ -427,12 +401,7 @@ public:
{
DoCast(me, SPELL_SHADOW_AXE_DAMAGE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
- if (TempSummon* summon = me->ToTempSummon())
- {
- summon->UnSummon(10000);
- }
- else
- me->DisappearAndDie();
+ me->DespawnOrUnsummon(10000);
}
}
};
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp
index 3bfacbaff5e..f8f35ed7142 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp
@@ -75,268 +75,247 @@ float AttackLoc[3]= {197.636f, 194.046f, 40.8164f};
class npc_frost_tomb : public CreatureScript
{
-public:
- npc_frost_tomb() : CreatureScript("npc_frost_tomb") {}
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_frost_tombAI(creature);
- }
+ public:
+ npc_frost_tomb() : CreatureScript("npc_frost_tomb") { }
- struct npc_frost_tombAI : public ScriptedAI
- {
- npc_frost_tombAI(Creature* creature) : ScriptedAI(creature)
+ struct npc_frost_tombAI : public ScriptedAI
{
- if (me->IsSummon())
- if (Unit* summon = me->ToTempSummon()->GetSummoner())
- DoCast(summon, SPELL_FROST_TOMB, true);
+ npc_frost_tombAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = creature->GetInstanceScript();
+ }
- instance = creature->GetInstanceScript();
- }
+ void IsSummonedBy(Unit* summoner) OVERRIDE
+ {
+ DoCast(summoner, SPELL_FROST_TOMB, true);
+ }
+
+ void UpdateAI(uint32 /*diff*/) OVERRIDE { }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ if (Creature* keleseth = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_PRINCE_KELESETH)))
+ keleseth->AI()->SetData(DATA_ON_THE_ROCKS, false);
+ }
- void UpdateAI(uint32 /*diff*/) OVERRIDE {}
+ private:
+ InstanceScript* _instance;
+ };
- void JustDied(Unit* /*killer*/) OVERRIDE
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- if (instance)
- if (Unit* boss = me->GetUnit(*me, instance->GetData64(DATA_PRINCEKELESETH)))
- if (boss->ToCreature() && boss->ToCreature()->AI())
- boss->ToCreature()->AI()->SetData(DATA_ON_THE_ROCKS, false);
+ return GetUtgardeKeepAI<npc_frost_tombAI>(creature);
}
-
- private:
- InstanceScript* instance;
- };
};
class boss_keleseth : public CreatureScript
{
-public:
- boss_keleseth() : CreatureScript("boss_keleseth") {}
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_kelesethAI(creature);
- }
-
- struct boss_kelesethAI : public BossAI
- {
- boss_kelesethAI(Creature* creature) : BossAI(creature, DATA_PRINCEKELESETH_EVENT){}
+ public:
+ boss_keleseth() : CreatureScript("boss_keleseth") { }
- void Reset() OVERRIDE
+ struct boss_kelesethAI : public BossAI
{
- if (instance)
- instance->SetData(DATA_PRINCEKELESETH_EVENT, NOT_STARTED);
-
- events.Reset();
- events.ScheduleEvent(EVENT_SHADOWBOLT, urand(2, 3)*IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_FROST_TOMB, urand(14, 19)*IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_SUMMON_SKELETONS, 6*IN_MILLISECONDS);
+ boss_kelesethAI(Creature* creature) : BossAI(creature, DATA_PRINCE_KELESETH) { }
- summons.DespawnAll();
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ events.ScheduleEvent(EVENT_SHADOWBOLT, urand(2, 3)*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_FROST_TOMB, urand(14, 19)*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_SUMMON_SKELETONS, 6*IN_MILLISECONDS);
- onTheRocks = true;
- }
+ onTheRocks = true;
+ }
- void EnterCombat(Unit* who) OVERRIDE
- {
- me->SetInCombatWithZone();
- if (instance)
- instance->SetData(DATA_PRINCEKELESETH_EVENT, IN_PROGRESS);
- Talk(SAY_START_COMBAT);
+ void EnterCombat(Unit* who) OVERRIDE
+ {
+ _EnterCombat();
+ Talk(SAY_START_COMBAT);
- if (!who)
- return;
+ if (!who)
+ return;
- std::list<Creature*> runemages;
- me->GetCreatureListWithEntryInGrid(runemages, NPC_RUNEMAGE, 60.0f);
- if (!runemages.empty())
- {
- for (std::list<Creature*>::iterator itr = runemages.begin(); itr != runemages.end(); ++itr)
+ std::list<Creature*> guards;
+ me->GetCreatureListWithEntryInGrid(guards, NPC_RUNEMAGE, 60.0f);
+ me->GetCreatureListWithEntryInGrid(guards, NPC_STRATEGIST, 60.0f);
+ if (!guards.empty())
{
- if ((*itr)->IsAlive() && (*itr)->IsWithinLOSInMap(me))
- (*itr)->AI()->AttackStart(who);
+ for (std::list<Creature*>::iterator itr = guards.begin(); itr != guards.end(); ++itr)
+ {
+ if ((*itr)->IsAlive() && (*itr)->IsWithinLOSInMap(me))
+ (*itr)->AI()->AttackStart(who);
+ }
}
}
- std::list<Creature*> strategists;
- me->GetCreatureListWithEntryInGrid(strategists, NPC_STRATEGIST, 60.0f);
- if (!strategists.empty())
+ void JustDied(Unit* /*killer*/) OVERRIDE
{
- for (std::list<Creature*>::iterator itr = strategists.begin(); itr != strategists.end(); ++itr)
- {
- if ((*itr)->IsAlive() && (*itr)->IsWithinLOSInMap(me))
- (*itr)->AI()->AttackStart(who);
- }
+ _JustDied();
+ Talk(SAY_DEATH);
}
- }
-
- void JustDied(Unit* /*killer*/) OVERRIDE
- {
- if (instance)
- instance->SetData(DATA_PRINCEKELESETH_EVENT, DONE);
- summons.DespawnAll();
- Talk(SAY_DEATH);
- }
- void SetData(uint32 data, uint32 value) OVERRIDE
- {
- if (data == DATA_ON_THE_ROCKS)
- onTheRocks = value;
- }
+ void SetData(uint32 data, uint32 value) OVERRIDE
+ {
+ if (data == DATA_ON_THE_ROCKS)
+ onTheRocks = value;
+ }
- uint32 GetData(uint32 data) const OVERRIDE
- {
- if (data == DATA_ON_THE_ROCKS)
- return onTheRocks;
+ uint32 GetData(uint32 data) const OVERRIDE
+ {
+ if (data == DATA_ON_THE_ROCKS)
+ return onTheRocks;
- return 0;
- }
+ return 0;
+ }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (!UpdateVictim())
- return;
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
- events.Update(diff);
+ events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
+ while (uint32 eventId = events.ExecuteEvent())
{
- case EVENT_SUMMON_SKELETONS:
- Talk(SAY_SUMMON_SKELETONS);
- SummonSkeletons();
- break;
- case EVENT_SHADOWBOLT:
- DoCastVictim(SPELL_SHADOWBOLT);
- events.ScheduleEvent(EVENT_SHADOWBOLT, urand(2, 3)*IN_MILLISECONDS);
- break;
- case EVENT_FROST_TOMB:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true, -SPELL_FROST_TOMB))
+ switch (eventId)
{
- Talk(SAY_FROST_TOMB);
- Talk(SAY_FROST_TOMB_EMOTE, target->GetGUID());
+ case EVENT_SUMMON_SKELETONS:
+ Talk(SAY_SUMMON_SKELETONS);
+ SummonSkeletons();
+ break;
+ case EVENT_SHADOWBOLT:
+ DoCastVictim(SPELL_SHADOWBOLT);
+ events.ScheduleEvent(EVENT_SHADOWBOLT, urand(2, 3) * IN_MILLISECONDS);
+ break;
+ case EVENT_FROST_TOMB:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_FROST_TOMB))
+ {
+ Talk(SAY_FROST_TOMB);
+ Talk(SAY_FROST_TOMB_EMOTE, target->GetGUID());
- DoCast(target, SPELL_FROST_TOMB_STUN, true);
- // checked from sniffs - the player casts the spell
- target->CastSpell(target, SPELL_FROST_TOMB_SUMMON, true);
+ DoCast(target, SPELL_FROST_TOMB_STUN, true);
+ // checked from sniffs - the player casts the spell
+ target->CastSpell(target, SPELL_FROST_TOMB_SUMMON, true);
+ }
+ events.ScheduleEvent(EVENT_FROST_TOMB, urand(14, 19) * IN_MILLISECONDS);
+ break;
+ default:
+ break;
}
- events.ScheduleEvent(EVENT_FROST_TOMB, urand(14, 19)*IN_MILLISECONDS);
- break;
}
+
+ DoMeleeAttackIfReady();
}
- DoMeleeAttackIfReady();
- }
+ void SummonSkeletons()
+ {
+ // I could not found any spell casted for this
+ for (uint8 i = 0; i < 4; ++i)
+ me->SummonCreature(NPC_SKELETON, SkeletonSpawnPoint[0][0], SkeletonSpawnPoint[0][1], SKELETONSPAWN_Z, 0);
+ }
+
+ private:
+ bool onTheRocks;
+ };
- void SummonSkeletons()
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- // I could not found any spell casted for this
- for (uint8 i = 0; i < 4; ++i)
- me->SummonCreature(NPC_SKELETON, SkeletonSpawnPoint[0][0], SkeletonSpawnPoint[0][1], SKELETONSPAWN_Z, 0);
+ return GetUtgardeKeepAI<boss_kelesethAI>(creature);
}
- private:
- bool onTheRocks;
- };
};
class npc_vrykul_skeleton : public CreatureScript
{
-public:
- npc_vrykul_skeleton() : CreatureScript("npc_vrykul_skeleton") {}
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_vrykul_skeletonAI(creature);
- }
-
- struct npc_vrykul_skeletonAI : public ScriptedAI
- {
- npc_vrykul_skeletonAI(Creature* creature) : ScriptedAI(creature) {}
+ public:
+ npc_vrykul_skeleton() : CreatureScript("npc_vrykul_skeleton") { }
- void Reset() OVERRIDE
+ struct npc_vrykul_skeletonAI : public ScriptedAI
{
- events.Reset();
- events.ScheduleEvent(EVENT_DECREPIFY, urand(4, 6)*IN_MILLISECONDS);
-
- }
+ npc_vrykul_skeletonAI(Creature* creature) : ScriptedAI(creature) { }
- void DamageTaken(Unit* /*done_by*/, uint32 &damage) OVERRIDE
- {
- if (damage >= me->GetHealth())
+ void Reset() OVERRIDE
{
- damage = 0;
+ events.Reset();
+ events.ScheduleEvent(EVENT_DECREPIFY, urand(4, 6) * IN_MILLISECONDS);
+ }
- // There are some issues with pets
- // they will still attack. I would say it is a PetAI bug
- if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
+ void DamageTaken(Unit* /*doneBy*/, uint32& damage) OVERRIDE
+ {
+ if (damage >= me->GetHealth())
{
- // from sniffs
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->SetFlag(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
+ damage = 0;
- events.Reset();
- events.ScheduleEvent(EVENT_RESURRECT, urand(18, 22)*IN_MILLISECONDS);
+ // There are some issues with pets
+ // they will still attack. I would say it is a PetAI bug
+ if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
+ {
+ // from sniffs
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->SetFlag(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
+
+ events.Reset();
+ events.ScheduleEvent(EVENT_RESURRECT, urand(18, 22) * IN_MILLISECONDS);
- me->GetMotionMaster()->MovementExpired(false);
- me->GetMotionMaster()->MoveIdle();
+ me->GetMotionMaster()->MovementExpired(false);
+ me->GetMotionMaster()->MoveIdle();
+ }
}
}
- }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (!UpdateVictim())
- return;
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
- events.Update(diff);
+ events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
+ while (uint32 eventId = events.ExecuteEvent())
{
- case EVENT_DECREPIFY:
- DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_DECREPIFY), SPELL_DECREPIFY);
- events.ScheduleEvent(EVENT_DECREPIFY, urand(1, 5)*IN_MILLISECONDS);
- break;
- case EVENT_RESURRECT:
- events.ScheduleEvent(EVENT_FULL_HEAL, 1*IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_SHADOW_FISSURE, 1*IN_MILLISECONDS);
- break;
- case EVENT_FULL_HEAL:
- DoCast(me, SPELL_FULL_HEAL, true);
- break;
- case EVENT_SHADOW_FISSURE:
- DoCast(me, SPELL_SHADOW_FISSURE, true);
- if (TempSummon* temp = me->ToTempSummon())
- {
- if (Unit* summoner = temp->GetSummoner())
- {
- DoCast(summoner, SPELL_BONE_ARMOR);
- }
- }
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->RemoveFlag(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
- me->GetMotionMaster()->MoveChase(me->GetVictim());
- events.ScheduleEvent(EVENT_DECREPIFY, urand(4, 6)*IN_MILLISECONDS);
- break;
+ switch (eventId)
+ {
+ case EVENT_DECREPIFY:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_DECREPIFY))
+ DoCast(target, SPELL_DECREPIFY);
+ events.ScheduleEvent(EVENT_DECREPIFY, urand(1, 5)*IN_MILLISECONDS);
+ break;
+ case EVENT_RESURRECT:
+ events.ScheduleEvent(EVENT_FULL_HEAL, 1 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_SHADOW_FISSURE, 1 * IN_MILLISECONDS);
+ break;
+ case EVENT_FULL_HEAL:
+ DoCast(me, SPELL_FULL_HEAL, true);
+ break;
+ case EVENT_SHADOW_FISSURE:
+ DoCast(me, SPELL_SHADOW_FISSURE, true);
+ DoCastAOE(SPELL_BONE_ARMOR, true);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->RemoveFlag(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
+ me->GetMotionMaster()->MoveChase(me->GetVictim());
+ events.ScheduleEvent(EVENT_DECREPIFY, urand(4, 6) * IN_MILLISECONDS);
+ break;
+ default:
+ break;
+ }
}
+
+ if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
+ DoMeleeAttackIfReady();
}
- if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
- DoMeleeAttackIfReady();
- }
+ private:
+ EventMap events;
+ };
- private:
- EventMap events;
- };
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetUtgardeKeepAI<npc_vrykul_skeletonAI>(creature);
+ }
};
class spell_frost_tomb : public SpellScriptLoader
@@ -347,12 +326,14 @@ class spell_frost_tomb : public SpellScriptLoader
class spell_frost_tomb_AuraScript : public AuraScript
{
PrepareAuraScript(spell_frost_tomb_AuraScript);
+
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH)
if (Unit* caster = GetCaster())
- if (caster->ToCreature() && caster->IsAlive())
- caster->ToCreature()->DespawnOrUnsummon(1000);
+ if (caster->IsAlive())
+ if (Creature* creature = caster->ToCreature())
+ creature->DespawnOrUnsummon(1000);
}
void Register() OVERRIDE
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp
index bbb3d666b32..ffdd8fe232f 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp
@@ -58,14 +58,6 @@ enum Spells
SPELL_SUMMON_DALRONN_GHOST = 48612,
};
-enum Creatures
-{
- NPC_SKARVALD_THE_CONSTRUCTOR = 24200,
- NPC_SKARVALD_GHOST = 27390,
- NPC_DALRONN_THE_CONTROLLER = 24201,
- NPC_DALRONN_GHOST = 27389
-};
-
class SkarvaldChargePredicate
{
public:
@@ -82,355 +74,334 @@ class SkarvaldChargePredicate
class boss_skarvald_the_constructor : public CreatureScript
{
-public:
- boss_skarvald_the_constructor() : CreatureScript("boss_skarvald_the_constructor") { }
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_skarvald_the_constructorAI(creature);
- }
+ public:
+ boss_skarvald_the_constructor() : CreatureScript("boss_skarvald_the_constructor") { }
- struct boss_skarvald_the_constructorAI : public ScriptedAI
- {
- boss_skarvald_the_constructorAI(Creature* creature) : ScriptedAI(creature)
+ struct boss_skarvald_the_constructorAI : public BossAI
{
- instance = creature->GetInstanceScript();
- }
+ boss_skarvald_the_constructorAI(Creature* creature) : BossAI(creature, DATA_SKARVALD_DALRONN) { }
- InstanceScript* instance;
+ bool ghost;
+ uint32 Charge_Timer;
+ uint32 StoneStrike_Timer;
+ uint32 Response_Timer;
+ uint32 Check_Timer;
+ bool Dalronn_isDead;
+ bool Enraged;
- bool ghost;
- uint32 Charge_Timer;
- uint32 StoneStrike_Timer;
- uint32 Response_Timer;
- uint32 Check_Timer;
- bool Dalronn_isDead;
- bool Enraged;
-
- void Reset() OVERRIDE
- {
- Charge_Timer = 5000;
- StoneStrike_Timer = 10000;
- Dalronn_isDead = false;
- Response_Timer = 0;
- Check_Timer = 5000;
- Enraged = false;
-
- ghost = (me->GetEntry() == NPC_SKARVALD_GHOST);
- if (!ghost && instance)
+ void Reset() OVERRIDE
{
- Unit* dalronn = Unit::GetUnit(*me, instance->GetData64(DATA_DALRONN));
- if (dalronn && dalronn->isDead())
- dalronn->ToCreature()->Respawn();
-
- instance->SetData(DATA_SKARVALD_DALRONN_EVENT, NOT_STARTED);
+ Charge_Timer = 5000;
+ StoneStrike_Timer = 10000;
+ Dalronn_isDead = false;
+ Response_Timer = 0;
+ Check_Timer = 5000;
+ Enraged = false;
+
+ ghost = me->GetEntry() == NPC_SKARVALD_GHOST;
+ if (!ghost)
+ _Reset();
}
- }
- void EnterCombat(Unit* who) OVERRIDE
- {
- if (!ghost && instance)
+ void EnterCombat(Unit* /*who*/) OVERRIDE
{
- Talk(YELL_SKARVALD_AGGRO);
-
- Unit* dalronn = Unit::GetUnit(*me, instance->GetData64(DATA_DALRONN));
- if (dalronn && dalronn->IsAlive() && !dalronn->GetVictim())
- dalronn->getThreatManager().addThreat(who, 0.0f);
+ if (!ghost)
+ {
+ _EnterCombat();
+ Talk(YELL_SKARVALD_AGGRO);
+ }
+ }
- instance->SetData(DATA_SKARVALD_DALRONN_EVENT, IN_PROGRESS);
+ void DamageTaken(Unit* /*attacker*/, uint32& damage) OVERRIDE
+ {
+ if (!Enraged && !ghost && me->HealthBelowPctDamaged(15, damage))
+ {
+ Enraged = true;
+ DoCast(me, SPELL_ENRAGE);
+ }
}
- }
- void DamageTaken(Unit* /*attacker*/, uint32& damage) OVERRIDE
- {
- if (!Enraged && !ghost && me->HealthBelowPctDamaged(15, damage))
+ void DoAction(int32 /*actionId*/)
{
- Enraged = true;
- DoCast(me, SPELL_ENRAGE);
+ summons.DespawnAll();
}
- }
- void JustDied(Unit* killer) OVERRIDE
- {
- if (!ghost && instance)
+ void JustDied(Unit* killer) OVERRIDE
{
- Unit* dalronn = Unit::GetUnit(*me, instance->GetData64(DATA_DALRONN));
- if (dalronn)
+ if (!ghost)
{
- if (dalronn->isDead())
+ if (Creature* dalronn = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALRONN)))
{
- Talk(YELL_SKARVALD_DAL_DIED);
+ if (dalronn->IsAlive())
+ {
+ Talk(YELL_SKARVALD_SKA_DIEDFIRST);
- instance->SetData(DATA_SKARVALD_DALRONN_EVENT, DONE);
- }
- else
- {
- Talk(YELL_SKARVALD_SKA_DIEDFIRST);
+ me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
- me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
- //DoCast(me, SPELL_SUMMON_SKARVALD_GHOST, true);
- Creature* temp = me->SummonCreature(NPC_SKARVALD_GHOST, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_DESPAWN, 5000);
- if (temp)
+ //DoCast(me, SPELL_SUMMON_SKARVALD_GHOST, true);
+ if (Creature* temp = me->SummonCreature(NPC_SKARVALD_GHOST, *me, TEMPSUMMON_CORPSE_DESPAWN, 5000))
+ {
+ temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ temp->AI()->AttackStart(killer);
+ }
+ }
+ else
{
- temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- temp->AI()->AttackStart(killer);
+ dalronn->AI()->DoAction(0);
+ _JustDied();
+ Talk(YELL_SKARVALD_DAL_DIED);
}
}
}
}
- }
- void KilledUnit(Unit* /*victim*/) OVERRIDE
- {
- if (!ghost)
+ void KilledUnit(Unit* who) OVERRIDE
{
- Talk(YELL_SKARVALD_KILL);
+ if (!ghost && who->GetTypeId() == TYPEID_PLAYER)
+ Talk(YELL_SKARVALD_KILL);
}
- }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (ghost)
+ void UpdateAI(uint32 diff) OVERRIDE
{
- if (instance && instance->GetData(DATA_SKARVALD_DALRONN_EVENT) != IN_PROGRESS)
- me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- }
-
- if (!UpdateVictim())
- return;
+ if (!UpdateVictim())
+ return;
- if (!ghost)
- {
- if (Check_Timer)
+ if (!ghost)
{
- if (Check_Timer <= diff)
+ if (Check_Timer)
{
- Check_Timer = 5000;
- Unit* dalronn = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_DALRONN) : 0);
- if (dalronn && dalronn->isDead())
+ if (Check_Timer <= diff)
{
- Dalronn_isDead = true;
- Response_Timer = 2000;
- Check_Timer = 0;
+ Check_Timer = 5000;
+ Creature* dalronn = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALRONN));
+ if (dalronn && dalronn->isDead())
+ {
+ Dalronn_isDead = true;
+ Response_Timer = 2000;
+ Check_Timer = 0;
+ }
}
- } else Check_Timer -= diff;
- }
- if (Response_Timer && Dalronn_isDead)
- {
- if (Response_Timer <= diff)
+ else
+ Check_Timer -= diff;
+ }
+ if (Response_Timer && Dalronn_isDead)
{
- Talk(YELL_SKARVALD_DAL_DIEDFIRST);
+ if (Response_Timer <= diff)
+ {
+ Talk(YELL_SKARVALD_DAL_DIEDFIRST);
- Response_Timer = 0;
- } else Response_Timer -= diff;
+ Response_Timer = 0;
+ }
+ else
+ Response_Timer -= diff;
+ }
}
- }
- if (Charge_Timer <= diff)
- {
- DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, SkarvaldChargePredicate(me)), SPELL_CHARGE);
- Charge_Timer = 5000+rand()%5000;
- } else Charge_Timer -= diff;
+ if (Charge_Timer <= diff)
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, SkarvaldChargePredicate(me)))
+ DoCast(target, SPELL_CHARGE);
+ Charge_Timer = 5000+rand()%5000;
+ }
+ else
+ Charge_Timer -= diff;
- if (StoneStrike_Timer <= diff)
- {
- DoCastVictim(SPELL_STONE_STRIKE);
- StoneStrike_Timer = 5000+rand()%5000;
- } else StoneStrike_Timer -= diff;
+ if (StoneStrike_Timer <= diff)
+ {
+ DoCastVictim(SPELL_STONE_STRIKE);
+ StoneStrike_Timer = 5000+rand()%5000;
+ }
+ else
+ StoneStrike_Timer -= diff;
- if (!me->HasUnitState(UNIT_STATE_CASTING))
- DoMeleeAttackIfReady();
- }
- };
+ if (!me->HasUnitState(UNIT_STATE_CASTING))
+ DoMeleeAttackIfReady();
+ }
+ };
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetUtgardeKeepAI<boss_skarvald_the_constructorAI>(creature);
+ }
};
class boss_dalronn_the_controller : public CreatureScript
{
-public:
- boss_dalronn_the_controller() : CreatureScript("boss_dalronn_the_controller") { }
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_dalronn_the_controllerAI(creature);
- }
+ public:
+ boss_dalronn_the_controller() : CreatureScript("boss_dalronn_the_controller") { }
- struct boss_dalronn_the_controllerAI : public ScriptedAI
- {
- boss_dalronn_the_controllerAI(Creature* creature) : ScriptedAI(creature)
+ struct boss_dalronn_the_controllerAI : public BossAI
{
- instance = creature->GetInstanceScript();
- }
+ boss_dalronn_the_controllerAI(Creature* creature) : BossAI(creature, DATA_SKARVALD_DALRONN) { }
- InstanceScript* instance;
+ bool ghost;
+ uint32 ShadowBolt_Timer;
+ uint32 Debilitate_Timer;
+ uint32 Summon_Timer;
- bool ghost;
- uint32 ShadowBolt_Timer;
- uint32 Debilitate_Timer;
- uint32 Summon_Timer;
+ uint32 Response_Timer;
+ uint32 Check_Timer;
+ uint32 AggroYell_Timer;
+ bool Skarvald_isDead;
- uint32 Response_Timer;
- uint32 Check_Timer;
- uint32 AggroYell_Timer;
- bool Skarvald_isDead;
-
- void Reset() OVERRIDE
- {
- ShadowBolt_Timer = 1000;
- Debilitate_Timer = 5000;
- Summon_Timer = 10000;
- Check_Timer = 5000;
- Skarvald_isDead = false;
- Response_Timer = 0;
- AggroYell_Timer = 0;
-
- ghost = me->GetEntry() == NPC_DALRONN_GHOST;
- if (!ghost && instance)
+ void Reset() OVERRIDE
{
- Unit* skarvald = Unit::GetUnit(*me, instance->GetData64(DATA_SKARVALD));
- if (skarvald && skarvald->isDead())
- skarvald->ToCreature()->Respawn();
-
- instance->SetData(DATA_SKARVALD_DALRONN_EVENT, NOT_STARTED);
+ ShadowBolt_Timer = 1000;
+ Debilitate_Timer = 5000;
+ Summon_Timer = 10000;
+ Check_Timer = 5000;
+ Skarvald_isDead = false;
+ Response_Timer = 0;
+ AggroYell_Timer = 0;
+
+ ghost = me->GetEntry() == NPC_DALRONN_GHOST;
+ if (!ghost)
+ _Reset();
}
- }
- void EnterCombat(Unit* who) OVERRIDE
- {
- if (!ghost && instance)
+ void EnterCombat(Unit* /*who*/) OVERRIDE
{
- Unit* skarvald = Unit::GetUnit(*me, instance->GetData64(DATA_SKARVALD));
- if (skarvald && skarvald->IsAlive() && !skarvald->GetVictim())
- skarvald->getThreatManager().addThreat(who, 0.0f);
-
- AggroYell_Timer = 5000;
+ if (!ghost)
+ {
+ _EnterCombat();
+ AggroYell_Timer = 5000;
+ }
+ }
- if (instance)
- instance->SetData(DATA_SKARVALD_DALRONN_EVENT, IN_PROGRESS);
+ void DoAction(int32 /*actionId*/)
+ {
+ summons.DespawnAll();
}
- }
- void JustDied(Unit* killer) OVERRIDE
- {
- if (!ghost && instance)
+ void JustDied(Unit* killer) OVERRIDE
{
- Unit* skarvald = Unit::GetUnit(*me, instance->GetData64(DATA_SKARVALD));
- if (skarvald)
+ if (!ghost)
{
- if (skarvald->isDead())
+ if (Creature* skarvald = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SKARVALD)))
{
- Talk(YELL_DALRONN_SKA_DIED);
+ if (skarvald->IsAlive())
+ {
+ Talk(YELL_DALRONN_DAL_DIEDFIRST);
- if (instance)
- instance->SetData(DATA_SKARVALD_DALRONN_EVENT, DONE);
- }
- else
- {
- Talk(YELL_DALRONN_DAL_DIEDFIRST);
+ me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
- me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
- //DoCast(me, SPELL_SUMMON_DALRONN_GHOST, true);
- Creature* temp = me->SummonCreature(NPC_DALRONN_GHOST, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_DESPAWN, 5000);
- if (temp)
+ //DoCast(me, SPELL_SUMMON_DALRONN_GHOST, true);
+ if (Creature* temp = me->SummonCreature(NPC_DALRONN_GHOST, *me, TEMPSUMMON_CORPSE_DESPAWN, 5000))
+ {
+ temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ temp->AI()->AttackStart(killer);
+ }
+ }
+ else
{
- temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- temp->AI()->AttackStart(killer);
+ skarvald->AI()->DoAction(0);
+ _JustDied();
+ Talk(YELL_DALRONN_SKA_DIED);
}
}
}
}
- }
- void KilledUnit(Unit* /*victim*/) OVERRIDE
- {
- if (!ghost)
+ void KilledUnit(Unit* who) OVERRIDE
{
- Talk(YELL_DALRONN_KILL);
+ if (!ghost && who->GetTypeId() == TYPEID_PLAYER)
+ Talk(YELL_DALRONN_KILL);
}
- }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (ghost)
+ void UpdateAI(uint32 diff) OVERRIDE
{
- if (instance && instance->GetData(DATA_SKARVALD_DALRONN_EVENT) != IN_PROGRESS)
- me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- }
+ if (!UpdateVictim())
+ return;
- if (!UpdateVictim())
- return;
-
- if (AggroYell_Timer)
- {
- if (AggroYell_Timer <= diff)
+ if (AggroYell_Timer)
{
- Talk(YELL_DALRONN_AGGRO);
+ if (AggroYell_Timer <= diff)
+ {
+ Talk(YELL_DALRONN_AGGRO);
- AggroYell_Timer = 0;
- } else AggroYell_Timer -= diff;
- }
+ AggroYell_Timer = 0;
+ }
+ else
+ AggroYell_Timer -= diff;
+ }
- if (!ghost)
- {
- if (Check_Timer)
+ if (!ghost)
{
- if (Check_Timer <= diff)
+ if (Check_Timer)
{
- Check_Timer = 5000;
- Unit* skarvald = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_SKARVALD) : 0);
- if (skarvald && skarvald->isDead())
+ if (Check_Timer <= diff)
{
- Skarvald_isDead = true;
- Response_Timer = 2000;
- Check_Timer = 0;
+ Check_Timer = 5000;
+ Creature* skarvald = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SKARVALD));
+ if (skarvald && skarvald->isDead())
+ {
+ Skarvald_isDead = true;
+ Response_Timer = 2000;
+ Check_Timer = 0;
+ }
}
- } else Check_Timer -= diff;
- }
+ else
+ Check_Timer -= diff;
+ }
- if (Response_Timer && Skarvald_isDead)
- {
- if (Response_Timer <= diff)
+ if (Response_Timer && Skarvald_isDead)
{
- Talk(YELL_DALRONN_SKA_DIEDFIRST);
- Response_Timer = 0;
- } else Response_Timer -= diff;
+ if (Response_Timer <= diff)
+ {
+ Talk(YELL_DALRONN_SKA_DIEDFIRST);
+ Response_Timer = 0;
+ }
+ else
+ Response_Timer -= diff;
+ }
}
- }
- if (ShadowBolt_Timer <= diff)
- {
- if (!me->IsNonMeleeSpellCasted(false))
+ if (ShadowBolt_Timer <= diff)
{
- DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), SPELL_SHADOW_BOLT);
- ShadowBolt_Timer = 2100;//give a 100ms pause to try cast other spells
+ if (!me->IsNonMeleeSpellCasted(false))
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
+ DoCast(target, SPELL_SHADOW_BOLT);
+ ShadowBolt_Timer = 2100;//give a 100ms pause to try cast other spells
+ }
}
- } else ShadowBolt_Timer -= diff;
+ else
+ ShadowBolt_Timer -= diff;
- if (Debilitate_Timer <= diff)
- {
- if (!me->IsNonMeleeSpellCasted(false))
+ if (Debilitate_Timer <= diff)
{
- DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), SPELL_DEBILITATE);
- Debilitate_Timer = 5000+rand()%5000;
+ if (!me->IsNonMeleeSpellCasted(false))
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
+ DoCast(target, SPELL_DEBILITATE);
+ Debilitate_Timer = 5000+rand()%5000;
+ }
}
- } else Debilitate_Timer -= diff;
+ else
+ Debilitate_Timer -= diff;
- if (IsHeroic())
- {
- if (Summon_Timer <= diff)
+ if (IsHeroic())
{
- if (!me->IsNonMeleeSpellCasted(false))
+ if (Summon_Timer <= diff)
{
- DoCast(me, H_SPELL_SUMMON_SKELETONS);
- Summon_Timer = (rand()%10000) + 20000;
+ if (!me->IsNonMeleeSpellCasted(false))
+ {
+ DoCast(me, H_SPELL_SUMMON_SKELETONS);
+ Summon_Timer = (rand()%10000) + 20000;
+ }
}
- } else Summon_Timer -= diff;
+ else
+ Summon_Timer -= diff;
+ }
+
+ DoMeleeAttackIfReady();
}
+ };
- DoMeleeAttackIfReady();
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetUtgardeKeepAI<boss_dalronn_the_controllerAI>(creature);
}
- };
-
};
void AddSC_boss_skarvald_dalronn()
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp
index 92857ce06db..c4e7416f855 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp
@@ -15,300 +15,244 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Instance_Utgarde_Keep
-SD%Complete: 90
-SDComment: Instance Data Scripts and functions to acquire mobs and set encounter status for use in various Utgarde Keep Scripts
-SDCategory: Utgarde Keep
-EndScriptData */
-
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "utgarde_keep.h"
-#include "Player.h"
-
-#define MAX_ENCOUNTER 3
-
-#define ENTRY_BELLOW_1 186688
-#define ENTRY_BELLOW_2 186689
-#define ENTRY_BELLOW_3 186690
-
-#define ENTRY_FORGEFIRE_1 186692
-#define ENTRY_FORGEFIRE_2 186693
-#define ENTRY_FORGEFIRE_3 186691
-
-#define ENTRY_GLOWING_ANVIL_1 186609
-#define ENTRY_GLOWING_ANVIL_2 186610
-#define ENTRY_GLOWING_ANVIL_3 186611
-#define ENTRY_GIANT_PORTCULLIS_1 186756
-#define ENTRY_GIANT_PORTCULLIS_2 186694
+DoorData const doorData[] =
+{
+ { GO_GIANT_PORTCULLIS_1, DATA_INGVAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_GIANT_PORTCULLIS_2, DATA_INGVAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+};
-/* Utgarde Keep encounters:
-0 - Prince Keleseth
-1 - Skarvald Dalronn
-2 - Ingvar the Plunderer
-*/
+MinionData const minionData[] =
+{
+ { NPC_SKARVALD, DATA_SKARVALD_DALRONN },
+ { NPC_DALRONN, DATA_SKARVALD_DALRONN }
+};
class instance_utgarde_keep : public InstanceMapScript
{
-public:
- instance_utgarde_keep() : InstanceMapScript("instance_utgarde_keep", 574) { }
+ public:
+ instance_utgarde_keep() : InstanceMapScript(UKScriptName, 574) { }
- InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
- {
- return new instance_utgarde_keep_InstanceMapScript(map);
- }
-
- struct instance_utgarde_keep_InstanceMapScript : public InstanceScript
- {
- instance_utgarde_keep_InstanceMapScript(Map* map) : InstanceScript(map) {}
-
- uint64 Keleseth;
- uint64 Skarvald;
- uint64 Dalronn;
- uint64 Ingvar;
-
- uint64 forge_bellow[3];
- uint64 forge_fire[3];
- uint64 forge_anvil[3];
- uint64 portcullis[2];
-
- uint32 m_auiEncounter[MAX_ENCOUNTER];
- uint32 forge_event[3];
- std::string str_data;
-
- void Initialize() OVERRIDE
- {
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
-
- Keleseth = 0;
- Skarvald = 0;
- Dalronn = 0;
- Ingvar = 0;
-
- for (uint8 i = 0; i < 3; ++i)
+ struct instance_utgarde_keep_InstanceMapScript : public InstanceScript
+ {
+ instance_utgarde_keep_InstanceMapScript(Map* map) : InstanceScript(map)
{
- forge_bellow[i] = 0;
- forge_fire[i] = 0;
- forge_anvil[i] = 0;
- forge_event[i] = NOT_STARTED;
+ SetBossNumber(EncounterCount);
+ LoadDoorData(doorData);
+ LoadMinionData(minionData);
+
+ PrinceKelesethGUID = 0;
+ SkarvaldGUID = 0;
+ DalronnGUID = 0;
+ IngvarGUID = 0;
}
- portcullis[0] = 0;
- portcullis[1] = 0;
- }
-
- bool IsEncounterInProgress() const OVERRIDE
- {
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- return true;
-
- return false;
- }
-
- Player* GetPlayerInMap()
- {
- Map::PlayerList const& players = instance->GetPlayers();
-
- if (!players.isEmpty())
+ void OnCreatureCreate(Creature* creature) OVERRIDE
{
- for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
+ switch (creature->GetEntry())
{
- if (Player* player = itr->GetSource())
- return player;
+ case NPC_PRINCE_KELESETH:
+ PrinceKelesethGUID = creature->GetGUID();
+ break;
+ case NPC_SKARVALD:
+ SkarvaldGUID = creature->GetGUID();
+ AddMinion(creature, true);
+ break;
+ case NPC_DALRONN:
+ DalronnGUID = creature->GetGUID();
+ AddMinion(creature, true);
+ break;
+ case NPC_INGVAR:
+ IngvarGUID = creature->GetGUID();
+ break;
+ default:
+ break;
}
}
- TC_LOG_DEBUG(LOG_FILTER_TSCR, "Instance Utgarde Keep: GetPlayerInMap, but PlayerList is empty!");
- return NULL;
- }
-
- void OnCreatureCreate(Creature* creature) OVERRIDE
- {
- switch (creature->GetEntry())
+ void OnCreatureRemove(Creature* creature) OVERRIDE
{
- case 23953: Keleseth = creature->GetGUID(); break;
- case 24201: Dalronn = creature->GetGUID(); break;
- case 24200: Skarvald = creature->GetGUID(); break;
- case 23954: Ingvar = creature->GetGUID(); break;
+ switch (creature->GetEntry())
+ {
+ case NPC_SKARVALD:
+ case NPC_DALRONN:
+ AddMinion(creature, false);
+ break;
+ default:
+ break;
+ }
}
- }
- void OnGameObjectCreate(GameObject* go) OVERRIDE
- {
- switch (go->GetEntry())
+ void OnGameObjectCreate(GameObject* go) OVERRIDE
{
- //door and object id
- case ENTRY_BELLOW_1: forge_bellow[0] = go->GetGUID();
- if (forge_event[0] != NOT_STARTED)HandleGameObject(0, true, go);break;
- case ENTRY_BELLOW_2: forge_bellow[1] = go->GetGUID();
- if (forge_event[1] != NOT_STARTED)HandleGameObject(0, true, go);break;
- case ENTRY_BELLOW_3: forge_bellow[2] = go->GetGUID();
- if (forge_event[2] != NOT_STARTED)HandleGameObject(0, true, go);break;
- case ENTRY_FORGEFIRE_1: forge_fire[0] = go->GetGUID();
- if (forge_event[0] != NOT_STARTED)HandleGameObject(0, true, go);break;
- case ENTRY_FORGEFIRE_2: forge_fire[1] = go->GetGUID();
- if (forge_event[1] != NOT_STARTED)HandleGameObject(0, true, go);break;
- case ENTRY_FORGEFIRE_3: forge_fire[2] = go->GetGUID();
- if (forge_event[2] != NOT_STARTED)HandleGameObject(0, true, go);break;
- case ENTRY_GLOWING_ANVIL_1: forge_anvil[0] = go->GetGUID();
- if (forge_event[0] != NOT_STARTED)HandleGameObject(0, true, go);break;
- case ENTRY_GLOWING_ANVIL_2: forge_anvil[1] = go->GetGUID();
- if (forge_event[1] != NOT_STARTED)HandleGameObject(0, true, go);break;
- case ENTRY_GLOWING_ANVIL_3: forge_anvil[2] = go->GetGUID();
- if (forge_event[2] != NOT_STARTED)HandleGameObject(0, true, go);break;
- case ENTRY_GIANT_PORTCULLIS_1: portcullis[0] = go->GetGUID();
- if (m_auiEncounter[2] == DONE)HandleGameObject(0, true, go);break;
- case ENTRY_GIANT_PORTCULLIS_2: portcullis[1] = go->GetGUID();
- if (m_auiEncounter[2] == DONE)HandleGameObject(0, true, go);break;
+ switch (go->GetEntry())
+ {
+ case GO_BELLOW_1:
+ Forges[0].BellowGUID = go->GetGUID();
+ HandleGameObject(0, Forges[0].Event != NOT_STARTED, go);
+ break;
+ case GO_BELLOW_2:
+ Forges[1].BellowGUID = go->GetGUID();
+ HandleGameObject(0, Forges[1].Event != NOT_STARTED, go);
+ break;
+ case GO_BELLOW_3:
+ Forges[2].BellowGUID = go->GetGUID();
+ HandleGameObject(0, Forges[2].Event != NOT_STARTED, go);
+ break;
+ case GO_FORGEFIRE_1:
+ Forges[0].FireGUID = go->GetGUID();
+ HandleGameObject(0, Forges[0].Event != NOT_STARTED, go);
+ break;
+ case GO_FORGEFIRE_2:
+ Forges[1].FireGUID = go->GetGUID();
+ HandleGameObject(0, Forges[1].Event != NOT_STARTED, go);
+ break;
+ case GO_FORGEFIRE_3:
+ Forges[2].FireGUID = go->GetGUID();
+ HandleGameObject(0, Forges[2].Event != NOT_STARTED, go);
+ break;
+ case GO_GLOWING_ANVIL_1:
+ Forges[0].AnvilGUID = go->GetGUID();
+ HandleGameObject(0, Forges[0].Event != NOT_STARTED, go);
+ break;
+ case GO_GLOWING_ANVIL_2:
+ Forges[1].AnvilGUID = go->GetGUID();
+ HandleGameObject(0, Forges[1].Event != NOT_STARTED, go);
+ break;
+ case GO_GLOWING_ANVIL_3:
+ Forges[2].AnvilGUID = go->GetGUID();
+ HandleGameObject(0, Forges[2].Event != NOT_STARTED, go);
+ break;
+ case GO_GIANT_PORTCULLIS_1:
+ case GO_GIANT_PORTCULLIS_2:
+ AddDoor(go, true);
+ break;
+ default:
+ break;
+ }
}
- }
- uint64 GetData64(uint32 identifier) const OVERRIDE
- {
- switch (identifier)
+ void OnGameObjectRemove(GameObject* go) OVERRIDE
{
- case DATA_PRINCEKELESETH: return Keleseth;
- case DATA_DALRONN: return Dalronn;
- case DATA_SKARVALD: return Skarvald;
- case DATA_INGVAR: return Ingvar;
+ switch (go->GetEntry())
+ {
+ case GO_GIANT_PORTCULLIS_1:
+ case GO_GIANT_PORTCULLIS_2:
+ AddDoor(go, false);
+ break;
+ default:
+ break;
+ }
}
- return 0;
- }
-
- void SetData(uint32 type, uint32 data) OVERRIDE
- {
- switch (type)
+ uint64 GetData64(uint32 type) const OVERRIDE
{
- case DATA_PRINCEKELESETH_EVENT:
- m_auiEncounter[0] = data;
- break;
- case DATA_SKARVALD_DALRONN_EVENT:
- m_auiEncounter[1] = data;
- break;
- case DATA_INGVAR_EVENT:
- if (data == DONE)
- {
- HandleGameObject(portcullis[0], true);
- HandleGameObject(portcullis[1], true);
- }
- m_auiEncounter[2] = data;
- break;
- case EVENT_FORGE_1:
- if (data == NOT_STARTED)
- {
- HandleGameObject(forge_bellow[0], false);
- HandleGameObject(forge_fire[0], false);
- HandleGameObject(forge_anvil[0], false);
- }else
- {
- HandleGameObject(forge_bellow[0], true);
- HandleGameObject(forge_fire[0], true);
- HandleGameObject(forge_anvil[0], true);
- }
- forge_event[0] = data;
- break;
- case EVENT_FORGE_2:
- if (data == NOT_STARTED)
- {
- HandleGameObject(forge_bellow[1], false);
- HandleGameObject(forge_fire[1], false);
- HandleGameObject(forge_anvil[1], false);
- }else
- {
- HandleGameObject(forge_bellow[1], true);
- HandleGameObject(forge_fire[1], true);
- HandleGameObject(forge_anvil[1], true);
- }
- forge_event[1] = data;
- break;
- case EVENT_FORGE_3:
- if (data == NOT_STARTED)
- {
- HandleGameObject(forge_bellow[2], false);
- HandleGameObject(forge_fire[2], false);
- HandleGameObject(forge_anvil[2], false);
- }else
+ switch (type)
{
- HandleGameObject(forge_bellow[2], true);
- HandleGameObject(forge_fire[2], true);
- HandleGameObject(forge_anvil[2], true);
+ case DATA_PRINCE_KELESETH:
+ return PrinceKelesethGUID;
+ case DATA_SKARVALD:
+ return SkarvaldGUID;
+ case DATA_DALRONN:
+ return DalronnGUID;
+ case DATA_INGVAR:
+ return IngvarGUID;
+ default:
+ break;
}
- forge_event[2] = data;
- break;
- }
- if (data == DONE)
- {
- SaveToDB();
+ return 0;
}
- }
- uint32 GetData(uint32 type) const OVERRIDE
- {
- switch (type)
+ void SetData(uint32 type, uint32 data) OVERRIDE
{
- case DATA_PRINCEKELESETH_EVENT: return m_auiEncounter[0];
- case DATA_SKARVALD_DALRONN_EVENT: return m_auiEncounter[1];
- case DATA_INGVAR_EVENT: return m_auiEncounter[2];
+ switch (type)
+ {
+ case DATA_FORGE_1:
+ case DATA_FORGE_2:
+ case DATA_FORGE_3:
+ {
+ uint8 i = type - DATA_FORGE_1;
+ HandleGameObject(Forges[i].AnvilGUID, data != NOT_STARTED);
+ HandleGameObject(Forges[i].BellowGUID, data != NOT_STARTED);
+ HandleGameObject(Forges[i].FireGUID, data != NOT_STARTED);
+ Forges[i].Event = data;
+
+ if (data == DONE)
+ SaveToDB();
+ break;
+ }
+ default:
+ break;
+ }
}
- return 0;
- }
-
- std::string GetSaveData() OVERRIDE
- {
- OUT_SAVE_INST_DATA;
+ std::string GetSaveData() OVERRIDE
+ {
+ OUT_SAVE_INST_DATA;
- std::ostringstream saveStream;
- saveStream << "U K " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' '
- << m_auiEncounter[2] << ' ' << forge_event[0] << ' ' << forge_event[1] << ' ' << forge_event[2];
+ std::ostringstream saveStream;
+ saveStream << "U K " << GetBossSaveData();
- str_data = saveStream.str();
+ for (uint8 i = 0; i < 3; ++i)
+ saveStream << Forges[i].Event << ' ';
- OUT_SAVE_INST_DATA_COMPLETE;
- return str_data;
- }
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
+ }
- void Load(const char* in) OVERRIDE
- {
- if (!in)
+ void Load(char const* str) OVERRIDE
{
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
+ if (!str)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
- OUT_LOAD_INST_DATA(in);
+ OUT_LOAD_INST_DATA(str);
- char dataHead1, dataHead2;
- uint16 data0, data1, data2, data3, data4, data5;
+ char dataHead1, dataHead2;
- std::istringstream loadStream(in);
- loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4 >> data5;
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
- if (dataHead1 == 'U' && dataHead2 == 'K')
- {
- m_auiEncounter[0] = data0;
- m_auiEncounter[1] = data1;
- m_auiEncounter[2] = data2;
+ if (dataHead1 == 'U' && dataHead2 == 'K')
+ {
+ for (uint32 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+ SetBossState(i, EncounterState(tmpState));
+ }
+
+ for (uint8 i = 0; i < 3; ++i)
+ loadStream >> Forges[i].Event;
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- m_auiEncounter[i] = NOT_STARTED;
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
- forge_event[0] = data3;
- forge_event[1] = data4;
- forge_event[2] = data5;
+ protected:
+ ForgeInfo Forges[3];
- } else OUT_LOAD_INST_DATA_FAIL;
+ uint64 PrinceKelesethGUID;
+ uint64 SkarvaldGUID;
+ uint64 DalronnGUID;
+ uint64 IngvarGUID;
+ };
- OUT_LOAD_INST_DATA_COMPLETE;
+ InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
+ {
+ return new instance_utgarde_keep_InstanceMapScript(map);
}
- };
-
};
void AddSC_instance_utgarde_keep()
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
index 2de21278953..c1470519f63 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
@@ -26,142 +26,97 @@ enum Spells
SPELL_UK_SECOUND_WIND_TRIGGER = 42771
};
-uint32 entry_search[3] =
+uint32 ForgeSearch[3] =
{
- 186609,
- 186610,
- 186611
+ GO_GLOWING_ANVIL_1,
+ GO_GLOWING_ANVIL_2,
+ GO_GLOWING_ANVIL_3
};
class npc_dragonflayer_forge_master : public CreatureScript
{
-public:
- npc_dragonflayer_forge_master() : CreatureScript("npc_dragonflayer_forge_master") { }
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_dragonflayer_forge_masterAI(creature);
- }
+ public:
+ npc_dragonflayer_forge_master() : CreatureScript("npc_dragonflayer_forge_master") { }
- struct npc_dragonflayer_forge_masterAI : public ScriptedAI
- {
- npc_dragonflayer_forge_masterAI(Creature* creature) : ScriptedAI(creature)
+ struct npc_dragonflayer_forge_masterAI : public ScriptedAI
{
- instance = creature->GetInstanceScript();
- fm_Type = 0;
- }
+ npc_dragonflayer_forge_masterAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = creature->GetInstanceScript();
+ _forgeId = 0;
+ }
- InstanceScript* instance;
- uint8 fm_Type;
+ void Reset() OVERRIDE
+ {
+ if (!_forgeId)
+ _forgeId = GetForgeMasterType();
- void Reset() OVERRIDE
- {
- if (fm_Type == 0)
- fm_Type = GetForgeMasterType();
+ if (!me->IsAlive())
+ return;
- CheckForge();
- }
+ if (_forgeId)
+ _instance->SetData(DATA_FORGE_1 + _forgeId - 1, NOT_STARTED);
+ }
- void CheckForge()
- {
- if (instance)
+ void JustDied(Unit* /*killer*/) OVERRIDE
{
- switch (fm_Type)
- {
- case 1:
- instance->SetData(EVENT_FORGE_1, me->IsAlive() ? NOT_STARTED : DONE);
- break;
-
- case 2:
- instance->SetData(EVENT_FORGE_2, me->IsAlive() ? NOT_STARTED : DONE);
- break;
+ if (!_forgeId)
+ _forgeId = GetForgeMasterType();
- case 3:
- instance->SetData(EVENT_FORGE_3, me->IsAlive() ? NOT_STARTED : DONE);
- break;
- }
+ if (_forgeId)
+ _instance->SetData(DATA_FORGE_1 + _forgeId - 1, DONE);
}
- }
-
- void JustDied(Unit* /*killer*/) OVERRIDE
- {
- if (fm_Type == 0)
- fm_Type = GetForgeMasterType();
- if (instance)
+ void EnterCombat(Unit* /*who*/) OVERRIDE
{
- switch (fm_Type)
- {
- case 1:
- instance->SetData(EVENT_FORGE_1, DONE);
- break;
+ if (!_forgeId)
+ _forgeId = GetForgeMasterType();
- case 2:
- instance->SetData(EVENT_FORGE_2, DONE);
- break;
+ if (_forgeId)
+ _instance->SetData(DATA_FORGE_1 + _forgeId - 1, IN_PROGRESS);
- case 3:
- instance->SetData(EVENT_FORGE_3, DONE);
- break;
- }
+ me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
}
- }
-
- void EnterCombat(Unit* /*who*/) OVERRIDE
- {
- if (fm_Type == 0)
- fm_Type = GetForgeMasterType();
- if (instance)
+ void UpdateAI(uint32 /*diff*/) OVERRIDE
{
- switch (fm_Type)
- {
- case 1:
- instance->SetData(EVENT_FORGE_1, IN_PROGRESS);
- break;
+ if (!_forgeId)
+ _forgeId = GetForgeMasterType();
- case 2:
- instance->SetData(EVENT_FORGE_2, IN_PROGRESS);
- break;
+ if (!UpdateVictim())
+ return;
- case 3:
- instance->SetData(EVENT_FORGE_3, IN_PROGRESS);
- break;
- }
+ DoMeleeAttackIfReady();
}
- me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
- }
- uint8 GetForgeMasterType()
- {
- float diff = 30.0f;
- uint8 near_f = 0;
-
- for (uint8 i = 0; i < 3; ++i)
+ private:
+ uint8 GetForgeMasterType()
{
- if (GameObject* go = me->FindNearestGameObject(entry_search[i], 30))
+ float diff = 30.0f;
+ uint8 id = 0;
+
+ for (uint8 i = 0; i < 3; ++i)
{
- if (me->IsWithinDist(go, diff, false))
+ if (GameObject* go = me->FindNearestGameObject(ForgeSearch[i], 30))
{
- near_f = i + 1;
- diff = me->GetDistance2d(go);
+ if (me->IsWithinDist(go, diff, false))
+ {
+ id = i + 1;
+ diff = me->GetDistance2d(go);
+ }
}
}
+ return id > 0 && id < 4 ? id : 0;
}
- return near_f > 0 && near_f < 4 ? near_f : 0;
- }
- void UpdateAI(uint32 /* diff */) OVERRIDE
- {
- if (fm_Type == 0)
- fm_Type = GetForgeMasterType();
-
- if (!UpdateVictim())
- return;
+ InstanceScript* _instance;
+ uint8 _forgeId;
+ };
- DoMeleeAttackIfReady();
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetUtgardeKeepAI<npc_dragonflayer_forge_masterAI>(creature);
}
- };
};
enum TickingTimeBomb
@@ -188,9 +143,7 @@ class spell_ticking_time_bomb : public SpellScriptLoader
void HandleOnEffectRemove(AuraEffect const* /* aurEff */, AuraEffectHandleModes /* mode */)
{
if (GetCaster() == GetTarget())
- {
GetTarget()->CastSpell(GetTarget(), SPELL_TICKING_TIME_BOMB_EXPLODE, true);
- }
}
void Register() OVERRIDE
@@ -209,6 +162,7 @@ enum Fixate
{
SPELL_FIXATE_TRIGGER = 40415
};
+
class spell_fixate : public SpellScriptLoader
{
public:
@@ -227,8 +181,7 @@ class spell_fixate : public SpellScriptLoader
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
{
- // The unit has to cast the taunt on hisself, but we need the original caster for SPELL_AURA_MOD_TAUNT
- GetCaster()->CastSpell(GetCaster(), SPELL_FIXATE_TRIGGER, true, 0, 0, GetHitUnit()->GetGUID());
+ GetHitUnit()->CastSpell(GetCaster(), SPELL_FIXATE_TRIGGER, true);
}
void Register() OVERRIDE
@@ -265,86 +218,86 @@ const Position protodrakeCheckPos = {206.24f, -190.28f, 200.11f, 0.f};
class npc_enslaved_proto_drake : public CreatureScript
{
-public:
- npc_enslaved_proto_drake() : CreatureScript("npc_enslaved_proto_drake") { }
+ public:
+ npc_enslaved_proto_drake() : CreatureScript("npc_enslaved_proto_drake") { }
- struct npc_enslaved_proto_drakeAI : public ScriptedAI
- {
- npc_enslaved_proto_drakeAI(Creature* creature) : ScriptedAI(creature)
+ struct npc_enslaved_proto_drakeAI : public ScriptedAI
{
- _setData = false;
- }
+ npc_enslaved_proto_drakeAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _setData = false;
+ }
- void Reset() OVERRIDE
- {
- _events.Reset();
- _events.ScheduleEvent(EVENT_REND, urand(2000, 3000));
- _events.ScheduleEvent(EVENT_FLAME_BREATH, urand(5500, 7000));
- _events.ScheduleEvent(EVENT_KNOCKAWAY, urand(3500, 6000));
- }
+ void Reset() OVERRIDE
+ {
+ _events.Reset();
+ _events.ScheduleEvent(EVENT_REND, urand(2000, 3000));
+ _events.ScheduleEvent(EVENT_FLAME_BREATH, urand(5500, 7000));
+ _events.ScheduleEvent(EVENT_KNOCKAWAY, urand(3500, 6000));
+ }
- void MovementInform(uint32 type, uint32 id) OVERRIDE
- {
- if (type == WAYPOINT_MOTION_TYPE && id == POINT_LAST)
+ void MovementInform(uint32 type, uint32 id) OVERRIDE
{
- me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
+ if (type == WAYPOINT_MOTION_TYPE && id == POINT_LAST)
+ {
+ me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
+ }
}
- }
- void SetData(uint32 type, uint32 data) OVERRIDE
- {
- if (type == TYPE_PROTODRAKE_AT && data == DATA_PROTODRAKE_MOVE && !_setData && me->GetDistance(protodrakeCheckPos) < 5.0f)
+ void SetData(uint32 type, uint32 data) OVERRIDE
{
- _setData = true;
- me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
- me->GetMotionMaster()->MovePath(PATH_PROTODRAKE, false);
+ if (type == TYPE_PROTODRAKE_AT && data == DATA_PROTODRAKE_MOVE && !_setData && me->GetDistance(protodrakeCheckPos) < 5.0f)
+ {
+ _setData = true;
+ me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
+ me->GetMotionMaster()->MovePath(PATH_PROTODRAKE, false);
+ }
}
- }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (!UpdateVictim())
- return;
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
- _events.Update(diff);
+ _events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- while (uint32 eventid = _events.ExecuteEvent())
- {
- switch (eventid)
+ while (uint32 eventid = _events.ExecuteEvent())
{
- case EVENT_REND:
- DoCast(SPELL_REND);
- _events.ScheduleEvent(EVENT_REND, urand(15000, 20000));
- break;
- case EVENT_FLAME_BREATH:
- DoCast(SPELL_FLAME_BREATH);
- _events.ScheduleEvent(EVENT_FLAME_BREATH, urand(11000, 12000));
- break;
- case EVENT_KNOCKAWAY:
- DoCast(SPELL_KNOCK_AWAY);
- _events.ScheduleEvent(EVENT_KNOCKAWAY, urand(7000, 8500));
- break;
- default:
- break;
+ switch (eventid)
+ {
+ case EVENT_REND:
+ DoCast(SPELL_REND);
+ _events.ScheduleEvent(EVENT_REND, urand(15000, 20000));
+ break;
+ case EVENT_FLAME_BREATH:
+ DoCast(SPELL_FLAME_BREATH);
+ _events.ScheduleEvent(EVENT_FLAME_BREATH, urand(11000, 12000));
+ break;
+ case EVENT_KNOCKAWAY:
+ DoCast(SPELL_KNOCK_AWAY);
+ _events.ScheduleEvent(EVENT_KNOCKAWAY, urand(7000, 8500));
+ break;
+ default:
+ break;
+ }
}
- }
- DoMeleeAttackIfReady();
- }
+ DoMeleeAttackIfReady();
+ }
- private:
- bool _setData;
- EventMap _events;
+ private:
+ bool _setData;
+ EventMap _events;
- };
+ };
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_enslaved_proto_drakeAI(creature);
- }
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_enslaved_proto_drakeAI(creature);
+ }
};
class spell_uk_second_wind_proc : public SpellScriptLoader
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h
index b0d9d702db5..873c5d634fa 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h
@@ -15,23 +15,79 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef DEF_UTGARDE_KEEP_H
-#define DEF_UTGARDE_KEEP_H
+#ifndef UTGARDE_KEEP_H_
+#define UTGARDE_KEEP_H_
+
+#define UKScriptName "instance_utgarde_keep"
+
+uint32 const EncounterCount = 3;
enum DataTypes
{
- DATA_PRINCEKELESETH = 1,
- DATA_SKARVALD = 3,
- DATA_DALRONN = 4,
- DATA_INGVAR = 6,
-
- DATA_PRINCEKELESETH_EVENT = 2,
- DATA_SKARVALD_DALRONN_EVENT = 5,
- DATA_INGVAR_EVENT = 7,
-
- EVENT_FORGE_1 = 8,
- EVENT_FORGE_2 = 9,
- EVENT_FORGE_3 = 10
+ // Encounter States/Boss GUIDs
+ DATA_PRINCE_KELESETH = 0,
+ DATA_SKARVALD_DALRONN = 1,
+ DATA_INGVAR = 2,
+
+ // Additional Data
+ DATA_SKARVALD = 3,
+ DATA_DALRONN = 4,
+
+ DATA_FORGE_1 = 5,
+ DATA_FORGE_2 = 6,
+ DATA_FORGE_3 = 7
+};
+
+enum CreatureIds
+{
+ NPC_PRINCE_KELESETH = 23953,
+ NPC_SKARVALD = 24200,
+ NPC_DALRONN = 24201,
+ NPC_INGVAR = 23954,
+
+ // Skarvald - Dalronn
+ NPC_DALRONN_GHOST = 27389,
+ NPC_SKARVALD_GHOST = 27390,
+
+ // Ingvar the Plunderer
+ NPC_INGVAR_UNDEAD = 23980,
+ NPC_THROW_TARGET = 23996,
+ NPC_ANNHYLDE_THE_CALLER = 24068
+};
+
+enum GameObjectIds
+{
+ GO_BELLOW_1 = 186688,
+ GO_BELLOW_2 = 186689,
+ GO_BELLOW_3 = 186690,
+
+ GO_FORGEFIRE_1 = 186692,
+ GO_FORGEFIRE_2 = 186693,
+ GO_FORGEFIRE_3 = 186691,
+
+ GO_GLOWING_ANVIL_1 = 186609,
+ GO_GLOWING_ANVIL_2 = 186610,
+ GO_GLOWING_ANVIL_3 = 186611,
+
+ GO_GIANT_PORTCULLIS_1 = 186756,
+ GO_GIANT_PORTCULLIS_2 = 186694
};
-#endif
+struct ForgeInfo
+{
+ ForgeInfo() : AnvilGUID(0), BellowGUID(0), FireGUID(0), Event(NOT_STARTED) { };
+
+ uint64 AnvilGUID;
+ uint64 BellowGUID;
+ uint64 FireGUID;
+
+ uint32 Event;
+};
+
+template<class AI>
+AI* GetUtgardeKeepAI(Creature* creature)
+{
+ return GetInstanceAI<AI>(creature, UKScriptName);
+}
+
+#endif // UTGARDE_KEEP_H_
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
index 0277c21cb83..0277c21cb83 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp
index 77fc0877056..c6e3894a722 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp
@@ -26,14 +26,14 @@
4 - Toravon the Ice Watcher event
*/
-class instance_archavon : public InstanceMapScript
+class instance_vault_of_archavon : public InstanceMapScript
{
public:
- instance_archavon() : InstanceMapScript("instance_archavon", 624) { }
+ instance_vault_of_archavon() : InstanceMapScript("instance_vault_of_archavon", 624) { }
- struct instance_archavon_InstanceMapScript : public InstanceScript
+ struct instance_vault_of_archavon_InstanceMapScript : public InstanceScript
{
- instance_archavon_InstanceMapScript(Map* map) : InstanceScript(map)
+ instance_vault_of_archavon_InstanceMapScript(Map* map) : InstanceScript(map)
{
SetBossNumber(EncounterCount);
@@ -135,11 +135,11 @@ class instance_archavon : public InstanceMapScript
InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
{
- return new instance_archavon_InstanceMapScript(map);
+ return new instance_vault_of_archavon_InstanceMapScript(map);
}
};
-void AddSC_instance_archavon()
+void AddSC_instance_vault_of_archavon()
{
- new instance_archavon();
+ new instance_vault_of_archavon();
}
diff --git a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp
index a1a965ed015..92647cfb69f 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp
@@ -845,7 +845,6 @@ public:
InstanceScript* instance;
EventMap events;
uint64 summonerGuid;
- float distanceToShade;
bool startedBanishing;
bool switchToCombat;
};
diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
index 0f5cea6c4c6..a4007a5a7b1 100644
--- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
@@ -186,7 +186,6 @@ class boss_nazan : public CreatureScript
uint32 Turn_Timer;
bool flight;
uint64 VazrudenGUID;
- SpellInfo* liquid_fire;
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp
index c81d3aaae62..d80cab12c26 100644
--- a/src/server/scripts/Spells/spell_warrior.cpp
+++ b/src/server/scripts/Spells/spell_warrior.cpp
@@ -750,7 +750,7 @@ class spell_warr_second_wind_proc : public SpellScriptLoader
{
if (eventInfo.GetProcTarget() == GetTarget())
return false;
- if (!(eventInfo.GetDamageInfo() || eventInfo.GetDamageInfo()->GetSpellInfo()->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN))))
+ if (!eventInfo.GetDamageInfo()->GetSpellInfo() || !(eventInfo.GetDamageInfo()->GetSpellInfo()->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN))))
return false;
return true;
}